docyard 0.7.0 → 0.9.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 (155) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +5 -1
  3. data/CHANGELOG.md +43 -1
  4. data/lib/docyard/build/asset_bundler.rb +22 -7
  5. data/lib/docyard/build/file_copier.rb +49 -27
  6. data/lib/docyard/build/sitemap_generator.rb +6 -6
  7. data/lib/docyard/build/static_generator.rb +85 -12
  8. data/lib/docyard/builder.rb +6 -6
  9. data/lib/docyard/components/aliases.rb +12 -0
  10. data/lib/docyard/components/processors/abbreviation_processor.rb +72 -0
  11. data/lib/docyard/components/processors/accordion_processor.rb +81 -0
  12. data/lib/docyard/components/processors/badge_processor.rb +72 -0
  13. data/lib/docyard/components/processors/callout_processor.rb +8 -2
  14. data/lib/docyard/components/processors/cards_processor.rb +100 -0
  15. data/lib/docyard/components/processors/code_block_options_preprocessor.rb +23 -2
  16. data/lib/docyard/components/processors/code_block_processor.rb +6 -0
  17. data/lib/docyard/components/processors/code_group_processor.rb +198 -0
  18. data/lib/docyard/components/processors/code_snippet_import_preprocessor.rb +6 -1
  19. data/lib/docyard/components/processors/custom_anchor_processor.rb +42 -0
  20. data/lib/docyard/components/processors/file_tree_processor.rb +151 -0
  21. data/lib/docyard/components/processors/image_caption_processor.rb +96 -0
  22. data/lib/docyard/components/processors/include_processor.rb +86 -0
  23. data/lib/docyard/components/processors/steps_processor.rb +89 -0
  24. data/lib/docyard/components/processors/tabs_processor.rb +9 -1
  25. data/lib/docyard/components/processors/tooltip_processor.rb +57 -0
  26. data/lib/docyard/components/processors/video_embed_processor.rb +196 -0
  27. data/lib/docyard/components/support/code_group/html_builder.rb +122 -0
  28. data/lib/docyard/components/support/markdown_code_block_helper.rb +56 -0
  29. data/lib/docyard/config/branding_resolver.rb +121 -17
  30. data/lib/docyard/config/constants.rb +6 -4
  31. data/lib/docyard/config/logo_detector.rb +39 -0
  32. data/lib/docyard/config/validator.rb +122 -99
  33. data/lib/docyard/config.rb +40 -42
  34. data/lib/docyard/initializer.rb +15 -76
  35. data/lib/docyard/navigation/breadcrumb_builder.rb +133 -0
  36. data/lib/docyard/navigation/prev_next_builder.rb +4 -1
  37. data/lib/docyard/navigation/sidebar/children_discoverer.rb +51 -0
  38. data/lib/docyard/navigation/sidebar/config_parser.rb +136 -108
  39. data/lib/docyard/navigation/sidebar/file_resolver.rb +90 -0
  40. data/lib/docyard/navigation/sidebar/file_system_scanner.rb +2 -1
  41. data/lib/docyard/navigation/sidebar/item.rb +50 -7
  42. data/lib/docyard/navigation/sidebar/local_config_loader.rb +51 -0
  43. data/lib/docyard/navigation/sidebar/metadata_extractor.rb +71 -0
  44. data/lib/docyard/navigation/sidebar/metadata_reader.rb +51 -0
  45. data/lib/docyard/navigation/sidebar/path_prefixer.rb +34 -0
  46. data/lib/docyard/navigation/sidebar/renderer.rb +60 -38
  47. data/lib/docyard/navigation/sidebar/sorter.rb +21 -0
  48. data/lib/docyard/navigation/sidebar/tree_builder.rb +100 -26
  49. data/lib/docyard/navigation/sidebar/tree_filter.rb +55 -0
  50. data/lib/docyard/navigation/sidebar_builder.rb +105 -36
  51. data/lib/docyard/rendering/icon_helpers.rb +13 -0
  52. data/lib/docyard/rendering/icons/phosphor.rb +26 -1
  53. data/lib/docyard/rendering/markdown.rb +29 -1
  54. data/lib/docyard/rendering/renderer.rb +75 -34
  55. data/lib/docyard/rendering/template_resolver.rb +172 -0
  56. data/lib/docyard/routing/fallback_resolver.rb +92 -0
  57. data/lib/docyard/search/build_indexer.rb +1 -1
  58. data/lib/docyard/search/dev_indexer.rb +51 -6
  59. data/lib/docyard/search/pagefind_support.rb +2 -0
  60. data/lib/docyard/server/asset_handler.rb +25 -19
  61. data/lib/docyard/server/pagefind_handler.rb +63 -0
  62. data/lib/docyard/server/preview_server.rb +1 -1
  63. data/lib/docyard/server/rack_application.rb +81 -64
  64. data/lib/docyard/templates/assets/css/code.css +18 -51
  65. data/lib/docyard/templates/assets/css/components/abbreviation.css +86 -0
  66. data/lib/docyard/templates/assets/css/components/accordion.css +138 -0
  67. data/lib/docyard/templates/assets/css/components/badges.css +47 -0
  68. data/lib/docyard/templates/assets/css/components/banner.css +202 -0
  69. data/lib/docyard/templates/assets/css/components/breadcrumbs.css +143 -0
  70. data/lib/docyard/templates/assets/css/components/callout.css +67 -67
  71. data/lib/docyard/templates/assets/css/components/cards.css +100 -0
  72. data/lib/docyard/templates/assets/css/components/code-block.css +190 -282
  73. data/lib/docyard/templates/assets/css/components/code-group.css +281 -0
  74. data/lib/docyard/templates/assets/css/components/figure.css +22 -0
  75. data/lib/docyard/templates/assets/css/components/file-tree.css +124 -0
  76. data/lib/docyard/templates/assets/css/components/heading-anchor.css +36 -15
  77. data/lib/docyard/templates/assets/css/components/icon.css +0 -1
  78. data/lib/docyard/templates/assets/css/components/lightbox.css +65 -0
  79. data/lib/docyard/templates/assets/css/components/logo.css +0 -2
  80. data/lib/docyard/templates/assets/css/components/nav-menu.css +237 -0
  81. data/lib/docyard/templates/assets/css/components/navigation.css +193 -167
  82. data/lib/docyard/templates/assets/css/components/prev-next.css +68 -48
  83. data/lib/docyard/templates/assets/css/components/search.css +186 -174
  84. data/lib/docyard/templates/assets/css/components/steps.css +122 -0
  85. data/lib/docyard/templates/assets/css/components/tab-bar.css +163 -0
  86. data/lib/docyard/templates/assets/css/components/table-of-contents.css +127 -114
  87. data/lib/docyard/templates/assets/css/components/tabs.css +119 -160
  88. data/lib/docyard/templates/assets/css/components/theme-toggle.css +48 -44
  89. data/lib/docyard/templates/assets/css/components/tooltip.css +113 -0
  90. data/lib/docyard/templates/assets/css/components/video.css +41 -0
  91. data/lib/docyard/templates/assets/css/landing.css +815 -0
  92. data/lib/docyard/templates/assets/css/layout.css +489 -87
  93. data/lib/docyard/templates/assets/css/main.css +1 -3
  94. data/lib/docyard/templates/assets/css/markdown.css +113 -93
  95. data/lib/docyard/templates/assets/css/reset.css +0 -3
  96. data/lib/docyard/templates/assets/css/typography.css +43 -41
  97. data/lib/docyard/templates/assets/css/variables.css +268 -208
  98. data/lib/docyard/templates/assets/favicon.svg +7 -8
  99. data/lib/docyard/templates/assets/fonts/Inter-Variable.ttf +0 -0
  100. data/lib/docyard/templates/assets/js/components/abbreviation.js +85 -0
  101. data/lib/docyard/templates/assets/js/components/banner.js +81 -0
  102. data/lib/docyard/templates/assets/js/components/code-block.js +24 -42
  103. data/lib/docyard/templates/assets/js/components/code-group.js +283 -0
  104. data/lib/docyard/templates/assets/js/components/file-tree.js +39 -0
  105. data/lib/docyard/templates/assets/js/components/heading-anchor.js +26 -24
  106. data/lib/docyard/templates/assets/js/components/lightbox.js +72 -0
  107. data/lib/docyard/templates/assets/js/components/navigation.js +181 -70
  108. data/lib/docyard/templates/assets/js/components/search.js +0 -75
  109. data/lib/docyard/templates/assets/js/components/sidebar-toggle.js +29 -0
  110. data/lib/docyard/templates/assets/js/components/tab-navigation.js +145 -0
  111. data/lib/docyard/templates/assets/js/components/table-of-contents.js +153 -66
  112. data/lib/docyard/templates/assets/js/components/tabs.js +31 -69
  113. data/lib/docyard/templates/assets/js/components/tooltip.js +118 -0
  114. data/lib/docyard/templates/assets/js/theme.js +0 -3
  115. data/lib/docyard/templates/assets/logo-dark.svg +8 -2
  116. data/lib/docyard/templates/assets/logo.svg +7 -4
  117. data/lib/docyard/templates/config/docyard.yml.erb +37 -34
  118. data/lib/docyard/templates/errors/404.html.erb +1 -1
  119. data/lib/docyard/templates/errors/500.html.erb +1 -1
  120. data/lib/docyard/templates/layouts/default.html.erb +19 -67
  121. data/lib/docyard/templates/layouts/splash.html.erb +177 -0
  122. data/lib/docyard/templates/partials/_accordion.html.erb +9 -0
  123. data/lib/docyard/templates/partials/_banner.html.erb +27 -0
  124. data/lib/docyard/templates/partials/_breadcrumbs.html.erb +24 -0
  125. data/lib/docyard/templates/partials/_card.html.erb +23 -0
  126. data/lib/docyard/templates/partials/_code_block.html.erb +5 -3
  127. data/lib/docyard/templates/partials/_doc_footer.html.erb +25 -0
  128. data/lib/docyard/templates/partials/_features.html.erb +15 -0
  129. data/lib/docyard/templates/partials/_footer.html.erb +42 -0
  130. data/lib/docyard/templates/partials/_head.html.erb +22 -0
  131. data/lib/docyard/templates/partials/_header.html.erb +49 -0
  132. data/lib/docyard/templates/partials/_heading_anchor.html.erb +3 -1
  133. data/lib/docyard/templates/partials/_hero.html.erb +27 -0
  134. data/lib/docyard/templates/partials/_nav_group.html.erb +31 -11
  135. data/lib/docyard/templates/partials/_nav_leaf.html.erb +4 -1
  136. data/lib/docyard/templates/partials/_nav_menu.html.erb +42 -0
  137. data/lib/docyard/templates/partials/_nav_nested_section.html.erb +11 -0
  138. data/lib/docyard/templates/partials/_nav_section.html.erb +1 -1
  139. data/lib/docyard/templates/partials/_prev_next.html.erb +8 -2
  140. data/lib/docyard/templates/partials/_scripts.html.erb +7 -0
  141. data/lib/docyard/templates/partials/_search_modal.html.erb +2 -6
  142. data/lib/docyard/templates/partials/_search_trigger.html.erb +2 -6
  143. data/lib/docyard/templates/partials/_sidebar.html.erb +21 -4
  144. data/lib/docyard/templates/partials/_step.html.erb +14 -0
  145. data/lib/docyard/templates/partials/_tab_bar.html.erb +25 -0
  146. data/lib/docyard/templates/partials/_table_of_contents.html.erb +12 -12
  147. data/lib/docyard/templates/partials/_table_of_contents_toggle.html.erb +1 -3
  148. data/lib/docyard/templates/partials/_tabs.html.erb +2 -2
  149. data/lib/docyard/templates/partials/_theme_toggle.html.erb +2 -11
  150. data/lib/docyard/version.rb +1 -1
  151. metadata +70 -5
  152. data/lib/docyard/templates/markdown/getting-started/installation.md.erb +0 -77
  153. data/lib/docyard/templates/markdown/guides/configuration.md.erb +0 -202
  154. data/lib/docyard/templates/markdown/guides/markdown-features.md.erb +0 -247
  155. data/lib/docyard/templates/markdown/index.md.erb +0 -82
@@ -0,0 +1,122 @@
1
+ .docyard-steps {
2
+ margin: var(--spacing-6) 0;
3
+ }
4
+
5
+ .docyard-step {
6
+ display: flex;
7
+ gap: var(--spacing-4);
8
+ position: relative;
9
+ }
10
+
11
+ .docyard-step:not(.docyard-step--last) {
12
+ padding-bottom: var(--spacing-6);
13
+ }
14
+
15
+ .docyard-step__indicator {
16
+ display: flex;
17
+ flex-direction: column;
18
+ align-items: center;
19
+ flex-shrink: 0;
20
+ }
21
+
22
+ .docyard-step__number {
23
+ display: flex;
24
+ align-items: center;
25
+ justify-content: center;
26
+ width: 2rem;
27
+ height: 2rem;
28
+ border-radius: 50%;
29
+ background-color: var(--primary);
30
+ color: var(--primary-foreground);
31
+ font-size: var(--text-sm);
32
+ font-weight: var(--font-semibold);
33
+ flex-shrink: 0;
34
+ }
35
+
36
+ .docyard-step__connector {
37
+ width: 2px;
38
+ flex: 1;
39
+ background-color: var(--border);
40
+ margin-top: var(--spacing-2);
41
+ }
42
+
43
+ .docyard-step__content {
44
+ flex: 1;
45
+ min-width: 0;
46
+ padding-top: var(--spacing-1);
47
+ }
48
+
49
+ .docyard-step__title {
50
+ margin: 0;
51
+ font-size: var(--text-base);
52
+ font-weight: var(--font-semibold);
53
+ color: var(--foreground);
54
+ line-height: var(--leading-tight);
55
+ }
56
+
57
+ .docyard-step__body {
58
+ margin-top: var(--spacing-3);
59
+ font-size: var(--text-sm);
60
+ color: var(--muted-foreground);
61
+ line-height: var(--leading-relaxed);
62
+ }
63
+
64
+ .docyard-step__body > *:first-child {
65
+ margin-top: 0;
66
+ }
67
+
68
+ .docyard-step__body > *:last-child {
69
+ margin-bottom: 0;
70
+ }
71
+
72
+ .docyard-step__body p {
73
+ margin: var(--spacing-2) 0;
74
+ }
75
+
76
+ .docyard-step__body a {
77
+ color: var(--primary);
78
+ text-decoration: underline;
79
+ text-underline-offset: 3px;
80
+ }
81
+
82
+ .docyard-step__body a:hover {
83
+ color: var(--foreground);
84
+ }
85
+
86
+ .docyard-step__body pre {
87
+ margin: var(--spacing-4) 0;
88
+ border-radius: var(--radius-lg);
89
+ }
90
+
91
+ .docyard-step__body :not(pre) > code {
92
+ background-color: var(--muted);
93
+ padding: 0.125rem 0.375rem;
94
+ border-radius: var(--radius-sm);
95
+ font-size: 0.875em;
96
+ }
97
+
98
+ .docyard-step__body ul,
99
+ .docyard-step__body ol {
100
+ margin: var(--spacing-2) 0;
101
+ padding-left: var(--spacing-4);
102
+ }
103
+
104
+ .docyard-step__body li {
105
+ margin: var(--spacing-1) 0;
106
+ }
107
+
108
+ @media (max-width: 640px) {
109
+ .docyard-step {
110
+ gap: var(--spacing-3);
111
+ }
112
+
113
+ .docyard-step__number {
114
+ width: 1.75rem;
115
+ height: 1.75rem;
116
+ font-size: var(--text-xs);
117
+ }
118
+
119
+ .docyard-step__title {
120
+ font-size: var(--text-sm);
121
+ }
122
+ }
@@ -0,0 +1,163 @@
1
+ /* Tab Bar - Desktop navigation below header */
2
+
3
+ .tab-bar {
4
+ position: fixed;
5
+ top: var(--header-height);
6
+ left: 0;
7
+ right: 0;
8
+ height: var(--tab-bar-height);
9
+ background: var(--background);
10
+ z-index: var(--z-header);
11
+ display: none;
12
+ }
13
+
14
+ .has-tabs .tab-bar {
15
+ display: block;
16
+ }
17
+
18
+ /* Hide tab bar on landing/splash pages */
19
+ .splash-page .tab-bar {
20
+ display: none;
21
+ }
22
+
23
+ .tab-bar-content {
24
+ position: relative;
25
+ display: flex;
26
+ align-items: center;
27
+ height: 100%;
28
+ max-width: var(--layout-max-width);
29
+ margin: 0 auto;
30
+ padding: 0 var(--spacing-6);
31
+ gap: var(--spacing-2);
32
+ border-bottom: 1px solid var(--hr-color);
33
+ }
34
+
35
+ .tab-item {
36
+ position: relative;
37
+ display: flex;
38
+ align-items: center;
39
+ gap: 6px;
40
+ height: 100%;
41
+ padding: 0 var(--spacing-4);
42
+ font-size: var(--text-sm);
43
+ font-weight: var(--font-medium);
44
+ color: var(--muted-foreground);
45
+ text-decoration: none;
46
+ transition: color var(--transition-fast);
47
+ }
48
+
49
+ .tab-item:hover {
50
+ color: var(--foreground);
51
+ text-decoration: none;
52
+ }
53
+
54
+ .tab-item.is-active {
55
+ color: var(--foreground);
56
+ }
57
+
58
+ .tab-icon {
59
+ display: flex;
60
+ align-items: center;
61
+ flex-shrink: 0;
62
+ opacity: 0.7;
63
+ }
64
+
65
+ .tab-icon .docyard-icon {
66
+ width: 16px;
67
+ height: 16px;
68
+ }
69
+
70
+ .tab-item.is-active .tab-icon {
71
+ opacity: 1;
72
+ }
73
+
74
+ .tab-external-icon {
75
+ width: 14px;
76
+ height: 14px;
77
+ opacity: 0.5;
78
+ flex-shrink: 0;
79
+ }
80
+
81
+ /* Sliding indicator */
82
+ .tab-indicator {
83
+ position: absolute;
84
+ bottom: 0;
85
+ left: 0;
86
+ width: 0;
87
+ height: 2px;
88
+ background: var(--primary);
89
+ border-radius: 2px 2px 0 0;
90
+ pointer-events: none;
91
+ view-transition-name: tab-indicator;
92
+ }
93
+
94
+ .tab-indicator.is-ready {
95
+ transition: left 0.25s cubic-bezier(0.4, 0, 0.2, 1), width 0.25s cubic-bezier(0.4, 0, 0.2, 1);
96
+ }
97
+
98
+ /* View Transitions API - animate indicator between pages */
99
+ ::view-transition-group(tab-indicator) {
100
+ animation-duration: 0.25s;
101
+ animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
102
+ }
103
+
104
+ ::view-transition-old(tab-indicator),
105
+ ::view-transition-new(tab-indicator) {
106
+ animation: none;
107
+ mix-blend-mode: normal;
108
+ }
109
+
110
+ /* Faster page transition */
111
+ ::view-transition-old(root),
112
+ ::view-transition-new(root) {
113
+ animation-duration: 0.15s;
114
+ }
115
+
116
+ /* Layout adjustments when tabs are present */
117
+ .has-tabs .layout {
118
+ padding-top: calc(var(--header-height) + var(--tab-bar-height));
119
+ }
120
+
121
+ @media (max-width: 1280px) and (min-width: 1025px) {
122
+ .has-tabs .layout {
123
+ padding-top: calc(var(--header-height) + var(--tab-bar-height) + 3rem);
124
+ }
125
+ }
126
+
127
+ .has-tabs .sidebar {
128
+ top: calc(var(--header-height) + var(--tab-bar-height));
129
+ height: calc(100vh - var(--header-height) - var(--tab-bar-height));
130
+ }
131
+
132
+ .has-tabs .secondary-header {
133
+ top: calc(var(--header-height) + var(--tab-bar-height));
134
+ }
135
+
136
+ /* Hide tab bar on mobile */
137
+ @media (max-width: 1024px) {
138
+ .tab-bar {
139
+ display: none;
140
+ }
141
+
142
+ .has-tabs .layout {
143
+ padding-top: calc(var(--header-height) + 3rem);
144
+ }
145
+
146
+ .has-tabs .sidebar {
147
+ top: 0;
148
+ height: 100vh;
149
+ height: 100dvh;
150
+ }
151
+
152
+ .has-tabs .secondary-header {
153
+ top: var(--header-height);
154
+ }
155
+ }
156
+
157
+ /* Reduced motion preference */
158
+ @media (prefers-reduced-motion: reduce) {
159
+ .tab-item,
160
+ .tab-indicator {
161
+ transition: none;
162
+ }
163
+ }
@@ -1,32 +1,68 @@
1
- /* Table of Contents - Desktop & Mobile */
2
-
3
1
  .docyard-toc {
4
- width: var(--toc-width);
5
- position: fixed;
6
- top: var(--header-height);
7
- right: 0;
8
- height: calc(100vh - var(--header-height));
9
- padding: var(--space-3) var(--space-6) var(--space-3) var(--space-8);
10
- overflow-y: auto;
2
+ min-height: 0;
3
+ background-color: var(--background);
4
+ display: flex;
5
+ flex-direction: column;
6
+ position: relative;
7
+ }
8
+
9
+ .doc-aside.has-overflow .docyard-toc {
10
+ flex: 1;
11
+ }
12
+
13
+ .docyard-toc__scroll {
11
14
  overflow-x: hidden;
12
- border-left: 1px solid var(--color-border);
13
- background-color: var(--color-bg);
15
+ overscroll-behavior: contain;
16
+ padding: var(--spacing-3) var(--spacing-4);
17
+ }
18
+
19
+ .doc-aside.has-overflow .docyard-toc__scroll {
20
+ flex: 1;
21
+ overflow-y: auto;
22
+ }
23
+
24
+ .docyard-toc::before,
25
+ .docyard-toc::after {
26
+ content: '';
27
+ position: absolute;
28
+ left: 0;
29
+ right: 0;
30
+ height: 2rem;
31
+ pointer-events: none;
32
+ z-index: 1;
33
+ opacity: 0;
34
+ transition: opacity 0.2s ease;
35
+ }
36
+
37
+ .docyard-toc::before {
38
+ top: 0;
39
+ background: linear-gradient(to bottom, var(--background) 0%, transparent 100%);
40
+ }
41
+
42
+ .docyard-toc::after {
43
+ bottom: 0;
44
+ background: linear-gradient(to top, var(--background) 0%, transparent 100%);
45
+ }
46
+
47
+ .docyard-toc.can-scroll-top::before {
48
+ opacity: 1;
49
+ }
50
+
51
+ .docyard-toc.can-scroll-bottom::after {
52
+ opacity: 1;
14
53
  }
15
54
 
16
- /* TOC Header */
17
55
  .docyard-toc__header {
18
- margin-bottom: var(--space-4);
56
+ margin-bottom: var(--spacing-4);
19
57
  }
20
58
 
21
59
  .docyard-toc__title {
22
60
  display: flex;
23
61
  align-items: center;
24
62
  gap: 0.375rem;
25
- font-size: 0.6875rem;
26
- font-weight: var(--font-weight-semibold);
27
- color: var(--color-text-tertiary);
28
- text-transform: uppercase;
29
- letter-spacing: 0.1em;
63
+ font-size: var(--text-sm);
64
+ font-weight: var(--font-medium);
65
+ color: var(--muted-foreground);
30
66
  margin-bottom: 0;
31
67
  }
32
68
 
@@ -34,37 +70,41 @@
34
70
  flex-shrink: 0;
35
71
  }
36
72
 
37
- /* Secondary Header TOC Toggle (tablet & mobile) */
38
73
  .secondary-header-toc-toggle {
39
74
  display: none;
40
75
  }
41
76
 
42
- /* Tablet & Mobile TOC Toggle */
43
77
  @media (max-width: 1280px) {
44
78
  .secondary-header-toc-toggle {
45
79
  display: flex;
46
80
  align-items: center;
47
- gap: var(--space-2);
48
- padding: var(--space-2) var(--space-3);
81
+ gap: var(--spacing-2);
82
+ padding: var(--spacing-2);
49
83
  background: transparent;
50
84
  border: none;
51
- color: var(--color-text);
52
- font-size: var(--font-size-sm);
53
- font-weight: var(--font-weight-medium);
85
+ color: var(--foreground);
86
+ font-size: var(--text-sm);
87
+ font-weight: var(--font-medium);
54
88
  font-family: var(--font-sans);
55
89
  cursor: pointer;
56
- transition: color var(--transition-fast);
90
+ transition: background-color 0.2s ease;
57
91
  outline: none;
92
+ border-radius: var(--radius-md);
93
+ margin-right: calc(-1 * var(--spacing-2));
58
94
  }
59
95
 
60
96
  .secondary-header-toc-toggle:hover {
61
- color: var(--color-text-secondary);
97
+ background-color: var(--muted);
98
+ }
99
+
100
+ .secondary-header-toc-toggle:active {
101
+ background-color: var(--muted);
62
102
  }
63
103
 
64
104
  .secondary-header-toc-toggle:focus-visible {
65
- outline: 2px solid var(--color-primary);
66
- outline-offset: 2px;
67
- border-radius: var(--radius-sm);
105
+ outline: none;
106
+ border-radius: var(--radius-lg);
107
+ box-shadow: 0 0 0 var(--ring-width) oklch(from var(--ring) l c h / 50%);
68
108
  }
69
109
 
70
110
  .secondary-header-toc-toggle svg {
@@ -77,105 +117,88 @@
77
117
  }
78
118
  }
79
119
 
80
- /* TOC Navigation */
81
120
  .docyard-toc__nav {
82
121
  display: block;
122
+ position: relative;
83
123
  }
84
124
 
85
- /* TOC List */
86
125
  .docyard-toc__list {
87
126
  list-style: none;
88
127
  padding: 0;
89
128
  margin: 0;
129
+ position: relative;
130
+ border-left: 1px solid var(--border);
131
+ }
132
+
133
+ .docyard-toc__indicator {
134
+ position: absolute;
135
+ left: -1px;
136
+ width: 2px;
137
+ background-color: var(--primary);
138
+ pointer-events: none;
139
+ transition:
140
+ top 0.3s cubic-bezier(0.34, 1.56, 0.64, 1),
141
+ height 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);
142
+ z-index: 1;
90
143
  }
91
144
 
92
145
  .docyard-toc__list .docyard-toc__list {
93
- margin-top: var(--space-1);
94
- margin-left: var(--space-4);
95
- border-left: 1px solid var(--color-border);
96
- padding-left: var(--space-3);
146
+ margin-top: var(--spacing-1);
147
+ margin-left: var(--spacing-3);
148
+ padding-left: var(--spacing-3);
149
+ border-left: none;
97
150
  }
98
151
 
99
- /* TOC Items */
100
152
  .docyard-toc__item {
101
- margin-bottom: 0.375rem;
153
+ margin-bottom: 0;
102
154
  }
103
155
 
104
- /* TOC Links */
105
156
  .docyard-toc__link {
106
157
  display: block;
107
- padding: 0.25rem var(--space-2);
108
- color: var(--color-text-secondary);
158
+ padding: 0.25rem 0;
159
+ padding-left: var(--spacing-4);
160
+ color: var(--muted-foreground);
109
161
  text-decoration: none;
110
- font-size: var(--font-size-sm);
111
- line-height: var(--line-height-tight);
112
- border-radius: var(--radius-sm);
162
+ font-size: var(--text-sm);
163
+ line-height: var(--leading-normal);
164
+ border-radius: var(--radius-lg);
113
165
  transition: color var(--transition-fast);
114
- font-weight: var(--font-weight-medium);
166
+ font-weight: var(--font-normal);
115
167
  overflow: hidden;
116
168
  text-overflow: ellipsis;
117
169
  white-space: nowrap;
118
170
  }
119
171
 
120
172
  .docyard-toc__link:hover {
121
- color: var(--color-text);
173
+ color: var(--foreground);
122
174
  text-decoration: none;
123
175
  }
124
176
 
125
177
  .docyard-toc__link:focus-visible {
126
- outline: 2px solid var(--color-primary);
127
- outline-offset: 2px;
128
- color: var(--color-text);
178
+ outline: none;
179
+ box-shadow: 0 0 0 var(--ring-width) oklch(from var(--ring) l c h / 50%);
180
+ color: var(--foreground);
129
181
  text-decoration: none;
130
182
  }
131
183
 
132
- /* Active link */
133
184
  .docyard-toc__link.is-active {
134
- color: var(--color-primary);
135
- font-weight: var(--font-weight-semibold);
136
- }
137
-
138
- /* Level-specific styling */
139
- .docyard-toc__item--level-2>.docyard-toc__link {
140
- font-weight: var(--font-weight-medium);
141
- }
142
-
143
- .docyard-toc__item--level-3>.docyard-toc__link {
144
- font-size: 0.8125rem;
185
+ color: var(--primary);
186
+ font-weight: var(--font-medium);
145
187
  }
146
188
 
147
- .docyard-toc__item--level-4>.docyard-toc__link {
148
- font-size: 0.8125rem;
149
- color: var(--color-text-tertiary);
189
+ .docyard-toc__item--level-2 > .docyard-toc__link {
190
+ font-weight: var(--font-normal);
150
191
  }
151
192
 
152
- /* TOC Scrollbar */
153
- .docyard-toc::-webkit-scrollbar {
154
- width: 0.5rem;
193
+ .docyard-toc__item--level-4 > .docyard-toc__link {
194
+ color: var(--muted-foreground);
155
195
  }
156
196
 
157
- .docyard-toc::-webkit-scrollbar-track {
158
- background: transparent;
197
+ .docyard-toc__scroll {
198
+ scrollbar-width: thin;
199
+ scrollbar-color: var(--border) transparent;
159
200
  }
160
201
 
161
- .docyard-toc::-webkit-scrollbar-thumb {
162
- background: rgba(208, 215, 222, 0.5);
163
- border-radius: 0.25rem;
164
- }
165
-
166
- .docyard-toc::-webkit-scrollbar-thumb:hover {
167
- background: rgba(208, 215, 222, 0.7);
168
- }
169
-
170
- .dark .docyard-toc::-webkit-scrollbar-thumb {
171
- background: rgba(110, 118, 129, 0.4);
172
- }
173
-
174
- .dark .docyard-toc::-webkit-scrollbar-thumb:hover {
175
- background: rgba(110, 118, 129, 0.6);
176
- }
177
-
178
- /* Tablet & Mobile Layout - TOC in secondary header */
179
202
  @media (max-width: 1280px) {
180
203
  .docyard-toc {
181
204
  display: block;
@@ -197,13 +220,11 @@
197
220
  position: fixed;
198
221
  overflow-y: auto;
199
222
  overscroll-behavior: contain;
200
- padding: var(--space-5);
201
- background: var(--color-bg);
202
- border: 1px solid var(--color-border);
203
- border-radius: var(--radius-lg);
204
- box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1),
205
- 0 2px 4px -1px rgba(0, 0, 0, 0.06),
206
- 0 0 0 1px rgba(0, 0, 0, 0.05);
223
+ padding: var(--spacing-5);
224
+ background: var(--background);
225
+ border: 1px solid var(--border);
226
+ border-radius: var(--radius-xl);
227
+ box-shadow: var(--shadow-lg);
207
228
  z-index: 9999;
208
229
  transition: top 0.3s cubic-bezier(0.4, 0, 0.2, 1),
209
230
  opacity 0.2s ease,
@@ -213,12 +234,6 @@
213
234
  pointer-events: none;
214
235
  }
215
236
 
216
- .dark .docyard-toc__nav {
217
- box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.3),
218
- 0 2px 4px -1px rgba(0, 0, 0, 0.2),
219
- 0 0 0 1px rgba(255, 255, 255, 0.1);
220
- }
221
-
222
237
  .docyard-toc__nav.is-expanded {
223
238
  display: block;
224
239
  opacity: 1;
@@ -227,39 +242,37 @@
227
242
  }
228
243
  }
229
244
 
230
- /* Tablet-specific: floating dropdown on right */
231
245
  @media (max-width: 1280px) and (min-width: 1025px) {
232
246
  .docyard-toc__nav {
233
- top: calc(var(--header-height) + 3rem + var(--space-2));
234
- right: var(--space-6);
247
+ top: calc(var(--header-height) + 3rem + var(--spacing-2));
248
+ right: var(--spacing-6);
235
249
  width: 280px;
236
- max-height: calc(100vh - var(--header-height) - 3rem - var(--space-8));
250
+ max-height: calc(100vh - var(--header-height) - 3rem - var(--spacing-8));
237
251
  }
238
252
  }
239
253
 
240
- /* Mobile Layout (< 1024px) */
241
254
  @media (max-width: 1024px) {
242
255
  .docyard-toc__nav {
243
256
  top: calc(var(--header-height) + 3rem - 2px);
244
- left: var(--space-4);
245
- right: var(--space-4);
246
- max-height: calc(100vh - var(--header-height) - 3rem - var(--space-2));
257
+ left: var(--spacing-4);
258
+ right: var(--spacing-4);
259
+ max-height: calc(100vh - var(--header-height) - 3rem - var(--spacing-2));
247
260
  }
248
261
 
249
- .secondary-header.shift-up~.layout .docyard-toc__nav {
262
+ .secondary-header.shift-up ~ .layout .docyard-toc__nav {
250
263
  top: calc(3rem - 2px);
251
- max-height: calc(100vh - 3rem - var(--space-2));
264
+ max-height: calc(100vh - 3rem - var(--spacing-2));
252
265
  }
253
266
 
254
267
  .docyard-toc__list .docyard-toc__list {
255
- margin-left: var(--space-3);
256
- padding-left: var(--space-2);
268
+ margin-left: var(--spacing-3);
269
+ padding-left: var(--spacing-2);
257
270
  }
258
271
  }
259
272
 
260
- /* Reduced Motion */
261
273
  @media (prefers-reduced-motion: reduce) {
262
- .docyard-toc__link {
274
+ .docyard-toc__link,
275
+ .docyard-toc__indicator {
263
276
  transition: none;
264
277
  }
265
278