docyard 0.7.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 (112) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +5 -1
  3. data/CHANGELOG.md +20 -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/config/branding_resolver.rb +126 -17
  10. data/lib/docyard/config/constants.rb +6 -4
  11. data/lib/docyard/config/validator.rb +122 -99
  12. data/lib/docyard/config.rb +36 -43
  13. data/lib/docyard/initializer.rb +15 -76
  14. data/lib/docyard/navigation/breadcrumb_builder.rb +133 -0
  15. data/lib/docyard/navigation/prev_next_builder.rb +4 -1
  16. data/lib/docyard/navigation/sidebar/children_discoverer.rb +51 -0
  17. data/lib/docyard/navigation/sidebar/config_parser.rb +136 -108
  18. data/lib/docyard/navigation/sidebar/file_resolver.rb +78 -0
  19. data/lib/docyard/navigation/sidebar/file_system_scanner.rb +2 -1
  20. data/lib/docyard/navigation/sidebar/item.rb +45 -7
  21. data/lib/docyard/navigation/sidebar/local_config_loader.rb +51 -0
  22. data/lib/docyard/navigation/sidebar/metadata_extractor.rb +69 -0
  23. data/lib/docyard/navigation/sidebar/metadata_reader.rb +47 -0
  24. data/lib/docyard/navigation/sidebar/path_prefixer.rb +34 -0
  25. data/lib/docyard/navigation/sidebar/renderer.rb +55 -37
  26. data/lib/docyard/navigation/sidebar/sorter.rb +21 -0
  27. data/lib/docyard/navigation/sidebar/tree_builder.rb +99 -26
  28. data/lib/docyard/navigation/sidebar/tree_filter.rb +55 -0
  29. data/lib/docyard/navigation/sidebar_builder.rb +105 -36
  30. data/lib/docyard/rendering/icon_helpers.rb +13 -0
  31. data/lib/docyard/rendering/icons/phosphor.rb +23 -1
  32. data/lib/docyard/rendering/markdown.rb +5 -0
  33. data/lib/docyard/rendering/renderer.rb +74 -34
  34. data/lib/docyard/rendering/template_resolver.rb +172 -0
  35. data/lib/docyard/routing/fallback_resolver.rb +92 -0
  36. data/lib/docyard/search/build_indexer.rb +1 -1
  37. data/lib/docyard/search/dev_indexer.rb +51 -6
  38. data/lib/docyard/search/pagefind_support.rb +2 -0
  39. data/lib/docyard/server/asset_handler.rb +24 -19
  40. data/lib/docyard/server/pagefind_handler.rb +63 -0
  41. data/lib/docyard/server/preview_server.rb +1 -1
  42. data/lib/docyard/server/rack_application.rb +81 -64
  43. data/lib/docyard/templates/assets/css/code.css +18 -51
  44. data/lib/docyard/templates/assets/css/components/breadcrumbs.css +143 -0
  45. data/lib/docyard/templates/assets/css/components/callout.css +67 -67
  46. data/lib/docyard/templates/assets/css/components/code-block.css +180 -282
  47. data/lib/docyard/templates/assets/css/components/heading-anchor.css +28 -15
  48. data/lib/docyard/templates/assets/css/components/icon.css +0 -1
  49. data/lib/docyard/templates/assets/css/components/logo.css +0 -2
  50. data/lib/docyard/templates/assets/css/components/nav-menu.css +237 -0
  51. data/lib/docyard/templates/assets/css/components/navigation.css +186 -167
  52. data/lib/docyard/templates/assets/css/components/prev-next.css +76 -47
  53. data/lib/docyard/templates/assets/css/components/search.css +186 -174
  54. data/lib/docyard/templates/assets/css/components/tab-bar.css +163 -0
  55. data/lib/docyard/templates/assets/css/components/table-of-contents.css +127 -114
  56. data/lib/docyard/templates/assets/css/components/tabs.css +119 -160
  57. data/lib/docyard/templates/assets/css/components/theme-toggle.css +48 -44
  58. data/lib/docyard/templates/assets/css/landing.css +815 -0
  59. data/lib/docyard/templates/assets/css/layout.css +489 -87
  60. data/lib/docyard/templates/assets/css/main.css +1 -3
  61. data/lib/docyard/templates/assets/css/markdown.css +111 -93
  62. data/lib/docyard/templates/assets/css/reset.css +0 -3
  63. data/lib/docyard/templates/assets/css/typography.css +43 -41
  64. data/lib/docyard/templates/assets/css/variables.css +268 -208
  65. data/lib/docyard/templates/assets/favicon.svg +7 -8
  66. data/lib/docyard/templates/assets/fonts/Inter-Variable.ttf +0 -0
  67. data/lib/docyard/templates/assets/js/components/code-block.js +24 -42
  68. data/lib/docyard/templates/assets/js/components/heading-anchor.js +26 -24
  69. data/lib/docyard/templates/assets/js/components/navigation.js +181 -70
  70. data/lib/docyard/templates/assets/js/components/search.js +0 -75
  71. data/lib/docyard/templates/assets/js/components/sidebar-toggle.js +29 -0
  72. data/lib/docyard/templates/assets/js/components/tab-navigation.js +145 -0
  73. data/lib/docyard/templates/assets/js/components/table-of-contents.js +153 -66
  74. data/lib/docyard/templates/assets/js/components/tabs.js +31 -69
  75. data/lib/docyard/templates/assets/js/theme.js +0 -3
  76. data/lib/docyard/templates/assets/logo-dark.svg +8 -2
  77. data/lib/docyard/templates/assets/logo.svg +7 -4
  78. data/lib/docyard/templates/config/docyard.yml.erb +37 -34
  79. data/lib/docyard/templates/errors/404.html.erb +1 -1
  80. data/lib/docyard/templates/errors/500.html.erb +1 -1
  81. data/lib/docyard/templates/layouts/default.html.erb +18 -67
  82. data/lib/docyard/templates/layouts/splash.html.erb +176 -0
  83. data/lib/docyard/templates/partials/_breadcrumbs.html.erb +24 -0
  84. data/lib/docyard/templates/partials/_code_block.html.erb +5 -3
  85. data/lib/docyard/templates/partials/_doc_footer.html.erb +25 -0
  86. data/lib/docyard/templates/partials/_features.html.erb +15 -0
  87. data/lib/docyard/templates/partials/_footer.html.erb +42 -0
  88. data/lib/docyard/templates/partials/_head.html.erb +22 -0
  89. data/lib/docyard/templates/partials/_header.html.erb +49 -0
  90. data/lib/docyard/templates/partials/_heading_anchor.html.erb +3 -1
  91. data/lib/docyard/templates/partials/_hero.html.erb +27 -0
  92. data/lib/docyard/templates/partials/_nav_group.html.erb +25 -11
  93. data/lib/docyard/templates/partials/_nav_leaf.html.erb +1 -1
  94. data/lib/docyard/templates/partials/_nav_menu.html.erb +42 -0
  95. data/lib/docyard/templates/partials/_nav_nested_section.html.erb +11 -0
  96. data/lib/docyard/templates/partials/_nav_section.html.erb +1 -1
  97. data/lib/docyard/templates/partials/_prev_next.html.erb +8 -2
  98. data/lib/docyard/templates/partials/_scripts.html.erb +7 -0
  99. data/lib/docyard/templates/partials/_search_modal.html.erb +2 -6
  100. data/lib/docyard/templates/partials/_search_trigger.html.erb +2 -6
  101. data/lib/docyard/templates/partials/_sidebar.html.erb +21 -4
  102. data/lib/docyard/templates/partials/_tab_bar.html.erb +25 -0
  103. data/lib/docyard/templates/partials/_table_of_contents.html.erb +12 -12
  104. data/lib/docyard/templates/partials/_table_of_contents_toggle.html.erb +1 -3
  105. data/lib/docyard/templates/partials/_tabs.html.erb +2 -2
  106. data/lib/docyard/templates/partials/_theme_toggle.html.erb +2 -11
  107. data/lib/docyard/version.rb +1 -1
  108. metadata +33 -5
  109. data/lib/docyard/templates/markdown/getting-started/installation.md.erb +0 -77
  110. data/lib/docyard/templates/markdown/guides/configuration.md.erb +0 -202
  111. data/lib/docyard/templates/markdown/guides/markdown-features.md.erb +0 -247
  112. data/lib/docyard/templates/markdown/index.md.erb +0 -82
@@ -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;