@clidey/dory 1.0.7 → 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,44 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ export const validateDoryConfig = (config) => {
3
+ if (!config || typeof config !== 'object') {
4
+ throw new Error('Configuration must be a valid object');
5
+ }
6
+ if (config.basePath !== undefined && typeof config.basePath !== 'string') {
7
+ throw new Error('"basePath" must be a string such as "/docs"');
8
+ }
9
+ if (config.embed?.security?.allowedOrigins !== undefined) {
10
+ if (!Array.isArray(config.embed.security.allowedOrigins) || config.embed.security.allowedOrigins.some(origin => !validEmbedOrigin(origin))) {
11
+ throw new Error('"embed.security.allowedOrigins" must contain exact HTTPS origins (HTTP localhost is allowed for development)');
12
+ }
13
+ }
14
+ };
15
+ const validEmbedOrigin = (value) => {
16
+ if (typeof value !== 'string')
17
+ return false;
18
+ try {
19
+ const url = new URL(value);
20
+ return url.origin === value && !url.username && !url.password && (url.protocol === 'https:' || (url.protocol === 'http:' && ['localhost', '127.0.0.1', '[::1]'].includes(url.hostname)));
21
+ }
22
+ catch {
23
+ return false;
24
+ }
25
+ };
26
+ // Reads dory.json when present; preview must not fail without one.
27
+ export const readOptionalDoryConfig = (configPath) => {
28
+ if (!existsSync(configPath))
29
+ return null;
30
+ try {
31
+ return JSON.parse(readFileSync(configPath, 'utf8'));
32
+ }
33
+ catch {
34
+ return null;
35
+ }
36
+ };
37
+ // Same normalization as src/utils/base-path.ts (the CLI is compiled separately).
38
+ export const normalizeBasePath = (value) => {
39
+ if (typeof value !== 'string')
40
+ return '';
41
+ const trimmed = value.trim().replace(/^\/+|\/+$/g, '');
42
+ return trimmed ? `/${trimmed}` : '';
43
+ };
44
+ //# sourceMappingURL=project-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-config.js","sourceRoot":"","sources":["../project-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAYnD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,MAAkB,EAAQ,EAAE;IAC7D,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACzE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,cAAc,KAAK,SAAS,EAAE,CAAC;QACzD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC;YAC3I,MAAM,IAAI,KAAK,CAAC,8GAA8G,CAAC,CAAC;QAClI,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,KAAc,EAAmB,EAAE;IAC3D,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAC3B,OAAO,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC3L,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAC;IAAC,CAAC;AAC3B,CAAC,CAAC;AAEF,mEAAmE;AACnE,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,UAAkB,EAAqB,EAAE;IAC9E,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAe,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAEF,iFAAiF;AACjF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAc,EAAU,EAAE;IAC1D,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IACvD,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACtC,CAAC,CAAC"}
@@ -0,0 +1,57 @@
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8" />
5
+ <link rel="icon" href="/favicon.svg" />
6
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
7
+ <meta name="theme-color" content="#000000" />
8
+
9
+ <!-- Primary Meta Tags -->
10
+ <meta name="description" content="Static documentation site generator for modern teams. Build beautiful docs from MDX files." />
11
+
12
+ <!-- Open Graph / Facebook -->
13
+ <meta property="og:title" content="Dory" />
14
+ <meta property="og:description" content="Static documentation site generator for modern teams. Build beautiful docs from MDX files." />
15
+ <meta property="og:image" content="https://dory.clidey.com/_dory/social/home.png" />
16
+ <meta property="og:url" content="https://dory.clidey.com" />
17
+ <meta property="og:type" content="website" />
18
+ <meta property="og:site_name" content="Dory" />
19
+ <meta property="og:locale" content="en_US" />
20
+
21
+ <!-- Twitter -->
22
+ <meta name="twitter:card" content="summary_large_image" />
23
+ <meta name="twitter:title" content="Dory" />
24
+ <meta name="twitter:description" content="Static documentation site generator for modern teams. Build beautiful docs from MDX files." />
25
+ <meta name="twitter:image" content="https://dory.clidey.com/_dory/social/home.png" />
26
+
27
+ <link rel="canonical" href="https://dory.clidey.com" />
28
+ <link rel="apple-touch-icon" href="/favicon.svg" />
29
+
30
+ <title>Dory</title>
31
+
32
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
33
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
34
+
35
+ <script type="module" crossorigin src="/assets/index-Bu_Qu7PB.js"></script>
36
+ <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-BCiCTKAo.js">
37
+ <link rel="modulepreload" crossorigin href="/assets/vendor-preact-Dd4Rvlha.js">
38
+ <link rel="modulepreload" crossorigin href="/assets/flexsearch-DhJIXoKC.js">
39
+ <link rel="modulepreload" crossorigin href="/assets/vendor-ui-TQQfJaaY.js">
40
+ <link rel="stylesheet" crossorigin href="/assets/vendor-ui-B11I9Fgz.css">
41
+ <link rel="stylesheet" crossorigin href="/assets/index-HL7_A1Ni.css">
42
+ <link rel="alternate" type="text/plain" title="LLM documentation index" href="/llms.txt" />
43
+ <script type="application/ld+json" data-dory-site-schema>{"@context":"https://schema.org","@graph":[{"@type":"WebSite","name":"Dory","description":"Static documentation site generator for modern teams. Build beautiful docs from MDX files.","@id":"https://dory.clidey.com/#website","url":"https://dory.clidey.com/"},{"@type":"WebPage","name":"Dory","description":"Static documentation site generator for modern teams. Build beautiful docs from MDX files.","url":"https://dory.clidey.com/","isPartOf":{"@id":"https://dory.clidey.com/#website"}}]}</script>
44
+ <script>(function(){try{var t=localStorage.getItem("@clidey/dory/theme");if(t==="dark"||(t==="system"||!t)&&window.matchMedia("(prefers-color-scheme:dark)").matches)document.documentElement.classList.add("dark")}catch(e){}})();window.__DORY_FRONTMATTER__=[{"title":"Introduction","description":"Dory is a static documentation site generator for modern teams. Build beautiful docs from MDX files with zero configuration.","lead":"Dory turns a folder of MDX files and one dory.json into a fast, static documentation site. No framework setup, no boilerplate.","meta":{"Stack":"Preact + Vite","License":"MIT","Updated":"2026-10-21T00:00:00.000Z"},"path":"/introduction"},{"title":"Installation","description":"Install Dory and start building your documentation site.","path":"/getting-started/installation"},{"title":"Quick Start","description":"Create, check, and build your first Dory documentation site.","path":"/getting-started/quick-start"},{"title":"CLI and MCP automation","description":"Build, inspect, capture, and iterate on Dory documentation from a CLI or MCP client.","path":"/getting-started/automation"},{"title":"WhoDB EE apps","description":"Write MDX documentation in a WhoDB EE app and show it inside the app host.","path":"/getting-started/whodb-ee-apps"},{"title":"Configuration","description":"Configure your Dory site with dory.json — branding, navigation, fonts, colors, and more.","path":"/getting-started/configuration"},{"title":"dory.json Reference","description":"Complete reference for all fields in the dory.json configuration file.","path":"/configuration/dory-json"},{"title":"Navigation","description":"Configure the sidebar navigation using tabs, groups, and pages in dory.json.","path":"/configuration/navigation"},{"title":"Theming","description":"Customize your documentation site colors, fonts, and appearance to match your brand.","path":"/configuration/theming"},{"title":"Fonts","description":"Configure a custom web font for your documentation site using Google Fonts or any CDN.","path":"/configuration/fonts"},{"title":"Analytics","description":"Send documentation traffic, searches, feedback, engagement, and AI crawler requests to PostHog.","path":"/configuration/analytics"},{"title":"Documentation chat","description":"Add a cited documentation assistant with server-side credentials and strict request limits.","path":"/configuration/chat"},{"title":"Languages and versions","description":"Publish translated and versioned documentation in one Dory site.","path":"/configuration/internationalization"},{"title":"Embed","description":"Open contextual Dory documentation inside another application.","path":"/configuration/embed"},{"title":"Components Overview","description":"All 24 built-in MDX components in Dory — from basic typography to interactive API playgrounds.","lead":"Everything Dory renders from MDX, in one place. Each specimen shows the rendered output, the source behind it, and the props it accepts.","meta":{"Components":"24 built in","Theme":"From dory.json","Updated":"2026-10-21T00:00:00.000Z"},"path":"/components/overview"},{"title":"Typography","description":"Headings, paragraphs, inline code, anchors, and layout helpers for text-heavy pages.","path":"/components/typography"},{"title":"Code Blocks","description":"Syntax-highlighted code blocks with multi-language tab groups, copy button, and HTTP method badges.","path":"/components/code-blocks"},{"title":"Callouts","description":"Highlight important information with Note, Warning, Info, Tip, Check, and custom Callout components.","path":"/components/callouts"},{"title":"Cards","description":"Informational and linked cards in responsive grid layouts using Card and CardGroup.","path":"/components/cards"},{"title":"Accordion","description":"Collapsible content sections with optional icons, grouped together with AccordionGroup.","path":"/components/accordion"},{"title":"Expandable","description":"Expandable sections for API response fields, nested properties, and schema documentation.","path":"/components/expandable"},{"title":"Steps","description":"Numbered step-by-step guides with visual connectors between steps.","path":"/components/steps"},{"title":"Tables","description":"Responsive tables with styled headers and cells using standard Markdown or Table components.","path":"/components/tables"},{"title":"Lists","description":"Styled unordered and ordered lists using standard Markdown or explicit list components.","path":"/components/lists"},{"title":"Icons","description":"The shared Clidey Design icon suite for inline content and components.","path":"/components/icons"},{"title":"Tags","description":"HTTP method badges and custom color tags for labeling content.","path":"/components/tags"},{"title":"Images","description":"Clickable images with fullscreen modal overlay using the img component.","path":"/components/images"},{"title":"Layout","description":"Row and Col components for multi-column grid layouts within MDX pages.","path":"/components/layout"},{"title":"Source Links","description":"Link directly to source code files on GitHub, GitLab, or Bitbucket with optional line ranges.","path":"/components/source"},{"title":"Mermaid Diagrams","description":"Render flowcharts, sequence diagrams, ER diagrams, and more using Mermaid syntax in code blocks.","path":"/components/mermaid"},{"title":"LaTeX Math","description":"Render mathematical expressions and equations using KaTeX with the Latex component.","path":"/components/latex"},{"title":"List all products","description":"Get a list of products","openapi":"GET /products","path":"/api-reference/operations/get"},{"title":"Create a new product","description":"Create a new product","openapi":"POST /products","path":"/api-reference/operations/create"},{"title":"Update product","description":"Update a product","openapi":"PUT /products/{id}","path":"/api-reference/operations/update"},{"title":"Delete product","description":"Delete a product","openapi":"DELETE /products/{id}","path":"/api-reference/operations/delete"},{"title":"API Playground","description":"Interactive HTTP API testing built directly into your documentation. Test endpoints with real requests.","path":"/playgrounds/api-playground"},{"title":"WebSocket Playground","description":"Interactive WebSocket connection tester with real-time message history built into your documentation.","path":"/playgrounds/websocket-playground"},{"title":"Receive chat messages","description":"Subscribe to receive chat messages from other users","asyncapi":"subscribe /chat","path":"/api-reference/websocket-operations/receive-chat-message"},{"title":"Send chat message","description":"Send a chat message to other users","asyncapi":"publish /chat","path":"/api-reference/websocket-operations/send-chat-message"},{"title":"Receive notifications","description":"Subscribe to receive system notifications","asyncapi":"subscribe /notifications","path":"/api-reference/websocket-operations/receive-notifications"},{"title":"Receive presence updates","description":"Subscribe to receive user presence updates","asyncapi":"subscribe /presence","path":"/api-reference/websocket-operations/receive-presence-update"},{"title":"Send presence update","description":"Send a presence update","asyncapi":"publish /presence","path":"/api-reference/websocket-operations/send-presence-update"},{"title":"API Playground Demo","description":"Interactive API playground for testing HTTP endpoints","openapi":"POST /plants","path":"/api-playground-demo"},{"title":"Features","description":"Overview of available components and features","path":"/features"},{"title":"WebSocket Playground Demo","description":"Interactive WebSocket playground for testing real-time connections","path":"/websocket-playground-demo"}];window.__DORY_ROUTE__="/introduction";</script>
45
+ </head>
46
+ <body>
47
+ <noscript>JavaScript enhances this page with interactive features.</noscript>
48
+ <div id="app"><div data-slot="toaster" class="toaster group"><section aria-label="Notifications alt+T" tabindex="-1" aria-live="polite" aria-relevant="additions text" aria-atomic="false" suppressHydrationWarning data-react-aria-top-layer="true"></section></div><div class="dory-shell flex min-h-screen w-full flex-col bg-[var(--sidebar)]"><header class="dory-topbar sticky top-0 z-50 flex h-14 shrink-0 items-stretch bg-[var(--sidebar)] text-white"><a href="/introduction" class="flex w-60 shrink-0 items-center gap-2.5 px-4"><img src="/logo/logo.svg" alt class="h-7 w-7"/><span class="font-heading text-lg font-bold tracking-tight text-white">Dory</span><span data-slot="badge" class="inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&amp;>svg]:size-3 gap-1 [&amp;>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden text-foreground [a&amp;]:hover:bg-accent [a&amp;]:hover:text-accent-foreground dory-docs-pill">Docs</span></a><nav aria-label="Sections" class="hidden md:flex items-stretch"><a href="/introduction" class="dory-topbar-tab active">Guides</a><a href="/components/overview" class="dory-topbar-tab">Components</a><a href="/api-reference/operations/get" class="dory-topbar-tab">API reference</a><a href="/api-reference/websocket-operations/receive-chat-message" class="dory-topbar-tab">Realtime</a></nav><div data-testid="header-actions" class="ml-auto flex items-center gap-3 pr-4"></div></header><div class="flex flex-1"><aside class="hidden w-60 shrink-0 lg:block"><div class="sticky top-14 h-[calc(100vh-3.5rem)] overflow-y-auto px-3 pb-6 pt-4"><nav aria-label="Documentation" class="dory-sidebar flex min-h-full flex-col gap-6 text-[13px]"><div class="relative flex items-center justify-between rounded-lg border border-white/10 bg-white/5 px-3 py-2.5"><div><p class="dory-mono-label">Version</p><p class="mt-0.5 text-sm font-semibold text-white">1.0.8 · Latest</p></div></div><section><h3 class="dory-mono-label flex gap-2 px-2.5 !text-[var(--sidebar-primary)]"><span>01</span><span class="text-white/55">Getting Started</span></h3><ul role="list" class="mt-2 space-y-0.5"><li><a aria-current="page" href="/introduction" class="dory-sidebar-link active"><span class="truncate">Introduction</span></a></li><li><a href="/getting-started/installation" class="dory-sidebar-link"><span class="truncate">Installation</span></a></li><li><a href="/getting-started/quick-start" class="dory-sidebar-link"><span class="truncate">Quick Start</span></a></li><li><a href="/getting-started/automation" class="dory-sidebar-link"><span class="truncate">CLI and MCP automation</span></a></li><li><a href="/getting-started/whodb-ee-apps" class="dory-sidebar-link"><span class="truncate">WhoDB EE apps</span></a></li><li><a href="/getting-started/configuration" class="dory-sidebar-link"><span class="truncate">Configuration</span></a></li></ul></section><section><h3 class="dory-mono-label flex gap-2 px-2.5 !text-[var(--sidebar-primary)]"><span>02</span><span class="text-white/55">Configuration</span></h3><ul role="list" class="mt-2 space-y-0.5"><li><a href="/configuration/dory-json" class="dory-sidebar-link"><span class="truncate">dory.json Reference</span></a></li><li><a href="/configuration/navigation" class="dory-sidebar-link"><span class="truncate">Navigation</span></a></li><li><a href="/configuration/theming" class="dory-sidebar-link"><span class="truncate">Theming</span></a></li><li><a href="/configuration/fonts" class="dory-sidebar-link"><span class="truncate">Fonts</span></a></li><li><a href="/configuration/analytics" class="dory-sidebar-link"><span class="truncate">Analytics</span></a></li><li><a href="/configuration/chat" class="dory-sidebar-link"><span class="truncate">Documentation chat</span></a></li><li><a href="/configuration/internationalization" class="dory-sidebar-link"><span class="truncate">Languages and versions</span></a></li><li><a href="/configuration/embed" class="dory-sidebar-link"><span class="truncate">Embed</span></a></li></ul></section><section><h3 class="dory-mono-label flex gap-2 px-2.5 !text-[var(--sidebar-primary)]"><span>03</span><span class="text-white/55">Components</span></h3><ul role="list" class="mt-2 space-y-0.5"><li><a href="/components/overview" class="dory-sidebar-link"><span class="truncate">Components Overview</span><span data-slot="badge" class="inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&amp;>svg]:size-3 gap-1 [&amp;>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden border-transparent bg-secondary text-secondary-foreground [a&amp;]:hover:bg-secondary/90 dory-badge">New</span></a></li><li><a href="/components/typography" class="dory-sidebar-link"><span class="truncate">Typography</span></a></li><li><a href="/components/code-blocks" class="dory-sidebar-link"><span class="truncate">Code Blocks</span></a></li><li><a href="/components/callouts" class="dory-sidebar-link"><span class="truncate">Callouts</span></a></li><li><a href="/components/cards" class="dory-sidebar-link"><span class="truncate">Cards</span></a></li><li><a href="/components/accordion" class="dory-sidebar-link"><span class="truncate">Accordion</span></a></li><li><a href="/components/expandable" class="dory-sidebar-link"><span class="truncate">Expandable</span></a></li><li><a href="/components/steps" class="dory-sidebar-link"><span class="truncate">Steps</span></a></li><li><a href="/components/tables" class="dory-sidebar-link"><span class="truncate">Tables</span></a></li><li><a href="/components/lists" class="dory-sidebar-link"><span class="truncate">Lists</span></a></li><li><a href="/components/icons" class="dory-sidebar-link"><span class="truncate">Icons</span></a></li><li><a href="/components/tags" class="dory-sidebar-link"><span class="truncate">Tags</span></a></li><li><a href="/components/images" class="dory-sidebar-link"><span class="truncate">Images</span></a></li><li><a href="/components/layout" class="dory-sidebar-link"><span class="truncate">Layout</span></a></li><li><a href="/components/source" class="dory-sidebar-link"><span class="truncate">Source Links</span></a></li><li><a href="/components/mermaid" class="dory-sidebar-link"><span class="truncate">Mermaid Diagrams</span></a></li><li><a href="/components/latex" class="dory-sidebar-link"><span class="truncate">LaTeX Math</span></a></li></ul></section><section><h3 class="dory-mono-label flex gap-2 px-2.5 !text-[var(--sidebar-primary)]"><span>04</span><span class="text-white/55">API Reference</span></h3><ul role="list" class="mt-2 space-y-0.5"><li><a href="/api-reference/operations/get" class="dory-sidebar-link"><span class="dory-method text-[var(--sidebar-primary)]">GET</span><span class="truncate">/products</span></a></li><li><a href="/api-reference/operations/create" class="dory-sidebar-link"><span class="dory-method text-[var(--highlight)]">POST</span><span class="truncate">/products</span></a></li><li><a href="/api-reference/operations/update" class="dory-sidebar-link"><span class="dory-method text-[#f4781c]">PUT</span><span class="truncate">/products/{id}</span></a></li><li><a href="/api-reference/operations/delete" class="dory-sidebar-link"><span class="dory-method text-[#ff6668]">DEL</span><span class="truncate">/products/{id}</span></a></li></ul></section><section><h3 class="dory-mono-label flex gap-2 px-2.5 !text-[var(--sidebar-primary)]"><span>05</span><span class="text-white/55">Interactive Playgrounds</span></h3><ul role="list" class="mt-2 space-y-0.5"><li><a href="/playgrounds/api-playground" class="dory-sidebar-link"><span class="truncate">API Playground</span></a></li><li><a href="/playgrounds/websocket-playground" class="dory-sidebar-link"><span class="truncate">WebSocket Playground</span></a></li></ul></section><section><h3 class="dory-mono-label flex gap-2 px-2.5 !text-[var(--sidebar-primary)]"><span>06</span><span class="text-white/55">Realtime</span></h3><ul role="list" class="mt-2 space-y-0.5"><li><a href="/api-reference/websocket-operations/receive-chat-message" class="dory-sidebar-link"><span class="dory-method text-[var(--sidebar-primary)]">SUB</span><span class="truncate">Receive chat messages</span></a></li><li><a href="/api-reference/websocket-operations/send-chat-message" class="dory-sidebar-link"><span class="dory-method text-[#f4781c]">PUB</span><span class="truncate">Send chat message</span></a></li><li><a href="/api-reference/websocket-operations/receive-notifications" class="dory-sidebar-link"><span class="dory-method text-[var(--sidebar-primary)]">SUB</span><span class="truncate">Receive notifications</span></a></li><li><a href="/api-reference/websocket-operations/receive-presence-update" class="dory-sidebar-link"><span class="dory-method text-[var(--sidebar-primary)]">SUB</span><span class="truncate">Receive presence updates</span></a></li><li><a href="/api-reference/websocket-operations/send-presence-update" class="dory-sidebar-link"><span class="dory-method text-[#f4781c]">PUB</span><span class="truncate">Send presence update</span></a></li></ul></section><a href="https://github.com/clidey/dory" target="_blank" rel="noopener noreferrer" class="dory-sidebar-footer mt-auto flex items-center gap-2.5 border-t border-white/10 px-2.5 pt-4"><img src="data:image/svg+xml;utf8,%3Csvg%20width%3D%2222%22%20height%3D%2224%22%20viewBox%3D%220%200%2022%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%3Cpath%20d%3D%22M21.9941%204.99951C19.9947%203.00079%2019.9947%203.00079%2016.9956%200.00271368V4.99951H21.9941Z%22%20fill%3D%22%2392BFFA%22%2F%3E%0A%3Cpath%20d%3D%22M7.49782%203.91843C7.49782%204.5155%207.98183%204.99951%208.5789%204.99951H16.9951V0.00271606H8.5789C7.98183%200.00271606%207.49782%200.486733%207.49782%201.0838V3.91843Z%22%20fill%3D%22url(%23paint0_linear_66_680)%22%2F%3E%0A%3Cpath%20d%3D%22M21.9932%205.01123C22.0049%208.20987%2021.9983%2017.7036%2021.9951%2021.9995C21.9943%2023.1041%2021.0977%2023.9995%2019.9932%2023.9995H2C0.895431%2023.9995%203.87055e-07%2023.1041%200%2021.9995V8.59131C0%207.99426%200.48401%207.51028%201.08105%207.51025H3.91797C4.51481%207.51052%204.99902%207.99441%204.99902%208.59131V19.5024H16.9951V5.01123H21.9932Z%22%20fill%3D%22url(%23paint1_linear_66_680)%22%2F%3E%0A%3Cellipse%20cx%3D%2212.3217%22%20cy%3D%2214.276%22%20rx%3D%221.2973%22%20ry%3D%221.29647%22%20fill%3D%22%231967D2%22%2F%3E%0A%3Cpath%20d%3D%22M5%200.00634813C5.55157%200.00730227%205.99805%200.454718%205.99805%201.00635V4.01221C5.99805%204.64068%206.29707%205.23179%206.80273%205.60498L7.46777%206.09619C7.81171%206.35003%208.22878%206.48682%208.65625%206.48682H14.4951C15.0472%206.48682%2015.4949%206.93475%2015.4951%207.48682V16.98C15.4951%2017.5322%2015.0474%2017.98%2014.4951%2017.98H7.49805C6.94583%2017.9799%206.49808%2017.5322%206.49805%2016.98V8.67139C6.49806%208.23724%206.35689%207.81407%206.0957%207.46729L5.58691%206.79248C5.21558%206.29954%204.63759%206.00515%204.02051%205.99561H1C0.447722%205.9956%200%205.54789%200%204.99561V1.00049C0.000165845%200.447951%200.448441%20-4.60729e-05%201.00098%200.00048876L5%200.00634813Z%22%20fill%3D%22%23FFC236%22%2F%3E%0A%3Cellipse%20cx%3D%2212.9961%22%20cy%3D%2215.505%22%20rx%3D%221%22%20ry%3D%220.999359%22%20fill%3D%22%233630C4%22%2F%3E%0A%3Cdefs%3E%0A%3ClinearGradient%20id%3D%22paint0_linear_66_680%22%20x1%3D%2210.9999%22%20y1%3D%220.00271606%22%20x2%3D%2210.9999%22%20y2%3D%2223.9995%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%23528FF4%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2392BFFA%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3ClinearGradient%20id%3D%22paint1_linear_66_680%22%20x1%3D%2210.9999%22%20y1%3D%220.00271606%22%20x2%3D%2210.9999%22%20y2%3D%2223.9995%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%23528FF4%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2392BFFA%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3C%2Fdefs%3E%0A%3C%2Fsvg%3E" alt class="h-4 w-4"/><span class="dory-mono-label">Built with Dory</span></a></nav></div></aside><main class="dory-main min-w-0 flex-1 bg-background text-foreground px-6 py-10 sm:px-10 lg:px-12"><div class="mx-auto flex w-full max-w-[66rem] justify-center gap-14"><article class="dory-article flex min-w-0 flex-1 flex-col max-w-[47rem]"><div class="mb-6 flex min-h-9 flex-wrap items-center justify-between gap-4"><nav aria-label="Breadcrumb" class="dory-breadcrumb"><ol class="flex flex-wrap items-center gap-2"><li class="flex items-center gap-2 whitespace-nowrap"><span>Docs</span></li><li class="flex items-center gap-2 whitespace-nowrap"><span aria-hidden="true">/</span><span>Getting Started</span></li><li aria-current="page" class="flex items-center gap-2 whitespace-nowrap"><span aria-hidden="true">/</span><span>Introduction</span></li></ol></nav></div><header class="mb-10"><h1 class="dory-page-title">Introduction</h1><p class="dory-lead">Dory turns a folder of MDX files and one dory.json into a fast, static documentation site. No framework setup, no boilerplate.</p></header><dl class="dory-page-meta mb-8 grid grid-cols-2 gap-x-6 gap-y-3 border-y border-[var(--border)] py-3 sm:grid-cols-3"><div><dt class="font-mono text-[11px] uppercase tracking-[0.18em] text-muted-foreground">Stack</dt><dd class="mt-0.5 text-sm font-semibold text-foreground">Preact + Vite</dd></div><div><dt class="font-mono text-[11px] uppercase tracking-[0.18em] text-muted-foreground">License</dt><dd class="mt-0.5 text-sm font-semibold text-foreground">MIT</dd></div><div><dt class="font-mono text-[11px] uppercase tracking-[0.18em] text-muted-foreground">Updated</dt><dd class="mt-0.5 text-sm font-semibold text-foreground">21 Oct 2026</dd></div></dl><div class="flex-1 min-h-[calc(100vh-2rem)]"><div class="h-full antialiased"><div class="flex min-h-full"><div class="flex flex-col w-full"><h2 id="what-is-dory" class="dory-h2 font-heading mb-4 mt-16"><span>What is Dory?</span><a href="#what-is-dory" aria-label="Link to this section" class="dory-anchor">#</a></h2>
49
+ <p class="mb-2 inline-block">Dory is a <strong>static site generator built for technical documentation</strong>. It turns MDX files and a single <code class="dory-mdx-code rounded-md border border-[var(--border)] bg-muted py-0.5 text-[0.875em] px-1.5">dory.json</code> config into a fast, beautiful documentation site — with zero boilerplate.</p>
50
+ <div class="not-prose my-6 grid grid-cols-1 gap-3 sm:grid-cols-2"><div data-slot="card" class="text-card-foreground flex flex-col border dory-card group relative gap-0 rounded-lg border-[var(--border)] bg-card p-4 shadow-none transition-shadow hover:shadow-[0_2px_10px_rgb(14_34_64/0.07)]"><div class="mb-3 flex items-start justify-between"><span class="flex size-8 items-center justify-center rounded-md bg-accent text-[var(--primary)]"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" focusable="false" style="mask:url(&quot;data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='1.75'%20stroke-linecap='round'%20stroke-linejoin='round'%3e%3cpath%20d='M11%203.5c.4%203.9%202.6%206.1%206.5%206.5-3.9.4-6.1%202.6-6.5%206.5-.4-3.9-2.6-6.1-6.5-6.5%203.9-.4%206.1-2.6%206.5-6.5zM18.5%2015.5c.15%201.4.85%202.1%202.25%202.25-1.4.15-2.1.85-2.25%202.25-.15-1.4-.85-2.1-2.25-2.25%201.4-.15%202.1-.85%202.25-2.25z'%3e%3c/path%3e%3c/svg%3e&quot;) center / contain no-repeat;-webkit-mask:url(&quot;data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='1.75'%20stroke-linecap='round'%20stroke-linejoin='round'%3e%3cpath%20d='M11%203.5c.4%203.9%202.6%206.1%206.5%206.5-3.9.4-6.1%202.6-6.5%206.5-.4-3.9-2.6-6.1-6.5-6.5%203.9-.4%206.1-2.6%206.5-6.5zM18.5%2015.5c.15%201.4.85%202.1%202.25%202.25-1.4.15-2.1.85-2.25%202.25-.15-1.4-.85-2.1-2.25-2.25%201.4-.15%202.1-.85%202.25-2.25z'%3e%3c/path%3e%3c/svg%3e&quot;) center / contain no-repeat;" class="inline-block align-[-0.2em] h-4 w-4 !stroke-current"><rect width="24" height="24" fill="currentColor"></rect></svg></span></div><p class="font-heading text-[15px] font-semibold tracking-tight text-foreground">Simple</p><div class="mt-1 text-[13px] leading-normal text-muted-foreground [&amp;_p]:mb-0">Drop in .mdx files, configure one dory.json. No framework knowledge needed.</div></div><div data-slot="card" class="text-card-foreground flex flex-col border dory-card group relative gap-0 rounded-lg border-[var(--border)] bg-card p-4 shadow-none transition-shadow hover:shadow-[0_2px_10px_rgb(14_34_64/0.07)]"><div class="mb-3 flex items-start justify-between"><span class="flex size-8 items-center justify-center rounded-md bg-accent text-[var(--primary)]"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" focusable="false" style="mask:url(&quot;data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'%3e%3cpath%20d='m3.75%2013.5%2010.5-11.25L12%2010.5h8.25L9.75%2021.75%2012%2013.5H3.75Z'/%3e%3c/svg%3e&quot;) center / contain no-repeat;-webkit-mask:url(&quot;data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='1.5'%20stroke-linecap='round'%20stroke-linejoin='round'%3e%3cpath%20d='m3.75%2013.5%2010.5-11.25L12%2010.5h8.25L9.75%2021.75%2012%2013.5H3.75Z'/%3e%3c/svg%3e&quot;) center / contain no-repeat;" class="inline-block align-[-0.2em] h-4 w-4 !stroke-current"><rect width="24" height="24" fill="currentColor"></rect></svg></span></div><p class="font-heading text-[15px] font-semibold tracking-tight text-foreground">Fast</p><div class="mt-1 text-[13px] leading-normal text-muted-foreground [&amp;_p]:mb-0">Instant hot reload in dev. Quick static builds optimized for production.</div></div><div data-slot="card" class="text-card-foreground flex flex-col border dory-card group relative gap-0 rounded-lg border-[var(--border)] bg-card p-4 shadow-none transition-shadow hover:shadow-[0_2px_10px_rgb(14_34_64/0.07)]"><div class="mb-3 flex items-start justify-between"><span class="flex size-8 items-center justify-center rounded-md bg-accent text-[var(--primary)]"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" focusable="false" style="mask:url(&quot;/assets/globe-pQoiQMgF.svg&quot;) center / contain no-repeat;-webkit-mask:url(&quot;/assets/globe-pQoiQMgF.svg&quot;) center / contain no-repeat;" class="inline-block align-[-0.2em] h-4 w-4 !stroke-current"><rect width="24" height="24" fill="currentColor"></rect></svg></span></div><p class="font-heading text-[15px] font-semibold tracking-tight text-foreground">Portable</p><div class="mt-1 text-[13px] leading-normal text-muted-foreground [&amp;_p]:mb-0">No SSR, no vendor lock-in. Deploy anywhere that serves static files.</div></div><div data-slot="card" class="text-card-foreground flex flex-col border dory-card group relative gap-0 rounded-lg border-[var(--border)] bg-card p-4 shadow-none transition-shadow hover:shadow-[0_2px_10px_rgb(14_34_64/0.07)]"><div class="mb-3 flex items-start justify-between"><span class="flex size-8 items-center justify-center rounded-md bg-accent text-[var(--primary)]"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" focusable="false" style="mask:url(&quot;data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='1.75'%20stroke-linecap='round'%20stroke-linejoin='round'%3e%3cpath%20d='M6.06%203.5H7.94C9.58%203.5%2010.5%204.42%2010.5%206.06V7.94C10.5%209.58%209.58%2010.5%207.94%2010.5H6.06C4.42%2010.5%203.5%209.58%203.5%207.94V6.06C3.5%204.42%204.42%203.5%206.06%203.5zM16.06%203.5H17.94C19.58%203.5%2020.5%204.42%2020.5%206.06V7.94C20.5%209.58%2019.58%2010.5%2017.94%2010.5H16.06C14.42%2010.5%2013.5%209.58%2013.5%207.94V6.06C13.5%204.42%2014.42%203.5%2016.06%203.5zM6.06%2013.5H7.94C9.58%2013.5%2010.5%2014.42%2010.5%2016.06V17.94C10.5%2019.58%209.58%2020.5%207.94%2020.5H6.06C4.42%2020.5%203.5%2019.58%203.5%2017.94V16.06C3.5%2014.42%204.42%2013.5%206.06%2013.5zM16.06%2013.5H17.94C19.58%2013.5%2020.5%2014.42%2020.5%2016.06V17.94C20.5%2019.58%2019.58%2020.5%2017.94%2020.5H16.06C14.42%2020.5%2013.5%2019.58%2013.5%2017.94V16.06C13.5%2014.42%2014.42%2013.5%2016.06%2013.5z'%3e%3c/path%3e%3c/svg%3e&quot;) center / contain no-repeat;-webkit-mask:url(&quot;data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='1.75'%20stroke-linecap='round'%20stroke-linejoin='round'%3e%3cpath%20d='M6.06%203.5H7.94C9.58%203.5%2010.5%204.42%2010.5%206.06V7.94C10.5%209.58%209.58%2010.5%207.94%2010.5H6.06C4.42%2010.5%203.5%209.58%203.5%207.94V6.06C3.5%204.42%204.42%203.5%206.06%203.5zM16.06%203.5H17.94C19.58%203.5%2020.5%204.42%2020.5%206.06V7.94C20.5%209.58%2019.58%2010.5%2017.94%2010.5H16.06C14.42%2010.5%2013.5%209.58%2013.5%207.94V6.06C13.5%204.42%2014.42%203.5%2016.06%203.5zM6.06%2013.5H7.94C9.58%2013.5%2010.5%2014.42%2010.5%2016.06V17.94C10.5%2019.58%209.58%2020.5%207.94%2020.5H6.06C4.42%2020.5%203.5%2019.58%203.5%2017.94V16.06C3.5%2014.42%204.42%2013.5%206.06%2013.5zM16.06%2013.5H17.94C19.58%2013.5%2020.5%2014.42%2020.5%2016.06V17.94C20.5%2019.58%2019.58%2020.5%2017.94%2020.5H16.06C14.42%2020.5%2013.5%2019.58%2013.5%2017.94V16.06C13.5%2014.42%2014.42%2013.5%2016.06%2013.5z'%3e%3c/path%3e%3c/svg%3e&quot;) center / contain no-repeat;" class="inline-block align-[-0.2em] h-4 w-4 !stroke-current"><rect width="24" height="24" fill="currentColor"></rect></svg></span></div><p class="font-heading text-[15px] font-semibold tracking-tight text-foreground">Rich Components</p><div class="mt-1 text-[13px] leading-normal text-muted-foreground [&amp;_p]:mb-0">24 built-in MDX components: code blocks, diagrams, API playgrounds, and more.</div></div></div>
51
+ <h2 id="key-features" class="dory-h2 font-heading mb-4 mt-16"><span>Key Features</span><a href="#key-features" aria-label="Link to this section" class="dory-anchor">#</a></h2>
52
+ <nav aria-label="Progress" class="my-6"><div class="relative flex gap-3.5 pb-6"><div aria-hidden="true" class="absolute left-[13.5px] top-9 bottom-1 w-px bg-[var(--border)]"></div><span class="relative z-10 flex size-7 shrink-0 items-center justify-center rounded-md border text-xs font-semibold border-transparent bg-[var(--primary)] text-white">1</span><div class="min-w-0 flex-1 pt-0.5"><p class="font-heading text-[15px] font-semibold tracking-tight text-foreground">Write MDX files</p><div class="not-prose mt-0.5 text-muted-foreground"><p class="mb-2 inline-block">Create <code class="dory-mdx-code rounded-md border border-[var(--border)] bg-muted py-0.5 text-[0.875em] px-1.5">.mdx</code> files in your docs directory. Use standard Markdown with any of Dory's 24 built-in components for rich content.</p></div></div></div><div class="relative flex gap-3.5 pb-6"><div aria-hidden="true" class="absolute left-[13.5px] top-9 bottom-1 w-px bg-[var(--border)]"></div><span class="relative z-10 flex size-7 shrink-0 items-center justify-center rounded-md border text-xs font-semibold border-[var(--border)] bg-muted text-foreground">2</span><div class="min-w-0 flex-1 pt-0.5"><p class="font-heading text-[15px] font-semibold tracking-tight text-foreground">Configure dory.json</p><div class="not-prose mt-0.5 text-muted-foreground"><p class="mb-2 inline-block">Set your site name, colors, fonts, logo, and navigation structure in a single <code class="dory-mdx-code rounded-md border border-[var(--border)] bg-muted py-0.5 text-[0.875em] px-1.5">dory.json</code> file.</p></div></div></div><div class="relative flex gap-3.5 pb-6"><div aria-hidden="true" class="absolute left-[13.5px] top-9 bottom-1 w-px bg-[var(--border)]"></div><span class="relative z-10 flex size-7 shrink-0 items-center justify-center rounded-md border text-xs font-semibold border-[var(--border)] bg-muted text-foreground">3</span><div class="min-w-0 flex-1 pt-0.5"><p class="font-heading text-[15px] font-semibold tracking-tight text-foreground">Run the CLI</p><div class="not-prose mt-0.5 text-muted-foreground"><p class="mb-2 inline-block">Use <code class="dory-mdx-code rounded-md border border-[var(--border)] bg-muted py-0.5 text-[0.875em] px-1.5">dory build</code> to generate a static site or <code class="dory-mdx-code rounded-md border border-[var(--border)] bg-muted py-0.5 text-[0.875em] px-1.5">dory preview</code> to serve a built site on port 3000.</p></div></div></div><div class="relative flex gap-3.5"><span class="relative z-10 flex size-7 shrink-0 items-center justify-center rounded-md border text-xs font-semibold border-[var(--border)] bg-muted text-foreground">4</span><div class="min-w-0 flex-1 pt-0.5"><p class="font-heading text-[15px] font-semibold tracking-tight text-foreground">Deploy anywhere</p><div class="not-prose mt-0.5 text-muted-foreground"><p class="mb-2 inline-block">The output is plain HTML, CSS, and JS — deploy to Netlify, Vercel, S3, GitHub Pages, or any static host.</p></div></div></div></nav>
53
+ <h2 id="navigation" class="dory-h2 font-heading mb-4 mt-16"><span>Navigation</span><a href="#navigation" aria-label="Link to this section" class="dory-anchor">#</a></h2>
54
+ <p class="mb-2 inline-block">Use the sidebar to explore Dory's documentation:</p>
55
+ <div class="not-prose my-6 grid grid-cols-1 gap-3 sm:grid-cols-2"><div data-slot="card" class="text-card-foreground flex flex-col border dory-card group relative gap-0 rounded-lg border-[var(--border)] bg-card p-4 shadow-none transition-shadow hover:shadow-[0_2px_10px_rgb(14_34_64/0.07)]"><a href="/getting-started/installation" aria-label="Installation" class="absolute inset-0 z-10 rounded-lg"></a><div class="mb-3 flex items-start justify-between"><span class="flex size-8 items-center justify-center rounded-md bg-accent text-[var(--primary)]"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" focusable="false" style="mask:url(&quot;data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='1.75'%20stroke-linecap='round'%20stroke-linejoin='round'%3e%3cpath%20d='M11.1%203.74a1.9%201.9%200%200%201%201.8%200l5.6%203.06c.62.34%201%20.98%201%201.68v7.04c0%20.7-.38%201.34-1%201.68l-5.6%203.06a1.9%201.9%200%200%201-1.8%200L5.5%2017.2c-.62-.34-1-.98-1-1.68V8.48c0-.7.38-1.34%201-1.68zM4.8%207.6L12%2011.6l7.2-4M12%2011.6v8.9'%3e%3c/path%3e%3c/svg%3e&quot;) center / contain no-repeat;-webkit-mask:url(&quot;data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='1.75'%20stroke-linecap='round'%20stroke-linejoin='round'%3e%3cpath%20d='M11.1%203.74a1.9%201.9%200%200%201%201.8%200l5.6%203.06c.62.34%201%20.98%201%201.68v7.04c0%20.7-.38%201.34-1%201.68l-5.6%203.06a1.9%201.9%200%200%201-1.8%200L5.5%2017.2c-.62-.34-1-.98-1-1.68V8.48c0-.7.38-1.34%201-1.68zM4.8%207.6L12%2011.6l7.2-4M12%2011.6v8.9'%3e%3c/path%3e%3c/svg%3e&quot;) center / contain no-repeat;" class="inline-block align-[-0.2em] h-4 w-4 !stroke-current"><rect width="24" height="24" fill="currentColor"></rect></svg></span><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" focusable="false" style="mask:url(&quot;data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='1.75'%20stroke-linecap='round'%20stroke-linejoin='round'%3e%3cpath%20d='M13.5%204.75h5.75v5.75M19.25%204.75l-8%208M17.25%2013.5v3.75a2.25%202.25%200%200%201-2.25%202.25H7a2.25%202.25%200%200%201-2.25-2.25V9A2.25%202.25%200%200%201%207%206.75h3.75'%3e%3c/path%3e%3c/svg%3e&quot;) center / contain no-repeat;-webkit-mask:url(&quot;data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='1.75'%20stroke-linecap='round'%20stroke-linejoin='round'%3e%3cpath%20d='M13.5%204.75h5.75v5.75M19.25%204.75l-8%208M17.25%2013.5v3.75a2.25%202.25%200%200%201-2.25%202.25H7a2.25%202.25%200%200%201-2.25-2.25V9A2.25%202.25%200%200%201%207%206.75h3.75'%3e%3c/path%3e%3c/svg%3e&quot;) center / contain no-repeat;" class="inline-block align-[-0.2em] h-3.5 w-3.5 !stroke-[var(--muted-foreground)]"><rect width="24" height="24" fill="currentColor"></rect></svg></div><p class="font-heading text-[15px] font-semibold tracking-tight text-foreground">Installation</p><div class="mt-1 text-[13px] leading-normal text-muted-foreground [&amp;_p]:mb-0">Install Dory and set up your first project in minutes.</div></div><div data-slot="card" class="text-card-foreground flex flex-col border dory-card group relative gap-0 rounded-lg border-[var(--border)] bg-card p-4 shadow-none transition-shadow hover:shadow-[0_2px_10px_rgb(14_34_64/0.07)]"><a href="/getting-started/quick-start" aria-label="Quick Start" class="absolute inset-0 z-10 rounded-lg"></a><div class="mb-3 flex items-start justify-between"><span class="flex size-8 items-center justify-center rounded-md bg-accent text-[var(--primary)]"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" focusable="false" style="mask:url(&quot;data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='1.75'%20stroke-linecap='round'%20stroke-linejoin='round'%3e%3cpath%20d='M12%2019.75V9M7.5%2013.25L12%208.75l4.5%204.5M5.25%204.75h13.5'%3e%3c/path%3e%3c/svg%3e&quot;) center / contain no-repeat;-webkit-mask:url(&quot;data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='1.75'%20stroke-linecap='round'%20stroke-linejoin='round'%3e%3cpath%20d='M12%2019.75V9M7.5%2013.25L12%208.75l4.5%204.5M5.25%204.75h13.5'%3e%3c/path%3e%3c/svg%3e&quot;) center / contain no-repeat;" class="inline-block align-[-0.2em] h-4 w-4 !stroke-current"><rect width="24" height="24" fill="currentColor"></rect></svg></span><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" focusable="false" style="mask:url(&quot;data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='1.75'%20stroke-linecap='round'%20stroke-linejoin='round'%3e%3cpath%20d='M13.5%204.75h5.75v5.75M19.25%204.75l-8%208M17.25%2013.5v3.75a2.25%202.25%200%200%201-2.25%202.25H7a2.25%202.25%200%200%201-2.25-2.25V9A2.25%202.25%200%200%201%207%206.75h3.75'%3e%3c/path%3e%3c/svg%3e&quot;) center / contain no-repeat;-webkit-mask:url(&quot;data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='1.75'%20stroke-linecap='round'%20stroke-linejoin='round'%3e%3cpath%20d='M13.5%204.75h5.75v5.75M19.25%204.75l-8%208M17.25%2013.5v3.75a2.25%202.25%200%200%201-2.25%202.25H7a2.25%202.25%200%200%201-2.25-2.25V9A2.25%202.25%200%200%201%207%206.75h3.75'%3e%3c/path%3e%3c/svg%3e&quot;) center / contain no-repeat;" class="inline-block align-[-0.2em] h-3.5 w-3.5 !stroke-[var(--muted-foreground)]"><rect width="24" height="24" fill="currentColor"></rect></svg></div><p class="font-heading text-[15px] font-semibold tracking-tight text-foreground">Quick Start</p><div class="mt-1 text-[13px] leading-normal text-muted-foreground [&amp;_p]:mb-0">Go from zero to a live documentation site in 5 minutes.</div></div><div data-slot="card" class="text-card-foreground flex flex-col border dory-card group relative gap-0 rounded-lg border-[var(--border)] bg-card p-4 shadow-none transition-shadow hover:shadow-[0_2px_10px_rgb(14_34_64/0.07)]"><a href="/components/overview" aria-label="Components" class="absolute inset-0 z-10 rounded-lg"></a><div class="mb-3 flex items-start justify-between"><span class="flex size-8 items-center justify-center rounded-md bg-accent text-[var(--primary)]"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" focusable="false" style="mask:url(&quot;data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='1.75'%20stroke-linecap='round'%20stroke-linejoin='round'%3e%3cpath%20d='M8.23%203.75H15.77C18.64%203.75%2020.25%205.36%2020.25%208.23V15.77C20.25%2018.64%2018.64%2020.25%2015.77%2020.25H8.23C5.36%2020.25%203.75%2018.64%203.75%2015.77V8.23C3.75%205.36%205.36%203.75%208.23%203.75zM3.75%209.25h16.5M9.25%209.25v11'%3e%3c/path%3e%3c/svg%3e&quot;) center / contain no-repeat;-webkit-mask:url(&quot;data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='1.75'%20stroke-linecap='round'%20stroke-linejoin='round'%3e%3cpath%20d='M8.23%203.75H15.77C18.64%203.75%2020.25%205.36%2020.25%208.23V15.77C20.25%2018.64%2018.64%2020.25%2015.77%2020.25H8.23C5.36%2020.25%203.75%2018.64%203.75%2015.77V8.23C3.75%205.36%205.36%203.75%208.23%203.75zM3.75%209.25h16.5M9.25%209.25v11'%3e%3c/path%3e%3c/svg%3e&quot;) center / contain no-repeat;" class="inline-block align-[-0.2em] h-4 w-4 !stroke-current"><rect width="24" height="24" fill="currentColor"></rect></svg></span><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" focusable="false" style="mask:url(&quot;data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='1.75'%20stroke-linecap='round'%20stroke-linejoin='round'%3e%3cpath%20d='M13.5%204.75h5.75v5.75M19.25%204.75l-8%208M17.25%2013.5v3.75a2.25%202.25%200%200%201-2.25%202.25H7a2.25%202.25%200%200%201-2.25-2.25V9A2.25%202.25%200%200%201%207%206.75h3.75'%3e%3c/path%3e%3c/svg%3e&quot;) center / contain no-repeat;-webkit-mask:url(&quot;data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='1.75'%20stroke-linecap='round'%20stroke-linejoin='round'%3e%3cpath%20d='M13.5%204.75h5.75v5.75M19.25%204.75l-8%208M17.25%2013.5v3.75a2.25%202.25%200%200%201-2.25%202.25H7a2.25%202.25%200%200%201-2.25-2.25V9A2.25%202.25%200%200%201%207%206.75h3.75'%3e%3c/path%3e%3c/svg%3e&quot;) center / contain no-repeat;" class="inline-block align-[-0.2em] h-3.5 w-3.5 !stroke-[var(--muted-foreground)]"><rect width="24" height="24" fill="currentColor"></rect></svg></div><p class="font-heading text-[15px] font-semibold tracking-tight text-foreground">Components</p><div class="mt-1 text-[13px] leading-normal text-muted-foreground [&amp;_p]:mb-0">Browse all 24 built-in MDX components with live demos.</div></div><div data-slot="card" class="text-card-foreground flex flex-col border dory-card group relative gap-0 rounded-lg border-[var(--border)] bg-card p-4 shadow-none transition-shadow hover:shadow-[0_2px_10px_rgb(14_34_64/0.07)]"><a href="/configuration/dory-json" aria-label="Configuration" class="absolute inset-0 z-10 rounded-lg"></a><div class="mb-3 flex items-start justify-between"><span class="flex size-8 items-center justify-center rounded-md bg-accent text-[var(--primary)]"><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" focusable="false" style="mask:url(&quot;data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='1.75'%20stroke-linecap='round'%20stroke-linejoin='round'%3e%3cpath%20d='M6%2012a6%206%200%201%200%2012%200a6%206%200%201%200%20-12%200M9.5%2012a2.5%202.5%200%201%200%205%200a2.5%202.5%200%201%200%20-5%200M12%202.75V6M12%2018v3.25M2.75%2012H6M18%2012h3.25M5.46%205.46l2.3%202.3M16.24%2016.24l2.3%202.3M5.46%2018.54l2.3-2.3M16.24%207.76l2.3-2.3'%20/%3e%3c/svg%3e&quot;) center / contain no-repeat;-webkit-mask:url(&quot;data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='1.75'%20stroke-linecap='round'%20stroke-linejoin='round'%3e%3cpath%20d='M6%2012a6%206%200%201%200%2012%200a6%206%200%201%200%20-12%200M9.5%2012a2.5%202.5%200%201%200%205%200a2.5%202.5%200%201%200%20-5%200M12%202.75V6M12%2018v3.25M2.75%2012H6M18%2012h3.25M5.46%205.46l2.3%202.3M16.24%2016.24l2.3%202.3M5.46%2018.54l2.3-2.3M16.24%207.76l2.3-2.3'%20/%3e%3c/svg%3e&quot;) center / contain no-repeat;" class="inline-block align-[-0.2em] h-4 w-4 !stroke-current"><rect width="24" height="24" fill="currentColor"></rect></svg></span><svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" focusable="false" style="mask:url(&quot;data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='1.75'%20stroke-linecap='round'%20stroke-linejoin='round'%3e%3cpath%20d='M13.5%204.75h5.75v5.75M19.25%204.75l-8%208M17.25%2013.5v3.75a2.25%202.25%200%200%201-2.25%202.25H7a2.25%202.25%200%200%201-2.25-2.25V9A2.25%202.25%200%200%201%207%206.75h3.75'%3e%3c/path%3e%3c/svg%3e&quot;) center / contain no-repeat;-webkit-mask:url(&quot;data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='24'%20height='24'%20viewBox='0%200%2024%2024'%20fill='none'%20stroke='currentColor'%20stroke-width='1.75'%20stroke-linecap='round'%20stroke-linejoin='round'%3e%3cpath%20d='M13.5%204.75h5.75v5.75M19.25%204.75l-8%208M17.25%2013.5v3.75a2.25%202.25%200%200%201-2.25%202.25H7a2.25%202.25%200%200%201-2.25-2.25V9A2.25%202.25%200%200%201%207%206.75h3.75'%3e%3c/path%3e%3c/svg%3e&quot;) center / contain no-repeat;" class="inline-block align-[-0.2em] h-3.5 w-3.5 !stroke-[var(--muted-foreground)]"><rect width="24" height="24" fill="currentColor"></rect></svg></div><p class="font-heading text-[15px] font-semibold tracking-tight text-foreground">Configuration</p><div class="mt-1 text-[13px] leading-normal text-muted-foreground [&amp;_p]:mb-0">Full reference for the dory.json configuration file.</div></div></div></div></div></div></div><div class="dory-feedback mt-16 flex items-center justify-between border-y border-[var(--border)] py-4"><p class="text-sm font-medium text-foreground">Was this page helpful?</p><div class="flex gap-2"><button type="button">Yes</button><button type="button">No</button></div></div><div class="mt-6 grid gap-4 sm:grid-cols-2"><a href="/getting-started/installation" class="dory-pager-card sm:col-span-2 text-right"><span class="dory-pager-label">Getting Started →</span><span class="dory-pager-title">Installation</span></a></div><footer class="dory-page-footer mt-12 flex items-center justify-between pb-4"><a href="https://github.com/clidey/dory" target="_blank" rel="noopener noreferrer" class="flex items-center gap-2"><img src="data:image/svg+xml;utf8,%3Csvg%20width%3D%2222%22%20height%3D%2224%22%20viewBox%3D%220%200%2022%2024%22%20fill%3D%22none%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%0A%3Cpath%20d%3D%22M21.9941%204.99951C19.9947%203.00079%2019.9947%203.00079%2016.9956%200.00271368V4.99951H21.9941Z%22%20fill%3D%22%2392BFFA%22%2F%3E%0A%3Cpath%20d%3D%22M7.49782%203.91843C7.49782%204.5155%207.98183%204.99951%208.5789%204.99951H16.9951V0.00271606H8.5789C7.98183%200.00271606%207.49782%200.486733%207.49782%201.0838V3.91843Z%22%20fill%3D%22url(%23paint0_linear_66_680)%22%2F%3E%0A%3Cpath%20d%3D%22M21.9932%205.01123C22.0049%208.20987%2021.9983%2017.7036%2021.9951%2021.9995C21.9943%2023.1041%2021.0977%2023.9995%2019.9932%2023.9995H2C0.895431%2023.9995%203.87055e-07%2023.1041%200%2021.9995V8.59131C0%207.99426%200.48401%207.51028%201.08105%207.51025H3.91797C4.51481%207.51052%204.99902%207.99441%204.99902%208.59131V19.5024H16.9951V5.01123H21.9932Z%22%20fill%3D%22url(%23paint1_linear_66_680)%22%2F%3E%0A%3Cellipse%20cx%3D%2212.3217%22%20cy%3D%2214.276%22%20rx%3D%221.2973%22%20ry%3D%221.29647%22%20fill%3D%22%231967D2%22%2F%3E%0A%3Cpath%20d%3D%22M5%200.00634813C5.55157%200.00730227%205.99805%200.454718%205.99805%201.00635V4.01221C5.99805%204.64068%206.29707%205.23179%206.80273%205.60498L7.46777%206.09619C7.81171%206.35003%208.22878%206.48682%208.65625%206.48682H14.4951C15.0472%206.48682%2015.4949%206.93475%2015.4951%207.48682V16.98C15.4951%2017.5322%2015.0474%2017.98%2014.4951%2017.98H7.49805C6.94583%2017.9799%206.49808%2017.5322%206.49805%2016.98V8.67139C6.49806%208.23724%206.35689%207.81407%206.0957%207.46729L5.58691%206.79248C5.21558%206.29954%204.63759%206.00515%204.02051%205.99561H1C0.447722%205.9956%200%205.54789%200%204.99561V1.00049C0.000165845%200.447951%200.448441%20-4.60729e-05%201.00098%200.00048876L5%200.00634813Z%22%20fill%3D%22%23FFC236%22%2F%3E%0A%3Cellipse%20cx%3D%2212.9961%22%20cy%3D%2215.505%22%20rx%3D%221%22%20ry%3D%220.999359%22%20fill%3D%22%233630C4%22%2F%3E%0A%3Cdefs%3E%0A%3ClinearGradient%20id%3D%22paint0_linear_66_680%22%20x1%3D%2210.9999%22%20y1%3D%220.00271606%22%20x2%3D%2210.9999%22%20y2%3D%2223.9995%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%23528FF4%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2392BFFA%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3ClinearGradient%20id%3D%22paint1_linear_66_680%22%20x1%3D%2210.9999%22%20y1%3D%220.00271606%22%20x2%3D%2210.9999%22%20y2%3D%2223.9995%22%20gradientUnits%3D%22userSpaceOnUse%22%3E%0A%3Cstop%20stop-color%3D%22%23528FF4%22%2F%3E%0A%3Cstop%20offset%3D%221%22%20stop-color%3D%22%2392BFFA%22%2F%3E%0A%3C%2FlinearGradient%3E%0A%3C%2Fdefs%3E%0A%3C%2Fsvg%3E" alt class="h-3.5 w-3.5"/>Powered by Dory</a><span>© 2026 Clidey</span></footer></article><aside aria-labelledby="on-this-page-title" class="dory-toc hidden w-52 shrink-0 xl:block"></aside></div></main></div></div></div>
56
+ </body>
57
+ </html>