rdoc 7.2.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 (150) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +4 -7
  3. data/LICENSE.rdoc +4 -0
  4. data/README.md +43 -2
  5. data/RI.md +75 -75
  6. data/doc/markup_reference/markdown.md +104 -3
  7. data/exe/rdoc +2 -2
  8. data/lib/rdoc/code_object/alias.rb +70 -74
  9. data/lib/rdoc/code_object/any_method.rb +305 -298
  10. data/lib/rdoc/code_object/attr.rb +150 -143
  11. data/lib/rdoc/code_object/class_module.rb +801 -765
  12. data/lib/rdoc/code_object/constant.rb +178 -150
  13. data/lib/rdoc/code_object/context/section.rb +133 -160
  14. data/lib/rdoc/code_object/context.rb +925 -952
  15. data/lib/rdoc/code_object/extend.rb +7 -5
  16. data/lib/rdoc/code_object/include.rb +7 -5
  17. data/lib/rdoc/code_object/method_attr.rb +325 -324
  18. data/lib/rdoc/code_object/mixin.rb +97 -95
  19. data/lib/rdoc/code_object/normal_class.rb +77 -78
  20. data/lib/rdoc/code_object/normal_module.rb +61 -59
  21. data/lib/rdoc/code_object/require.rb +23 -39
  22. data/lib/rdoc/code_object/single_class.rb +21 -19
  23. data/lib/rdoc/code_object/top_level.rb +212 -213
  24. data/lib/rdoc/code_object.rb +305 -305
  25. data/lib/rdoc/comment.rb +274 -337
  26. data/lib/rdoc/cross_reference.rb +194 -212
  27. data/lib/rdoc/encoding.rb +105 -103
  28. data/lib/rdoc/erb_partial.rb +13 -11
  29. data/lib/rdoc/erbio.rb +29 -27
  30. data/lib/rdoc/generator/aliki.rb +165 -140
  31. data/lib/rdoc/generator/darkfish.rb +647 -631
  32. data/lib/rdoc/generator/json_index.rb +233 -229
  33. data/lib/rdoc/generator/markup.rb +165 -122
  34. data/lib/rdoc/generator/pot/message_extractor.rb +57 -51
  35. data/lib/rdoc/generator/pot/po.rb +52 -51
  36. data/lib/rdoc/generator/pot/po_entry.rb +138 -132
  37. data/lib/rdoc/generator/pot.rb +85 -81
  38. data/lib/rdoc/generator/ri.rb +23 -19
  39. data/lib/rdoc/generator/template/aliki/DESIGN.md +538 -0
  40. data/lib/rdoc/generator/template/aliki/_aside_toc.rhtml +1 -1
  41. data/lib/rdoc/generator/template/aliki/_footer.rhtml +1 -1
  42. data/lib/rdoc/generator/template/aliki/_head.rhtml +11 -11
  43. data/lib/rdoc/generator/template/aliki/_header.rhtml +29 -44
  44. data/lib/rdoc/generator/template/aliki/_sidebar_extends.rhtml +8 -6
  45. data/lib/rdoc/generator/template/aliki/_sidebar_includes.rhtml +8 -6
  46. data/lib/rdoc/generator/template/aliki/_sidebar_installed.rhtml +1 -1
  47. data/lib/rdoc/generator/template/aliki/_sidebar_pages.rhtml +2 -2
  48. data/lib/rdoc/generator/template/aliki/_sidebar_search.rhtml +4 -4
  49. data/lib/rdoc/generator/template/aliki/_sidebar_sections.rhtml +1 -1
  50. data/lib/rdoc/generator/template/aliki/_sidebar_toggle.rhtml +1 -1
  51. data/lib/rdoc/generator/template/aliki/class.rhtml +56 -46
  52. data/lib/rdoc/generator/template/aliki/css/rdoc.css +538 -283
  53. data/lib/rdoc/generator/template/aliki/index.rhtml +1 -1
  54. data/lib/rdoc/generator/template/aliki/js/aliki.js +80 -102
  55. data/lib/rdoc/generator/template/aliki/page.rhtml +1 -1
  56. data/lib/rdoc/generator/template/aliki/servlet_not_found.rhtml +1 -1
  57. data/lib/rdoc/generator/template/aliki/servlet_root.rhtml +2 -2
  58. data/lib/rdoc/generator/template/darkfish/_footer.rhtml +1 -1
  59. data/lib/rdoc/generator/template/darkfish/_sidebar_extends.rhtml +8 -6
  60. data/lib/rdoc/generator/template/darkfish/_sidebar_includes.rhtml +8 -6
  61. data/lib/rdoc/generator/template/darkfish/_sidebar_installed.rhtml +1 -1
  62. data/lib/rdoc/generator/template/darkfish/_sidebar_pages.rhtml +1 -1
  63. data/lib/rdoc/generator/template/darkfish/_sidebar_sections.rhtml +1 -1
  64. data/lib/rdoc/generator/template/darkfish/_sidebar_table_of_contents.rhtml +5 -5
  65. data/lib/rdoc/generator/template/darkfish/class.rhtml +18 -21
  66. data/lib/rdoc/generator/template/darkfish/css/rdoc.css +0 -1
  67. data/lib/rdoc/generator/template/darkfish/table_of_contents.rhtml +3 -3
  68. data/lib/rdoc/generator.rb +48 -46
  69. data/lib/rdoc/i18n/locale.rb +99 -95
  70. data/lib/rdoc/i18n/text.rb +109 -105
  71. data/lib/rdoc/i18n.rb +7 -5
  72. data/lib/rdoc/markdown/byte_runtime.rb +80 -0
  73. data/lib/rdoc/markdown.kpeg +30 -21
  74. data/lib/rdoc/markdown.rb +329 -151
  75. data/lib/rdoc/markup/block_quote.rb +12 -8
  76. data/lib/rdoc/markup/document.rb +127 -123
  77. data/lib/rdoc/markup/formatter.rb +215 -221
  78. data/lib/rdoc/markup/heading.rb +1 -4
  79. data/lib/rdoc/markup/include.rb +33 -29
  80. data/lib/rdoc/markup/indented_paragraph.rb +37 -33
  81. data/lib/rdoc/markup/inline_parser.rb +281 -277
  82. data/lib/rdoc/markup/list.rb +80 -88
  83. data/lib/rdoc/markup/list_item.rb +73 -85
  84. data/lib/rdoc/markup/paragraph.rb +23 -19
  85. data/lib/rdoc/markup/parser.rb +501 -497
  86. data/lib/rdoc/markup/pre_process.rb +284 -305
  87. data/lib/rdoc/markup/raw.rb +2 -2
  88. data/lib/rdoc/markup/rule.rb +16 -12
  89. data/lib/rdoc/markup/to_ansi.rb +143 -139
  90. data/lib/rdoc/markup/to_bs.rb +72 -68
  91. data/lib/rdoc/markup/to_html.rb +600 -493
  92. data/lib/rdoc/markup/to_html_crossref.rb +221 -191
  93. data/lib/rdoc/markup/to_html_snippet.rb +232 -227
  94. data/lib/rdoc/markup/to_joined_paragraph.rb +40 -41
  95. data/lib/rdoc/markup/to_label.rb +63 -59
  96. data/lib/rdoc/markup/to_markdown.rb +212 -208
  97. data/lib/rdoc/markup/to_rdoc.rb +336 -332
  98. data/lib/rdoc/markup/to_table_of_contents.rb +66 -62
  99. data/lib/rdoc/markup/to_test.rb +60 -56
  100. data/lib/rdoc/markup/to_tt_only.rb +83 -86
  101. data/lib/rdoc/markup/verbatim.rb +62 -58
  102. data/lib/rdoc/markup.rb +198 -196
  103. data/lib/rdoc/options.rb +1063 -1076
  104. data/lib/rdoc/parser/c.rb +1039 -1036
  105. data/lib/rdoc/parser/changelog.rb +319 -315
  106. data/lib/rdoc/parser/markdown.rb +17 -13
  107. data/lib/rdoc/parser/rbs.rb +279 -0
  108. data/lib/rdoc/parser/rd.rb +17 -13
  109. data/lib/rdoc/parser/ruby.rb +1231 -2222
  110. data/lib/rdoc/parser/ruby_colorizer.rb +303 -0
  111. data/lib/rdoc/parser/simple.rb +31 -27
  112. data/lib/rdoc/parser/text.rb +12 -8
  113. data/lib/rdoc/parser.rb +230 -221
  114. data/lib/rdoc/rbs_helper.rb +186 -0
  115. data/lib/rdoc/rd/inline.rb +57 -53
  116. data/lib/rdoc/rd.rb +90 -88
  117. data/lib/rdoc/rdoc.rb +547 -366
  118. data/lib/rdoc/ri/driver.rb +1141 -1130
  119. data/lib/rdoc/ri/formatter.rb +7 -3
  120. data/lib/rdoc/ri/paths.rb +140 -136
  121. data/lib/rdoc/ri/servlet.rb +456 -0
  122. data/lib/rdoc/ri/store.rb +4 -2
  123. data/lib/rdoc/ri/task.rb +55 -51
  124. data/lib/rdoc/ri.rb +14 -11
  125. data/lib/rdoc/rubygems_hook.rb +194 -192
  126. data/lib/rdoc/server.rb +462 -0
  127. data/lib/rdoc/stats/normal.rb +46 -42
  128. data/lib/rdoc/stats/quiet.rb +39 -35
  129. data/lib/rdoc/stats/verbose.rb +35 -31
  130. data/lib/rdoc/stats.rb +363 -338
  131. data/lib/rdoc/store.rb +919 -725
  132. data/lib/rdoc/task.rb +260 -255
  133. data/lib/rdoc/text.rb +130 -245
  134. data/lib/rdoc/token_stream.rb +101 -115
  135. data/lib/rdoc/tom_doc.rb +203 -201
  136. data/lib/rdoc/version.rb +1 -1
  137. data/lib/rdoc.rb +35 -7
  138. data/lib/rubygems_plugin.rb +2 -11
  139. data/rdoc-logo.svg +43 -0
  140. data/rdoc.gemspec +6 -4
  141. metadata +36 -20
  142. data/lib/rdoc/code_object/anon_class.rb +0 -10
  143. data/lib/rdoc/code_object/ghost_method.rb +0 -6
  144. data/lib/rdoc/code_object/meta_method.rb +0 -6
  145. data/lib/rdoc/markdown/literals.kpeg +0 -21
  146. data/lib/rdoc/markdown/literals.rb +0 -454
  147. data/lib/rdoc/parser/prism_ruby.rb +0 -1112
  148. data/lib/rdoc/parser/ripper_state_lex.rb +0 -302
  149. data/lib/rdoc/parser/ruby_tools.rb +0 -163
  150. data/lib/rdoc/servlet.rb +0 -452
@@ -68,8 +68,11 @@
68
68
  --color-accent-primary: var(--color-primary-600);
69
69
  --color-accent-hover: var(--color-primary-700);
70
70
  --color-accent-subtle: var(--color-primary-50);
71
+ --color-title-kind-border: var(--color-primary-200);
71
72
  --color-code-bg: #f6f8fa;
72
73
  --color-code-border: var(--color-neutral-300);
74
+ --color-sig-bg: var(--color-neutral-100);
75
+ --color-sig-border: var(--color-border-default);
73
76
  --color-nav-bg: #fff;
74
77
  --color-nav-text: var(--color-neutral-700);
75
78
  --color-th-background: var(--color-neutral-100);
@@ -201,8 +204,11 @@
201
204
  --color-accent-hover: var(--color-primary-400);
202
205
  --color-accent-subtle: rgb(235 84 79 / 10%);
203
206
  --color-accent-subtle-hover: rgb(235 84 79 / 20%);
207
+ --color-title-kind-border: rgb(235 84 79 / 35%);
204
208
  --color-code-bg: var(--color-neutral-800);
205
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);
206
212
  --color-nav-bg: var(--color-neutral-900);
207
213
  --color-nav-text: var(--color-neutral-50);
208
214
  --color-th-background: var(--color-background-tertiary);
@@ -429,16 +435,35 @@ header.top-navbar {
429
435
  z-index: var(--z-fixed);
430
436
  background: var(--color-background-primary);
431
437
  border-bottom: 1px solid var(--color-border-default);
432
- display: flex;
438
+ display: grid;
439
+ grid-template-columns:
440
+ var(--layout-sidebar-width)
441
+ minmax(0, 1fr);
433
442
  align-items: center;
434
- justify-content: flex-start;
435
- padding: 0 var(--space-6);
436
- gap: var(--space-8);
443
+ padding: 0;
437
444
  height: var(--layout-header-height);
438
445
  box-shadow: var(--shadow-sm);
439
446
  }
440
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
+
441
463
  header.top-navbar .navbar-brand {
464
+ grid-column: 1;
465
+ justify-self: start;
466
+ margin-left: var(--space-6);
442
467
  font-size: var(--font-size-xl);
443
468
  font-weight: var(--font-weight-semibold);
444
469
  color: var(--color-text-primary);
@@ -451,12 +476,23 @@ header.top-navbar .navbar-brand:hover {
451
476
  }
452
477
 
453
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 {
454
487
  position: relative;
455
- flex: 0 1 auto;
456
- width: var(--layout-search-width);
488
+ width: min(100%, var(--layout-search-width));
489
+ margin: 0;
457
490
  }
458
491
 
459
492
  header.top-navbar .navbar-search form {
493
+ position: relative;
494
+ box-sizing: border-box;
495
+ width: 100%;
460
496
  margin: 0;
461
497
  padding: 0;
462
498
  }
@@ -470,11 +506,13 @@ header.top-navbar .navbar-search form {
470
506
 
471
507
  /* Theme toggle button */
472
508
  .theme-toggle {
509
+ position: absolute;
510
+ top: 50%;
511
+ right: var(--space-6);
473
512
  display: flex;
474
513
  align-items: center;
475
514
  justify-content: center;
476
515
  padding: var(--space-2);
477
- margin-left: auto;
478
516
  background: transparent;
479
517
  border: 1px solid var(--color-border-default);
480
518
  border-radius: var(--radius-md);
@@ -489,13 +527,14 @@ header.top-navbar .navbar-search form {
489
527
  line-height: 1;
490
528
  width: 2.5rem;
491
529
  height: 2.5rem;
530
+ transform: translateY(-50%);
492
531
  }
493
532
 
494
533
  .theme-toggle:hover {
495
534
  background: var(--color-background-secondary);
496
535
  border-color: var(--color-accent-primary);
497
536
  color: var(--color-accent-primary);
498
- transform: scale(1.05);
537
+ transform: translateY(-50%) scale(1.05);
499
538
  }
500
539
 
501
540
  .theme-toggle:focus {
@@ -505,7 +544,7 @@ header.top-navbar .navbar-search form {
505
544
  }
506
545
 
507
546
  .theme-toggle:active {
508
- transform: scale(0.95);
547
+ transform: translateY(-50%) scale(0.95);
509
548
  }
510
549
 
511
550
  .theme-toggle-icon {
@@ -526,11 +565,15 @@ header.top-navbar .navbar-search form {
526
565
  gap: var(--space-4);
527
566
  }
528
567
 
529
- /* Hide desktop search bar on mobile */
530
- header.top-navbar .navbar-search-desktop {
568
+ header.top-navbar .search-surface {
531
569
  display: none;
532
570
  }
533
571
 
572
+ header.top-navbar .navbar-search {
573
+ width: auto;
574
+ padding: 0;
575
+ }
576
+
534
577
  /* Show mobile search icon */
535
578
  .navbar-search-mobile {
536
579
  display: flex;
@@ -558,10 +601,24 @@ header.top-navbar .navbar-search form {
558
601
  text-overflow: ellipsis;
559
602
  white-space: nowrap;
560
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
+ }
561
618
  }
562
619
 
563
620
  /* 7. Navigation (Left Sidebar) */
564
- nav {
621
+ #sidebar-navigation {
565
622
  grid-area: nav;
566
623
  font-family: var(--font-heading);
567
624
  font-size: var(--font-size-base);
@@ -580,27 +637,27 @@ nav {
580
637
  }
581
638
 
582
639
  /* Custom scrollbar for WebKit browsers */
583
- nav::-webkit-scrollbar {
640
+ #sidebar-navigation::-webkit-scrollbar {
584
641
  width: 6px;
585
642
  }
586
643
 
587
- nav::-webkit-scrollbar-track {
644
+ #sidebar-navigation::-webkit-scrollbar-track {
588
645
  background: transparent;
589
646
  }
590
647
 
591
- nav::-webkit-scrollbar-thumb {
648
+ #sidebar-navigation::-webkit-scrollbar-thumb {
592
649
  background: var(--color-border-default);
593
650
  border-radius: var(--radius-sm);
594
651
  transition: background var(--transition-fast);
595
652
  }
596
653
 
597
- nav::-webkit-scrollbar-thumb:hover {
654
+ #sidebar-navigation::-webkit-scrollbar-thumb:hover {
598
655
  background: var(--color-border-emphasis);
599
656
  }
600
657
 
601
658
  /* Mobile navigation */
602
659
  @media (width <= 1023px) {
603
- nav {
660
+ #sidebar-navigation {
604
661
  position: fixed;
605
662
  top: var(--layout-header-height);
606
663
  bottom: 0;
@@ -612,7 +669,7 @@ nav::-webkit-scrollbar-thumb:hover {
612
669
  /* Don't set height - let top/bottom define it */
613
670
  }
614
671
 
615
- nav[hidden] {
672
+ #sidebar-navigation[hidden] {
616
673
  display: none;
617
674
  }
618
675
 
@@ -629,7 +686,7 @@ nav::-webkit-scrollbar-thumb:hover {
629
686
  }
630
687
 
631
688
  /* Show backdrop when nav is open */
632
- body.nav-open::before {
689
+ body.sidebar-navigation-open::before {
633
690
  opacity: 1;
634
691
  pointer-events: auto;
635
692
  }
@@ -637,17 +694,18 @@ nav::-webkit-scrollbar-thumb:hover {
637
694
 
638
695
  /* Desktop: hide nav when [hidden] attribute is set */
639
696
  @media (width >= 1024px) {
640
- nav[hidden] {
697
+ #sidebar-navigation[hidden] {
641
698
  display: none;
642
699
  }
643
700
  }
644
701
 
645
- nav .nav-section {
702
+ #sidebar-navigation .nav-section {
646
703
  margin-top: var(--space-6);
647
704
  padding: 0 var(--space-6);
648
705
  }
649
706
 
650
- nav h2, nav h3 {
707
+ #sidebar-navigation h2,
708
+ #sidebar-navigation h3 {
651
709
  font-size: var(--font-size-lg);
652
710
  font-weight: var(--font-weight-semibold);
653
711
  margin: 0 0 var(--space-4);
@@ -656,51 +714,51 @@ nav h2, nav h3 {
656
714
  border-bottom: 1px solid var(--color-border-default);
657
715
  }
658
716
 
659
- nav ul,
660
- nav dl,
661
- nav p {
717
+ #sidebar-navigation ul,
718
+ #sidebar-navigation dl,
719
+ #sidebar-navigation p {
662
720
  padding: 0;
663
721
  list-style: none;
664
722
  margin: var(--space-3) 0;
665
723
  }
666
724
 
667
- nav ul li {
725
+ #sidebar-navigation ul li {
668
726
  margin-bottom: var(--space-2);
669
727
  line-height: var(--line-height-relaxed);
670
728
  }
671
729
 
672
- nav ul li a {
730
+ #sidebar-navigation ul li a {
673
731
  transition:
674
732
  color var(--transition-fast),
675
733
  transform var(--transition-fast),
676
734
  padding var(--transition-fast);
677
735
  }
678
736
 
679
- nav ul li a:hover {
737
+ #sidebar-navigation ul li a:hover {
680
738
  padding-left: var(--space-1);
681
739
  }
682
740
 
683
- nav ul ul {
741
+ #sidebar-navigation ul ul {
684
742
  padding-left: var(--space-5);
685
- margin-top: var(--space-2);
743
+ margin: var(--space-2) 0 0;
686
744
  }
687
745
 
688
- nav ul ul ul {
746
+ #sidebar-navigation ul ul ul {
689
747
  padding-left: var(--space-5);
690
748
  }
691
749
 
692
- nav ul ul ul ul {
750
+ #sidebar-navigation ul ul ul ul {
693
751
  padding-left: var(--space-5);
694
752
  }
695
753
 
696
- nav a {
754
+ #sidebar-navigation a {
697
755
  text-decoration: none;
698
756
  }
699
757
 
700
758
  /* Truncation for direct nav links (not links inside code tags) */
701
- nav .nav-list > li > a,
702
- nav .nav-section > ul > li > a,
703
- nav .nav-section > dl > dd > a {
759
+ #sidebar-navigation .nav-list > li > a,
760
+ #sidebar-navigation .nav-section > ul > li > a,
761
+ #sidebar-navigation .nav-section > dl > dd > a {
704
762
  display: block;
705
763
  max-width: 100%;
706
764
  overflow: hidden;
@@ -708,22 +766,22 @@ nav .nav-section > dl > dd > a {
708
766
  white-space: nowrap;
709
767
  }
710
768
 
711
- nav footer {
769
+ #sidebar-navigation footer {
712
770
  padding: var(--space-4);
713
771
  border-top: 1px solid var(--color-border-default);
714
772
  }
715
773
 
716
- nav footer a {
774
+ #sidebar-navigation footer a {
717
775
  color: var(--color-accent-hover);
718
776
  }
719
777
 
720
- #navigation-toggle {
778
+ #sidebar-navigation-toggle {
721
779
  display: none; /* Hidden by default, shown on mobile */
722
780
  }
723
781
 
724
782
  /* Mobile toggle button */
725
783
  @media (width <= 1023px) {
726
- #navigation-toggle {
784
+ #sidebar-navigation-toggle {
727
785
  display: flex;
728
786
  align-items: center;
729
787
  justify-content: center;
@@ -743,7 +801,7 @@ nav footer a {
743
801
  -webkit-user-select: none;
744
802
  }
745
803
 
746
- #navigation-toggle:hover {
804
+ #sidebar-navigation-toggle:hover {
747
805
  color: var(--color-accent-primary);
748
806
  }
749
807
  }
@@ -754,23 +812,23 @@ nav footer a {
754
812
  * Uses block-size animation with interpolate-size for smooth height transitions.
755
813
  * Both nav-section-collapsible and nested link-list details share this pattern.
756
814
  */
757
- nav details {
815
+ #sidebar-navigation details {
758
816
  interpolate-size: allow-keywords;
759
817
  }
760
818
 
761
- nav details::details-content {
819
+ #sidebar-navigation details::details-content {
762
820
  overflow: hidden;
763
821
  block-size: 0;
764
822
  transition: block-size 200ms ease, content-visibility 200ms ease allow-discrete;
765
823
  }
766
824
 
767
- nav details[open]::details-content {
825
+ #sidebar-navigation details[open]::details-content {
768
826
  block-size: auto;
769
827
  }
770
828
 
771
829
  /* Collapsible Navigation Section Headers */
772
830
 
773
- nav .nav-section-header {
831
+ #sidebar-navigation .nav-section-header {
774
832
  display: flex;
775
833
  align-items: center;
776
834
  gap: var(--space-3);
@@ -784,15 +842,15 @@ nav .nav-section-header {
784
842
  transition: color var(--transition-fast);
785
843
  }
786
844
 
787
- nav .nav-section-header::-webkit-details-marker {
845
+ #sidebar-navigation .nav-section-header::-webkit-details-marker {
788
846
  display: none;
789
847
  }
790
848
 
791
- nav .nav-section-header:hover {
849
+ #sidebar-navigation .nav-section-header:hover {
792
850
  color: var(--color-accent-primary);
793
851
  }
794
852
 
795
- nav .nav-section-icon {
853
+ #sidebar-navigation .nav-section-icon {
796
854
  display: flex;
797
855
  align-items: center;
798
856
  justify-content: center;
@@ -802,12 +860,12 @@ nav .nav-section-icon {
802
860
  color: var(--color-accent-primary);
803
861
  }
804
862
 
805
- nav .nav-section-icon svg {
863
+ #sidebar-navigation .nav-section-icon svg {
806
864
  width: 100%;
807
865
  height: 100%;
808
866
  }
809
867
 
810
- nav .nav-section-title {
868
+ #sidebar-navigation .nav-section-title {
811
869
  font-size: var(--font-size-base);
812
870
  font-weight: var(--font-weight-semibold);
813
871
  color: inherit;
@@ -818,7 +876,7 @@ nav .nav-section-title {
818
876
  white-space: nowrap;
819
877
  }
820
878
 
821
- nav .nav-section-chevron {
879
+ #sidebar-navigation .nav-section-chevron {
822
880
  display: flex;
823
881
  align-items: center;
824
882
  justify-content: center;
@@ -829,46 +887,50 @@ nav .nav-section-chevron {
829
887
  transition: transform var(--transition-base);
830
888
  }
831
889
 
832
- nav .nav-section-chevron svg {
890
+ #sidebar-navigation .nav-section-chevron svg {
833
891
  width: 100%;
834
892
  height: 100%;
835
893
  }
836
894
 
837
895
  /* Rotate chevron when open */
838
- nav .nav-section-collapsible[open] > .nav-section-header .nav-section-chevron {
896
+ #sidebar-navigation .nav-section-collapsible[open] > .nav-section-header .nav-section-chevron {
839
897
  transform: rotate(90deg);
840
898
  }
841
899
 
842
- nav .nav-section-collapsible > ul,
843
- nav .nav-section-collapsible > dl,
844
- 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 {
845
903
  margin-top: 0;
846
904
  }
847
905
 
848
- nav .nav-section-collapsible > .nav-list {
906
+ #sidebar-navigation .nav-section-collapsible > .nav-list {
849
907
  padding-left: var(--space-5);
850
908
  border-left: 1px solid var(--color-border-subtle);
851
909
  margin-left: 9px; /* Align with the section icon center */
852
910
  }
853
911
 
854
- nav .nav-section-collapsible .nav-list .link-list {
912
+ #sidebar-navigation .nav-section-collapsible .nav-list .link-list {
855
913
  border-left: none;
856
914
  margin-left: 0;
857
915
  padding-left: var(--space-5);
858
916
  }
859
917
 
918
+ #sidebar-navigation .nav-section-collapsible .nav-list .link-list > li:last-child {
919
+ margin-bottom: 0;
920
+ }
921
+
860
922
  /*
861
923
  Improve chevron styling for details under link-list, using SVG chevron that matches nav-section-chevron
862
924
  We need to avoid adding the element in class content generation so it doesn't break darkfish styles
863
925
  */
864
- nav li details:has(.link-list) > summary {
926
+ #sidebar-navigation li details:has(.link-list) > summary {
865
927
  display: inline-flex;
866
928
  align-items: center;
867
929
  gap: var(--space-2);
868
930
  cursor: pointer;
869
931
  }
870
932
 
871
- nav li details:has(.link-list) > summary::after {
933
+ #sidebar-navigation li details:has(.link-list) > summary::after {
872
934
  content: '';
873
935
  position: static;
874
936
  display: inline-block;
@@ -888,11 +950,11 @@ nav li details:has(.link-list) > summary::after {
888
950
  transition: transform var(--transition-base), background-color var(--transition-fast);
889
951
  }
890
952
 
891
- nav li details:has(.link-list) > summary:hover::after {
953
+ #sidebar-navigation li details:has(.link-list) > summary:hover::after {
892
954
  background-color: var(--color-accent-primary);
893
955
  }
894
956
 
895
- nav li details:has(.link-list)[open] > summary::after {
957
+ #sidebar-navigation li details:has(.link-list)[open] > summary::after {
896
958
  transform: rotate(90deg);
897
959
  background-color: var(--color-accent-primary);
898
960
  }
@@ -901,6 +963,7 @@ nav li details:has(.link-list)[open] > summary::after {
901
963
  main {
902
964
  grid-area: main;
903
965
  width: 100%;
966
+ min-width: 0;
904
967
  max-width: var(--layout-content-max-width);
905
968
  margin: 0 auto;
906
969
  padding: var(--space-12) var(--space-8);
@@ -912,7 +975,7 @@ main {
912
975
 
913
976
  /* Desktop: hide hamburger */
914
977
  @media (width >= 1024px) {
915
- #navigation-toggle {
978
+ #sidebar-navigation-toggle {
916
979
  display: none;
917
980
  }
918
981
  }
@@ -935,11 +998,36 @@ main {
935
998
  }
936
999
  }
937
1000
 
938
- main h1[class] {
1001
+ main h1.page-title {
1002
+ display: grid;
1003
+ gap: var(--space-2);
1004
+ justify-items: start;
939
1005
  margin-top: 0;
940
- margin-bottom: 1em;
941
- 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);
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%;
942
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;
943
1031
  }
944
1032
 
945
1033
  main h1,
@@ -1017,7 +1105,6 @@ main h6 a:hover {
1017
1105
  .ruby-ivar { color: var(--code-orange); }
1018
1106
  .ruby-operator { color: var(--code-green); }
1019
1107
  .ruby-identifier { color: var(--code-blue); }
1020
- .ruby-node { color: var(--code-purple); }
1021
1108
 
1022
1109
  .ruby-comment {
1023
1110
  color: var(--color-neutral-500);
@@ -1033,7 +1120,6 @@ main h6 a:hover {
1033
1120
  [data-theme="dark"] .ruby-ivar { color: var(--code-orange); }
1034
1121
  [data-theme="dark"] .ruby-operator { color: var(--code-green); }
1035
1122
  [data-theme="dark"] .ruby-identifier { color: var(--code-blue); }
1036
- [data-theme="dark"] .ruby-node { color: var(--code-purple); }
1037
1123
 
1038
1124
  [data-theme="dark"] .ruby-comment {
1039
1125
  color: var(--color-neutral-400);
@@ -1071,6 +1157,20 @@ main h6 a:hover {
1071
1157
  font-style: italic;
1072
1158
  }
1073
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
+
1074
1174
  /* Emphasis */
1075
1175
  em {
1076
1176
  text-decoration-color: var(--color-emphasis-decoration);
@@ -1091,6 +1191,22 @@ main p {
1091
1191
  margin-bottom: var(--space-4);
1092
1192
  }
1093
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
+
1094
1210
  /* Preformatted Text */
1095
1211
  main pre {
1096
1212
  margin: 1.2em 0.5em;
@@ -1154,17 +1270,19 @@ main dd p:first-child {
1154
1270
 
1155
1271
  /* Headers within Main */
1156
1272
  main header h2 {
1157
- margin-top: 2em;
1273
+ margin: var(--space-8) 0 var(--space-4);
1274
+ padding-top: var(--space-3);
1158
1275
  border-width: 0;
1159
- border-top: 4px solid var(--color-border-default);
1160
- font-size: 130%;
1276
+ border-top: 1px solid var(--color-border-default);
1277
+ font-size: var(--font-size-2xl);
1161
1278
  }
1162
1279
 
1163
1280
  main header h3 {
1164
- margin: 2em 0 1.5em;
1281
+ margin: var(--space-8) 0 var(--space-6);
1282
+ padding-top: var(--space-3);
1165
1283
  border-width: 0;
1166
- border-top: 3px solid var(--color-border-default);
1167
- font-size: 120%;
1284
+ border-top: 1px solid var(--color-border-default);
1285
+ font-size: var(--font-size-xl);
1168
1286
  }
1169
1287
 
1170
1288
  h1:target,
@@ -1237,8 +1355,7 @@ main .method-source-code {
1237
1355
  }
1238
1356
 
1239
1357
  main .method-source-code pre {
1240
- border-color: var(--color-accent-hover);
1241
- border-left: 3px solid var(--color-accent-primary);
1358
+ border-color: var(--color-code-border);
1242
1359
  width: 100%;
1243
1360
  box-sizing: border-box;
1244
1361
  transition: border-color var(--transition-fast);
@@ -1282,6 +1399,7 @@ main .method-description .method-calls-super {
1282
1399
  }
1283
1400
 
1284
1401
  main .method-detail {
1402
+ position: relative;
1285
1403
  margin-bottom: 2.5em;
1286
1404
  }
1287
1405
 
@@ -1292,32 +1410,106 @@ main .method-detail:target {
1292
1410
  }
1293
1411
 
1294
1412
  main .method-header {
1295
- display: inline-block;
1296
- 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;
1297
1425
  }
1298
1426
 
1299
1427
  main .method-heading {
1300
- position: relative;
1428
+ display: flex;
1429
+ flex-direction: column;
1430
+ align-items: flex-start;
1301
1431
  font-family: var(--font-code);
1302
1432
  font-size: var(--font-size-lg);
1303
1433
  font-weight: var(--font-weight-semibold);
1304
- 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;
1305
1448
  }
1306
1449
 
1307
1450
  main .method-heading .method-name {
1308
1451
  font-weight: var(--font-weight-semibold);
1452
+ overflow-wrap: anywhere;
1309
1453
  }
1310
1454
 
1311
1455
  main .method-heading .method-args {
1312
1456
  font-weight: var(--font-weight-normal);
1313
1457
  }
1314
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
+
1315
1502
  main .method-controls {
1316
- float: right;
1503
+ position: static;
1504
+ align-self: center;
1317
1505
  }
1318
1506
 
1319
1507
  main .method-controls summary {
1320
- display: inline-block;
1508
+ display: inline-flex;
1509
+ align-items: center;
1510
+ justify-content: center;
1511
+ gap: var(--space-2);
1512
+ min-height: 30px;
1321
1513
  line-height: 20px;
1322
1514
  color: var(--color-accent-primary);
1323
1515
  cursor: pointer;
@@ -1334,6 +1526,7 @@ main .method-controls summary {
1334
1526
  transform var(--transition-fast);
1335
1527
  user-select: none;
1336
1528
  -webkit-user-select: none;
1529
+ white-space: nowrap;
1337
1530
  list-style: none;
1338
1531
  }
1339
1532
 
@@ -1351,19 +1544,31 @@ main .method-controls summary:active {
1351
1544
  transform: scale(0.96);
1352
1545
  }
1353
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
+
1354
1554
  [data-theme="dark"] main .method-controls summary:hover {
1355
1555
  background: var(--color-accent-subtle-hover);
1356
1556
  border-color: var(--color-primary-500);
1357
1557
  }
1358
1558
 
1359
- main .method-description,
1360
- main .aliases {
1361
- margin-top: 0.75em;
1559
+ main .method-description {
1362
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);
1363
1567
  }
1364
1568
 
1365
1569
  main .aliases {
1366
- padding-top: 4px;
1570
+ margin-top: var(--space-4);
1571
+ padding-top: var(--space-1);
1367
1572
  font-style: italic;
1368
1573
  cursor: default;
1369
1574
  }
@@ -1393,7 +1598,7 @@ main .attribute-access-type {
1393
1598
 
1394
1599
  /* Small screen adjustments */
1395
1600
  @media (width <= 480px) {
1396
- nav {
1601
+ #sidebar-navigation {
1397
1602
  width: 85%;
1398
1603
  max-width: 320px;
1399
1604
  }
@@ -1410,191 +1615,37 @@ main .attribute-access-type {
1410
1615
  white-space: nowrap;
1411
1616
  }
1412
1617
 
1413
- main .method-controls {
1414
- margin-top: 10px;
1415
- float: none;
1416
- }
1417
- }
1418
-
1419
-
1420
-
1421
- /* 9. Search Modal (Mobile) */
1422
- .search-modal {
1423
- position: fixed;
1424
- inset: 0;
1425
- z-index: var(--z-modal);
1426
- display: none;
1427
- }
1428
-
1429
- .search-modal:not([hidden]) {
1430
- display: flex;
1431
- align-items: flex-start;
1432
- justify-content: center;
1433
- padding: var(--space-16) var(--space-4);
1434
- }
1435
-
1436
- /* Reduce padding on very small screens */
1437
- @media (width <= 420px) {
1438
- .search-modal:not([hidden]) {
1439
- padding: var(--space-4) var(--space-3);
1440
- }
1441
-
1442
- .search-modal-content {
1443
- border-radius: var(--radius-md);
1444
- }
1445
-
1446
- .search-modal-header {
1447
- padding: var(--space-3);
1448
- }
1449
-
1450
- .search-modal-body {
1451
- padding: var(--space-3);
1452
- }
1453
-
1454
- .search-modal-form input {
1618
+ main .method-heading {
1455
1619
  font-size: var(--font-size-base);
1456
- min-width: 0; /* Allow input to shrink */
1457
1620
  }
1458
1621
 
1459
- .search-modal-form {
1460
- gap: var(--space-2);
1622
+ pre.method-type-signature {
1623
+ font-size: var(--font-size-xs);
1461
1624
  }
1462
1625
 
1463
- .search-modal-close {
1464
- padding: var(--space-1) var(--space-3);
1465
- font-size: 0.75rem;
1626
+ main .method-header {
1627
+ grid-template-columns: 1fr;
1628
+ gap: var(--space-3);
1629
+ padding: var(--space-2);
1466
1630
  }
1467
- }
1468
-
1469
- .search-modal-backdrop {
1470
- position: absolute;
1471
- inset: 0;
1472
- background: var(--color-overlay);
1473
- z-index: 1;
1474
- }
1475
-
1476
- .search-modal-content {
1477
- position: relative;
1478
- z-index: 2;
1479
- background: var(--color-background-primary);
1480
- border-radius: var(--radius-lg);
1481
- box-shadow: var(--shadow-xl);
1482
- width: 100%;
1483
- max-width: 600px;
1484
- max-height: 80vh;
1485
- display: flex;
1486
- flex-direction: column;
1487
- }
1488
-
1489
- .search-modal-header {
1490
- padding: var(--space-6);
1491
- border-bottom: 1px solid var(--color-border-default);
1492
- }
1493
-
1494
- .search-modal-form {
1495
- display: flex;
1496
- align-items: center;
1497
- gap: var(--space-3);
1498
- }
1499
-
1500
- .search-modal-icon {
1501
- font-size: 1.5rem;
1502
- color: var(--color-text-secondary);
1503
- flex-shrink: 0;
1504
- }
1505
-
1506
- .search-modal-form input {
1507
- flex: 1;
1508
- border: none;
1509
- outline: none;
1510
- background: transparent;
1511
- font-size: var(--font-size-lg);
1512
- color: var(--color-text-primary);
1513
- padding: 0;
1514
- }
1515
-
1516
- .search-modal-form input::placeholder {
1517
- color: var(--color-text-tertiary);
1518
- }
1519
-
1520
- .search-modal-close {
1521
- padding: var(--space-2) var(--space-4);
1522
- background: var(--color-background-secondary);
1523
- border: 1px solid var(--color-border-default);
1524
- border-radius: var(--radius-md);
1525
- font-size: var(--font-size-sm);
1526
- color: var(--color-text-secondary);
1527
- cursor: pointer;
1528
- transition: background var(--transition-fast), border-color var(--transition-fast);
1529
- flex-shrink: 0;
1530
- }
1531
-
1532
- .search-modal-close:hover {
1533
- background: var(--color-background-tertiary);
1534
- border-color: var(--color-border-default);
1535
- }
1536
-
1537
- .search-modal-body {
1538
- padding: var(--space-6);
1539
- overflow-y: auto;
1540
- flex: 1;
1541
- }
1542
-
1543
- .search-modal-empty {
1544
- text-align: center;
1545
- color: var(--color-text-tertiary);
1546
- padding: var(--space-12) 0;
1547
- }
1548
-
1549
- .search-modal-results {
1550
- list-style: none;
1551
- margin: 0;
1552
- padding: 0;
1553
- }
1554
-
1555
- .search-modal-results.initially-hidden {
1556
- display: block !important; /* Override initially-hidden */
1557
- }
1558
-
1559
- .search-modal-results li {
1560
- padding: var(--space-3) var(--space-4);
1561
- border-radius: var(--radius-md);
1562
- cursor: pointer;
1563
- transition: background var(--transition-fast);
1564
- margin-bottom: var(--space-2);
1565
- }
1566
-
1567
- .search-modal-results li:hover {
1568
- background: var(--color-background-secondary);
1569
- }
1570
-
1571
- .search-modal-results a {
1572
- color: var(--color-text-primary);
1573
- }
1574
1631
 
1575
- .search-modal-results .search-match {
1576
- margin: 0;
1577
- font-size: var(--font-size-base);
1632
+ main .method-controls {
1633
+ justify-self: start;
1634
+ }
1578
1635
  }
1579
1636
 
1580
- .search-modal-results .search-match a {
1581
- text-decoration: none;
1582
- }
1583
1637
 
1584
- .search-modal-results .search-namespace {
1585
- margin: var(--space-1) 0 0 0;
1586
- font-size: var(--font-size-sm);
1587
- color: var(--color-text-secondary);
1588
- }
1589
1638
 
1590
- .search-modal-results .search-snippet {
1591
- margin: var(--space-1) 0 0 0;
1592
- font-size: var(--font-size-sm);
1593
- color: var(--color-text-tertiary);
1639
+ /* 9. Search */
1640
+ .search-backdrop,
1641
+ .search-icon,
1642
+ .search-close,
1643
+ .search-empty {
1644
+ display: none;
1594
1645
  }
1595
1646
 
1596
1647
  /* 10. Right Sidebar - Table of Contents */
1597
- aside.table-of-contents {
1648
+ #table-of-contents {
1598
1649
  grid-area: toc;
1599
1650
  align-self: start;
1600
1651
  position: sticky;
@@ -1605,43 +1656,45 @@ aside.table-of-contents {
1605
1656
  font-size: var(--font-size-base);
1606
1657
  }
1607
1658
 
1608
- aside.table-of-contents * {
1609
- border-right: none !important;
1610
- outline: none !important;
1611
- }
1612
-
1613
- aside.table-of-contents .toc-sticky {
1659
+ #table-of-contents .toc-sticky {
1614
1660
  display: flex;
1615
1661
  flex-direction: column;
1616
1662
 
1617
- /* Exclude header height and top/bottom padding of aside.table-of-contents */
1663
+ /* Exclude header height and top/bottom padding of #table-of-contents */
1618
1664
  height: calc(100vh - var(--layout-header-height) - var(--space-8) * 2);
1619
1665
  }
1620
1666
 
1621
- aside.table-of-contents .toc-sticky nav {
1622
- 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;
1623
1673
  }
1624
1674
 
1625
- aside.table-of-contents .toc-list > .toc-h2 {
1675
+ #table-of-contents .toc-list > .toc-h2 {
1626
1676
  margin-left: var(--space-4);
1627
1677
  }
1628
1678
 
1629
- aside.table-of-contents .toc-list > .toc-h3 {
1679
+ #table-of-contents .toc-list > .toc-h3 {
1630
1680
  margin-left: var(--space-8);
1631
1681
  }
1632
1682
 
1633
1683
  /* Hide TOC on mobile/tablet */
1634
1684
  @media (width <= 1279px) {
1635
- aside.table-of-contents {
1685
+ #table-of-contents {
1636
1686
  display: none;
1637
1687
  }
1688
+ }
1638
1689
 
1690
+ /* Preserve the desktop sidebar/content grid when the TOC is hidden */
1691
+ @media (width >= 1024px) and (width <= 1279px) {
1639
1692
  body.has-toc {
1640
1693
  grid-template-columns: var(--layout-sidebar-width) 1fr;
1641
1694
  grid-template-areas:
1642
1695
  "header header"
1643
1696
  "nav main"
1644
- "footer footer";
1697
+ "nav footer";
1645
1698
  }
1646
1699
  }
1647
1700
 
@@ -1657,31 +1710,31 @@ aside.table-of-contents .toc-list > .toc-h3 {
1657
1710
  }
1658
1711
  }
1659
1712
 
1660
- .table-of-contents h3 {
1713
+ #table-of-contents h3 {
1661
1714
  font-size: var(--font-size-lg);
1662
1715
  font-weight: var(--font-weight-semibold);
1663
1716
  margin: 0 0 var(--space-5) 0;
1664
1717
  color: var(--color-text-primary);
1665
1718
  }
1666
1719
 
1667
- .table-of-contents ul {
1720
+ #table-of-contents ul {
1668
1721
  margin: 0;
1669
1722
  padding: 0;
1670
1723
  list-style: none;
1671
1724
  }
1672
1725
 
1673
- .table-of-contents ul ul {
1726
+ #table-of-contents ul ul {
1674
1727
  margin-top: var(--space-3);
1675
1728
  margin-left: var(--space-5);
1676
1729
  border-left: 1px solid var(--color-border-default);
1677
1730
  padding-left: var(--space-4);
1678
1731
  }
1679
1732
 
1680
- .table-of-contents li {
1733
+ #table-of-contents li {
1681
1734
  margin-bottom: var(--space-3);
1682
1735
  }
1683
1736
 
1684
- .table-of-contents a {
1737
+ #table-of-contents a {
1685
1738
  display: block;
1686
1739
  color: var(--color-text-secondary);
1687
1740
  text-decoration: none;
@@ -1692,32 +1745,46 @@ aside.table-of-contents .toc-list > .toc-h3 {
1692
1745
  }
1693
1746
 
1694
1747
  /* Nav hover styles sit here to keep specificity ordering with TOC links */
1695
- nav a:hover {
1748
+ #sidebar-navigation a:hover {
1696
1749
  color: var(--color-link-hover);
1697
1750
  text-decoration: underline;
1698
1751
  }
1699
1752
 
1700
- .table-of-contents a:hover {
1753
+ #table-of-contents a:hover {
1701
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);
1702
1762
  }
1703
1763
 
1704
- .table-of-contents a.active {
1764
+ #table-of-contents a.active {
1705
1765
  color: var(--color-accent-primary);
1706
1766
  font-weight: var(--font-weight-medium);
1707
1767
  }
1708
1768
 
1709
1769
  ol.breadcrumb {
1710
1770
  display: flex;
1771
+ flex-wrap: wrap;
1711
1772
  padding: 0;
1712
1773
  margin: 0 0 1em;
1713
1774
  }
1714
1775
 
1715
1776
  ol.breadcrumb li {
1716
1777
  display: block;
1778
+ min-width: 0;
1717
1779
  list-style: none;
1718
1780
  font-size: 125%;
1719
1781
  }
1720
1782
 
1783
+ ol.breadcrumb a,
1784
+ ol.breadcrumb li > span:not(.separator) {
1785
+ overflow-wrap: anywhere;
1786
+ }
1787
+
1721
1788
  /* 11. Footer */
1722
1789
  footer.site-footer {
1723
1790
  grid-area: footer;
@@ -1846,9 +1913,11 @@ footer.site-footer .footer-bottom:first-child {
1846
1913
  }
1847
1914
 
1848
1915
  .search-results li {
1916
+ position: relative;
1849
1917
  list-style: none;
1850
1918
  border-bottom: 1px solid var(--color-border-default);
1851
1919
  margin-bottom: 0.5em;
1920
+ cursor: pointer;
1852
1921
  }
1853
1922
 
1854
1923
  .search-results li:last-child {
@@ -1861,6 +1930,16 @@ footer.site-footer .footer-bottom:first-child {
1861
1930
  margin: 0.5em;
1862
1931
  }
1863
1932
 
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
+
1864
1943
  .search-results .search-namespace {
1865
1944
  font-weight: bold;
1866
1945
  }
@@ -1909,6 +1988,8 @@ footer.site-footer .footer-bottom:first-child {
1909
1988
  }
1910
1989
 
1911
1990
  header.top-navbar #search-field {
1991
+ display: block;
1992
+ box-sizing: border-box;
1912
1993
  width: 100%;
1913
1994
  padding: var(--space-2) var(--space-4);
1914
1995
  border: 1px solid var(--color-border-default);
@@ -1930,11 +2011,12 @@ header.top-navbar #search-field::placeholder {
1930
2011
  }
1931
2012
 
1932
2013
  /* Search results dropdown in navbar */
1933
- header.top-navbar #search-results-desktop {
2014
+ header.top-navbar #search-results {
2015
+ box-sizing: border-box;
1934
2016
  position: absolute;
1935
2017
  top: calc(100% + var(--space-2));
1936
2018
  left: 0;
1937
- width: var(--layout-search-width);
2019
+ width: 100%;
1938
2020
  max-height: 60vh;
1939
2021
  background: var(--color-background-primary);
1940
2022
  border: 1px solid var(--color-border-default);
@@ -1946,10 +2028,183 @@ header.top-navbar #search-results-desktop {
1946
2028
  padding: 0;
1947
2029
  }
1948
2030
 
1949
- header.top-navbar #search-results-desktop.initially-hidden {
2031
+ header.top-navbar #search-results.initially-hidden {
1950
2032
  display: none;
1951
2033
  }
1952
2034
 
1953
- header.top-navbar #search-results-desktop[aria-expanded="false"] {
2035
+ header.top-navbar #search-results[aria-expanded="false"] {
1954
2036
  display: none;
1955
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
+ }