@wrikka/create-docs 0.1.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 (380) hide show
  1. package/README.md +137 -0
  2. package/bin/cli.js +408 -0
  3. package/dist/index.cjs +20 -0
  4. package/dist/index.d.cts +475 -0
  5. package/dist/index.d.ts +475 -0
  6. package/dist/index.js +20 -0
  7. package/docs/_dir.yml +2 -0
  8. package/docs/config.md +75 -0
  9. package/docs/data-sources.md +88 -0
  10. package/docs/deploy.md +38 -0
  11. package/docs/features.md +51 -0
  12. package/docs/getting-started.md +42 -0
  13. package/docs/index.md +34 -0
  14. package/docs/markdown.md +154 -0
  15. package/docs/theming.md +53 -0
  16. package/package.json +142 -0
  17. package/scripts/generate-docs-index.ts +111 -0
  18. package/scripts/github-pull.ts +124 -0
  19. package/src/adapters/config/index.ts +1 -0
  20. package/src/adapters/config/node-config-loader.ts +36 -0
  21. package/src/adapters/fs/fs-docs-loader.ts +31 -0
  22. package/src/adapters/fs/index.ts +12 -0
  23. package/src/adapters/fs/memory-fs.ts +60 -0
  24. package/src/adapters/fs/node-fs.ts +116 -0
  25. package/src/adapters/git/index.ts +164 -0
  26. package/src/adapters/github/github-pull.ts +340 -0
  27. package/src/adapters/index.ts +6 -0
  28. package/src/adapters/velite.ts +112 -0
  29. package/src/adapters/vite/docs-watcher.ts +36 -0
  30. package/src/adapters/vite/index.ts +2 -0
  31. package/src/adapters/vite/polling-watcher.ts +89 -0
  32. package/src/code-block-enhancements/index.ts +3 -0
  33. package/src/config/index.ts +15 -0
  34. package/src/content/index.ts +11 -0
  35. package/src/content-validation/index.ts +5 -0
  36. package/src/index.ts +174 -0
  37. package/src/live-editor/index.ts +7 -0
  38. package/src/modules/analytics/application/plausible-adapter.ts +103 -0
  39. package/src/modules/analytics/application/umami-adapter.ts +109 -0
  40. package/src/modules/analytics/domain/events/index.ts +37 -0
  41. package/src/modules/analytics/domain/models/index.ts +35 -0
  42. package/src/modules/analytics/domain/operations/analytics-operations.ts +67 -0
  43. package/src/modules/analytics/domain/validators/index.ts +50 -0
  44. package/src/modules/analytics/index.ts +9 -0
  45. package/src/modules/analytics/ports/analytics-port.ts +17 -0
  46. package/src/modules/analytics/types/analytics.ts +16 -0
  47. package/src/modules/api-docs/application/type-docs-adapter.ts +34 -0
  48. package/src/modules/api-docs/domain/events/index.ts +42 -0
  49. package/src/modules/api-docs/domain/models/index.ts +40 -0
  50. package/src/modules/api-docs/domain/operations/api-docs-operations.ts +59 -0
  51. package/src/modules/api-docs/domain/validators/index.ts +56 -0
  52. package/src/modules/api-docs/index.ts +8 -0
  53. package/src/modules/api-docs/ports/api-docs-port.ts +21 -0
  54. package/src/modules/api-docs/types/api-docs.ts +15 -0
  55. package/src/modules/api-reference/openapi.ts +166 -0
  56. package/src/modules/api-reference/orpc.ts +94 -0
  57. package/src/modules/code-block-enhancements/application/usecases/index.ts +39 -0
  58. package/src/modules/code-block-enhancements/domain/code-operations.ts +72 -0
  59. package/src/modules/code-block-enhancements/domain/events/index.ts +58 -0
  60. package/src/modules/code-block-enhancements/domain/index.ts +11 -0
  61. package/src/modules/code-block-enhancements/domain/models/index.ts +36 -0
  62. package/src/modules/code-block-enhancements/domain/validators/index.ts +50 -0
  63. package/src/modules/code-block-enhancements/index.ts +10 -0
  64. package/src/modules/code-block-enhancements/ports/index.ts +18 -0
  65. package/src/modules/code-block-enhancements/types/index.ts +37 -0
  66. package/src/modules/code-execution/application/sandbox-adapter.ts +44 -0
  67. package/src/modules/code-execution/domain/events/index.ts +58 -0
  68. package/src/modules/code-execution/domain/models/index.ts +33 -0
  69. package/src/modules/code-execution/domain/operations/execution-operations.ts +60 -0
  70. package/src/modules/code-execution/domain/validators/index.ts +50 -0
  71. package/src/modules/code-execution/index.ts +8 -0
  72. package/src/modules/code-execution/ports/execution-port.ts +15 -0
  73. package/src/modules/code-execution/types/execution.ts +15 -0
  74. package/src/modules/comments/application/giscus-adapter.ts +55 -0
  75. package/src/modules/comments/domain/events/index.ts +55 -0
  76. package/src/modules/comments/domain/models/index.ts +30 -0
  77. package/src/modules/comments/domain/operations/comment-operations.ts +46 -0
  78. package/src/modules/comments/domain/validators/index.ts +50 -0
  79. package/src/modules/comments/index.ts +8 -0
  80. package/src/modules/comments/ports/comment-port.ts +18 -0
  81. package/src/modules/comments/types/comments.ts +19 -0
  82. package/src/modules/config/application/usecases/index.ts +1 -0
  83. package/src/modules/config/application/usecases/loadConfig.ts +38 -0
  84. package/src/modules/config/application/workflows/index.ts +1 -0
  85. package/src/modules/config/application/workflows/validateConfig.ts +14 -0
  86. package/src/modules/config/domain/events/index.ts +50 -0
  87. package/src/modules/config/domain/models/index.ts +9 -0
  88. package/src/modules/config/domain/operations/defaults.ts +74 -0
  89. package/src/modules/config/domain/operations/index.ts +2 -0
  90. package/src/modules/config/domain/operations/resolve.ts +40 -0
  91. package/src/modules/config/domain/validators/index.ts +152 -0
  92. package/src/modules/config/index.ts +23 -0
  93. package/src/modules/config/ports/index.ts +15 -0
  94. package/src/modules/config/types/index.ts +113 -0
  95. package/src/modules/config/types/public.ts +19 -0
  96. package/src/modules/content/application/cache/index.ts +6 -0
  97. package/src/modules/content/application/cache/parse-cache.ts +6 -0
  98. package/src/modules/content/application/cache/parseCache.ts +56 -0
  99. package/src/modules/content/application/usecases/index.ts +2 -0
  100. package/src/modules/content/application/usecases/load-doc-page.ts +1 -0
  101. package/src/modules/content/application/usecases/loadDocPage.ts +111 -0
  102. package/src/modules/content/application/usecases/scanDocsDir.ts +105 -0
  103. package/src/modules/content/application/workflows/index.ts +1 -0
  104. package/src/modules/content/application/workflows/processDocs.ts +51 -0
  105. package/src/modules/content/domain/events/index.ts +61 -0
  106. package/src/modules/content/domain/models/index.ts +13 -0
  107. package/src/modules/content/domain/operations/build-page.ts +146 -0
  108. package/src/modules/content/domain/operations/buildPage.ts +93 -0
  109. package/src/modules/content/domain/operations/index.ts +17 -0
  110. package/src/modules/content/domain/operations/parse.ts +241 -0
  111. package/src/modules/content/domain/validators/frontmatter.ts +82 -0
  112. package/src/modules/content/domain/validators/index.ts +6 -0
  113. package/src/modules/content/index.ts +27 -0
  114. package/src/modules/content/ports/index.ts +45 -0
  115. package/src/modules/content/ports/velite.ts +134 -0
  116. package/src/modules/content/types/index.ts +76 -0
  117. package/src/modules/content/types/public.ts +1 -0
  118. package/src/modules/content-linting/application/builtin-linting-adapter.ts +82 -0
  119. package/src/modules/content-linting/domain/events/index.ts +58 -0
  120. package/src/modules/content-linting/domain/models/index.ts +46 -0
  121. package/src/modules/content-linting/domain/operations/linting-operations.ts +82 -0
  122. package/src/modules/content-linting/domain/validators/index.ts +50 -0
  123. package/src/modules/content-linting/index.ts +8 -0
  124. package/src/modules/content-linting/ports/linting-port.ts +21 -0
  125. package/src/modules/content-linting/types/linting.ts +18 -0
  126. package/src/modules/content-validation/application/usecases/index.ts +18 -0
  127. package/src/modules/content-validation/domain/events/index.ts +7 -0
  128. package/src/modules/content-validation/domain/index.ts +16 -0
  129. package/src/modules/content-validation/domain/models/index.ts +33 -0
  130. package/src/modules/content-validation/domain/operations/index.ts +157 -0
  131. package/src/modules/content-validation/domain/types/index.ts +17 -0
  132. package/src/modules/content-validation/domain/validators/index.ts +8 -0
  133. package/src/modules/content-validation/index.ts +9 -0
  134. package/src/modules/content-validation/ports/index.ts +15 -0
  135. package/src/modules/content-validation/types/index.ts +5 -0
  136. package/src/modules/export/application/puppeteer-export-adapter.ts +63 -0
  137. package/src/modules/export/domain/events/index.ts +55 -0
  138. package/src/modules/export/domain/models/index.ts +38 -0
  139. package/src/modules/export/domain/operations/export-operations.ts +56 -0
  140. package/src/modules/export/domain/validators/index.ts +52 -0
  141. package/src/modules/export/index.ts +8 -0
  142. package/src/modules/export/ports/export-port.ts +15 -0
  143. package/src/modules/export/types/export.ts +15 -0
  144. package/src/modules/external-search/application/algolia-adapter.ts +182 -0
  145. package/src/modules/external-search/application/meilisearch-adapter.ts +161 -0
  146. package/src/modules/external-search/domain/events/index.ts +42 -0
  147. package/src/modules/external-search/domain/models/index.ts +42 -0
  148. package/src/modules/external-search/domain/operations/search-operations.ts +53 -0
  149. package/src/modules/external-search/domain/validators/index.ts +55 -0
  150. package/src/modules/external-search/index.ts +9 -0
  151. package/src/modules/external-search/ports/external-search-port.ts +23 -0
  152. package/src/modules/external-search/types/search.ts +19 -0
  153. package/src/modules/git-history/application/simple-git-adapter.ts +46 -0
  154. package/src/modules/git-history/domain/events/index.ts +34 -0
  155. package/src/modules/git-history/domain/models/index.ts +25 -0
  156. package/src/modules/git-history/domain/operations/git-history-operations.ts +56 -0
  157. package/src/modules/git-history/domain/validators/index.ts +52 -0
  158. package/src/modules/git-history/index.ts +8 -0
  159. package/src/modules/git-history/ports/git-history-port.ts +21 -0
  160. package/src/modules/git-history/types/git-history.ts +15 -0
  161. package/src/modules/i18n/application/fs-locale-loader.ts +39 -0
  162. package/src/modules/i18n/domain/events/index.ts +34 -0
  163. package/src/modules/i18n/domain/models/index.ts +34 -0
  164. package/src/modules/i18n/domain/operations/locale-operations.ts +74 -0
  165. package/src/modules/i18n/domain/validators/index.ts +52 -0
  166. package/src/modules/i18n/index.ts +8 -0
  167. package/src/modules/i18n/ports/locale-loader-port.ts +18 -0
  168. package/src/modules/i18n/types/locale.ts +17 -0
  169. package/src/modules/image-optimization/application/sharp-adapter.ts +58 -0
  170. package/src/modules/image-optimization/domain/events/index.ts +39 -0
  171. package/src/modules/image-optimization/domain/models/index.ts +27 -0
  172. package/src/modules/image-optimization/domain/operations/image-operations.ts +65 -0
  173. package/src/modules/image-optimization/domain/validators/index.ts +52 -0
  174. package/src/modules/image-optimization/index.ts +8 -0
  175. package/src/modules/image-optimization/ports/image-optimizer-port.ts +15 -0
  176. package/src/modules/image-optimization/types/image.ts +17 -0
  177. package/src/modules/live-editor/application/usecases/index.ts +60 -0
  178. package/src/modules/live-editor/domain/events/index.ts +37 -0
  179. package/src/modules/live-editor/domain/gitOperations.ts +110 -0
  180. package/src/modules/live-editor/domain/index.ts +15 -0
  181. package/src/modules/live-editor/domain/models/index.ts +21 -0
  182. package/src/modules/live-editor/domain/validators/index.ts +55 -0
  183. package/src/modules/live-editor/index.ts +14 -0
  184. package/src/modules/live-editor/ports/index.ts +49 -0
  185. package/src/modules/live-editor/types/index.ts +80 -0
  186. package/src/modules/live-preview/application/vite-preview-adapter.ts +20 -0
  187. package/src/modules/live-preview/domain/operations/preview-operations.ts +56 -0
  188. package/src/modules/live-preview/index.ts +8 -0
  189. package/src/modules/live-preview/ports/preview-port.ts +20 -0
  190. package/src/modules/live-preview/types/preview.ts +16 -0
  191. package/src/modules/mdx/application/mdx-js-adapter.ts +38 -0
  192. package/src/modules/mdx/domain/operations/parse-mdx.ts +43 -0
  193. package/src/modules/mdx/index.ts +8 -0
  194. package/src/modules/mdx/ports/mdx-parser-port.ts +15 -0
  195. package/src/modules/mdx/types/mdx.ts +14 -0
  196. package/src/modules/navigation/application/usecases/buildNav.ts +15 -0
  197. package/src/modules/navigation/application/usecases/buildSidebar.ts +45 -0
  198. package/src/modules/navigation/application/usecases/index.ts +2 -0
  199. package/src/modules/navigation/domain/events/index.ts +30 -0
  200. package/src/modules/navigation/domain/models/index.ts +7 -0
  201. package/src/modules/navigation/domain/operations/group.ts +79 -0
  202. package/src/modules/navigation/domain/operations/index.ts +10 -0
  203. package/src/modules/navigation/domain/operations/sort.ts +27 -0
  204. package/src/modules/navigation/domain/shared/utils/array.ts +39 -0
  205. package/src/modules/navigation/domain/validators/index.ts +88 -0
  206. package/src/modules/navigation/index.ts +15 -0
  207. package/src/modules/navigation/ports/index.ts +9 -0
  208. package/src/modules/navigation/types/index.ts +38 -0
  209. package/src/modules/navigation/types/public.ts +9 -0
  210. package/src/modules/openapi/application/swagger-parser-adapter.ts +178 -0
  211. package/src/modules/openapi/domain/operations/parse-openapi.ts +46 -0
  212. package/src/modules/openapi/index.ts +8 -0
  213. package/src/modules/openapi/ports/openapi-parser-port.ts +15 -0
  214. package/src/modules/openapi/types/openapi.ts +37 -0
  215. package/src/modules/plugin/application/usecases/build-virtual-modules.ts +53 -0
  216. package/src/modules/plugin/application/usecases/index.ts +1 -0
  217. package/src/modules/plugin/application/workflows/build-docs.ts +79 -0
  218. package/src/modules/plugin/application/workflows/index.ts +1 -0
  219. package/src/modules/plugin/domain/events/index.ts +62 -0
  220. package/src/modules/plugin/domain/models/index.ts +1 -0
  221. package/src/modules/plugin/domain/operations/build-virtual.ts +76 -0
  222. package/src/modules/plugin/domain/operations/index.ts +11 -0
  223. package/src/modules/plugin/domain/validators/index.ts +30 -0
  224. package/src/modules/plugin/index.ts +14 -0
  225. package/src/modules/plugin/ports/index.ts +21 -0
  226. package/src/modules/plugin/types/index.ts +27 -0
  227. package/src/modules/plugin/types/public.ts +1 -0
  228. package/src/modules/search/application/usecases/index.ts +1 -0
  229. package/src/modules/search/application/usecases/indexPages.ts +15 -0
  230. package/src/modules/search/domain/events/index.ts +32 -0
  231. package/src/modules/search/domain/models/index.ts +1 -0
  232. package/src/modules/search/domain/operations/build-index.ts +6 -0
  233. package/src/modules/search/domain/operations/buildIndex.ts +70 -0
  234. package/src/modules/search/domain/operations/index.ts +7 -0
  235. package/src/modules/search/domain/operations/query.ts +186 -0
  236. package/src/modules/search/domain/validators/index.ts +32 -0
  237. package/src/modules/search/index.ts +9 -0
  238. package/src/modules/search/types/index.ts +22 -0
  239. package/src/modules/search/types/public.ts +1 -0
  240. package/src/modules/search-analytics/application/local-storage-adapter.ts +68 -0
  241. package/src/modules/search-analytics/domain/operations/search-analytics-operations.ts +74 -0
  242. package/src/modules/search-analytics/index.ts +8 -0
  243. package/src/modules/search-analytics/ports/search-analytics-port.ts +20 -0
  244. package/src/modules/search-analytics/types/search-analytics.ts +16 -0
  245. package/src/modules/search-highlighting/application/dom-highlighting-adapter.ts +36 -0
  246. package/src/modules/search-highlighting/domain/operations/highlighting-operations.ts +72 -0
  247. package/src/modules/search-highlighting/index.ts +8 -0
  248. package/src/modules/search-highlighting/ports/highlighting-port.ts +14 -0
  249. package/src/modules/search-highlighting/types/highlighting.ts +15 -0
  250. package/src/modules/seo-optimization/application/usecases/index.ts +18 -0
  251. package/src/modules/seo-optimization/domain/index.ts +12 -0
  252. package/src/modules/seo-optimization/domain/seoOperations.ts +92 -0
  253. package/src/modules/seo-optimization/index.ts +8 -0
  254. package/src/modules/seo-optimization/ports/index.ts +18 -0
  255. package/src/modules/seo-optimization/types/index.ts +41 -0
  256. package/src/modules/theme/application/css-theme-adapter.ts +50 -0
  257. package/src/modules/theme/domain/operations/theme-operations.ts +68 -0
  258. package/src/modules/theme/index.ts +8 -0
  259. package/src/modules/theme/ports/theme-port.ts +8 -0
  260. package/src/modules/theme/types/theme.ts +12 -0
  261. package/src/modules/toc/application/markdown-toc-adapter.ts +106 -0
  262. package/src/modules/toc/domain/operations/toc-operations.ts +92 -0
  263. package/src/modules/toc/index.ts +8 -0
  264. package/src/modules/toc/ports/toc-port.ts +21 -0
  265. package/src/modules/toc/types/toc.ts +17 -0
  266. package/src/modules/toc-generator/application/usecases/index.ts +30 -0
  267. package/src/modules/toc-generator/domain/index.ts +12 -0
  268. package/src/modules/toc-generator/domain/tocOperations.ts +104 -0
  269. package/src/modules/toc-generator/index.ts +9 -0
  270. package/src/modules/toc-generator/ports/index.ts +20 -0
  271. package/src/modules/toc-generator/types/index.ts +50 -0
  272. package/src/modules/version-control/domain/events/index.ts +39 -0
  273. package/src/modules/version-control/domain/models/index.ts +25 -0
  274. package/src/modules/version-control/domain/validators/index.ts +50 -0
  275. package/src/modules/versioning/application/fs-version-loader.ts +44 -0
  276. package/src/modules/versioning/domain/operations/versioning-operations.ts +80 -0
  277. package/src/modules/versioning/index.ts +8 -0
  278. package/src/modules/versioning/ports/version-loader-port.ts +18 -0
  279. package/src/modules/versioning/types/versioning.ts +17 -0
  280. package/src/modules/workflow/domain/events/index.ts +55 -0
  281. package/src/modules/workflow/domain/models/index.ts +40 -0
  282. package/src/modules/workflow/domain/validators/index.ts +50 -0
  283. package/src/modules/yaml-parser/application/js-yaml-adapter.ts +34 -0
  284. package/src/modules/yaml-parser/domain/operations/parse-yaml.ts +58 -0
  285. package/src/modules/yaml-parser/index.ts +7 -0
  286. package/src/modules/yaml-parser/ports/yaml-parser-port.ts +18 -0
  287. package/src/navigation/index.ts +9 -0
  288. package/src/plugin/index.ts +4 -0
  289. package/src/presentation/index.ts +1 -0
  290. package/src/presentation/live-editor/index.ts +22 -0
  291. package/src/presentation/live-editor/live-editor-component.ts +219 -0
  292. package/src/presentation/live-editor/virtual-module.ts +16 -0
  293. package/src/presentation/solid/CodeBlock.tsx +120 -0
  294. package/src/presentation/solid/Toc.tsx +58 -0
  295. package/src/presentation/solid/index.ts +11 -0
  296. package/src/presentation/vite-plugin/docs-plugin.ts +212 -0
  297. package/src/presentation/vite-plugin/index.ts +9 -0
  298. package/src/presentation/vite-plugin/transform-markdown.ts +26 -0
  299. package/src/runtime/analytics.ts +59 -0
  300. package/src/runtime/api-diff.ts +115 -0
  301. package/src/runtime/app.tsx +32 -0
  302. package/src/runtime/components/AccentPicker.tsx +114 -0
  303. package/src/runtime/components/ApiPlayground.tsx +332 -0
  304. package/src/runtime/components/AskAiDialog.tsx +127 -0
  305. package/src/runtime/components/BackToTop.tsx +38 -0
  306. package/src/runtime/components/Banner.tsx +75 -0
  307. package/src/runtime/components/Breadcrumbs.tsx +42 -0
  308. package/src/runtime/components/CollectionDropdown.tsx +85 -0
  309. package/src/runtime/components/CustomizeDrawer.tsx +195 -0
  310. package/src/runtime/components/DocMarkdown.tsx +579 -0
  311. package/src/runtime/components/DocPrevNext.tsx +54 -0
  312. package/src/runtime/components/DocToc.tsx +147 -0
  313. package/src/runtime/components/DocsDropdown.tsx +184 -0
  314. package/src/runtime/components/Footer.tsx +52 -0
  315. package/src/runtime/components/GitHubAuth.tsx +82 -0
  316. package/src/runtime/components/GitHubStats.tsx +73 -0
  317. package/src/runtime/components/Head.tsx +225 -0
  318. package/src/runtime/components/LocaleDropdown.tsx +75 -0
  319. package/src/runtime/components/MobileBottomNav.tsx +111 -0
  320. package/src/runtime/components/NotFound.tsx +139 -0
  321. package/src/runtime/components/PageActions.tsx +144 -0
  322. package/src/runtime/components/RelatedDocs.tsx +50 -0
  323. package/src/runtime/components/ScrollProgress.tsx +32 -0
  324. package/src/runtime/components/SearchPalette.tsx +333 -0
  325. package/src/runtime/components/ShowcaseCard.tsx +87 -0
  326. package/src/runtime/components/SidebarNav.tsx +237 -0
  327. package/src/runtime/components/Skeleton.tsx +39 -0
  328. package/src/runtime/components/ThemeToggle.tsx +26 -0
  329. package/src/runtime/components/TopNav.tsx +270 -0
  330. package/src/runtime/components/VersionDropdown.tsx +189 -0
  331. package/src/runtime/components/markdown/components.ts +280 -0
  332. package/src/runtime/config.ts +225 -0
  333. package/src/runtime/content.ts +451 -0
  334. package/src/runtime/context.tsx +30 -0
  335. package/src/runtime/data.ts +93 -0
  336. package/src/runtime/github.ts +226 -0
  337. package/src/runtime/icons.ts +32 -0
  338. package/src/runtime/index.ts +153 -0
  339. package/src/runtime/layouts/DocsLayout.tsx +144 -0
  340. package/src/runtime/markdown-content.css +996 -0
  341. package/src/runtime/pages/AbTestPage.tsx +88 -0
  342. package/src/runtime/pages/AnalyticsPage.tsx +90 -0
  343. package/src/runtime/pages/ApiDiffPage.tsx +86 -0
  344. package/src/runtime/pages/ApiEndpointPage.tsx +248 -0
  345. package/src/runtime/pages/BuilderPage.tsx +150 -0
  346. package/src/runtime/pages/ChangelogPage.tsx +210 -0
  347. package/src/runtime/pages/CollectionPage.tsx +140 -0
  348. package/src/runtime/pages/CommunityPage.tsx +384 -0
  349. package/src/runtime/pages/CreatePage.tsx +448 -0
  350. package/src/runtime/pages/DocPage.tsx +193 -0
  351. package/src/runtime/pages/EditPage.tsx +201 -0
  352. package/src/runtime/pages/HomePage.tsx +187 -0
  353. package/src/runtime/pages/IssuesPage.tsx +140 -0
  354. package/src/runtime/pages/OAuthCallbackPage.tsx +80 -0
  355. package/src/runtime/pages/PluginsPage.tsx +249 -0
  356. package/src/runtime/pages/ShowcasePage.tsx +202 -0
  357. package/src/runtime/pwa.ts +39 -0
  358. package/src/runtime/router.tsx +192 -0
  359. package/src/runtime/seo.ts +192 -0
  360. package/src/runtime/theme.css +175 -0
  361. package/src/runtime/theme.ts +224 -0
  362. package/src/runtime/types.ts +217 -0
  363. package/src/search/index.ts +6 -0
  364. package/src/seo-optimization/index.ts +4 -0
  365. package/src/shared/constants/index.ts +26 -0
  366. package/src/shared/errors/index.ts +195 -0
  367. package/src/shared/index.ts +27 -0
  368. package/src/shared/types/brand.ts +14 -0
  369. package/src/shared/types/client.d.ts +45 -0
  370. package/src/shared/types/either.ts +38 -0
  371. package/src/shared/types/index.ts +42 -0
  372. package/src/shared/types/option.ts +52 -0
  373. package/src/shared/types/result.ts +81 -0
  374. package/src/shared/utils/array.ts +97 -0
  375. package/src/shared/utils/index.ts +46 -0
  376. package/src/shared/utils/object.ts +47 -0
  377. package/src/shared/utils/string.ts +74 -0
  378. package/src/toc-generator/index.ts +1 -0
  379. package/src/types/js-yaml.d.ts +42 -0
  380. package/src/worker.ts +462 -0
@@ -0,0 +1,237 @@
1
+ import { Link, useParams } from "@tanstack/solid-router";
2
+ import { createEffect, createMemo, createSignal, For, Show } from "solid-js";
3
+ import { createDocsList, useCollections } from "../data";
4
+ import { categoryIcon, typeIcon } from "../icons";
5
+ import type { DocEntry } from "../types";
6
+
7
+ function sortDocs(items: DocEntry[]): DocEntry[] {
8
+ return [...items].sort(
9
+ (a, b) => (a.order ?? 0) - (b.order ?? 0) || a.label.localeCompare(b.label),
10
+ );
11
+ }
12
+
13
+ function SidebarDocItem(props: {
14
+ doc: DocEntry;
15
+ collection: string;
16
+ activeId?: string;
17
+ depth?: number;
18
+ onNavigate: () => void;
19
+ }) {
20
+ const depth = () => props.depth ?? 0;
21
+ const isActive = () => props.activeId === props.doc.id;
22
+ const hasChildren = () => (props.doc.children?.length ?? 0) > 0;
23
+ const [open, setOpen] = createSignal(true);
24
+
25
+ return (
26
+ <li>
27
+ <div class="flex items-center gap-0.5">
28
+ <Show when={hasChildren()}>
29
+ <button
30
+ type="button"
31
+ onClick={() => setOpen(!open())}
32
+ aria-label={open() ? "Collapse section" : "Expand section"}
33
+ aria-expanded={open()}
34
+ class="w-5 h-5 shrink-0 inline-flex items-center justify-center rounded text-muted hover:text-foreground hover:bg-surface transition-colors cursor-pointer border-none bg-transparent"
35
+ >
36
+ <span
37
+ class={`i-mdi:chevron-down text-xs transition-transform ${open() ? "" : "-rotate-90"}`}
38
+ aria-hidden="true"
39
+ />
40
+ </button>
41
+ </Show>
42
+ <Link
43
+ to="/$collection/$docId"
44
+ params={{
45
+ collection: props.collection,
46
+ docId: props.doc.id,
47
+ }}
48
+ onClick={props.onNavigate}
49
+ aria-current={isActive() ? "page" : undefined}
50
+ style={{ "padding-left": `${0.5 + depth() * 0.75}rem` }}
51
+ class={`flex-1 min-w-0 flex items-center gap-2 px-2 py-1.5 rounded-md text-sm no-underline transition-colors ${
52
+ isActive()
53
+ ? "bg-primary/10 text-primary font-medium"
54
+ : "text-muted hover:text-foreground hover:bg-surface"
55
+ }`}
56
+ >
57
+ <span
58
+ class={`${props.doc.icon ?? typeIcon(props.doc.type ?? "")} shrink-0 opacity-70`}
59
+ aria-hidden="true"
60
+ />
61
+ <span class="truncate">{props.doc.label}</span>
62
+ <Show when={props.doc.badge}>
63
+ <span class="ml-auto shrink-0 text-[10px] px-1.5 py-0.5 rounded bg-primary/10 text-primary">
64
+ {props.doc.badge}
65
+ </span>
66
+ </Show>
67
+ </Link>
68
+ </div>
69
+ <Show when={hasChildren() && open()}>
70
+ <ul class="list-none m-0 p-0 ml-2.5 border-l border-border/60">
71
+ <For each={sortDocs(props.doc.children ?? [])}>
72
+ {(child) => (
73
+ <SidebarDocItem
74
+ doc={child}
75
+ collection={props.collection}
76
+ activeId={props.activeId}
77
+ depth={depth() + 1}
78
+ onNavigate={props.onNavigate}
79
+ />
80
+ )}
81
+ </For>
82
+ </ul>
83
+ </Show>
84
+ </li>
85
+ );
86
+ }
87
+
88
+ export function SidebarNav(props: { open: boolean; onNavigate: () => void }) {
89
+ const params = useParams({ strict: false });
90
+ const [search, setSearch] = createSignal("");
91
+ const [docs] = createDocsList(() => params().collection);
92
+ const collections = useCollections();
93
+ const colMeta = () =>
94
+ collections()?.find((c) => c.id === params().collection);
95
+
96
+ const [collapsed, setCollapsed] = createSignal<Record<string, boolean>>({});
97
+ const storageKey = () =>
98
+ `create-docs:sidebar:${params().collection ?? "default"}`;
99
+
100
+ createEffect(() => {
101
+ storageKey();
102
+ try {
103
+ const raw = localStorage.getItem(storageKey());
104
+ setCollapsed(raw ? (JSON.parse(raw) as Record<string, boolean>) : {});
105
+ } catch {
106
+ setCollapsed({});
107
+ }
108
+ });
109
+
110
+ const sectionMeta = (category: string) =>
111
+ colMeta()?.sections?.find((s) => s.id === category || s.label === category);
112
+
113
+ const isCollapsed = (category: string) => {
114
+ const stored = collapsed()[category];
115
+ if (stored !== undefined) return stored;
116
+ return sectionMeta(category)?.collapsed ?? false;
117
+ };
118
+
119
+ const toggleGroup = (category: string) => {
120
+ const next = {
121
+ ...collapsed(),
122
+ [category]: !isCollapsed(category),
123
+ };
124
+ setCollapsed(next);
125
+ try {
126
+ localStorage.setItem(storageKey(), JSON.stringify(next));
127
+ } catch {
128
+ // storage unavailable — state not persisted
129
+ }
130
+ };
131
+
132
+ const grouped = createMemo((): [string, DocEntry[]][] => {
133
+ const q = search().toLowerCase();
134
+ const list = (docs() ?? []).filter(
135
+ (d) =>
136
+ !q ||
137
+ d.label.toLowerCase().includes(q) ||
138
+ (d.category ?? "").toLowerCase().includes(q) ||
139
+ (d.description ?? "").toLowerCase().includes(q),
140
+ );
141
+ const groups = new Map<string, DocEntry[]>();
142
+ for (const d of list) {
143
+ const g = groups.get(d.category) ?? [];
144
+ g.push(d);
145
+ groups.set(d.category, g);
146
+ }
147
+ const entries = [...groups.entries()].map(
148
+ ([cat, items]) => [cat, sortDocs(items)] as [string, DocEntry[]],
149
+ );
150
+ const sections = colMeta()?.sections;
151
+ if (sections?.length) {
152
+ const order = new Map<string, number>();
153
+ sections.forEach((s, i) => {
154
+ order.set(s.id, i);
155
+ order.set(s.label, i);
156
+ });
157
+ return entries.sort(([a], [b]) => {
158
+ const ia = order.get(a) ?? Number.MAX_SAFE_INTEGER;
159
+ const ib = order.get(b) ?? Number.MAX_SAFE_INTEGER;
160
+ return ia - ib || a.localeCompare(b);
161
+ });
162
+ }
163
+ return entries.sort(([a], [b]) => a.localeCompare(b));
164
+ });
165
+
166
+ return (
167
+ <aside
168
+ class={`fixed top-[var(--docs-banner-height,0px)] bottom-0 right-0 z-30 w-72 h-[calc(100vh-var(--docs-banner-height,0px))] shrink-0 border-l border-border bg-background overflow-y-auto transition-transform ${props.open ? "translate-x-0" : "translate-x-full"} lg:left-0 lg:right-auto lg:border-l-0 lg:border-r lg:border-r-border lg:translate-x-0 lg:top-[calc(3.5rem+var(--docs-banner-height,0px))] lg:h-[calc(100vh-3.5rem-var(--docs-banner-height,0px))]`}
169
+ >
170
+ <div class="p-3 sticky top-0 bg-background z-10 border-b border-border">
171
+ <label class="flex items-center gap-2 px-3 h-9 rounded-md border border-border bg-surface text-muted text-sm">
172
+ <span class="i-mdi:magnify" aria-hidden="true" />
173
+ <input
174
+ type="search"
175
+ value={search()}
176
+ onInput={(e) => setSearch(e.currentTarget.value)}
177
+ placeholder="Filter docs..."
178
+ aria-label="Filter docs"
179
+ class="bg-transparent outline-none border-none w-full text-foreground placeholder:text-muted"
180
+ />
181
+ </label>
182
+ </div>
183
+ <nav class="p-3 pt-2" aria-label="Documentation">
184
+ <Show when={!docs.loading && grouped().length === 0}>
185
+ <div class="flex flex-col items-center gap-2 py-10 text-muted text-sm">
186
+ <span
187
+ class="i-mdi:file-document-outline text-3xl"
188
+ aria-hidden="true"
189
+ />
190
+ No docs found
191
+ </div>
192
+ </Show>
193
+ <For each={grouped()}>
194
+ {([category, items]) => {
195
+ const meta = () => sectionMeta(category);
196
+ const collapsedNow = () => isCollapsed(category);
197
+ return (
198
+ <div class="mb-4">
199
+ <button
200
+ type="button"
201
+ onClick={() => toggleGroup(category)}
202
+ aria-expanded={!collapsedNow()}
203
+ class="w-full flex items-center gap-2 px-2 pb-1 text-[11px] uppercase tracking-wider font-semibold text-muted hover:text-foreground transition-colors cursor-pointer border-none bg-transparent"
204
+ >
205
+ <span
206
+ class={meta()?.icon ?? categoryIcon(category)}
207
+ aria-hidden="true"
208
+ />
209
+ {meta()?.label ?? category}
210
+ <span class="ml-auto font-normal">{items.length}</span>
211
+ <span
212
+ class={`i-mdi:chevron-down text-xs transition-transform ${collapsedNow() ? "-rotate-90" : ""}`}
213
+ aria-hidden="true"
214
+ />
215
+ </button>
216
+ <Show when={!collapsedNow()}>
217
+ <ul class="list-none m-0 p-0">
218
+ <For each={items}>
219
+ {(d) => (
220
+ <SidebarDocItem
221
+ doc={d}
222
+ collection={params().collection ?? ""}
223
+ activeId={params().docId}
224
+ onNavigate={props.onNavigate}
225
+ />
226
+ )}
227
+ </For>
228
+ </ul>
229
+ </Show>
230
+ </div>
231
+ );
232
+ }}
233
+ </For>
234
+ </nav>
235
+ </aside>
236
+ );
237
+ }
@@ -0,0 +1,39 @@
1
+ import { For } from "solid-js";
2
+
3
+ export function SkeletonText(props: { lines?: number; class?: string }) {
4
+ const lines = () => props.lines ?? 1;
5
+ return (
6
+ <div class={`flex flex-col gap-2 ${props.class ?? ""}`}>
7
+ <For each={Array.from({ length: lines() })}>
8
+ {(_, i) => (
9
+ <div
10
+ class="h-4 rounded bg-skeleton animate-pulse"
11
+ style={{
12
+ width: i() === lines() - 1 ? "80%" : "100%",
13
+ }}
14
+ />
15
+ )}
16
+ </For>
17
+ </div>
18
+ );
19
+ }
20
+
21
+ export function SkeletonBlock(props: { class?: string }) {
22
+ return (
23
+ <div
24
+ class={`rounded bg-skeleton animate-pulse ${props.class ?? ""}`}
25
+ aria-busy="true"
26
+ />
27
+ );
28
+ }
29
+
30
+ export function SkeletonPage() {
31
+ return (
32
+ <div class="space-y-6 p-1" aria-busy="true">
33
+ <SkeletonBlock class="h-8 w-2/3" />
34
+ <SkeletonText lines={4} />
35
+ <SkeletonBlock class="h-40 w-full" />
36
+ <SkeletonText lines={6} />
37
+ </div>
38
+ );
39
+ }
@@ -0,0 +1,26 @@
1
+ import { useTheme } from "../theme";
2
+
3
+ export function ThemeToggle() {
4
+ const { theme, toggle } = useTheme();
5
+
6
+ return (
7
+ <button
8
+ type="button"
9
+ onClick={toggle}
10
+ aria-label={
11
+ theme() === "dark" ? "Switch to light mode" : "Switch to dark mode"
12
+ }
13
+ title={
14
+ theme() === "dark" ? "Switch to light mode" : "Switch to dark mode"
15
+ }
16
+ class="w-9 h-9 inline-flex items-center justify-center rounded-md border border-border text-muted hover:text-foreground hover:bg-surface transition-colors cursor-pointer"
17
+ >
18
+ <span
19
+ class={
20
+ theme() === "dark" ? "i-mdi:weather-sunny" : "i-mdi:weather-night"
21
+ }
22
+ aria-hidden="true"
23
+ />
24
+ </button>
25
+ );
26
+ }
@@ -0,0 +1,270 @@
1
+ import { Link, useParams } from "@tanstack/solid-router";
2
+ import { createSignal, For, onMount, Show } from "solid-js";
3
+ import type { SiteLink } from "../config";
4
+ import { useDocs } from "../context";
5
+ import { setTheme, useTheme } from "../theme";
6
+ import { AccentPicker } from "./AccentPicker";
7
+ import { CollectionDropdown } from "./CollectionDropdown";
8
+ import { CustomizeDrawer } from "./CustomizeDrawer";
9
+ import { DocsDropdown } from "./DocsDropdown";
10
+ import { LocaleDropdown } from "./LocaleDropdown";
11
+ import { setSearchOpen } from "./SearchPalette";
12
+ import { ThemeToggle } from "./ThemeToggle";
13
+ import { VersionDropdown } from "./VersionDropdown";
14
+
15
+ const socialIcons: Record<
16
+ keyof NonNullable<import("../config").SiteConfig["social"]>,
17
+ string
18
+ > = {
19
+ npm: "i-mdi:npm",
20
+ twitter: "i-mdi:twitter",
21
+ discord: "i-mdi:discord",
22
+ youtube: "i-mdi:youtube",
23
+ mastodon: "i-mdi:mastodon",
24
+ };
25
+
26
+ function LogoContextMenu(props: {
27
+ open: boolean;
28
+ x: number;
29
+ y: number;
30
+ onClose: () => void;
31
+ }) {
32
+ const { theme } = useTheme();
33
+
34
+ const items = () => [
35
+ {
36
+ label: "Copy page URL",
37
+ icon: "i-mdi:link",
38
+ action: () => navigator.clipboard.writeText(location.href),
39
+ },
40
+ {
41
+ label: "Open home",
42
+ icon: "i-mdi:home",
43
+ action: () => (location.href = "/"),
44
+ },
45
+ {
46
+ label: `Theme: ${theme()}`,
47
+ icon: "i-mdi:theme-light-dark",
48
+ action: () => setTheme(theme() === "dark" ? "light" : "dark"),
49
+ },
50
+ {
51
+ label: "Back to top",
52
+ icon: "i-mdi:arrow-up",
53
+ action: () => window.scrollTo({ top: 0, behavior: "smooth" }),
54
+ },
55
+ { label: "Reload", icon: "i-mdi:refresh", action: () => location.reload() },
56
+ ];
57
+
58
+ return (
59
+ <Show when={props.open}>
60
+ <div
61
+ class="fixed z-50 min-w-44 rounded-md border border-border bg-surface shadow-lg py-1"
62
+ style={{ left: `${props.x}px`, top: `${props.y}px` }}
63
+ role="menu"
64
+ >
65
+ <For each={items()}>
66
+ {(item) => (
67
+ <button
68
+ type="button"
69
+ role="menuitem"
70
+ class="w-full flex items-center gap-2 px-3 py-2 text-sm text-left text-foreground hover:bg-background transition-colors"
71
+ onClick={() => {
72
+ item.action();
73
+ props.onClose();
74
+ }}
75
+ >
76
+ <span class={item.icon} aria-hidden="true" />
77
+ {item.label}
78
+ </button>
79
+ )}
80
+ </For>
81
+ </div>
82
+ </Show>
83
+ );
84
+ }
85
+
86
+ export function TopNav(props: {
87
+ onMenuToggle: () => void;
88
+ onCreateClick?: () => void;
89
+ }) {
90
+ const params = useParams({ strict: false });
91
+ const config = useDocs();
92
+ const [menu, setMenu] = createSignal<{ open: boolean; x: number; y: number }>(
93
+ { open: false, x: 0, y: 0 },
94
+ );
95
+ const [customizeOpen, setCustomizeOpen] = createSignal(false);
96
+ const [customNav, setCustomNav] = createSignal<SiteLink[] | null>(null);
97
+
98
+ onMount(() => {
99
+ try {
100
+ const raw = localStorage.getItem("create-docs:nav");
101
+ if (raw) setCustomNav(JSON.parse(raw) as SiteLink[]);
102
+ } catch {
103
+ // ignore
104
+ }
105
+ });
106
+
107
+ const socials = () =>
108
+ Object.entries(config.site.social ?? {}).filter(([, v]) => v) as [
109
+ keyof typeof socialIcons,
110
+ string,
111
+ ][];
112
+ const topNav = () => config.topNav ?? [];
113
+ const extraNav = () => [
114
+ ...(config.github?.issues
115
+ ? [{ label: "Issues", to: "/issues", icon: "i-mdi:alert-circle-outline" }]
116
+ : []),
117
+ ...(config.github?.releases
118
+ ? [{ label: "Release", to: "/changelog", icon: "i-mdi:tag" }]
119
+ : []),
120
+ ...(config.github?.contributors
121
+ ? [{ label: "Community", to: "/community", icon: "i-mdi:account-group" }]
122
+ : []),
123
+ ...(config.plugins?.length
124
+ ? [{ label: "Plugins", to: "/plugins", icon: "i-mdi:puzzle" }]
125
+ : []),
126
+ ...(config.showcase?.length
127
+ ? [{ label: "Showcase", to: "/showcase", icon: "i-mdi:view-dashboard" }]
128
+ : []),
129
+ ];
130
+
131
+ const defaultAllNav = () => [...topNav(), ...extraNav()];
132
+ const allNav = () => customNav() ?? defaultAllNav();
133
+
134
+ const handleCustomizeSave = (items: SiteLink[] | null) => {
135
+ setCustomNav(items);
136
+ setCustomizeOpen(false);
137
+ };
138
+
139
+ const logoIcon = () => config.site.logo ?? "i-mdi:book-open-page-variant";
140
+
141
+ return (
142
+ <>
143
+ <header class="sticky top-[var(--docs-banner-height,0px)] z-40 h-14 hidden lg:flex items-center gap-3 px-4 border-b border-border bg-background/95 backdrop-blur">
144
+ <button
145
+ type="button"
146
+ onClick={props.onMenuToggle}
147
+ aria-label="Toggle sidebar"
148
+ class="lg:hidden w-9 h-9 inline-flex items-center justify-center rounded-md text-muted hover:text-foreground hover:bg-surface transition-colors cursor-pointer"
149
+ >
150
+ <span class="i-mdi:menu" aria-hidden="true" />
151
+ </button>
152
+ <Link
153
+ to="/"
154
+ class="inline-flex items-center gap-2 no-underline text-foreground font-semibold text-sm shrink-0"
155
+ onContextMenu={(e) => {
156
+ e.preventDefault();
157
+ setMenu({ open: true, x: e.clientX, y: e.clientY });
158
+ }}
159
+ >
160
+ <span
161
+ class={`${logoIcon()} text-primary text-lg`}
162
+ aria-hidden="true"
163
+ />
164
+ {config.site.title}
165
+ </Link>
166
+ <div
167
+ class="w-px h-6 bg-border hidden sm:block shrink-0"
168
+ aria-hidden="true"
169
+ />
170
+ <CollectionDropdown current={params().collection} />
171
+
172
+ <nav
173
+ class="hidden md:flex flex-1 items-center justify-center gap-1"
174
+ aria-label="Site"
175
+ >
176
+ <DocsDropdown />
177
+ <For each={allNav()}>
178
+ {(link) => (
179
+ <Link
180
+ to={link.to}
181
+ class="px-3 h-9 inline-flex items-center gap-1.5 rounded-md text-sm text-muted no-underline hover:text-foreground hover:bg-surface transition-colors"
182
+ >
183
+ <Show when={link.icon}>
184
+ <span class={link.icon} aria-hidden="true" />
185
+ </Show>
186
+ {link.label}
187
+ </Link>
188
+ )}
189
+ </For>
190
+ <Link
191
+ to="/create"
192
+ class="ml-2 px-3 h-9 inline-flex items-center gap-1.5 rounded-md text-sm font-medium bg-primary text-primary-foreground no-underline hover:bg-primary-hover transition-colors"
193
+ >
194
+ <span class="i-mdi:plus" aria-hidden="true" />
195
+ Create docs
196
+ </Link>
197
+ </nav>
198
+
199
+ <div class="flex items-center gap-1 shrink-0">
200
+ <Show when={config.features?.search !== false}>
201
+ <button
202
+ type="button"
203
+ onClick={() => setSearchOpen(true)}
204
+ aria-label="Search documentation"
205
+ class="inline-flex items-center gap-2 px-3 h-9 rounded-md border border-border bg-surface text-sm text-muted hover:text-foreground hover:border-focus transition-colors cursor-pointer"
206
+ >
207
+ <span class="i-mdi:magnify" aria-hidden="true" />
208
+ <span class="hidden sm:inline">Search…</span>
209
+ <kbd class="hidden sm:inline text-[10px] px-1.5 py-0.5 rounded border border-border">
210
+ Ctrl K
211
+ </kbd>
212
+ </button>
213
+ </Show>
214
+ <For each={socials()}>
215
+ {([key, href]) => (
216
+ <a
217
+ href={href}
218
+ target="_blank"
219
+ rel="noreferrer"
220
+ aria-label={key}
221
+ title={key}
222
+ class="w-9 h-9 hidden sm:inline-flex items-center justify-center rounded-md border border-border text-muted hover:text-foreground hover:bg-surface transition-colors"
223
+ >
224
+ <span class={socialIcons[key]} aria-hidden="true" />
225
+ </a>
226
+ )}
227
+ </For>
228
+ <Show when={config.site.repoUrl}>
229
+ <a
230
+ href={config.site.repoUrl}
231
+ target="_blank"
232
+ rel="noreferrer"
233
+ aria-label="GitHub repository"
234
+ title="GitHub repository"
235
+ class="w-9 h-9 inline-flex items-center justify-center rounded-md border border-border text-muted hover:text-foreground hover:bg-surface transition-colors"
236
+ >
237
+ <span class="i-mdi:github" aria-hidden="true" />
238
+ </a>
239
+ </Show>
240
+ <button
241
+ type="button"
242
+ onClick={() => setCustomizeOpen(true)}
243
+ aria-label="Customize navigation"
244
+ title="Customize navigation"
245
+ class="w-9 h-9 inline-flex items-center justify-center rounded-md border border-border text-muted hover:text-foreground hover:bg-surface transition-colors cursor-pointer"
246
+ >
247
+ <span class="i-mdi:tune" aria-hidden="true" />
248
+ </button>
249
+ <LocaleDropdown />
250
+ <VersionDropdown />
251
+ <AccentPicker />
252
+ <ThemeToggle />
253
+ </div>
254
+ <LogoContextMenu
255
+ open={menu().open}
256
+ x={menu().x}
257
+ y={menu().y}
258
+ onClose={() => setMenu({ open: false, x: 0, y: 0 })}
259
+ />
260
+ </header>
261
+ <CustomizeDrawer
262
+ open={customizeOpen()}
263
+ available={defaultAllNav()}
264
+ current={allNav()}
265
+ onSave={handleCustomizeSave}
266
+ onClose={() => setCustomizeOpen(false)}
267
+ />
268
+ </>
269
+ );
270
+ }