rdoc 6.13.0 → 6.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. checksums.yaml +4 -4
  2. data/History.rdoc +1 -1
  3. data/README.md +112 -0
  4. data/RI.md +1 -1
  5. data/lib/rdoc/code_object/any_method.rb +4 -4
  6. data/lib/rdoc/code_object/attr.rb +3 -3
  7. data/lib/rdoc/code_object/class_module.rb +18 -16
  8. data/lib/rdoc/code_object/constant.rb +5 -5
  9. data/lib/rdoc/code_object/context/section.rb +8 -7
  10. data/lib/rdoc/code_object/context.rb +19 -19
  11. data/lib/rdoc/code_object/method_attr.rb +7 -6
  12. data/lib/rdoc/code_object/mixin.rb +3 -3
  13. data/lib/rdoc/code_object/normal_class.rb +1 -1
  14. data/lib/rdoc/code_object/normal_module.rb +1 -1
  15. data/lib/rdoc/code_object/single_class.rb +1 -1
  16. data/lib/rdoc/code_object/top_level.rb +28 -33
  17. data/lib/rdoc/code_object.rb +3 -3
  18. data/lib/rdoc/comment.rb +196 -14
  19. data/lib/rdoc/cross_reference.rb +4 -4
  20. data/lib/rdoc/encoding.rb +4 -4
  21. data/lib/rdoc/erb_partial.rb +1 -1
  22. data/lib/rdoc/erbio.rb +2 -2
  23. data/lib/rdoc/generator/aliki.rb +42 -0
  24. data/lib/rdoc/generator/darkfish.rb +20 -16
  25. data/lib/rdoc/generator/json_index.rb +3 -3
  26. data/lib/rdoc/generator/markup.rb +12 -0
  27. data/lib/rdoc/generator/pot/message_extractor.rb +4 -4
  28. data/lib/rdoc/generator/pot/po.rb +1 -1
  29. data/lib/rdoc/generator/pot/po_entry.rb +7 -7
  30. data/lib/rdoc/generator/pot.rb +1 -1
  31. data/lib/rdoc/generator/ri.rb +1 -1
  32. data/lib/rdoc/generator/template/aliki/_aside_toc.rhtml +8 -0
  33. data/lib/rdoc/generator/template/aliki/_footer.rhtml +23 -0
  34. data/lib/rdoc/generator/template/aliki/_head.rhtml +158 -0
  35. data/lib/rdoc/generator/template/aliki/_header.rhtml +56 -0
  36. data/lib/rdoc/generator/template/aliki/_icons.rhtml +208 -0
  37. data/lib/rdoc/generator/template/aliki/_sidebar_ancestors.rhtml +16 -0
  38. data/lib/rdoc/generator/template/aliki/_sidebar_classes.rhtml +15 -0
  39. data/lib/rdoc/generator/template/aliki/_sidebar_extends.rhtml +25 -0
  40. data/lib/rdoc/generator/template/aliki/_sidebar_includes.rhtml +25 -0
  41. data/lib/rdoc/generator/template/aliki/_sidebar_installed.rhtml +16 -0
  42. data/lib/rdoc/generator/template/aliki/_sidebar_methods.rhtml +41 -0
  43. data/lib/rdoc/generator/template/aliki/_sidebar_pages.rhtml +67 -0
  44. data/lib/rdoc/generator/template/aliki/_sidebar_search.rhtml +15 -0
  45. data/lib/rdoc/generator/template/aliki/_sidebar_sections.rhtml +21 -0
  46. data/lib/rdoc/generator/template/aliki/_sidebar_toggle.rhtml +3 -0
  47. data/lib/rdoc/generator/template/aliki/class.rhtml +220 -0
  48. data/lib/rdoc/generator/template/aliki/css/rdoc.css +1737 -0
  49. data/lib/rdoc/generator/template/aliki/index.rhtml +22 -0
  50. data/lib/rdoc/generator/template/aliki/js/aliki.js +483 -0
  51. data/lib/rdoc/generator/template/aliki/js/c_highlighter.js +299 -0
  52. data/lib/rdoc/generator/template/aliki/js/search.js +120 -0
  53. data/lib/rdoc/generator/template/aliki/js/theme-toggle.js +112 -0
  54. data/lib/rdoc/generator/template/aliki/page.rhtml +18 -0
  55. data/lib/rdoc/generator/template/aliki/servlet_not_found.rhtml +14 -0
  56. data/lib/rdoc/generator/template/aliki/servlet_root.rhtml +65 -0
  57. data/lib/rdoc/generator/template/darkfish/_footer.rhtml +3 -3
  58. data/lib/rdoc/generator/template/darkfish/_head.rhtml +16 -16
  59. data/lib/rdoc/generator/template/darkfish/_sidebar_extends.rhtml +8 -8
  60. data/lib/rdoc/generator/template/darkfish/_sidebar_includes.rhtml +8 -8
  61. data/lib/rdoc/generator/template/darkfish/_sidebar_installed.rhtml +7 -6
  62. data/lib/rdoc/generator/template/darkfish/_sidebar_methods.rhtml +6 -6
  63. data/lib/rdoc/generator/template/darkfish/_sidebar_pages.rhtml +19 -19
  64. data/lib/rdoc/generator/template/darkfish/_sidebar_parent.rhtml +2 -2
  65. data/lib/rdoc/generator/template/darkfish/_sidebar_search.rhtml +1 -0
  66. data/lib/rdoc/generator/template/darkfish/_sidebar_sections.rhtml +3 -3
  67. data/lib/rdoc/generator/template/darkfish/_sidebar_table_of_contents.rhtml +14 -14
  68. data/lib/rdoc/generator/template/darkfish/class.rhtml +62 -60
  69. data/lib/rdoc/generator/template/darkfish/css/rdoc.css +2 -0
  70. data/lib/rdoc/generator/template/darkfish/index.rhtml +4 -3
  71. data/lib/rdoc/generator/template/darkfish/js/darkfish.js +21 -1
  72. data/lib/rdoc/generator/template/darkfish/js/search.js +11 -1
  73. data/lib/rdoc/generator/template/darkfish/page.rhtml +2 -1
  74. data/lib/rdoc/generator/template/darkfish/servlet_not_found.rhtml +2 -1
  75. data/lib/rdoc/generator/template/darkfish/servlet_root.rhtml +19 -19
  76. data/lib/rdoc/generator/template/darkfish/table_of_contents.rhtml +19 -17
  77. data/lib/rdoc/generator/template/json_index/js/searcher.js +48 -6
  78. data/lib/rdoc/generator.rb +1 -0
  79. data/lib/rdoc/markdown.kpeg +72 -18
  80. data/lib/rdoc/markdown.rb +411 -547
  81. data/lib/rdoc/markup/attribute_manager.rb +5 -5
  82. data/lib/rdoc/markup/attributes.rb +3 -3
  83. data/lib/rdoc/markup/blank_line.rb +2 -2
  84. data/lib/rdoc/markup/block_quote.rb +1 -1
  85. data/lib/rdoc/markup/document.rb +8 -8
  86. data/lib/rdoc/markup/formatter.rb +12 -12
  87. data/lib/rdoc/markup/hard_break.rb +3 -3
  88. data/lib/rdoc/markup/heading.rb +4 -4
  89. data/lib/rdoc/markup/include.rb +3 -3
  90. data/lib/rdoc/markup/indented_paragraph.rb +3 -3
  91. data/lib/rdoc/markup/list.rb +4 -4
  92. data/lib/rdoc/markup/list_item.rb +4 -4
  93. data/lib/rdoc/markup/paragraph.rb +2 -2
  94. data/lib/rdoc/markup/parser.rb +11 -11
  95. data/lib/rdoc/markup/pre_process.rb +39 -15
  96. data/lib/rdoc/markup/raw.rb +5 -5
  97. data/lib/rdoc/markup/rule.rb +2 -2
  98. data/lib/rdoc/markup/table.rb +4 -4
  99. data/lib/rdoc/markup/to_ansi.rb +7 -3
  100. data/lib/rdoc/markup/to_bs.rb +10 -6
  101. data/lib/rdoc/markup/to_html.rb +182 -30
  102. data/lib/rdoc/markup/to_html_crossref.rb +58 -28
  103. data/lib/rdoc/markup/to_html_snippet.rb +17 -17
  104. data/lib/rdoc/markup/to_joined_paragraph.rb +1 -1
  105. data/lib/rdoc/markup/to_label.rb +6 -5
  106. data/lib/rdoc/markup/to_markdown.rb +12 -12
  107. data/lib/rdoc/markup/to_rdoc.rb +40 -31
  108. data/lib/rdoc/markup/to_table_of_contents.rb +3 -3
  109. data/lib/rdoc/markup/to_test.rb +1 -1
  110. data/lib/rdoc/markup/to_tt_only.rb +8 -8
  111. data/lib/rdoc/markup/verbatim.rb +3 -3
  112. data/lib/rdoc/markup.rb +3 -3
  113. data/lib/rdoc/options.rb +53 -23
  114. data/lib/rdoc/parser/c.rb +31 -62
  115. data/lib/rdoc/parser/changelog.rb +9 -9
  116. data/lib/rdoc/parser/prism_ruby.rb +122 -114
  117. data/lib/rdoc/parser/ruby.rb +51 -51
  118. data/lib/rdoc/parser/ruby_tools.rb +5 -7
  119. data/lib/rdoc/parser/simple.rb +5 -22
  120. data/lib/rdoc/parser.rb +8 -8
  121. data/lib/rdoc/rd/inline.rb +4 -4
  122. data/lib/rdoc/rd.rb +1 -1
  123. data/lib/rdoc/rdoc.rb +9 -8
  124. data/lib/rdoc/ri/driver.rb +49 -49
  125. data/lib/rdoc/ri/paths.rb +2 -2
  126. data/lib/rdoc/ri/task.rb +3 -3
  127. data/lib/rdoc/rubygems_hook.rb +14 -11
  128. data/lib/rdoc/servlet.rb +15 -15
  129. data/lib/rdoc/stats/normal.rb +1 -1
  130. data/lib/rdoc/stats/quiet.rb +1 -1
  131. data/lib/rdoc/stats/verbose.rb +3 -3
  132. data/lib/rdoc/stats.rb +12 -12
  133. data/lib/rdoc/store.rb +32 -32
  134. data/lib/rdoc/task.rb +6 -6
  135. data/lib/rdoc/text.rb +11 -11
  136. data/lib/rdoc/token_stream.rb +14 -2
  137. data/lib/rdoc/tom_doc.rb +8 -8
  138. data/lib/rdoc/version.rb +1 -1
  139. data/man/ri.1 +2 -0
  140. data/rdoc.gemspec +72 -0
  141. metadata +61 -6
  142. data/README.rdoc +0 -142
@@ -0,0 +1,1737 @@
1
+ /*
2
+ * Aliki Theme Stylesheet
3
+ * Modern RDoc theme by Stan Lo
4
+ *
5
+ * Features:
6
+ * - Three-column responsive layout (navigation, content, table of contents)
7
+ * - Dark mode support with localStorage persistence
8
+ * - Auto-generated right sidebar TOC with scroll spy
9
+ * - Mobile-optimized search modal
10
+ * - Enhanced syntax highlighting for both light and dark themes
11
+ * - Code-copying functionality
12
+ */
13
+
14
+ /* 1. Design System - CSS Variables and Tokens */
15
+
16
+ /* Light Theme (Default) */
17
+ :root {
18
+ /* Color Palette - Primary */
19
+ --color-primary-50: #fdeae9;
20
+ --color-primary-100: #fadad3;
21
+ --color-primary-200: #f8bfbd;
22
+ --color-primary-300: #f5a9a7;
23
+ --color-primary-400: #f07f7b;
24
+ --color-primary-500: #eb544f;
25
+ --color-primary-600: #e62923;
26
+ --color-primary-700: #b8211c;
27
+ --color-primary-800: #8a1915;
28
+ --color-primary-900: #5c100e;
29
+
30
+ /* Color Palette - Neutral */
31
+ --color-neutral-50: #fafaf9;
32
+ --color-neutral-100: #f5f5f4;
33
+ --color-neutral-200: #e7e5e4;
34
+ --color-neutral-300: #d6d3d1;
35
+ --color-neutral-400: #a8a29e;
36
+ --color-neutral-500: #78716c;
37
+ --color-neutral-600: #57534e;
38
+ --color-neutral-700: #44403c;
39
+ --color-neutral-800: #292524;
40
+ --color-neutral-900: #1c1917;
41
+
42
+ /* Code highlighting colors */
43
+ --code-blue: #1d4ed8;
44
+ --code-green: #047857;
45
+ --code-orange: #d97706;
46
+ --code-purple: #7e22ce;
47
+ --code-red: #dc2626;
48
+
49
+ /* C syntax highlighting */
50
+ --c-keyword: #b91c1c;
51
+ --c-type: #0891b2;
52
+ --c-macro: #ea580c;
53
+ --c-function: #7c3aed;
54
+ --c-identifier: #475569;
55
+ --c-operator: #059669;
56
+ --c-preprocessor: #a21caf;
57
+ --c-value: #92400e;
58
+ --c-string: #15803d;
59
+ --c-comment: #78716c;
60
+
61
+ /* Color Palette - Green (for success states) */
62
+ --color-green-400: #4ade80;
63
+ --color-green-500: #22c55e;
64
+ --color-green-600: #16a34a;
65
+
66
+ /* Semantic Colors - Light Theme */
67
+ --color-text-primary: var(--color-neutral-900);
68
+ --color-text-secondary: var(--color-neutral-600);
69
+ --color-text-tertiary: var(--color-neutral-500);
70
+ --color-background-primary: #fff;
71
+ --color-background-secondary: var(--color-neutral-50);
72
+ --color-background-tertiary: var(--color-neutral-100);
73
+ --color-border-default: var(--color-neutral-300);
74
+ --color-border-subtle: var(--color-neutral-200);
75
+ --color-border-emphasis: var(--color-neutral-400);
76
+ --color-link-default: var(--color-text-primary);
77
+ --color-link-hover: var(--color-primary-600);
78
+ --color-accent-primary: var(--color-primary-600);
79
+ --color-accent-hover: var(--color-primary-700);
80
+ --color-accent-subtle: var(--color-primary-50);
81
+ --color-code-bg: #f6f8fa;
82
+ --color-code-border: var(--color-neutral-300);
83
+ --color-nav-bg: #fff;
84
+ --color-nav-text: var(--color-neutral-700);
85
+ --color-th-background: var(--color-neutral-100);
86
+ --color-td-background: var(--color-neutral-50);
87
+
88
+ /* RGBA Colors (theme-agnostic) */
89
+ --color-overlay: rgb(0 0 0 / 50%);
90
+ --color-emphasis-bg: rgb(255 111 97 / 10%);
91
+ --color-emphasis-decoration: rgb(52 48 64 / 25%);
92
+ --color-search-highlight-bg: rgb(224 108 117 / 10%);
93
+ --color-success-bg: rgb(34 197 94 / 10%);
94
+
95
+ /* Typography Scale */
96
+ --font-size-xs: 0.75rem; /* 12px */
97
+ --font-size-sm: 0.875rem; /* 14px */
98
+ --font-size-base: 1rem; /* 16px */
99
+ --font-size-lg: 1.125rem; /* 18px */
100
+ --font-size-xl: 1.25rem; /* 20px */
101
+ --font-size-2xl: 1.5rem; /* 24px */
102
+ --font-size-3xl: 1.875rem; /* 30px */
103
+ --font-size-4xl: 2.25rem; /* 36px */
104
+ --font-size-5xl: 3rem; /* 48px */
105
+
106
+ /* Font Families */
107
+ --font-family-base: -apple-system, blinkmacsystemfont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Helvetica Neue', sans-serif;
108
+ --font-family-heading: var(--font-family-base);
109
+ --font-family-mono: ui-monospace, 'SFMono-Regular', 'SF Mono', 'Menlo', 'Consolas', 'Liberation Mono', monospace;
110
+
111
+ /* Font Weights */
112
+ --font-weight-normal: 400;
113
+ --font-weight-medium: 500;
114
+ --font-weight-semibold: 600;
115
+ --font-weight-bold: 700;
116
+
117
+ /* Font Shortcuts */
118
+ --font-primary: var(--font-family-base);
119
+ --font-heading: var(--font-family-heading);
120
+ --font-code: var(--font-family-mono);
121
+
122
+ /* Line Heights */
123
+ --line-height-tight: 1.25;
124
+ --line-height-normal: 1.5;
125
+ --line-height-relaxed: 1.625;
126
+
127
+ /* Spacing Scale */
128
+ --space-1: 0.25rem; /* 4px */
129
+ --space-2: 0.5rem; /* 8px */
130
+ --space-3: 0.75rem; /* 12px */
131
+ --space-4: 1rem; /* 16px */
132
+ --space-5: 1.25rem; /* 20px */
133
+ --space-6: 1.5rem; /* 24px */
134
+ --space-8: 2rem; /* 32px */
135
+ --space-12: 3rem; /* 48px */
136
+ --space-16: 4rem; /* 64px */
137
+
138
+ /* Border Radius */
139
+ --radius-sm: 0.25rem; /* 4px */
140
+ --radius-md: 0.375rem; /* 6px */
141
+ --radius-lg: 0.5rem; /* 8px */
142
+
143
+ /* Shadows */
144
+ --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 10%), 0 1px 2px -1px rgb(0 0 0 / 10%);
145
+ --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 10%), 0 4px 6px -4px rgb(0 0 0 / 10%);
146
+ --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 10%), 0 8px 10px -6px rgb(0 0 0 / 10%);
147
+
148
+ /* Layout Dimensions */
149
+ --layout-sidebar-width: 300px;
150
+ --layout-sidebar-width-min: 300px;
151
+ --layout-sidebar-width-max: 15%;
152
+ --layout-toc-width-min: 240px;
153
+ --layout-toc-width-max: 18%;
154
+ --layout-content-max-width: 800px;
155
+ --layout-header-height: 64px;
156
+ --layout-search-width: 400px;
157
+
158
+ /* Transitions */
159
+ --transition-fast: 150ms ease-in-out;
160
+ --transition-base: 200ms ease-in-out;
161
+
162
+ /* Z-Index Scale */
163
+ --z-fixed: 300;
164
+ --z-modal: 400;
165
+ --z-popover: 500;
166
+
167
+ }
168
+
169
+ /* Dark Theme */
170
+ [data-theme="dark"] {
171
+ /* Code highlighting colors */
172
+ --code-blue: #93c5fd;
173
+ --code-green: #34d399;
174
+ --code-orange: #fbbf24;
175
+ --code-purple: #c084fc;
176
+ --code-red: #f87171;
177
+
178
+ /* C syntax highlighting */
179
+ --c-keyword: #f87171;
180
+ --c-type: #22d3ee;
181
+ --c-macro: #fb923c;
182
+ --c-function: #a78bfa;
183
+ --c-identifier: #94a3b8;
184
+ --c-operator: #6ee7b7;
185
+ --c-preprocessor: #e879f9;
186
+ --c-value: #fcd34d;
187
+ --c-string: #4ade80;
188
+ --c-comment: #a8a29e;
189
+
190
+ /* Semantic Colors - Dark Theme */
191
+ --color-text-primary: var(--color-neutral-50);
192
+ --color-text-secondary: var(--color-neutral-200);
193
+ --color-text-tertiary: var(--color-neutral-400);
194
+ --color-background-primary: var(--color-neutral-900);
195
+ --color-background-secondary: var(--color-neutral-800);
196
+ --color-background-tertiary: var(--color-neutral-700);
197
+ --color-border-default: var(--color-neutral-600);
198
+ --color-border-subtle: var(--color-neutral-700);
199
+ --color-border-emphasis: var(--color-neutral-300);
200
+ --color-link-default: var(--color-neutral-50);
201
+ --color-link-hover: var(--color-primary-500);
202
+ --color-accent-primary: var(--color-primary-500);
203
+ --color-accent-hover: var(--color-primary-400);
204
+ --color-accent-subtle: rgb(235 84 79 / 10%);
205
+ --color-code-bg: var(--color-neutral-800);
206
+ --color-code-border: var(--color-neutral-700);
207
+ --color-nav-bg: var(--color-neutral-900);
208
+ --color-nav-text: var(--color-neutral-50);
209
+ --color-th-background: var(--color-background-tertiary);
210
+ --color-td-background: var(--color-background-secondary);
211
+
212
+ /* Dark theme shadows (slightly more subtle) */
213
+ --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 40%), 0 1px 2px -1px rgb(0 0 0 / 40%);
214
+ --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 40%), 0 4px 6px -4px rgb(0 0 0 / 40%);
215
+ --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 40%), 0 8px 10px -6px rgb(0 0 0 / 40%);
216
+
217
+ }
218
+
219
+ /* 2. Global Styles & Layout */
220
+ body {
221
+ background: var(--color-background-primary);
222
+ font-family: var(--font-primary);
223
+ font-weight: 400;
224
+ color: var(--color-text-primary);
225
+ line-height: var(--line-height-relaxed);
226
+ margin: 0;
227
+ overflow-wrap: break-word; /* Avoid overflow on mobile */
228
+
229
+ /* Grid layout with header, sidebar, main, and footer */
230
+ display: grid;
231
+ grid-template: "header header" var(--layout-header-height) "nav main" 1fr "nav footer" auto / var(--layout-sidebar-width) 1fr;
232
+ min-height: 100vh;
233
+ }
234
+
235
+ /* Three-column layout when TOC is present */
236
+ body.has-toc {
237
+ grid-template: "header header header" var(--layout-header-height) "nav main toc" 1fr "nav footer toc" auto / var(--layout-sidebar-width) 1fr minmax(var(--layout-toc-width-min), var(--layout-toc-width-max));
238
+ min-height: 100vh;
239
+ }
240
+
241
+ /* Mobile: stack everything vertically */
242
+ @media (width <= 1023px) {
243
+ body,
244
+ body.has-toc {
245
+ display: flex;
246
+ flex-direction: column;
247
+ grid-template: none;
248
+ }
249
+ }
250
+
251
+ /* 3. Typography */
252
+
253
+ /* 4. Links */
254
+ a {
255
+ color: var(--color-link-default);
256
+ transition: color var(--transition-base);
257
+ text-decoration: underline;
258
+ text-underline-offset: 0.2em; /* Make sure it doesn't overlap with underscores in a method name. */
259
+ }
260
+
261
+ /* 5. Code and Pre */
262
+
263
+ /* Code blocks */
264
+ pre {
265
+ font-family: var(--font-code);
266
+ background-color: var(--color-code-bg);
267
+ border: 1px solid var(--color-code-border);
268
+ border-radius: var(--radius-md);
269
+ padding: var(--space-4);
270
+ overflow-x: auto;
271
+ font-size: var(--font-size-sm);
272
+ line-height: var(--line-height-normal);
273
+ margin: var(--space-4) 0;
274
+ position: relative;
275
+ }
276
+
277
+ /* Code block wrapper for copy button */
278
+ .code-block-wrapper {
279
+ position: relative;
280
+ margin: var(--space-4) 0;
281
+ }
282
+
283
+ /* Copy button styling */
284
+ .copy-code-button {
285
+ position: absolute;
286
+ top: var(--space-2);
287
+ right: var(--space-2);
288
+ padding: var(--space-2);
289
+ background: var(--color-background-secondary);
290
+ border: 1px solid var(--color-border-default);
291
+ border-radius: var(--radius-sm);
292
+ cursor: pointer;
293
+ opacity: 0.6;
294
+ transition: opacity var(--transition-fast), background var(--transition-fast), border-color var(--transition-fast), transform var(--transition-fast);
295
+ display: flex;
296
+ align-items: center;
297
+ justify-content: center;
298
+ width: 2rem;
299
+ height: 2rem;
300
+ z-index: 10;
301
+ }
302
+
303
+ .copy-code-button:hover,
304
+ .copy-code-button:focus {
305
+ opacity: 1;
306
+ background: var(--color-background-tertiary);
307
+ border-color: var(--color-border-emphasis);
308
+ }
309
+
310
+ .copy-code-button:active {
311
+ transform: scale(0.95);
312
+ }
313
+
314
+ .copy-code-button svg {
315
+ width: 1rem;
316
+ height: 1rem;
317
+ fill: none;
318
+ stroke: currentcolor;
319
+ stroke-width: 2;
320
+ stroke-linecap: round;
321
+ stroke-linejoin: round;
322
+ color: var(--color-text-secondary);
323
+ transition: color var(--transition-fast);
324
+ }
325
+
326
+ .copy-code-button:hover svg {
327
+ color: var(--color-text-primary);
328
+ }
329
+
330
+ /* Copied state - subtle green checkmark */
331
+ .copy-code-button.copied {
332
+ background: var(--color-success-bg);
333
+ border-color: var(--color-green-500);
334
+ opacity: 1;
335
+ }
336
+
337
+ .copy-code-button.copied svg {
338
+ color: var(--color-green-600);
339
+ }
340
+
341
+ [data-theme="dark"] .copy-code-button.copied {
342
+ border-color: var(--color-green-400);
343
+ }
344
+
345
+ [data-theme="dark"] .copy-code-button.copied svg {
346
+ color: var(--color-green-400);
347
+ }
348
+
349
+ /* Mobile adjustments */
350
+ @media (hover: none) {
351
+ .copy-code-button {
352
+ opacity: 0.7;
353
+ }
354
+
355
+ .copy-code-button:active {
356
+ opacity: 1;
357
+ }
358
+ }
359
+
360
+ /* Inline code */
361
+ code {
362
+ font-family: var(--font-code);
363
+ background-color: var(--color-code-bg);
364
+ border: 1px solid var(--color-border-subtle);
365
+ padding: 0.125rem 0.375rem;
366
+ border-radius: var(--radius-sm);
367
+ font-size: 0.9em;
368
+ }
369
+
370
+ pre code {
371
+ background: none;
372
+ border: none;
373
+ padding: 0;
374
+ font-size: inherit;
375
+ }
376
+
377
+ a code:hover {
378
+ color: var(--color-link-hover);
379
+ }
380
+
381
+ /* Tables */
382
+ table {
383
+ margin: 0;
384
+ border-spacing: 0;
385
+ border-collapse: collapse;
386
+ }
387
+
388
+ table tr th, table tr td {
389
+ padding: 0.2em 0.4em;
390
+ border: 1px solid var(--color-border-default);
391
+ }
392
+
393
+ table tr th {
394
+ background-color: var(--color-th-background);
395
+ }
396
+
397
+ table tr:nth-child(even) td {
398
+ background-color: var(--color-td-background);
399
+ }
400
+
401
+ /* 6. Header (Top Navbar) */
402
+ header.top-navbar {
403
+ grid-area: header;
404
+ position: sticky;
405
+ top: 0;
406
+ z-index: var(--z-fixed);
407
+ background: var(--color-background-primary);
408
+ border-bottom: 1px solid var(--color-border-default);
409
+ display: flex;
410
+ align-items: center;
411
+ justify-content: flex-start;
412
+ padding: 0 var(--space-6);
413
+ gap: var(--space-8);
414
+ height: var(--layout-header-height);
415
+ box-shadow: var(--shadow-sm);
416
+ }
417
+
418
+ header.top-navbar .navbar-brand {
419
+ font-size: var(--font-size-xl);
420
+ font-weight: var(--font-weight-semibold);
421
+ color: var(--color-text-primary);
422
+ text-decoration: none;
423
+ white-space: nowrap;
424
+ }
425
+
426
+ header.top-navbar .navbar-brand:hover {
427
+ color: var(--color-accent-primary);
428
+ }
429
+
430
+ header.top-navbar .navbar-search {
431
+ position: relative;
432
+ flex: 0 1 auto;
433
+ width: var(--layout-search-width);
434
+ }
435
+
436
+ header.top-navbar .navbar-search form {
437
+ margin: 0;
438
+ padding: 0;
439
+ }
440
+
441
+
442
+
443
+ /* Mobile search icon button (hidden on desktop) */
444
+ .navbar-search-mobile {
445
+ display: none;
446
+ }
447
+
448
+ /* Theme toggle button */
449
+ .theme-toggle {
450
+ display: flex;
451
+ align-items: center;
452
+ justify-content: center;
453
+ padding: var(--space-2);
454
+ margin-left: auto;
455
+ background: transparent;
456
+ border: 1px solid var(--color-border-default);
457
+ border-radius: var(--radius-md);
458
+ color: var(--color-text-primary);
459
+ cursor: pointer;
460
+ transition: background var(--transition-fast), border-color var(--transition-fast), color var(--transition-fast);
461
+ font-size: var(--font-size-lg);
462
+ line-height: 1;
463
+ width: 2.5rem;
464
+ height: 2.5rem;
465
+ }
466
+
467
+ .theme-toggle:hover {
468
+ background: var(--color-background-secondary);
469
+ border-color: var(--color-accent-primary);
470
+ color: var(--color-accent-primary);
471
+ }
472
+
473
+ .theme-toggle:focus {
474
+ outline: none;
475
+ border-color: var(--color-accent-primary);
476
+ box-shadow: 0 0 0 3px var(--color-accent-subtle);
477
+ }
478
+
479
+ .theme-toggle-icon {
480
+ display: inline-block;
481
+ transition: transform var(--transition-base);
482
+ }
483
+
484
+ .theme-toggle:hover .theme-toggle-icon {
485
+ transform: rotate(20deg);
486
+ }
487
+
488
+ /* Mobile navbar */
489
+ @media (width <= 1023px) {
490
+ header.top-navbar {
491
+ display: flex;
492
+ align-items: center;
493
+ padding: 0 var(--space-4);
494
+ gap: var(--space-4);
495
+ }
496
+
497
+ /* Hide desktop search bar on mobile */
498
+ header.top-navbar .navbar-search-desktop {
499
+ display: none;
500
+ }
501
+
502
+ /* Show mobile search icon */
503
+ .navbar-search-mobile {
504
+ display: flex;
505
+ align-items: center;
506
+ justify-content: center;
507
+ padding: 0.5rem;
508
+ background: transparent;
509
+ border: none;
510
+ font-size: 1.25rem;
511
+ color: var(--color-text-primary);
512
+ cursor: pointer;
513
+ transition: color var(--transition-fast);
514
+ }
515
+
516
+ .navbar-search-mobile:hover {
517
+ color: var(--color-accent-primary);
518
+ }
519
+
520
+ /* Brand needs left margin for hamburger button */
521
+ header.top-navbar .navbar-brand {
522
+ margin-left: 2.5rem;
523
+ flex: 1;
524
+ font-size: var(--font-size-lg);
525
+ overflow: hidden;
526
+ text-overflow: ellipsis;
527
+ white-space: nowrap;
528
+ }
529
+ }
530
+
531
+ /* 7. Navigation (Left Sidebar) */
532
+ nav {
533
+ grid-area: nav;
534
+ font-family: var(--font-heading);
535
+ font-size: var(--font-size-base);
536
+ border-right: 1px solid var(--color-border-default);
537
+ background: var(--color-nav-bg);
538
+ color: var(--color-nav-text);
539
+ overflow: hidden auto;
540
+ display: flex;
541
+ flex-direction: column;
542
+ position: sticky;
543
+ top: var(--layout-header-height);
544
+ height: calc(100vh - var(--layout-header-height));
545
+ }
546
+
547
+ /* Mobile navigation */
548
+ @media (width <= 1023px) {
549
+ nav {
550
+ position: fixed;
551
+ top: var(--layout-header-height);
552
+ bottom: 0;
553
+ left: 0;
554
+ width: var(--layout-sidebar-width);
555
+ z-index: calc(var(--z-fixed) - 10); /* Below header */
556
+ box-shadow: var(--shadow-lg);
557
+
558
+ /* Don't set height - let top/bottom define it */
559
+ }
560
+
561
+ nav[hidden] {
562
+ display: none;
563
+ }
564
+
565
+ /* Backdrop for mobile nav */
566
+ body::before {
567
+ content: '';
568
+ position: fixed;
569
+ inset: var(--layout-header-height) 0 0 0;
570
+ background: var(--color-overlay);
571
+ z-index: calc(var(--z-fixed) - 20);
572
+ opacity: 0;
573
+ pointer-events: none;
574
+ transition: opacity var(--transition-base);
575
+ }
576
+
577
+ /* Show backdrop when nav is open */
578
+ body.nav-open::before {
579
+ opacity: 1;
580
+ pointer-events: auto;
581
+ }
582
+ }
583
+
584
+ /* Desktop: hide nav when [hidden] attribute is set */
585
+ @media (width >= 1024px) {
586
+ nav[hidden] {
587
+ display: none;
588
+ }
589
+ }
590
+
591
+ nav .nav-section {
592
+ margin-top: var(--space-6);
593
+ padding: 0 var(--space-6);
594
+ }
595
+
596
+ nav h2, nav h3 {
597
+ font-size: var(--font-size-lg);
598
+ font-weight: var(--font-weight-semibold);
599
+ margin: 0 0 var(--space-4);
600
+ padding: var(--space-2) 0;
601
+ color: var(--color-accent-primary);
602
+ border-bottom: 1px solid var(--color-border-default);
603
+ }
604
+
605
+ nav ul,
606
+ nav dl,
607
+ nav p {
608
+ padding: 0;
609
+ list-style: none;
610
+ margin: var(--space-3) 0;
611
+ }
612
+
613
+ nav ul li {
614
+ margin-bottom: var(--space-2);
615
+ line-height: var(--line-height-relaxed);
616
+ }
617
+
618
+ nav ul ul {
619
+ padding-left: var(--space-5);
620
+ margin-top: var(--space-2);
621
+ }
622
+
623
+ nav ul ul ul {
624
+ padding-left: var(--space-5);
625
+ }
626
+
627
+ nav ul ul ul ul {
628
+ padding-left: var(--space-5);
629
+ }
630
+
631
+ nav a {
632
+ text-decoration: none;
633
+ }
634
+
635
+ nav footer {
636
+ padding: var(--space-4);
637
+ border-top: 1px solid var(--color-border-default);
638
+ }
639
+
640
+ nav footer a {
641
+ color: var(--color-accent-hover);
642
+ }
643
+
644
+ #navigation-toggle {
645
+ display: none; /* Hidden by default, shown on mobile */
646
+ }
647
+
648
+ /* Mobile toggle button */
649
+ @media (width <= 1023px) {
650
+ #navigation-toggle {
651
+ display: flex;
652
+ align-items: center;
653
+ justify-content: center;
654
+ position: fixed;
655
+ top: calc(var(--layout-header-height) / 2);
656
+ transform: translateY(-50%);
657
+ left: 1rem;
658
+ z-index: var(--z-fixed);
659
+ font-size: 1.5rem;
660
+ background: transparent;
661
+ border: none;
662
+ color: var(--color-text-primary);
663
+ cursor: pointer;
664
+ transition: color var(--transition-fast);
665
+ line-height: 1;
666
+ user-select: none;
667
+ -webkit-user-select: none;
668
+ }
669
+
670
+ #navigation-toggle:hover {
671
+ color: var(--color-accent-primary);
672
+ }
673
+ }
674
+
675
+ /*
676
+ * Shared Collapsible Animation using ::details-content pseudo-element.
677
+ * This is the modern CSS approach for animating <details> elements.
678
+ * Uses block-size animation with interpolate-size for smooth height transitions.
679
+ * Both nav-section-collapsible and nested link-list details share this pattern.
680
+ */
681
+ nav details {
682
+ interpolate-size: allow-keywords;
683
+ }
684
+
685
+ nav details::details-content {
686
+ overflow: hidden;
687
+ block-size: 0;
688
+ transition: block-size 200ms ease, content-visibility 200ms ease allow-discrete;
689
+ }
690
+
691
+ nav details[open]::details-content {
692
+ block-size: auto;
693
+ }
694
+
695
+ /* Collapsible Navigation Section Headers */
696
+
697
+ nav .nav-section-header {
698
+ display: flex;
699
+ align-items: center;
700
+ gap: var(--space-3);
701
+ padding: var(--space-3) 0;
702
+ cursor: pointer;
703
+ list-style: none;
704
+ user-select: none;
705
+ -webkit-user-select: none;
706
+ border-bottom: 1px solid var(--color-border-default);
707
+ margin-bottom: var(--space-3);
708
+ transition: color var(--transition-fast);
709
+ }
710
+
711
+ nav .nav-section-header::-webkit-details-marker {
712
+ display: none;
713
+ }
714
+
715
+ nav .nav-section-header:hover {
716
+ color: var(--color-accent-primary);
717
+ }
718
+
719
+ nav .nav-section-icon {
720
+ display: flex;
721
+ align-items: center;
722
+ justify-content: center;
723
+ width: 1.25rem;
724
+ height: 1.25rem;
725
+ flex-shrink: 0;
726
+ color: var(--color-accent-primary);
727
+ }
728
+
729
+ nav .nav-section-icon svg {
730
+ width: 100%;
731
+ height: 100%;
732
+ }
733
+
734
+ nav .nav-section-title {
735
+ font-size: var(--font-size-base);
736
+ font-weight: var(--font-weight-semibold);
737
+ color: inherit;
738
+ }
739
+
740
+ nav .nav-section-chevron {
741
+ display: flex;
742
+ align-items: center;
743
+ justify-content: center;
744
+ width: 1rem;
745
+ height: 1rem;
746
+ flex-shrink: 0;
747
+ color: var(--color-text-tertiary);
748
+ transition: transform var(--transition-base);
749
+ }
750
+
751
+ nav .nav-section-chevron svg {
752
+ width: 100%;
753
+ height: 100%;
754
+ }
755
+
756
+ /* Rotate chevron when open */
757
+ nav .nav-section-collapsible[open] > .nav-section-header .nav-section-chevron {
758
+ transform: rotate(90deg);
759
+ }
760
+
761
+ nav .nav-section-collapsible > ul,
762
+ nav .nav-section-collapsible > dl,
763
+ nav .nav-section-collapsible > p {
764
+ margin-top: 0;
765
+ }
766
+
767
+ nav .nav-section-collapsible > .nav-list {
768
+ padding-left: var(--space-5);
769
+ border-left: 1px solid var(--color-border-subtle);
770
+ margin-left: 9px; /* Align with the section icon center */
771
+ }
772
+
773
+ nav .nav-section-collapsible .nav-list .link-list {
774
+ border-left: none;
775
+ margin-left: 0;
776
+ padding-left: var(--space-5);
777
+ }
778
+
779
+ /*
780
+ Improve chevron styling for details under link-list, using SVG chevron that matches nav-section-chevron
781
+ We need to avoid adding the element in class content generation so it doesn't break darkfish styles
782
+ */
783
+ nav li details:has(.link-list) > summary {
784
+ display: inline-flex;
785
+ align-items: center;
786
+ gap: var(--space-2);
787
+ cursor: pointer;
788
+ }
789
+
790
+ nav li details:has(.link-list) > summary::after {
791
+ content: '';
792
+ position: static;
793
+ display: inline-block;
794
+ width: 1rem;
795
+ height: 1rem;
796
+ flex-shrink: 0;
797
+ margin-left: 0;
798
+ background-color: var(--color-text-secondary);
799
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='9 18 15 12 9 6'%3E%3C/polyline%3E%3C/svg%3E");
800
+ mask-size: contain;
801
+ mask-repeat: no-repeat;
802
+ mask-position: center;
803
+ -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='9 18 15 12 9 6'%3E%3C/polyline%3E%3C/svg%3E");
804
+ -webkit-mask-size: contain;
805
+ -webkit-mask-repeat: no-repeat;
806
+ -webkit-mask-position: center;
807
+ transition: transform var(--transition-base), background-color var(--transition-fast);
808
+ }
809
+
810
+ nav li details:has(.link-list) > summary:hover::after {
811
+ background-color: var(--color-accent-primary);
812
+ }
813
+
814
+ nav li details:has(.link-list)[open] > summary::after {
815
+ transform: rotate(90deg);
816
+ background-color: var(--color-accent-primary);
817
+ }
818
+
819
+ /* 8. Main Content (Center Column) */
820
+ main {
821
+ grid-area: main;
822
+ width: 100%;
823
+ max-width: var(--layout-content-max-width);
824
+ margin: 0 auto;
825
+ padding: var(--space-12) var(--space-8);
826
+ font-size: var(--font-size-base);
827
+ line-height: var(--line-height-relaxed);
828
+ color: var(--color-text-primary);
829
+ box-sizing: border-box;
830
+ }
831
+
832
+ /* Desktop: hide hamburger */
833
+ @media (width >= 1024px) {
834
+ #navigation-toggle {
835
+ display: none;
836
+ }
837
+ }
838
+
839
+ /* Mobile: full width with padding */
840
+ @media (width <= 1023px) {
841
+ main {
842
+ padding: var(--space-6) var(--space-4);
843
+ padding-top: var(--space-8);
844
+ width: 100%;
845
+ }
846
+
847
+ footer.site-footer {
848
+ padding: var(--space-8) var(--space-4);
849
+ }
850
+
851
+ footer.site-footer .footer-content {
852
+ grid-template-columns: 1fr;
853
+ gap: var(--space-6);
854
+ }
855
+ }
856
+
857
+ main h1[class] {
858
+ margin-top: 0;
859
+ margin-bottom: 1em;
860
+ font-size: 2.5em;
861
+ color: var(--color-accent-primary);
862
+ }
863
+
864
+ main h1,
865
+ main h2,
866
+ main h3,
867
+ main h4,
868
+ main h5,
869
+ main h6 {
870
+ font-family: var(--font-heading);
871
+ color: var(--color-accent-primary);
872
+ scroll-margin-top: calc(var(--layout-header-height) + 2rem);
873
+ }
874
+
875
+ /* Heading size hierarchy */
876
+ main h1 {
877
+ font-size: var(--font-size-3xl);
878
+ font-weight: var(--font-weight-bold);
879
+ margin-bottom: var(--space-4);
880
+ line-height: var(--line-height-tight);
881
+ }
882
+
883
+ main h2 {
884
+ font-size: var(--font-size-2xl);
885
+ font-weight: var(--font-weight-semibold);
886
+ margin-top: var(--space-8);
887
+ margin-bottom: var(--space-4);
888
+ line-height: var(--line-height-tight);
889
+ }
890
+
891
+ main h3 {
892
+ font-size: var(--font-size-xl);
893
+ font-weight: var(--font-weight-semibold);
894
+ margin-top: var(--space-6);
895
+ margin-bottom: var(--space-3);
896
+ line-height: var(--line-height-tight);
897
+ }
898
+
899
+ main h4 {
900
+ font-size: var(--font-size-lg);
901
+ font-weight: var(--font-weight-medium);
902
+ margin-top: var(--space-4);
903
+ margin-bottom: var(--space-2);
904
+ }
905
+
906
+ main h5, main h6 {
907
+ font-size: var(--font-size-base);
908
+ font-weight: var(--font-weight-medium);
909
+ margin-top: var(--space-3);
910
+ margin-bottom: var(--space-2);
911
+ }
912
+
913
+ /* Heading links */
914
+ main h1 a,
915
+ main h2 a,
916
+ main h3 a,
917
+ main h4 a,
918
+ main h5 a,
919
+ main h6 a {
920
+ color: inherit;
921
+ text-decoration: none;
922
+ }
923
+
924
+ main h1 a:hover,
925
+ main h2 a:hover,
926
+ main h3 a:hover,
927
+ main h4 a:hover,
928
+ main h5 a:hover,
929
+ main h6 a:hover {
930
+ text-decoration: underline;
931
+ }
932
+
933
+ /* Syntax Highlighting - Light Theme */
934
+ .ruby-constant { color: var(--code-orange); }
935
+ .ruby-keyword { color: var(--code-red); }
936
+ .ruby-ivar { color: var(--code-orange); }
937
+ .ruby-operator { color: var(--code-green); }
938
+ .ruby-identifier { color: var(--code-blue); }
939
+ .ruby-node { color: var(--code-purple); }
940
+
941
+ .ruby-comment {
942
+ color: var(--color-neutral-500);
943
+ font-style: italic;
944
+ }
945
+ .ruby-regexp { color: var(--code-purple); }
946
+ .ruby-value { color: var(--code-orange); }
947
+ .ruby-string { color: var(--code-green); }
948
+
949
+ /* Syntax Highlighting - Dark Theme */
950
+ [data-theme="dark"] .ruby-constant { color: var(--code-orange); }
951
+ [data-theme="dark"] .ruby-keyword { color: var(--code-red); }
952
+ [data-theme="dark"] .ruby-ivar { color: var(--code-orange); }
953
+ [data-theme="dark"] .ruby-operator { color: var(--code-green); }
954
+ [data-theme="dark"] .ruby-identifier { color: var(--code-blue); }
955
+ [data-theme="dark"] .ruby-node { color: var(--code-purple); }
956
+
957
+ [data-theme="dark"] .ruby-comment {
958
+ color: var(--color-neutral-400);
959
+ font-style: italic;
960
+ }
961
+ [data-theme="dark"] .ruby-regexp { color: var(--code-purple); }
962
+ [data-theme="dark"] .ruby-value { color: var(--code-orange); }
963
+ [data-theme="dark"] .ruby-string { color: var(--code-green); }
964
+
965
+ /* C Syntax Highlighting */
966
+ .c-keyword { color: var(--c-keyword); }
967
+ .c-type { color: var(--c-type); }
968
+ .c-macro { color: var(--c-macro); }
969
+ .c-function { color: var(--c-function); }
970
+ .c-identifier { color: var(--c-identifier); }
971
+ .c-operator { color: var(--c-operator); }
972
+ .c-preprocessor { color: var(--c-preprocessor); }
973
+ .c-value { color: var(--c-value); }
974
+ .c-string { color: var(--c-string); }
975
+
976
+ .c-comment {
977
+ color: var(--c-comment);
978
+ font-style: italic;
979
+ }
980
+
981
+ /* Emphasis */
982
+ em {
983
+ text-decoration-color: var(--color-emphasis-decoration);
984
+ text-decoration-line: underline;
985
+ text-decoration-style: dotted;
986
+ }
987
+
988
+ strong,
989
+ em {
990
+ color: var(--color-accent-primary);
991
+ background-color: var(--color-emphasis-bg);
992
+ }
993
+
994
+ /* Paragraphs */
995
+ main p {
996
+ line-height: var(--line-height-relaxed);
997
+ font-weight: 400;
998
+ margin-bottom: var(--space-4);
999
+ }
1000
+
1001
+ /* Preformatted Text */
1002
+ main pre {
1003
+ margin: 1.2em 0.5em;
1004
+ padding: 1em;
1005
+ font-size: 0.8em;
1006
+ }
1007
+
1008
+ .code-block-wrapper pre {
1009
+ margin: 0;
1010
+ }
1011
+
1012
+ /* Horizontal Rules */
1013
+ main hr {
1014
+ margin: 1.5em 1em;
1015
+ border: 2px solid var(--color-border-default);
1016
+ }
1017
+
1018
+ /* Blockquotes */
1019
+ main blockquote {
1020
+ margin: 0 2em 1.2em 1.2em;
1021
+ padding-left: 0.5em;
1022
+ border-left: 2px solid var(--color-border-default);
1023
+ }
1024
+
1025
+ /* Lists */
1026
+ main li > p {
1027
+ margin: 0.5em;
1028
+ }
1029
+
1030
+ /* Definition Lists */
1031
+ main dl {
1032
+ margin: 1em 0.5em;
1033
+ }
1034
+
1035
+ main dt {
1036
+ line-height: 1.5;
1037
+ font-weight: bold;
1038
+ }
1039
+
1040
+ main dl.note-list dt {
1041
+ margin-right: 1em;
1042
+ float: left;
1043
+ }
1044
+
1045
+ main dl.note-list dt:has(+ dt) {
1046
+ margin-right: 0.25em;
1047
+ }
1048
+
1049
+ main dl.note-list dt:has(+ dt)::after {
1050
+ content: ', ';
1051
+ font-weight: normal;
1052
+ }
1053
+
1054
+ main dd {
1055
+ margin: 0 0 1em 1em;
1056
+ }
1057
+
1058
+ main dd p:first-child {
1059
+ margin-top: 0;
1060
+ }
1061
+
1062
+ /* Headers within Main */
1063
+ main header h2 {
1064
+ margin-top: 2em;
1065
+ border-width: 0;
1066
+ border-top: 4px solid var(--color-border-default);
1067
+ font-size: 130%;
1068
+ }
1069
+
1070
+ main header h3 {
1071
+ margin: 2em 0 1.5em;
1072
+ border-width: 0;
1073
+ border-top: 3px solid var(--color-border-default);
1074
+ font-size: 120%;
1075
+ }
1076
+
1077
+ h1:target,
1078
+ h2:target,
1079
+ h3:target,
1080
+ h4:target,
1081
+ h5:target,
1082
+ h6:target {
1083
+ margin-left: calc(-1 * var(--space-5));
1084
+ padding-left: calc(var(--space-5) / 2);
1085
+ border-left: calc(var(--space-5) / 2) solid var(--color-border-default);
1086
+ }
1087
+
1088
+ main .anchor-link:target {
1089
+ scroll-margin-top: calc(var(--layout-header-height) + 2rem);
1090
+ }
1091
+
1092
+
1093
+ /* Utility Classes */
1094
+ .hide { display: none !important; }
1095
+ .initially-hidden { display: none; }
1096
+
1097
+ /* Screen reader only */
1098
+ .sr-only {
1099
+ position: absolute;
1100
+ width: 1px;
1101
+ height: 1px;
1102
+ padding: 0;
1103
+ margin: -1px;
1104
+ overflow: hidden;
1105
+ clip-path: inset(50%);
1106
+ white-space: nowrap;
1107
+ border-width: 0;
1108
+ }
1109
+
1110
+
1111
+
1112
+ /* Method Details */
1113
+ main .method-source-code {
1114
+ visibility: hidden;
1115
+ max-height: 0;
1116
+ overflow: auto;
1117
+ transition: max-height var(--transition-base), visibility var(--transition-base);
1118
+ }
1119
+
1120
+ main .method-source-code pre {
1121
+ border-color: var(--color-accent-hover);
1122
+ width: 100%;
1123
+ box-sizing: border-box;
1124
+ }
1125
+
1126
+ main .method-source-code.active-menu {
1127
+ visibility: visible;
1128
+ max-height: 100vh;
1129
+ }
1130
+
1131
+ main .method-description .method-calls-super {
1132
+ color: var(--color-text-primary);
1133
+ font-weight: bold;
1134
+ }
1135
+
1136
+ main .method-detail {
1137
+ margin-bottom: 2.5em;
1138
+ }
1139
+
1140
+ main .method-detail:target {
1141
+ margin-left: calc(-1 * var(--space-5));
1142
+ padding-left: calc(var(--space-5) / 2);
1143
+ border-left: calc(var(--space-5) / 2) solid var(--color-border-default);
1144
+ }
1145
+
1146
+ main .method-header {
1147
+ display: inline-block;
1148
+ max-width: calc(100% - 6em); /* 6em is the width of the source code toggle */
1149
+ }
1150
+
1151
+ main .method-heading {
1152
+ position: relative;
1153
+ font-family: var(--font-code);
1154
+ font-size: var(--font-size-lg);
1155
+ font-weight: var(--font-weight-semibold);
1156
+ margin-bottom: var(--space-3);
1157
+ }
1158
+
1159
+ main .method-heading .method-name {
1160
+ font-weight: var(--font-weight-semibold);
1161
+ }
1162
+
1163
+ main .method-heading .method-args {
1164
+ font-weight: var(--font-weight-normal);
1165
+ }
1166
+
1167
+ main .method-controls {
1168
+ line-height: 20px;
1169
+ float: right;
1170
+ color: var(--color-accent-hover);
1171
+ cursor: pointer;
1172
+ }
1173
+
1174
+ main .method-description,
1175
+ main .aliases {
1176
+ margin-top: 0.75em;
1177
+ color: var(--color-text-primary);
1178
+ }
1179
+
1180
+ main .aliases {
1181
+ padding-top: 4px;
1182
+ font-style: italic;
1183
+ cursor: default;
1184
+ }
1185
+
1186
+ main .aliases a {
1187
+ color: var(--color-accent-hover);
1188
+ }
1189
+
1190
+ main .mixin-from {
1191
+ font-size: 80%;
1192
+ font-style: italic;
1193
+ margin-bottom: 0.75em;
1194
+ }
1195
+
1196
+ main .method-description ul {
1197
+ margin-left: 1.5em;
1198
+ }
1199
+
1200
+ main #attribute-method-details .method-detail:hover {
1201
+ background-color: transparent;
1202
+ cursor: default;
1203
+ }
1204
+
1205
+ main .attribute-access-type {
1206
+ text-transform: uppercase;
1207
+ }
1208
+
1209
+ /* Small screen adjustments */
1210
+ @media (width <= 480px) {
1211
+ nav {
1212
+ width: 85%;
1213
+ max-width: 320px;
1214
+ }
1215
+
1216
+ main {
1217
+ margin: 0;
1218
+ padding: var(--space-4);
1219
+ max-width: 100%;
1220
+ }
1221
+
1222
+ table {
1223
+ display: block;
1224
+ overflow-x: auto;
1225
+ white-space: nowrap;
1226
+ }
1227
+
1228
+ main .method-controls {
1229
+ margin-top: 10px;
1230
+ float: none;
1231
+ }
1232
+ }
1233
+
1234
+
1235
+
1236
+ /* 9. Search Modal (Mobile) */
1237
+ .search-modal {
1238
+ position: fixed;
1239
+ inset: 0;
1240
+ z-index: var(--z-modal);
1241
+ display: none;
1242
+ }
1243
+
1244
+ .search-modal:not([hidden]) {
1245
+ display: flex;
1246
+ align-items: flex-start;
1247
+ justify-content: center;
1248
+ padding: var(--space-16) var(--space-4);
1249
+ }
1250
+
1251
+ /* Reduce padding on very small screens */
1252
+ @media (width <= 420px) {
1253
+ .search-modal:not([hidden]) {
1254
+ padding: var(--space-4) var(--space-3);
1255
+ }
1256
+
1257
+ .search-modal-content {
1258
+ border-radius: var(--radius-md);
1259
+ }
1260
+
1261
+ .search-modal-header {
1262
+ padding: var(--space-3);
1263
+ }
1264
+
1265
+ .search-modal-body {
1266
+ padding: var(--space-3);
1267
+ }
1268
+
1269
+ .search-modal-form input {
1270
+ font-size: var(--font-size-base);
1271
+ min-width: 0; /* Allow input to shrink */
1272
+ }
1273
+
1274
+ .search-modal-form {
1275
+ gap: var(--space-2);
1276
+ }
1277
+
1278
+ .search-modal-close {
1279
+ padding: var(--space-1) var(--space-3);
1280
+ font-size: 0.75rem;
1281
+ }
1282
+ }
1283
+
1284
+ .search-modal-backdrop {
1285
+ position: absolute;
1286
+ inset: 0;
1287
+ background: var(--color-overlay);
1288
+ z-index: 1;
1289
+ }
1290
+
1291
+ .search-modal-content {
1292
+ position: relative;
1293
+ z-index: 2;
1294
+ background: var(--color-background-primary);
1295
+ border-radius: var(--radius-lg);
1296
+ box-shadow: var(--shadow-xl);
1297
+ width: 100%;
1298
+ max-width: 600px;
1299
+ max-height: 80vh;
1300
+ display: flex;
1301
+ flex-direction: column;
1302
+ }
1303
+
1304
+ .search-modal-header {
1305
+ padding: var(--space-6);
1306
+ border-bottom: 1px solid var(--color-border-default);
1307
+ }
1308
+
1309
+ .search-modal-form {
1310
+ display: flex;
1311
+ align-items: center;
1312
+ gap: var(--space-3);
1313
+ }
1314
+
1315
+ .search-modal-icon {
1316
+ font-size: 1.5rem;
1317
+ color: var(--color-text-secondary);
1318
+ flex-shrink: 0;
1319
+ }
1320
+
1321
+ .search-modal-form input {
1322
+ flex: 1;
1323
+ border: none;
1324
+ outline: none;
1325
+ background: transparent;
1326
+ font-size: var(--font-size-lg);
1327
+ color: var(--color-text-primary);
1328
+ padding: 0;
1329
+ }
1330
+
1331
+ .search-modal-form input::placeholder {
1332
+ color: var(--color-text-tertiary);
1333
+ }
1334
+
1335
+ .search-modal-close {
1336
+ padding: var(--space-2) var(--space-4);
1337
+ background: var(--color-background-secondary);
1338
+ border: 1px solid var(--color-border-default);
1339
+ border-radius: var(--radius-md);
1340
+ font-size: var(--font-size-sm);
1341
+ color: var(--color-text-secondary);
1342
+ cursor: pointer;
1343
+ transition: background var(--transition-fast), border-color var(--transition-fast);
1344
+ flex-shrink: 0;
1345
+ }
1346
+
1347
+ .search-modal-close:hover {
1348
+ background: var(--color-background-tertiary);
1349
+ border-color: var(--color-border-default);
1350
+ }
1351
+
1352
+ .search-modal-body {
1353
+ padding: var(--space-6);
1354
+ overflow-y: auto;
1355
+ flex: 1;
1356
+ }
1357
+
1358
+ .search-modal-empty {
1359
+ text-align: center;
1360
+ color: var(--color-text-tertiary);
1361
+ padding: var(--space-12) 0;
1362
+ }
1363
+
1364
+ .search-modal-results {
1365
+ list-style: none;
1366
+ margin: 0;
1367
+ padding: 0;
1368
+ }
1369
+
1370
+ .search-modal-results.initially-hidden {
1371
+ display: block !important; /* Override initially-hidden */
1372
+ }
1373
+
1374
+ .search-modal-results li {
1375
+ padding: var(--space-3) var(--space-4);
1376
+ border-radius: var(--radius-md);
1377
+ cursor: pointer;
1378
+ transition: background var(--transition-fast);
1379
+ margin-bottom: var(--space-2);
1380
+ }
1381
+
1382
+ .search-modal-results li:hover {
1383
+ background: var(--color-background-secondary);
1384
+ }
1385
+
1386
+ .search-modal-results a {
1387
+ color: var(--color-text-primary);
1388
+ }
1389
+
1390
+ .search-modal-results .search-match {
1391
+ margin: 0;
1392
+ font-size: var(--font-size-base);
1393
+ }
1394
+
1395
+ .search-modal-results .search-match a {
1396
+ text-decoration: none;
1397
+ }
1398
+
1399
+ .search-modal-results .search-namespace {
1400
+ margin: var(--space-1) 0 0 0;
1401
+ font-size: var(--font-size-sm);
1402
+ color: var(--color-text-secondary);
1403
+ }
1404
+
1405
+ .search-modal-results .search-snippet {
1406
+ margin: var(--space-1) 0 0 0;
1407
+ font-size: var(--font-size-sm);
1408
+ color: var(--color-text-tertiary);
1409
+ }
1410
+
1411
+ /* 10. Right Sidebar - Table of Contents */
1412
+ aside.table-of-contents {
1413
+ grid-area: toc;
1414
+ align-self: start;
1415
+ position: sticky;
1416
+ top: var(--layout-header-height);
1417
+ padding: var(--space-8) var(--space-6);
1418
+ border: none;
1419
+ border-left: 1px solid var(--color-border-default);
1420
+ font-size: var(--font-size-base);
1421
+ }
1422
+
1423
+ aside.table-of-contents * {
1424
+ border-right: none !important;
1425
+ outline: none !important;
1426
+ }
1427
+
1428
+ aside.table-of-contents .toc-sticky {
1429
+ display: flex;
1430
+ flex-direction: column;
1431
+
1432
+ /* Exclude header height and top/bottom padding of aside.table-of-contents */
1433
+ height: calc(100vh - var(--layout-header-height) - var(--space-8) * 2);
1434
+ }
1435
+
1436
+ aside.table-of-contents .toc-sticky nav {
1437
+ height: auto;
1438
+ }
1439
+
1440
+ aside.table-of-contents .toc-list > .toc-h2 {
1441
+ margin-left: var(--space-4);
1442
+ }
1443
+
1444
+ aside.table-of-contents .toc-list > .toc-h3 {
1445
+ margin-left: var(--space-8);
1446
+ }
1447
+
1448
+ /* Hide TOC on mobile/tablet */
1449
+ @media (width <= 1279px) {
1450
+ aside.table-of-contents {
1451
+ display: none;
1452
+ }
1453
+
1454
+ body.has-toc {
1455
+ grid-template-columns: var(--layout-sidebar-width) 1fr;
1456
+ grid-template-areas:
1457
+ "header header"
1458
+ "nav main"
1459
+ "footer footer";
1460
+ }
1461
+ }
1462
+
1463
+ /* Tablet adjustments (between mobile and desktop) */
1464
+ @media (width >= 768px) and (width <= 1023px) {
1465
+ header.top-navbar {
1466
+ padding: 0 var(--space-6);
1467
+ }
1468
+
1469
+ main {
1470
+ padding: var(--space-8) var(--space-6);
1471
+ max-width: 100%;
1472
+ }
1473
+ }
1474
+
1475
+ .table-of-contents h3 {
1476
+ font-size: var(--font-size-lg);
1477
+ font-weight: var(--font-weight-semibold);
1478
+ margin: 0 0 var(--space-5) 0;
1479
+ color: var(--color-text-primary);
1480
+ }
1481
+
1482
+ .table-of-contents ul {
1483
+ margin: 0;
1484
+ padding: 0;
1485
+ list-style: none;
1486
+ }
1487
+
1488
+ .table-of-contents ul ul {
1489
+ margin-top: var(--space-3);
1490
+ margin-left: var(--space-5);
1491
+ border-left: 1px solid var(--color-border-default);
1492
+ padding-left: var(--space-4);
1493
+ }
1494
+
1495
+ .table-of-contents li {
1496
+ margin-bottom: var(--space-3);
1497
+ }
1498
+
1499
+ .table-of-contents a {
1500
+ display: block;
1501
+ color: var(--color-text-secondary);
1502
+ text-decoration: none;
1503
+ transition: color var(--transition-fast);
1504
+ line-height: var(--line-height-relaxed);
1505
+ overflow-wrap: break-word;
1506
+ hyphens: auto;
1507
+ }
1508
+
1509
+ /* Nav hover styles sit here to keep specificity ordering with TOC links */
1510
+ nav a:hover {
1511
+ color: var(--color-link-hover);
1512
+ text-decoration: underline;
1513
+ }
1514
+
1515
+ .table-of-contents a:hover {
1516
+ color: var(--color-link-hover);
1517
+ }
1518
+
1519
+ .table-of-contents a.active {
1520
+ color: var(--color-accent-primary);
1521
+ font-weight: var(--font-weight-medium);
1522
+ }
1523
+
1524
+ ol.breadcrumb {
1525
+ display: flex;
1526
+ padding: 0;
1527
+ margin: 0 0 1em;
1528
+ }
1529
+
1530
+ ol.breadcrumb li {
1531
+ display: block;
1532
+ list-style: none;
1533
+ font-size: 125%;
1534
+ }
1535
+
1536
+ /* 11. Footer */
1537
+ footer.site-footer {
1538
+ grid-area: footer;
1539
+ background: var(--color-background-secondary);
1540
+ border-top: 1px solid var(--color-border-default);
1541
+ padding: var(--space-12) var(--space-6);
1542
+ }
1543
+
1544
+ footer.site-footer .footer-content {
1545
+ max-width: 1200px;
1546
+ margin: 0 auto;
1547
+ display: grid;
1548
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
1549
+ gap: var(--space-8);
1550
+ }
1551
+
1552
+ footer.site-footer h3 {
1553
+ font-size: var(--font-size-sm);
1554
+ font-weight: var(--font-weight-semibold);
1555
+ color: var(--color-text-primary);
1556
+ margin: 0 0 var(--space-4) 0;
1557
+ letter-spacing: 0.05em;
1558
+ }
1559
+
1560
+ footer.site-footer ul {
1561
+ list-style: none;
1562
+ margin: 0;
1563
+ padding: 0;
1564
+ }
1565
+
1566
+ footer.site-footer li {
1567
+ margin-bottom: var(--space-2);
1568
+ }
1569
+
1570
+ footer.site-footer a {
1571
+ color: var(--color-text-secondary);
1572
+ text-decoration: none;
1573
+ font-size: var(--font-size-sm);
1574
+ transition: color var(--transition-fast);
1575
+ }
1576
+
1577
+ footer.site-footer a:hover {
1578
+ color: var(--color-link-hover);
1579
+ }
1580
+
1581
+ footer.site-footer .footer-bottom {
1582
+ margin-top: var(--space-8);
1583
+ padding-top: var(--space-6);
1584
+ border-top: 1px solid var(--color-border-default);
1585
+ text-align: center;
1586
+ font-size: var(--font-size-xs);
1587
+ color: var(--color-text-tertiary);
1588
+ }
1589
+
1590
+ footer.site-footer .footer-bottom:first-child {
1591
+ margin-top: 0;
1592
+ padding-top: 0;
1593
+ border-top: none;
1594
+ }
1595
+
1596
+ /* Search */
1597
+ #search-section {
1598
+ padding: var(--space-6);
1599
+ background-color: var(--color-background-primary);
1600
+ border-bottom: 1px solid var(--color-border-default);
1601
+ }
1602
+
1603
+ #search-field-wrapper {
1604
+ position: relative;
1605
+ display: flex;
1606
+ align-items: center;
1607
+ }
1608
+
1609
+ #search-field {
1610
+ width: 100%;
1611
+ padding: var(--space-2) var(--space-4) var(--space-2) 2.5rem;
1612
+ border: 1px solid var(--color-border-default);
1613
+ border-radius: 1.25rem;
1614
+ font-size: var(--font-size-sm);
1615
+ outline: none;
1616
+ transition: border-color var(--transition-base);
1617
+ color: var(--color-text-primary);
1618
+ }
1619
+
1620
+ #search-field:focus {
1621
+ border-color: var(--color-accent-primary);
1622
+ }
1623
+
1624
+ #search-field::placeholder {
1625
+ color: var(--color-text-primary);
1626
+ }
1627
+
1628
+ #search-field-wrapper::before {
1629
+ content: "\1F50D";
1630
+ position: absolute;
1631
+ left: var(--space-3);
1632
+ top: 50%;
1633
+ transform: translateY(-50%);
1634
+ font-size: var(--font-size-sm);
1635
+ color: var(--color-text-primary);
1636
+ opacity: 0.6;
1637
+ }
1638
+
1639
+ /* Search Results */
1640
+ #search-results {
1641
+ font-family: var(--font-primary);
1642
+ font-weight: 300;
1643
+ }
1644
+
1645
+ #search-results a {
1646
+ color: var(--color-text-primary);
1647
+ }
1648
+
1649
+ #search-results a:hover {
1650
+ color: var(--color-accent-primary);
1651
+ }
1652
+
1653
+ #search-results .search-match {
1654
+ font-family: var(--font-heading);
1655
+ font-weight: normal;
1656
+ }
1657
+
1658
+ #search-results .search-selected {
1659
+ background: var(--color-code-bg);
1660
+ border-bottom: 1px solid transparent;
1661
+ }
1662
+
1663
+ #search-results li {
1664
+ list-style: none;
1665
+ border-bottom: 1px solid var(--color-border-default);
1666
+ margin-bottom: 0.5em;
1667
+ }
1668
+
1669
+ #search-results li:last-child {
1670
+ border-bottom: none;
1671
+ margin-bottom: 0;
1672
+ }
1673
+
1674
+ #search-results li p {
1675
+ padding: 0;
1676
+ margin: 0.5em;
1677
+ }
1678
+
1679
+ #search-results .search-namespace {
1680
+ font-weight: bold;
1681
+ }
1682
+
1683
+ #search-results li em {
1684
+ background-color: var(--color-search-highlight-bg);
1685
+ font-style: normal;
1686
+ }
1687
+
1688
+ #search-results pre {
1689
+ margin: 0.5em;
1690
+ font-family: var(--font-code);
1691
+ }
1692
+
1693
+ header.top-navbar #search-field {
1694
+ width: 100%;
1695
+ padding: var(--space-2) var(--space-4);
1696
+ border: 1px solid var(--color-border-default);
1697
+ border-radius: var(--radius-md);
1698
+ font-size: var(--font-size-base);
1699
+ background: var(--color-background-primary);
1700
+ color: var(--color-text-primary);
1701
+ transition: border-color var(--transition-fast);
1702
+ }
1703
+
1704
+ header.top-navbar #search-field:focus {
1705
+ outline: none;
1706
+ border-color: var(--color-accent-primary);
1707
+ box-shadow: 0 0 0 3px var(--color-accent-subtle);
1708
+ }
1709
+
1710
+ header.top-navbar #search-field::placeholder {
1711
+ color: var(--color-text-tertiary);
1712
+ }
1713
+
1714
+ /* Search results dropdown in navbar */
1715
+ header.top-navbar #search-results {
1716
+ position: absolute;
1717
+ top: calc(100% + var(--space-2));
1718
+ left: 0;
1719
+ width: var(--layout-search-width);
1720
+ max-height: 60vh;
1721
+ background: var(--color-background-primary);
1722
+ border: 1px solid var(--color-border-default);
1723
+ border-radius: var(--radius-lg);
1724
+ box-shadow: var(--shadow-lg);
1725
+ overflow-y: auto;
1726
+ z-index: var(--z-popover);
1727
+ margin: 0;
1728
+ padding: 0;
1729
+ }
1730
+
1731
+ header.top-navbar #search-results.initially-hidden {
1732
+ display: none;
1733
+ }
1734
+
1735
+ header.top-navbar #search-results[aria-expanded="false"] {
1736
+ display: none;
1737
+ }