docyard 0.6.0 → 0.8.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 (177) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +5 -1
  3. data/CHANGELOG.md +34 -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 +82 -50
  8. data/lib/docyard/builder.rb +20 -10
  9. data/lib/docyard/cli.rb +6 -3
  10. data/lib/docyard/components/aliases.rb +29 -0
  11. data/lib/docyard/components/processors/callout_processor.rb +124 -0
  12. data/lib/docyard/components/processors/code_block_diff_preprocessor.rb +106 -0
  13. data/lib/docyard/components/processors/code_block_focus_preprocessor.rb +79 -0
  14. data/lib/docyard/components/processors/code_block_options_preprocessor.rb +78 -0
  15. data/lib/docyard/components/processors/code_block_processor.rb +175 -0
  16. data/lib/docyard/components/processors/code_snippet_import_preprocessor.rb +127 -0
  17. data/lib/docyard/components/processors/heading_anchor_processor.rb +39 -0
  18. data/lib/docyard/components/processors/icon_processor.rb +53 -0
  19. data/lib/docyard/components/processors/table_of_contents_processor.rb +68 -0
  20. data/lib/docyard/components/processors/table_wrapper_processor.rb +22 -0
  21. data/lib/docyard/components/processors/tabs_processor.rb +48 -0
  22. data/lib/docyard/components/support/code_block/feature_extractor.rb +117 -0
  23. data/lib/docyard/components/support/code_block/icon_detector.rb +44 -0
  24. data/lib/docyard/components/support/code_block/line_parser.rb +84 -0
  25. data/lib/docyard/components/support/code_block/line_wrapper.rb +50 -0
  26. data/lib/docyard/components/support/code_block/patterns.rb +55 -0
  27. data/lib/docyard/components/support/code_detector.rb +61 -0
  28. data/lib/docyard/components/support/tabs/icon_detector.rb +62 -0
  29. data/lib/docyard/components/support/tabs/parser.rb +195 -0
  30. data/lib/docyard/components/support/tabs/range_finder.rb +46 -0
  31. data/lib/docyard/config/branding_resolver.rb +183 -0
  32. data/lib/docyard/{constants.rb → config/constants.rb} +7 -4
  33. data/lib/docyard/config/validator.rb +122 -99
  34. data/lib/docyard/config.rb +38 -36
  35. data/lib/docyard/initializer.rb +15 -76
  36. data/lib/docyard/navigation/breadcrumb_builder.rb +133 -0
  37. data/lib/docyard/{prev_next_builder.rb → navigation/prev_next_builder.rb} +6 -3
  38. data/lib/docyard/navigation/sidebar/children_discoverer.rb +51 -0
  39. data/lib/docyard/navigation/sidebar/config_parser.rb +208 -0
  40. data/lib/docyard/navigation/sidebar/file_resolver.rb +78 -0
  41. data/lib/docyard/{sidebar → navigation/sidebar}/file_system_scanner.rb +2 -1
  42. data/lib/docyard/navigation/sidebar/item.rb +96 -0
  43. data/lib/docyard/navigation/sidebar/local_config_loader.rb +51 -0
  44. data/lib/docyard/navigation/sidebar/metadata_extractor.rb +69 -0
  45. data/lib/docyard/navigation/sidebar/metadata_reader.rb +47 -0
  46. data/lib/docyard/navigation/sidebar/path_prefixer.rb +34 -0
  47. data/lib/docyard/navigation/sidebar/renderer.rb +144 -0
  48. data/lib/docyard/navigation/sidebar/sorter.rb +21 -0
  49. data/lib/docyard/navigation/sidebar/tree_builder.rb +139 -0
  50. data/lib/docyard/navigation/sidebar/tree_filter.rb +55 -0
  51. data/lib/docyard/navigation/sidebar_builder.rb +159 -0
  52. data/lib/docyard/rendering/icon_helpers.rb +13 -0
  53. data/lib/docyard/{icons → rendering/icons}/phosphor.rb +26 -1
  54. data/lib/docyard/{markdown.rb → rendering/markdown.rb} +19 -13
  55. data/lib/docyard/rendering/renderer.rb +163 -0
  56. data/lib/docyard/rendering/template_resolver.rb +172 -0
  57. data/lib/docyard/routing/fallback_resolver.rb +92 -0
  58. data/lib/docyard/search/build_indexer.rb +74 -0
  59. data/lib/docyard/search/dev_indexer.rb +155 -0
  60. data/lib/docyard/search/pagefind_support.rb +33 -0
  61. data/lib/docyard/{asset_handler.rb → server/asset_handler.rb} +24 -19
  62. data/lib/docyard/{server.rb → server/dev_server.rb} +32 -9
  63. data/lib/docyard/server/pagefind_handler.rb +63 -0
  64. data/lib/docyard/{preview_server.rb → server/preview_server.rb} +2 -2
  65. data/lib/docyard/server/rack_application.rb +192 -0
  66. data/lib/docyard/server/resolution_result.rb +29 -0
  67. data/lib/docyard/{router.rb → server/router.rb} +4 -4
  68. data/lib/docyard/templates/assets/css/code.css +18 -51
  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/code-block.css +180 -282
  72. data/lib/docyard/templates/assets/css/components/heading-anchor.css +28 -15
  73. data/lib/docyard/templates/assets/css/components/icon.css +0 -1
  74. data/lib/docyard/templates/assets/css/components/logo.css +0 -2
  75. data/lib/docyard/templates/assets/css/components/nav-menu.css +237 -0
  76. data/lib/docyard/templates/assets/css/components/navigation.css +186 -167
  77. data/lib/docyard/templates/assets/css/components/prev-next.css +76 -47
  78. data/lib/docyard/templates/assets/css/components/search.css +561 -0
  79. data/lib/docyard/templates/assets/css/components/tab-bar.css +163 -0
  80. data/lib/docyard/templates/assets/css/components/table-of-contents.css +127 -114
  81. data/lib/docyard/templates/assets/css/components/tabs.css +119 -160
  82. data/lib/docyard/templates/assets/css/components/theme-toggle.css +48 -44
  83. data/lib/docyard/templates/assets/css/landing.css +815 -0
  84. data/lib/docyard/templates/assets/css/layout.css +503 -87
  85. data/lib/docyard/templates/assets/css/main.css +1 -3
  86. data/lib/docyard/templates/assets/css/markdown.css +111 -93
  87. data/lib/docyard/templates/assets/css/reset.css +0 -3
  88. data/lib/docyard/templates/assets/css/typography.css +43 -41
  89. data/lib/docyard/templates/assets/css/variables.css +268 -208
  90. data/lib/docyard/templates/assets/favicon.svg +7 -8
  91. data/lib/docyard/templates/assets/fonts/Inter-Variable.ttf +0 -0
  92. data/lib/docyard/templates/assets/js/components/code-block.js +24 -42
  93. data/lib/docyard/templates/assets/js/components/heading-anchor.js +26 -24
  94. data/lib/docyard/templates/assets/js/components/navigation.js +181 -70
  95. data/lib/docyard/templates/assets/js/components/search.js +610 -0
  96. data/lib/docyard/templates/assets/js/components/sidebar-toggle.js +29 -0
  97. data/lib/docyard/templates/assets/js/components/tab-navigation.js +145 -0
  98. data/lib/docyard/templates/assets/js/components/table-of-contents.js +153 -66
  99. data/lib/docyard/templates/assets/js/components/tabs.js +31 -69
  100. data/lib/docyard/templates/assets/js/theme.js +0 -3
  101. data/lib/docyard/templates/assets/logo-dark.svg +8 -2
  102. data/lib/docyard/templates/assets/logo.svg +7 -4
  103. data/lib/docyard/templates/config/docyard.yml.erb +37 -34
  104. data/lib/docyard/templates/errors/404.html.erb +1 -1
  105. data/lib/docyard/templates/errors/500.html.erb +1 -1
  106. data/lib/docyard/templates/layouts/default.html.erb +19 -56
  107. data/lib/docyard/templates/layouts/splash.html.erb +176 -0
  108. data/lib/docyard/templates/partials/_breadcrumbs.html.erb +24 -0
  109. data/lib/docyard/templates/partials/_code_block.html.erb +6 -4
  110. data/lib/docyard/templates/partials/_doc_footer.html.erb +25 -0
  111. data/lib/docyard/templates/partials/_features.html.erb +15 -0
  112. data/lib/docyard/templates/partials/_footer.html.erb +42 -0
  113. data/lib/docyard/templates/partials/_head.html.erb +22 -0
  114. data/lib/docyard/templates/partials/_header.html.erb +49 -0
  115. data/lib/docyard/templates/partials/_heading_anchor.html.erb +3 -1
  116. data/lib/docyard/templates/partials/_hero.html.erb +27 -0
  117. data/lib/docyard/templates/partials/_nav_group.html.erb +25 -11
  118. data/lib/docyard/templates/partials/_nav_leaf.html.erb +1 -1
  119. data/lib/docyard/templates/partials/_nav_menu.html.erb +42 -0
  120. data/lib/docyard/templates/partials/_nav_nested_section.html.erb +11 -0
  121. data/lib/docyard/templates/partials/_nav_section.html.erb +1 -1
  122. data/lib/docyard/templates/partials/_prev_next.html.erb +9 -3
  123. data/lib/docyard/templates/partials/_scripts.html.erb +7 -0
  124. data/lib/docyard/templates/partials/_search_modal.html.erb +41 -0
  125. data/lib/docyard/templates/partials/_search_trigger.html.erb +18 -0
  126. data/lib/docyard/templates/partials/_sidebar.html.erb +21 -4
  127. data/lib/docyard/templates/partials/_tab_bar.html.erb +25 -0
  128. data/lib/docyard/templates/partials/_table_of_contents.html.erb +12 -12
  129. data/lib/docyard/templates/partials/_table_of_contents_toggle.html.erb +1 -3
  130. data/lib/docyard/templates/partials/_tabs.html.erb +2 -2
  131. data/lib/docyard/templates/partials/_theme_toggle.html.erb +2 -11
  132. data/lib/docyard/utils/html_helpers.rb +14 -0
  133. data/lib/docyard/utils/path_resolver.rb +2 -1
  134. data/lib/docyard/utils/url_helpers.rb +20 -0
  135. data/lib/docyard/version.rb +1 -1
  136. data/lib/docyard.rb +22 -15
  137. metadata +89 -50
  138. data/lib/docyard/components/callout_processor.rb +0 -121
  139. data/lib/docyard/components/code_block_diff_preprocessor.rb +0 -104
  140. data/lib/docyard/components/code_block_feature_extractor.rb +0 -113
  141. data/lib/docyard/components/code_block_focus_preprocessor.rb +0 -77
  142. data/lib/docyard/components/code_block_icon_detector.rb +0 -40
  143. data/lib/docyard/components/code_block_line_wrapper.rb +0 -46
  144. data/lib/docyard/components/code_block_options_preprocessor.rb +0 -76
  145. data/lib/docyard/components/code_block_patterns.rb +0 -51
  146. data/lib/docyard/components/code_block_processor.rb +0 -176
  147. data/lib/docyard/components/code_detector.rb +0 -59
  148. data/lib/docyard/components/code_line_parser.rb +0 -80
  149. data/lib/docyard/components/code_snippet_import_preprocessor.rb +0 -125
  150. data/lib/docyard/components/heading_anchor_processor.rb +0 -34
  151. data/lib/docyard/components/icon_detector.rb +0 -57
  152. data/lib/docyard/components/icon_processor.rb +0 -51
  153. data/lib/docyard/components/table_of_contents_processor.rb +0 -64
  154. data/lib/docyard/components/table_wrapper_processor.rb +0 -18
  155. data/lib/docyard/components/tabs_parser.rb +0 -191
  156. data/lib/docyard/components/tabs_processor.rb +0 -44
  157. data/lib/docyard/components/tabs_range_finder.rb +0 -42
  158. data/lib/docyard/rack_application.rb +0 -172
  159. data/lib/docyard/renderer.rb +0 -120
  160. data/lib/docyard/routing/resolution_result.rb +0 -31
  161. data/lib/docyard/sidebar/config_parser.rb +0 -180
  162. data/lib/docyard/sidebar/item.rb +0 -58
  163. data/lib/docyard/sidebar/renderer.rb +0 -137
  164. data/lib/docyard/sidebar/tree_builder.rb +0 -59
  165. data/lib/docyard/sidebar_builder.rb +0 -102
  166. data/lib/docyard/templates/markdown/getting-started/installation.md.erb +0 -77
  167. data/lib/docyard/templates/markdown/guides/configuration.md.erb +0 -202
  168. data/lib/docyard/templates/markdown/guides/markdown-features.md.erb +0 -247
  169. data/lib/docyard/templates/markdown/index.md.erb +0 -82
  170. /data/lib/docyard/{sidebar → navigation/sidebar}/title_extractor.rb +0 -0
  171. /data/lib/docyard/{icons → rendering/icons}/LICENSE.phosphor +0 -0
  172. /data/lib/docyard/{icons → rendering/icons}/file_types.rb +0 -0
  173. /data/lib/docyard/{icons.rb → rendering/icons.rb} +0 -0
  174. /data/lib/docyard/{language_mapping.rb → rendering/language_mapping.rb} +0 -0
  175. /data/lib/docyard/{file_watcher.rb → server/file_watcher.rb} +0 -0
  176. /data/lib/docyard/{errors.rb → utils/errors.rb} +0 -0
  177. /data/lib/docyard/{logging.rb → utils/logging.rb} +0 -0
@@ -1,199 +1,255 @@
1
- /* Navigation Components */
2
-
3
- /* Sidebar navigation */
4
1
  .sidebar nav {
5
2
  flex: 1;
6
3
  overflow-y: auto;
4
+ overflow-x: hidden;
7
5
  }
8
6
 
9
- /* Section headers */
10
7
  .nav-section {
11
- margin-bottom: 0;
12
- padding-bottom: var(--space-5);
13
- }
14
-
15
- .nav-section:last-child {
16
- padding-bottom: 0;
17
- }
18
-
19
- .nav-section:first-child {
20
- margin-top: 0;
8
+ padding: var(--spacing-2);
9
+ display: flex;
10
+ flex-direction: column;
11
+ width: 100%;
12
+ min-width: 0;
13
+ position: relative;
14
+ overflow: hidden;
21
15
  }
22
16
 
23
17
  .nav-section-title {
24
- font-size: 0.6875rem;
25
- font-weight: var(--font-weight-semibold);
26
- color: var(--color-text-tertiary);
27
- text-transform: uppercase;
28
- letter-spacing: 0.1em;
29
- padding: 0 var(--space-3);
30
- margin-bottom: var(--space-3);
31
- margin-top: 0;
18
+ display: flex;
19
+ align-items: center;
20
+ gap: var(--spacing-2);
21
+ height: 2rem;
22
+ padding: 0 var(--spacing-2);
23
+ font-size: var(--text-xs);
24
+ font-weight: var(--font-medium);
25
+ color: oklch(from var(--sidebar-foreground) l c h / 70%);
26
+ border-radius: var(--radius-md);
27
+ margin: 0;
28
+ flex-shrink: 0;
29
+ outline: none;
30
+ transition: margin var(--transition-base), opacity var(--transition-base);
32
31
  pointer-events: none;
33
32
  user-select: none;
34
33
  }
35
34
 
36
- .nav-section:not(:first-child) {
37
- margin-top: var(--space-3);
38
- padding-top: 0;
35
+ .nav-section-icon {
36
+ display: inline-flex;
37
+ align-items: center;
38
+ flex-shrink: 0;
39
39
  }
40
40
 
41
- .nav-section:not(:first-child) .nav-section-title {
42
- margin-top: 0;
41
+ .nav-section-icon .docyard-icon {
42
+ width: 1rem;
43
+ height: 1rem;
43
44
  }
44
45
 
45
46
  .sidebar nav ul {
46
47
  list-style: none;
47
48
  padding: 0;
48
49
  margin: 0;
50
+ display: flex;
51
+ flex-direction: column;
52
+ width: 100%;
53
+ min-width: 0;
54
+ gap: var(--spacing-1);
49
55
  }
50
56
 
51
57
  .sidebar nav li {
52
58
  margin: 0;
59
+ position: relative;
60
+ min-width: 0;
53
61
  }
54
62
 
55
63
  .sidebar nav a {
56
64
  display: flex;
57
65
  align-items: center;
58
- gap: var(--space-2);
59
- padding: 0.5rem var(--space-3);
60
- font-size: 0.875rem;
61
- color: var(--color-text-secondary);
66
+ gap: var(--spacing-2);
67
+ height: 2.25rem;
68
+ padding: var(--spacing-2);
69
+ font-size: var(--text-sm);
70
+ color: var(--sidebar-foreground);
62
71
  text-decoration: none;
63
- border-radius: var(--radius-md);
64
- transition: color var(--transition-fast);
65
- line-height: 1.4;
66
- font-weight: var(--font-weight-medium);
72
+ border-radius: var(--radius-lg);
73
+ transition: all var(--transition-fast);
74
+ line-height: 1.5;
75
+ font-weight: var(--font-normal);
76
+ width: 100%;
77
+ text-align: left;
78
+ overflow: hidden;
79
+ outline: none;
67
80
  }
68
81
 
69
82
  .sidebar nav a:hover {
70
- color: var(--color-text);
83
+ background-color: var(--sidebar-accent);
84
+ color: var(--sidebar-accent-foreground);
71
85
  text-decoration: none;
72
86
  }
73
87
 
88
+ .sidebar nav a:focus-visible {
89
+ outline: none;
90
+ box-shadow: 0 0 0 2px var(--sidebar-ring);
91
+ }
92
+
74
93
  .sidebar nav a.active {
75
- color: var(--color-primary);
76
- font-weight: var(--font-weight-semibold);
94
+ background-color: oklch(from var(--sidebar-primary) l c h / 10%);
95
+ color: var(--sidebar-primary);
96
+ text-shadow: -0.2px 0 0 currentColor, 0.2px 0 0 currentColor;
77
97
  }
78
98
 
79
- /* Nested navigation */
80
- .sidebar nav ul ul {
81
- margin-left: var(--space-3);
82
- margin-top: 0.125rem;
83
- margin-bottom: 0.125rem;
84
- padding-left: var(--space-4);
85
- position: relative;
99
+ .sidebar nav a.active:hover {
100
+ background-color: oklch(from var(--sidebar-primary) l c h / 10%);
101
+ color: var(--sidebar-primary);
86
102
  }
87
103
 
88
- .sidebar nav ul ul::before {
89
- content: '';
90
- position: absolute;
91
- left: 0;
92
- top: 0;
93
- bottom: 0;
94
- width: 1px;
95
- background-color: rgba(148, 163, 184, 0.24);
104
+ .sidebar nav ul ul {
105
+ margin-left: 0.875rem;
106
+ margin-right: 0.875rem;
107
+ padding-left: 0.625rem;
108
+ padding-right: 0.625rem;
109
+ padding-top: 0.125rem;
110
+ padding-bottom: 0.125rem;
111
+ border-left: 1px solid var(--sidebar-border);
112
+ gap: var(--spacing-1);
113
+ display: flex;
114
+ flex-direction: column;
115
+ min-width: 0;
116
+ width: auto;
96
117
  }
97
118
 
98
119
  .sidebar nav ul ul li {
99
120
  position: relative;
100
- }
101
-
102
- /* Active indicator with :has() support */
103
- @supports selector(:has(*)) {
104
- .sidebar nav ul ul li:has(> a.active)::before {
105
- content: '';
106
- position: absolute;
107
- left: calc(-1 * var(--space-4));
108
- top: 0;
109
- bottom: 0;
110
- width: 2px;
111
- background-color: var(--color-primary);
112
- z-index: 1;
113
- }
121
+ min-width: 0;
114
122
  }
115
123
 
116
124
  .sidebar nav ul ul a {
117
- font-size: 0.8125rem;
118
- padding: 0.375rem var(--space-3);
119
- color: var(--color-text-secondary);
125
+ display: flex;
126
+ align-items: center;
127
+ gap: var(--spacing-2);
128
+ height: 1.75rem;
129
+ padding: 0 var(--spacing-2);
130
+ font-size: var(--text-sm);
131
+ color: var(--sidebar-foreground);
120
132
  line-height: 1.5;
121
- font-weight: var(--font-weight-normal);
122
- position: relative;
133
+ font-weight: var(--font-normal);
134
+ border-radius: var(--radius-md);
135
+ min-width: 0;
136
+ overflow: hidden;
123
137
  }
124
138
 
125
139
  .sidebar nav ul ul a:hover {
126
- color: var(--color-text);
127
- background-color: transparent;
140
+ background-color: var(--sidebar-accent);
141
+ color: var(--sidebar-accent-foreground);
128
142
  }
129
143
 
130
144
  .sidebar nav ul ul a.active {
131
- color: var(--color-primary);
132
- background-color: transparent;
133
- font-weight: var(--font-weight-semibold);
145
+ background-color: oklch(from var(--sidebar-primary) l c h / 10%);
146
+ color: var(--sidebar-primary);
147
+ text-shadow: -0.2px 0 0 currentColor, 0.2px 0 0 currentColor;
134
148
  }
135
149
 
136
- /* Top level nav items spacing */
137
- .sidebar nav>ul>li {
138
- margin-bottom: 0.125rem;
150
+ .nav-nested-section {
151
+ display: flex;
152
+ flex-direction: column;
153
+ }
154
+
155
+ .nav-nested-section-title {
156
+ display: flex;
157
+ align-items: center;
158
+ gap: var(--spacing-2);
159
+ height: 2rem;
160
+ padding: 0 var(--spacing-2);
161
+ font-size: var(--text-xs);
162
+ font-weight: var(--font-medium);
163
+ color: oklch(from var(--sidebar-foreground) l c h / 70%);
164
+ margin: var(--spacing-2) 0 0 0;
165
+ flex-shrink: 0;
166
+ pointer-events: none;
167
+ user-select: none;
139
168
  }
140
169
 
141
- .sidebar nav ul li {
142
- margin-bottom: 0;
170
+ .nav-nested-section-children {
171
+ display: flex;
172
+ flex-direction: column;
143
173
  }
144
174
 
145
- /* Collapsible/Accordion items */
146
- .nav-group-toggle {
175
+ .nav-group {
176
+ display: flex;
177
+ flex-direction: column;
178
+ }
179
+
180
+ .nav-group-header {
147
181
  display: flex;
148
182
  align-items: center;
149
183
  justify-content: space-between;
184
+ gap: 0;
150
185
  width: 100%;
151
- padding: 0.5rem var(--space-3);
152
- font-size: 0.875rem;
153
- color: var(--color-text-secondary);
154
- text-decoration: none;
155
- border-radius: var(--radius-md);
156
- transition: color var(--transition-fast);
157
- line-height: 1.4;
158
- font-weight: var(--font-weight-medium);
159
- background: none;
160
- border: none;
186
+ height: 2.25rem;
187
+ padding: var(--spacing-2);
188
+ font-size: var(--text-sm);
189
+ color: var(--sidebar-foreground);
190
+ border-radius: var(--radius-lg);
191
+ line-height: 1.5;
192
+ font-weight: var(--font-normal);
161
193
  text-align: left;
194
+ text-decoration: none;
162
195
  cursor: pointer;
196
+ outline: none;
197
+ transition: all var(--transition-fast);
163
198
  }
164
199
 
165
- .nav-group-title {
166
- display: flex;
167
- align-items: center;
168
- gap: var(--space-2);
169
- flex: 1;
200
+ .nav-group-header--link {
201
+ background: transparent;
202
+ }
203
+
204
+ .nav-group-header--button {
205
+ background: transparent;
206
+ border: none;
207
+ }
208
+
209
+ .nav-group-header:hover {
210
+ background-color: var(--sidebar-accent);
211
+ color: var(--sidebar-accent-foreground);
212
+ text-decoration: none;
213
+ }
214
+
215
+ .nav-group-header:focus-visible {
216
+ box-shadow: 0 0 0 2px var(--sidebar-ring);
170
217
  }
171
218
 
172
- .nav-group-toggle:hover {
173
- color: var(--color-text);
219
+ .nav-group-header.active {
220
+ background-color: oklch(from var(--sidebar-primary) l c h / 10%);
221
+ color: var(--sidebar-primary);
222
+ text-shadow: -0.2px 0 0 currentColor, 0.2px 0 0 currentColor;
174
223
  }
175
224
 
176
- .nav-group-toggle:focus-visible {
177
- outline: 0.125rem solid var(--color-primary);
178
- outline-offset: 0.125rem;
225
+ .nav-group-title {
226
+ display: flex;
227
+ align-items: center;
228
+ gap: var(--spacing-2);
229
+ flex: 1;
230
+ min-width: 0;
179
231
  }
180
232
 
181
233
  .nav-group-icon {
182
234
  display: inline-flex;
183
- color: var(--color-text-tertiary);
235
+ color: var(--muted-foreground);
184
236
  flex-shrink: 0;
185
237
  }
186
238
 
187
239
  .nav-group-icon .docyard-icon {
188
240
  width: 1rem;
189
241
  height: 1rem;
190
- transition: transform var(--transition-fast);
242
+ transition: transform 0.35s cubic-bezier(0.34, 1.56, 0.64, 1);
191
243
  }
192
244
 
193
- .nav-group-toggle[aria-expanded="true"] .nav-group-icon .docyard-icon {
245
+ [data-nav-toggle][aria-expanded="true"] .nav-group-icon .docyard-icon {
194
246
  transform: rotate(90deg);
195
247
  }
196
248
 
249
+ [data-nav-toggle][aria-expanded="false"] .nav-group-icon .docyard-icon {
250
+ transition: transform 0.2s cubic-bezier(0.4, 0, 1, 1);
251
+ }
252
+
197
253
  .nav-group-children {
198
254
  overflow: hidden;
199
255
  transition: max-height var(--transition-base);
@@ -203,81 +259,42 @@
203
259
  max-height: 0;
204
260
  }
205
261
 
206
- /* Mobile menu toggle button */
207
262
  .mobile-menu-toggle {
208
263
  display: none;
209
264
  background: transparent;
210
265
  border: none;
211
- padding: var(--space-2);
266
+ padding: var(--spacing-2);
212
267
  cursor: pointer;
213
- width: 2.25rem;
214
- height: 2.25rem;
268
+ width: 2rem;
269
+ height: 2rem;
215
270
  align-items: center;
216
271
  justify-content: center;
217
- border-radius: var(--radius-md);
218
- transition: background-color var(--transition-fast);
272
+ border-radius: var(--radius-4xl);
273
+ color: var(--muted-foreground);
274
+ transition: all var(--transition-fast);
219
275
  }
220
276
 
221
277
  .mobile-menu-toggle:hover {
222
- background: var(--color-bg-secondary);
278
+ background: var(--muted);
279
+ color: var(--foreground);
280
+ }
281
+
282
+ .mobile-menu-toggle:focus-visible {
283
+ outline: none;
284
+ box-shadow: 0 0 0 var(--ring-width) oklch(from var(--ring) l c h / 50%);
223
285
  }
224
286
 
225
- @media (max-width: 768px) {
287
+ @media (max-width: 1024px) {
226
288
  .mobile-menu-toggle {
227
289
  display: flex;
228
290
  }
229
291
  }
230
292
 
231
- /* Sidebar footer */
232
- .sidebar-footer {
233
- margin-top: auto;
234
- padding: var(--space-3) var(--space-5) var(--space-5);
235
- }
236
-
237
- .sidebar-footer-link {
238
- display: flex;
239
- align-items: center;
240
- gap: var(--space-2);
241
- text-decoration: none;
242
- padding: var(--space-2);
243
- border-radius: var(--radius-md);
244
- transition: background-color var(--transition-fast);
245
- }
246
-
247
- .sidebar-footer-link:hover {
248
- text-decoration: none;
249
- }
250
-
251
- .sidebar-footer-link:hover .external-icon {
252
- opacity: 0.5;
253
- }
254
-
255
- .sidebar-footer-text {
256
- flex: 1;
257
- }
258
-
259
- .sidebar-footer-title {
260
- margin: 0;
261
- font-size: 0.6875rem;
262
- color: var(--color-text-tertiary);
263
- font-weight: var(--font-weight-medium);
264
- line-height: 1.4;
265
- }
266
-
267
- .external-icon {
268
- width: 0.75rem;
269
- height: 0.75rem;
270
- color: var(--color-text-secondary);
271
- opacity: 0;
272
- transition: opacity var(--transition-fast);
273
- flex-shrink: 0;
274
- }
275
-
276
- /* Icon styling */
277
293
  .nav-item-icon {
278
294
  display: inline-flex;
279
295
  align-items: center;
280
296
  flex-shrink: 0;
297
+ color: inherit;
281
298
  }
282
299
 
283
300
  .nav-item-icon .docyard-icon {
@@ -287,6 +304,10 @@
287
304
 
288
305
  .nav-item-text {
289
306
  flex: 1;
307
+ min-width: 0;
308
+ overflow: hidden;
309
+ text-overflow: ellipsis;
310
+ white-space: nowrap;
290
311
  }
291
312
 
292
313
  .nav-item-external {
@@ -301,19 +322,17 @@
301
322
  height: 0.75rem;
302
323
  }
303
324
 
304
- /* Reduced motion support */
305
325
  @media (prefers-reduced-motion: reduce) {
326
+
306
327
  .sidebar nav a,
307
- .nav-group-toggle,
328
+ .nav-group-header,
308
329
  .nav-group-icon .docyard-icon,
309
330
  .nav-group-children,
310
- .mobile-menu-toggle,
311
- .sidebar-footer-link,
312
- .external-icon {
331
+ .mobile-menu-toggle {
313
332
  transition: none;
314
333
  }
315
334
 
316
- .nav-group-toggle[aria-expanded="true"] .nav-group-icon .docyard-icon {
335
+ [data-nav-toggle][aria-expanded="true"] .nav-group-icon .docyard-icon {
317
336
  transform: none;
318
337
  }
319
338
  }
@@ -1,83 +1,114 @@
1
- /* Previous/Next Navigation Footer */
2
-
3
1
  .doc-footer {
4
- margin-top: 48px;
5
- padding-top: 24px;
6
- border-top: 1px solid var(--color-border);
2
+ margin-top: var(--spacing-12);
3
+ padding-top: var(--spacing-8);
4
+ border-top: 1px solid var(--hr-color);
7
5
  }
8
6
 
9
7
  .pager {
10
- display: grid;
11
- grid-template-columns: repeat(2, 1fr);
12
- gap: 8px;
8
+ display: flex;
9
+ gap: var(--spacing-4);
13
10
  }
14
11
 
15
12
  .pager-link {
16
- display: block;
17
- padding: 16px;
18
- border: 1px solid var(--color-border);
19
- border-radius: 8px;
20
- text-decoration: none !important;
21
- transition: border-color 0.25s ease, background-color 0.25s ease;
22
- outline: none;
23
- background-color: transparent;
13
+ flex: 1;
14
+ display: flex;
15
+ flex-direction: column;
16
+ gap: var(--spacing-1);
17
+ padding: var(--spacing-4) var(--spacing-5);
18
+ border-radius: var(--radius-xl);
19
+ text-decoration: none;
20
+ background: transparent;
21
+ transition: background 0.3s ease;
24
22
  }
25
23
 
26
24
  .pager-link:hover {
27
- border-color: var(--color-primary);
28
- background-color: var(--color-background-soft);
25
+ background: var(--muted);
26
+ }
27
+
28
+ .pager-link:active {
29
+ background: oklch(from var(--muted) calc(l - 0.02) c h);
29
30
  }
30
31
 
31
32
  .pager-link:focus-visible {
32
- outline: 2px solid var(--color-primary);
33
- outline-offset: 2px;
34
- border-radius: 8px;
33
+ outline: none;
34
+ box-shadow: 0 0 0 2px var(--background), 0 0 0 4px var(--ring);
35
35
  }
36
36
 
37
37
  .pager-link.prev {
38
- text-align: left;
38
+ align-items: flex-start;
39
39
  }
40
40
 
41
41
  .pager-link.next {
42
+ align-items: flex-end;
42
43
  text-align: right;
43
44
  }
44
45
 
45
46
  .pager-label {
46
- display: block;
47
- font-size: 13px;
48
- font-weight: 500;
49
- color: var(--color-text-secondary);
50
- margin-bottom: 0px;
51
- text-decoration: none !important;
47
+ display: flex;
48
+ align-items: center;
49
+ gap: var(--spacing-2);
50
+ font-size: var(--text-xs);
51
+ font-weight: var(--font-medium);
52
+ color: var(--muted-foreground);
53
+ }
54
+
55
+ .pager-link.next .pager-label {
56
+ justify-content: flex-end;
57
+ }
58
+
59
+ .pager-label .docyard-icon {
60
+ display: inline-flex;
61
+ opacity: 0;
62
+ transition:
63
+ opacity 0.2s ease,
64
+ transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
65
+ }
66
+
67
+ .pager-label .docyard-icon svg {
68
+ width: 1rem;
69
+ height: 1rem;
70
+ }
71
+
72
+ .pager-link.prev .pager-label .docyard-icon {
73
+ transform: translateX(6px);
74
+ }
75
+
76
+ .pager-link.next .pager-label .docyard-icon {
77
+ transform: translateX(-6px);
78
+ }
79
+
80
+ .pager-link:hover .pager-label .docyard-icon {
81
+ opacity: 1;
82
+ transform: translateX(0);
52
83
  }
53
84
 
54
85
  .pager-title {
55
- display: block;
56
- font-size: 14px;
57
- font-weight: 500;
58
- color: var(--color-text-primary);
86
+ font-size: var(--text-sm);
87
+ font-weight: var(--font-medium);
88
+ color: var(--foreground);
59
89
  overflow: hidden;
60
90
  text-overflow: ellipsis;
61
91
  white-space: nowrap;
62
- text-decoration: none !important;
63
92
  }
64
93
 
65
- /* Mobile responsive */
66
- @media (max-width: 640px) {
67
- .doc-footer {
68
- margin-top: 48px;
94
+ @media (max-width: 1024px) {
95
+ .pager {
96
+ flex-direction: column;
97
+ gap: var(--spacing-2);
69
98
  }
70
99
 
71
- .pager {
72
- grid-template-columns: 1fr;
100
+ .pager-link {
101
+ padding: var(--spacing-3) var(--spacing-4);
73
102
  }
74
103
 
75
- .pager-link.next {
76
- margin-left: 0;
104
+
105
+ .pager-label .docyard-icon {
106
+ opacity: 0.6;
107
+ transform: translateX(0);
77
108
  }
78
109
 
79
- .pager-link {
80
- width: 100%;
110
+ .pager-link:hover .pager-label .docyard-icon {
111
+ opacity: 1;
81
112
  }
82
113
 
83
114
  .pager-title {
@@ -86,21 +117,19 @@
86
117
  }
87
118
  }
88
119
 
89
- /* Reduced motion accessibility */
90
120
  @media (prefers-reduced-motion: reduce) {
91
- .pager-link {
121
+ .pager-link,
122
+ .pager-label .docyard-icon {
92
123
  transition: none;
93
124
  }
94
125
  }
95
126
 
96
- /* Print: hide navigation */
97
127
  @media print {
98
128
  .doc-footer {
99
129
  display: none;
100
130
  }
101
131
  }
102
132
 
103
- /* Visually hidden utility (for screen readers) */
104
133
  .visually-hidden {
105
134
  position: absolute;
106
135
  width: 1px;