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,125 @@
1
+ .docyard-filetree {
2
+ font-family: var(--font-mono);
3
+ font-size: var(--text-base);
4
+ line-height: 1.6;
5
+ margin: var(--spacing-4) 0;
6
+ }
7
+
8
+ .docyard-filetree__list {
9
+ list-style: none !important;
10
+ margin: 0 !important;
11
+ padding: 0 !important;
12
+ }
13
+
14
+ .docyard-filetree__list .docyard-filetree__list {
15
+ margin-left: var(--spacing-1) !important;
16
+ padding-left: var(--spacing-4) !important;
17
+ border-left: 1px solid var(--border);
18
+ overflow: hidden;
19
+ }
20
+
21
+ .docyard-filetree__item {
22
+ list-style: none !important;
23
+ margin: 0 !important;
24
+ padding: 0 !important;
25
+ }
26
+
27
+ .docyard-filetree__entry {
28
+ display: flex;
29
+ align-items: center;
30
+ gap: var(--spacing-2);
31
+ padding: var(--spacing-1) var(--spacing-2);
32
+ margin: 0 calc(-1 * var(--spacing-2));
33
+ border-radius: var(--radius-md);
34
+ cursor: default;
35
+ white-space: nowrap;
36
+ transition: background-color 0.15s ease;
37
+ }
38
+
39
+ .docyard-filetree__item--folder.docyard-filetree__item--has-children > .docyard-filetree__entry {
40
+ cursor: pointer;
41
+ user-select: none;
42
+ }
43
+
44
+ .docyard-filetree__item--folder.docyard-filetree__item--has-children > .docyard-filetree__entry:hover {
45
+ background-color: var(--muted);
46
+ }
47
+
48
+ .docyard-filetree__item--folder.docyard-filetree__item--has-children > .docyard-filetree__entry:active {
49
+ background-color: oklch(from var(--muted) calc(l - 0.05) c h);
50
+ transform: scale(0.995);
51
+ transition: transform 0.1s cubic-bezier(0.4, 0, 1, 1), background-color 0.1s ease;
52
+ }
53
+
54
+ .docyard-filetree__entry .docyard-icon,
55
+ .docyard-filetree__entry i[class*="ph-"] {
56
+ flex-shrink: 0;
57
+ display: inline-flex;
58
+ align-items: center;
59
+ justify-content: center;
60
+ width: 1.125rem;
61
+ height: 1.125rem;
62
+ transition: transform 0.2s cubic-bezier(0.34, 1.56, 0.64, 1);
63
+ }
64
+
65
+ .docyard-filetree__entry .docyard-icon svg {
66
+ width: 100%;
67
+ height: 100%;
68
+ }
69
+
70
+ .docyard-filetree__entry .ph-folder-open,
71
+ .docyard-filetree__entry .ph-folder {
72
+ color: var(--muted-foreground);
73
+ }
74
+
75
+ .docyard-filetree__entry .ph-file-text {
76
+ color: var(--muted-foreground);
77
+ opacity: 0.6;
78
+ }
79
+
80
+ .docyard-filetree__name {
81
+ color: var(--foreground);
82
+ transition: color 0.15s ease;
83
+ }
84
+
85
+ .docyard-filetree__item--folder > .docyard-filetree__entry .docyard-filetree__name {
86
+ font-weight: var(--font-medium);
87
+ }
88
+
89
+ .docyard-filetree__item--folder.docyard-filetree__item--has-children > .docyard-filetree__entry:hover .docyard-filetree__name {
90
+ color: var(--foreground);
91
+ }
92
+
93
+ .docyard-filetree__comment {
94
+ color: var(--muted-foreground);
95
+ font-style: italic;
96
+ margin-left: var(--spacing-2);
97
+ opacity: 0.7;
98
+ font-size: var(--text-sm);
99
+ }
100
+
101
+ .docyard-filetree__item--highlighted > .docyard-filetree__entry {
102
+ background-color: oklch(from var(--primary) l c h / 10%);
103
+ }
104
+
105
+ .docyard-filetree__item--highlighted > .docyard-filetree__entry .docyard-filetree__name {
106
+ color: var(--primary);
107
+ }
108
+
109
+ .docyard-filetree__item--highlighted > .docyard-filetree__entry:hover {
110
+ background-color: oklch(from var(--primary) l c h / 15%);
111
+ }
112
+
113
+ .docyard-filetree__item--collapsed > .docyard-filetree__list {
114
+ display: none;
115
+ }
116
+
117
+ @media (max-width: 640px) {
118
+ .docyard-filetree {
119
+ font-size: var(--text-sm);
120
+ }
121
+
122
+ .docyard-filetree__list .docyard-filetree__list {
123
+ padding-left: var(--spacing-3) !important;
124
+ }
125
+ }
@@ -5,8 +5,6 @@
5
5
  .content h6[id] {
6
6
  position: relative;
7
7
  scroll-margin-top: calc(var(--header-height) + var(--spacing-6));
8
- display: flex;
9
- align-items: center;
10
8
  }
11
9
 
12
10
  .has-tabs .content h2[id],
@@ -18,6 +16,7 @@
18
16
  }
19
17
 
20
18
  @media (max-width: 1280px) and (min-width: 1025px) {
19
+
21
20
  .content h2[id],
22
21
  .content h3[id],
23
22
  .content h4[id],
@@ -28,10 +27,11 @@
28
27
  }
29
28
 
30
29
  .heading-anchor {
31
- order: -1;
32
- font-size: 1.5rem;
33
- margin-right: 0.5rem;
34
- margin-left: -1.625rem;
30
+ position: absolute;
31
+ left: -1.75rem;
32
+ top: 50%;
33
+ transform: translateY(-50%);
34
+ font-size: 1.25rem;
35
35
  font-weight: var(--font-normal);
36
36
  color: var(--primary);
37
37
  text-decoration: none !important;
@@ -39,8 +39,6 @@
39
39
  transition: opacity var(--transition-fast);
40
40
  cursor: pointer;
41
41
  user-select: none;
42
- display: flex;
43
- align-items: center;
44
42
  }
45
43
 
46
44
  .heading-anchor:hover,
@@ -69,12 +67,22 @@
69
67
  }
70
68
 
71
69
  @media (max-width: 1024px) {
70
+ .content h2[id],
71
+ .content h3[id],
72
+ .content h4[id],
73
+ .content h5[id],
74
+ .content h6[id] {
75
+ display: flex;
76
+ align-items: center;
77
+ flex-wrap: wrap;
78
+ }
79
+
72
80
  .heading-anchor {
73
- order: 1;
74
- margin-left: var(--spacing-3);
75
- font-size: 1.3rem;
76
- margin-right: 0;
77
- opacity: 0.6;
81
+ position: static;
82
+ margin-left: var(--spacing-2);
83
+ font-size: 1.1rem;
84
+ opacity: 0.4;
85
+ transform: none;
78
86
  }
79
87
 
80
88
  .heading-anchor:hover,
@@ -1,3 +1,8 @@
1
+ i[class*="ph-"] {
2
+ font-size: 1.15em;
3
+ vertical-align: -0.15em;
4
+ }
5
+
1
6
  .docyard-icon {
2
7
  display: inline-flex;
3
8
  align-items: center;
@@ -0,0 +1,65 @@
1
+ .docyard-lightbox {
2
+ position: fixed;
3
+ inset: 0;
4
+ z-index: 9999;
5
+ display: flex;
6
+ align-items: center;
7
+ justify-content: center;
8
+ background: oklch(from var(--background) l c h / 75%);
9
+ backdrop-filter: blur(16px);
10
+ opacity: 0;
11
+ visibility: hidden;
12
+ transition: opacity 0.2s ease, visibility 0.2s ease;
13
+ cursor: zoom-out;
14
+ }
15
+
16
+ .docyard-lightbox.active {
17
+ opacity: 1;
18
+ visibility: visible;
19
+ }
20
+
21
+ .docyard-lightbox img {
22
+ max-width: 90vw;
23
+ max-height: 90vh;
24
+ object-fit: contain;
25
+ border-radius: var(--radius-xl);
26
+ border: 1px solid var(--border);
27
+ transform: scale(0.95);
28
+ transition: transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1);
29
+ cursor: default;
30
+ }
31
+
32
+ .docyard-lightbox.active img {
33
+ transform: scale(1);
34
+ }
35
+
36
+ .docyard-lightbox-close {
37
+ position: absolute;
38
+ top: var(--spacing-6);
39
+ right: var(--spacing-6);
40
+ width: 2.25rem;
41
+ height: 2.25rem;
42
+ display: flex;
43
+ align-items: center;
44
+ justify-content: center;
45
+ background: transparent;
46
+ border: none;
47
+ border-radius: var(--radius-4xl);
48
+ color: var(--muted-foreground);
49
+ cursor: pointer;
50
+ transition: background-color var(--transition-fast), color var(--transition-fast);
51
+ }
52
+
53
+ .docyard-lightbox-close:hover {
54
+ color: var(--foreground);
55
+ background-color: var(--muted);
56
+ }
57
+
58
+ .dark .docyard-lightbox-close:hover {
59
+ background-color: oklch(from var(--muted) l c h / 50%);
60
+ }
61
+
62
+ .docyard-lightbox-close svg {
63
+ width: 18px;
64
+ height: 18px;
65
+ }
@@ -33,17 +33,23 @@
33
33
  background: var(--background);
34
34
  border-bottom: 1px solid var(--border);
35
35
  z-index: calc(var(--z-dropdown) + 1);
36
- transform: translateY(-8px);
36
+ transform: scale(0.98) translateY(-8px);
37
+ transform-origin: top center;
37
38
  opacity: 0;
38
39
  pointer-events: none;
39
- transition: transform 0.15s ease-out, opacity 0.15s ease-out;
40
+ transition:
41
+ transform 0.15s cubic-bezier(0.4, 0, 0.2, 1),
42
+ opacity 0.12s ease-out;
40
43
  box-shadow: var(--shadow-lg);
41
44
  }
42
45
 
43
46
  .nav-menu-dropdown.is-open {
44
- transform: translateY(0);
47
+ transform: scale(1) translateY(0);
45
48
  opacity: 1;
46
49
  pointer-events: auto;
50
+ transition:
51
+ transform 0.2s cubic-bezier(0.34, 1.56, 0.64, 1),
52
+ opacity 0.15s ease-out;
47
53
  }
48
54
 
49
55
  .nav-menu-content {
@@ -96,7 +102,8 @@
96
102
  opacity: 0.7;
97
103
  }
98
104
 
99
- .nav-menu-item-icon .docyard-icon {
105
+ .nav-menu-item-icon .docyard-icon,
106
+ .nav-menu-item-icon i[class*="ph-"] {
100
107
  width: 18px;
101
108
  height: 18px;
102
109
  }
@@ -225,6 +232,15 @@
225
232
  }
226
233
  }
227
234
 
235
+ /* Adjust dropdown position when announcement banner is visible */
236
+ body.has-announcement .nav-menu-overlay {
237
+ top: calc(var(--header-height) + var(--announcement-height));
238
+ }
239
+
240
+ body.has-announcement .nav-menu-dropdown {
241
+ top: calc(var(--header-height) + var(--announcement-height));
242
+ }
243
+
228
244
  /* Reduced motion preference */
229
245
  @media (prefers-reduced-motion: reduce) {
230
246
  .nav-menu-overlay,
@@ -43,6 +43,10 @@
43
43
  height: 1rem;
44
44
  }
45
45
 
46
+ .nav-section-icon i[class*="ph-"] {
47
+ font-size: 1rem;
48
+ }
49
+
46
50
  .sidebar nav ul {
47
51
  list-style: none;
48
52
  padding: 0;
@@ -242,11 +246,19 @@
242
246
  transition: transform 0.35s cubic-bezier(0.34, 1.56, 0.64, 1);
243
247
  }
244
248
 
245
- [data-nav-toggle][aria-expanded="true"] .nav-group-icon .docyard-icon {
249
+ .nav-group-icon i[class*="ph-"] {
250
+ display: inline-block;
251
+ font-size: 1rem;
252
+ transition: transform 0.35s cubic-bezier(0.34, 1.56, 0.64, 1);
253
+ }
254
+
255
+ [data-nav-toggle][aria-expanded="true"] .nav-group-icon .docyard-icon,
256
+ [data-nav-toggle][aria-expanded="true"] .nav-group-icon i[class*="ph-"] {
246
257
  transform: rotate(90deg);
247
258
  }
248
259
 
249
- [data-nav-toggle][aria-expanded="false"] .nav-group-icon .docyard-icon {
260
+ [data-nav-toggle][aria-expanded="false"] .nav-group-icon .docyard-icon,
261
+ [data-nav-toggle][aria-expanded="false"] .nav-group-icon i[class*="ph-"] {
250
262
  transition: transform 0.2s cubic-bezier(0.4, 0, 1, 1);
251
263
  }
252
264
 
@@ -302,6 +314,10 @@
302
314
  height: 1rem;
303
315
  }
304
316
 
317
+ .nav-item-icon i[class*="ph-"] {
318
+ font-size: 1rem;
319
+ }
320
+
305
321
  .nav-item-text {
306
322
  flex: 1;
307
323
  min-width: 0;
@@ -322,17 +338,30 @@
322
338
  height: 0.75rem;
323
339
  }
324
340
 
341
+ .nav-item-external i[class*="ph-"] {
342
+ font-size: 0.75rem;
343
+ }
344
+
325
345
  @media (prefers-reduced-motion: reduce) {
326
346
 
327
347
  .sidebar nav a,
328
348
  .nav-group-header,
329
349
  .nav-group-icon .docyard-icon,
350
+ .nav-group-icon i[class*="ph-"],
330
351
  .nav-group-children,
331
352
  .mobile-menu-toggle {
332
353
  transition: none;
333
354
  }
334
355
 
335
- [data-nav-toggle][aria-expanded="true"] .nav-group-icon .docyard-icon {
356
+ [data-nav-toggle][aria-expanded="true"] .nav-group-icon .docyard-icon,
357
+ [data-nav-toggle][aria-expanded="true"] .nav-group-icon i[class*="ph-"] {
336
358
  transform: none;
337
359
  }
338
360
  }
361
+
362
+ .sidebar .docyard-badge {
363
+ margin-left: auto;
364
+ flex-shrink: 0;
365
+ padding: 0.0625rem 0.375rem;
366
+ font-size: 0.625rem;
367
+ }
@@ -0,0 +1,131 @@
1
+ .page-actions {
2
+ margin-top: var(--spacing-6);
3
+ padding-top: var(--spacing-4);
4
+ border-top: 1px solid var(--border);
5
+ }
6
+
7
+ .page-actions__copy-btn {
8
+ display: flex;
9
+ align-items: center;
10
+ gap: var(--spacing-2);
11
+ padding: 0;
12
+ background: none;
13
+ border: none;
14
+ font-family: inherit;
15
+ font-size: var(--text-sm);
16
+ color: var(--muted-foreground);
17
+ cursor: pointer;
18
+ transition: color var(--transition-fast);
19
+ }
20
+
21
+ .page-actions__copy-btn:hover {
22
+ color: var(--foreground);
23
+ }
24
+
25
+ .page-actions__copy-btn .docyard-icon,
26
+ .page-actions__copy-btn i[class*="ph-"] {
27
+ font-size: 1rem;
28
+ flex-shrink: 0;
29
+ }
30
+
31
+ .page-actions__copy-btn i[class*="ph-"] {
32
+ display: inline-block;
33
+ transition: transform 0.15s cubic-bezier(0.4, 0, 1, 1);
34
+ }
35
+
36
+ .page-actions__copy-btn.is-copied i[class*="ph-"] {
37
+ color: var(--success, #22c55e);
38
+ }
39
+
40
+ .page-actions__copy-btn.is-copied .page-actions__copy-text {
41
+ color: var(--success, #22c55e);
42
+ }
43
+
44
+ .page-actions__copy-btn i.icon-animate-in {
45
+ animation: iconPopIn 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
46
+ }
47
+
48
+ .page-actions__copy-btn i.icon-animate-out {
49
+ animation: iconPopOut 0.15s cubic-bezier(0.4, 0, 1, 1);
50
+ }
51
+
52
+ @keyframes iconPopIn {
53
+ 0% {
54
+ transform: scale(0);
55
+ opacity: 0;
56
+ }
57
+ 50% {
58
+ transform: scale(1.2);
59
+ }
60
+ 100% {
61
+ transform: scale(1);
62
+ opacity: 1;
63
+ }
64
+ }
65
+
66
+ @keyframes iconPopOut {
67
+ 0% {
68
+ transform: scale(1);
69
+ opacity: 1;
70
+ }
71
+ 100% {
72
+ transform: scale(0.8);
73
+ opacity: 0;
74
+ }
75
+ }
76
+
77
+ .page-actions__edit-link {
78
+ display: flex;
79
+ align-items: center;
80
+ gap: var(--spacing-2);
81
+ margin-top: var(--spacing-2);
82
+ font-size: var(--text-sm);
83
+ color: var(--muted-foreground);
84
+ text-decoration: none;
85
+ transition: color var(--transition-fast);
86
+ }
87
+
88
+ .page-actions__edit-link:hover {
89
+ color: var(--foreground);
90
+ }
91
+
92
+ .page-actions__edit-link .docyard-icon,
93
+ .page-actions__edit-link i[class*="ph-"] {
94
+ font-size: 1rem;
95
+ flex-shrink: 0;
96
+ }
97
+
98
+ .page-actions__last-updated {
99
+ margin-top: var(--spacing-3);
100
+ font-size: var(--text-xs);
101
+ color: oklch(from var(--muted-foreground) l c h / 80%);
102
+ }
103
+
104
+ .page-actions__last-updated time {
105
+ cursor: help;
106
+ border-bottom: 1px dotted currentColor;
107
+ }
108
+
109
+ .page-actions-mobile {
110
+ display: none;
111
+ }
112
+
113
+ @media (max-width: 1280px) {
114
+ .page-actions-mobile {
115
+ display: block;
116
+ margin-top: var(--spacing-12);
117
+ text-align: center;
118
+ }
119
+
120
+ .page-actions-mobile .page-actions {
121
+ border-top: none;
122
+ padding-top: 0;
123
+ margin-top: 0;
124
+ }
125
+
126
+ .page-actions-mobile .page-actions__copy-btn,
127
+ .page-actions-mobile .page-actions__edit-link {
128
+ width: 100%;
129
+ justify-content: center;
130
+ }
131
+ }
@@ -56,30 +56,32 @@
56
56
  justify-content: flex-end;
57
57
  }
58
58
 
59
- .pager-label .docyard-icon {
59
+ .pager-label .docyard-icon,
60
+ .pager-label i[class*="ph-"] {
60
61
  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);
62
+ opacity: 0.5;
63
+ transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
65
64
  }
66
65
 
67
- .pager-label .docyard-icon svg {
66
+ .pager-label .docyard-icon svg,
67
+ .pager-label i[class*="ph-"] {
68
68
  width: 1rem;
69
69
  height: 1rem;
70
70
  }
71
71
 
72
- .pager-link.prev .pager-label .docyard-icon {
73
- transform: translateX(6px);
72
+ .pager-link:hover .pager-label .docyard-icon,
73
+ .pager-link:hover .pager-label i[class*="ph-"] {
74
+ opacity: 1;
74
75
  }
75
76
 
76
- .pager-link.next .pager-label .docyard-icon {
77
- transform: translateX(-6px);
77
+ .pager-link.prev:hover .pager-label .docyard-icon,
78
+ .pager-link.prev:hover .pager-label i[class*="ph-"] {
79
+ transform: translateX(-4px);
78
80
  }
79
81
 
80
- .pager-link:hover .pager-label .docyard-icon {
81
- opacity: 1;
82
- transform: translateX(0);
82
+ .pager-link.next:hover .pager-label .docyard-icon,
83
+ .pager-link.next:hover .pager-label i[class*="ph-"] {
84
+ transform: translateX(4px);
83
85
  }
84
86
 
85
87
  .pager-title {
@@ -101,14 +103,9 @@
101
103
  padding: var(--spacing-3) var(--spacing-4);
102
104
  }
103
105
 
104
-
105
- .pager-label .docyard-icon {
106
- opacity: 0.6;
107
- transform: translateX(0);
108
- }
109
-
110
- .pager-link:hover .pager-label .docyard-icon {
111
- opacity: 1;
106
+ .pager-label .docyard-icon,
107
+ .pager-label i[class*="ph-"] {
108
+ opacity: 0.5;
112
109
  }
113
110
 
114
111
  .pager-title {
@@ -119,7 +116,8 @@
119
116
 
120
117
  @media (prefers-reduced-motion: reduce) {
121
118
  .pager-link,
122
- .pager-label .docyard-icon {
119
+ .pager-label .docyard-icon,
120
+ .pager-label i[class*="ph-"] {
123
121
  transition: none;
124
122
  }
125
123
  }
@@ -134,6 +134,7 @@
134
134
  transform: scale(0.95) translateY(-10px);
135
135
  opacity: 0;
136
136
  transition: transform var(--transition-base), opacity var(--transition-fast);
137
+ will-change: transform, opacity;
137
138
  }
138
139
 
139
140
  .search-modal.is-open .search-modal-container {
@@ -247,14 +248,8 @@
247
248
  opacity: 0.4;
248
249
  }
249
250
 
250
- .search-empty-icon .docyard-icon {
251
- width: 4rem;
252
- height: 4rem;
253
- }
254
-
255
- .search-empty-icon .docyard-icon svg {
256
- width: 100%;
257
- height: 100%;
251
+ .search-empty-icon {
252
+ font-size: var(--text-3xl);
258
253
  }
259
254
 
260
255
  .search-empty-title {
@@ -490,7 +485,7 @@
490
485
 
491
486
  @media (max-width: 1024px) {
492
487
 
493
-
488
+
494
489
  .search-trigger {
495
490
  min-width: auto;
496
491
  width: 2.25rem;
@@ -515,7 +510,8 @@
515
510
  display: none;
516
511
  }
517
512
 
518
- .search-trigger-icon .docyard-icon {
513
+ .search-trigger-icon .docyard-icon,
514
+ .search-trigger-icon i[class*="ph-"] {
519
515
  width: 1.25rem;
520
516
  height: 1.25rem;
521
517
  }