@clidey/dory 1.0.8 → 1.9.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 (198) hide show
  1. package/README.md +12 -1
  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/dory.js +252 -402
  20. package/bin/dist/dory.js.map +1 -1
  21. package/bin/dist/i18n-init.d.ts +6 -0
  22. package/bin/dist/i18n-init.d.ts.map +1 -0
  23. package/bin/dist/i18n-init.js +56 -0
  24. package/bin/dist/i18n-init.js.map +1 -0
  25. package/bin/dist/mcp-http.d.ts +8 -0
  26. package/bin/dist/mcp-http.d.ts.map +1 -0
  27. package/bin/dist/mcp-http.js +72 -0
  28. package/bin/dist/mcp-http.js.map +1 -0
  29. package/bin/dist/mcp.d.ts +2 -0
  30. package/bin/dist/mcp.d.ts.map +1 -0
  31. package/bin/dist/mcp.js +81 -0
  32. package/bin/dist/mcp.js.map +1 -0
  33. package/bin/dist/preview-entry.d.ts +2 -0
  34. package/bin/dist/preview-entry.d.ts.map +1 -0
  35. package/bin/dist/preview-entry.js +6 -0
  36. package/bin/dist/preview-entry.js.map +1 -0
  37. package/bin/dist/preview-server.d.ts +5 -0
  38. package/bin/dist/preview-server.d.ts.map +1 -0
  39. package/bin/dist/preview-server.js +159 -0
  40. package/bin/dist/preview-server.js.map +1 -0
  41. package/bin/dist/project-config.d.ts +22 -0
  42. package/bin/dist/project-config.d.ts.map +1 -0
  43. package/bin/dist/project-config.js +44 -0
  44. package/bin/dist/project-config.js.map +1 -0
  45. package/dist/index.html +57 -0
  46. package/dist/runtime/dory-runtime.css +2 -0
  47. package/dist/runtime/dory-runtime.html +14 -0
  48. package/dist/runtime/dory-runtime.js +5490 -0
  49. package/docs/api-playground-demo.mdx +119 -0
  50. package/docs/api-reference/asyncapi.json +324 -0
  51. package/docs/api-reference/openapi.json +366 -0
  52. package/docs/api-reference/operations/create.mdx +5 -0
  53. package/docs/api-reference/operations/delete.mdx +5 -0
  54. package/docs/api-reference/operations/get.mdx +5 -0
  55. package/docs/api-reference/operations/update.mdx +5 -0
  56. package/docs/api-reference/websocket-operations/receive-chat-message.mdx +5 -0
  57. package/docs/api-reference/websocket-operations/receive-notifications.mdx +5 -0
  58. package/docs/api-reference/websocket-operations/receive-presence-update.mdx +5 -0
  59. package/docs/api-reference/websocket-operations/send-chat-message.mdx +5 -0
  60. package/docs/api-reference/websocket-operations/send-presence-update.mdx +5 -0
  61. package/docs/assets/dory.jpeg +0 -0
  62. package/docs/components/accordion.mdx +145 -0
  63. package/docs/components/callouts.mdx +134 -0
  64. package/docs/components/cards.mdx +153 -0
  65. package/docs/components/code-blocks.mdx +281 -0
  66. package/docs/components/expandable.mdx +189 -0
  67. package/docs/components/icons.mdx +71 -0
  68. package/docs/components/images.mdx +82 -0
  69. package/docs/components/latex.mdx +148 -0
  70. package/docs/components/layout.mdx +175 -0
  71. package/docs/components/lists.mdx +134 -0
  72. package/docs/components/mermaid.mdx +149 -0
  73. package/docs/components/overview.mdx +81 -0
  74. package/docs/components/source.mdx +130 -0
  75. package/docs/components/steps.mdx +122 -0
  76. package/docs/components/tables.mdx +114 -0
  77. package/docs/components/tags.mdx +179 -0
  78. package/docs/components/typography.mdx +185 -0
  79. package/docs/configuration/analytics.mdx +45 -0
  80. package/docs/configuration/chat.mdx +59 -0
  81. package/docs/configuration/dory-json.mdx +278 -0
  82. package/docs/configuration/embed.mdx +73 -0
  83. package/docs/configuration/fonts.mdx +86 -0
  84. package/docs/configuration/internationalization.mdx +61 -0
  85. package/docs/configuration/navigation.mdx +217 -0
  86. package/docs/configuration/theming.mdx +166 -0
  87. package/docs/dory.json +129 -0
  88. package/docs/embed-example.html +176 -0
  89. package/docs/favicon.svg +18 -0
  90. package/docs/features.mdx +440 -0
  91. package/docs/getting-started/automation.mdx +76 -0
  92. package/docs/getting-started/configuration.mdx +95 -0
  93. package/docs/getting-started/installation.mdx +88 -0
  94. package/docs/getting-started/quick-start.mdx +53 -0
  95. package/docs/getting-started/whodb-ee-apps.mdx +122 -0
  96. package/docs/introduction.mdx +50 -0
  97. package/docs/logo/logo.svg +18 -0
  98. package/docs/playgrounds/api-playground.mdx +122 -0
  99. package/docs/playgrounds/websocket-playground.mdx +98 -0
  100. package/docs/social-card.png +0 -0
  101. package/docs/social-card.svg +17 -0
  102. package/docs/websocket-playground-demo.mdx +135 -0
  103. package/package.json +23 -17
  104. package/scripts/verify-runtime-parity.mjs +146 -0
  105. package/src/app.css +19 -1
  106. package/src/assets/fonts/HankenGrotesk.ttf +0 -0
  107. package/src/assets/fonts/OFL.txt +94 -0
  108. package/src/components/chat-assistant.tsx +229 -0
  109. package/src/components/dropdown.tsx +3 -3
  110. package/src/components/error-boundary.tsx +2 -2
  111. package/src/components/hooks.tsx +20 -1
  112. package/src/components/navigation.tsx +82 -51
  113. package/src/components/notification.tsx +2 -3
  114. package/src/components/routes.tsx +17 -19
  115. package/src/components/search-index.test.ts +15 -0
  116. package/src/components/search-index.ts +49 -48
  117. package/src/components/search.tsx +208 -104
  118. package/src/components/store.ts +27 -9
  119. package/src/config/mdx-common.ts +11 -0
  120. package/src/config/mdx.ts +10 -11
  121. package/src/embed/loader.ts +0 -3
  122. package/src/embed/types.ts +0 -2
  123. package/src/embed/widget-iframe.ts +19 -21
  124. package/src/embedded-runtime/config.ts +138 -0
  125. package/src/embedded-runtime/index.tsx +680 -0
  126. package/src/embedded-runtime/runtime.html +14 -0
  127. package/src/entry-server.tsx +46 -124
  128. package/src/main.tsx +16 -4
  129. package/src/mdx/accordion.tsx +3 -3
  130. package/src/mdx/api-playground.tsx +18 -16
  131. package/src/mdx/async-api.tsx +2 -2
  132. package/src/mdx/card.tsx +3 -2
  133. package/src/mdx/code.tsx +11 -9
  134. package/src/mdx/fence.tsx +6 -5
  135. package/src/mdx/icon-grid.tsx +4 -1
  136. package/src/mdx/icon-names.test.ts +15 -0
  137. package/src/mdx/icon-names.ts +60 -0
  138. package/src/mdx/icon-source-variants.ts +102 -0
  139. package/src/mdx/icon.tsx +12 -73
  140. package/src/mdx/latex.tsx +3 -2
  141. package/src/mdx/mdx.tsx +1 -1
  142. package/src/mdx/mermaid.tsx +12 -6
  143. package/src/mdx/open-api.tsx +130 -74
  144. package/src/mdx/preprocess.test.ts +16 -0
  145. package/src/mdx/preprocess.ts +61 -0
  146. package/src/mdx/processor.ts +4 -96
  147. package/src/mdx/source.tsx +5 -4
  148. package/src/mdx/specimen.tsx +38 -6
  149. package/src/mdx/tabs.tsx +29 -21
  150. package/src/mdx/text.tsx +9 -9
  151. package/src/mdx/try-it-panel.tsx +284 -0
  152. package/src/mdx/type-scale.tsx +4 -4
  153. package/src/mdx/websocket-playground.tsx +21 -14
  154. package/src/plugins/analytics-injector.ts +8 -0
  155. package/src/plugins/chat-dev-server.ts +32 -0
  156. package/src/plugins/docs-assets.test.ts +25 -0
  157. package/src/plugins/docs-assets.ts +6 -2
  158. package/src/plugins/frontmatter-dev-server.ts +2 -2
  159. package/src/plugins/frontmatter-generator.ts +1 -1
  160. package/src/plugins/html-files-middleware.test.ts +21 -1
  161. package/src/plugins/html-files-middleware.ts +26 -6
  162. package/src/plugins/html-metadata-injector.ts +24 -4
  163. package/src/plugins/llm-txt-dev-server.ts +2 -2
  164. package/src/plugins/llm-txt-generator.ts +21 -4
  165. package/src/plugins/prerender.ts +47 -20
  166. package/src/plugins/robots-generator.ts +1 -1
  167. package/src/plugins/sanitize.ts +1 -1
  168. package/src/plugins/shared.ts +6 -18
  169. package/src/plugins/sitemap-generator.ts +1 -1
  170. package/src/plugins/social-preview.test.ts +71 -0
  171. package/src/plugins/social-preview.ts +87 -0
  172. package/src/plugins/unified-mdx-plugin.ts +1 -1
  173. package/src/theme.scss +630 -207
  174. package/src/types/config.ts +53 -1
  175. package/src/ui/breadcrumb.tsx +17 -0
  176. package/src/ui/docs-header-view.tsx +32 -0
  177. package/src/ui/docs-navigation-view.tsx +69 -0
  178. package/src/ui/docs-page-frame.tsx +50 -0
  179. package/src/ui/dory-mark.tsx +9 -0
  180. package/src/ui/header.tsx +33 -90
  181. package/src/ui/layout.tsx +99 -153
  182. package/src/ui/mobile-navigation.tsx +10 -8
  183. package/src/ui/page-actions.tsx +67 -0
  184. package/src/ui/page-feedback.tsx +50 -0
  185. package/src/ui/page-footer.tsx +23 -0
  186. package/src/ui/prev-next-link.tsx +15 -69
  187. package/src/ui/prev-next-view.tsx +27 -0
  188. package/src/ui/table-of-content-view.tsx +167 -0
  189. package/src/ui/table-of-content.tsx +25 -183
  190. package/src/utils/analytics.test.ts +36 -0
  191. package/src/utils/analytics.ts +35 -0
  192. package/src/utils/colors.ts +7 -0
  193. package/src/utils/content-scope.test.ts +26 -0
  194. package/src/utils/content-scope.ts +39 -0
  195. package/src/utils/search-content.ts +12 -0
  196. package/src/utils/theme.ts +1 -7
  197. package/vite.config.ssr.ts +3 -3
  198. package/vite.config.ts +21 -15
@@ -0,0 +1,366 @@
1
+ {
2
+ "openapi": "3.0.0",
3
+ "info": {
4
+ "title": "Products API",
5
+ "version": "1.0.0",
6
+ "description": "API for managing products"
7
+ },
8
+ "servers": [
9
+ {
10
+ "url": "https://api.example.com/v1",
11
+ "description": "Production server"
12
+ }
13
+ ],
14
+ "components": {
15
+ "securitySchemes": {
16
+ "ApiKeyAuth": {
17
+ "type": "apiKey",
18
+ "in": "header",
19
+ "name": "X-API-Key"
20
+ }
21
+ },
22
+ "schemas": {
23
+ "Product": {
24
+ "type": "object",
25
+ "required": ["name", "price", "category"],
26
+ "properties": {
27
+ "id": {
28
+ "type": "string",
29
+ "format": "uuid",
30
+ "description": "Unique identifier for the product"
31
+ },
32
+ "name": {
33
+ "type": "string",
34
+ "description": "Name of the product"
35
+ },
36
+ "description": {
37
+ "type": "string",
38
+ "description": "Detailed description of the product"
39
+ },
40
+ "price": {
41
+ "type": "number",
42
+ "format": "float",
43
+ "minimum": 0,
44
+ "description": "Price of the product"
45
+ },
46
+ "category": {
47
+ "type": "string",
48
+ "description": "Category of the product"
49
+ },
50
+ "inStock": {
51
+ "type": "boolean",
52
+ "default": true,
53
+ "description": "Whether the product is in stock"
54
+ },
55
+ "createdAt": {
56
+ "type": "string",
57
+ "format": "date-time",
58
+ "description": "Creation timestamp"
59
+ },
60
+ "updatedAt": {
61
+ "type": "string",
62
+ "format": "date-time",
63
+ "description": "Last update timestamp"
64
+ }
65
+ }
66
+ },
67
+ "Error": {
68
+ "type": "object",
69
+ "properties": {
70
+ "code": {
71
+ "type": "string",
72
+ "description": "Error code"
73
+ },
74
+ "message": {
75
+ "type": "string",
76
+ "description": "Error message"
77
+ }
78
+ }
79
+ }
80
+ }
81
+ },
82
+ "paths": {
83
+ "/products": {
84
+ "get": {
85
+ "summary": "List all products",
86
+ "description": "Retrieve a paginated list of products",
87
+ "security": [
88
+ {
89
+ "ApiKeyAuth": []
90
+ }
91
+ ],
92
+ "parameters": [
93
+ {
94
+ "name": "page",
95
+ "in": "query",
96
+ "description": "Page number",
97
+ "required": false,
98
+ "schema": {
99
+ "type": "integer",
100
+ "default": 1,
101
+ "minimum": 1
102
+ }
103
+ },
104
+ {
105
+ "name": "limit",
106
+ "in": "query",
107
+ "description": "Number of items per page",
108
+ "required": false,
109
+ "schema": {
110
+ "type": "integer",
111
+ "default": 10,
112
+ "minimum": 1,
113
+ "maximum": 100
114
+ }
115
+ },
116
+ {
117
+ "name": "category",
118
+ "in": "query",
119
+ "description": "Filter by category",
120
+ "required": false,
121
+ "schema": {
122
+ "type": "string"
123
+ }
124
+ }
125
+ ],
126
+ "responses": {
127
+ "200": {
128
+ "description": "Successful response",
129
+ "content": {
130
+ "application/json": {
131
+ "schema": {
132
+ "type": "object",
133
+ "properties": {
134
+ "data": {
135
+ "type": "array",
136
+ "items": {
137
+ "$ref": "#/components/schemas/Product"
138
+ }
139
+ },
140
+ "total": {
141
+ "type": "integer"
142
+ },
143
+ "page": {
144
+ "type": "integer"
145
+ },
146
+ "limit": {
147
+ "type": "integer"
148
+ }
149
+ }
150
+ }
151
+ }
152
+ }
153
+ },
154
+ "401": {
155
+ "description": "Unauthorized",
156
+ "content": {
157
+ "application/json": {
158
+ "schema": {
159
+ "$ref": "#/components/schemas/Error"
160
+ }
161
+ }
162
+ }
163
+ }
164
+ }
165
+ },
166
+ "post": {
167
+ "summary": "Create a new product",
168
+ "description": "Create a new product with the provided details",
169
+ "security": [
170
+ {
171
+ "ApiKeyAuth": []
172
+ }
173
+ ],
174
+ "requestBody": {
175
+ "required": true,
176
+ "content": {
177
+ "application/json": {
178
+ "schema": {
179
+ "type": "object",
180
+ "required": ["name", "price", "category"],
181
+ "properties": {
182
+ "name": {
183
+ "type": "string"
184
+ },
185
+ "description": {
186
+ "type": "string"
187
+ },
188
+ "price": {
189
+ "type": "number",
190
+ "minimum": 0
191
+ },
192
+ "category": {
193
+ "type": "string"
194
+ },
195
+ "inStock": {
196
+ "type": "boolean"
197
+ }
198
+ }
199
+ }
200
+ }
201
+ }
202
+ },
203
+ "responses": {
204
+ "201": {
205
+ "description": "Product created successfully",
206
+ "content": {
207
+ "application/json": {
208
+ "schema": {
209
+ "$ref": "#/components/schemas/Product"
210
+ }
211
+ }
212
+ }
213
+ },
214
+ "400": {
215
+ "description": "Invalid input",
216
+ "content": {
217
+ "application/json": {
218
+ "schema": {
219
+ "$ref": "#/components/schemas/Error"
220
+ }
221
+ }
222
+ }
223
+ },
224
+ "401": {
225
+ "description": "Unauthorized",
226
+ "content": {
227
+ "application/json": {
228
+ "schema": {
229
+ "$ref": "#/components/schemas/Error"
230
+ }
231
+ }
232
+ }
233
+ }
234
+ }
235
+ }
236
+ },
237
+ "/products/{id}": {
238
+ "parameters": [
239
+ {
240
+ "name": "id",
241
+ "in": "path",
242
+ "required": true,
243
+ "schema": {
244
+ "type": "string",
245
+ "format": "uuid"
246
+ },
247
+ "description": "Product ID"
248
+ }
249
+ ],
250
+ "get": {
251
+ "summary": "Get product by ID",
252
+ "description": "Retrieve a specific product by its ID",
253
+ "security": [
254
+ {
255
+ "ApiKeyAuth": []
256
+ }
257
+ ],
258
+ "responses": {
259
+ "200": {
260
+ "description": "Successful response",
261
+ "content": {
262
+ "application/json": {
263
+ "schema": {
264
+ "$ref": "#/components/schemas/Product"
265
+ }
266
+ }
267
+ }
268
+ },
269
+ "404": {
270
+ "description": "Product not found",
271
+ "content": {
272
+ "application/json": {
273
+ "schema": {
274
+ "$ref": "#/components/schemas/Error"
275
+ }
276
+ }
277
+ }
278
+ }
279
+ }
280
+ },
281
+ "put": {
282
+ "summary": "Update product",
283
+ "description": "Update an existing product by its ID",
284
+ "security": [
285
+ {
286
+ "ApiKeyAuth": []
287
+ }
288
+ ],
289
+ "requestBody": {
290
+ "required": true,
291
+ "content": {
292
+ "application/json": {
293
+ "schema": {
294
+ "type": "object",
295
+ "properties": {
296
+ "name": {
297
+ "type": "string"
298
+ },
299
+ "description": {
300
+ "type": "string"
301
+ },
302
+ "price": {
303
+ "type": "number",
304
+ "minimum": 0
305
+ },
306
+ "category": {
307
+ "type": "string"
308
+ },
309
+ "inStock": {
310
+ "type": "boolean"
311
+ }
312
+ }
313
+ }
314
+ }
315
+ }
316
+ },
317
+ "responses": {
318
+ "200": {
319
+ "description": "Product updated successfully",
320
+ "content": {
321
+ "application/json": {
322
+ "schema": {
323
+ "$ref": "#/components/schemas/Product"
324
+ }
325
+ }
326
+ }
327
+ },
328
+ "404": {
329
+ "description": "Product not found",
330
+ "content": {
331
+ "application/json": {
332
+ "schema": {
333
+ "$ref": "#/components/schemas/Error"
334
+ }
335
+ }
336
+ }
337
+ }
338
+ }
339
+ },
340
+ "delete": {
341
+ "summary": "Delete product",
342
+ "description": "Delete a product by its ID",
343
+ "security": [
344
+ {
345
+ "ApiKeyAuth": []
346
+ }
347
+ ],
348
+ "responses": {
349
+ "204": {
350
+ "description": "Product deleted successfully"
351
+ },
352
+ "404": {
353
+ "description": "Product not found",
354
+ "content": {
355
+ "application/json": {
356
+ "schema": {
357
+ "$ref": "#/components/schemas/Error"
358
+ }
359
+ }
360
+ }
361
+ }
362
+ }
363
+ }
364
+ }
365
+ }
366
+ }
@@ -0,0 +1,5 @@
1
+ ---
2
+ title: 'Create a new product'
3
+ description: 'Create a new product'
4
+ openapi: 'POST /products'
5
+ ---
@@ -0,0 +1,5 @@
1
+ ---
2
+ title: 'Delete product'
3
+ description: 'Delete a product'
4
+ openapi: 'DELETE /products/{id}'
5
+ ---
@@ -0,0 +1,5 @@
1
+ ---
2
+ title: 'List all products'
3
+ description: 'Get a list of products'
4
+ openapi: 'GET /products'
5
+ ---
@@ -0,0 +1,5 @@
1
+ ---
2
+ title: 'Update product'
3
+ description: 'Update a product'
4
+ openapi: 'PUT /products/{id}'
5
+ ---
@@ -0,0 +1,5 @@
1
+ ---
2
+ title: 'Receive chat messages'
3
+ description: 'Subscribe to receive chat messages from other users'
4
+ asyncapi: 'subscribe /chat'
5
+ ---
@@ -0,0 +1,5 @@
1
+ ---
2
+ title: 'Receive notifications'
3
+ description: 'Subscribe to receive system notifications'
4
+ asyncapi: 'subscribe /notifications'
5
+ ---
@@ -0,0 +1,5 @@
1
+ ---
2
+ title: 'Receive presence updates'
3
+ description: 'Subscribe to receive user presence updates'
4
+ asyncapi: 'subscribe /presence'
5
+ ---
@@ -0,0 +1,5 @@
1
+ ---
2
+ title: 'Send chat message'
3
+ description: 'Send a chat message to other users'
4
+ asyncapi: 'publish /chat'
5
+ ---
@@ -0,0 +1,5 @@
1
+ ---
2
+ title: 'Send presence update'
3
+ description: 'Send a presence update'
4
+ asyncapi: 'publish /presence'
5
+ ---
Binary file
@@ -0,0 +1,145 @@
1
+ ---
2
+ title: 'Accordion'
3
+ description: 'Collapsible content sections with optional icons, grouped together with AccordionGroup.'
4
+ ---
5
+
6
+ # Accordion
7
+
8
+ Accordions hide content until the user expands it — ideal for FAQs, optional details, or long reference sections.
9
+
10
+ ## Basic Usage
11
+
12
+ <Specimen label="&lt;AccordionGroup&gt; &lt;Accordion&gt;">
13
+
14
+ ```mdx
15
+ <AccordionGroup>
16
+ <Accordion title="What is Dory?">
17
+ Dory is a static site generator for technical documentation.
18
+ It turns MDX files and a dory.json config into a fast, beautiful docs site.
19
+ </Accordion>
20
+ </AccordionGroup>
21
+ ```
22
+
23
+ <AccordionGroup>
24
+ <Accordion title="What is Dory?">
25
+ Dory is a static site generator for technical documentation.
26
+ It turns MDX files and a `dory.json` config into a fast, beautiful docs site.
27
+ </Accordion>
28
+ </AccordionGroup>
29
+
30
+ </Specimen>
31
+
32
+ ## Multiple Items
33
+
34
+ Only one accordion can be open at a time.
35
+
36
+ <Specimen label="&lt;AccordionGroup&gt; &lt;Accordion&gt;">
37
+
38
+ ```mdx
39
+ <AccordionGroup>
40
+ <Accordion title="How do I install Dory?">
41
+ Install globally with npm: `npm install -g @clidey/dory`
42
+ </Accordion>
43
+ <Accordion title="Which languages are supported?">
44
+ Dory supports 20+ languages: Python, TypeScript, Go, Rust, Java, Ruby, PHP, and more.
45
+ </Accordion>
46
+ <Accordion title="Can I deploy to GitHub Pages?">
47
+ Yes. Run `dory build` and upload the `dist/` directory to your GitHub Pages branch.
48
+ </Accordion>
49
+ <Accordion title="Does Dory support dark mode?">
50
+ Yes. Dory follows the user's OS preference automatically.
51
+ You can set custom colors for each mode in `dory.json`.
52
+ </Accordion>
53
+ </AccordionGroup>
54
+ ```
55
+
56
+ <AccordionGroup>
57
+ <Accordion title="How do I install Dory?">
58
+ Install globally with npm: `npm install -g @clidey/dory`
59
+ </Accordion>
60
+ <Accordion title="Which languages are supported?">
61
+ Dory supports 20+ languages: Python, TypeScript, Go, Rust, Java, Ruby, PHP, and more.
62
+ </Accordion>
63
+ <Accordion title="Can I deploy to GitHub Pages?">
64
+ Yes. Run `dory build` and upload the `dist/` directory to your GitHub Pages branch.
65
+ </Accordion>
66
+ <Accordion title="Does Dory support dark mode?">
67
+ Yes. Dory follows the user's OS preference automatically.
68
+ You can set custom colors for each mode in `dory.json`.
69
+ </Accordion>
70
+ </AccordionGroup>
71
+
72
+ </Specimen>
73
+
74
+ ## With Icons
75
+
76
+ Add an `icon` prop using a Clidey Design icon name:
77
+
78
+ <Specimen label="&lt;AccordionGroup&gt; &lt;Accordion&gt;">
79
+
80
+ ```mdx
81
+ <AccordionGroup>
82
+ <Accordion title="Authentication" icon="lock">
83
+ All API requests require a Bearer token in the Authorization header.
84
+ </Accordion>
85
+ <Accordion title="Rate Limiting" icon="gauge">
86
+ The default limit is 1000 requests per hour per API key.
87
+ </Accordion>
88
+ <Accordion title="Error Handling" icon="alert-triangle">
89
+ All errors return a consistent JSON body with an error code and message.
90
+ </Accordion>
91
+ </AccordionGroup>
92
+ ```
93
+
94
+ <AccordionGroup>
95
+ <Accordion title="Authentication" icon="lock">
96
+ All API requests require a Bearer token in the `Authorization` header.
97
+ </Accordion>
98
+ <Accordion title="Rate Limiting" icon="gauge">
99
+ The default limit is 1000 requests per hour per API key. Exceeding this returns a `429 Too Many Requests` response.
100
+ </Accordion>
101
+ <Accordion title="Error Handling" icon="alert-triangle">
102
+ All errors return a consistent JSON body with an `error` code and `message` field.
103
+ </Accordion>
104
+ </AccordionGroup>
105
+
106
+ </Specimen>
107
+
108
+ ## Numbered Rows
109
+
110
+ Add `numbered` to an `AccordionGroup` for reference lists readers scan by position.
111
+
112
+ <Specimen label="&lt;AccordionGroup numbered&gt;">
113
+
114
+ ```mdx
115
+ <AccordionGroup numbered>
116
+ <Accordion title="Database Connectivity">Connect to any supported engine.</Accordion>
117
+ <Accordion title="Schema Explorer">Browse tables, columns and keys.</Accordion>
118
+ <Accordion title="Interactive Data Grid">Edit rows inline.</Accordion>
119
+ </AccordionGroup>
120
+ ```
121
+
122
+ <AccordionGroup numbered>
123
+ <Accordion title="Database Connectivity">Connect to any supported engine.</Accordion>
124
+ <Accordion title="Schema Explorer">Browse tables, columns and keys.</Accordion>
125
+ <Accordion title="Interactive Data Grid">Edit rows inline.</Accordion>
126
+ </AccordionGroup>
127
+
128
+ </Specimen>
129
+
130
+ ## Props Reference
131
+
132
+ ### AccordionGroup Props
133
+
134
+ | Prop | Type | Description |
135
+ | --- | --- | --- |
136
+ | `children` | `ReactNode` | One or more `Accordion` components. |
137
+ | `numbered` | `boolean` | Label rows 01, 02, 03 in order. |
138
+
139
+ ### Accordion Props
140
+
141
+ | Prop | Type | Description |
142
+ | --- | --- | --- |
143
+ | `title` | `string` | Heading text shown when collapsed. |
144
+ | `icon` | `string` | Optional Clidey Design icon name (e.g. `"lock"`, `"gauge"`). |
145
+ | `children` | `ReactNode` | Content revealed when expanded. Supports full MDX. |