docyard 0.8.0 → 1.0.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 (189) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +67 -1
  3. data/README.md +8 -253
  4. data/exe/docyard +6 -0
  5. data/lib/docyard/build/asset_bundler.rb +2 -2
  6. data/lib/docyard/build/file_copier.rb +12 -5
  7. data/lib/docyard/build/llms_txt_generator.rb +103 -0
  8. data/lib/docyard/build/sitemap_generator.rb +1 -1
  9. data/lib/docyard/build/static_generator.rb +115 -79
  10. data/lib/docyard/builder.rb +6 -2
  11. data/lib/docyard/cli.rb +14 -4
  12. data/lib/docyard/components/aliases.rb +12 -0
  13. data/lib/docyard/components/processors/abbreviation_processor.rb +72 -0
  14. data/lib/docyard/components/processors/accordion_processor.rb +81 -0
  15. data/lib/docyard/components/processors/badge_processor.rb +72 -0
  16. data/lib/docyard/components/processors/callout_processor.rb +9 -3
  17. data/lib/docyard/components/processors/cards_processor.rb +100 -0
  18. data/lib/docyard/components/processors/code_block_extended_fence_postprocessor.rb +24 -0
  19. data/lib/docyard/components/processors/code_block_extended_fence_preprocessor.rb +44 -0
  20. data/lib/docyard/components/processors/code_block_options_preprocessor.rb +34 -3
  21. data/lib/docyard/components/processors/code_block_processor.rb +11 -24
  22. data/lib/docyard/components/processors/code_group_processor.rb +182 -0
  23. data/lib/docyard/components/processors/code_snippet_import_preprocessor.rb +7 -1
  24. data/lib/docyard/components/processors/custom_anchor_processor.rb +42 -0
  25. data/lib/docyard/components/processors/file_tree_processor.rb +150 -0
  26. data/lib/docyard/components/processors/icon_processor.rb +8 -2
  27. data/lib/docyard/components/processors/image_caption_processor.rb +96 -0
  28. data/lib/docyard/components/processors/include_processor.rb +86 -0
  29. data/lib/docyard/components/processors/steps_processor.rb +89 -0
  30. data/lib/docyard/components/processors/tabs_processor.rb +9 -1
  31. data/lib/docyard/components/processors/tooltip_processor.rb +57 -0
  32. data/lib/docyard/components/processors/video_embed_processor.rb +207 -0
  33. data/lib/docyard/components/support/code_block/feature_extractor.rb +3 -1
  34. data/lib/docyard/components/support/code_block/icon_detector.rb +5 -12
  35. data/lib/docyard/components/support/code_block/line_number_resolver.rb +30 -0
  36. data/lib/docyard/components/support/code_detector.rb +2 -12
  37. data/lib/docyard/components/support/code_group/html_builder.rb +118 -0
  38. data/lib/docyard/components/support/markdown_code_block_helper.rb +56 -0
  39. data/lib/docyard/components/support/tabs/icon_detector.rb +6 -2
  40. data/lib/docyard/components/support/tabs/parser.rb +6 -23
  41. data/lib/docyard/config/analytics_resolver.rb +24 -0
  42. data/lib/docyard/config/branding_resolver.rb +84 -58
  43. data/lib/docyard/config/key_validator.rb +30 -0
  44. data/lib/docyard/config/logo_detector.rb +39 -0
  45. data/lib/docyard/config/schema.rb +39 -0
  46. data/lib/docyard/config/section.rb +21 -0
  47. data/lib/docyard/config/validation_helpers.rb +83 -0
  48. data/lib/docyard/config/validator.rb +45 -144
  49. data/lib/docyard/config/validators/navigation.rb +43 -0
  50. data/lib/docyard/config/validators/section.rb +114 -0
  51. data/lib/docyard/config.rb +45 -96
  52. data/lib/docyard/constants.rb +59 -0
  53. data/lib/docyard/{utils/errors.rb → errors.rb} +6 -0
  54. data/lib/docyard/initializer.rb +100 -49
  55. data/lib/docyard/navigation/page_navigation_builder.rb +65 -0
  56. data/lib/docyard/navigation/sidebar/auto_builder.rb +107 -0
  57. data/lib/docyard/navigation/sidebar/cache.rb +96 -0
  58. data/lib/docyard/navigation/sidebar/config_builder.rb +179 -0
  59. data/lib/docyard/navigation/sidebar/distributed_builder.rb +145 -0
  60. data/lib/docyard/navigation/sidebar/item.rb +6 -1
  61. data/lib/docyard/navigation/sidebar/local_config_loader.rb +69 -3
  62. data/lib/docyard/navigation/sidebar/renderer.rb +18 -3
  63. data/lib/docyard/navigation/sidebar_builder.rb +43 -81
  64. data/lib/docyard/rendering/branding_variables.rb +65 -0
  65. data/lib/docyard/rendering/icon_helpers.rb +14 -1
  66. data/lib/docyard/rendering/icons/devicons.rb +63 -0
  67. data/lib/docyard/rendering/icons.rb +26 -27
  68. data/lib/docyard/rendering/markdown.rb +20 -15
  69. data/lib/docyard/rendering/og_helpers.rb +36 -0
  70. data/lib/docyard/rendering/renderer.rb +87 -58
  71. data/lib/docyard/rendering/template_resolver.rb +14 -0
  72. data/lib/docyard/routing/fallback_resolver.rb +3 -3
  73. data/lib/docyard/search/build_indexer.rb +2 -2
  74. data/lib/docyard/search/dev_indexer.rb +36 -28
  75. data/lib/docyard/search/pagefind_support.rb +1 -1
  76. data/lib/docyard/server/asset_handler.rb +40 -15
  77. data/lib/docyard/server/dev_server.rb +90 -55
  78. data/lib/docyard/server/file_watcher.rb +68 -18
  79. data/lib/docyard/server/pagefind_handler.rb +1 -1
  80. data/lib/docyard/server/preview_server.rb +29 -33
  81. data/lib/docyard/server/rack_application.rb +38 -70
  82. data/lib/docyard/server/router.rb +11 -7
  83. data/lib/docyard/server/sse_server.rb +157 -0
  84. data/lib/docyard/server/static_file_app.rb +42 -0
  85. data/lib/docyard/templates/assets/css/components/abbreviation.css +86 -0
  86. data/lib/docyard/templates/assets/css/components/accordion.css +138 -0
  87. data/lib/docyard/templates/assets/css/components/badges.css +47 -0
  88. data/lib/docyard/templates/assets/css/components/banner.css +233 -0
  89. data/lib/docyard/templates/assets/css/components/breadcrumbs.css +2 -1
  90. data/lib/docyard/templates/assets/css/components/callout.css +26 -6
  91. data/lib/docyard/templates/assets/css/components/cards.css +100 -0
  92. data/lib/docyard/templates/assets/css/components/code-block.css +14 -2
  93. data/lib/docyard/templates/assets/css/components/code-group.css +294 -0
  94. data/lib/docyard/templates/assets/css/components/feedback.css +126 -0
  95. data/lib/docyard/templates/assets/css/components/figure.css +22 -0
  96. data/lib/docyard/templates/assets/css/components/file-tree.css +125 -0
  97. data/lib/docyard/templates/assets/css/components/heading-anchor.css +21 -13
  98. data/lib/docyard/templates/assets/css/components/icon.css +5 -0
  99. data/lib/docyard/templates/assets/css/components/lightbox.css +65 -0
  100. data/lib/docyard/templates/assets/css/components/nav-menu.css +20 -4
  101. data/lib/docyard/templates/assets/css/components/navigation.css +32 -3
  102. data/lib/docyard/templates/assets/css/components/page-actions.css +131 -0
  103. data/lib/docyard/templates/assets/css/components/prev-next.css +20 -22
  104. data/lib/docyard/templates/assets/css/components/search.css +6 -10
  105. data/lib/docyard/templates/assets/css/components/steps.css +122 -0
  106. data/lib/docyard/templates/assets/css/components/tab-bar.css +7 -4
  107. data/lib/docyard/templates/assets/css/components/table-of-contents.css +57 -11
  108. data/lib/docyard/templates/assets/css/components/tabs.css +13 -5
  109. data/lib/docyard/templates/assets/css/components/theme-toggle.css +3 -1
  110. data/lib/docyard/templates/assets/css/components/tooltip.css +113 -0
  111. data/lib/docyard/templates/assets/css/components/video.css +41 -0
  112. data/lib/docyard/templates/assets/css/landing.css +82 -13
  113. data/lib/docyard/templates/assets/css/layout.css +17 -0
  114. data/lib/docyard/templates/assets/css/markdown.css +25 -3
  115. data/lib/docyard/templates/assets/css/variables.css +13 -1
  116. data/lib/docyard/templates/assets/js/components/abbreviation.js +85 -0
  117. data/lib/docyard/templates/assets/js/components/banner.js +81 -0
  118. data/lib/docyard/templates/assets/js/components/code-group.js +286 -0
  119. data/lib/docyard/templates/assets/js/components/copy-page.js +115 -0
  120. data/lib/docyard/templates/assets/js/components/feedback.js +66 -0
  121. data/lib/docyard/templates/assets/js/components/file-tree.js +39 -0
  122. data/lib/docyard/templates/assets/js/components/lightbox.js +72 -0
  123. data/lib/docyard/templates/assets/js/components/navigation.js +3 -3
  124. data/lib/docyard/templates/assets/js/components/search.js +3 -3
  125. data/lib/docyard/templates/assets/js/components/table-of-contents.js +12 -6
  126. data/lib/docyard/templates/assets/js/components/tabs.js +45 -22
  127. data/lib/docyard/templates/assets/js/components/tooltip.js +118 -0
  128. data/lib/docyard/templates/assets/js/hot-reload.js +44 -0
  129. data/lib/docyard/templates/errors/404.html.erb +114 -5
  130. data/lib/docyard/templates/errors/500.html.erb +173 -10
  131. data/lib/docyard/templates/init/_sidebar.yml +36 -0
  132. data/lib/docyard/templates/init/docyard.yml +36 -0
  133. data/lib/docyard/templates/init/pages/components.md +146 -0
  134. data/lib/docyard/templates/init/pages/getting-started.md +94 -0
  135. data/lib/docyard/templates/init/pages/index.md +22 -0
  136. data/lib/docyard/templates/layouts/default.html.erb +11 -0
  137. data/lib/docyard/templates/layouts/splash.html.erb +15 -1
  138. data/lib/docyard/templates/partials/_accordion.html.erb +9 -0
  139. data/lib/docyard/templates/partials/_analytics.html.erb +24 -0
  140. data/lib/docyard/templates/partials/_banner.html.erb +27 -0
  141. data/lib/docyard/templates/partials/_card.html.erb +23 -0
  142. data/lib/docyard/templates/partials/_code_block.html.erb +1 -1
  143. data/lib/docyard/templates/partials/_feedback.html.erb +14 -0
  144. data/lib/docyard/templates/partials/_footer.html.erb +1 -1
  145. data/lib/docyard/templates/partials/_head.html.erb +79 -4
  146. data/lib/docyard/templates/partials/_icon_library.html.erb +8 -0
  147. data/lib/docyard/templates/partials/_nav_group.html.erb +6 -0
  148. data/lib/docyard/templates/partials/_nav_leaf.html.erb +3 -0
  149. data/lib/docyard/templates/partials/_page_actions.html.erb +21 -0
  150. data/lib/docyard/templates/partials/_scripts.html.erb +6 -3
  151. data/lib/docyard/templates/partials/_step.html.erb +14 -0
  152. data/lib/docyard/templates/partials/_tabs.html.erb +4 -1
  153. data/lib/docyard/utils/git_info.rb +157 -0
  154. data/lib/docyard/utils/hash_utils.rb +31 -0
  155. data/lib/docyard/utils/html_helpers.rb +8 -0
  156. data/lib/docyard/utils/logging.rb +44 -3
  157. data/lib/docyard/utils/path_resolver.rb +0 -10
  158. data/lib/docyard/utils/path_utils.rb +73 -0
  159. data/lib/docyard/version.rb +1 -1
  160. data/lib/docyard.rb +2 -2
  161. metadata +114 -47
  162. data/.github/ISSUE_TEMPLATE/bug_report.md +0 -31
  163. data/.github/ISSUE_TEMPLATE/feature_request.md +0 -19
  164. data/.github/pull_request_template.md +0 -14
  165. data/.github/workflows/ci.yml +0 -49
  166. data/.rubocop.yml +0 -42
  167. data/CODE_OF_CONDUCT.md +0 -132
  168. data/CONTRIBUTING.md +0 -55
  169. data/LICENSE.vscode-icons +0 -42
  170. data/Rakefile +0 -8
  171. data/lib/docyard/config/constants.rb +0 -31
  172. data/lib/docyard/navigation/sidebar/children_discoverer.rb +0 -51
  173. data/lib/docyard/navigation/sidebar/config_parser.rb +0 -208
  174. data/lib/docyard/navigation/sidebar/file_resolver.rb +0 -78
  175. data/lib/docyard/navigation/sidebar/file_system_scanner.rb +0 -78
  176. data/lib/docyard/navigation/sidebar/metadata_extractor.rb +0 -69
  177. data/lib/docyard/navigation/sidebar/metadata_reader.rb +0 -47
  178. data/lib/docyard/navigation/sidebar/path_prefixer.rb +0 -34
  179. data/lib/docyard/navigation/sidebar/sorter.rb +0 -21
  180. data/lib/docyard/navigation/sidebar/title_extractor.rb +0 -25
  181. data/lib/docyard/navigation/sidebar/tree_builder.rb +0 -139
  182. data/lib/docyard/rendering/icons/LICENSE.phosphor +0 -21
  183. data/lib/docyard/rendering/icons/file_types.rb +0 -79
  184. data/lib/docyard/rendering/icons/phosphor.rb +0 -90
  185. data/lib/docyard/rendering/language_mapping.rb +0 -52
  186. data/lib/docyard/templates/assets/js/reload.js +0 -98
  187. data/lib/docyard/templates/partials/_icon.html.erb +0 -1
  188. data/lib/docyard/templates/partials/_icon_file_extension.html.erb +0 -1
  189. data/sig/docyard.rbs +0 -4
@@ -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
+ }
@@ -62,7 +62,8 @@
62
62
  opacity: 0.7;
63
63
  }
64
64
 
65
- .tab-icon .docyard-icon {
65
+ .tab-icon .docyard-icon,
66
+ .tab-icon i[class*="ph-"] {
66
67
  width: 16px;
67
68
  height: 16px;
68
69
  }
@@ -89,10 +90,12 @@
89
90
  border-radius: 2px 2px 0 0;
90
91
  pointer-events: none;
91
92
  view-transition-name: tab-indicator;
93
+ opacity: 0;
92
94
  }
93
95
 
94
96
  .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);
97
+ opacity: 1;
98
+ transition: left 0.25s cubic-bezier(0.4, 0, 0.2, 1), width 0.25s cubic-bezier(0.4, 0, 0.2, 1), opacity 0.15s ease;
96
99
  }
97
100
 
98
101
  /* View Transitions API - animate indicator between pages */
@@ -133,9 +136,9 @@
133
136
  top: calc(var(--header-height) + var(--tab-bar-height));
134
137
  }
135
138
 
136
- /* Hide tab bar on mobile */
139
+ /* Hide tab bar on mobile - use .has-tabs for specificity to override .has-tabs .tab-bar { display: block } */
137
140
  @media (max-width: 1024px) {
138
- .tab-bar {
141
+ .has-tabs .tab-bar {
139
142
  display: none;
140
143
  }
141
144
 
@@ -107,12 +107,19 @@
107
107
  box-shadow: 0 0 0 var(--ring-width) oklch(from var(--ring) l c h / 50%);
108
108
  }
109
109
 
110
- .secondary-header-toc-toggle svg {
110
+ .secondary-header-toc-toggle .docyard-icon {
111
111
  transform: rotate(-90deg);
112
112
  transition: transform var(--transition-base);
113
113
  }
114
114
 
115
- .secondary-header-toc-toggle[aria-expanded="true"] svg {
115
+ .secondary-header-toc-toggle i[class*="ph-"] {
116
+ display: inline-block;
117
+ transform: rotate(-90deg);
118
+ transition: transform var(--transition-base);
119
+ }
120
+
121
+ .secondary-header-toc-toggle[aria-expanded="true"] .docyard-icon,
122
+ .secondary-header-toc-toggle[aria-expanded="true"] i[class*="ph-"] {
116
123
  transform: rotate(0deg);
117
124
  }
118
125
  }
@@ -216,7 +223,6 @@
216
223
  }
217
224
 
218
225
  .docyard-toc__nav {
219
- display: none;
220
226
  position: fixed;
221
227
  overflow-y: auto;
222
228
  overscroll-behavior: contain;
@@ -226,19 +232,26 @@
226
232
  border-radius: var(--radius-xl);
227
233
  box-shadow: var(--shadow-lg);
228
234
  z-index: 9999;
229
- transition: top 0.3s cubic-bezier(0.4, 0, 0.2, 1),
230
- opacity 0.2s ease,
231
- transform 0.2s ease;
232
- transform: translateY(-8px);
235
+ transform: scale(0.95) translateY(-8px);
236
+ transform-origin: top right;
233
237
  opacity: 0;
238
+ visibility: hidden;
234
239
  pointer-events: none;
240
+ transition:
241
+ transform 0.2s cubic-bezier(0.4, 0, 0.2, 1),
242
+ opacity 0.15s ease-out,
243
+ visibility 0.2s;
235
244
  }
236
245
 
237
246
  .docyard-toc__nav.is-expanded {
238
- display: block;
247
+ transform: scale(1) translateY(0);
239
248
  opacity: 1;
240
- transform: translateY(0);
249
+ visibility: visible;
241
250
  pointer-events: auto;
251
+ transition:
252
+ transform 0.25s cubic-bezier(0.34, 1.56, 0.64, 1),
253
+ opacity 0.2s ease-out,
254
+ visibility 0s;
242
255
  }
243
256
  }
244
257
 
@@ -249,6 +262,11 @@
249
262
  width: 280px;
250
263
  max-height: calc(100vh - var(--header-height) - 3rem - var(--spacing-8));
251
264
  }
265
+
266
+ .has-tabs .docyard-toc__nav {
267
+ top: calc(var(--header-height) + var(--tab-bar-height) + 3rem + var(--spacing-2));
268
+ max-height: calc(100vh - var(--header-height) - var(--tab-bar-height) - 3rem - var(--spacing-8));
269
+ }
252
270
  }
253
271
 
254
272
  @media (max-width: 1024px) {
@@ -257,6 +275,7 @@
257
275
  left: var(--spacing-4);
258
276
  right: var(--spacing-4);
259
277
  max-height: calc(100vh - var(--header-height) - 3rem - var(--spacing-2));
278
+ transform-origin: top center;
260
279
  }
261
280
 
262
281
  .secondary-header.shift-up ~ .layout .docyard-toc__nav {
@@ -270,13 +289,40 @@
270
289
  }
271
290
  }
272
291
 
292
+ /* Adjust TOC dropdown position when announcement banner is visible */
293
+ @media (max-width: 1280px) and (min-width: 1025px) {
294
+ body.has-announcement .docyard-toc__nav {
295
+ top: calc(var(--header-height) + var(--announcement-height) + 3rem + var(--spacing-2));
296
+ max-height: calc(100vh - var(--header-height) - var(--announcement-height) - 3rem - var(--spacing-8));
297
+ }
298
+
299
+ body.has-announcement.has-tabs .docyard-toc__nav {
300
+ top: calc(var(--header-height) + var(--tab-bar-height) + var(--announcement-height) + 3rem + var(--spacing-2));
301
+ max-height: calc(100vh - var(--header-height) - var(--tab-bar-height) - var(--announcement-height) - 3rem - var(--spacing-8));
302
+ }
303
+ }
304
+
305
+ @media (max-width: 1024px) {
306
+ body.has-announcement .docyard-toc__nav {
307
+ top: calc(var(--header-height) + var(--announcement-height) + 3rem - 2px);
308
+ max-height: calc(100vh - var(--header-height) - var(--announcement-height) - 3rem - var(--spacing-2));
309
+ }
310
+
311
+ body.has-announcement .secondary-header.shift-up ~ .layout .docyard-toc__nav {
312
+ top: calc(var(--announcement-height) + 3rem - 2px);
313
+ max-height: calc(100vh - var(--announcement-height) - 3rem - var(--spacing-2));
314
+ }
315
+ }
316
+
273
317
  @media (prefers-reduced-motion: reduce) {
274
318
  .docyard-toc__link,
275
- .docyard-toc__indicator {
319
+ .docyard-toc__indicator,
320
+ .docyard-toc__nav {
276
321
  transition: none;
277
322
  }
278
323
 
279
- .secondary-header-toc-toggle svg {
324
+ .secondary-header-toc-toggle .docyard-icon,
325
+ .secondary-header-toc-toggle i[class*="ph-"] {
280
326
  transition: none;
281
327
  }
282
328
  }
@@ -74,7 +74,8 @@
74
74
  flex-shrink: 0;
75
75
  }
76
76
 
77
- .docyard-tabs__icon .docyard-icon {
77
+ .docyard-tabs__icon .docyard-icon,
78
+ .docyard-tabs__icon i[class*="ph-"] {
78
79
  width: 1rem;
79
80
  height: 1rem;
80
81
  display: inline-flex;
@@ -90,17 +91,23 @@
90
91
  bottom: 0;
91
92
  left: 0;
92
93
  height: 2px;
93
- background: var(--foreground);
94
+ background: var(--primary);
94
95
  border-radius: 1px;
95
96
  pointer-events: none;
96
97
  z-index: 1;
97
-
98
+ opacity: 0;
99
+
98
100
  transition:
99
101
  transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1),
100
- width 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
102
+ width 0.3s cubic-bezier(0.34, 1.56, 0.64, 1),
103
+ opacity 0.15s ease;
101
104
  will-change: transform, width;
102
105
  }
103
106
 
107
+ .docyard-tabs__indicator.is-ready {
108
+ opacity: 1;
109
+ }
110
+
104
111
  .docyard-tabs__scroll-indicator {
105
112
  position: absolute;
106
113
  top: 0;
@@ -230,7 +237,8 @@
230
237
  gap: var(--spacing-1);
231
238
  }
232
239
 
233
- .docyard-tabs__icon .docyard-icon {
240
+ .docyard-tabs__icon .docyard-icon,
241
+ .docyard-tabs__icon i[class*="ph-"] {
234
242
  width: 0.875rem;
235
243
  height: 0.875rem;
236
244
  }
@@ -39,7 +39,9 @@
39
39
  }
40
40
 
41
41
  .theme-toggle-sun .docyard-icon,
42
- .theme-toggle-moon .docyard-icon {
42
+ .theme-toggle-moon .docyard-icon,
43
+ .theme-toggle-sun i[class*="ph-"],
44
+ .theme-toggle-moon i[class*="ph-"] {
43
45
  width: 1.125rem;
44
46
  height: 1.125rem;
45
47
  }
@@ -0,0 +1,113 @@
1
+ .docyard-tooltip {
2
+ text-decoration: underline;
3
+ text-decoration-style: dotted;
4
+ text-decoration-color: var(--muted-foreground);
5
+ text-underline-offset: 3px;
6
+ cursor: help;
7
+ position: relative;
8
+ }
9
+
10
+ .docyard-tooltip:hover {
11
+ text-decoration-color: var(--primary);
12
+ }
13
+
14
+ .docyard-tooltip-popover {
15
+ position: absolute;
16
+ z-index: 1000;
17
+ width: max-content;
18
+ max-width: 300px;
19
+ padding: var(--spacing-3) var(--spacing-4);
20
+ background: var(--background);
21
+ border: 1px solid var(--border);
22
+ border-radius: var(--radius-lg);
23
+ box-shadow:
24
+ 0 4px 6px -1px oklch(from var(--foreground) l c h / 8%),
25
+ 0 2px 4px -2px oklch(from var(--foreground) l c h / 6%);
26
+ pointer-events: none;
27
+ opacity: 0;
28
+ transform: translateY(-4px) scale(0.96);
29
+ transition:
30
+ opacity 0.15s ease,
31
+ transform 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);
32
+ }
33
+
34
+ .docyard-tooltip-popover.is-visible {
35
+ opacity: 1;
36
+ transform: translateY(0) scale(1);
37
+ pointer-events: auto;
38
+ }
39
+
40
+ .docyard-tooltip-popover::after {
41
+ content: "";
42
+ position: absolute;
43
+ bottom: -6px;
44
+ left: var(--arrow-left, 16px);
45
+ width: 10px;
46
+ height: 10px;
47
+ background: var(--background);
48
+ border-bottom: 1px solid var(--border);
49
+ border-right: 1px solid var(--border);
50
+ transform: rotate(45deg);
51
+ }
52
+
53
+ .docyard-tooltip-popover__term {
54
+ display: block;
55
+ font-weight: var(--font-semibold);
56
+ font-size: var(--text-sm);
57
+ color: var(--foreground);
58
+ margin-bottom: var(--spacing-1);
59
+ }
60
+
61
+ .docyard-tooltip-popover__description {
62
+ display: block;
63
+ font-size: var(--text-sm);
64
+ color: var(--muted-foreground);
65
+ line-height: var(--leading-relaxed);
66
+ }
67
+
68
+ .docyard-tooltip-popover__link {
69
+ display: inline-flex;
70
+ align-items: center;
71
+ gap: var(--spacing-1);
72
+ margin-top: var(--spacing-2);
73
+ font-size: var(--text-sm);
74
+ font-weight: var(--font-medium);
75
+ color: var(--foreground);
76
+ text-decoration: none;
77
+ }
78
+
79
+ .docyard-tooltip-popover__link:hover {
80
+ color: var(--primary);
81
+ }
82
+
83
+ .docyard-tooltip-popover__link-icon {
84
+ width: 14px;
85
+ height: 14px;
86
+ transition: transform 0.15s ease;
87
+ }
88
+
89
+ .docyard-tooltip-popover__link:hover .docyard-tooltip-popover__link-icon {
90
+ transform: translateX(2px);
91
+ }
92
+
93
+ .docyard-tooltip-popover.is-below::after {
94
+ top: -6px;
95
+ bottom: auto;
96
+ border-bottom: none;
97
+ border-right: none;
98
+ border-top: 1px solid var(--border);
99
+ border-left: 1px solid var(--border);
100
+ }
101
+
102
+ @media (max-width: 640px) {
103
+ .docyard-tooltip-popover {
104
+ max-width: 260px;
105
+ padding: var(--spacing-2) var(--spacing-3);
106
+ }
107
+
108
+ .docyard-tooltip-popover__term,
109
+ .docyard-tooltip-popover__description,
110
+ .docyard-tooltip-popover__link {
111
+ font-size: var(--text-xs);
112
+ }
113
+ }
@@ -0,0 +1,41 @@
1
+ .docyard-video {
2
+ position: relative;
3
+ width: 100%;
4
+ margin: var(--spacing-6) 0;
5
+ border-radius: var(--radius-xl);
6
+ overflow: hidden;
7
+ background-color: var(--muted);
8
+ aspect-ratio: 16 / 9;
9
+ }
10
+
11
+ .docyard-video iframe {
12
+ position: absolute;
13
+ top: 0;
14
+ left: 0;
15
+ width: 100%;
16
+ height: 100%;
17
+ border: none;
18
+ }
19
+
20
+ .docyard-video[style*="height"] {
21
+ aspect-ratio: unset;
22
+ }
23
+
24
+ .docyard-callout__body .docyard-video {
25
+ margin: var(--spacing-4) 0;
26
+ }
27
+
28
+ .docyard-callout__body .docyard-video:first-child {
29
+ margin-top: 0;
30
+ }
31
+
32
+ .docyard-callout__body .docyard-video:last-child {
33
+ margin-bottom: 0;
34
+ }
35
+
36
+ @media (max-width: 640px) {
37
+ .docyard-video {
38
+ margin: var(--spacing-4) 0;
39
+ border-radius: var(--radius-lg);
40
+ }
41
+ }
@@ -73,15 +73,15 @@
73
73
 
74
74
  .hero-bg--grid {
75
75
  background-image:
76
- linear-gradient(oklch(0 0 0 / 0.06) 1px, transparent 1px),
77
- linear-gradient(90deg, oklch(0 0 0 / 0.06) 1px, transparent 1px);
78
- background-size: 100px 100px;
76
+ linear-gradient(oklch(0 0 0 / 0.03) 1px, transparent 1px),
77
+ linear-gradient(90deg, oklch(0 0 0 / 0.03) 1px, transparent 1px);
78
+ background-size: 60px 60px;
79
79
  }
80
80
 
81
81
  .dark .hero-bg--grid {
82
82
  background-image:
83
- linear-gradient(oklch(1 0 0 / 0.08) 1px, transparent 1px),
84
- linear-gradient(90deg, oklch(1 0 0 / 0.08) 1px, transparent 1px);
83
+ linear-gradient(oklch(1 0 0 / 0.04) 1px, transparent 1px),
84
+ linear-gradient(90deg, oklch(1 0 0 / 0.04) 1px, transparent 1px);
85
85
  }
86
86
 
87
87
  .hero-bg--grid::after {
@@ -249,7 +249,7 @@
249
249
  background: linear-gradient(135deg,
250
250
  var(--foreground) 0%,
251
251
  var(--foreground) 40%,
252
- oklch(from var(--primary) calc(l + 0.1) c h) 100%);
252
+ oklch(from var(--primary) calc(l - 0.15) c h) 100%);
253
253
  -webkit-background-clip: text;
254
254
  -webkit-text-fill-color: transparent;
255
255
  background-clip: text;
@@ -314,12 +314,12 @@
314
314
 
315
315
  .hero-action--secondary {
316
316
  background: transparent;
317
- color: var(--foreground);
318
- border: 1px solid var(--border);
317
+ color: var(--muted-foreground);
318
+ border: none;
319
319
  }
320
320
 
321
321
  .hero-action--secondary:hover {
322
- background: var(--muted);
322
+ background: transparent;
323
323
  color: var(--foreground);
324
324
  }
325
325
 
@@ -382,6 +382,70 @@
382
382
  display: block;
383
383
  }
384
384
 
385
+ .hero-custom-visual {
386
+ position: relative;
387
+ z-index: 1;
388
+ }
389
+
390
+ .hero-custom-visual--side {
391
+ display: flex;
392
+ align-items: center;
393
+ justify-content: center;
394
+ }
395
+
396
+ .hero-custom-visual--bottom {
397
+ width: 100%;
398
+ max-width: 1100px;
399
+ margin: 0 auto;
400
+ padding: 0 var(--spacing-6);
401
+ margin-bottom: var(--spacing-2);
402
+ }
403
+
404
+ .hero--with-bottom-visual {
405
+ min-height: auto;
406
+ height: auto;
407
+ align-items: flex-start;
408
+ padding-top: 10rem;
409
+ padding-bottom: var(--spacing-4);
410
+ }
411
+
412
+ .hero--with-bottom-visual .hero-content {
413
+ padding-top: 0;
414
+ padding-bottom: var(--spacing-16);
415
+ }
416
+
417
+ @media (max-width: 1024px) {
418
+ .hero-custom-visual--side {
419
+ grid-column: 1 / -1;
420
+ order: 1;
421
+ width: 100%;
422
+ max-width: 1100px;
423
+ margin: 0 auto;
424
+ padding: 0 var(--spacing-4);
425
+ margin-bottom: var(--spacing-2);
426
+ }
427
+
428
+ .hero--with-image:has(.hero-custom-visual--side) {
429
+ min-height: auto;
430
+ height: auto;
431
+ padding-top: 7rem;
432
+ padding-bottom: var(--spacing-4);
433
+ }
434
+
435
+ .hero--with-image:has(.hero-custom-visual--side) .hero-content {
436
+ padding-top: 0;
437
+ padding-bottom: var(--spacing-16);
438
+ }
439
+
440
+ .hero-custom-visual--bottom {
441
+ padding: 0 var(--spacing-4);
442
+ }
443
+
444
+ .hero--with-bottom-visual {
445
+ padding-top: 7rem;
446
+ }
447
+ }
448
+
385
449
  .features-section {
386
450
  padding: var(--spacing-16) var(--spacing-6) var(--spacing-20);
387
451
  background: linear-gradient(180deg, var(--background) 0%, oklch(from var(--background) calc(l + 0.02) c h) 100%);
@@ -394,7 +458,7 @@
394
458
  .features-header {
395
459
  text-align: center;
396
460
  max-width: 600px;
397
- margin: 0 auto var(--spacing-12);
461
+ margin: 0 auto var(--spacing-20);
398
462
  }
399
463
 
400
464
  .features-label {
@@ -407,15 +471,15 @@
407
471
  }
408
472
 
409
473
  .features-title {
410
- font-size: var(--text-2xl);
411
- font-weight: var(--font-semibold);
474
+ font-size: clamp(2rem, 4vw, 3rem);
475
+ font-weight: 700;
412
476
  color: var(--foreground);
413
477
  margin: 0 0 var(--spacing-3) 0;
414
478
  }
415
479
 
416
480
  .features-description {
417
481
  color: var(--muted-foreground);
418
- font-size: var(--text-base);
482
+ font-size: var(--text-lg);
419
483
  margin: 0;
420
484
  line-height: 1.6;
421
485
  }
@@ -478,6 +542,7 @@
478
542
  flex-direction: column;
479
543
  gap: var(--spacing-4);
480
544
  padding: var(--spacing-6);
545
+ height: 100%;
481
546
  background: var(--card);
482
547
  border: 1px solid var(--border);
483
548
  border-radius: var(--radius-xl);
@@ -746,6 +811,10 @@ a.feature-card:active {
746
811
  padding: var(--spacing-10) var(--spacing-4) var(--spacing-12);
747
812
  }
748
813
 
814
+ .hero-custom-visual--bottom + .features-section {
815
+ padding-top: var(--spacing-2);
816
+ }
817
+
749
818
  .features-header {
750
819
  margin-bottom: var(--spacing-8);
751
820
  }
@@ -34,6 +34,7 @@ html:has(.has-tabs) {
34
34
  backdrop-filter: blur(12px);
35
35
  z-index: var(--z-header);
36
36
  transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
37
+ will-change: transform;
37
38
  }
38
39
 
39
40
  .header.hide-on-scroll {
@@ -200,6 +201,7 @@ html:has(.has-tabs) {
200
201
  z-index: var(--z-secondary-header);
201
202
  transition: top 0.3s cubic-bezier(0.4, 0, 0.2, 1), left 0.3s cubic-bezier(0.4, 0, 0.2, 1);
202
203
  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.02);
204
+ will-change: top, left;
203
205
  }
204
206
 
205
207
  .secondary-header.shift-up {
@@ -232,6 +234,7 @@ html:has(.has-tabs) {
232
234
  z-index: var(--z-secondary-header);
233
235
  transition: top 0.3s cubic-bezier(0.4, 0, 0.2, 1);
234
236
  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.02);
237
+ will-change: top;
235
238
  }
236
239
 
237
240
  .secondary-header.shift-up {
@@ -715,6 +718,13 @@ main.content {
715
718
 
716
719
  @media (max-width: 1280px) and (min-width: 1025px) {
717
720
  .doc-aside {
721
+ position: absolute;
722
+ width: 0;
723
+ height: 0;
724
+ overflow: visible;
725
+ }
726
+
727
+ .doc-aside .doc-footer-desktop {
718
728
  display: none;
719
729
  }
720
730
 
@@ -736,6 +746,13 @@ main.content {
736
746
 
737
747
  @media (max-width: 1024px) {
738
748
  .doc-aside {
749
+ position: absolute;
750
+ width: 0;
751
+ height: 0;
752
+ overflow: visible;
753
+ }
754
+
755
+ .doc-aside .doc-footer-desktop {
739
756
  display: none;
740
757
  }
741
758