rdoc 6.16.1 → 7.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 (69) hide show
  1. checksums.yaml +4 -4
  2. data/CONTRIBUTING.md +196 -0
  3. data/LEGAL.rdoc +6 -0
  4. data/README.md +90 -7
  5. data/doc/markup_reference/markdown.md +558 -0
  6. data/doc/markup_reference/rdoc.rdoc +1169 -0
  7. data/lib/rdoc/code_object/any_method.rb +15 -7
  8. data/lib/rdoc/code_object/class_module.rb +62 -11
  9. data/lib/rdoc/code_object/constant.rb +9 -0
  10. data/lib/rdoc/code_object/context/section.rb +20 -1
  11. data/lib/rdoc/code_object/method_attr.rb +13 -1
  12. data/lib/rdoc/code_object/top_level.rb +13 -1
  13. data/lib/rdoc/cross_reference.rb +30 -21
  14. data/lib/rdoc/generator/aliki.rb +141 -0
  15. data/lib/rdoc/generator/darkfish.rb +8 -2
  16. data/lib/rdoc/generator/template/aliki/_footer.rhtml +1 -1
  17. data/lib/rdoc/generator/template/aliki/_head.rhtml +4 -4
  18. data/lib/rdoc/generator/template/aliki/_header.rhtml +4 -4
  19. data/lib/rdoc/generator/template/aliki/_icons.rhtml +208 -0
  20. data/lib/rdoc/generator/template/aliki/_sidebar_ancestors.rhtml +12 -2
  21. data/lib/rdoc/generator/template/aliki/_sidebar_classes.rhtml +12 -2
  22. data/lib/rdoc/generator/template/aliki/_sidebar_extends.rhtml +20 -10
  23. data/lib/rdoc/generator/template/aliki/_sidebar_includes.rhtml +20 -10
  24. data/lib/rdoc/generator/template/aliki/_sidebar_methods.rhtml +32 -12
  25. data/lib/rdoc/generator/template/aliki/_sidebar_pages.rhtml +58 -28
  26. data/lib/rdoc/generator/template/aliki/_sidebar_search.rhtml +3 -3
  27. data/lib/rdoc/generator/template/aliki/_sidebar_sections.rhtml +16 -6
  28. data/lib/rdoc/generator/template/aliki/class.rhtml +13 -12
  29. data/lib/rdoc/generator/template/aliki/css/rdoc.css +401 -50
  30. data/lib/rdoc/generator/template/aliki/index.rhtml +2 -1
  31. data/lib/rdoc/generator/template/aliki/js/aliki.js +43 -21
  32. data/lib/rdoc/generator/template/aliki/js/c_highlighter.js +1 -1
  33. data/lib/rdoc/generator/template/aliki/js/{search.js → search_controller.js} +15 -6
  34. data/lib/rdoc/generator/template/aliki/js/search_navigation.js +105 -0
  35. data/lib/rdoc/generator/template/aliki/js/search_ranker.js +239 -0
  36. data/lib/rdoc/generator/template/aliki/page.rhtml +2 -1
  37. data/lib/rdoc/generator/template/aliki/servlet_not_found.rhtml +1 -1
  38. data/lib/rdoc/generator/template/aliki/servlet_root.rhtml +1 -1
  39. data/lib/rdoc/generator/template/darkfish/_sidebar_pages.rhtml +1 -1
  40. data/lib/rdoc/generator/template/darkfish/class.rhtml +11 -11
  41. data/lib/rdoc/generator/template/darkfish/css/rdoc.css +19 -0
  42. data/lib/rdoc/markdown.kpeg +1 -5
  43. data/lib/rdoc/markdown.rb +1 -5
  44. data/lib/rdoc/markup/attribute_manager.rb +28 -1
  45. data/lib/rdoc/markup/blank_line.rb +25 -23
  46. data/lib/rdoc/markup/element.rb +21 -0
  47. data/lib/rdoc/markup/hard_break.rb +30 -27
  48. data/lib/rdoc/markup/heading.rb +166 -77
  49. data/lib/rdoc/markup/raw.rb +52 -55
  50. data/lib/rdoc/markup/table.rb +48 -40
  51. data/lib/rdoc/markup/to_ansi.rb +4 -0
  52. data/lib/rdoc/markup/to_bs.rb +4 -0
  53. data/lib/rdoc/markup/to_html.rb +31 -11
  54. data/lib/rdoc/markup/to_html_crossref.rb +24 -5
  55. data/lib/rdoc/markup/to_label.rb +11 -1
  56. data/lib/rdoc/markup/to_rdoc.rb +11 -3
  57. data/lib/rdoc/markup/verbatim.rb +1 -1
  58. data/lib/rdoc/markup.rb +3 -2
  59. data/lib/rdoc/options.rb +1 -1
  60. data/lib/rdoc/parser/changelog.rb +8 -0
  61. data/lib/rdoc/rubygems_hook.rb +3 -3
  62. data/lib/rdoc/text.rb +15 -0
  63. data/lib/rdoc/token_stream.rb +4 -8
  64. data/lib/rdoc/version.rb +1 -1
  65. data/rdoc.gemspec +3 -3
  66. metadata +12 -10
  67. data/CONTRIBUTING.rdoc +0 -219
  68. data/ExampleMarkdown.md +0 -39
  69. data/ExampleRDoc.rdoc +0 -210
@@ -85,6 +85,16 @@
85
85
  --color-th-background: var(--color-neutral-100);
86
86
  --color-td-background: var(--color-neutral-50);
87
87
 
88
+ /* Search Type Badge Colors */
89
+ --color-search-type-class-bg: #e6f0ff;
90
+ --color-search-type-class-text: #0050a0;
91
+ --color-search-type-module-bg: #e6ffe6;
92
+ --color-search-type-module-text: #060;
93
+ --color-search-type-constant-bg: #fff0e6;
94
+ --color-search-type-constant-text: #995200;
95
+ --color-search-type-method-bg: #f0e6ff;
96
+ --color-search-type-method-text: #5200a0;
97
+
88
98
  /* RGBA Colors (theme-agnostic) */
89
99
  --color-overlay: rgb(0 0 0 / 50%);
90
100
  --color-emphasis-bg: rgb(255 111 97 / 10%);
@@ -142,12 +152,13 @@
142
152
 
143
153
  /* Shadows */
144
154
  --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 10%), 0 1px 2px -1px rgb(0 0 0 / 10%);
155
+ --shadow-md: 0 2px 8px rgb(0 0 0 / 10%);
145
156
  --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 10%), 0 4px 6px -4px rgb(0 0 0 / 10%);
146
157
  --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 10%), 0 8px 10px -6px rgb(0 0 0 / 10%);
147
158
 
148
159
  /* Layout Dimensions */
149
- --layout-sidebar-width: 280px;
150
- --layout-sidebar-width-min: 240px;
160
+ --layout-sidebar-width: 300px;
161
+ --layout-sidebar-width-min: 300px;
151
162
  --layout-sidebar-width-max: 15%;
152
163
  --layout-toc-width-min: 240px;
153
164
  --layout-toc-width-max: 18%;
@@ -158,6 +169,13 @@
158
169
  /* Transitions */
159
170
  --transition-fast: 150ms ease-in-out;
160
171
  --transition-base: 200ms ease-in-out;
172
+ --transition-slow: 350ms ease-in-out;
173
+ --ease-out-smooth: cubic-bezier(0.4, 0, 0.2, 1);
174
+
175
+ /* Animation Durations */
176
+ --duration-fast: 250ms;
177
+ --duration-base: 300ms;
178
+ --duration-medium: 350ms;
161
179
 
162
180
  /* Z-Index Scale */
163
181
  --z-fixed: 300;
@@ -202,6 +220,7 @@
202
220
  --color-accent-primary: var(--color-primary-500);
203
221
  --color-accent-hover: var(--color-primary-400);
204
222
  --color-accent-subtle: rgb(235 84 79 / 10%);
223
+ --color-accent-subtle-hover: rgb(235 84 79 / 20%);
205
224
  --color-code-bg: var(--color-neutral-800);
206
225
  --color-code-border: var(--color-neutral-700);
207
226
  --color-nav-bg: var(--color-neutral-900);
@@ -209,8 +228,19 @@
209
228
  --color-th-background: var(--color-background-tertiary);
210
229
  --color-td-background: var(--color-background-secondary);
211
230
 
231
+ /* Search Type Badge Colors - Dark Theme */
232
+ --color-search-type-class-bg: #1e3a5f;
233
+ --color-search-type-class-text: #93c5fd;
234
+ --color-search-type-module-bg: #14532d;
235
+ --color-search-type-module-text: #86efac;
236
+ --color-search-type-constant-bg: #451a03;
237
+ --color-search-type-constant-text: #fcd34d;
238
+ --color-search-type-method-bg: #3b0764;
239
+ --color-search-type-method-text: #d8b4fe;
240
+
212
241
  /* Dark theme shadows (slightly more subtle) */
213
242
  --shadow-sm: 0 1px 3px 0 rgb(0 0 0 / 40%), 0 1px 2px -1px rgb(0 0 0 / 40%);
243
+ --shadow-md: 0 2px 8px rgb(0 0 0 / 40%);
214
244
  --shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 40%), 0 4px 6px -4px rgb(0 0 0 / 40%);
215
245
  --shadow-xl: 0 20px 25px -5px rgb(0 0 0 / 40%), 0 8px 10px -6px rgb(0 0 0 / 40%);
216
246
 
@@ -228,13 +258,13 @@ body {
228
258
 
229
259
  /* Grid layout with header, sidebar, main, and footer */
230
260
  display: grid;
231
- grid-template: "header header" var(--layout-header-height) "nav main" 1fr "nav footer" auto / minmax(var(--layout-sidebar-width-min), var(--layout-sidebar-width-max)) 1fr;
261
+ grid-template: "header header" var(--layout-header-height) "nav main" 1fr "nav footer" auto / var(--layout-sidebar-width) 1fr;
232
262
  min-height: 100vh;
233
263
  }
234
264
 
235
265
  /* Three-column layout when TOC is present */
236
266
  body.has-toc {
237
- grid-template: "header header header" var(--layout-header-height) "nav main toc" 1fr "nav footer toc" auto / minmax(var(--layout-sidebar-width-min), var(--layout-sidebar-width-max)) 1fr minmax(var(--layout-toc-width-min), var(--layout-toc-width-max));
267
+ grid-template: "header header header" var(--layout-header-height) "nav main toc" 1fr "nav footer toc" auto / var(--layout-sidebar-width) 1fr minmax(var(--layout-toc-width-min), var(--layout-toc-width-max));
238
268
  min-height: 100vh;
239
269
  }
240
270
 
@@ -291,7 +321,12 @@ pre {
291
321
  border-radius: var(--radius-sm);
292
322
  cursor: pointer;
293
323
  opacity: 0.6;
294
- transition: opacity var(--transition-fast), background var(--transition-fast), border-color var(--transition-fast), transform var(--transition-fast);
324
+ transition:
325
+ opacity var(--transition-fast),
326
+ background var(--transition-fast),
327
+ border-color var(--transition-fast),
328
+ transform var(--transition-fast),
329
+ box-shadow var(--transition-fast);
295
330
  display: flex;
296
331
  align-items: center;
297
332
  justify-content: center;
@@ -305,10 +340,18 @@ pre {
305
340
  opacity: 1;
306
341
  background: var(--color-background-tertiary);
307
342
  border-color: var(--color-border-emphasis);
343
+ transform: translateY(-1px);
344
+ box-shadow: var(--shadow-md);
345
+ }
346
+
347
+ .copy-code-button:focus {
348
+ outline: none;
349
+ box-shadow: 0 0 0 3px var(--color-accent-subtle);
308
350
  }
309
351
 
310
352
  .copy-code-button:active {
311
- transform: scale(0.95);
353
+ transform: scale(0.92);
354
+ box-shadow: none;
312
355
  }
313
356
 
314
357
  .copy-code-button svg {
@@ -320,7 +363,7 @@ pre {
320
363
  stroke-linecap: round;
321
364
  stroke-linejoin: round;
322
365
  color: var(--color-text-secondary);
323
- transition: color var(--transition-fast);
366
+ transition: color var(--transition-fast), transform var(--transition-base);
324
367
  }
325
368
 
326
369
  .copy-code-button:hover svg {
@@ -457,7 +500,11 @@ header.top-navbar .navbar-search form {
457
500
  border-radius: var(--radius-md);
458
501
  color: var(--color-text-primary);
459
502
  cursor: pointer;
460
- transition: background var(--transition-fast), border-color var(--transition-fast), color var(--transition-fast);
503
+ transition:
504
+ background var(--transition-fast),
505
+ border-color var(--transition-fast),
506
+ color var(--transition-fast),
507
+ transform var(--transition-fast);
461
508
  font-size: var(--font-size-lg);
462
509
  line-height: 1;
463
510
  width: 2.5rem;
@@ -468,6 +515,7 @@ header.top-navbar .navbar-search form {
468
515
  background: var(--color-background-secondary);
469
516
  border-color: var(--color-accent-primary);
470
517
  color: var(--color-accent-primary);
518
+ transform: scale(1.05);
471
519
  }
472
520
 
473
521
  .theme-toggle:focus {
@@ -476,13 +524,17 @@ header.top-navbar .navbar-search form {
476
524
  box-shadow: 0 0 0 3px var(--color-accent-subtle);
477
525
  }
478
526
 
527
+ .theme-toggle:active {
528
+ transform: scale(0.95);
529
+ }
530
+
479
531
  .theme-toggle-icon {
480
532
  display: inline-block;
481
- transition: transform var(--transition-base);
533
+ transition: transform var(--duration-base) var(--ease-out-smooth);
482
534
  }
483
535
 
484
536
  .theme-toggle:hover .theme-toggle-icon {
485
- transform: rotate(20deg);
537
+ transform: rotate(15deg) scale(1.1);
486
538
  }
487
539
 
488
540
  /* Mobile navbar */
@@ -537,12 +589,33 @@ nav {
537
589
  background: var(--color-nav-bg);
538
590
  color: var(--color-nav-text);
539
591
  overflow: hidden auto;
592
+ overscroll-behavior: contain;
540
593
  display: flex;
541
594
  flex-direction: column;
542
595
  position: sticky;
543
596
  top: var(--layout-header-height);
544
597
  height: calc(100vh - var(--layout-header-height));
545
- align-self: start;
598
+ scrollbar-width: thin;
599
+ scrollbar-color: var(--color-border-default) transparent;
600
+ }
601
+
602
+ /* Custom scrollbar for WebKit browsers */
603
+ nav::-webkit-scrollbar {
604
+ width: 6px;
605
+ }
606
+
607
+ nav::-webkit-scrollbar-track {
608
+ background: transparent;
609
+ }
610
+
611
+ nav::-webkit-scrollbar-thumb {
612
+ background: var(--color-border-default);
613
+ border-radius: var(--radius-sm);
614
+ transition: background var(--transition-fast);
615
+ }
616
+
617
+ nav::-webkit-scrollbar-thumb:hover {
618
+ background: var(--color-border-emphasis);
546
619
  }
547
620
 
548
621
  /* Mobile navigation */
@@ -616,6 +689,17 @@ nav ul li {
616
689
  line-height: var(--line-height-relaxed);
617
690
  }
618
691
 
692
+ nav ul li a {
693
+ transition:
694
+ color var(--transition-fast),
695
+ transform var(--transition-fast),
696
+ padding var(--transition-fast);
697
+ }
698
+
699
+ nav ul li a:hover {
700
+ padding-left: var(--space-1);
701
+ }
702
+
619
703
  nav ul ul {
620
704
  padding-left: var(--space-5);
621
705
  margin-top: var(--space-2);
@@ -633,6 +717,17 @@ nav a {
633
717
  text-decoration: none;
634
718
  }
635
719
 
720
+ /* Truncation for direct nav links (not links inside code tags) */
721
+ nav .nav-list > li > a,
722
+ nav .nav-section > ul > li > a,
723
+ nav .nav-section > dl > dd > a {
724
+ display: block;
725
+ max-width: 100%;
726
+ overflow: hidden;
727
+ text-overflow: ellipsis;
728
+ white-space: nowrap;
729
+ }
730
+
636
731
  nav footer {
637
732
  padding: var(--space-4);
638
733
  border-top: 1px solid var(--color-border-default);
@@ -664,6 +759,8 @@ nav footer a {
664
759
  cursor: pointer;
665
760
  transition: color var(--transition-fast);
666
761
  line-height: 1;
762
+ user-select: none;
763
+ -webkit-user-select: none;
667
764
  }
668
765
 
669
766
  #navigation-toggle:hover {
@@ -671,31 +768,153 @@ nav footer a {
671
768
  }
672
769
  }
673
770
 
674
- nav ul li details > summary {
675
- list-style: none; /* Remove the default marker */
676
- position: relative; /* So that the open/close triangle can position itself absolutely inside */
771
+ /*
772
+ * Shared Collapsible Animation using ::details-content pseudo-element.
773
+ * This is the modern CSS approach for animating <details> elements.
774
+ * Uses block-size animation with interpolate-size for smooth height transitions.
775
+ * Both nav-section-collapsible and nested link-list details share this pattern.
776
+ */
777
+ nav details {
778
+ interpolate-size: allow-keywords;
677
779
  }
678
780
 
679
- nav ul li details > summary::-webkit-details-marker {
680
- display: none; /* Removes the default marker, in Safari 18. */
781
+ nav details::details-content {
782
+ overflow: hidden;
783
+ block-size: 0;
784
+ transition: block-size 200ms ease, content-visibility 200ms ease allow-discrete;
681
785
  }
682
786
 
683
- nav ul li details > summary::after {
684
- content: '▶'; /* Unicode right-pointing triangle */
685
- position: absolute;
686
- font-size: 0.8em;
687
- bottom: 0.1em;
688
- margin-left: 0.3em;
787
+ nav details[open]::details-content {
788
+ block-size: auto;
789
+ }
790
+
791
+ /* Collapsible Navigation Section Headers */
792
+
793
+ nav .nav-section-header {
794
+ display: flex;
795
+ align-items: center;
796
+ gap: var(--space-3);
797
+ padding: var(--space-3) 0;
798
+ cursor: pointer;
799
+ list-style: none;
800
+ user-select: none;
801
+ -webkit-user-select: none;
802
+ border-bottom: 1px solid var(--color-border-default);
803
+ margin-bottom: var(--space-3);
804
+ transition: color var(--transition-fast);
805
+ }
806
+
807
+ nav .nav-section-header::-webkit-details-marker {
808
+ display: none;
809
+ }
810
+
811
+ nav .nav-section-header:hover {
812
+ color: var(--color-accent-primary);
813
+ }
814
+
815
+ nav .nav-section-icon {
816
+ display: flex;
817
+ align-items: center;
818
+ justify-content: center;
819
+ width: 1.25rem;
820
+ height: 1.25rem;
821
+ flex-shrink: 0;
822
+ color: var(--color-accent-primary);
823
+ }
824
+
825
+ nav .nav-section-icon svg {
826
+ width: 100%;
827
+ height: 100%;
828
+ }
829
+
830
+ nav .nav-section-title {
831
+ font-size: var(--font-size-base);
832
+ font-weight: var(--font-weight-semibold);
833
+ color: inherit;
834
+ flex: 1;
835
+ min-width: 0;
836
+ overflow: hidden;
837
+ text-overflow: ellipsis;
838
+ white-space: nowrap;
839
+ }
840
+
841
+ nav .nav-section-chevron {
842
+ display: flex;
843
+ align-items: center;
844
+ justify-content: center;
845
+ width: 1rem;
846
+ height: 1rem;
847
+ flex-shrink: 0;
848
+ color: var(--color-text-tertiary);
689
849
  transition: transform var(--transition-base);
690
850
  }
691
851
 
692
- nav ul li details[open] > summary::after {
693
- transform: rotate(90deg); /* Rotate the triangle when open */
852
+ nav .nav-section-chevron svg {
853
+ width: 100%;
854
+ height: 100%;
694
855
  }
695
856
 
696
- /* Global link hover state is defined after navigation to keep specificity ordering */
697
- a:hover {
698
- color: var(--color-link-hover);
857
+ /* Rotate chevron when open */
858
+ nav .nav-section-collapsible[open] > .nav-section-header .nav-section-chevron {
859
+ transform: rotate(90deg);
860
+ }
861
+
862
+ nav .nav-section-collapsible > ul,
863
+ nav .nav-section-collapsible > dl,
864
+ nav .nav-section-collapsible > p {
865
+ margin-top: 0;
866
+ }
867
+
868
+ nav .nav-section-collapsible > .nav-list {
869
+ padding-left: var(--space-5);
870
+ border-left: 1px solid var(--color-border-subtle);
871
+ margin-left: 9px; /* Align with the section icon center */
872
+ }
873
+
874
+ nav .nav-section-collapsible .nav-list .link-list {
875
+ border-left: none;
876
+ margin-left: 0;
877
+ padding-left: var(--space-5);
878
+ }
879
+
880
+ /*
881
+ Improve chevron styling for details under link-list, using SVG chevron that matches nav-section-chevron
882
+ We need to avoid adding the element in class content generation so it doesn't break darkfish styles
883
+ */
884
+ nav li details:has(.link-list) > summary {
885
+ display: inline-flex;
886
+ align-items: center;
887
+ gap: var(--space-2);
888
+ cursor: pointer;
889
+ }
890
+
891
+ nav li details:has(.link-list) > summary::after {
892
+ content: '';
893
+ position: static;
894
+ display: inline-block;
895
+ width: 1rem;
896
+ height: 1rem;
897
+ flex-shrink: 0;
898
+ margin-left: 0;
899
+ background-color: var(--color-text-secondary);
900
+ mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='9 18 15 12 9 6'%3E%3C/polyline%3E%3C/svg%3E");
901
+ mask-size: contain;
902
+ mask-repeat: no-repeat;
903
+ mask-position: center;
904
+ -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='9 18 15 12 9 6'%3E%3C/polyline%3E%3C/svg%3E");
905
+ -webkit-mask-size: contain;
906
+ -webkit-mask-repeat: no-repeat;
907
+ -webkit-mask-position: center;
908
+ transition: transform var(--transition-base), background-color var(--transition-fast);
909
+ }
910
+
911
+ nav li details:has(.link-list) > summary:hover::after {
912
+ background-color: var(--color-accent-primary);
913
+ }
914
+
915
+ nav li details:has(.link-list)[open] > summary::after {
916
+ transform: rotate(90deg);
917
+ background-color: var(--color-accent-primary);
699
918
  }
700
919
 
701
920
  /* 8. Main Content (Center Column) */
@@ -971,6 +1190,26 @@ main .anchor-link:target {
971
1190
  scroll-margin-top: calc(var(--layout-header-height) + 2rem);
972
1191
  }
973
1192
 
1193
+ /* Legacy anchor for backward compatibility with old label- prefix links */
1194
+ .legacy-anchor {
1195
+ display: block;
1196
+ position: relative;
1197
+ visibility: hidden;
1198
+ scroll-margin-top: calc(var(--layout-header-height) + 2rem);
1199
+ }
1200
+
1201
+ /* When a legacy anchor is targeted, highlight the next heading sibling */
1202
+ .legacy-anchor:target + h1,
1203
+ .legacy-anchor:target + h2,
1204
+ .legacy-anchor:target + h3,
1205
+ .legacy-anchor:target + h4,
1206
+ .legacy-anchor:target + h5,
1207
+ .legacy-anchor:target + h6 {
1208
+ margin-left: calc(-1 * var(--space-5));
1209
+ padding-left: calc(var(--space-5) / 2);
1210
+ border-left: calc(var(--space-5) / 2) solid var(--color-border-default);
1211
+ }
1212
+
974
1213
 
975
1214
  /* Utility Classes */
976
1215
  .hide { display: none !important; }
@@ -995,17 +1234,54 @@ main .anchor-link:target {
995
1234
  main .method-source-code {
996
1235
  visibility: hidden;
997
1236
  max-height: 0;
998
- overflow: auto;
999
- transition: max-height var(--transition-base), visibility var(--transition-base);
1237
+ overflow: hidden;
1238
+ opacity: 0;
1239
+ transform: translateY(-8px);
1240
+ transition:
1241
+ max-height var(--duration-medium) var(--ease-out-smooth),
1242
+ visibility var(--duration-medium),
1243
+ opacity var(--duration-fast) ease-out,
1244
+ transform var(--duration-fast) ease-out;
1000
1245
  }
1001
1246
 
1002
1247
  main .method-source-code pre {
1003
1248
  border-color: var(--color-accent-hover);
1249
+ border-left: 3px solid var(--color-accent-primary);
1250
+ width: 100%;
1251
+ box-sizing: border-box;
1252
+ transition: border-color var(--transition-fast);
1253
+ scrollbar-width: thin;
1254
+ scrollbar-color: var(--color-border-default) transparent;
1255
+ }
1256
+
1257
+ main .method-source-code pre::-webkit-scrollbar {
1258
+ width: 6px;
1259
+ height: 6px;
1260
+ }
1261
+
1262
+ main .method-source-code pre::-webkit-scrollbar-track {
1263
+ background: transparent;
1264
+ }
1265
+
1266
+ main .method-source-code pre::-webkit-scrollbar-thumb {
1267
+ background: var(--color-border-default);
1268
+ border-radius: var(--radius-sm);
1269
+ }
1270
+
1271
+ main .method-source-code pre::-webkit-scrollbar-thumb:hover {
1272
+ background: var(--color-border-emphasis);
1273
+ }
1274
+
1275
+ main .method-source-code pre::-webkit-scrollbar-corner {
1276
+ background: transparent;
1004
1277
  }
1005
1278
 
1006
1279
  main .method-source-code.active-menu {
1007
1280
  visibility: visible;
1008
1281
  max-height: 100vh;
1282
+ overflow: auto;
1283
+ opacity: 1;
1284
+ transform: translateY(0);
1009
1285
  }
1010
1286
 
1011
1287
  main .method-description .method-calls-super {
@@ -1025,6 +1301,7 @@ main .method-detail:target {
1025
1301
 
1026
1302
  main .method-header {
1027
1303
  display: inline-block;
1304
+ max-width: calc(100% - 6em); /* 6em is the width of the source code toggle */
1028
1305
  }
1029
1306
 
1030
1307
  main .method-heading {
@@ -1044,10 +1321,47 @@ main .method-heading .method-args {
1044
1321
  }
1045
1322
 
1046
1323
  main .method-controls {
1047
- line-height: 20px;
1048
1324
  float: right;
1049
- color: var(--color-accent-hover);
1325
+ }
1326
+
1327
+ main .method-controls summary {
1328
+ display: inline-block;
1329
+ line-height: 20px;
1330
+ color: var(--color-accent-primary);
1050
1331
  cursor: pointer;
1332
+ padding: var(--space-1) var(--space-3);
1333
+ border-radius: var(--radius-sm);
1334
+ font-size: var(--font-size-sm);
1335
+ font-weight: var(--font-weight-medium);
1336
+ background: var(--color-accent-subtle);
1337
+ border: 1px solid transparent;
1338
+ transition:
1339
+ color var(--transition-fast),
1340
+ background var(--transition-fast),
1341
+ border-color var(--transition-fast),
1342
+ transform var(--transition-fast);
1343
+ user-select: none;
1344
+ -webkit-user-select: none;
1345
+ list-style: none;
1346
+ }
1347
+
1348
+ main .method-controls summary::-webkit-details-marker {
1349
+ display: none;
1350
+ }
1351
+
1352
+ main .method-controls summary:hover {
1353
+ background: var(--color-primary-100);
1354
+ border-color: var(--color-primary-300);
1355
+ transform: translateY(-1px);
1356
+ }
1357
+
1358
+ main .method-controls summary:active {
1359
+ transform: scale(0.96);
1360
+ }
1361
+
1362
+ [data-theme="dark"] main .method-controls summary:hover {
1363
+ background: var(--color-accent-subtle-hover);
1364
+ border-color: var(--color-primary-500);
1051
1365
  }
1052
1366
 
1053
1367
  main .method-description,
@@ -1316,6 +1630,14 @@ aside.table-of-contents .toc-sticky nav {
1316
1630
  height: auto;
1317
1631
  }
1318
1632
 
1633
+ aside.table-of-contents .toc-list > .toc-h2 {
1634
+ margin-left: var(--space-4);
1635
+ }
1636
+
1637
+ aside.table-of-contents .toc-list > .toc-h3 {
1638
+ margin-left: var(--space-8);
1639
+ }
1640
+
1319
1641
  /* Hide TOC on mobile/tablet */
1320
1642
  @media (width <= 1279px) {
1321
1643
  aside.table-of-contents {
@@ -1323,7 +1645,7 @@ aside.table-of-contents .toc-sticky nav {
1323
1645
  }
1324
1646
 
1325
1647
  body.has-toc {
1326
- grid-template-columns: minmax(var(--layout-sidebar-width-min), var(--layout-sidebar-width-max)) 1fr;
1648
+ grid-template-columns: var(--layout-sidebar-width) 1fr;
1327
1649
  grid-template-areas:
1328
1650
  "header header"
1329
1651
  "nav main"
@@ -1333,10 +1655,6 @@ aside.table-of-contents .toc-sticky nav {
1333
1655
 
1334
1656
  /* Tablet adjustments (between mobile and desktop) */
1335
1657
  @media (width >= 768px) and (width <= 1023px) {
1336
- nav {
1337
- width: 240px;
1338
- }
1339
-
1340
1658
  header.top-navbar {
1341
1659
  padding: 0 var(--space-6);
1342
1660
  }
@@ -1512,55 +1830,88 @@ footer.site-footer .footer-bottom:first-child {
1512
1830
  }
1513
1831
 
1514
1832
  /* Search Results */
1515
- #search-results {
1833
+ .search-results {
1516
1834
  font-family: var(--font-primary);
1517
1835
  font-weight: 300;
1518
1836
  }
1519
1837
 
1520
- #search-results a {
1838
+ .search-results a {
1521
1839
  color: var(--color-text-primary);
1522
1840
  }
1523
1841
 
1524
- #search-results a:hover {
1842
+ .search-results a:hover {
1525
1843
  color: var(--color-accent-primary);
1526
1844
  }
1527
1845
 
1528
- #search-results .search-match {
1846
+ .search-results .search-match {
1529
1847
  font-family: var(--font-heading);
1530
1848
  font-weight: normal;
1531
1849
  }
1532
1850
 
1533
- #search-results .search-selected {
1851
+ .search-results .search-selected {
1534
1852
  background: var(--color-code-bg);
1535
1853
  border-bottom: 1px solid transparent;
1536
1854
  }
1537
1855
 
1538
- #search-results li {
1856
+ .search-results li {
1539
1857
  list-style: none;
1540
1858
  border-bottom: 1px solid var(--color-border-default);
1541
1859
  margin-bottom: 0.5em;
1542
1860
  }
1543
1861
 
1544
- #search-results li:last-child {
1862
+ .search-results li:last-child {
1545
1863
  border-bottom: none;
1546
1864
  margin-bottom: 0;
1547
1865
  }
1548
1866
 
1549
- #search-results li p {
1867
+ .search-results li p {
1550
1868
  padding: 0;
1551
1869
  margin: 0.5em;
1552
1870
  }
1553
1871
 
1554
- #search-results .search-namespace {
1872
+ .search-results .search-namespace {
1555
1873
  font-weight: bold;
1556
1874
  }
1557
1875
 
1558
- #search-results li em {
1876
+ .search-results .search-type {
1877
+ display: inline-block;
1878
+ margin-left: var(--space-2);
1879
+ padding: 0 var(--space-2);
1880
+ font-size: var(--font-size-xs);
1881
+ font-weight: 500;
1882
+ border-radius: var(--radius-sm);
1883
+ vertical-align: middle;
1884
+ background: var(--color-background-tertiary);
1885
+ color: var(--color-text-secondary);
1886
+ }
1887
+
1888
+ .search-results .search-type-class {
1889
+ background: var(--color-search-type-class-bg);
1890
+ color: var(--color-search-type-class-text);
1891
+ }
1892
+
1893
+ .search-results .search-type-module {
1894
+ background: var(--color-search-type-module-bg);
1895
+ color: var(--color-search-type-module-text);
1896
+ }
1897
+
1898
+ .search-results .search-type-constant {
1899
+ background: var(--color-search-type-constant-bg);
1900
+ color: var(--color-search-type-constant-text);
1901
+ }
1902
+
1903
+ .search-results .search-type-instance-method,
1904
+ .search-results .search-type-class-method {
1905
+ background: var(--color-search-type-method-bg);
1906
+ color: var(--color-search-type-method-text);
1907
+ }
1908
+
1909
+ .search-results li em {
1559
1910
  background-color: var(--color-search-highlight-bg);
1560
1911
  font-style: normal;
1561
1912
  }
1562
1913
 
1563
- #search-results pre {
1914
+ .search-results pre {
1564
1915
  margin: 0.5em;
1565
1916
  font-family: var(--font-code);
1566
1917
  }
@@ -1587,7 +1938,7 @@ header.top-navbar #search-field::placeholder {
1587
1938
  }
1588
1939
 
1589
1940
  /* Search results dropdown in navbar */
1590
- header.top-navbar #search-results {
1941
+ header.top-navbar #search-results-desktop {
1591
1942
  position: absolute;
1592
1943
  top: calc(100% + var(--space-2));
1593
1944
  left: 0;
@@ -1603,10 +1954,10 @@ header.top-navbar #search-results {
1603
1954
  padding: 0;
1604
1955
  }
1605
1956
 
1606
- header.top-navbar #search-results.initially-hidden {
1957
+ header.top-navbar #search-results-desktop.initially-hidden {
1607
1958
  display: none;
1608
1959
  }
1609
1960
 
1610
- header.top-navbar #search-results[aria-expanded="false"] {
1961
+ header.top-navbar #search-results-desktop[aria-expanded="false"] {
1611
1962
  display: none;
1612
1963
  }