rdoc 6.17.0 → 8.1.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 (169) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +193 -0
  3. data/LEGAL.rdoc +6 -0
  4. data/LICENSE.rdoc +4 -0
  5. data/README.md +132 -8
  6. data/RI.md +75 -75
  7. data/doc/markup_reference/markdown.md +659 -0
  8. data/doc/markup_reference/rdoc.rdoc +1169 -0
  9. data/exe/rdoc +2 -2
  10. data/lib/rdoc/code_object/alias.rb +70 -74
  11. data/lib/rdoc/code_object/any_method.rb +308 -293
  12. data/lib/rdoc/code_object/attr.rb +150 -142
  13. data/lib/rdoc/code_object/class_module.rb +802 -715
  14. data/lib/rdoc/code_object/constant.rb +181 -144
  15. data/lib/rdoc/code_object/context/section.rb +140 -130
  16. data/lib/rdoc/code_object/context.rb +925 -941
  17. data/lib/rdoc/code_object/extend.rb +7 -5
  18. data/lib/rdoc/code_object/include.rb +7 -5
  19. data/lib/rdoc/code_object/method_attr.rb +328 -315
  20. data/lib/rdoc/code_object/mixin.rb +97 -92
  21. data/lib/rdoc/code_object/normal_class.rb +77 -78
  22. data/lib/rdoc/code_object/normal_module.rb +61 -59
  23. data/lib/rdoc/code_object/require.rb +23 -39
  24. data/lib/rdoc/code_object/single_class.rb +21 -19
  25. data/lib/rdoc/code_object/top_level.rb +215 -202
  26. data/lib/rdoc/code_object.rb +305 -305
  27. data/lib/rdoc/comment.rb +274 -337
  28. data/lib/rdoc/cross_reference.rb +195 -206
  29. data/lib/rdoc/encoding.rb +105 -103
  30. data/lib/rdoc/erb_partial.rb +13 -11
  31. data/lib/rdoc/erbio.rb +29 -27
  32. data/lib/rdoc/generator/aliki.rb +196 -30
  33. data/lib/rdoc/generator/darkfish.rb +647 -629
  34. data/lib/rdoc/generator/json_index.rb +233 -229
  35. data/lib/rdoc/generator/markup.rb +165 -122
  36. data/lib/rdoc/generator/pot/message_extractor.rb +57 -51
  37. data/lib/rdoc/generator/pot/po.rb +52 -51
  38. data/lib/rdoc/generator/pot/po_entry.rb +138 -132
  39. data/lib/rdoc/generator/pot.rb +85 -81
  40. data/lib/rdoc/generator/ri.rb +23 -19
  41. data/lib/rdoc/generator/template/aliki/DESIGN.md +538 -0
  42. data/lib/rdoc/generator/template/aliki/_aside_toc.rhtml +1 -1
  43. data/lib/rdoc/generator/template/aliki/_footer.rhtml +2 -2
  44. data/lib/rdoc/generator/template/aliki/_head.rhtml +15 -10
  45. data/lib/rdoc/generator/template/aliki/_header.rhtml +29 -44
  46. data/lib/rdoc/generator/template/aliki/_sidebar_extends.rhtml +8 -6
  47. data/lib/rdoc/generator/template/aliki/_sidebar_includes.rhtml +8 -6
  48. data/lib/rdoc/generator/template/aliki/_sidebar_installed.rhtml +1 -1
  49. data/lib/rdoc/generator/template/aliki/_sidebar_pages.rhtml +3 -3
  50. data/lib/rdoc/generator/template/aliki/_sidebar_search.rhtml +3 -3
  51. data/lib/rdoc/generator/template/aliki/_sidebar_sections.rhtml +1 -1
  52. data/lib/rdoc/generator/template/aliki/_sidebar_toggle.rhtml +1 -1
  53. data/lib/rdoc/generator/template/aliki/class.rhtml +71 -61
  54. data/lib/rdoc/generator/template/aliki/css/rdoc.css +796 -323
  55. data/lib/rdoc/generator/template/aliki/index.rhtml +1 -1
  56. data/lib/rdoc/generator/template/aliki/js/aliki.js +119 -113
  57. data/lib/rdoc/generator/template/aliki/js/bash_highlighter.js +167 -0
  58. data/lib/rdoc/generator/template/aliki/js/c_highlighter.js +1 -1
  59. data/lib/rdoc/generator/template/aliki/js/{search.js → search_controller.js} +16 -7
  60. data/lib/rdoc/generator/template/aliki/js/search_navigation.js +105 -0
  61. data/lib/rdoc/generator/template/aliki/js/search_ranker.js +239 -0
  62. data/lib/rdoc/generator/template/aliki/page.rhtml +1 -1
  63. data/lib/rdoc/generator/template/aliki/servlet_not_found.rhtml +1 -1
  64. data/lib/rdoc/generator/template/aliki/servlet_root.rhtml +2 -2
  65. data/lib/rdoc/generator/template/darkfish/_footer.rhtml +1 -1
  66. data/lib/rdoc/generator/template/darkfish/_sidebar_extends.rhtml +8 -6
  67. data/lib/rdoc/generator/template/darkfish/_sidebar_includes.rhtml +8 -6
  68. data/lib/rdoc/generator/template/darkfish/_sidebar_installed.rhtml +1 -1
  69. data/lib/rdoc/generator/template/darkfish/_sidebar_pages.rhtml +2 -2
  70. data/lib/rdoc/generator/template/darkfish/_sidebar_sections.rhtml +1 -1
  71. data/lib/rdoc/generator/template/darkfish/_sidebar_table_of_contents.rhtml +5 -5
  72. data/lib/rdoc/generator/template/darkfish/class.rhtml +29 -32
  73. data/lib/rdoc/generator/template/darkfish/css/rdoc.css +19 -1
  74. data/lib/rdoc/generator/template/darkfish/table_of_contents.rhtml +3 -3
  75. data/lib/rdoc/generator.rb +48 -46
  76. data/lib/rdoc/i18n/locale.rb +99 -95
  77. data/lib/rdoc/i18n/text.rb +109 -105
  78. data/lib/rdoc/i18n.rb +7 -5
  79. data/lib/rdoc/markdown/byte_runtime.rb +80 -0
  80. data/lib/rdoc/markdown.kpeg +52 -33
  81. data/lib/rdoc/markdown.rb +365 -177
  82. data/lib/rdoc/markup/blank_line.rb +25 -23
  83. data/lib/rdoc/markup/block_quote.rb +12 -8
  84. data/lib/rdoc/markup/document.rb +127 -123
  85. data/lib/rdoc/markup/element.rb +21 -0
  86. data/lib/rdoc/markup/formatter.rb +220 -203
  87. data/lib/rdoc/markup/hard_break.rb +30 -27
  88. data/lib/rdoc/markup/heading.rb +163 -77
  89. data/lib/rdoc/markup/include.rb +33 -29
  90. data/lib/rdoc/markup/indented_paragraph.rb +37 -33
  91. data/lib/rdoc/markup/inline_parser.rb +316 -0
  92. data/lib/rdoc/markup/list.rb +80 -88
  93. data/lib/rdoc/markup/list_item.rb +73 -85
  94. data/lib/rdoc/markup/paragraph.rb +23 -19
  95. data/lib/rdoc/markup/parser.rb +501 -497
  96. data/lib/rdoc/markup/pre_process.rb +284 -305
  97. data/lib/rdoc/markup/raw.rb +52 -55
  98. data/lib/rdoc/markup/rule.rb +16 -12
  99. data/lib/rdoc/markup/table.rb +48 -40
  100. data/lib/rdoc/markup/to_ansi.rb +143 -92
  101. data/lib/rdoc/markup/to_bs.rb +86 -102
  102. data/lib/rdoc/markup/to_html.rb +608 -506
  103. data/lib/rdoc/markup/to_html_crossref.rb +219 -210
  104. data/lib/rdoc/markup/to_html_snippet.rb +210 -205
  105. data/lib/rdoc/markup/to_joined_paragraph.rb +40 -41
  106. data/lib/rdoc/markup/to_label.rb +64 -51
  107. data/lib/rdoc/markup/to_markdown.rb +212 -184
  108. data/lib/rdoc/markup/to_rdoc.rb +341 -277
  109. data/lib/rdoc/markup/to_table_of_contents.rb +66 -62
  110. data/lib/rdoc/markup/to_test.rb +62 -50
  111. data/lib/rdoc/markup/to_tt_only.rb +83 -92
  112. data/lib/rdoc/markup/verbatim.rb +62 -58
  113. data/lib/rdoc/markup.rb +196 -215
  114. data/lib/rdoc/options.rb +1063 -1076
  115. data/lib/rdoc/parser/c.rb +1039 -1036
  116. data/lib/rdoc/parser/changelog.rb +320 -287
  117. data/lib/rdoc/parser/markdown.rb +17 -13
  118. data/lib/rdoc/parser/rbs.rb +279 -0
  119. data/lib/rdoc/parser/rd.rb +17 -13
  120. data/lib/rdoc/parser/ruby.rb +1231 -2222
  121. data/lib/rdoc/parser/ruby_colorizer.rb +303 -0
  122. data/lib/rdoc/parser/simple.rb +31 -27
  123. data/lib/rdoc/parser/text.rb +12 -8
  124. data/lib/rdoc/parser.rb +230 -221
  125. data/lib/rdoc/rbs_helper.rb +186 -0
  126. data/lib/rdoc/rd/inline.rb +57 -53
  127. data/lib/rdoc/rd.rb +90 -88
  128. data/lib/rdoc/rdoc.rb +547 -366
  129. data/lib/rdoc/ri/driver.rb +1141 -1130
  130. data/lib/rdoc/ri/formatter.rb +7 -3
  131. data/lib/rdoc/ri/paths.rb +140 -136
  132. data/lib/rdoc/ri/servlet.rb +456 -0
  133. data/lib/rdoc/ri/store.rb +4 -2
  134. data/lib/rdoc/ri/task.rb +55 -51
  135. data/lib/rdoc/ri.rb +14 -11
  136. data/lib/rdoc/rubygems_hook.rb +194 -192
  137. data/lib/rdoc/server.rb +462 -0
  138. data/lib/rdoc/stats/normal.rb +46 -42
  139. data/lib/rdoc/stats/quiet.rb +39 -35
  140. data/lib/rdoc/stats/verbose.rb +35 -31
  141. data/lib/rdoc/stats.rb +363 -338
  142. data/lib/rdoc/store.rb +919 -725
  143. data/lib/rdoc/task.rb +260 -255
  144. data/lib/rdoc/text.rb +164 -240
  145. data/lib/rdoc/token_stream.rb +88 -106
  146. data/lib/rdoc/tom_doc.rb +203 -201
  147. data/lib/rdoc/version.rb +1 -1
  148. data/lib/rdoc.rb +35 -7
  149. data/lib/rubygems_plugin.rb +2 -11
  150. data/rdoc-logo.svg +43 -0
  151. data/rdoc.gemspec +9 -7
  152. metadata +46 -32
  153. data/CONTRIBUTING.rdoc +0 -219
  154. data/ExampleMarkdown.md +0 -39
  155. data/ExampleRDoc.rdoc +0 -210
  156. data/lib/rdoc/code_object/anon_class.rb +0 -10
  157. data/lib/rdoc/code_object/ghost_method.rb +0 -6
  158. data/lib/rdoc/code_object/meta_method.rb +0 -6
  159. data/lib/rdoc/markdown/literals.kpeg +0 -21
  160. data/lib/rdoc/markdown/literals.rb +0 -454
  161. data/lib/rdoc/markup/attr_changer.rb +0 -22
  162. data/lib/rdoc/markup/attr_span.rb +0 -35
  163. data/lib/rdoc/markup/attribute_manager.rb +0 -405
  164. data/lib/rdoc/markup/attributes.rb +0 -70
  165. data/lib/rdoc/markup/regexp_handling.rb +0 -40
  166. data/lib/rdoc/parser/prism_ruby.rb +0 -1100
  167. data/lib/rdoc/parser/ripper_state_lex.rb +0 -302
  168. data/lib/rdoc/parser/ruby_tools.rb +0 -163
  169. data/lib/rdoc/servlet.rb +0 -452
@@ -39,24 +39,14 @@
39
39
  --color-neutral-800: #292524;
40
40
  --color-neutral-900: #1c1917;
41
41
 
42
- /* Code highlighting colors */
42
+ /* Code highlighting colors - neutral palette for all syntax highlighters */
43
43
  --code-blue: #1d4ed8;
44
44
  --code-green: #047857;
45
45
  --code-orange: #d97706;
46
46
  --code-purple: #7e22ce;
47
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;
48
+ --code-cyan: #0891b2;
49
+ --code-gray: #78716c;
60
50
 
61
51
  /* Color Palette - Green (for success states) */
62
52
  --color-green-400: #4ade80;
@@ -78,13 +68,26 @@
78
68
  --color-accent-primary: var(--color-primary-600);
79
69
  --color-accent-hover: var(--color-primary-700);
80
70
  --color-accent-subtle: var(--color-primary-50);
71
+ --color-title-kind-border: var(--color-primary-200);
81
72
  --color-code-bg: #f6f8fa;
82
73
  --color-code-border: var(--color-neutral-300);
74
+ --color-sig-bg: var(--color-neutral-100);
75
+ --color-sig-border: var(--color-border-default);
83
76
  --color-nav-bg: #fff;
84
77
  --color-nav-text: var(--color-neutral-700);
85
78
  --color-th-background: var(--color-neutral-100);
86
79
  --color-td-background: var(--color-neutral-50);
87
80
 
81
+ /* Search Type Badge Colors */
82
+ --color-search-type-class-bg: #e6f0ff;
83
+ --color-search-type-class-text: #0050a0;
84
+ --color-search-type-module-bg: #e6ffe6;
85
+ --color-search-type-module-text: #060;
86
+ --color-search-type-constant-bg: #fff0e6;
87
+ --color-search-type-constant-text: #995200;
88
+ --color-search-type-method-bg: #f0e6ff;
89
+ --color-search-type-method-text: #5200a0;
90
+
88
91
  /* RGBA Colors (theme-agnostic) */
89
92
  --color-overlay: rgb(0 0 0 / 50%);
90
93
  --color-emphasis-bg: rgb(255 111 97 / 10%);
@@ -142,6 +145,7 @@
142
145
 
143
146
  /* Shadows */
144
147
  --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 10%), 0 1px 2px -1px rgb(0 0 0 / 10%);
148
+ --shadow-md: 0 2px 8px rgb(0 0 0 / 10%);
145
149
  --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 10%), 0 4px 6px -4px rgb(0 0 0 / 10%);
146
150
  --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 10%), 0 8px 10px -6px rgb(0 0 0 / 10%);
147
151
 
@@ -158,6 +162,13 @@
158
162
  /* Transitions */
159
163
  --transition-fast: 150ms ease-in-out;
160
164
  --transition-base: 200ms ease-in-out;
165
+ --transition-slow: 350ms ease-in-out;
166
+ --ease-out-smooth: cubic-bezier(0.4, 0, 0.2, 1);
167
+
168
+ /* Animation Durations */
169
+ --duration-fast: 250ms;
170
+ --duration-base: 300ms;
171
+ --duration-medium: 350ms;
161
172
 
162
173
  /* Z-Index Scale */
163
174
  --z-fixed: 300;
@@ -168,24 +179,14 @@
168
179
 
169
180
  /* Dark Theme */
170
181
  [data-theme="dark"] {
171
- /* Code highlighting colors */
182
+ /* Code highlighting colors - neutral palette for all syntax highlighters */
172
183
  --code-blue: #93c5fd;
173
184
  --code-green: #34d399;
174
185
  --code-orange: #fbbf24;
175
186
  --code-purple: #c084fc;
176
187
  --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;
188
+ --code-cyan: #22d3ee;
189
+ --code-gray: #a8a29e;
189
190
 
190
191
  /* Semantic Colors - Dark Theme */
191
192
  --color-text-primary: var(--color-neutral-50);
@@ -202,15 +203,30 @@
202
203
  --color-accent-primary: var(--color-primary-500);
203
204
  --color-accent-hover: var(--color-primary-400);
204
205
  --color-accent-subtle: rgb(235 84 79 / 10%);
206
+ --color-accent-subtle-hover: rgb(235 84 79 / 20%);
207
+ --color-title-kind-border: rgb(235 84 79 / 35%);
205
208
  --color-code-bg: var(--color-neutral-800);
206
209
  --color-code-border: var(--color-neutral-700);
210
+ --color-sig-bg: #211f1e; /* between neutral-900 and neutral-800 */
211
+ --color-sig-border: var(--color-border-subtle);
207
212
  --color-nav-bg: var(--color-neutral-900);
208
213
  --color-nav-text: var(--color-neutral-50);
209
214
  --color-th-background: var(--color-background-tertiary);
210
215
  --color-td-background: var(--color-background-secondary);
211
216
 
217
+ /* Search Type Badge Colors - Dark Theme */
218
+ --color-search-type-class-bg: #1e3a5f;
219
+ --color-search-type-class-text: #93c5fd;
220
+ --color-search-type-module-bg: #14532d;
221
+ --color-search-type-module-text: #86efac;
222
+ --color-search-type-constant-bg: #451a03;
223
+ --color-search-type-constant-text: #fcd34d;
224
+ --color-search-type-method-bg: #3b0764;
225
+ --color-search-type-method-text: #d8b4fe;
226
+
212
227
  /* Dark theme shadows (slightly more subtle) */
213
228
  --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 40%), 0 1px 2px -1px rgb(0 0 0 / 40%);
229
+ --shadow-md: 0 2px 8px rgb(0 0 0 / 40%);
214
230
  --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 40%), 0 4px 6px -4px rgb(0 0 0 / 40%);
215
231
  --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 40%), 0 8px 10px -6px rgb(0 0 0 / 40%);
216
232
 
@@ -291,7 +307,12 @@ pre {
291
307
  border-radius: var(--radius-sm);
292
308
  cursor: pointer;
293
309
  opacity: 0.6;
294
- transition: opacity var(--transition-fast), background var(--transition-fast), border-color var(--transition-fast), transform var(--transition-fast);
310
+ transition:
311
+ opacity var(--transition-fast),
312
+ background var(--transition-fast),
313
+ border-color var(--transition-fast),
314
+ transform var(--transition-fast),
315
+ box-shadow var(--transition-fast);
295
316
  display: flex;
296
317
  align-items: center;
297
318
  justify-content: center;
@@ -305,10 +326,18 @@ pre {
305
326
  opacity: 1;
306
327
  background: var(--color-background-tertiary);
307
328
  border-color: var(--color-border-emphasis);
329
+ transform: translateY(-1px);
330
+ box-shadow: var(--shadow-md);
331
+ }
332
+
333
+ .copy-code-button:focus {
334
+ outline: none;
335
+ box-shadow: 0 0 0 3px var(--color-accent-subtle);
308
336
  }
309
337
 
310
338
  .copy-code-button:active {
311
- transform: scale(0.95);
339
+ transform: scale(0.92);
340
+ box-shadow: none;
312
341
  }
313
342
 
314
343
  .copy-code-button svg {
@@ -320,7 +349,7 @@ pre {
320
349
  stroke-linecap: round;
321
350
  stroke-linejoin: round;
322
351
  color: var(--color-text-secondary);
323
- transition: color var(--transition-fast);
352
+ transition: color var(--transition-fast), transform var(--transition-base);
324
353
  }
325
354
 
326
355
  .copy-code-button:hover svg {
@@ -406,16 +435,35 @@ header.top-navbar {
406
435
  z-index: var(--z-fixed);
407
436
  background: var(--color-background-primary);
408
437
  border-bottom: 1px solid var(--color-border-default);
409
- display: flex;
438
+ display: grid;
439
+ grid-template-columns:
440
+ var(--layout-sidebar-width)
441
+ minmax(0, 1fr);
410
442
  align-items: center;
411
- justify-content: flex-start;
412
- padding: 0 var(--space-6);
413
- gap: var(--space-8);
443
+ padding: 0;
414
444
  height: var(--layout-header-height);
415
445
  box-shadow: var(--shadow-sm);
416
446
  }
417
447
 
448
+ body.has-toc header.top-navbar {
449
+ grid-template-columns:
450
+ var(--layout-sidebar-width)
451
+ minmax(0, 1fr)
452
+ minmax(var(--layout-toc-width-min), var(--layout-toc-width-max));
453
+ }
454
+
455
+ @media (width <= 1279px) {
456
+ body.has-toc header.top-navbar {
457
+ grid-template-columns:
458
+ var(--layout-sidebar-width)
459
+ minmax(0, 1fr);
460
+ }
461
+ }
462
+
418
463
  header.top-navbar .navbar-brand {
464
+ grid-column: 1;
465
+ justify-self: start;
466
+ margin-left: var(--space-6);
419
467
  font-size: var(--font-size-xl);
420
468
  font-weight: var(--font-weight-semibold);
421
469
  color: var(--color-text-primary);
@@ -428,12 +476,23 @@ header.top-navbar .navbar-brand:hover {
428
476
  }
429
477
 
430
478
  header.top-navbar .navbar-search {
479
+ grid-column: 2;
480
+ justify-self: center;
481
+ box-sizing: border-box;
482
+ width: min(100%, var(--layout-content-max-width));
483
+ padding: 0 var(--space-8);
484
+ }
485
+
486
+ header.top-navbar .search-surface {
431
487
  position: relative;
432
- flex: 0 1 auto;
433
- width: var(--layout-search-width);
488
+ width: min(100%, var(--layout-search-width));
489
+ margin: 0;
434
490
  }
435
491
 
436
492
  header.top-navbar .navbar-search form {
493
+ position: relative;
494
+ box-sizing: border-box;
495
+ width: 100%;
437
496
  margin: 0;
438
497
  padding: 0;
439
498
  }
@@ -447,27 +506,35 @@ header.top-navbar .navbar-search form {
447
506
 
448
507
  /* Theme toggle button */
449
508
  .theme-toggle {
509
+ position: absolute;
510
+ top: 50%;
511
+ right: var(--space-6);
450
512
  display: flex;
451
513
  align-items: center;
452
514
  justify-content: center;
453
515
  padding: var(--space-2);
454
- margin-left: auto;
455
516
  background: transparent;
456
517
  border: 1px solid var(--color-border-default);
457
518
  border-radius: var(--radius-md);
458
519
  color: var(--color-text-primary);
459
520
  cursor: pointer;
460
- transition: background var(--transition-fast), border-color var(--transition-fast), color var(--transition-fast);
521
+ transition:
522
+ background var(--transition-fast),
523
+ border-color var(--transition-fast),
524
+ color var(--transition-fast),
525
+ transform var(--transition-fast);
461
526
  font-size: var(--font-size-lg);
462
527
  line-height: 1;
463
528
  width: 2.5rem;
464
529
  height: 2.5rem;
530
+ transform: translateY(-50%);
465
531
  }
466
532
 
467
533
  .theme-toggle:hover {
468
534
  background: var(--color-background-secondary);
469
535
  border-color: var(--color-accent-primary);
470
536
  color: var(--color-accent-primary);
537
+ transform: translateY(-50%) scale(1.05);
471
538
  }
472
539
 
473
540
  .theme-toggle:focus {
@@ -476,13 +543,17 @@ header.top-navbar .navbar-search form {
476
543
  box-shadow: 0 0 0 3px var(--color-accent-subtle);
477
544
  }
478
545
 
546
+ .theme-toggle:active {
547
+ transform: translateY(-50%) scale(0.95);
548
+ }
549
+
479
550
  .theme-toggle-icon {
480
551
  display: inline-block;
481
- transition: transform var(--transition-base);
552
+ transition: transform var(--duration-base) var(--ease-out-smooth);
482
553
  }
483
554
 
484
555
  .theme-toggle:hover .theme-toggle-icon {
485
- transform: rotate(20deg);
556
+ transform: rotate(15deg) scale(1.1);
486
557
  }
487
558
 
488
559
  /* Mobile navbar */
@@ -494,11 +565,15 @@ header.top-navbar .navbar-search form {
494
565
  gap: var(--space-4);
495
566
  }
496
567
 
497
- /* Hide desktop search bar on mobile */
498
- header.top-navbar .navbar-search-desktop {
568
+ header.top-navbar .search-surface {
499
569
  display: none;
500
570
  }
501
571
 
572
+ header.top-navbar .navbar-search {
573
+ width: auto;
574
+ padding: 0;
575
+ }
576
+
502
577
  /* Show mobile search icon */
503
578
  .navbar-search-mobile {
504
579
  display: flex;
@@ -526,10 +601,24 @@ header.top-navbar .navbar-search form {
526
601
  text-overflow: ellipsis;
527
602
  white-space: nowrap;
528
603
  }
604
+
605
+ .theme-toggle {
606
+ position: static;
607
+ transform: none;
608
+ margin-right: 0;
609
+ }
610
+
611
+ .theme-toggle:hover {
612
+ transform: scale(1.05);
613
+ }
614
+
615
+ .theme-toggle:active {
616
+ transform: scale(0.95);
617
+ }
529
618
  }
530
619
 
531
620
  /* 7. Navigation (Left Sidebar) */
532
- nav {
621
+ #sidebar-navigation {
533
622
  grid-area: nav;
534
623
  font-family: var(--font-heading);
535
624
  font-size: var(--font-size-base);
@@ -537,16 +626,38 @@ nav {
537
626
  background: var(--color-nav-bg);
538
627
  color: var(--color-nav-text);
539
628
  overflow: hidden auto;
629
+ overscroll-behavior: contain;
540
630
  display: flex;
541
631
  flex-direction: column;
542
632
  position: sticky;
543
633
  top: var(--layout-header-height);
544
634
  height: calc(100vh - var(--layout-header-height));
635
+ scrollbar-width: thin;
636
+ scrollbar-color: var(--color-border-default) transparent;
637
+ }
638
+
639
+ /* Custom scrollbar for WebKit browsers */
640
+ #sidebar-navigation::-webkit-scrollbar {
641
+ width: 6px;
642
+ }
643
+
644
+ #sidebar-navigation::-webkit-scrollbar-track {
645
+ background: transparent;
646
+ }
647
+
648
+ #sidebar-navigation::-webkit-scrollbar-thumb {
649
+ background: var(--color-border-default);
650
+ border-radius: var(--radius-sm);
651
+ transition: background var(--transition-fast);
652
+ }
653
+
654
+ #sidebar-navigation::-webkit-scrollbar-thumb:hover {
655
+ background: var(--color-border-emphasis);
545
656
  }
546
657
 
547
658
  /* Mobile navigation */
548
659
  @media (width <= 1023px) {
549
- nav {
660
+ #sidebar-navigation {
550
661
  position: fixed;
551
662
  top: var(--layout-header-height);
552
663
  bottom: 0;
@@ -558,7 +669,7 @@ nav {
558
669
  /* Don't set height - let top/bottom define it */
559
670
  }
560
671
 
561
- nav[hidden] {
672
+ #sidebar-navigation[hidden] {
562
673
  display: none;
563
674
  }
564
675
 
@@ -575,7 +686,7 @@ nav {
575
686
  }
576
687
 
577
688
  /* Show backdrop when nav is open */
578
- body.nav-open::before {
689
+ body.sidebar-navigation-open::before {
579
690
  opacity: 1;
580
691
  pointer-events: auto;
581
692
  }
@@ -583,17 +694,18 @@ nav {
583
694
 
584
695
  /* Desktop: hide nav when [hidden] attribute is set */
585
696
  @media (width >= 1024px) {
586
- nav[hidden] {
697
+ #sidebar-navigation[hidden] {
587
698
  display: none;
588
699
  }
589
700
  }
590
701
 
591
- nav .nav-section {
702
+ #sidebar-navigation .nav-section {
592
703
  margin-top: var(--space-6);
593
704
  padding: 0 var(--space-6);
594
705
  }
595
706
 
596
- nav h2, nav h3 {
707
+ #sidebar-navigation h2,
708
+ #sidebar-navigation h3 {
597
709
  font-size: var(--font-size-lg);
598
710
  font-weight: var(--font-weight-semibold);
599
711
  margin: 0 0 var(--space-4);
@@ -602,52 +714,74 @@ nav h2, nav h3 {
602
714
  border-bottom: 1px solid var(--color-border-default);
603
715
  }
604
716
 
605
- nav ul,
606
- nav dl,
607
- nav p {
717
+ #sidebar-navigation ul,
718
+ #sidebar-navigation dl,
719
+ #sidebar-navigation p {
608
720
  padding: 0;
609
721
  list-style: none;
610
722
  margin: var(--space-3) 0;
611
723
  }
612
724
 
613
- nav ul li {
725
+ #sidebar-navigation ul li {
614
726
  margin-bottom: var(--space-2);
615
727
  line-height: var(--line-height-relaxed);
616
728
  }
617
729
 
618
- nav ul ul {
730
+ #sidebar-navigation ul li a {
731
+ transition:
732
+ color var(--transition-fast),
733
+ transform var(--transition-fast),
734
+ padding var(--transition-fast);
735
+ }
736
+
737
+ #sidebar-navigation ul li a:hover {
738
+ padding-left: var(--space-1);
739
+ }
740
+
741
+ #sidebar-navigation ul ul {
619
742
  padding-left: var(--space-5);
620
- margin-top: var(--space-2);
743
+ margin: var(--space-2) 0 0;
621
744
  }
622
745
 
623
- nav ul ul ul {
746
+ #sidebar-navigation ul ul ul {
624
747
  padding-left: var(--space-5);
625
748
  }
626
749
 
627
- nav ul ul ul ul {
750
+ #sidebar-navigation ul ul ul ul {
628
751
  padding-left: var(--space-5);
629
752
  }
630
753
 
631
- nav a {
754
+ #sidebar-navigation a {
632
755
  text-decoration: none;
633
756
  }
634
757
 
635
- nav footer {
758
+ /* Truncation for direct nav links (not links inside code tags) */
759
+ #sidebar-navigation .nav-list > li > a,
760
+ #sidebar-navigation .nav-section > ul > li > a,
761
+ #sidebar-navigation .nav-section > dl > dd > a {
762
+ display: block;
763
+ max-width: 100%;
764
+ overflow: hidden;
765
+ text-overflow: ellipsis;
766
+ white-space: nowrap;
767
+ }
768
+
769
+ #sidebar-navigation footer {
636
770
  padding: var(--space-4);
637
771
  border-top: 1px solid var(--color-border-default);
638
772
  }
639
773
 
640
- nav footer a {
774
+ #sidebar-navigation footer a {
641
775
  color: var(--color-accent-hover);
642
776
  }
643
777
 
644
- #navigation-toggle {
778
+ #sidebar-navigation-toggle {
645
779
  display: none; /* Hidden by default, shown on mobile */
646
780
  }
647
781
 
648
782
  /* Mobile toggle button */
649
783
  @media (width <= 1023px) {
650
- #navigation-toggle {
784
+ #sidebar-navigation-toggle {
651
785
  display: flex;
652
786
  align-items: center;
653
787
  justify-content: center;
@@ -667,7 +801,7 @@ nav footer a {
667
801
  -webkit-user-select: none;
668
802
  }
669
803
 
670
- #navigation-toggle:hover {
804
+ #sidebar-navigation-toggle:hover {
671
805
  color: var(--color-accent-primary);
672
806
  }
673
807
  }
@@ -678,23 +812,23 @@ nav footer a {
678
812
  * Uses block-size animation with interpolate-size for smooth height transitions.
679
813
  * Both nav-section-collapsible and nested link-list details share this pattern.
680
814
  */
681
- nav details {
815
+ #sidebar-navigation details {
682
816
  interpolate-size: allow-keywords;
683
817
  }
684
818
 
685
- nav details::details-content {
819
+ #sidebar-navigation details::details-content {
686
820
  overflow: hidden;
687
821
  block-size: 0;
688
822
  transition: block-size 200ms ease, content-visibility 200ms ease allow-discrete;
689
823
  }
690
824
 
691
- nav details[open]::details-content {
825
+ #sidebar-navigation details[open]::details-content {
692
826
  block-size: auto;
693
827
  }
694
828
 
695
829
  /* Collapsible Navigation Section Headers */
696
830
 
697
- nav .nav-section-header {
831
+ #sidebar-navigation .nav-section-header {
698
832
  display: flex;
699
833
  align-items: center;
700
834
  gap: var(--space-3);
@@ -708,15 +842,15 @@ nav .nav-section-header {
708
842
  transition: color var(--transition-fast);
709
843
  }
710
844
 
711
- nav .nav-section-header::-webkit-details-marker {
845
+ #sidebar-navigation .nav-section-header::-webkit-details-marker {
712
846
  display: none;
713
847
  }
714
848
 
715
- nav .nav-section-header:hover {
849
+ #sidebar-navigation .nav-section-header:hover {
716
850
  color: var(--color-accent-primary);
717
851
  }
718
852
 
719
- nav .nav-section-icon {
853
+ #sidebar-navigation .nav-section-icon {
720
854
  display: flex;
721
855
  align-items: center;
722
856
  justify-content: center;
@@ -726,18 +860,23 @@ nav .nav-section-icon {
726
860
  color: var(--color-accent-primary);
727
861
  }
728
862
 
729
- nav .nav-section-icon svg {
863
+ #sidebar-navigation .nav-section-icon svg {
730
864
  width: 100%;
731
865
  height: 100%;
732
866
  }
733
867
 
734
- nav .nav-section-title {
868
+ #sidebar-navigation .nav-section-title {
735
869
  font-size: var(--font-size-base);
736
870
  font-weight: var(--font-weight-semibold);
737
871
  color: inherit;
872
+ flex: 1;
873
+ min-width: 0;
874
+ overflow: hidden;
875
+ text-overflow: ellipsis;
876
+ white-space: nowrap;
738
877
  }
739
878
 
740
- nav .nav-section-chevron {
879
+ #sidebar-navigation .nav-section-chevron {
741
880
  display: flex;
742
881
  align-items: center;
743
882
  justify-content: center;
@@ -748,46 +887,50 @@ nav .nav-section-chevron {
748
887
  transition: transform var(--transition-base);
749
888
  }
750
889
 
751
- nav .nav-section-chevron svg {
890
+ #sidebar-navigation .nav-section-chevron svg {
752
891
  width: 100%;
753
892
  height: 100%;
754
893
  }
755
894
 
756
895
  /* Rotate chevron when open */
757
- nav .nav-section-collapsible[open] > .nav-section-header .nav-section-chevron {
896
+ #sidebar-navigation .nav-section-collapsible[open] > .nav-section-header .nav-section-chevron {
758
897
  transform: rotate(90deg);
759
898
  }
760
899
 
761
- nav .nav-section-collapsible > ul,
762
- nav .nav-section-collapsible > dl,
763
- nav .nav-section-collapsible > p {
900
+ #sidebar-navigation .nav-section-collapsible > ul,
901
+ #sidebar-navigation .nav-section-collapsible > dl,
902
+ #sidebar-navigation .nav-section-collapsible > p {
764
903
  margin-top: 0;
765
904
  }
766
905
 
767
- nav .nav-section-collapsible > .nav-list {
906
+ #sidebar-navigation .nav-section-collapsible > .nav-list {
768
907
  padding-left: var(--space-5);
769
908
  border-left: 1px solid var(--color-border-subtle);
770
909
  margin-left: 9px; /* Align with the section icon center */
771
910
  }
772
911
 
773
- nav .nav-section-collapsible .nav-list .link-list {
912
+ #sidebar-navigation .nav-section-collapsible .nav-list .link-list {
774
913
  border-left: none;
775
914
  margin-left: 0;
776
915
  padding-left: var(--space-5);
777
916
  }
778
917
 
918
+ #sidebar-navigation .nav-section-collapsible .nav-list .link-list > li:last-child {
919
+ margin-bottom: 0;
920
+ }
921
+
779
922
  /*
780
923
  Improve chevron styling for details under link-list, using SVG chevron that matches nav-section-chevron
781
924
  We need to avoid adding the element in class content generation so it doesn't break darkfish styles
782
925
  */
783
- nav li details:has(.link-list) > summary {
926
+ #sidebar-navigation li details:has(.link-list) > summary {
784
927
  display: inline-flex;
785
928
  align-items: center;
786
929
  gap: var(--space-2);
787
930
  cursor: pointer;
788
931
  }
789
932
 
790
- nav li details:has(.link-list) > summary::after {
933
+ #sidebar-navigation li details:has(.link-list) > summary::after {
791
934
  content: '';
792
935
  position: static;
793
936
  display: inline-block;
@@ -807,11 +950,11 @@ nav li details:has(.link-list) > summary::after {
807
950
  transition: transform var(--transition-base), background-color var(--transition-fast);
808
951
  }
809
952
 
810
- nav li details:has(.link-list) > summary:hover::after {
953
+ #sidebar-navigation li details:has(.link-list) > summary:hover::after {
811
954
  background-color: var(--color-accent-primary);
812
955
  }
813
956
 
814
- nav li details:has(.link-list)[open] > summary::after {
957
+ #sidebar-navigation li details:has(.link-list)[open] > summary::after {
815
958
  transform: rotate(90deg);
816
959
  background-color: var(--color-accent-primary);
817
960
  }
@@ -820,6 +963,7 @@ nav li details:has(.link-list)[open] > summary::after {
820
963
  main {
821
964
  grid-area: main;
822
965
  width: 100%;
966
+ min-width: 0;
823
967
  max-width: var(--layout-content-max-width);
824
968
  margin: 0 auto;
825
969
  padding: var(--space-12) var(--space-8);
@@ -831,7 +975,7 @@ main {
831
975
 
832
976
  /* Desktop: hide hamburger */
833
977
  @media (width >= 1024px) {
834
- #navigation-toggle {
978
+ #sidebar-navigation-toggle {
835
979
  display: none;
836
980
  }
837
981
  }
@@ -854,11 +998,36 @@ main {
854
998
  }
855
999
  }
856
1000
 
857
- main h1[class] {
1001
+ main h1.page-title {
1002
+ display: grid;
1003
+ gap: var(--space-2);
1004
+ justify-items: start;
858
1005
  margin-top: 0;
859
- margin-bottom: 1em;
860
- font-size: 2.5em;
1006
+ margin-bottom: var(--space-8);
1007
+ color: var(--color-accent-primary);
1008
+ }
1009
+
1010
+ main h1.page-title .page-title-kind {
1011
+ display: inline-flex;
1012
+ align-items: center;
1013
+ min-height: 1.625rem;
1014
+ padding: 0 var(--space-2);
1015
+ border: 1px solid var(--color-title-kind-border);
1016
+ border-radius: var(--radius-md);
1017
+ background: var(--color-accent-subtle);
861
1018
  color: var(--color-accent-primary);
1019
+ font-size: var(--font-size-sm);
1020
+ font-weight: var(--font-weight-semibold);
1021
+ line-height: 1;
1022
+ }
1023
+
1024
+ main h1.page-title .page-title-name {
1025
+ max-width: 100%;
1026
+ color: var(--color-accent-primary);
1027
+ font-size: var(--font-size-3xl);
1028
+ font-weight: var(--font-weight-bold);
1029
+ line-height: var(--line-height-tight);
1030
+ overflow-wrap: anywhere;
862
1031
  }
863
1032
 
864
1033
  main h1,
@@ -936,7 +1105,6 @@ main h6 a:hover {
936
1105
  .ruby-ivar { color: var(--code-orange); }
937
1106
  .ruby-operator { color: var(--code-green); }
938
1107
  .ruby-identifier { color: var(--code-blue); }
939
- .ruby-node { color: var(--code-purple); }
940
1108
 
941
1109
  .ruby-comment {
942
1110
  color: var(--color-neutral-500);
@@ -952,7 +1120,6 @@ main h6 a:hover {
952
1120
  [data-theme="dark"] .ruby-ivar { color: var(--code-orange); }
953
1121
  [data-theme="dark"] .ruby-operator { color: var(--code-green); }
954
1122
  [data-theme="dark"] .ruby-identifier { color: var(--code-blue); }
955
- [data-theme="dark"] .ruby-node { color: var(--code-purple); }
956
1123
 
957
1124
  [data-theme="dark"] .ruby-comment {
958
1125
  color: var(--color-neutral-400);
@@ -963,21 +1130,47 @@ main h6 a:hover {
963
1130
  [data-theme="dark"] .ruby-string { color: var(--code-green); }
964
1131
 
965
1132
  /* 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); }
1133
+ .c-keyword { color: var(--code-red); }
1134
+ .c-type { color: var(--code-cyan); }
1135
+ .c-macro { color: var(--code-orange); }
1136
+ .c-function { color: var(--code-purple); }
1137
+ .c-identifier { color: var(--color-text-secondary); }
1138
+ .c-operator { color: var(--code-green); }
1139
+ .c-preprocessor { color: var(--code-purple); }
1140
+ .c-value { color: var(--code-orange); }
1141
+ .c-string { color: var(--code-green); }
975
1142
 
976
1143
  .c-comment {
977
- color: var(--c-comment);
1144
+ color: var(--code-gray);
1145
+ font-style: italic;
1146
+ }
1147
+
1148
+ /* Shell Syntax Highlighting */
1149
+ .sh-prompt { color: var(--code-gray); }
1150
+ .sh-command { color: var(--code-blue); }
1151
+ .sh-option { color: var(--code-cyan); }
1152
+ .sh-string { color: var(--code-green); }
1153
+ .sh-envvar { color: var(--code-purple); }
1154
+
1155
+ .sh-comment {
1156
+ color: var(--code-gray);
978
1157
  font-style: italic;
979
1158
  }
980
1159
 
1160
+ /* RBS Type Signature Links — linked types get subtle underline */
1161
+ a.rbs-type {
1162
+ color: inherit;
1163
+ text-decoration: underline;
1164
+ text-decoration-color: var(--color-border-default);
1165
+ text-underline-offset: 0.2em;
1166
+ transition: text-decoration-color var(--transition-fast), color var(--transition-fast);
1167
+ }
1168
+
1169
+ a.rbs-type:hover {
1170
+ color: var(--color-link-hover);
1171
+ text-decoration-color: var(--color-link-hover);
1172
+ }
1173
+
981
1174
  /* Emphasis */
982
1175
  em {
983
1176
  text-decoration-color: var(--color-emphasis-decoration);
@@ -998,6 +1191,22 @@ main p {
998
1191
  margin-bottom: var(--space-4);
999
1192
  }
1000
1193
 
1194
+ main .rdoc-logo {
1195
+ margin: var(--space-6) 0 var(--space-8);
1196
+ text-align: center;
1197
+ }
1198
+
1199
+ main .rdoc-logo img {
1200
+ display: inline-block;
1201
+ width: clamp(120px, 14vw, 168px);
1202
+ height: auto;
1203
+ filter: drop-shadow(0 8px 18px rgb(230 41 35 / 8%));
1204
+ }
1205
+
1206
+ [data-theme="dark"] main .rdoc-logo img {
1207
+ filter: saturate(0.58) brightness(1.4) drop-shadow(0 8px 22px rgb(235 84 79 / 16%));
1208
+ }
1209
+
1001
1210
  /* Preformatted Text */
1002
1211
  main pre {
1003
1212
  margin: 1.2em 0.5em;
@@ -1061,17 +1270,19 @@ main dd p:first-child {
1061
1270
 
1062
1271
  /* Headers within Main */
1063
1272
  main header h2 {
1064
- margin-top: 2em;
1273
+ margin: var(--space-8) 0 var(--space-4);
1274
+ padding-top: var(--space-3);
1065
1275
  border-width: 0;
1066
- border-top: 4px solid var(--color-border-default);
1067
- font-size: 130%;
1276
+ border-top: 1px solid var(--color-border-default);
1277
+ font-size: var(--font-size-2xl);
1068
1278
  }
1069
1279
 
1070
1280
  main header h3 {
1071
- margin: 2em 0 1.5em;
1281
+ margin: var(--space-8) 0 var(--space-6);
1282
+ padding-top: var(--space-3);
1072
1283
  border-width: 0;
1073
- border-top: 3px solid var(--color-border-default);
1074
- font-size: 120%;
1284
+ border-top: 1px solid var(--color-border-default);
1285
+ font-size: var(--font-size-xl);
1075
1286
  }
1076
1287
 
1077
1288
  h1:target,
@@ -1089,6 +1300,26 @@ main .anchor-link:target {
1089
1300
  scroll-margin-top: calc(var(--layout-header-height) + 2rem);
1090
1301
  }
1091
1302
 
1303
+ /* Legacy anchor for backward compatibility with old label- prefix links */
1304
+ .legacy-anchor {
1305
+ display: block;
1306
+ position: relative;
1307
+ visibility: hidden;
1308
+ scroll-margin-top: calc(var(--layout-header-height) + 2rem);
1309
+ }
1310
+
1311
+ /* When a legacy anchor is targeted, highlight the next heading sibling */
1312
+ .legacy-anchor:target + h1,
1313
+ .legacy-anchor:target + h2,
1314
+ .legacy-anchor:target + h3,
1315
+ .legacy-anchor:target + h4,
1316
+ .legacy-anchor:target + h5,
1317
+ .legacy-anchor:target + h6 {
1318
+ margin-left: calc(-1 * var(--space-5));
1319
+ padding-left: calc(var(--space-5) / 2);
1320
+ border-left: calc(var(--space-5) / 2) solid var(--color-border-default);
1321
+ }
1322
+
1092
1323
 
1093
1324
  /* Utility Classes */
1094
1325
  .hide { display: none !important; }
@@ -1113,19 +1344,53 @@ main .anchor-link:target {
1113
1344
  main .method-source-code {
1114
1345
  visibility: hidden;
1115
1346
  max-height: 0;
1116
- overflow: auto;
1117
- transition: max-height var(--transition-base), visibility var(--transition-base);
1347
+ overflow: hidden;
1348
+ opacity: 0;
1349
+ transform: translateY(-8px);
1350
+ transition:
1351
+ max-height var(--duration-medium) var(--ease-out-smooth),
1352
+ visibility var(--duration-medium),
1353
+ opacity var(--duration-fast) ease-out,
1354
+ transform var(--duration-fast) ease-out;
1118
1355
  }
1119
1356
 
1120
1357
  main .method-source-code pre {
1121
- border-color: var(--color-accent-hover);
1358
+ border-color: var(--color-code-border);
1122
1359
  width: 100%;
1123
1360
  box-sizing: border-box;
1361
+ transition: border-color var(--transition-fast);
1362
+ scrollbar-width: thin;
1363
+ scrollbar-color: var(--color-border-default) transparent;
1364
+ }
1365
+
1366
+ main .method-source-code pre::-webkit-scrollbar {
1367
+ width: 6px;
1368
+ height: 6px;
1369
+ }
1370
+
1371
+ main .method-source-code pre::-webkit-scrollbar-track {
1372
+ background: transparent;
1373
+ }
1374
+
1375
+ main .method-source-code pre::-webkit-scrollbar-thumb {
1376
+ background: var(--color-border-default);
1377
+ border-radius: var(--radius-sm);
1378
+ }
1379
+
1380
+ main .method-source-code pre::-webkit-scrollbar-thumb:hover {
1381
+ background: var(--color-border-emphasis);
1382
+ }
1383
+
1384
+ main .method-source-code pre::-webkit-scrollbar-corner {
1385
+ background: transparent;
1124
1386
  }
1125
1387
 
1126
1388
  main .method-source-code.active-menu {
1127
1389
  visibility: visible;
1128
1390
  max-height: 100vh;
1391
+ overflow: auto;
1392
+ opacity: 1;
1393
+ transform: translateY(0);
1129
1394
  }
1130
1395
 
1131
1396
  main .method-description .method-calls-super {
@@ -1134,6 +1399,7 @@ main .method-description .method-calls-super {
1134
1399
  }
1135
1400
 
1136
1401
  main .method-detail {
1402
+ position: relative;
1137
1403
  margin-bottom: 2.5em;
1138
1404
  }
1139
1405
 
@@ -1144,41 +1410,165 @@ main .method-detail:target {
1144
1410
  }
1145
1411
 
1146
1412
  main .method-header {
1147
- display: inline-block;
1148
- max-width: calc(100% - 6em); /* 6em is the width of the source code toggle */
1413
+ display: grid;
1414
+ grid-template-columns: minmax(0, 1fr) auto;
1415
+ gap: var(--space-4);
1416
+ align-items: center;
1417
+ background: var(--color-sig-bg);
1418
+ border: 1px solid var(--color-sig-border);
1419
+ border-radius: var(--radius-md);
1420
+ padding: var(--space-4);
1421
+ }
1422
+
1423
+ main .method-heading-group {
1424
+ min-width: 0;
1149
1425
  }
1150
1426
 
1151
1427
  main .method-heading {
1152
- position: relative;
1428
+ display: flex;
1429
+ flex-direction: column;
1430
+ align-items: flex-start;
1153
1431
  font-family: var(--font-code);
1154
1432
  font-size: var(--font-size-lg);
1155
1433
  font-weight: var(--font-weight-semibold);
1156
- margin-bottom: var(--space-3);
1434
+ line-height: var(--line-height-normal);
1435
+ }
1436
+
1437
+ main .method-heading a {
1438
+ color: inherit;
1439
+ text-decoration: none;
1440
+ }
1441
+
1442
+ main .method-heading a:hover {
1443
+ color: var(--color-accent-primary);
1444
+ }
1445
+
1446
+ main .method-heading .method-callseq {
1447
+ display: block;
1157
1448
  }
1158
1449
 
1159
1450
  main .method-heading .method-name {
1160
1451
  font-weight: var(--font-weight-semibold);
1452
+ overflow-wrap: anywhere;
1161
1453
  }
1162
1454
 
1163
1455
  main .method-heading .method-args {
1164
1456
  font-weight: var(--font-weight-normal);
1165
1457
  }
1166
1458
 
1459
+ /* Type signatures — overloads stack as a code block under the method name */
1460
+ pre.method-type-signature {
1461
+ position: relative;
1462
+ margin: var(--space-2) 0 0;
1463
+ padding: var(--space-2) 0 0;
1464
+ background: transparent;
1465
+ border: none;
1466
+ border-radius: 0;
1467
+ overflow: visible;
1468
+ font-family: var(--font-code);
1469
+ font-size: var(--font-size-sm);
1470
+ color: var(--color-text-tertiary);
1471
+ line-height: var(--line-height-tight);
1472
+ white-space: pre-wrap;
1473
+ overflow-wrap: break-word;
1474
+ }
1475
+
1476
+ pre.method-type-signature::before {
1477
+ content: '';
1478
+ position: absolute;
1479
+ top: 0;
1480
+ left: 0;
1481
+ right: 0;
1482
+ border-top: 1px dotted var(--color-border-default);
1483
+ }
1484
+
1485
+ pre.method-type-signature code {
1486
+ font-family: inherit;
1487
+ font-size: inherit;
1488
+ color: inherit;
1489
+ background: transparent;
1490
+ padding: 0;
1491
+ }
1492
+
1493
+ /* Attribute type sigs render inline after the [RW] badge */
1494
+ main .method-heading > .method-type-signature {
1495
+ display: inline;
1496
+ margin-left: var(--space-2);
1497
+ font-family: var(--font-code);
1498
+ font-size: var(--font-size-sm);
1499
+ color: var(--color-text-secondary);
1500
+ }
1501
+
1167
1502
  main .method-controls {
1503
+ position: static;
1504
+ align-self: center;
1505
+ }
1506
+
1507
+ main .method-controls summary {
1508
+ display: inline-flex;
1509
+ align-items: center;
1510
+ justify-content: center;
1511
+ gap: var(--space-2);
1512
+ min-height: 30px;
1168
1513
  line-height: 20px;
1169
- float: right;
1170
- color: var(--color-accent-hover);
1514
+ color: var(--color-accent-primary);
1171
1515
  cursor: pointer;
1516
+ padding: var(--space-1) var(--space-3);
1517
+ border-radius: var(--radius-sm);
1518
+ font-size: var(--font-size-sm);
1519
+ font-weight: var(--font-weight-medium);
1520
+ background: var(--color-accent-subtle);
1521
+ border: 1px solid transparent;
1522
+ transition:
1523
+ color var(--transition-fast),
1524
+ background var(--transition-fast),
1525
+ border-color var(--transition-fast),
1526
+ transform var(--transition-fast);
1527
+ user-select: none;
1528
+ -webkit-user-select: none;
1529
+ white-space: nowrap;
1530
+ list-style: none;
1172
1531
  }
1173
1532
 
1174
- main .method-description,
1175
- main .aliases {
1176
- margin-top: 0.75em;
1533
+ main .method-controls summary::-webkit-details-marker {
1534
+ display: none;
1535
+ }
1536
+
1537
+ main .method-controls summary:hover {
1538
+ background: var(--color-primary-100);
1539
+ border-color: var(--color-primary-300);
1540
+ transform: translateY(-1px);
1541
+ }
1542
+
1543
+ main .method-controls summary:active {
1544
+ transform: scale(0.96);
1545
+ }
1546
+
1547
+ main .method-source-icon {
1548
+ font-family: var(--font-code);
1549
+ font-size: var(--font-size-xs);
1550
+ line-height: 1;
1551
+ opacity: 0.8;
1552
+ }
1553
+
1554
+ [data-theme="dark"] main .method-controls summary:hover {
1555
+ background: var(--color-accent-subtle-hover);
1556
+ border-color: var(--color-primary-500);
1557
+ }
1558
+
1559
+ main .method-description {
1177
1560
  color: var(--color-text-primary);
1561
+ line-height: var(--line-height-relaxed);
1562
+ }
1563
+
1564
+ main .method-header ~ .method-description {
1565
+ margin-top: var(--space-5);
1566
+ padding-left: var(--space-2);
1178
1567
  }
1179
1568
 
1180
1569
  main .aliases {
1181
- padding-top: 4px;
1570
+ margin-top: var(--space-4);
1571
+ padding-top: var(--space-1);
1182
1572
  font-style: italic;
1183
1573
  cursor: default;
1184
1574
  }
@@ -1208,7 +1598,7 @@ main .attribute-access-type {
1208
1598
 
1209
1599
  /* Small screen adjustments */
1210
1600
  @media (width <= 480px) {
1211
- nav {
1601
+ #sidebar-navigation {
1212
1602
  width: 85%;
1213
1603
  max-width: 320px;
1214
1604
  }
@@ -1225,191 +1615,37 @@ main .attribute-access-type {
1225
1615
  white-space: nowrap;
1226
1616
  }
1227
1617
 
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 {
1618
+ main .method-heading {
1270
1619
  font-size: var(--font-size-base);
1271
- min-width: 0; /* Allow input to shrink */
1272
1620
  }
1273
1621
 
1274
- .search-modal-form {
1275
- gap: var(--space-2);
1622
+ pre.method-type-signature {
1623
+ font-size: var(--font-size-xs);
1276
1624
  }
1277
1625
 
1278
- .search-modal-close {
1279
- padding: var(--space-1) var(--space-3);
1280
- font-size: 0.75rem;
1626
+ main .method-header {
1627
+ grid-template-columns: 1fr;
1628
+ gap: var(--space-3);
1629
+ padding: var(--space-2);
1281
1630
  }
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
1631
 
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);
1632
+ main .method-controls {
1633
+ justify-self: start;
1634
+ }
1393
1635
  }
1394
1636
 
1395
- .search-modal-results .search-match a {
1396
- text-decoration: none;
1397
- }
1398
1637
 
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
1638
 
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);
1639
+ /* 9. Search */
1640
+ .search-backdrop,
1641
+ .search-icon,
1642
+ .search-close,
1643
+ .search-empty {
1644
+ display: none;
1409
1645
  }
1410
1646
 
1411
1647
  /* 10. Right Sidebar - Table of Contents */
1412
- aside.table-of-contents {
1648
+ #table-of-contents {
1413
1649
  grid-area: toc;
1414
1650
  align-self: start;
1415
1651
  position: sticky;
@@ -1420,43 +1656,45 @@ aside.table-of-contents {
1420
1656
  font-size: var(--font-size-base);
1421
1657
  }
1422
1658
 
1423
- aside.table-of-contents * {
1424
- border-right: none !important;
1425
- outline: none !important;
1426
- }
1427
-
1428
- aside.table-of-contents .toc-sticky {
1659
+ #table-of-contents .toc-sticky {
1429
1660
  display: flex;
1430
1661
  flex-direction: column;
1431
1662
 
1432
- /* Exclude header height and top/bottom padding of aside.table-of-contents */
1663
+ /* Exclude header height and top/bottom padding of #table-of-contents */
1433
1664
  height: calc(100vh - var(--layout-header-height) - var(--space-8) * 2);
1434
1665
  }
1435
1666
 
1436
- aside.table-of-contents .toc-sticky nav {
1437
- height: auto;
1667
+ #table-of-contents .toc-nav {
1668
+ flex: 1 1 auto;
1669
+ min-height: 0;
1670
+ overflow-y: auto;
1671
+ scrollbar-width: thin;
1672
+ scrollbar-color: var(--color-border-default) transparent;
1438
1673
  }
1439
1674
 
1440
- aside.table-of-contents .toc-list > .toc-h2 {
1675
+ #table-of-contents .toc-list > .toc-h2 {
1441
1676
  margin-left: var(--space-4);
1442
1677
  }
1443
1678
 
1444
- aside.table-of-contents .toc-list > .toc-h3 {
1679
+ #table-of-contents .toc-list > .toc-h3 {
1445
1680
  margin-left: var(--space-8);
1446
1681
  }
1447
1682
 
1448
1683
  /* Hide TOC on mobile/tablet */
1449
1684
  @media (width <= 1279px) {
1450
- aside.table-of-contents {
1685
+ #table-of-contents {
1451
1686
  display: none;
1452
1687
  }
1688
+ }
1453
1689
 
1690
+ /* Preserve the desktop sidebar/content grid when the TOC is hidden */
1691
+ @media (width >= 1024px) and (width <= 1279px) {
1454
1692
  body.has-toc {
1455
1693
  grid-template-columns: var(--layout-sidebar-width) 1fr;
1456
1694
  grid-template-areas:
1457
1695
  "header header"
1458
1696
  "nav main"
1459
- "footer footer";
1697
+ "nav footer";
1460
1698
  }
1461
1699
  }
1462
1700
 
@@ -1472,31 +1710,31 @@ aside.table-of-contents .toc-list > .toc-h3 {
1472
1710
  }
1473
1711
  }
1474
1712
 
1475
- .table-of-contents h3 {
1713
+ #table-of-contents h3 {
1476
1714
  font-size: var(--font-size-lg);
1477
1715
  font-weight: var(--font-weight-semibold);
1478
1716
  margin: 0 0 var(--space-5) 0;
1479
1717
  color: var(--color-text-primary);
1480
1718
  }
1481
1719
 
1482
- .table-of-contents ul {
1720
+ #table-of-contents ul {
1483
1721
  margin: 0;
1484
1722
  padding: 0;
1485
1723
  list-style: none;
1486
1724
  }
1487
1725
 
1488
- .table-of-contents ul ul {
1726
+ #table-of-contents ul ul {
1489
1727
  margin-top: var(--space-3);
1490
1728
  margin-left: var(--space-5);
1491
1729
  border-left: 1px solid var(--color-border-default);
1492
1730
  padding-left: var(--space-4);
1493
1731
  }
1494
1732
 
1495
- .table-of-contents li {
1733
+ #table-of-contents li {
1496
1734
  margin-bottom: var(--space-3);
1497
1735
  }
1498
1736
 
1499
- .table-of-contents a {
1737
+ #table-of-contents a {
1500
1738
  display: block;
1501
1739
  color: var(--color-text-secondary);
1502
1740
  text-decoration: none;
@@ -1507,32 +1745,46 @@ aside.table-of-contents .toc-list > .toc-h3 {
1507
1745
  }
1508
1746
 
1509
1747
  /* Nav hover styles sit here to keep specificity ordering with TOC links */
1510
- nav a:hover {
1748
+ #sidebar-navigation a:hover {
1511
1749
  color: var(--color-link-hover);
1512
1750
  text-decoration: underline;
1513
1751
  }
1514
1752
 
1515
- .table-of-contents a:hover {
1753
+ #table-of-contents a:hover {
1516
1754
  color: var(--color-link-hover);
1755
+ text-decoration: underline;
1756
+ }
1757
+
1758
+ #table-of-contents a:focus-visible {
1759
+ outline: 2px solid var(--color-accent-primary);
1760
+ outline-offset: 2px;
1761
+ border-radius: var(--radius-sm);
1517
1762
  }
1518
1763
 
1519
- .table-of-contents a.active {
1764
+ #table-of-contents a.active {
1520
1765
  color: var(--color-accent-primary);
1521
1766
  font-weight: var(--font-weight-medium);
1522
1767
  }
1523
1768
 
1524
1769
  ol.breadcrumb {
1525
1770
  display: flex;
1771
+ flex-wrap: wrap;
1526
1772
  padding: 0;
1527
1773
  margin: 0 0 1em;
1528
1774
  }
1529
1775
 
1530
1776
  ol.breadcrumb li {
1531
1777
  display: block;
1778
+ min-width: 0;
1532
1779
  list-style: none;
1533
1780
  font-size: 125%;
1534
1781
  }
1535
1782
 
1783
+ ol.breadcrumb a,
1784
+ ol.breadcrumb li > span:not(.separator) {
1785
+ overflow-wrap: anywhere;
1786
+ }
1787
+
1536
1788
  /* 11. Footer */
1537
1789
  footer.site-footer {
1538
1790
  grid-area: footer;
@@ -1637,60 +1889,107 @@ footer.site-footer .footer-bottom:first-child {
1637
1889
  }
1638
1890
 
1639
1891
  /* Search Results */
1640
- #search-results {
1892
+ .search-results {
1641
1893
  font-family: var(--font-primary);
1642
1894
  font-weight: 300;
1643
1895
  }
1644
1896
 
1645
- #search-results a {
1897
+ .search-results a {
1646
1898
  color: var(--color-text-primary);
1647
1899
  }
1648
1900
 
1649
- #search-results a:hover {
1901
+ .search-results a:hover {
1650
1902
  color: var(--color-accent-primary);
1651
1903
  }
1652
1904
 
1653
- #search-results .search-match {
1905
+ .search-results .search-match {
1654
1906
  font-family: var(--font-heading);
1655
1907
  font-weight: normal;
1656
1908
  }
1657
1909
 
1658
- #search-results .search-selected {
1910
+ .search-results .search-selected {
1659
1911
  background: var(--color-code-bg);
1660
1912
  border-bottom: 1px solid transparent;
1661
1913
  }
1662
1914
 
1663
- #search-results li {
1915
+ .search-results li {
1916
+ position: relative;
1664
1917
  list-style: none;
1665
1918
  border-bottom: 1px solid var(--color-border-default);
1666
1919
  margin-bottom: 0.5em;
1920
+ cursor: pointer;
1667
1921
  }
1668
1922
 
1669
- #search-results li:last-child {
1923
+ .search-results li:last-child {
1670
1924
  border-bottom: none;
1671
1925
  margin-bottom: 0;
1672
1926
  }
1673
1927
 
1674
- #search-results li p {
1928
+ .search-results li p {
1675
1929
  padding: 0;
1676
1930
  margin: 0.5em;
1677
1931
  }
1678
1932
 
1679
- #search-results .search-namespace {
1933
+ .search-results .search-match a::after {
1934
+ content: "";
1935
+ position: absolute;
1936
+ inset: 0;
1937
+ }
1938
+
1939
+ .search-results li:focus-within {
1940
+ background: var(--color-code-bg);
1941
+ }
1942
+
1943
+ .search-results .search-namespace {
1680
1944
  font-weight: bold;
1681
1945
  }
1682
1946
 
1683
- #search-results li em {
1947
+ .search-results .search-type {
1948
+ display: inline-block;
1949
+ margin-left: var(--space-2);
1950
+ padding: 0 var(--space-2);
1951
+ font-size: var(--font-size-xs);
1952
+ font-weight: 500;
1953
+ border-radius: var(--radius-sm);
1954
+ vertical-align: middle;
1955
+ background: var(--color-background-tertiary);
1956
+ color: var(--color-text-secondary);
1957
+ }
1958
+
1959
+ .search-results .search-type-class {
1960
+ background: var(--color-search-type-class-bg);
1961
+ color: var(--color-search-type-class-text);
1962
+ }
1963
+
1964
+ .search-results .search-type-module {
1965
+ background: var(--color-search-type-module-bg);
1966
+ color: var(--color-search-type-module-text);
1967
+ }
1968
+
1969
+ .search-results .search-type-constant {
1970
+ background: var(--color-search-type-constant-bg);
1971
+ color: var(--color-search-type-constant-text);
1972
+ }
1973
+
1974
+ .search-results .search-type-instance-method,
1975
+ .search-results .search-type-class-method {
1976
+ background: var(--color-search-type-method-bg);
1977
+ color: var(--color-search-type-method-text);
1978
+ }
1979
+
1980
+ .search-results li em {
1684
1981
  background-color: var(--color-search-highlight-bg);
1685
1982
  font-style: normal;
1686
1983
  }
1687
1984
 
1688
- #search-results pre {
1985
+ .search-results pre {
1689
1986
  margin: 0.5em;
1690
1987
  font-family: var(--font-code);
1691
1988
  }
1692
1989
 
1693
1990
  header.top-navbar #search-field {
1991
+ display: block;
1992
+ box-sizing: border-box;
1694
1993
  width: 100%;
1695
1994
  padding: var(--space-2) var(--space-4);
1696
1995
  border: 1px solid var(--color-border-default);
@@ -1713,10 +2012,11 @@ header.top-navbar #search-field::placeholder {
1713
2012
 
1714
2013
  /* Search results dropdown in navbar */
1715
2014
  header.top-navbar #search-results {
2015
+ box-sizing: border-box;
1716
2016
  position: absolute;
1717
2017
  top: calc(100% + var(--space-2));
1718
2018
  left: 0;
1719
- width: var(--layout-search-width);
2019
+ width: 100%;
1720
2020
  max-height: 60vh;
1721
2021
  background: var(--color-background-primary);
1722
2022
  border: 1px solid var(--color-border-default);
@@ -1735,3 +2035,176 @@ header.top-navbar #search-results.initially-hidden {
1735
2035
  header.top-navbar #search-results[aria-expanded="false"] {
1736
2036
  display: none;
1737
2037
  }
2038
+
2039
+ @media (width <= 1023px) {
2040
+ body:has(header.top-navbar .navbar-search.is-open) {
2041
+ overflow: hidden;
2042
+ }
2043
+
2044
+ body:has(header.top-navbar .navbar-search.is-open) header.top-navbar {
2045
+ z-index: var(--z-modal);
2046
+ }
2047
+
2048
+ header.top-navbar .navbar-search.is-open .search-backdrop {
2049
+ position: fixed;
2050
+ inset: 0;
2051
+ z-index: 1;
2052
+ display: block;
2053
+ background: var(--color-overlay);
2054
+ }
2055
+
2056
+ header.top-navbar .navbar-search.is-open .search-surface {
2057
+ position: fixed;
2058
+ top: var(--space-16);
2059
+ left: 50%;
2060
+ z-index: 2;
2061
+ display: flex;
2062
+ flex-direction: column;
2063
+ width: calc(100% - var(--space-8));
2064
+ max-width: 600px;
2065
+ max-height: 80vh;
2066
+ margin: 0;
2067
+ overflow: hidden;
2068
+ background: var(--color-background-primary);
2069
+ border-radius: var(--radius-lg);
2070
+ box-shadow: var(--shadow-xl);
2071
+ transform: translateX(-50%);
2072
+ }
2073
+
2074
+ header.top-navbar .navbar-search.is-open .search-form {
2075
+ display: flex;
2076
+ align-items: center;
2077
+ gap: var(--space-3);
2078
+ padding: var(--space-6);
2079
+ border-bottom: 1px solid var(--color-border-default);
2080
+ }
2081
+
2082
+ header.top-navbar .navbar-search.is-open .search-icon {
2083
+ display: inline;
2084
+ flex-shrink: 0;
2085
+ color: var(--color-text-secondary);
2086
+ font-size: 1.5rem;
2087
+ }
2088
+
2089
+ header.top-navbar .navbar-search.is-open #search-field {
2090
+ flex: 1;
2091
+ min-width: 0;
2092
+ padding: 0;
2093
+ border: none;
2094
+ outline: none;
2095
+ background: transparent;
2096
+ box-shadow: none;
2097
+ font-size: var(--font-size-lg);
2098
+ }
2099
+
2100
+ header.top-navbar .navbar-search.is-open .search-close {
2101
+ display: block;
2102
+ flex-shrink: 0;
2103
+ padding: var(--space-2) var(--space-4);
2104
+ border: 1px solid var(--color-border-default);
2105
+ border-radius: var(--radius-md);
2106
+ background: var(--color-background-secondary);
2107
+ color: var(--color-text-secondary);
2108
+ cursor: pointer;
2109
+ font-size: var(--font-size-sm);
2110
+ transition: background var(--transition-fast), border-color var(--transition-fast);
2111
+ }
2112
+
2113
+ header.top-navbar .navbar-search.is-open .search-close:hover {
2114
+ border-color: var(--color-border-default);
2115
+ background: var(--color-background-tertiary);
2116
+ }
2117
+
2118
+ header.top-navbar .navbar-search.is-open .search-body {
2119
+ display: flex;
2120
+ flex: 1;
2121
+ flex-direction: column;
2122
+ min-height: 0;
2123
+ overflow: hidden;
2124
+ }
2125
+
2126
+ header.top-navbar .navbar-search.is-open .search-empty {
2127
+ display: block;
2128
+ margin: var(--space-6);
2129
+ padding: var(--space-12) 0;
2130
+ color: var(--color-text-tertiary);
2131
+ text-align: center;
2132
+ }
2133
+
2134
+ header.top-navbar .navbar-search.is-open #search-results {
2135
+ flex: 1;
2136
+ min-height: 0;
2137
+ position: relative;
2138
+ max-height: none;
2139
+ margin: 0;
2140
+ padding: var(--space-6);
2141
+ overflow-y: auto;
2142
+ border: none;
2143
+ border-radius: 0;
2144
+ box-shadow: none;
2145
+ }
2146
+
2147
+ header.top-navbar .navbar-search.is-open #search-results.initially-hidden {
2148
+ display: block;
2149
+ }
2150
+
2151
+ header.top-navbar .navbar-search.is-open #search-results[aria-expanded="false"] {
2152
+ display: none;
2153
+ }
2154
+
2155
+ header.top-navbar .navbar-search.is-open .search-results li {
2156
+ margin-bottom: var(--space-2);
2157
+ padding: var(--space-3) var(--space-4);
2158
+ border-radius: var(--radius-md);
2159
+ transition: background var(--transition-fast);
2160
+ }
2161
+
2162
+ header.top-navbar .navbar-search.is-open .search-results li:hover {
2163
+ background: var(--color-background-secondary);
2164
+ }
2165
+
2166
+ header.top-navbar .navbar-search.is-open .search-match {
2167
+ margin: 0;
2168
+ font-size: var(--font-size-base);
2169
+ }
2170
+
2171
+ header.top-navbar .navbar-search.is-open .search-match a {
2172
+ text-decoration: none;
2173
+ }
2174
+
2175
+ header.top-navbar .navbar-search.is-open .search-snippet {
2176
+ margin: var(--space-1) 0 0 0;
2177
+ color: var(--color-text-tertiary);
2178
+ font-size: var(--font-size-sm);
2179
+ }
2180
+ }
2181
+
2182
+ @media (width <= 420px) {
2183
+ header.top-navbar .navbar-search.is-open .search-surface {
2184
+ top: var(--space-4);
2185
+ width: calc(100% - var(--space-6));
2186
+ border-radius: var(--radius-md);
2187
+ }
2188
+
2189
+ header.top-navbar .navbar-search.is-open .search-form,
2190
+ header.top-navbar .navbar-search.is-open #search-results {
2191
+ padding: var(--space-3);
2192
+ }
2193
+
2194
+ header.top-navbar .navbar-search.is-open .search-empty {
2195
+ margin: var(--space-3);
2196
+ }
2197
+
2198
+ header.top-navbar .navbar-search.is-open .search-form {
2199
+ gap: var(--space-2);
2200
+ }
2201
+
2202
+ header.top-navbar .navbar-search.is-open #search-field {
2203
+ font-size: var(--font-size-base);
2204
+ }
2205
+
2206
+ header.top-navbar .navbar-search.is-open .search-close {
2207
+ padding: var(--space-1) var(--space-3);
2208
+ font-size: 0.75rem;
2209
+ }
2210
+ }