/*
- Processes <RT-TERM> tags.
- Implements the "Definiendum Convention" (Italics + Theme Accent).
+ Processes <RT-TERM> and <RT-NEOLOGISM> tags.
+ - Styles only the first occurrence of a unique term/neologism.
+ - The "-em" variants (e.g., <RT-term-em>) are always styled.
+ - Automatically generates IDs for first occurrences for future indexing.
*/
-function RT_term() {
+window.StyleRT = window.StyleRT || {};
+
+window.StyleRT.RT_term = function() {
const RT = window.StyleRT;
+ const debug = RT.debug || { log: function(){} };
- // Robust check for theme presence
- const theme = RT.active_theme ? RT.active_theme() : {};
- const accent = theme.accent || 'inherit';
+ // Track seen terms to ensure only the first one gets decorated
+ const seen_terms = new Set();
- // Selects <RT-TERM>, <rt-term>, etc.
- document.querySelectorAll('rt-term').forEach(el => {
+ // Helper to apply professional "Definiendum" styling
+ const apply_style = (el, is_neologism) => {
el.style.fontStyle = 'italic';
- el.style.color = accent;
- el.style.paddingRight = '0.15em'; // Spacing for the italic slant
+ el.style.fontWeight = is_neologism ? '600' : '500';
+ el.style.color = is_neologism ? 'var(--rt-brand-secondary)' : 'var(--rt-brand-primary)';
+ el.style.paddingRight = '0.1em'; // Compensation for italic slant
el.style.display = 'inline';
- });
-}
+ };
-window.StyleRT = window.StyleRT || {};
-window.StyleRT.RT_term = RT_term;
+ // Selector covers all four variations
+ const tags = document.querySelectorAll('rt-term, rt-term-em, rt-neologism, rt-neologism-em');
+
+ tags.forEach(el => {
+ const tag_name = el.tagName.toLowerCase();
+ const is_neologism = tag_name.includes('neologism');
+ const is_explicit_em = tag_name.endsWith('-em');
+
+ // Normalize text for comparison (e.g., "Symbol" vs "symbol")
+ const term_text = el.textContent.trim().toLowerCase();
+ const slug = term_text.replace(/\s+/g, '-');
+
+ if (is_explicit_em || !seen_terms.has(term_text)) {
+ apply_style(el, is_neologism);
+
+ // If it's the first occurrence, mark it and give it an ID
+ if (!is_explicit_em && !seen_terms.has(term_text)) {
+ seen_terms.add(term_text);
+ if (!el.id) el.id = `def-${is_neologism ? 'neo-' : ''}${slug}`;
+ debug.log('RT_term', `Defined first instance of: ${term_text}`);
+ }
+ } else {
+ // For subsequent mentions that aren't "-em", we treat as normal prose
+ el.style.fontStyle = 'normal';
+ el.style.color = 'inherit';
+ el.style.fontWeight = 'inherit';
+ }
+ });
+};
const RT = window.StyleRT = window.StyleRT || {};
RT.article = function() {
+ const debug = RT.debug || { log: function(){} };
+ debug.log('layout', 'RT.article starting...');
+
RT.config = RT.config || {};
// Default Configuration
RT.config.article = {
font_family: '"Noto Sans", "Segoe UI", "Helvetica Neue", sans-serif'
- ,line_height: "1.8" // Generous spacing for screen reading
- ,font_size: "16px" // Large base size for clarity
- ,font_weight: 400
+ ,line_height: "1.8"
+ ,font_size: "16px"
+ ,font_weight: "400" // Default (String)
,max_width: "820px"
,margin: "0 auto"
};
- if (RT.config.theme && RT.config.theme.meta_is_dark === false) {
- RT.config.article.font_weight = "600";
+
+ // SAFE THEME DETECTION
+ // If the theme is loaded and explicitly Light, bump the weight.
+ try {
+ if (RT.config.theme && RT.config.theme.meta_is_dark === false) {
+ RT.config.article.font_weight = "600";
+ debug.log('layout', 'Light theme detected: adjusting font weight to 600.');
+ }
+ } catch(e) {
+ console.warn("StyleRT: Auto-weight adjustment failed, using default.", e);
}
const conf = RT.config.article;
const article_seq = document.querySelectorAll("RT-article");
- // HURDLE
- if(RT.debug && RT.debug.log) RT.debug.log('selector', `RT.article found ${article_seq.length} elements.`);
- if(article_seq.length === 0) return;
+ if(article_seq.length === 0) {
+ debug.log('layout', 'No <RT-article> elements found. Exiting.');
+ return;
+ }
// 1. Apply Container Styles
article_seq.forEach( (article) =>{
style.fontWeight = conf.font_weight;
style.maxWidth = conf.max_width;
style.margin = conf.margin;
- style.padding = "0 20px"; // Mobile buffer
-
- // Default text color from Theme 1.0
+ style.padding = "0 20px";
style.color = "var(--rt-content-main)";
});
// 2. Inject Child Typography
const style_id = 'rt-article-typography';
if (!document.getElementById(style_id)) {
+ debug.log('layout', 'Injecting CSS typography rules.');
const style_el = document.createElement('style');
style_el.id = style_id;
text-align: center;
margin-top: 1.0em;
margin-bottom: 0.5em;
- }
+ }
rt-article h2 + h3 {
margin-top: -0.3em;
margin-top: 1.2em;
font-style: italic;
}
- /* Increasing Indentation (Steps of ~4 spaces) */
rt-article h4 { margin-left: 2em; }
rt-article h5 { margin-left: 4em; }
rt-article h6 { margin-left: 6em; }
background: var(--rt-surface-1);
}
- /* --- CODE & TECHNICAL --- */
- /* Inline Code */
- rt-article code {
- background-color: var(--rt-surface-code);
- color: var(--rt-syntax-keyword);
- padding: 0.2em 0.4em;
- border-radius: 4px;
- font-family: "Consolas", "Monaco", monospace;
- font-size: 0.9em;
- border: 1px solid var(--rt-border-faint);
- }
-
- /* Preformatted Blocks (if not handled by RT_code.js) */
+ /* --- TECHNICAL --- */
rt-article pre {
background: var(--rt-surface-code);
padding: 1em;
}
};
})();
-
+++ /dev/null
-/*
- Article Layout: Technical Reference
- Standard: Theme 1.0
- Description: High-readability layout for technical documentation on screens.
- Features: Sans-serif, justified text, distinct headers, boxed code.
-*/
-(function(){
- const RT = window.StyleRT = window.StyleRT || {};
-
- RT.article = function() {
- const debug = RT.debug || { log: function(){} };
- debug.log('layout', 'RT.article starting...');
-
- RT.config = RT.config || {};
-
- // Default Configuration
- RT.config.article = {
- font_family: '"Noto Sans", "Segoe UI", "Helvetica Neue", sans-serif'
- ,line_height: "1.8"
- ,font_size: "16px"
- ,font_weight: "400" // Default (String)
- ,max_width: "820px"
- ,margin: "0 auto"
- };
-
- // SAFE THEME DETECTION
- // If the theme is loaded and explicitly Light, bump the weight.
- try {
- if (RT.config.theme && RT.config.theme.meta_is_dark === false) {
- RT.config.article.font_weight = "600";
- debug.log('layout', 'Light theme detected: adjusting font weight to 600.');
- }
- } catch(e) {
- console.warn("StyleRT: Auto-weight adjustment failed, using default.", e);
- }
-
- const conf = RT.config.article;
- const article_seq = document.querySelectorAll("RT-article");
-
- if(article_seq.length === 0) {
- debug.log('layout', 'No <RT-article> elements found. Exiting.');
- return;
- }
-
- // 1. Apply Container Styles
- article_seq.forEach( (article) =>{
- const style = article.style;
- style.display = "block";
- style.fontFamily = conf.font_family;
- style.fontSize = conf.font_size;
- style.lineHeight = conf.line_height;
- style.fontWeight = conf.font_weight;
- style.maxWidth = conf.max_width;
- style.margin = conf.margin;
- style.padding = "0 20px";
- style.color = "var(--rt-content-main)";
- });
-
- // 2. Inject Child Typography
- const style_id = 'rt-article-typography';
- if (!document.getElementById(style_id)) {
- debug.log('layout', 'Injecting CSS typography rules.');
- const style_el = document.createElement('style');
- style_el.id = style_id;
-
- style_el.textContent = `
- /* --- HEADERS --- */
- rt-article h1 {
- color: var(--rt-brand-primary);
- font-size: 2.0em;
- font-weight: 500;
- text-align: center;
- margin-top: 1.2em;
- margin-bottom: 0.6em;
- border-bottom: 2px solid var(--rt-border-default);
- padding-bottom: 0.3em;
- line-height: 1.2;
- letter-spacing: -0.02em;
- }
-
- rt-article h2 {
- color: var(--rt-brand-secondary);
- font-size: 1.5em;
- font-weight: 400;
- text-align: center;
- margin-top: 1.0em;
- margin-bottom: 0.5em;
- }
-
- rt-article h2 + h3 {
- margin-top: -0.3em;
- padding-top: 0;
- }
-
- rt-article h3 {
- color: var(--rt-brand-tertiary);
- font-size: 1.4em;
- font-weight: 400;
- margin-top: 1.0em;
- margin-bottom: 0.5em;
- }
-
- /* --- DEEP LEVELS (H4-H6) --- */
- rt-article h4, rt-article h5, rt-article h6 {
- color: var(--rt-brand-tertiary);
- font-weight: bold;
- margin-top: 1.2em;
- font-style: italic;
- }
- rt-article h4 { margin-left: 2em; }
- rt-article h5 { margin-left: 4em; }
- rt-article h6 { margin-left: 6em; }
-
- /* --- SEMANTIC TAGS --- */
- rt-article rt-neologism {
- font-family: "Georgia", "Times New Roman", serif;
- font-size: 1.2em; /* <--- ADD THIS LINE */
- font-style: italic;
- font-weight: 400;
- color: var(--rt-brand-tertiary);
- letter-spacing: 0.02em;
- }
-
-
- /* --- BODY TEXT --- */
- rt-article p {
- margin-bottom: 1.4em;
- text-align: justify;
- hyphens: auto;
- color: var(--rt-content-main);
- }
-
- /* --- RICH ELEMENTS --- */
- rt-article blockquote {
- border-left: 4px solid var(--rt-brand-secondary);
- margin: 1.5em 0;
- padding: 0.5em 1em;
- font-style: italic;
- color: var(--rt-content-muted);
- background: var(--rt-surface-1);
- border-radius: 0 4px 4px 0;
- }
-
- rt-article ul, rt-article ol {
- margin-bottom: 1.4em;
- padding-left: 2em;
- }
- rt-article li {
- margin-bottom: 0.4em;
- }
- rt-article li::marker {
- color: var(--rt-brand-secondary);
- font-weight: bold;
- }
-
- /* Links */
- rt-article a {
- color: var(--rt-brand-link);
- text-decoration: none;
- border-bottom: 1px dotted var(--rt-border-default);
- transition: all 0.2s;
- }
- rt-article a:hover {
- color: var(--rt-brand-primary);
- border-bottom: 1px solid var(--rt-brand-primary);
- background: var(--rt-surface-1);
- }
-
- /* --- TECHNICAL --- */
- rt-article pre {
- background: var(--rt-surface-code);
- padding: 1em;
- border-radius: 4px;
- overflow-x: auto;
- border: 1px solid var(--rt-border-default);
- }
- `;
- document.head.appendChild(style_el);
- }
- };
-})();
'style/RT_term.js',
'style/RT_math.js',
'style/RT_code.js',
- 'style/article_tech_ref_2.js',
+ 'style/article_tech_ref.js',
'style/RT_TOC.js',
// Layout & Pagination