zudoku 0.53.3 → 0.53.5

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 (242) hide show
  1. package/dist/config/validators/InputNavigationSchema.d.ts +0 -5
  2. package/dist/config/validators/InputNavigationSchema.js +0 -3
  3. package/dist/config/validators/InputNavigationSchema.js.map +1 -1
  4. package/dist/config/validators/InputNavigationSchema.test-d.js +0 -1
  5. package/dist/config/validators/InputNavigationSchema.test-d.js.map +1 -1
  6. package/dist/config/validators/NavigationSchema.js +3 -2
  7. package/dist/config/validators/NavigationSchema.js.map +1 -1
  8. package/dist/config/validators/validate.d.ts +3 -0
  9. package/dist/config/validators/validate.js +1 -0
  10. package/dist/config/validators/validate.js.map +1 -1
  11. package/dist/lib/components/Header.js +1 -1
  12. package/dist/lib/components/Header.js.map +1 -1
  13. package/dist/lib/components/Markdown.js +2 -2
  14. package/dist/lib/components/Markdown.js.map +1 -1
  15. package/dist/lib/components/NotFoundPage.js +1 -1
  16. package/dist/lib/components/NotFoundPage.js.map +1 -1
  17. package/dist/lib/components/Typography.d.ts +1 -1
  18. package/dist/lib/components/Typography.js +1 -1
  19. package/dist/lib/components/Typography.js.map +1 -1
  20. package/dist/lib/core/ZudokuContext.d.ts +1 -0
  21. package/dist/lib/core/ZudokuContext.js.map +1 -1
  22. package/dist/lib/errors/ErrorAlert.js +1 -1
  23. package/dist/lib/errors/ErrorAlert.js.map +1 -1
  24. package/dist/lib/plugins/openapi/OperationList.js +2 -1
  25. package/dist/lib/plugins/openapi/OperationList.js.map +1 -1
  26. package/dist/lib/plugins/openapi/Sidecar.js +1 -1
  27. package/dist/lib/plugins/openapi/Sidecar.js.map +1 -1
  28. package/dist/lib/plugins/openapi/SidecarExamples.js +1 -1
  29. package/dist/lib/plugins/openapi/SidecarExamples.js.map +1 -1
  30. package/dist/lib/plugins/openapi/playground/PathParams.js +1 -1
  31. package/dist/lib/plugins/openapi/playground/PathParams.js.map +1 -1
  32. package/dist/lib/plugins/openapi/playground/Playground.js +4 -2
  33. package/dist/lib/plugins/openapi/playground/Playground.js.map +1 -1
  34. package/dist/lib/ui/CodeBlock.js +1 -1
  35. package/dist/lib/ui/CodeBlock.js.map +1 -1
  36. package/dist/lib/ui/EmbeddedCodeBlock.js +1 -1
  37. package/dist/lib/ui/EmbeddedCodeBlock.js.map +1 -1
  38. package/dist/vite/dev-server.js +9 -1
  39. package/dist/vite/dev-server.js.map +1 -1
  40. package/dist/vite/plugin-docs.js +11 -9
  41. package/dist/vite/plugin-docs.js.map +1 -1
  42. package/dist/vite/plugin-theme.js +88 -49
  43. package/dist/vite/plugin-theme.js.map +1 -1
  44. package/dist/vite/plugin-theme.test.js +25 -4
  45. package/dist/vite/plugin-theme.test.js.map +1 -1
  46. package/lib/{Alert-FYKbqjIt.js → Alert-CWApD0CL.js} +4 -4
  47. package/lib/Alert-CWApD0CL.js.map +1 -0
  48. package/lib/{Button-BE9IVkWV.js → Button-B3o-2Xdf.js} +2 -2
  49. package/lib/{Button-BE9IVkWV.js.map → Button-B3o-2Xdf.js.map} +1 -1
  50. package/lib/CallbackHandler-Dr5Lva9x.js +38 -0
  51. package/lib/CallbackHandler-Dr5Lva9x.js.map +1 -0
  52. package/lib/{Card-DPhGbYUM.js → Card-CMDQUPM4.js} +2 -2
  53. package/lib/{Card-DPhGbYUM.js.map → Card-CMDQUPM4.js.map} +1 -1
  54. package/lib/ClientOnly-E7hGysn1.js.map +1 -1
  55. package/lib/{CodeBlock-DAKxs_Tu.js → CodeBlock-B-G0eKtw.js} +3 -3
  56. package/lib/{CodeBlock-DAKxs_Tu.js.map → CodeBlock-B-G0eKtw.js.map} +1 -1
  57. package/lib/{Command-xsbs2uhf.js → Command-C9AC5cf-.js} +3 -3
  58. package/lib/{Command-xsbs2uhf.js.map → Command-C9AC5cf-.js.map} +1 -1
  59. package/lib/{Dialog-CiIdyz6a.js → Dialog-DMWw1doX.js} +2 -2
  60. package/lib/{Dialog-CiIdyz6a.js.map → Dialog-DMWw1doX.js.map} +1 -1
  61. package/lib/{Drawer-BzkOKwgC.js → Drawer-DJ05s2pH.js} +86 -86
  62. package/lib/{Drawer-BzkOKwgC.js.map → Drawer-DJ05s2pH.js.map} +1 -1
  63. package/lib/{MdxPage-DyRuoE_F.js → MdxPage-DVI4iYgW.js} +9 -9
  64. package/lib/{MdxPage-DyRuoE_F.js.map → MdxPage-DVI4iYgW.js.map} +1 -1
  65. package/lib/{OasProvider-CUA-DFGE.js → OasProvider-CbwsKPNc.js} +2 -2
  66. package/lib/{OasProvider-CUA-DFGE.js.map → OasProvider-CbwsKPNc.js.map} +1 -1
  67. package/lib/{OperationList-CRMvWoTv.js → OperationList-Bn9ggxw8.js} +176 -176
  68. package/lib/OperationList-Bn9ggxw8.js.map +1 -0
  69. package/lib/{Pagination-HZKe5ncg.js → Pagination-bavPec-z.js} +3 -3
  70. package/lib/{Pagination-HZKe5ncg.js.map → Pagination-bavPec-z.js.map} +1 -1
  71. package/lib/{RouteGuard-CbKd7_9h.js → RouteGuard-Vnlz_t51.js} +3 -3
  72. package/lib/{RouteGuard-CbKd7_9h.js.map → RouteGuard-Vnlz_t51.js.map} +1 -1
  73. package/lib/{SchemaList-B792ORza.js → SchemaList-DETyCVqu.js} +9 -9
  74. package/lib/{SchemaList-B792ORza.js.map → SchemaList-DETyCVqu.js.map} +1 -1
  75. package/lib/{SchemaView-Bo53TeMb.js → SchemaView-Dvxo2RNe.js} +6 -6
  76. package/lib/{SchemaView-Bo53TeMb.js.map → SchemaView-Dvxo2RNe.js.map} +1 -1
  77. package/lib/{SignUp-DfVvOCYB.js → SignUp-ClYhZq9H.js} +4 -4
  78. package/lib/{SignUp-DfVvOCYB.js.map → SignUp-ClYhZq9H.js.map} +1 -1
  79. package/lib/{Slot-BpO_AGKJ.js → Slot-B31yZlfB.js} +316 -336
  80. package/lib/{Slot-BpO_AGKJ.js.map → Slot-B31yZlfB.js.map} +1 -1
  81. package/lib/Spinner-mNLZ6awP.js.map +1 -1
  82. package/lib/{SyntaxHighlight-CZgjJ7-f.js → SyntaxHighlight-bm761HDo.js} +4 -4
  83. package/lib/{SyntaxHighlight-CZgjJ7-f.js.map → SyntaxHighlight-bm761HDo.js.map} +1 -1
  84. package/lib/{Toc-DYMzDvOa.js → Toc-D4oBWE8D.js} +3 -3
  85. package/lib/{Toc-DYMzDvOa.js.map → Toc-D4oBWE8D.js.map} +1 -1
  86. package/lib/chunk-DQRVZFIR-DHK7_Ilc.js.map +1 -1
  87. package/lib/{circular-CLdQ0oUd.js → circular-CRbFI6Zl.js} +2 -2
  88. package/lib/{circular-CLdQ0oUd.js.map → circular-CRbFI6Zl.js.map} +1 -1
  89. package/lib/{cn-wvCW-ho6.js → cn-dYga0KKN.js} +2 -2
  90. package/lib/cn-dYga0KKN.js.map +1 -0
  91. package/lib/{createServer-Co4BBP-i.js → createServer-DNyGJJNX.js} +3398 -3552
  92. package/lib/createServer-DNyGJJNX.js.map +1 -0
  93. package/lib/errors-C1GlNcV3.js +44 -0
  94. package/lib/errors-C1GlNcV3.js.map +1 -0
  95. package/lib/{hook-Bd0yS8M0.js → hook-CZjW2buS.js} +420 -413
  96. package/lib/hook-CZjW2buS.js.map +1 -0
  97. package/lib/index-Bm35Tkgf.js +107 -0
  98. package/lib/index-Bm35Tkgf.js.map +1 -0
  99. package/lib/{index-DLzZDv8_.js → index-CZTEgYDd.js} +2 -2
  100. package/lib/{index-DLzZDv8_.js.map → index-CZTEgYDd.js.map} +1 -1
  101. package/lib/{index-DYP-V0jG.js → index-C_PXQ8Bx.js} +612 -610
  102. package/lib/{index-DYP-V0jG.js.map → index-C_PXQ8Bx.js.map} +1 -1
  103. package/lib/index-CrcNWbel.js.map +1 -1
  104. package/lib/{index-DLshv89l.js → index-D09PbNex.js} +1261 -1260
  105. package/lib/index-D09PbNex.js.map +1 -0
  106. package/lib/index-DI5SPFK9.js.map +1 -1
  107. package/lib/index-DmNq2fbN.js.map +1 -1
  108. package/lib/index.esm-Cp4wkyud.js.map +1 -1
  109. package/lib/invariant-DAFpPywt.js.map +1 -1
  110. package/lib/jsx-runtime-C5mzlN2N.js.map +1 -1
  111. package/lib/processors/removeExtensions.js.map +1 -1
  112. package/lib/processors/removeParameters.js.map +1 -1
  113. package/lib/processors/removePaths.js.map +1 -1
  114. package/lib/processors/traverse.js.map +1 -1
  115. package/lib/ui/Accordion.js +1 -1
  116. package/lib/ui/Accordion.js.map +1 -1
  117. package/lib/ui/ActionButton.js +2 -2
  118. package/lib/ui/ActionButton.js.map +1 -1
  119. package/lib/ui/Alert.js +1 -1
  120. package/lib/ui/Alert.js.map +1 -1
  121. package/lib/ui/AlertDialog.js +1 -1
  122. package/lib/ui/AlertDialog.js.map +1 -1
  123. package/lib/ui/Badge.js +1 -1
  124. package/lib/ui/Badge.js.map +1 -1
  125. package/lib/ui/Breadcrumb.js +1 -1
  126. package/lib/ui/Breadcrumb.js.map +1 -1
  127. package/lib/ui/Button.js +1 -1
  128. package/lib/ui/Button.js.map +1 -1
  129. package/lib/ui/Callout.js +1 -1
  130. package/lib/ui/Callout.js.map +1 -1
  131. package/lib/ui/Card.js +1 -1
  132. package/lib/ui/Card.js.map +1 -1
  133. package/lib/ui/Carousel.js +1 -1
  134. package/lib/ui/Carousel.js.map +1 -1
  135. package/lib/ui/Checkbox.js +1 -1
  136. package/lib/ui/Checkbox.js.map +1 -1
  137. package/lib/ui/CodeBlock.js +2 -2
  138. package/lib/ui/Command.js +2 -2
  139. package/lib/ui/Command.js.map +1 -1
  140. package/lib/ui/Dialog.js +1 -1
  141. package/lib/ui/Dialog.js.map +1 -1
  142. package/lib/ui/Drawer.js +2 -2
  143. package/lib/ui/DropdownMenu.js +1 -1
  144. package/lib/ui/DropdownMenu.js.map +1 -1
  145. package/lib/ui/EmbeddedCodeBlock.js +2 -2
  146. package/lib/ui/EmbeddedCodeBlock.js.map +1 -1
  147. package/lib/ui/Form.js +1 -1
  148. package/lib/ui/Form.js.map +1 -1
  149. package/lib/ui/HoverCard.js +1 -1
  150. package/lib/ui/HoverCard.js.map +1 -1
  151. package/lib/ui/Input.js +1 -1
  152. package/lib/ui/Input.js.map +1 -1
  153. package/lib/ui/Label.js +1 -1
  154. package/lib/ui/Label.js.map +1 -1
  155. package/lib/ui/Pagination.js +1 -1
  156. package/lib/ui/Pagination.js.map +1 -1
  157. package/lib/ui/Popover.js +1 -1
  158. package/lib/ui/Popover.js.map +1 -1
  159. package/lib/ui/Progress.js +1 -1
  160. package/lib/ui/Progress.js.map +1 -1
  161. package/lib/ui/RadioGroup.js +1 -1
  162. package/lib/ui/RadioGroup.js.map +1 -1
  163. package/lib/ui/ScrollArea.js +1 -1
  164. package/lib/ui/ScrollArea.js.map +1 -1
  165. package/lib/ui/Select.js +1 -1
  166. package/lib/ui/Select.js.map +1 -1
  167. package/lib/ui/Skeleton.js +1 -1
  168. package/lib/ui/Skeleton.js.map +1 -1
  169. package/lib/ui/Slider.js +1 -1
  170. package/lib/ui/Slider.js.map +1 -1
  171. package/lib/ui/Stepper.js.map +1 -1
  172. package/lib/ui/Switch.js +1 -1
  173. package/lib/ui/Switch.js.map +1 -1
  174. package/lib/ui/SyntaxHighlight.js +3 -3
  175. package/lib/ui/Tabs.js +1 -1
  176. package/lib/ui/Tabs.js.map +1 -1
  177. package/lib/ui/Textarea.js +1 -1
  178. package/lib/ui/Textarea.js.map +1 -1
  179. package/lib/ui/Toggle.js +1 -1
  180. package/lib/ui/Toggle.js.map +1 -1
  181. package/lib/ui/ToggleGroup.js +1 -1
  182. package/lib/ui/ToggleGroup.js.map +1 -1
  183. package/lib/ui/Tooltip.js +1 -1
  184. package/lib/ui/Tooltip.js.map +1 -1
  185. package/lib/ui/util.js +1 -1
  186. package/lib/useExposedProps-BIYjecPD.js.map +1 -1
  187. package/lib/zudoku.auth-auth0.js +1 -1
  188. package/lib/zudoku.auth-auth0.js.map +1 -1
  189. package/lib/zudoku.auth-azureb2c.js +40 -9882
  190. package/lib/zudoku.auth-azureb2c.js.map +1 -1
  191. package/lib/zudoku.auth-clerk.js +3 -3
  192. package/lib/zudoku.auth-clerk.js.map +1 -1
  193. package/lib/zudoku.auth-openid.js +20 -19
  194. package/lib/zudoku.auth-openid.js.map +1 -1
  195. package/lib/zudoku.auth-supabase.js +97 -0
  196. package/lib/zudoku.auth-supabase.js.map +1 -0
  197. package/lib/zudoku.components.js +5 -5
  198. package/lib/zudoku.hooks.js +3 -3
  199. package/lib/zudoku.hooks.js.map +1 -1
  200. package/lib/zudoku.icons.js.map +1 -1
  201. package/lib/zudoku.plugin-api-catalog.js +5 -5
  202. package/lib/zudoku.plugin-api-catalog.js.map +1 -1
  203. package/lib/zudoku.plugin-api-keys.js +7 -7
  204. package/lib/zudoku.plugin-api-keys.js.map +1 -1
  205. package/lib/zudoku.plugin-custom-pages.js +1 -1
  206. package/lib/zudoku.plugin-custom-pages.js.map +1 -1
  207. package/lib/zudoku.plugin-markdown.js +1 -1
  208. package/lib/zudoku.plugin-markdown.js.map +1 -1
  209. package/lib/zudoku.plugin-openapi.js +2 -2
  210. package/lib/zudoku.plugin-redirect.js.map +1 -1
  211. package/lib/zudoku.plugin-search-inkeep.js.map +1 -1
  212. package/lib/zudoku.plugin-search-pagefind.js +6 -6
  213. package/lib/zudoku.plugin-search-pagefind.js.map +1 -1
  214. package/lib/zudoku.plugins.js.map +1 -1
  215. package/package.json +20 -20
  216. package/src/app/main.css +26 -5
  217. package/src/lib/components/Header.tsx +1 -1
  218. package/src/lib/components/Markdown.tsx +3 -3
  219. package/src/lib/components/NotFoundPage.tsx +3 -2
  220. package/src/lib/components/Typography.tsx +1 -1
  221. package/src/lib/core/ZudokuContext.ts +1 -0
  222. package/src/lib/errors/ErrorAlert.tsx +5 -7
  223. package/src/lib/plugins/openapi/OperationList.tsx +3 -1
  224. package/src/lib/plugins/openapi/Sidecar.tsx +1 -1
  225. package/src/lib/plugins/openapi/SidecarExamples.tsx +1 -1
  226. package/src/lib/plugins/openapi/playground/PathParams.tsx +1 -1
  227. package/src/lib/plugins/openapi/playground/Playground.tsx +8 -2
  228. package/src/lib/ui/CodeBlock.tsx +1 -1
  229. package/src/lib/ui/EmbeddedCodeBlock.tsx +1 -1
  230. package/dist/flat-config.d.ts +0 -325
  231. package/lib/Alert-FYKbqjIt.js.map +0 -1
  232. package/lib/OperationList-CRMvWoTv.js.map +0 -1
  233. package/lib/clerk-BDZ31hjU.js +0 -25190
  234. package/lib/clerk-BDZ31hjU.js.map +0 -1
  235. package/lib/cn-wvCW-ho6.js.map +0 -1
  236. package/lib/createServer-Co4BBP-i.js.map +0 -1
  237. package/lib/errors-DE1gK7ms.js +0 -78
  238. package/lib/errors-DE1gK7ms.js.map +0 -1
  239. package/lib/hook-Bd0yS8M0.js.map +0 -1
  240. package/lib/index-ClhS5TxS.js +0 -107
  241. package/lib/index-ClhS5TxS.js.map +0 -1
  242. package/lib/index-DLshv89l.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"zudoku.plugin-search-pagefind.js","sources":["../src/lib/ui/Callout.tsx","../src/lib/plugins/search-pagefind/get-results.tsx","../src/lib/plugins/search-pagefind/ResultList.tsx","../src/lib/plugins/search-pagefind/PagefindSearch.tsx","../src/lib/plugins/search-pagefind/index.tsx"],"sourcesContent":["import {\n AlertTriangleIcon,\n InfoIcon,\n LightbulbIcon,\n type LucideIcon,\n ShieldAlertIcon,\n} from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../util/cn.js\";\n\nconst stylesMap = {\n note: {\n border: \"border-gray-300 dark:border-zinc-800\",\n bg: \"bg-gray-100 dark:bg-zinc-800/50\",\n iconColor: \"text-gray-600 dark:text-zinc-300\",\n titleColor: \"text-gray-600 dark:text-zinc-300\",\n textColor: \"text-gray-600 dark:text-zinc-300\",\n Icon: InfoIcon as LucideIcon,\n },\n tip: {\n border: \"border-green-500 dark:border-green-800\",\n bg: \"bg-green-200/25 dark:bg-green-950/70\",\n iconColor: \"text-green-600 dark:text-green-200\",\n titleColor: \"text-green-700 dark:text-green-200\",\n textColor: \"text-green-600 dark:text-green-50\",\n Icon: LightbulbIcon as LucideIcon,\n },\n info: {\n border: \"border-blue-400 dark:border-blue-900/60\",\n bg: \"bg-blue-50 dark:bg-blue-950/40\",\n iconColor: \"text-blue-400 dark:text-blue-200\",\n titleColor: \"text-blue-700 dark:text-blue-200\",\n textColor: \"text-blue-600 dark:text-blue-100\",\n Icon: InfoIcon as LucideIcon,\n },\n caution: {\n border: \"border-yellow-400 dark:border-yellow-400/25\",\n bg: \"bg-yellow-100/60 dark:bg-yellow-400/10\",\n iconColor: \"text-yellow-500 dark:text-yellow-300\",\n titleColor: \"text-yellow-600 dark:text-yellow-300\",\n textColor: \"text-yellow-700 dark:text-yellow-200\",\n Icon: AlertTriangleIcon as LucideIcon,\n },\n danger: {\n border: \"border-rose-400 dark:border-rose-800\",\n bg: \"bg-rose-50 dark:bg-rose-950/40\",\n iconColor: \"text-rose-400 dark:text-rose-300\",\n titleColor: \"text-rose-800 dark:text-rose-300\",\n textColor: \"text-rose-700 dark:text-rose-100\",\n Icon: ShieldAlertIcon as LucideIcon,\n },\n} as const;\n\ntype CalloutProps = {\n type: keyof typeof stylesMap;\n title?: string;\n children: ReactNode;\n className?: string;\n icon?: boolean;\n};\n\nexport const Callout = ({\n type,\n children,\n title,\n className,\n icon = true,\n}: CalloutProps) => {\n const { border, bg, iconColor, titleColor, textColor, Icon } =\n stylesMap[type];\n\n return (\n <div\n className={cn(\n \"not-prose rounded-md border p-4 text-md my-2\",\n icon &&\n \"grid grid-cols-[min-content_1fr] items-baseline grid-rows-[fit-content_1fr] gap-x-4 gap-y-2\",\n !icon && title && \"flex flex-col gap-2\",\n \"[&_a]:underline [&_a]:decoration-current [&_a]:decoration-from-font [&_a]:underline-offset-4 hover:[&_a]:decoration-1\",\n \"[&_.code-block-wrapper]:border\",\n \"[&_ul]:list-disc [&_ol]:list-decimal [&_ul]:ps-4 [&_ul>li]:ps-1 [&_ul>li]:my-1\",\n icon && title && \"items-center\",\n border,\n bg,\n className,\n )}\n >\n {icon && (\n <Icon\n className={cn(!title ? \"translate-y-1\" : \"align-middle\", iconColor)}\n size={20}\n aria-hidden=\"true\"\n />\n )}\n {title && <h3 className={cn(\"font-medium\", titleColor)}>{title}</h3>}\n <div\n className={cn(\n icon && \"col-start-2\",\n !title && icon && \"row-start-1\",\n textColor,\n \"overflow-x-auto\",\n )}\n >\n {children}\n </div>\n </div>\n );\n};\n","import type { AuthState } from \"../../authentication/state.js\";\nimport type { ZudokuContext } from \"../../core/ZudokuContext.js\";\nimport type { PagefindOptions } from \"./index.js\";\nimport type { PagefindSearchFragment, PagefindSearchResults } from \"./types.js\";\n\nexport const getResults = async ({\n search,\n options,\n auth,\n context,\n}: {\n search: PagefindSearchResults;\n options: PagefindOptions;\n auth: AuthState;\n context: ZudokuContext;\n}) => {\n const maxResults = options.maxResults ?? 10;\n const transformFn = options.transformResults ?? (() => true);\n\n const transformedResults: PagefindSearchFragment[] = [];\n\n const generator = searchResultGenerator({\n search,\n transformFn,\n auth,\n context,\n });\n\n for await (const result of generator) {\n transformedResults.push(result);\n if (transformedResults.length >= maxResults) break;\n }\n\n return transformedResults;\n};\n\nasync function* searchResultGenerator({\n search,\n transformFn,\n auth,\n context,\n}: {\n search: PagefindSearchResults;\n transformFn: NonNullable<PagefindOptions[\"transformResults\"]>;\n auth: AuthState<unknown>;\n context: ZudokuContext;\n}) {\n const batchSize = 5;\n let processedCount = 0;\n\n while (processedCount < search.results.length) {\n const batch = search.results.slice(\n processedCount,\n processedCount + batchSize,\n );\n processedCount += batch.length;\n\n const batchData = await Promise.all(batch.map((result) => result.data()));\n\n for (const result of batchData) {\n const transformed = transformFn({ result, auth, context });\n\n if (transformed === false) {\n // Skip this result\n continue;\n } else if (transformed === true || transformed == null) {\n // Keep the original result\n yield result;\n } else {\n // Return the transformed result\n yield transformed;\n }\n }\n }\n}\n","import { BracketsIcon, FileTextIcon } from \"lucide-react\";\nimport { useLayoutEffect, useRef } from \"react\";\nimport { Link, useNavigate } from \"react-router\";\nimport { CommandGroup, CommandItem, CommandList } from \"zudoku/ui/Command.js\";\nimport { joinUrl } from \"../../util/joinUrl.js\";\nimport {\n type PagefindSearchFragment,\n type PagefindSubResult,\n} from \"./types.js\";\n\nconst sortSubResults = (a: PagefindSubResult, b: PagefindSubResult) => {\n const aScore = a.weighted_locations.reduce(\n (sum, loc) => sum + loc.balanced_score,\n 0,\n );\n const bScore = b.weighted_locations.reduce(\n (sum, loc) => sum + loc.balanced_score,\n 0,\n );\n return bScore - aScore;\n};\n\nconst hoverClassname = `cursor-pointer border border-transparent data-[selected=true]:border-border`;\n\nexport const ResultList = ({\n basePath,\n searchResults,\n searchTerm,\n onClose,\n maxSubResults = 4,\n}: {\n basePath?: string;\n searchResults: PagefindSearchFragment[];\n searchTerm: string;\n onClose: () => void;\n maxSubResults?: number;\n}) => {\n const navigate = useNavigate();\n const commandListRef = useRef<HTMLDivElement | null>(null);\n\n useLayoutEffect(() => {\n requestIdleCallback(() => {\n commandListRef.current?.scrollTo({ top: 0 });\n });\n }, [searchTerm]);\n\n const stripBasePath = (url: string) => {\n if (basePath && url.startsWith(basePath)) {\n return joinUrl(url.slice(basePath.length));\n }\n return url;\n };\n\n return (\n <CommandList className=\"max-h-[450px]\" ref={commandListRef}>\n {searchTerm && searchResults.length > 0 && (\n <CommandGroup\n className=\"text-sm text-muted-foreground\"\n heading={`${searchResults.length} results for \"${searchTerm}\"`}\n />\n )}\n {searchTerm &&\n searchResults.map((result) => (\n <CommandGroup\n key={[result.meta.title ?? result.excerpt, result.url].join(\"-\")}\n >\n <CommandItem\n asChild\n value={`${result.meta.title}-${result.url}`}\n className={hoverClassname}\n onSelect={() => {\n void navigate(stripBasePath(result.url));\n onClose();\n }}\n >\n <Link to={stripBasePath(result.url)}>\n {result.meta.section === \"openapi\" ? (\n <BracketsIcon />\n ) : (\n <FileTextIcon />\n )}\n {result.meta.title}\n </Link>\n </CommandItem>\n {result.sub_results\n .sort(sortSubResults)\n .slice(0, maxSubResults)\n .map((subResult) => (\n <CommandItem\n asChild\n key={`sub-${result.meta.title}-${subResult.url}`}\n value={`sub-${result.meta.title}-${subResult.url}`}\n className={hoverClassname}\n onSelect={() => {\n void navigate(stripBasePath(subResult.url));\n onClose();\n }}\n >\n <Link to={stripBasePath(subResult.url)} onClick={onClose}>\n <div className=\"flex flex-col items-start gap-2 ms-2.5 ps-5 border-l border-muted-foreground/50\">\n <span className=\"font-bold\">{subResult.title}</span>\n <span\n className=\"text-[13px] [&_mark]:bg-primary [&_mark]:text-primary-foreground\"\n dangerouslySetInnerHTML={{ __html: subResult.excerpt }}\n />\n </div>\n </Link>\n </CommandItem>\n ))}\n </CommandGroup>\n ))}\n </CommandList>\n );\n};\n","import { VisuallyHidden } from \"@radix-ui/react-visually-hidden\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport { useRef, useState } from \"react\";\nimport { Button } from \"zudoku/ui/Button.js\";\nimport { Callout } from \"zudoku/ui/Callout.js\";\nimport {\n CommandDialog,\n CommandEmpty,\n CommandInput,\n} from \"zudoku/ui/Command.js\";\nimport { DialogTitle } from \"zudoku/ui/Dialog.js\";\nimport { useAuthState } from \"../../authentication/state.js\";\nimport { useZudoku } from \"../../components/context/ZudokuContext.js\";\nimport { SEARCH_PROTECTED_SECTION } from \"../../core/RouteGuard.js\";\nimport { joinUrl } from \"../../util/joinUrl.js\";\nimport { getResults } from \"./get-results.js\";\nimport type { PagefindOptions } from \"./index.js\";\nimport { ResultList } from \"./ResultList.js\";\nimport type { Pagefind } from \"./types.js\";\n\nconst DEFAULT_RANKING = {\n // Slightly lower than default because API docs tend to have repetitive terms (parameter names, HTTP methods, etc.)\n termFrequency: 0.8,\n // Lower than default because API documentation pages tend to be longer due to comprehensive endpoint documentation\n pageLength: 0.6,\n // Slightly higher than default because in technical documentation, exact matches should be prioritized\n termSimilarity: 1.2,\n // Slightly lower than default because API docs might have legitimate repetition of terms\n termSaturation: 1.2,\n};\n\nconst importPagefind = (basePath?: string): Promise<Pagefind> =>\n import.meta.env.DEV\n ? // @ts-expect-error TypeScript can't resolve the import\n import(/* @vite-ignore */ \"/pagefind/pagefind.js\")\n : import(/* @vite-ignore */ joinUrl(basePath, \"/pagefind/pagefind.js\"));\n\nconst usePagefind = (options: PagefindOptions) => {\n const {\n options: { basePath },\n } = useZudoku();\n const { data: pagefind, ...result } = useQuery<Pagefind>({\n queryKey: [\"pagefind\", options.ranking],\n retry: false,\n queryFn: async () => {\n const pagefind = await importPagefind(basePath);\n await pagefind.init();\n await pagefind.options({\n ranking: {\n termFrequency:\n options.ranking?.termFrequency ?? DEFAULT_RANKING.termFrequency,\n pageLength: options.ranking?.pageLength ?? DEFAULT_RANKING.pageLength,\n termSimilarity:\n options.ranking?.termSimilarity ?? DEFAULT_RANKING.termSimilarity,\n termSaturation:\n options.ranking?.termSaturation ?? DEFAULT_RANKING.termSaturation,\n },\n });\n\n return pagefind;\n },\n enabled: typeof window !== \"undefined\",\n });\n\n if (result.isError && result.error.message !== \"NOT_BUILT_YET\") {\n // eslint-disable-next-line no-console\n console.error(result.error);\n }\n\n return { ...result, pagefind };\n};\n\nexport const PagefindSearch = ({\n isOpen,\n onClose,\n options,\n}: {\n isOpen: boolean;\n onClose: () => void;\n options: PagefindOptions;\n}) => {\n const { pagefind, error, isError } = usePagefind(options);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const auth = useAuthState();\n const context = useZudoku();\n const inputRef = useRef<HTMLInputElement>(null);\n\n const { data: searchResults } = useQuery({\n queryKey: [\"pagefind-search\", searchTerm, auth.isAuthenticated],\n queryFn: async () => {\n const filters = auth.isAuthenticated\n ? undefined\n : { not: { section: SEARCH_PROTECTED_SECTION } };\n\n const search = await pagefind?.search(searchTerm, { filters });\n if (!search) return [];\n return getResults({ search, options, auth, context });\n },\n placeholderData: keepPreviousData,\n enabled: !!pagefind && !!searchTerm,\n });\n\n return (\n <CommandDialog\n command={{ shouldFilter: false }}\n content={{ className: \"max-w-[750px]\" }}\n open={isOpen}\n onOpenChange={onClose}\n >\n <VisuallyHidden>\n <DialogTitle>Search</DialogTitle>\n </VisuallyHidden>\n <CommandInput\n ref={inputRef}\n placeholder=\"Search...\"\n value={searchTerm}\n onValueChange={setSearchTerm}\n disabled={isError}\n />\n <CommandEmpty>\n {searchTerm ? (\n <div className=\"flex flex-col items-center\">\n No results found.\n <Button\n variant=\"link\"\n onClick={() => {\n setSearchTerm(\"\");\n inputRef.current?.focus();\n }}\n >\n Clear search\n </Button>\n </div>\n ) : (\n \"Start typing to search\"\n )}\n </CommandEmpty>\n {isError ? (\n <div className=\"p-4 text-sm\">\n {error.message === \"NOT_BUILT_YET\" ? (\n <Callout type=\"info\">\n Search is currently not available in development mode by default.\n <br />\n To still use search in development, run <code>\n zudoku build\n </code>{\" \"}\n and copy the <code>dist/pagefind</code> directory to your{\" \"}\n <code>public</code> directory.\n </Callout>\n ) : (\n \"An error occurred while loading search.\"\n )}\n </div>\n ) : (\n <ResultList\n basePath={context.options.basePath}\n searchResults={searchResults ?? []}\n searchTerm={searchTerm}\n onClose={onClose}\n maxSubResults={options.maxSubResults}\n />\n )}\n </CommandDialog>\n );\n};\n","import type { ZudokuConfig } from \"../../../config/validators/validate.js\";\nimport { ClientOnly } from \"../../components/ClientOnly.js\";\nimport type { ZudokuPlugin } from \"../../core/plugins.js\";\nimport { PagefindSearch } from \"./PagefindSearch.js\";\n\nexport type PagefindOptions = Extract<\n ZudokuConfig[\"search\"],\n { type: \"pagefind\" }\n>;\n\nexport const pagefindSearchPlugin = (\n options: PagefindOptions,\n): ZudokuPlugin => {\n return {\n renderSearch: ({ isOpen, onClose }) => (\n <ClientOnly>\n <PagefindSearch isOpen={isOpen} onClose={onClose} options={options} />\n </ClientOnly>\n ),\n };\n};\n"],"names":["stylesMap","InfoIcon","LightbulbIcon","AlertTriangleIcon","ShieldAlertIcon","Callout","type","children","title","className","icon","border","bg","iconColor","titleColor","textColor","Icon","jsxs","cn","jsx","getResults","search","options","auth","context","maxResults","transformFn","transformedResults","generator","searchResultGenerator","result","processedCount","batch","batchData","transformed","sortSubResults","a","b","aScore","sum","loc","hoverClassname","ResultList","basePath","searchResults","searchTerm","onClose","maxSubResults","navigate","useNavigate","commandListRef","useRef","useLayoutEffect","stripBasePath","url","joinUrl","CommandList","CommandGroup","CommandItem","Link","BracketsIcon","FileTextIcon","subResult","DEFAULT_RANKING","importPagefind","usePagefind","useZudoku","pagefind","useQuery","PagefindSearch","isOpen","error","isError","setSearchTerm","useState","useAuthState","inputRef","filters","SEARCH_PROTECTED_SECTION","keepPreviousData","CommandDialog","VisuallyHidden","DialogTitle","CommandInput","CommandEmpty","Button","pagefindSearchPlugin","ClientOnly"],"mappings":"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"}
1
+ {"version":3,"file":"zudoku.plugin-search-pagefind.js","sources":["../src/lib/ui/Callout.tsx","../src/lib/plugins/search-pagefind/get-results.tsx","../src/lib/plugins/search-pagefind/ResultList.tsx","../src/lib/plugins/search-pagefind/PagefindSearch.tsx","../src/lib/plugins/search-pagefind/index.tsx"],"sourcesContent":["import {\n AlertTriangleIcon,\n InfoIcon,\n LightbulbIcon,\n type LucideIcon,\n ShieldAlertIcon,\n} from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../util/cn.js\";\n\nconst stylesMap = {\n note: {\n border: \"border-gray-300 dark:border-zinc-800\",\n bg: \"bg-gray-100 dark:bg-zinc-800/50\",\n iconColor: \"text-gray-600 dark:text-zinc-300\",\n titleColor: \"text-gray-600 dark:text-zinc-300\",\n textColor: \"text-gray-600 dark:text-zinc-300\",\n Icon: InfoIcon as LucideIcon,\n },\n tip: {\n border: \"border-green-500 dark:border-green-800\",\n bg: \"bg-green-200/25 dark:bg-green-950/70\",\n iconColor: \"text-green-600 dark:text-green-200\",\n titleColor: \"text-green-700 dark:text-green-200\",\n textColor: \"text-green-600 dark:text-green-50\",\n Icon: LightbulbIcon as LucideIcon,\n },\n info: {\n border: \"border-blue-400 dark:border-blue-900/60\",\n bg: \"bg-blue-50 dark:bg-blue-950/40\",\n iconColor: \"text-blue-400 dark:text-blue-200\",\n titleColor: \"text-blue-700 dark:text-blue-200\",\n textColor: \"text-blue-600 dark:text-blue-100\",\n Icon: InfoIcon as LucideIcon,\n },\n caution: {\n border: \"border-yellow-400 dark:border-yellow-400/25\",\n bg: \"bg-yellow-100/60 dark:bg-yellow-400/10\",\n iconColor: \"text-yellow-500 dark:text-yellow-300\",\n titleColor: \"text-yellow-600 dark:text-yellow-300\",\n textColor: \"text-yellow-700 dark:text-yellow-200\",\n Icon: AlertTriangleIcon as LucideIcon,\n },\n danger: {\n border: \"border-rose-400 dark:border-rose-800\",\n bg: \"bg-rose-50 dark:bg-rose-950/40\",\n iconColor: \"text-rose-400 dark:text-rose-300\",\n titleColor: \"text-rose-800 dark:text-rose-300\",\n textColor: \"text-rose-700 dark:text-rose-100\",\n Icon: ShieldAlertIcon as LucideIcon,\n },\n} as const;\n\ntype CalloutProps = {\n type: keyof typeof stylesMap;\n title?: string;\n children: ReactNode;\n className?: string;\n icon?: boolean;\n};\n\nexport const Callout = ({\n type,\n children,\n title,\n className,\n icon = true,\n}: CalloutProps) => {\n const { border, bg, iconColor, titleColor, textColor, Icon } =\n stylesMap[type];\n\n return (\n <div\n className={cn(\n \"not-prose rounded-md border p-4 text-md my-2\",\n icon &&\n \"grid grid-cols-[min-content_1fr] items-baseline grid-rows-[fit-content_1fr] gap-x-4 gap-y-2\",\n !icon && title && \"flex flex-col gap-2\",\n \"[&_a]:underline [&_a]:decoration-current [&_a]:decoration-from-font [&_a]:underline-offset-4 hover:[&_a]:decoration-1\",\n \"[&_.code-block-wrapper]:border\",\n \"[&_ul]:list-disc [&_ol]:list-decimal [&_ul]:ps-4 [&_ul>li]:ps-1 [&_ul>li]:my-1\",\n icon && title && \"items-center\",\n border,\n bg,\n className,\n )}\n >\n {icon && (\n <Icon\n className={cn(!title ? \"translate-y-1\" : \"align-middle\", iconColor)}\n size={20}\n aria-hidden=\"true\"\n />\n )}\n {title && <h3 className={cn(\"font-medium\", titleColor)}>{title}</h3>}\n <div\n className={cn(\n icon && \"col-start-2\",\n !title && icon && \"row-start-1\",\n textColor,\n \"overflow-x-auto\",\n )}\n >\n {children}\n </div>\n </div>\n );\n};\n","import type { AuthState } from \"../../authentication/state.js\";\nimport type { ZudokuContext } from \"../../core/ZudokuContext.js\";\nimport type { PagefindOptions } from \"./index.js\";\nimport type { PagefindSearchFragment, PagefindSearchResults } from \"./types.js\";\n\nexport const getResults = async ({\n search,\n options,\n auth,\n context,\n}: {\n search: PagefindSearchResults;\n options: PagefindOptions;\n auth: AuthState;\n context: ZudokuContext;\n}) => {\n const maxResults = options.maxResults ?? 10;\n const transformFn = options.transformResults ?? (() => true);\n\n const transformedResults: PagefindSearchFragment[] = [];\n\n const generator = searchResultGenerator({\n search,\n transformFn,\n auth,\n context,\n });\n\n for await (const result of generator) {\n transformedResults.push(result);\n if (transformedResults.length >= maxResults) break;\n }\n\n return transformedResults;\n};\n\nasync function* searchResultGenerator({\n search,\n transformFn,\n auth,\n context,\n}: {\n search: PagefindSearchResults;\n transformFn: NonNullable<PagefindOptions[\"transformResults\"]>;\n auth: AuthState<unknown>;\n context: ZudokuContext;\n}) {\n const batchSize = 5;\n let processedCount = 0;\n\n while (processedCount < search.results.length) {\n const batch = search.results.slice(\n processedCount,\n processedCount + batchSize,\n );\n processedCount += batch.length;\n\n const batchData = await Promise.all(batch.map((result) => result.data()));\n\n for (const result of batchData) {\n const transformed = transformFn({ result, auth, context });\n\n if (transformed === false) {\n // Skip this result\n continue;\n } else if (transformed === true || transformed == null) {\n // Keep the original result\n yield result;\n } else {\n // Return the transformed result\n yield transformed;\n }\n }\n }\n}\n","import { BracketsIcon, FileTextIcon } from \"lucide-react\";\nimport { useLayoutEffect, useRef } from \"react\";\nimport { Link, useNavigate } from \"react-router\";\nimport { CommandGroup, CommandItem, CommandList } from \"zudoku/ui/Command.js\";\nimport { joinUrl } from \"../../util/joinUrl.js\";\nimport {\n type PagefindSearchFragment,\n type PagefindSubResult,\n} from \"./types.js\";\n\nconst sortSubResults = (a: PagefindSubResult, b: PagefindSubResult) => {\n const aScore = a.weighted_locations.reduce(\n (sum, loc) => sum + loc.balanced_score,\n 0,\n );\n const bScore = b.weighted_locations.reduce(\n (sum, loc) => sum + loc.balanced_score,\n 0,\n );\n return bScore - aScore;\n};\n\nconst hoverClassname = `cursor-pointer border border-transparent data-[selected=true]:border-border`;\n\nexport const ResultList = ({\n basePath,\n searchResults,\n searchTerm,\n onClose,\n maxSubResults = 4,\n}: {\n basePath?: string;\n searchResults: PagefindSearchFragment[];\n searchTerm: string;\n onClose: () => void;\n maxSubResults?: number;\n}) => {\n const navigate = useNavigate();\n const commandListRef = useRef<HTMLDivElement | null>(null);\n\n useLayoutEffect(() => {\n requestIdleCallback(() => {\n commandListRef.current?.scrollTo({ top: 0 });\n });\n }, [searchTerm]);\n\n const stripBasePath = (url: string) => {\n if (basePath && url.startsWith(basePath)) {\n return joinUrl(url.slice(basePath.length));\n }\n return url;\n };\n\n return (\n <CommandList className=\"max-h-[450px]\" ref={commandListRef}>\n {searchTerm && searchResults.length > 0 && (\n <CommandGroup\n className=\"text-sm text-muted-foreground\"\n heading={`${searchResults.length} results for \"${searchTerm}\"`}\n />\n )}\n {searchTerm &&\n searchResults.map((result) => (\n <CommandGroup\n key={[result.meta.title ?? result.excerpt, result.url].join(\"-\")}\n >\n <CommandItem\n asChild\n value={`${result.meta.title}-${result.url}`}\n className={hoverClassname}\n onSelect={() => {\n void navigate(stripBasePath(result.url));\n onClose();\n }}\n >\n <Link to={stripBasePath(result.url)}>\n {result.meta.section === \"openapi\" ? (\n <BracketsIcon />\n ) : (\n <FileTextIcon />\n )}\n {result.meta.title}\n </Link>\n </CommandItem>\n {result.sub_results\n .sort(sortSubResults)\n .slice(0, maxSubResults)\n .map((subResult) => (\n <CommandItem\n asChild\n key={`sub-${result.meta.title}-${subResult.url}`}\n value={`sub-${result.meta.title}-${subResult.url}`}\n className={hoverClassname}\n onSelect={() => {\n void navigate(stripBasePath(subResult.url));\n onClose();\n }}\n >\n <Link to={stripBasePath(subResult.url)} onClick={onClose}>\n <div className=\"flex flex-col items-start gap-2 ms-2.5 ps-5 border-l border-muted-foreground/50\">\n <span className=\"font-bold\">{subResult.title}</span>\n <span\n className=\"text-[13px] [&_mark]:bg-primary [&_mark]:text-primary-foreground\"\n dangerouslySetInnerHTML={{ __html: subResult.excerpt }}\n />\n </div>\n </Link>\n </CommandItem>\n ))}\n </CommandGroup>\n ))}\n </CommandList>\n );\n};\n","import { VisuallyHidden } from \"@radix-ui/react-visually-hidden\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport { useRef, useState } from \"react\";\nimport { Button } from \"zudoku/ui/Button.js\";\nimport { Callout } from \"zudoku/ui/Callout.js\";\nimport {\n CommandDialog,\n CommandEmpty,\n CommandInput,\n} from \"zudoku/ui/Command.js\";\nimport { DialogTitle } from \"zudoku/ui/Dialog.js\";\nimport { useAuthState } from \"../../authentication/state.js\";\nimport { useZudoku } from \"../../components/context/ZudokuContext.js\";\nimport { SEARCH_PROTECTED_SECTION } from \"../../core/RouteGuard.js\";\nimport { joinUrl } from \"../../util/joinUrl.js\";\nimport { getResults } from \"./get-results.js\";\nimport type { PagefindOptions } from \"./index.js\";\nimport { ResultList } from \"./ResultList.js\";\nimport type { Pagefind } from \"./types.js\";\n\nconst DEFAULT_RANKING = {\n // Slightly lower than default because API docs tend to have repetitive terms (parameter names, HTTP methods, etc.)\n termFrequency: 0.8,\n // Lower than default because API documentation pages tend to be longer due to comprehensive endpoint documentation\n pageLength: 0.6,\n // Slightly higher than default because in technical documentation, exact matches should be prioritized\n termSimilarity: 1.2,\n // Slightly lower than default because API docs might have legitimate repetition of terms\n termSaturation: 1.2,\n};\n\nconst importPagefind = (basePath?: string): Promise<Pagefind> =>\n import.meta.env.DEV\n ? // @ts-expect-error TypeScript can't resolve the import\n import(/* @vite-ignore */ \"/pagefind/pagefind.js\")\n : import(/* @vite-ignore */ joinUrl(basePath, \"/pagefind/pagefind.js\"));\n\nconst usePagefind = (options: PagefindOptions) => {\n const {\n options: { basePath },\n } = useZudoku();\n const { data: pagefind, ...result } = useQuery<Pagefind>({\n queryKey: [\"pagefind\", options.ranking],\n retry: false,\n queryFn: async () => {\n const pagefind = await importPagefind(basePath);\n await pagefind.init();\n await pagefind.options({\n ranking: {\n termFrequency:\n options.ranking?.termFrequency ?? DEFAULT_RANKING.termFrequency,\n pageLength: options.ranking?.pageLength ?? DEFAULT_RANKING.pageLength,\n termSimilarity:\n options.ranking?.termSimilarity ?? DEFAULT_RANKING.termSimilarity,\n termSaturation:\n options.ranking?.termSaturation ?? DEFAULT_RANKING.termSaturation,\n },\n });\n\n return pagefind;\n },\n enabled: typeof window !== \"undefined\",\n });\n\n if (result.isError && result.error.message !== \"NOT_BUILT_YET\") {\n // eslint-disable-next-line no-console\n console.error(result.error);\n }\n\n return { ...result, pagefind };\n};\n\nexport const PagefindSearch = ({\n isOpen,\n onClose,\n options,\n}: {\n isOpen: boolean;\n onClose: () => void;\n options: PagefindOptions;\n}) => {\n const { pagefind, error, isError } = usePagefind(options);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const auth = useAuthState();\n const context = useZudoku();\n const inputRef = useRef<HTMLInputElement>(null);\n\n const { data: searchResults } = useQuery({\n queryKey: [\"pagefind-search\", searchTerm, auth.isAuthenticated],\n queryFn: async () => {\n const filters = auth.isAuthenticated\n ? undefined\n : { not: { section: SEARCH_PROTECTED_SECTION } };\n\n const search = await pagefind?.search(searchTerm, { filters });\n if (!search) return [];\n return getResults({ search, options, auth, context });\n },\n placeholderData: keepPreviousData,\n enabled: !!pagefind && !!searchTerm,\n });\n\n return (\n <CommandDialog\n command={{ shouldFilter: false }}\n content={{ className: \"max-w-[750px]\" }}\n open={isOpen}\n onOpenChange={onClose}\n >\n <VisuallyHidden>\n <DialogTitle>Search</DialogTitle>\n </VisuallyHidden>\n <CommandInput\n ref={inputRef}\n placeholder=\"Search...\"\n value={searchTerm}\n onValueChange={setSearchTerm}\n disabled={isError}\n />\n <CommandEmpty>\n {searchTerm ? (\n <div className=\"flex flex-col items-center\">\n No results found.\n <Button\n variant=\"link\"\n onClick={() => {\n setSearchTerm(\"\");\n inputRef.current?.focus();\n }}\n >\n Clear search\n </Button>\n </div>\n ) : (\n \"Start typing to search\"\n )}\n </CommandEmpty>\n {isError ? (\n <div className=\"p-4 text-sm\">\n {error.message === \"NOT_BUILT_YET\" ? (\n <Callout type=\"info\">\n Search is currently not available in development mode by default.\n <br />\n To still use search in development, run <code>\n zudoku build\n </code>{\" \"}\n and copy the <code>dist/pagefind</code> directory to your{\" \"}\n <code>public</code> directory.\n </Callout>\n ) : (\n \"An error occurred while loading search.\"\n )}\n </div>\n ) : (\n <ResultList\n basePath={context.options.basePath}\n searchResults={searchResults ?? []}\n searchTerm={searchTerm}\n onClose={onClose}\n maxSubResults={options.maxSubResults}\n />\n )}\n </CommandDialog>\n );\n};\n","import type { ZudokuConfig } from \"../../../config/validators/validate.js\";\nimport { ClientOnly } from \"../../components/ClientOnly.js\";\nimport type { ZudokuPlugin } from \"../../core/plugins.js\";\nimport { PagefindSearch } from \"./PagefindSearch.js\";\n\nexport type PagefindOptions = Extract<\n ZudokuConfig[\"search\"],\n { type: \"pagefind\" }\n>;\n\nexport const pagefindSearchPlugin = (\n options: PagefindOptions,\n): ZudokuPlugin => {\n return {\n renderSearch: ({ isOpen, onClose }) => (\n <ClientOnly>\n <PagefindSearch isOpen={isOpen} onClose={onClose} options={options} />\n </ClientOnly>\n ),\n };\n};\n"],"names":["stylesMap","InfoIcon","LightbulbIcon","AlertTriangleIcon","ShieldAlertIcon","Callout","type","children","title","className","icon","border","bg","iconColor","titleColor","textColor","Icon","jsxs","cn","jsx","getResults","search","options","auth","context","maxResults","transformFn","transformedResults","generator","searchResultGenerator","result","processedCount","batch","batchData","transformed","sortSubResults","a","b","aScore","sum","loc","hoverClassname","ResultList","basePath","searchResults","searchTerm","onClose","maxSubResults","navigate","useNavigate","commandListRef","useRef","useLayoutEffect","stripBasePath","url","joinUrl","CommandList","CommandGroup","CommandItem","Link","BracketsIcon","FileTextIcon","subResult","DEFAULT_RANKING","importPagefind","usePagefind","useZudoku","pagefind","useQuery","PagefindSearch","isOpen","error","isError","setSearchTerm","useState","useAuthState","inputRef","filters","SEARCH_PROTECTED_SECTION","keepPreviousData","CommandDialog","VisuallyHidden","DialogTitle","CommandInput","CommandEmpty","Button","pagefindSearchPlugin","ClientOnly"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"zudoku.plugins.js","sources":["../src/lib/core/plugins.ts"],"sourcesContent":["import type { LucideIcon } from \"lucide-react\";\nimport type { ReactElement } from \"react\";\nimport type { Location, RouteObject } from \"react-router\";\nimport type { Navigation } from \"../../config/validators/NavigationSchema.js\";\nimport type { AuthenticationPlugin } from \"../authentication/authentication.js\";\nimport type { MdxComponentsType } from \"../util/MdxComponents.js\";\nimport type {\n ApiIdentity,\n ZudokuContext,\n ZudokuEvents,\n} from \"./ZudokuContext.js\";\n\nexport type ZudokuPlugin =\n | CommonPlugin\n | ProfileMenuPlugin\n | NavigationPlugin\n | ApiIdentityPlugin\n | SearchProviderPlugin\n | EventConsumerPlugin\n | AuthenticationPlugin;\n\nexport type { AuthenticationPlugin, RouteObject };\n\nexport interface NavigationPlugin {\n getRoutes: () => RouteObject[];\n getNavigation?: (path: string, context: ZudokuContext) => Promise<Navigation>;\n getProtectedRoutes?: () => string[];\n}\n\nexport const createApiIdentityPlugin = (\n plugin: ApiIdentityPlugin,\n): ApiIdentityPlugin => plugin;\n\nexport const createProfileMenuPlugin = (\n plugin: ProfileMenuPlugin,\n): ProfileMenuPlugin => plugin;\n\nexport interface ApiIdentityPlugin {\n getIdentities: (context: ZudokuContext) => Promise<ApiIdentity[]>;\n}\n\nexport interface SearchProviderPlugin {\n renderSearch: (o: {\n isOpen: boolean;\n onClose: () => void;\n }) => React.JSX.Element | null;\n}\n\nexport interface ProfileMenuPlugin {\n getProfileMenuItems: (context: ZudokuContext) => ProfileNavigationItem[];\n}\n\nexport type ProfileNavigationItem = {\n label: string;\n path?: string;\n weight?: number;\n category?: \"top\" | \"middle\" | \"bottom\";\n children?: ProfileNavigationItem[];\n icon?: LucideIcon;\n};\n\nexport interface CommonPlugin {\n initialize?: (\n context: ZudokuContext,\n ) => Promise<void | boolean> | void | boolean;\n getHead?: ({ location }: { location: Location }) => ReactElement | undefined;\n getMdxComponents?: () => MdxComponentsType;\n}\n\nexport type EventConsumerPlugin<Event extends ZudokuEvents = ZudokuEvents> = {\n events: { [K in keyof Event]?: Event[K] };\n};\n\nexport const isEventConsumerPlugin = (\n obj: ZudokuPlugin,\n): obj is EventConsumerPlugin =>\n \"events\" in obj && typeof obj.events === \"object\";\n\nexport const isProfileMenuPlugin = (\n obj: ZudokuPlugin,\n): obj is ProfileMenuPlugin =>\n \"getProfileMenuItems\" in obj && typeof obj.getProfileMenuItems === \"function\";\n\nexport const isNavigationPlugin = (\n obj: ZudokuPlugin,\n): obj is NavigationPlugin =>\n \"getRoutes\" in obj && typeof obj.getRoutes === \"function\";\n\nexport const isAuthenticationPlugin = (\n obj: ZudokuPlugin,\n): obj is AuthenticationPlugin =>\n \"signUp\" in obj && typeof obj.signUp === \"function\";\n\nexport const isSearchPlugin = (\n obj: ZudokuPlugin,\n): obj is SearchProviderPlugin =>\n \"renderSearch\" in obj && typeof obj.renderSearch === \"function\";\n\nexport const needsInitialization = (obj: ZudokuPlugin): obj is CommonPlugin =>\n \"initialize\" in obj && typeof obj.initialize === \"function\";\n\nexport const hasHead = (obj: ZudokuPlugin): obj is CommonPlugin =>\n \"getHead\" in obj && typeof obj.getHead === \"function\";\n\nexport const isMdxProviderPlugin = (obj: ZudokuPlugin): obj is CommonPlugin =>\n \"getMdxComponents\" in obj && typeof obj.getMdxComponents === \"function\";\n\nexport const isApiIdentityPlugin = (\n obj: ZudokuPlugin,\n): obj is ApiIdentityPlugin =>\n \"getIdentities\" in obj && typeof obj.getIdentities === \"function\";\n"],"names":["createApiIdentityPlugin","plugin","createProfileMenuPlugin","isEventConsumerPlugin","obj","isProfileMenuPlugin","isNavigationPlugin","isAuthenticationPlugin","isSearchPlugin","needsInitialization","hasHead","isMdxProviderPlugin","isApiIdentityPlugin"],"mappings":"AA6Ba,MAAAA,IAA0B,CACrCC,MACsBA,GAEXC,IAA0B,CACrCD,MACsBA,GAsCXE,IAAwB,CACnCC,MAEA,YAAYA,KAAO,OAAOA,EAAI,UAAW,UAE9BC,IAAsB,CACjCD,MAEA,yBAAyBA,KAAO,OAAOA,EAAI,uBAAwB,YAExDE,IAAqB,CAChCF,MAEA,eAAeA,KAAO,OAAOA,EAAI,aAAc,YAEpCG,IAAyB,CACpCH,MAEA,YAAYA,KAAO,OAAOA,EAAI,UAAW,YAE9BI,IAAiB,CAC5BJ,MAEA,kBAAkBA,KAAO,OAAOA,EAAI,gBAAiB,YAE1CK,IAAsB,CAACL,MAClC,gBAAgBA,KAAO,OAAOA,EAAI,cAAe,YAEtCM,IAAU,CAACN,MACtB,aAAaA,KAAO,OAAOA,EAAI,WAAY,YAEhCO,IAAsB,CAACP,MAClC,sBAAsBA,KAAO,OAAOA,EAAI,oBAAqB,YAElDQ,IAAsB,CACjCR,MAEA,mBAAmBA,KAAO,OAAOA,EAAI,iBAAkB;"}
1
+ {"version":3,"file":"zudoku.plugins.js","sources":["../src/lib/core/plugins.ts"],"sourcesContent":["import type { LucideIcon } from \"lucide-react\";\nimport type { ReactElement } from \"react\";\nimport type { Location, RouteObject } from \"react-router\";\nimport type { Navigation } from \"../../config/validators/NavigationSchema.js\";\nimport type { AuthenticationPlugin } from \"../authentication/authentication.js\";\nimport type { MdxComponentsType } from \"../util/MdxComponents.js\";\nimport type {\n ApiIdentity,\n ZudokuContext,\n ZudokuEvents,\n} from \"./ZudokuContext.js\";\n\nexport type ZudokuPlugin =\n | CommonPlugin\n | ProfileMenuPlugin\n | NavigationPlugin\n | ApiIdentityPlugin\n | SearchProviderPlugin\n | EventConsumerPlugin\n | AuthenticationPlugin;\n\nexport type { AuthenticationPlugin, RouteObject };\n\nexport interface NavigationPlugin {\n getRoutes: () => RouteObject[];\n getNavigation?: (path: string, context: ZudokuContext) => Promise<Navigation>;\n getProtectedRoutes?: () => string[];\n}\n\nexport const createApiIdentityPlugin = (\n plugin: ApiIdentityPlugin,\n): ApiIdentityPlugin => plugin;\n\nexport const createProfileMenuPlugin = (\n plugin: ProfileMenuPlugin,\n): ProfileMenuPlugin => plugin;\n\nexport interface ApiIdentityPlugin {\n getIdentities: (context: ZudokuContext) => Promise<ApiIdentity[]>;\n}\n\nexport interface SearchProviderPlugin {\n renderSearch: (o: {\n isOpen: boolean;\n onClose: () => void;\n }) => React.JSX.Element | null;\n}\n\nexport interface ProfileMenuPlugin {\n getProfileMenuItems: (context: ZudokuContext) => ProfileNavigationItem[];\n}\n\nexport type ProfileNavigationItem = {\n label: string;\n path?: string;\n weight?: number;\n category?: \"top\" | \"middle\" | \"bottom\";\n children?: ProfileNavigationItem[];\n icon?: LucideIcon;\n};\n\nexport interface CommonPlugin {\n initialize?: (\n context: ZudokuContext,\n ) => Promise<void | boolean> | void | boolean;\n getHead?: ({ location }: { location: Location }) => ReactElement | undefined;\n getMdxComponents?: () => MdxComponentsType;\n}\n\nexport type EventConsumerPlugin<Event extends ZudokuEvents = ZudokuEvents> = {\n events: { [K in keyof Event]?: Event[K] };\n};\n\nexport const isEventConsumerPlugin = (\n obj: ZudokuPlugin,\n): obj is EventConsumerPlugin =>\n \"events\" in obj && typeof obj.events === \"object\";\n\nexport const isProfileMenuPlugin = (\n obj: ZudokuPlugin,\n): obj is ProfileMenuPlugin =>\n \"getProfileMenuItems\" in obj && typeof obj.getProfileMenuItems === \"function\";\n\nexport const isNavigationPlugin = (\n obj: ZudokuPlugin,\n): obj is NavigationPlugin =>\n \"getRoutes\" in obj && typeof obj.getRoutes === \"function\";\n\nexport const isAuthenticationPlugin = (\n obj: ZudokuPlugin,\n): obj is AuthenticationPlugin =>\n \"signUp\" in obj && typeof obj.signUp === \"function\";\n\nexport const isSearchPlugin = (\n obj: ZudokuPlugin,\n): obj is SearchProviderPlugin =>\n \"renderSearch\" in obj && typeof obj.renderSearch === \"function\";\n\nexport const needsInitialization = (obj: ZudokuPlugin): obj is CommonPlugin =>\n \"initialize\" in obj && typeof obj.initialize === \"function\";\n\nexport const hasHead = (obj: ZudokuPlugin): obj is CommonPlugin =>\n \"getHead\" in obj && typeof obj.getHead === \"function\";\n\nexport const isMdxProviderPlugin = (obj: ZudokuPlugin): obj is CommonPlugin =>\n \"getMdxComponents\" in obj && typeof obj.getMdxComponents === \"function\";\n\nexport const isApiIdentityPlugin = (\n obj: ZudokuPlugin,\n): obj is ApiIdentityPlugin =>\n \"getIdentities\" in obj && typeof obj.getIdentities === \"function\";\n"],"names":["createApiIdentityPlugin","plugin","createProfileMenuPlugin","isEventConsumerPlugin","obj","isProfileMenuPlugin","isNavigationPlugin","isAuthenticationPlugin","isSearchPlugin","needsInitialization","hasHead","isMdxProviderPlugin","isApiIdentityPlugin"],"mappings":"AA6BO,MAAMA,IAA0B,CACrCC,MACsBA,GAEXC,IAA0B,CACrCD,MACsBA,GAsCXE,IAAwB,CACnCC,MAEA,YAAYA,KAAO,OAAOA,EAAI,UAAW,UAE9BC,IAAsB,CACjCD,MAEA,yBAAyBA,KAAO,OAAOA,EAAI,uBAAwB,YAExDE,IAAqB,CAChCF,MAEA,eAAeA,KAAO,OAAOA,EAAI,aAAc,YAEpCG,IAAyB,CACpCH,MAEA,YAAYA,KAAO,OAAOA,EAAI,UAAW,YAE9BI,IAAiB,CAC5BJ,MAEA,kBAAkBA,KAAO,OAAOA,EAAI,gBAAiB,YAE1CK,IAAsB,CAACL,MAClC,gBAAgBA,KAAO,OAAOA,EAAI,cAAe,YAEtCM,IAAU,CAACN,MACtB,aAAaA,KAAO,OAAOA,EAAI,WAAY,YAEhCO,IAAsB,CAACP,MAClC,sBAAsBA,KAAO,OAAOA,EAAI,oBAAqB,YAElDQ,IAAsB,CACjCR,MAEA,mBAAmBA,KAAO,OAAOA,EAAI,iBAAkB;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zudoku",
3
- "version": "0.53.3",
3
+ "version": "0.53.5",
4
4
  "type": "module",
5
5
  "homepage": "https://zudoku.dev",
6
6
  "repository": {
@@ -133,13 +133,13 @@
133
133
  },
134
134
  "dependencies": {
135
135
  "@apidevtools/json-schema-ref-parser": "12.0.2",
136
- "@envelop/core": "5.2.3",
136
+ "@envelop/core": "5.3.0",
137
137
  "@graphql-typed-document-node/core": "3.2.0",
138
138
  "@hookform/resolvers": "4.1.3",
139
- "@lekoarts/rehype-meta-as-attributes": "3.0.2",
139
+ "@lekoarts/rehype-meta-as-attributes": "3.0.3",
140
140
  "@mdx-js/react": "3.1.0",
141
141
  "@mdx-js/rollup": "3.1.0",
142
- "@pothos/core": "4.6.3",
142
+ "@pothos/core": "4.7.0",
143
143
  "@radix-ui/react-accordion": "1.2.11",
144
144
  "@radix-ui/react-alert-dialog": "1.1.14",
145
145
  "@radix-ui/react-aspect-ratio": "1.1.7",
@@ -162,7 +162,7 @@
162
162
  "@radix-ui/react-toggle-group": "1.1.10",
163
163
  "@radix-ui/react-tooltip": "1.2.7",
164
164
  "@radix-ui/react-visually-hidden": "1.2.3",
165
- "@scalar/openapi-parser": "0.10.17",
165
+ "@scalar/openapi-parser": "0.18.0",
166
166
  "@sentry/node": "9.26.0",
167
167
  "@shikijs/langs": "3.7.0",
168
168
  "@shikijs/rehype": "3.7.0",
@@ -171,9 +171,9 @@
171
171
  "@sindresorhus/slugify": "2.2.1",
172
172
  "@stefanprobst/rehype-extract-toc": "3.0.0",
173
173
  "@tailwindcss/typography": "0.5.16",
174
- "@tailwindcss/vite": "4.1.7",
174
+ "@tailwindcss/vite": "4.1.11",
175
175
  "@tanem/react-nprogress": "5.0.55",
176
- "@tanstack/react-query": "5.74.3",
176
+ "@tanstack/react-query": "5.81.5",
177
177
  "@types/react": "19.1.8",
178
178
  "@types/react-dom": "19.1.6",
179
179
  "@vitejs/plugin-react": "4.4.1",
@@ -195,7 +195,7 @@
195
195
  "glob-parent": "6.0.2",
196
196
  "graphql": "16.11.0",
197
197
  "graphql-type-json": "0.3.2",
198
- "graphql-yoga": "5.13.5",
198
+ "graphql-yoga": "5.14.0",
199
199
  "gray-matter": "4.0.3",
200
200
  "hast-util-to-jsx-runtime": "^2.3.6",
201
201
  "hast-util-to-string": "3.0.1",
@@ -208,13 +208,13 @@
208
208
  "minimatch": "10.0.1",
209
209
  "motion": "12.18.1",
210
210
  "nanoevents": "^9.1.0",
211
- "next-themes": "0.4.4",
211
+ "next-themes": "0.4.6",
212
212
  "oauth4webapi": "2.17.0",
213
213
  "object-hash": "3.0.0",
214
214
  "openapi-types": "12.1.3",
215
215
  "pagefind": "1.4.0-alpha.1",
216
216
  "picocolors": "1.1.1",
217
- "piscina": "5.1.1",
217
+ "piscina": "5.1.3",
218
218
  "posthog-node": "4.17.1",
219
219
  "react-error-boundary": "6.0.0",
220
220
  "react-hook-form": "7.57.0",
@@ -232,14 +232,14 @@
232
232
  "remark-mdx-frontmatter": "5.2.0",
233
233
  "remark-parse": "^11.0.0",
234
234
  "remark-rehype": "^11.1.2",
235
- "rollup": "4.41.1",
236
- "semver": "7.7.1",
235
+ "rollup": "4.44.2",
236
+ "semver": "7.7.2",
237
237
  "shiki": "3.7.0",
238
238
  "sitemap": "8.0.0",
239
239
  "spin-delay": "2.0.1",
240
240
  "strip-ansi": "7.1.0",
241
- "tailwind-merge": "3.3.0",
242
- "tailwindcss": "4.1.10",
241
+ "tailwind-merge": "3.3.1",
242
+ "tailwindcss": "4.1.11",
243
243
  "ulidx": "2.4.1",
244
244
  "unified": "^11.0.5",
245
245
  "unist-util-visit": "5.0.0",
@@ -247,8 +247,8 @@
247
247
  "vfile": "6.0.3",
248
248
  "vite": "6.3.5",
249
249
  "yaml": "2.8.0",
250
- "yargs": "17.7.2",
251
- "zod": "3.25.67",
250
+ "yargs": "18.0.0",
251
+ "zod": "3.25.74",
252
252
  "zod-to-ts": "1.2.0",
253
253
  "zustand": "5.0.5"
254
254
  },
@@ -259,7 +259,7 @@
259
259
  "@testing-library/dom": "10.4.0",
260
260
  "@testing-library/jest-dom": "6.6.3",
261
261
  "@testing-library/react": "16.3.0",
262
- "@types/estree": "1.0.7",
262
+ "@types/estree": "1.0.8",
263
263
  "@types/express": "5.0.2",
264
264
  "@types/glob-parent": "5.1.3",
265
265
  "@types/har-format": "1.2.16",
@@ -275,14 +275,14 @@
275
275
  "@types/yargs": "17.0.33",
276
276
  "@vitest/coverage-v8": "3.2.1",
277
277
  "esbuild": "0.25.1",
278
- "happy-dom": "17.5.6",
278
+ "happy-dom": "18.0.1",
279
279
  "mdast-util-mdx": "3.0.0",
280
280
  "react": "19.1.0",
281
281
  "react-dom": "19.1.0",
282
- "rollup-plugin-visualizer": "5.14.0",
282
+ "rollup-plugin-visualizer": "6.0.3",
283
283
  "tsx": "4.19.4",
284
284
  "typescript": "5.8.3",
285
- "vitest": "3.2.3"
285
+ "vitest": "3.2.4"
286
286
  },
287
287
  "peerDependencies": {
288
288
  "@azure/msal-browser": "^4.13.0",
package/src/app/main.css CHANGED
@@ -121,6 +121,10 @@
121
121
  .shiki {
122
122
  counter-reset: line;
123
123
  @apply leading-normal;
124
+ background-color: var(--shiki-light-bg) !important;
125
+ }
126
+ .dark .shiki {
127
+ background-color: var(--shiki-dark-bg) !important;
124
128
  }
125
129
  .code-block .shiki {
126
130
  @apply grid grid-rows-1;
@@ -149,17 +153,34 @@
149
153
  @apply tabular-nums inline-flex items-baseline justify-end me-4 w-3 text-muted-foreground/25;
150
154
  }
151
155
 
152
- .shiki.not-inline .line {
156
+ .light .shiki.not-inline .line {
153
157
  @apply block -mx-4 px-4 w-[calc(100%+2rem)];
154
- --highlighted-bg: hsl(
155
- from var(--muted) h s calc(l + 4 * var(--dark)) / 50%
156
- );
158
+ --highlighted-bg: hsl(from var(--shiki-light-bg) h s calc(l - 6));
157
159
  }
160
+ .dark .shiki.not-inline .line {
161
+ @apply block -mx-4 px-4 w-[calc(100%+2rem)];
162
+ --highlighted-bg: hsl(from var(--shiki-dark-bg) h s calc(l + 10));
163
+ }
164
+
158
165
  .shiki .line.highlighted {
159
- @apply bg-(--highlighted-bg);
166
+ @apply bg-(--highlighted-bg) relative;
167
+ }
168
+
169
+ .shiki .line.highlighted:before {
170
+ position: absolute;
171
+ inset-inline-start: 0;
172
+ inset-block-start: 0;
173
+ inset-block-end: 0;
174
+ border-left: 2px solid
175
+ hsl(from var(--highlighted-bg) h s calc(l + 4 * var(--dark)));
176
+ content: "";
160
177
  }
161
178
 
162
179
  .shiki .highlighted-word {
180
+ --highlighted-bg: hsl(
181
+ from var(--muted) h s calc(l + 4 * var(--dark)) / 50%
182
+ );
183
+
163
184
  @apply bg-(--highlighted-bg) px-0.5 rounded;
164
185
  box-shadow: 0 0 0 4px var(--highlighted-bg);
165
186
  }
@@ -90,7 +90,7 @@ export const Header = memo(function HeaderInner() {
90
90
  <PageProgress />
91
91
  <div className="max-w-screen-2xl mx-auto flex items-center justify-between h-(--top-header-height) px-4 lg:px-8 border-transparent">
92
92
  <div className="flex">
93
- <Link to="/">
93
+ <Link to={site?.logo?.href ?? "/"}>
94
94
  <div className="flex items-center gap-3.5">
95
95
  {site?.logo && (
96
96
  <>
@@ -1,5 +1,5 @@
1
1
  import { memo, useMemo } from "react";
2
- import { MarkdownHooks, type Components } from "react-markdown";
2
+ import ReactMarkdown, { type Components } from "react-markdown";
3
3
  import rehypeRaw from "rehype-raw";
4
4
  import remarkGfm from "remark-gfm";
5
5
  import { createConfiguredShikiRehypePlugins } from "../shiki.js";
@@ -35,13 +35,13 @@ export const Markdown = memo(
35
35
 
36
36
  return (
37
37
  <Typography className={className}>
38
- <MarkdownHooks
38
+ <ReactMarkdown
39
39
  remarkPlugins={remarkPlugins}
40
40
  rehypePlugins={rehypePlugins}
41
41
  components={mdComponents}
42
42
  >
43
43
  {content}
44
- </MarkdownHooks>
44
+ </ReactMarkdown>
45
45
  </Typography>
46
46
  );
47
47
  },
@@ -18,9 +18,10 @@ export const NotFoundPage = () => {
18
18
  <DeveloperHint>
19
19
  Start by adding a file at{" "}
20
20
  <code>
21
- {"{PROJECT_ROOT}"}/{params["*"]}.mdx
21
+ {"{DOCUMENT_ROOT}"}/{params["*"]}.mdx
22
22
  </code>{" "}
23
- and add some content to make this error go away.
23
+ and add some content to make this error go away. By default{" "}
24
+ <code>DOCUMENT_ROOT</code> is the `pages` directory.
24
25
  </DeveloperHint>
25
26
  <p>
26
27
  It seems that the page you are looking for does not exist or may have
@@ -1,7 +1,7 @@
1
1
  import { cn } from "../util/cn.js";
2
2
 
3
3
  // other styles are defined in main.css .prose
4
- export const ProseClasses = "prose dark:prose-invert prose-neutral";
4
+ export const ProseClasses = "prose dark:prose-invert prose-neutral typography";
5
5
 
6
6
  export const Typography = ({
7
7
  children,
@@ -67,6 +67,7 @@ type Site = Partial<{
67
67
  };
68
68
  width?: string | number;
69
69
  alt?: string;
70
+ href?: string;
70
71
  };
71
72
  banner?: {
72
73
  message: ReactNode;
@@ -23,13 +23,11 @@ export function ErrorAlert({ error }: { error: unknown }) {
23
23
  Error: {message}
24
24
  {hint && <DeveloperHint className="mb-4">{hint}</DeveloperHint>}
25
25
  {stringError && (
26
- <div>
27
- <SyntaxHighlight
28
- className="max-h-[400px] border mt-2"
29
- language="js"
30
- code={stringError}
31
- />
32
- </div>
26
+ <SyntaxHighlight
27
+ className="max-h-[400px] [&>pre]:p-4"
28
+ language="js"
29
+ code={stringError}
30
+ />
33
31
  )}
34
32
  </Typography>
35
33
  );
@@ -220,6 +220,8 @@ export const OperationList = ({
220
220
  : undefined,
221
221
  };
222
222
 
223
+ const helmetTitle = [schema.tag.name, title].filter(Boolean).join(" - ");
224
+
223
225
  return (
224
226
  <div
225
227
  className="pt-(--padding-content-top)"
@@ -227,7 +229,7 @@ export const OperationList = ({
227
229
  data-pagefind-meta="section:openapi"
228
230
  >
229
231
  <Helmet>
230
- <title>{[schema.tag.name, title].filter(Boolean).join(" - ")}</title>
232
+ {helmetTitle && <title>{helmetTitle}</title>}
231
233
  {metaDescription && (
232
234
  <meta name="description" content={metaDescription} />
233
235
  )}
@@ -173,7 +173,7 @@ export const Sidecar = ({
173
173
  embedded
174
174
  language={selectedLang}
175
175
  noBackground
176
- className="[--scrollbar-color:gray] rounded-none text-xs max-h-[500px] p-2"
176
+ className="[--scrollbar-color:gray] rounded-none text-xs max-h-[500px]"
177
177
  code={code!}
178
178
  />
179
179
  </CollapsibleCode>
@@ -104,7 +104,7 @@ export const SidecarExamples = ({
104
104
  embedded
105
105
  language={language}
106
106
  noBackground
107
- className="[--scrollbar-color:gray] rounded-none text-xs max-h-[500px] p-2"
107
+ className="[--scrollbar-color:gray] rounded-none text-xs max-h-[500px]"
108
108
  code={formattedExample}
109
109
  />
110
110
  </CollapsibleCode>
@@ -39,7 +39,7 @@ export const PathParams = ({
39
39
  )}
40
40
  />
41
41
 
42
- <div className="flex justify-between items-center">
42
+ <div className="flex justify-between items-center col-span-2">
43
43
  <Controller
44
44
  control={control}
45
45
  name={`pathParams.${i}.value`}
@@ -154,6 +154,12 @@ export const Playground = ({
154
154
  formRef.current?.requestSubmit();
155
155
  });
156
156
 
157
+ const pathParamOrder =
158
+ url.match(/\{([^}]+)\}/g)?.map((match) => match.slice(1, -1)) ?? [];
159
+ const sortedPathParams = [...pathParams].sort(
160
+ (a, b) => pathParamOrder.indexOf(a.name) - pathParamOrder.indexOf(b.name),
161
+ );
162
+
157
163
  const { register, control, handleSubmit, watch, setValue, ...form } =
158
164
  useForm<PlaygroundForm>({
159
165
  defaultValues: {
@@ -174,7 +180,7 @@ export const Playground = ({
174
180
  enum: [],
175
181
  },
176
182
  ],
177
- pathParams: pathParams.map((param) => ({
183
+ pathParams: sortedPathParams.map((param) => ({
178
184
  name: param.name,
179
185
  value: param.defaultValue ?? "",
180
186
  })),
@@ -472,7 +478,7 @@ export const Playground = ({
472
478
  </Collapsible>
473
479
  )}
474
480
 
475
- {pathParams.length > 0 && (
481
+ {sortedPathParams.length > 0 && (
476
482
  <Collapsible defaultOpen>
477
483
  <CollapsibleHeaderTrigger>
478
484
  <ShapesIcon size={16} />
@@ -76,7 +76,7 @@ export const CodeBlock = ({
76
76
  </div>
77
77
  <div
78
78
  className={cn(
79
- "code-block text-sm not-prose scrollbar overflow-x-auto scrollbar p-4",
79
+ "code-block text-sm not-prose scrollbar overflow-x-auto scrollbar [&>code]:p-4",
80
80
  props.className,
81
81
  )}
82
82
  ref={ref}
@@ -40,7 +40,7 @@ export const EmbeddedCodeBlock = ({
40
40
  >
41
41
  <div
42
42
  className={cn(
43
- "code-block text-sm not-prose scrollbar overflow-x-auto scrollbar p-4",
43
+ "code-block text-sm not-prose scrollbar overflow-x-auto scrollbar [&>pre]:p-4",
44
44
  props.className,
45
45
  )}
46
46
  ref={ref}