@clidey/dory 1.0.8 → 1.10.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 (210) hide show
  1. package/README.md +59 -164
  2. package/bin/chat-server.ts +270 -0
  3. package/bin/dist/analytics-server.d.ts +11 -0
  4. package/bin/dist/analytics-server.d.ts.map +1 -0
  5. package/bin/dist/analytics-server.js +121 -0
  6. package/bin/dist/analytics-server.js.map +1 -0
  7. package/bin/dist/automation.d.ts +35 -0
  8. package/bin/dist/automation.d.ts.map +1 -0
  9. package/bin/dist/automation.js +259 -0
  10. package/bin/dist/automation.js.map +1 -0
  11. package/bin/dist/chat-server.d.ts +8 -0
  12. package/bin/dist/chat-server.d.ts.map +1 -0
  13. package/bin/dist/chat-server.js +322 -0
  14. package/bin/dist/chat-server.js.map +1 -0
  15. package/bin/dist/check.d.ts +16 -0
  16. package/bin/dist/check.d.ts.map +1 -0
  17. package/bin/dist/check.js +247 -0
  18. package/bin/dist/check.js.map +1 -0
  19. package/bin/dist/dependency-overlay.d.ts +7 -0
  20. package/bin/dist/dependency-overlay.d.ts.map +1 -0
  21. package/bin/dist/dependency-overlay.js +137 -0
  22. package/bin/dist/dependency-overlay.js.map +1 -0
  23. package/bin/dist/dory.js +254 -402
  24. package/bin/dist/dory.js.map +1 -1
  25. package/bin/dist/i18n-init.d.ts +6 -0
  26. package/bin/dist/i18n-init.d.ts.map +1 -0
  27. package/bin/dist/i18n-init.js +56 -0
  28. package/bin/dist/i18n-init.js.map +1 -0
  29. package/bin/dist/mcp-http.d.ts +8 -0
  30. package/bin/dist/mcp-http.d.ts.map +1 -0
  31. package/bin/dist/mcp-http.js +72 -0
  32. package/bin/dist/mcp-http.js.map +1 -0
  33. package/bin/dist/mcp.d.ts +2 -0
  34. package/bin/dist/mcp.d.ts.map +1 -0
  35. package/bin/dist/mcp.js +81 -0
  36. package/bin/dist/mcp.js.map +1 -0
  37. package/bin/dist/preview-entry.d.ts +2 -0
  38. package/bin/dist/preview-entry.d.ts.map +1 -0
  39. package/bin/dist/preview-entry.js +6 -0
  40. package/bin/dist/preview-entry.js.map +1 -0
  41. package/bin/dist/preview-server.d.ts +5 -0
  42. package/bin/dist/preview-server.d.ts.map +1 -0
  43. package/bin/dist/preview-server.js +146 -0
  44. package/bin/dist/preview-server.js.map +1 -0
  45. package/bin/dist/preview-static.d.ts +7 -0
  46. package/bin/dist/preview-static.d.ts.map +1 -0
  47. package/bin/dist/preview-static.js +70 -0
  48. package/bin/dist/preview-static.js.map +1 -0
  49. package/bin/dist/project-config.d.ts +22 -0
  50. package/bin/dist/project-config.d.ts.map +1 -0
  51. package/bin/dist/project-config.js +44 -0
  52. package/bin/dist/project-config.js.map +1 -0
  53. package/dist/index.html +57 -0
  54. package/dist/runtime/dory-runtime.css +2 -0
  55. package/dist/runtime/dory-runtime.html +14 -0
  56. package/dist/runtime/dory-runtime.js +5490 -0
  57. package/docs/api-playground-demo.mdx +119 -0
  58. package/docs/api-reference/asyncapi.json +324 -0
  59. package/docs/api-reference/openapi.json +366 -0
  60. package/docs/api-reference/operations/create.mdx +5 -0
  61. package/docs/api-reference/operations/delete.mdx +5 -0
  62. package/docs/api-reference/operations/get.mdx +5 -0
  63. package/docs/api-reference/operations/update.mdx +5 -0
  64. package/docs/api-reference/websocket-operations/receive-chat-message.mdx +5 -0
  65. package/docs/api-reference/websocket-operations/receive-notifications.mdx +5 -0
  66. package/docs/api-reference/websocket-operations/receive-presence-update.mdx +5 -0
  67. package/docs/api-reference/websocket-operations/send-chat-message.mdx +5 -0
  68. package/docs/api-reference/websocket-operations/send-presence-update.mdx +5 -0
  69. package/docs/assets/dory.jpeg +0 -0
  70. package/docs/components/accordion.mdx +145 -0
  71. package/docs/components/callouts.mdx +134 -0
  72. package/docs/components/cards.mdx +153 -0
  73. package/docs/components/code-blocks.mdx +281 -0
  74. package/docs/components/expandable.mdx +189 -0
  75. package/docs/components/icons.mdx +71 -0
  76. package/docs/components/images.mdx +82 -0
  77. package/docs/components/latex.mdx +148 -0
  78. package/docs/components/layout.mdx +178 -0
  79. package/docs/components/lists.mdx +134 -0
  80. package/docs/components/mermaid.mdx +149 -0
  81. package/docs/components/overview.mdx +81 -0
  82. package/docs/components/source.mdx +130 -0
  83. package/docs/components/steps.mdx +122 -0
  84. package/docs/components/tables.mdx +114 -0
  85. package/docs/components/tags.mdx +179 -0
  86. package/docs/components/typography.mdx +185 -0
  87. package/docs/configuration/analytics.mdx +45 -0
  88. package/docs/configuration/chat.mdx +59 -0
  89. package/docs/configuration/dory-json.mdx +278 -0
  90. package/docs/configuration/embed.mdx +73 -0
  91. package/docs/configuration/fonts.mdx +86 -0
  92. package/docs/configuration/internationalization.mdx +61 -0
  93. package/docs/configuration/navigation.mdx +217 -0
  94. package/docs/configuration/theming.mdx +166 -0
  95. package/docs/contributing.mdx +47 -0
  96. package/docs/dory.json +136 -0
  97. package/docs/embed-example.html +176 -0
  98. package/docs/favicon.svg +18 -0
  99. package/docs/features.mdx +440 -0
  100. package/docs/getting-started/automation.mdx +76 -0
  101. package/docs/getting-started/configuration.mdx +95 -0
  102. package/docs/getting-started/custom-components.mdx +60 -0
  103. package/docs/getting-started/installation.mdx +88 -0
  104. package/docs/getting-started/quick-start.mdx +53 -0
  105. package/docs/introduction.mdx +50 -0
  106. package/docs/logo/logo.svg +18 -0
  107. package/docs/playgrounds/api-playground.mdx +122 -0
  108. package/docs/playgrounds/websocket-playground.mdx +98 -0
  109. package/docs/social-card.png +0 -0
  110. package/docs/social-card.svg +17 -0
  111. package/docs/websocket-playground-demo.mdx +135 -0
  112. package/package.json +23 -17
  113. package/scripts/verify-component-examples.mjs +126 -0
  114. package/scripts/verify-runtime-parity.mjs +147 -0
  115. package/src/app.css +22 -1
  116. package/src/assets/fonts/HankenGrotesk.ttf +0 -0
  117. package/src/assets/fonts/OFL.txt +94 -0
  118. package/src/components/chat-assistant.tsx +229 -0
  119. package/src/components/dropdown.tsx +3 -3
  120. package/src/components/error-boundary.tsx +2 -2
  121. package/src/components/hooks.tsx +20 -1
  122. package/src/components/navigation.tsx +82 -51
  123. package/src/components/notification.tsx +2 -3
  124. package/src/components/routes.tsx +17 -19
  125. package/src/components/search-index.test.ts +15 -0
  126. package/src/components/search-index.ts +49 -48
  127. package/src/components/search.tsx +208 -104
  128. package/src/components/store.ts +27 -9
  129. package/src/config/mdx-common.ts +11 -0
  130. package/src/config/mdx.ts +10 -11
  131. package/src/embed/loader.ts +0 -3
  132. package/src/embed/types.ts +0 -2
  133. package/src/embed/widget-iframe.ts +19 -21
  134. package/src/embedded-runtime/config.ts +138 -0
  135. package/src/embedded-runtime/index.tsx +680 -0
  136. package/src/embedded-runtime/runtime.html +14 -0
  137. package/src/entry-server.tsx +46 -124
  138. package/src/main.tsx +17 -5
  139. package/src/mdx/accordion.tsx +3 -3
  140. package/src/mdx/api-playground.tsx +18 -16
  141. package/src/mdx/async-api.tsx +2 -2
  142. package/src/mdx/card.tsx +3 -2
  143. package/src/mdx/code.tsx +11 -9
  144. package/src/mdx/fence.tsx +6 -5
  145. package/src/mdx/icon-grid.tsx +4 -1
  146. package/src/mdx/icon-names.test.ts +15 -0
  147. package/src/mdx/icon-names.ts +60 -0
  148. package/src/mdx/icon-source-variants.ts +102 -0
  149. package/src/mdx/icon.tsx +12 -73
  150. package/src/mdx/latex.test.ts +38 -0
  151. package/src/mdx/latex.tsx +42 -64
  152. package/src/mdx/mdx.tsx +1 -1
  153. package/src/mdx/mermaid.tsx +12 -6
  154. package/src/mdx/open-api.tsx +130 -74
  155. package/src/mdx/preprocess.test.ts +16 -0
  156. package/src/mdx/preprocess.ts +61 -0
  157. package/src/mdx/processor.test.ts +135 -37
  158. package/src/mdx/processor.ts +54 -92
  159. package/src/mdx/source.tsx +5 -4
  160. package/src/mdx/specimen.tsx +57 -43
  161. package/src/mdx/tabs.tsx +32 -21
  162. package/src/mdx/text.tsx +11 -11
  163. package/src/mdx/try-it-panel.tsx +284 -0
  164. package/src/mdx/type-scale.tsx +7 -7
  165. package/src/mdx/websocket-playground.tsx +21 -14
  166. package/src/plugins/analytics-injector.ts +8 -0
  167. package/src/plugins/chat-dev-server.ts +32 -0
  168. package/src/plugins/docs-assets.test.ts +25 -0
  169. package/src/plugins/docs-assets.ts +6 -2
  170. package/src/plugins/frontmatter-dev-server.ts +2 -2
  171. package/src/plugins/frontmatter-generator.ts +1 -1
  172. package/src/plugins/html-files-middleware.test.ts +21 -1
  173. package/src/plugins/html-files-middleware.ts +26 -6
  174. package/src/plugins/html-metadata-injector.ts +24 -4
  175. package/src/plugins/llm-txt-dev-server.ts +2 -2
  176. package/src/plugins/llm-txt-generator.ts +21 -4
  177. package/src/plugins/prerender.ts +47 -20
  178. package/src/plugins/robots-generator.ts +1 -1
  179. package/src/plugins/sanitize.ts +6 -5
  180. package/src/plugins/shared.ts +6 -18
  181. package/src/plugins/sitemap-generator.ts +1 -1
  182. package/src/plugins/social-preview.test.ts +71 -0
  183. package/src/plugins/social-preview.ts +87 -0
  184. package/src/plugins/unified-mdx-plugin.ts +1 -1
  185. package/src/theme.scss +630 -207
  186. package/src/types/config.ts +53 -1
  187. package/src/ui/breadcrumb.tsx +17 -0
  188. package/src/ui/docs-header-view.tsx +32 -0
  189. package/src/ui/docs-navigation-view.tsx +69 -0
  190. package/src/ui/docs-page-frame.tsx +50 -0
  191. package/src/ui/dory-mark.tsx +9 -0
  192. package/src/ui/header.tsx +33 -90
  193. package/src/ui/layout.tsx +99 -153
  194. package/src/ui/mobile-navigation.tsx +10 -8
  195. package/src/ui/page-actions.tsx +67 -0
  196. package/src/ui/page-feedback.tsx +50 -0
  197. package/src/ui/page-footer.tsx +23 -0
  198. package/src/ui/prev-next-link.tsx +15 -69
  199. package/src/ui/prev-next-view.tsx +27 -0
  200. package/src/ui/table-of-content-view.tsx +167 -0
  201. package/src/ui/table-of-content.tsx +25 -183
  202. package/src/utils/analytics.test.ts +36 -0
  203. package/src/utils/analytics.ts +35 -0
  204. package/src/utils/colors.ts +7 -0
  205. package/src/utils/content-scope.test.ts +26 -0
  206. package/src/utils/content-scope.ts +39 -0
  207. package/src/utils/search-content.ts +12 -0
  208. package/src/utils/theme.ts +1 -7
  209. package/vite.config.ssr.ts +4 -4
  210. package/vite.config.ts +22 -16
package/src/theme.scss CHANGED
@@ -3,157 +3,29 @@
3
3
  -webkit-font-smoothing: antialiased;
4
4
  -moz-osx-font-smoothing: grayscale;
5
5
 
6
- // Brand colors (dynamically set from dory.json via loadColors())
7
- --brand-foreground: #2C6BD4;
8
- --brand-primary: #2C6BD4;
9
- --brand-light: #2C6BD4;
10
- --brand-dark: #4787F3;
6
+ // UX brand.css owns the default palette. Dory keeps this alias for docs UI.
7
+ --brand-primary: var(--primary);
11
8
 
12
9
  // Font families
13
- --font-body: inherit;
14
- --font-heading: inherit;
15
- --font-mono: inherit;
10
+ --font-body: 'Hanken Grotesk', sans-serif;
11
+ --font-heading: 'Bricolage Grotesque', sans-serif;
12
+ --font-mono: 'JetBrains Mono', monospace;
16
13
 
17
- // ShadCN/clidey/ux compatible primary color
18
- --primary: var(--brand-light);
19
- --primary-rgb: var(--brand-light-rgb);
14
+ }
20
15
 
21
- --ring: rgba(0, 0, 0, 0.1);
16
+ :root[data-dory-colors="true"] {
17
+ --primary: var(--brand-light);
22
18
  }
23
19
 
24
- :root.dark {
20
+ :root.dark[data-dory-colors="true"] {
25
21
  --primary: var(--brand-dark);
26
- --primary-rgb: var(--brand-dark-rgb);
27
- --ring: rgba(255, 255, 255, 0.1);
28
22
  }
29
23
 
30
24
  // Apply background from CSS variables
31
25
  html, body, #app {
32
26
  background-color: var(--background);
33
27
  color: var(--foreground);
34
- }
35
-
36
- // === THEMED MODE: override Tailwind utility classes ===
37
- [data-dory-themed="true"] {
38
- // Navigation sidebar text
39
- .dory-navigation {
40
- a {
41
- color: var(--muted-foreground) !important;
42
- }
43
-
44
- a:hover {
45
- color: var(--foreground) !important;
46
- }
47
-
48
- a.font-semibold {
49
- color: var(--brand-foreground) !important;
50
- }
51
-
52
- h2, h3 {
53
- color: var(--foreground) !important;
54
- }
55
-
56
- ul[role="list"] {
57
- border-color: var(--border) !important;
58
- }
59
- }
60
-
61
- // Override hardcoded Tailwind text colors
62
- .text-slate-500,
63
- .text-slate-400,
64
- .text-slate-600,
65
- .text-zinc-500,
66
- .text-zinc-400,
67
- .text-gray-500,
68
- .text-gray-400 {
69
- color: var(--muted-foreground) !important;
70
- }
71
-
72
- .text-slate-900,
73
- .text-zinc-900,
74
- .text-gray-900 {
75
- color: var(--foreground) !important;
76
- }
77
-
78
- // Override hardcoded Tailwind border colors
79
- .border-slate-100,
80
- .border-slate-200,
81
- .border-slate-800,
82
- .border-zinc-200,
83
- .border-zinc-800 {
84
- border-color: var(--border) !important;
85
- }
86
-
87
- // Header
88
- .dory-header {
89
- border-color: var(--border) !important;
90
- }
91
-
92
- // Accordion & divider borders — subtle low opacity
93
- [data-slot="accordion-item"],
94
- hr,
95
- .border-t,
96
- .border-b {
97
- border-color: color-mix(in oklch, var(--foreground) 8%, transparent) !important;
98
- }
99
- }
100
-
101
- // === FONT OVERRIDES ===
102
- [data-dory-themed="true"] {
103
- // Page title — large display serif
104
- .dory-page-title {
105
- font-family: var(--font-heading, var(--font-body, inherit));
106
- font-weight: 700;
107
- font-variation-settings: "opsz" 96;
108
- letter-spacing: -0.02em;
109
- }
110
-
111
- // Subtitle / eyebrow — mono, muted amber
112
- .dory-subtitle {
113
- font-family: var(--font-mono, monospace);
114
- color: var(--brand-foreground);
115
- opacity: 0.8;
116
- letter-spacing: 0.15em;
117
- font-size: 11px;
118
- }
119
-
120
- // Article headings — serif with proper optical sizing
121
- article h2 {
122
- font-family: var(--font-heading, var(--font-body, inherit));
123
- font-weight: 600;
124
- font-variation-settings: "opsz" 48;
125
- letter-spacing: -0.015em;
126
- }
127
-
128
- article h3,
129
- article h4 {
130
- font-family: var(--font-body, inherit);
131
- font-weight: 600;
132
- }
133
-
134
- code, pre {
135
- font-family: var(--font-mono, monospace);
136
- }
137
- }
138
-
139
- // === CODE BLOCK STYLING ===
140
- // Make code blocks translucent to match app feel
141
- [data-dory-themed="true"] {
142
- [data-slot="card"],
143
- .bg-card {
144
- background-color: transparent !important;
145
- border-color: var(--border) !important;
146
- }
147
-
148
- pre {
149
- background-color: transparent !important;
150
- }
151
-
152
- // Inline code
153
- .dory-mdx-code {
154
- background-color: transparent !important;
155
- border: 1px solid var(--border);
156
- }
28
+ font-family: var(--font-body);
157
29
  }
158
30
 
159
31
  // === DEFAULT STYLES ===
@@ -171,38 +43,7 @@ article img {
171
43
  margin-bottom: 1rem;
172
44
  }
173
45
 
174
- [data-testid="header-actions"] button,
175
- [data-slot="dropdown-menu-content"] {
176
- border-color: var(--ring);
177
- }
178
-
179
- [data-slot="search-input-wrapper"] {
180
- font-size: 12px;
181
- outline: none;
182
- }
183
-
184
- [data-slot="search-input"] {
185
- font-size: 12px;
186
- }
187
-
188
- [data-slot="search-input-wrapper"]:focus-within {
189
- outline: none !important;
190
- }
191
-
192
- [role="dialog"] [data-slot="search-input-wrapper"]:focus-within {
193
- outline: none !important;
194
- border: 0px;
195
- box-shadow: none !important;
196
- }
197
-
198
46
  // === EDITORIAL STYLE (Dory v2) ===
199
- :root {
200
- --dory-code-string: #b65401;
201
- }
202
-
203
- :root.dark {
204
- --dory-code-string: #f4a261;
205
- }
206
47
 
207
48
  .font-heading {
208
49
  font-family: var(--font-heading, var(--font-body, inherit));
@@ -210,50 +51,50 @@ article img {
210
51
 
211
52
  .dory-page-title {
212
53
  font-family: var(--font-heading, var(--font-body, inherit));
213
- font-size: 1.625rem;
54
+ font-size: clamp(2.5rem, 5vw, 4rem);
214
55
  font-weight: 700;
215
- line-height: 1.15;
216
- letter-spacing: -0.025em;
217
- }
218
-
219
- .dory-subtitle {
220
- font-family: var(--font-mono, monospace);
221
- font-size: 11px;
222
- letter-spacing: 0.18em;
223
- color: var(--muted-foreground);
56
+ line-height: 1.02;
57
+ letter-spacing: -0.045em;
58
+ color: var(--foreground);
224
59
  }
225
60
 
226
61
  article {
227
62
  counter-reset: dory-section;
228
- font-size: 0.875rem;
229
- line-height: 1.6;
63
+ font-size: 1rem;
64
+ line-height: 1.65;
65
+
66
+ // Anchor jumps land below the sticky top bar (3.5rem) instead of under it.
67
+ h1, h2, h3, h4, h5, h6 {
68
+ scroll-margin-top: 5.5rem;
69
+ }
230
70
 
231
71
  .dory-h1 {
232
- font-size: 1.625rem;
72
+ font-size: 3rem;
233
73
  font-weight: 700;
234
- line-height: 1.15;
235
- letter-spacing: -0.025em;
74
+ line-height: 1.05;
75
+ letter-spacing: -0.035em;
236
76
  }
237
77
 
238
78
  .dory-h2 {
239
79
  counter-increment: dory-section;
240
80
  display: flex;
241
81
  align-items: center;
242
- gap: 0.625rem;
243
- font-size: 1.3125rem;
82
+ gap: 0.75rem;
83
+ font-size: 2.125rem;
244
84
  font-weight: 700;
245
- line-height: 1.2;
246
- letter-spacing: -0.02em;
85
+ line-height: 1.1;
86
+ letter-spacing: -0.03em;
247
87
 
248
88
  &::before {
249
89
  content: counter(dory-section, decimal-leading-zero);
250
90
  flex-shrink: 0;
251
- padding: 0.0625rem 0.375rem;
91
+ padding: 0.125rem 0.4375rem;
252
92
  border: 1px solid var(--border);
253
- border-radius: 0.3125rem;
93
+ border-radius: 0.375rem;
254
94
  background: var(--muted);
255
95
  font-family: var(--font-mono, monospace);
256
96
  font-size: 0.6875rem;
97
+ line-height: 1.5;
257
98
  font-weight: 400;
258
99
  letter-spacing: 0;
259
100
  color: var(--muted-foreground);
@@ -265,15 +106,15 @@ article {
265
106
  }
266
107
 
267
108
  .dory-h3 {
268
- font-size: 1.0625rem;
109
+ font-size: 1.375rem;
269
110
  font-weight: 700;
270
- letter-spacing: -0.01em;
111
+ letter-spacing: -0.02em;
271
112
  }
272
113
 
273
114
  .dory-h4 {
274
- font-size: 0.9375rem;
115
+ font-size: 1.125rem;
275
116
  font-weight: 600;
276
- letter-spacing: -0.005em;
117
+ letter-spacing: -0.01em;
277
118
  }
278
119
 
279
120
  // Unordered: small brand-colored squares. Ordered: mono two-digit counters.
@@ -374,7 +215,7 @@ article {
374
215
 
375
216
  .dory-line-add {
376
217
  background: var(--success-muted);
377
- border-left-color: #2f7d4a;
218
+ border-left-color: var(--success);
378
219
  }
379
220
 
380
221
  .dory-line-del {
@@ -397,7 +238,7 @@ article {
397
238
  }
398
239
 
399
240
  .dory-line-add .dory-line-marker {
400
- color: #2f7d4a;
241
+ color: var(--success);
401
242
  }
402
243
 
403
244
  .dory-line-del .dory-line-marker {
@@ -405,19 +246,12 @@ article {
405
246
  }
406
247
  }
407
248
 
408
- :root.dark .dory-code .dory-line-add {
409
- border-left-color: #6fbf87;
410
-
411
- .dory-line-marker {
412
- color: #6fbf87;
413
- }
414
- }
415
-
416
249
  // === PDF DETAILS ===
417
250
  .dory-lead {
418
- margin-top: 0.75rem;
419
- font-size: 0.9375rem;
420
- line-height: 1.6;
251
+ max-width: 40rem;
252
+ margin-top: 1.5rem;
253
+ font-size: 1.1875rem;
254
+ line-height: 1.55;
421
255
  color: var(--foreground);
422
256
  }
423
257
 
@@ -472,3 +306,592 @@ article .dory-h2 .dory-anchor {
472
306
  .dory-latex-inline .katex {
473
307
  font-size: 1.05em;
474
308
  }
309
+
310
+ // === CHROME: dark top bar and sidebar (fixed ink in both themes) ===
311
+ .dory-mono-label {
312
+ font-family: var(--font-mono, monospace);
313
+ font-size: 10px;
314
+ letter-spacing: 0.16em;
315
+ text-transform: uppercase;
316
+ color: rgba(255, 255, 255, 0.55);
317
+ }
318
+
319
+ .dory-docs-pill {
320
+ padding: 1px 6px;
321
+ border: 1px solid rgba(255, 255, 255, 0.22);
322
+ border-radius: 5px;
323
+ font-family: var(--font-mono, monospace);
324
+ font-size: 9px;
325
+ letter-spacing: 0.16em;
326
+ text-transform: uppercase;
327
+ color: rgba(255, 255, 255, 0.6);
328
+ }
329
+
330
+ .dory-topbar-tab {
331
+ display: flex;
332
+ align-items: center;
333
+ padding: 0 0.875rem;
334
+ border-bottom: 2px solid transparent;
335
+ font-size: 13px;
336
+ font-weight: 500;
337
+ color: rgba(255, 255, 255, 0.7);
338
+ transition: color 120ms ease;
339
+
340
+ &:hover {
341
+ color: #fff;
342
+ }
343
+
344
+ &.active {
345
+ color: #fff;
346
+ border-bottom-color: var(--sidebar-primary);
347
+ }
348
+ }
349
+
350
+ .dory-topbar-search {
351
+ [data-slot="search-input-wrapper"] {
352
+ width: 20rem;
353
+ height: 2.25rem;
354
+ padding-right: 2.75rem;
355
+ border-color: transparent;
356
+ border-radius: 0.5rem;
357
+ background: rgba(255, 255, 255, 0.08);
358
+ color: #fff;
359
+ box-shadow: none;
360
+
361
+ svg {
362
+ color: rgba(255, 255, 255, 0.6);
363
+ }
364
+ }
365
+
366
+ [data-slot="search-input"] {
367
+ color: #fff;
368
+
369
+ &::placeholder {
370
+ color: rgba(255, 255, 255, 0.55);
371
+ }
372
+ }
373
+ }
374
+
375
+ .dory-kbd {
376
+ position: absolute;
377
+ top: 50%;
378
+ right: 0.625rem;
379
+ transform: translateY(-50%);
380
+ padding: 1px 5px;
381
+ border-radius: 4px;
382
+ background: rgba(255, 255, 255, 0.1);
383
+ font-family: var(--font-mono, monospace);
384
+ font-size: 10px;
385
+ color: rgba(255, 255, 255, 0.7);
386
+ pointer-events: none;
387
+ }
388
+
389
+ .dory-mode button {
390
+ border-radius: 9999px;
391
+ border: 1px solid rgba(255, 255, 255, 0.15);
392
+ background: rgba(255, 255, 255, 0.06);
393
+ color: #fff;
394
+
395
+ &:hover {
396
+ background: rgba(255, 255, 255, 0.12);
397
+ }
398
+ }
399
+
400
+ .dory-sidebar-link {
401
+ position: relative;
402
+ display: flex;
403
+ align-items: center;
404
+ gap: 0.5rem;
405
+ padding: 0.4rem 0.625rem;
406
+ border-radius: 0.5rem;
407
+ color: rgba(255, 255, 255, 0.72);
408
+ transition: color 120ms ease, background-color 120ms ease;
409
+
410
+ &:hover {
411
+ color: #fff;
412
+ background: rgba(255, 255, 255, 0.05);
413
+ }
414
+
415
+ &.active {
416
+ color: #fff;
417
+ background: var(--sidebar-accent);
418
+
419
+ &::before {
420
+ content: "";
421
+ position: absolute;
422
+ left: -0.75rem;
423
+ top: 0.45rem;
424
+ bottom: 0.45rem;
425
+ width: 2px;
426
+ border-radius: 2px;
427
+ background: var(--sidebar-primary);
428
+ }
429
+ }
430
+ }
431
+
432
+ .dory-method {
433
+ flex-shrink: 0;
434
+ width: 2.25rem;
435
+ font-family: var(--font-mono, monospace);
436
+ font-size: 10px;
437
+ font-weight: 600;
438
+ letter-spacing: 0.04em;
439
+ }
440
+
441
+ .dory-badge {
442
+ margin-left: auto;
443
+ padding: 1px 6px;
444
+ border-radius: 4px;
445
+ background: var(--highlight);
446
+ font-family: var(--font-mono, monospace);
447
+ font-size: 9px;
448
+ font-weight: 600;
449
+ letter-spacing: 0.1em;
450
+ text-transform: uppercase;
451
+ color: var(--highlight-foreground);
452
+ }
453
+
454
+ .dory-sidebar-footer {
455
+ transition: opacity 120ms ease;
456
+
457
+ .dory-mono-label {
458
+ transition: color 120ms ease;
459
+ }
460
+
461
+ &:hover .dory-mono-label {
462
+ color: #fff;
463
+ }
464
+ }
465
+
466
+ // === PAGE CHROME: breadcrumb, page actions, feedback, pager, footer, TOC ===
467
+ .dory-breadcrumb {
468
+ font-family: var(--font-mono, monospace);
469
+ font-size: 11px;
470
+ letter-spacing: 0.18em;
471
+ text-transform: uppercase;
472
+ color: var(--muted-foreground);
473
+
474
+ [aria-current="page"] > span:last-child {
475
+ color: var(--foreground);
476
+ font-weight: 600;
477
+ }
478
+ }
479
+
480
+ .dory-page-actions {
481
+ display: flex;
482
+ flex-shrink: 0;
483
+ border: 1px solid var(--border);
484
+ border-radius: 0.625rem;
485
+ background: var(--card);
486
+ box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
487
+
488
+ > button,
489
+ .dory-page-actions-ai {
490
+ display: flex;
491
+ align-items: center;
492
+ gap: 0.4rem;
493
+ padding: 0.4rem 0.75rem;
494
+ font-size: 13px;
495
+ font-weight: 500;
496
+ color: var(--foreground);
497
+ transition: background-color 120ms ease;
498
+
499
+ &:hover {
500
+ background: var(--accent);
501
+ }
502
+ }
503
+
504
+ > button {
505
+ border-radius: 0.5625rem 0 0 0.5625rem;
506
+ }
507
+
508
+ .dory-page-actions-ai {
509
+ border-left: 1px solid var(--border);
510
+ border-radius: 0 0.5625rem 0.5625rem 0;
511
+ }
512
+ }
513
+
514
+ .dory-feedback button {
515
+ padding: 0.3rem 0.9rem;
516
+ border: 1px solid var(--border);
517
+ border-radius: 9999px;
518
+ background: var(--card);
519
+ font-size: 13px;
520
+ font-weight: 500;
521
+ transition: border-color 120ms ease;
522
+
523
+ &:hover {
524
+ border-color: var(--primary);
525
+ }
526
+ }
527
+
528
+ .dory-pager-card {
529
+ display: flex;
530
+ flex-direction: column;
531
+ gap: 0.375rem;
532
+ padding: 1.25rem 1.5rem;
533
+ border: 1px solid var(--border);
534
+ border-radius: 0.875rem;
535
+ background: var(--card);
536
+ transition: border-color 120ms ease;
537
+
538
+ &:hover {
539
+ border-color: var(--primary);
540
+ }
541
+ }
542
+
543
+ .dory-pager-label {
544
+ font-family: var(--font-mono, monospace);
545
+ font-size: 10px;
546
+ letter-spacing: 0.16em;
547
+ text-transform: uppercase;
548
+ color: var(--muted-foreground);
549
+ }
550
+
551
+ .dory-pager-title {
552
+ font-family: var(--font-heading, var(--font-body, inherit));
553
+ font-size: 1.1875rem;
554
+ font-weight: 700;
555
+ letter-spacing: -0.015em;
556
+ color: var(--foreground);
557
+ }
558
+
559
+ .dory-page-footer {
560
+ font-family: var(--font-mono, monospace);
561
+ font-size: 10px;
562
+ letter-spacing: 0.16em;
563
+ text-transform: uppercase;
564
+ color: var(--muted-foreground);
565
+
566
+ a:hover {
567
+ color: var(--foreground);
568
+ }
569
+ }
570
+
571
+ .dory-toc-label {
572
+ font-family: var(--font-mono, monospace);
573
+ font-size: 10px;
574
+ font-weight: 400;
575
+ letter-spacing: 0.18em;
576
+ text-transform: uppercase;
577
+ color: var(--muted-foreground);
578
+ }
579
+
580
+ .dory-toc-track {
581
+ height: 2px;
582
+ border-radius: 2px;
583
+ background: var(--border);
584
+ }
585
+
586
+ .dory-toc-fill {
587
+ height: 100%;
588
+ border-radius: 2px;
589
+ background: var(--primary);
590
+ transition: width 80ms linear;
591
+ }
592
+
593
+ .dory-toc-list {
594
+ border-left: 1px solid var(--border);
595
+ }
596
+
597
+ .dory-toc-link {
598
+ position: relative;
599
+ display: flex;
600
+ gap: 0.625rem;
601
+ padding: 0.3rem 0 0.3rem 0.75rem;
602
+ font-size: 13px;
603
+ line-height: 1.4;
604
+ color: var(--muted-foreground);
605
+ transition: color 120ms ease;
606
+
607
+ &:hover {
608
+ color: var(--foreground);
609
+ }
610
+
611
+ &.active {
612
+ color: var(--foreground);
613
+ font-weight: 600;
614
+
615
+ &::before {
616
+ content: "";
617
+ position: absolute;
618
+ left: -1px;
619
+ top: 0.25rem;
620
+ bottom: 0.25rem;
621
+ width: 2px;
622
+ border-radius: 2px;
623
+ background: var(--primary);
624
+ }
625
+ }
626
+
627
+ &.dory-toc-sub {
628
+ padding-left: 2.6rem;
629
+ font-size: 12px;
630
+ }
631
+ }
632
+
633
+ .dory-toc-number {
634
+ flex-shrink: 0;
635
+ padding-top: 0.1rem;
636
+ font-family: var(--font-mono, monospace);
637
+ font-size: 10px;
638
+ font-weight: 400;
639
+ color: var(--muted-foreground);
640
+ }
641
+
642
+ .dory-toc-actions a {
643
+ display: flex;
644
+ align-items: center;
645
+ gap: 0.5rem;
646
+ font-size: 12.5px;
647
+ color: var(--muted-foreground);
648
+ transition: color 120ms ease;
649
+
650
+ &:hover {
651
+ color: var(--foreground);
652
+ }
653
+ }
654
+
655
+ // Soft glow in the top-right of the content panel.
656
+ :root {
657
+ --dory-glow: rgba(244, 214, 160, 0.4);
658
+ }
659
+
660
+ :root.dark {
661
+ --dory-glow: rgba(148, 163, 184, 0.13);
662
+ }
663
+
664
+ .dory-main {
665
+ background-image: radial-gradient(60rem 38rem at 78% -4rem, var(--dory-glow), transparent 70%);
666
+ background-repeat: no-repeat;
667
+ }
668
+
669
+ // === TRY IT PANEL ===
670
+ .dory-tryit-label {
671
+ font-family: var(--font-mono, monospace);
672
+ font-size: 10px;
673
+ letter-spacing: 0.18em;
674
+ text-transform: uppercase;
675
+ color: var(--muted-foreground);
676
+ }
677
+
678
+ .dory-tryit-input {
679
+ display: block;
680
+ width: 100%;
681
+ height: 2.5rem;
682
+ padding: 0 0.75rem;
683
+ border: 1px solid var(--border);
684
+ border-radius: 0.5rem;
685
+ background: var(--card);
686
+ font-family: var(--font-mono, monospace);
687
+ font-size: 13.5px;
688
+ color: var(--foreground);
689
+ outline: none;
690
+ transition: border-color 120ms ease;
691
+
692
+ &:focus {
693
+ border-color: var(--primary);
694
+ }
695
+
696
+ &.font-sans {
697
+ font-family: var(--font-body, inherit);
698
+ }
699
+ }
700
+
701
+ .dory-tryit-response {
702
+ border: 1px solid var(--border);
703
+ border-radius: 0.625rem;
704
+ background: var(--card);
705
+ }
706
+
707
+ .dory-tryit-cancel,
708
+ .dory-tryit-send {
709
+ display: flex;
710
+ align-items: center;
711
+ justify-content: center;
712
+ gap: 0.5rem;
713
+ height: 2.5rem;
714
+ border-radius: 0.5rem;
715
+ font-size: 14px;
716
+ font-weight: 500;
717
+ transition: background-color 120ms ease, border-color 120ms ease;
718
+ }
719
+
720
+ .dory-tryit-cancel {
721
+ padding: 0 1rem;
722
+ border: 1px solid var(--border);
723
+ background: var(--card);
724
+ color: var(--foreground);
725
+
726
+ &:hover {
727
+ border-color: var(--muted-foreground);
728
+ }
729
+ }
730
+
731
+ .dory-tryit-send {
732
+ flex: 1;
733
+ background: var(--primary);
734
+ color: #fff;
735
+
736
+ &:hover {
737
+ background: color-mix(in oklch, var(--primary) 88%, black);
738
+ }
739
+
740
+ &:disabled {
741
+ opacity: 0.7;
742
+ }
743
+ }
744
+
745
+ // === SEARCH DIALOG ===
746
+ .dory-search-panel {
747
+ border: 1px solid var(--border);
748
+ border-radius: 1.25rem;
749
+ background: var(--card);
750
+ box-shadow: 0 24px 64px -16px rgba(15, 23, 42, 0.35);
751
+ }
752
+
753
+ .dory-search-ask-button {
754
+ flex-shrink: 0;
755
+ border-radius: 0.625rem;
756
+ padding: 0.5rem 0.875rem;
757
+ background: color-mix(in oklch, var(--brand-primary) 22%, var(--card));
758
+ color: var(--foreground);
759
+ font-size: 0.875rem;
760
+ font-weight: 600;
761
+ white-space: nowrap;
762
+
763
+ &:hover,
764
+ &:focus-visible {
765
+ background: color-mix(in oklch, var(--brand-primary) 34%, var(--card));
766
+ }
767
+ }
768
+
769
+ .dory-search-active {
770
+ flex-shrink: 0;
771
+ border-radius: 0.625rem;
772
+ padding: 0.5rem 0.875rem;
773
+ background: color-mix(in oklch, var(--brand-primary) 22%, var(--card));
774
+ color: var(--foreground);
775
+ font-size: 0.875rem;
776
+ font-weight: 600;
777
+ }
778
+
779
+ .dory-search-tabs {
780
+ background: var(--card);
781
+ }
782
+
783
+ .dory-search-footer {
784
+ display: flex;
785
+ flex-wrap: wrap;
786
+ align-items: center;
787
+ gap: 0.625rem 1.25rem;
788
+ border-top: 1px solid var(--border);
789
+ padding: 0.75rem 1.5rem;
790
+ color: var(--muted-foreground);
791
+ font-size: 0.75rem;
792
+ }
793
+
794
+ .dory-search-footer span:last-child {
795
+ margin-left: auto;
796
+ }
797
+
798
+ .dory-search-chat {
799
+ background: var(--card);
800
+ }
801
+
802
+ .dory-chat-answer {
803
+ max-width: 50rem;
804
+ }
805
+
806
+ .dory-chat-composer {
807
+ background: var(--card);
808
+ }
809
+
810
+ @media (max-width: 640px) {
811
+ .dory-search-active {
812
+ display: none;
813
+ }
814
+
815
+ .dory-search-panel {
816
+ border-radius: 1rem;
817
+ }
818
+
819
+ .dory-search-footer {
820
+ gap: 0.5rem;
821
+ padding: 0.625rem 1rem;
822
+ }
823
+
824
+ .dory-search-footer span:last-child {
825
+ margin-left: 0;
826
+ }
827
+ }
828
+
829
+ .dory-search-input {
830
+ font-size: 1.25rem;
831
+ color: var(--foreground);
832
+
833
+ &::-webkit-search-cancel-button {
834
+ display: none;
835
+ }
836
+
837
+ &::placeholder {
838
+ color: var(--muted-foreground);
839
+ opacity: 0.8;
840
+ }
841
+ }
842
+
843
+ .dory-search-esc {
844
+ padding: 2px 8px;
845
+ border: 1px solid var(--border);
846
+ border-radius: 0.375rem;
847
+ font-family: var(--font-mono, monospace);
848
+ font-size: 11px;
849
+ letter-spacing: 0.08em;
850
+ text-transform: uppercase;
851
+ color: var(--muted-foreground);
852
+ }
853
+
854
+ .dory-search-result[aria-selected="true"] {
855
+ background: var(--muted);
856
+ }
857
+
858
+ .dory-search-highlight {
859
+ background: transparent;
860
+ color: inherit;
861
+ font-weight: inherit;
862
+ text-decoration: underline;
863
+ text-decoration-color: var(--primary);
864
+ text-underline-offset: 0.18em;
865
+ }
866
+
867
+ .dory-search-ask-result {
868
+ margin: 0 0.75rem;
869
+ border-radius: 0.75rem;
870
+ background: var(--accent);
871
+ }
872
+
873
+ .dory-search-ask-result[aria-selected="true"] {
874
+ background: color-mix(in oklch, var(--primary) 20%, var(--card));
875
+ }
876
+
877
+ .dory-search-key {
878
+ border: 1px solid var(--border);
879
+ border-radius: 0.375rem;
880
+ padding: 0.2rem 0.4rem;
881
+ font-family: var(--font-mono, monospace);
882
+ }
883
+
884
+ .dory-search-eyebrow {
885
+ font-family: var(--font-mono, monospace);
886
+ font-size: 11px;
887
+ letter-spacing: 0.18em;
888
+ text-transform: uppercase;
889
+ color: var(--muted-foreground);
890
+ }
891
+
892
+ .dory-search-title {
893
+ margin-top: 0.125rem;
894
+ font-size: 1.0625rem;
895
+ font-weight: 600;
896
+ color: var(--foreground);
897
+ }