zudoku 0.65.3 → 0.66.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 (256) hide show
  1. package/dist/app/sentry.js +1 -1
  2. package/dist/config/validators/BuildSchema.js +18 -3
  3. package/dist/config/validators/BuildSchema.js.map +1 -1
  4. package/dist/config/validators/validate.d.ts +45 -3
  5. package/dist/config/validators/validate.js +7 -1
  6. package/dist/config/validators/validate.js.map +1 -1
  7. package/dist/flat-config.d.ts +9 -2
  8. package/dist/lib/components/Mermaid.d.ts +7 -0
  9. package/dist/lib/components/Mermaid.js +42 -0
  10. package/dist/lib/components/Mermaid.js.map +1 -0
  11. package/dist/lib/components/PagefindSearchMeta.d.ts +8 -0
  12. package/dist/lib/components/PagefindSearchMeta.js +7 -0
  13. package/dist/lib/components/PagefindSearchMeta.js.map +1 -0
  14. package/dist/lib/components/Zudoku.js +2 -5
  15. package/dist/lib/components/Zudoku.js.map +1 -1
  16. package/dist/lib/core/RouteGuard.js +1 -1
  17. package/dist/lib/core/RouteGuard.js.map +1 -1
  18. package/dist/lib/core/plugins.d.ts +3 -3
  19. package/dist/lib/oas/parser/index.d.ts +1 -0
  20. package/dist/lib/oas/parser/index.js.map +1 -1
  21. package/dist/lib/plugins/openapi/DownloadSchemaButton.d.ts +3 -0
  22. package/dist/lib/plugins/openapi/DownloadSchemaButton.js +47 -0
  23. package/dist/lib/plugins/openapi/DownloadSchemaButton.js.map +1 -0
  24. package/dist/lib/plugins/openapi/Endpoint.js +3 -6
  25. package/dist/lib/plugins/openapi/Endpoint.js.map +1 -1
  26. package/dist/lib/plugins/openapi/OasProvider.js +22 -13
  27. package/dist/lib/plugins/openapi/OasProvider.js.map +1 -1
  28. package/dist/lib/plugins/openapi/OperationList.js +12 -6
  29. package/dist/lib/plugins/openapi/OperationList.js.map +1 -1
  30. package/dist/lib/plugins/openapi/OperationListItem.js +2 -2
  31. package/dist/lib/plugins/openapi/OperationListItem.js.map +1 -1
  32. package/dist/lib/plugins/openapi/SchemaList.js +2 -1
  33. package/dist/lib/plugins/openapi/SchemaList.js.map +1 -1
  34. package/dist/lib/plugins/openapi/index.js +11 -5
  35. package/dist/lib/plugins/openapi/index.js.map +1 -1
  36. package/dist/lib/plugins/openapi/interfaces.d.ts +16 -13
  37. package/dist/lib/plugins/openapi/playground/Playground.js +1 -1
  38. package/dist/lib/plugins/openapi/playground/Playground.js.map +1 -1
  39. package/dist/lib/plugins/openapi/schema/SchemaView.d.ts +1 -1
  40. package/dist/lib/plugins/openapi/schema/SchemaView.js +14 -6
  41. package/dist/lib/plugins/openapi/schema/SchemaView.js.map +1 -1
  42. package/dist/lib/plugins/openapi/schema/utils.d.ts +2 -2
  43. package/dist/lib/plugins/openapi/schema/utils.js.map +1 -1
  44. package/dist/lib/plugins/openapi/util/getRoutes.d.ts +6 -1
  45. package/dist/lib/plugins/openapi/util/getRoutes.js +29 -2
  46. package/dist/lib/plugins/openapi/util/getRoutes.js.map +1 -1
  47. package/dist/lib/plugins/search-pagefind/IndexingDialog.d.ts +3 -0
  48. package/dist/lib/plugins/search-pagefind/IndexingDialog.js +64 -0
  49. package/dist/lib/plugins/search-pagefind/IndexingDialog.js.map +1 -0
  50. package/dist/lib/plugins/search-pagefind/PagefindSearch.js +22 -5
  51. package/dist/lib/plugins/search-pagefind/PagefindSearch.js.map +1 -1
  52. package/dist/lib/plugins/search-pagefind/ResultList.js +5 -4
  53. package/dist/lib/plugins/search-pagefind/ResultList.js.map +1 -1
  54. package/dist/lib/shiki.d.ts +1 -1
  55. package/dist/lib/shiki.js +18 -12
  56. package/dist/lib/shiki.js.map +1 -1
  57. package/dist/lib/ui/Button.d.ts +2 -2
  58. package/dist/lib/ui/Button.js +9 -8
  59. package/dist/lib/ui/Button.js.map +1 -1
  60. package/dist/lib/ui/ButtonGroup.d.ts +11 -0
  61. package/dist/lib/ui/ButtonGroup.js +28 -0
  62. package/dist/lib/ui/ButtonGroup.js.map +1 -0
  63. package/dist/lib/ui/Command.js +2 -2
  64. package/dist/lib/ui/Command.js.map +1 -1
  65. package/dist/lib/ui/DropdownMenu.d.ts +21 -23
  66. package/dist/lib/ui/DropdownMenu.js +47 -32
  67. package/dist/lib/ui/DropdownMenu.js.map +1 -1
  68. package/dist/lib/ui/Kbd.d.ts +3 -0
  69. package/dist/lib/ui/Kbd.js +10 -0
  70. package/dist/lib/ui/Kbd.js.map +1 -0
  71. package/dist/lib/util/MdxComponents.d.ts +1 -0
  72. package/dist/lib/util/MdxComponents.js +2 -0
  73. package/dist/lib/util/MdxComponents.js.map +1 -1
  74. package/dist/lib/util/flattenAllOf.js +27 -4
  75. package/dist/lib/util/flattenAllOf.js.map +1 -1
  76. package/dist/lib/util/flattenAllOf.test.js +67 -12
  77. package/dist/lib/util/flattenAllOf.test.js.map +1 -1
  78. package/dist/vite/api/SchemaManager.d.ts +5 -0
  79. package/dist/vite/api/SchemaManager.js +24 -0
  80. package/dist/vite/api/SchemaManager.js.map +1 -1
  81. package/dist/vite/api/SchemaManager.test.js +67 -0
  82. package/dist/vite/api/SchemaManager.test.js.map +1 -1
  83. package/dist/vite/config.js +8 -2
  84. package/dist/vite/config.js.map +1 -1
  85. package/dist/vite/dev-server.js +25 -0
  86. package/dist/vite/dev-server.js.map +1 -1
  87. package/dist/vite/pagefind-dev-index.d.ts +16 -0
  88. package/dist/vite/pagefind-dev-index.js +68 -0
  89. package/dist/vite/pagefind-dev-index.js.map +1 -0
  90. package/dist/vite/plugin-api.js +41 -3
  91. package/dist/vite/plugin-api.js.map +1 -1
  92. package/dist/vite/prerender/prerender.js +1 -19
  93. package/dist/vite/prerender/prerender.js.map +1 -1
  94. package/dist/vite/prerender/utils.d.ts +2 -0
  95. package/dist/vite/prerender/utils.js +24 -0
  96. package/dist/vite/prerender/utils.js.map +1 -0
  97. package/lib/Button-CynVW1JV.js +53 -0
  98. package/lib/Button-CynVW1JV.js.map +1 -0
  99. package/lib/ClaudeLogo-PxFjou9w.js +69 -0
  100. package/lib/ClaudeLogo-PxFjou9w.js.map +1 -0
  101. package/lib/{Command-CUcrW3qs.js → Command-BpT1iBE6.js} +25 -25
  102. package/lib/Command-BpT1iBE6.js.map +1 -0
  103. package/lib/Drawer-Ci7XwhqT.js.map +1 -1
  104. package/lib/DropdownMenu-C8SX_-S_.js +104 -0
  105. package/lib/DropdownMenu-C8SX_-S_.js.map +1 -0
  106. package/lib/{ErrorAlert-D5LKLFOd.js → ErrorAlert-BqjbNHIn.js} +1017 -1015
  107. package/lib/{ErrorAlert-D5LKLFOd.js.map → ErrorAlert-BqjbNHIn.js.map} +1 -1
  108. package/lib/IndexingDialog-B5zCiUKr.js +100 -0
  109. package/lib/IndexingDialog-B5zCiUKr.js.map +1 -0
  110. package/lib/MdxPage-CVFatbHw.js +210 -0
  111. package/lib/MdxPage-CVFatbHw.js.map +1 -0
  112. package/lib/Mermaid-CIFixY6C.js +102 -0
  113. package/lib/Mermaid-CIFixY6C.js.map +1 -0
  114. package/lib/{OAuthErrorPage-oXnxcJg4.js → OAuthErrorPage-Dup79DJk.js} +7 -7
  115. package/lib/{OAuthErrorPage-oXnxcJg4.js.map → OAuthErrorPage-Dup79DJk.js.map} +1 -1
  116. package/lib/OasProvider-BJeMq29o.js +40 -0
  117. package/lib/OasProvider-BJeMq29o.js.map +1 -0
  118. package/lib/{OperationList-CmMoKpGu.js → OperationList-ff3ZvQsO.js} +1701 -1585
  119. package/lib/OperationList-ff3ZvQsO.js.map +1 -0
  120. package/lib/{RouteGuard-Brz95MSt.js → RouteGuard-BXy13JSz.js} +19 -19
  121. package/lib/{RouteGuard-Brz95MSt.js.map → RouteGuard-BXy13JSz.js.map} +1 -1
  122. package/lib/{RouterError-VGZB_wg4.js → RouterError-CKOZTsDD.js} +3 -3
  123. package/lib/{RouterError-VGZB_wg4.js.map → RouterError-CKOZTsDD.js.map} +1 -1
  124. package/lib/{SchemaList-BykD27ga.js → SchemaList-BSC1KM3v.js} +28 -27
  125. package/lib/SchemaList-BSC1KM3v.js.map +1 -0
  126. package/lib/{SchemaView-Dt6hbCAt.js → SchemaView-CgwJ9gtb.js} +198 -187
  127. package/lib/SchemaView-CgwJ9gtb.js.map +1 -0
  128. package/lib/Select-VmDZ-nKe.js +337 -0
  129. package/lib/Select-VmDZ-nKe.js.map +1 -0
  130. package/lib/{SignUp-D2mmQOkg.js → SignUp-Pm_LGm6T.js} +13 -13
  131. package/lib/{SignUp-D2mmQOkg.js.map → SignUp-Pm_LGm6T.js.map} +1 -1
  132. package/lib/{SyntaxHighlight-C19vH0V_.js → SyntaxHighlight-bkmst3oV.js} +654 -622
  133. package/lib/SyntaxHighlight-bkmst3oV.js.map +1 -0
  134. package/lib/{Toc-CBWfFCVf.js → Toc-TUXNFbKl.js} +2 -2
  135. package/lib/{Toc-CBWfFCVf.js.map → Toc-TUXNFbKl.js.map} +1 -1
  136. package/lib/{ZudokuContext-BUZ5hkWB.js → ZudokuContext-np1wheDl.js} +8 -8
  137. package/lib/{ZudokuContext-BUZ5hkWB.js.map → ZudokuContext-np1wheDl.js.map} +1 -1
  138. package/lib/___vite-browser-external_commonjs-proxy-Cga3HsWk.js +9 -0
  139. package/lib/___vite-browser-external_commonjs-proxy-Cga3HsWk.js.map +1 -0
  140. package/lib/{chunk-PVWAREVJ-BMhpCH5D.js → chunk-PVWAREVJ-dLIqswPy.js} +5 -5
  141. package/lib/{chunk-PVWAREVJ-BMhpCH5D.js.map → chunk-PVWAREVJ-dLIqswPy.js.map} +1 -1
  142. package/lib/{circular-CNHs4gAz.js → circular-XPj_dwqA.js} +2 -2
  143. package/lib/{circular-CNHs4gAz.js.map → circular-XPj_dwqA.js.map} +1 -1
  144. package/lib/createServer-D01nCTNp.js +16693 -0
  145. package/lib/createServer-D01nCTNp.js.map +1 -0
  146. package/lib/{errors-D7xzOd8X.js → errors-B0hNTPFO.js} +3 -3
  147. package/lib/{errors-D7xzOd8X.js.map → errors-B0hNTPFO.js.map} +1 -1
  148. package/lib/{hook-CMeoxziF.js → hook-CvSwcbk6.js} +3 -3
  149. package/lib/{hook-CMeoxziF.js.map → hook-CvSwcbk6.js.map} +1 -1
  150. package/lib/{index-unv8c40u.js → index-Bjc_QsUR.js} +754 -738
  151. package/lib/{index-unv8c40u.js.map → index-Bjc_QsUR.js.map} +1 -1
  152. package/lib/index-CrcNWbel.js.map +1 -1
  153. package/lib/index-DnMgJWrI.js +133 -0
  154. package/lib/index-DnMgJWrI.js.map +1 -0
  155. package/lib/{index-CF7_erXq.js → index-DscsS121.js} +2 -2
  156. package/lib/{index-CF7_erXq.js.map → index-DscsS121.js.map} +1 -1
  157. package/lib/{index-CPws05Tb.js → index-mfkNWYG-.js} +10 -10
  158. package/lib/{index-CPws05Tb.js.map → index-mfkNWYG-.js.map} +1 -1
  159. package/lib/{index.esm-BnYHxCYC.js → index.esm-DtzT_KoE.js} +20 -20
  160. package/lib/{index.esm-BnYHxCYC.js.map → index.esm-DtzT_KoE.js.map} +1 -1
  161. package/lib/{invariant-Bm-FVUQE.js → invariant-CGOLuIIz.js} +3 -3
  162. package/lib/{invariant-Bm-FVUQE.js.map → invariant-CGOLuIIz.js.map} +1 -1
  163. package/lib/{mutation-BSU0xu4m.js → mutation-BlmnL5qL.js} +2 -2
  164. package/lib/{mutation-BSU0xu4m.js.map → mutation-BlmnL5qL.js.map} +1 -1
  165. package/lib/ui/ActionButton.js +1 -1
  166. package/lib/ui/Button.js +25 -24
  167. package/lib/ui/Button.js.map +1 -1
  168. package/lib/ui/ButtonGroup.js +77 -0
  169. package/lib/ui/ButtonGroup.js.map +1 -0
  170. package/lib/ui/Command.js +3 -3
  171. package/lib/ui/Command.js.map +1 -1
  172. package/lib/ui/DropdownMenu.js +227 -140
  173. package/lib/ui/DropdownMenu.js.map +1 -1
  174. package/lib/ui/Kbd.js +32 -0
  175. package/lib/ui/Kbd.js.map +1 -0
  176. package/lib/ui/SyntaxHighlight.js +3 -3
  177. package/lib/zudoku.__internal.js +8 -8
  178. package/lib/zudoku.auth-auth0.js +1 -1
  179. package/lib/zudoku.auth-azureb2c.js +4 -4
  180. package/lib/zudoku.auth-clerk.js +2 -2
  181. package/lib/zudoku.auth-openid.js +5 -5
  182. package/lib/zudoku.auth-supabase.js +5 -5
  183. package/lib/zudoku.components.js +7 -7
  184. package/lib/zudoku.hooks.js +11 -24
  185. package/lib/zudoku.hooks.js.map +1 -1
  186. package/lib/zudoku.mermaid.js +10 -0
  187. package/lib/zudoku.mermaid.js.map +1 -0
  188. package/lib/zudoku.plugin-api-catalog.js +6 -6
  189. package/lib/zudoku.plugin-api-keys.js +223 -198
  190. package/lib/zudoku.plugin-api-keys.js.map +1 -1
  191. package/lib/zudoku.plugin-custom-pages.js +1 -1
  192. package/lib/zudoku.plugin-markdown.js +1 -1
  193. package/lib/zudoku.plugin-openapi.js +3 -3
  194. package/lib/zudoku.plugin-redirect.js +1 -1
  195. package/lib/zudoku.plugin-search-pagefind.js +184 -226
  196. package/lib/zudoku.plugin-search-pagefind.js.map +1 -1
  197. package/lib/zudoku.plugins.js.map +1 -1
  198. package/lib/zudoku.router.js +2 -2
  199. package/package.json +29 -21
  200. package/src/app/sentry.ts +1 -1
  201. package/src/lib/components/Mermaid.tsx +68 -0
  202. package/src/lib/components/PagefindSearchMeta.tsx +14 -0
  203. package/src/lib/components/Zudoku.tsx +4 -7
  204. package/src/lib/core/RouteGuard.tsx +1 -1
  205. package/src/lib/core/plugins.ts +2 -2
  206. package/src/lib/oas/parser/index.ts +2 -0
  207. package/src/lib/plugins/openapi/DownloadSchemaButton.tsx +115 -0
  208. package/src/lib/plugins/openapi/Endpoint.tsx +20 -27
  209. package/src/lib/plugins/openapi/OasProvider.tsx +30 -17
  210. package/src/lib/plugins/openapi/OperationList.tsx +39 -21
  211. package/src/lib/plugins/openapi/OperationListItem.tsx +5 -5
  212. package/src/lib/plugins/openapi/SchemaList.tsx +4 -0
  213. package/src/lib/plugins/openapi/index.tsx +16 -7
  214. package/src/lib/plugins/openapi/interfaces.ts +16 -7
  215. package/src/lib/plugins/openapi/playground/Playground.tsx +1 -1
  216. package/src/lib/plugins/openapi/schema/SchemaView.tsx +36 -27
  217. package/src/lib/plugins/openapi/schema/utils.ts +5 -2
  218. package/src/lib/plugins/openapi/util/getRoutes.tsx +35 -3
  219. package/src/lib/plugins/search-pagefind/IndexingDialog.tsx +163 -0
  220. package/src/lib/plugins/search-pagefind/PagefindSearch.tsx +61 -22
  221. package/src/lib/plugins/search-pagefind/ResultList.tsx +8 -3
  222. package/src/lib/shiki.ts +21 -12
  223. package/src/lib/ui/Button.tsx +10 -10
  224. package/src/lib/ui/ButtonGroup.tsx +82 -0
  225. package/src/lib/ui/Command.tsx +3 -3
  226. package/src/lib/ui/DropdownMenu.tsx +226 -170
  227. package/src/lib/ui/Kbd.tsx +28 -0
  228. package/src/lib/util/MdxComponents.tsx +2 -0
  229. package/src/lib/util/flattenAllOf.test.ts +71 -19
  230. package/src/lib/util/flattenAllOf.ts +29 -8
  231. package/src/shiki/langs/markdown-nix.js +1 -0
  232. package/src/shiki/langs/openscad.js +1 -0
  233. package/dist/vite/create-pagefind-index.d.ts +0 -4
  234. package/dist/vite/create-pagefind-index.js +0 -12
  235. package/dist/vite/create-pagefind-index.js.map +0 -1
  236. package/lib/Button-B3ucvvQw.js +0 -52
  237. package/lib/Button-B3ucvvQw.js.map +0 -1
  238. package/lib/Command-CUcrW3qs.js.map +0 -1
  239. package/lib/DropdownMenu-BZ2NKQ3K.js +0 -126
  240. package/lib/DropdownMenu-BZ2NKQ3K.js.map +0 -1
  241. package/lib/MdxPage-hOCN-u-L.js +0 -240
  242. package/lib/MdxPage-hOCN-u-L.js.map +0 -1
  243. package/lib/OasProvider-CpniNNrW.js +0 -36
  244. package/lib/OasProvider-CpniNNrW.js.map +0 -1
  245. package/lib/OperationList-CmMoKpGu.js.map +0 -1
  246. package/lib/Pagination-lLSoHnxa.js +0 -37
  247. package/lib/Pagination-lLSoHnxa.js.map +0 -1
  248. package/lib/SchemaList-BykD27ga.js.map +0 -1
  249. package/lib/SchemaView-Dt6hbCAt.js.map +0 -1
  250. package/lib/Select-DFRCS31-.js +0 -399
  251. package/lib/Select-DFRCS31-.js.map +0 -1
  252. package/lib/SyntaxHighlight-C19vH0V_.js.map +0 -1
  253. package/lib/createServer-BmcVQAOQ.js +0 -13018
  254. package/lib/createServer-BmcVQAOQ.js.map +0 -1
  255. package/lib/useExposedProps-U3pmsHaG.js +0 -113
  256. package/lib/useExposedProps-U3pmsHaG.js.map +0 -1
@@ -1,218 +1,161 @@
1
1
  import { j as e } from "./jsx-runtime-BzflLqGi.js";
2
- import { C as w } from "./ClientOnly-E7hGysn1.js";
3
- import { VisuallyHidden as I } from "@radix-ui/react-visually-hidden";
4
- import { j as k, u as N, a as _, l as j, m as L } from "./ZudokuContext-BUZ5hkWB.js";
5
- import { useRef as C, useLayoutEffect as T, useState as E } from "react";
6
- import { B as R } from "./Button-B3ucvvQw.js";
7
- import { ShieldAlertIcon as z, AlertTriangleIcon as F, InfoIcon as h, LightbulbIcon as q, BracketsIcon as A, FileTextIcon as P } from "lucide-react";
8
- import { c as m } from "./cn-dYga0KKN.js";
9
- import { C as $, a as b, b as f, c as D, d as B, e as O } from "./Command-CUcrW3qs.js";
10
- import { c as U } from "./Dialog-BQciPiHN.js";
11
- import { S as G } from "./RouteGuard-Brz95MSt.js";
12
- import { u as H, L as p } from "./chunk-PVWAREVJ-BMhpCH5D.js";
13
- const K = {
14
- note: {
15
- border: "border-gray-300 dark:border-zinc-800",
16
- bg: "bg-gray-100 dark:bg-zinc-800/50",
17
- iconColor: "text-gray-600 dark:text-zinc-300",
18
- titleColor: "text-gray-600 dark:text-zinc-300",
19
- textColor: "text-gray-600 dark:text-zinc-300 [&_a]:hover:text-gray-700 [&_a]:dark:hover:text-zinc-400",
20
- Icon: h
21
- },
22
- tip: {
23
- border: "border-green-500 dark:border-green-800",
24
- bg: "bg-green-200/25 dark:bg-green-950/70",
25
- iconColor: "text-green-600 dark:text-green-200",
26
- titleColor: "text-green-700 dark:text-green-200",
27
- textColor: "text-green-600 dark:text-green-50 [&_a]:hover:text-green-700 [&_a]:dark:hover:text-green-300",
28
- Icon: q
29
- },
30
- info: {
31
- border: "border-blue-400 dark:border-blue-900/60",
32
- bg: "bg-blue-50 dark:bg-blue-950/40",
33
- iconColor: "text-blue-400 dark:text-blue-200",
34
- titleColor: "text-blue-700 dark:text-blue-200",
35
- textColor: "text-blue-600 dark:text-blue-100 [&_a]:hover:text-blue-800 [&_a]:dark:hover:text-blue-300",
36
- Icon: h
37
- },
38
- caution: {
39
- border: "border-yellow-400 dark:border-yellow-400/25",
40
- bg: "bg-yellow-100/60 dark:bg-yellow-400/10",
41
- iconColor: "text-yellow-500 dark:text-yellow-300",
42
- titleColor: "text-yellow-600 dark:text-yellow-300",
43
- textColor: "text-yellow-700 dark:text-yellow-200 [&_a]:hover:text-yellow-800 [&_a]:dark:hover:text-yellow-300",
44
- Icon: F
45
- },
46
- danger: {
47
- border: "border-rose-400 dark:border-rose-800",
48
- bg: "bg-rose-50 dark:bg-rose-950/40",
49
- iconColor: "text-rose-400 dark:text-rose-300",
50
- titleColor: "text-rose-800 dark:text-rose-300",
51
- textColor: "text-rose-700 dark:text-rose-100 [&_a]:hover:text-rose-800 [&_a]:dark:hover:text-rose-300",
52
- Icon: z
53
- }
54
- }, M = ({
55
- type: o,
56
- children: n,
57
- title: t,
58
- className: s,
59
- icon: a = !0
60
- }) => {
61
- const { border: l, bg: i, iconColor: d, titleColor: r, textColor: c, Icon: u } = K[o];
62
- return /* @__PURE__ */ e.jsxs(
63
- "div",
2
+ import { C as R } from "./ClientOnly-E7hGysn1.js";
3
+ import { VisuallyHidden as F } from "@radix-ui/react-visually-hidden";
4
+ import { j as C, u as T, a as _, f as w, l as $ } from "./ZudokuContext-np1wheDl.js";
5
+ import { BracketsIcon as q, FileTextIcon as I } from "lucide-react";
6
+ import { useRef as E, useLayoutEffect as P, lazy as A, useState as y, useEffect as D } from "react";
7
+ import { B } from "./Button-CynVW1JV.js";
8
+ import { C as O, a as S, b as N, c as V, d as z, e as K } from "./Command-BpT1iBE6.js";
9
+ import { c as G } from "./Dialog-BQciPiHN.js";
10
+ import { cn as L } from "./ui/util.js";
11
+ import { S as U } from "./RouteGuard-BXy13JSz.js";
12
+ import { u as H, L as k } from "./chunk-PVWAREVJ-dLIqswPy.js";
13
+ function h({ className: r, ...a }) {
14
+ return /* @__PURE__ */ e.jsx(
15
+ "kbd",
64
16
  {
65
- className: m(
66
- "not-prose rounded-md border p-4 text-md my-2",
67
- a && "grid grid-cols-[min-content_1fr] items-baseline grid-rows-[fit-content_1fr] gap-x-4 gap-y-2",
68
- !a && t && "flex flex-col gap-2",
69
- "[&_a]:underline [&_a]:decoration-current [&_a]:decoration-from-font [&_a]:underline-offset-4 hover:[&_a]:decoration-1",
70
- "[&_.code-block-wrapper]:border",
71
- "[&_ul]:list-disc [&_ol]:list-decimal [&_ul]:ps-4 [&_ul>li]:ps-1 [&_ul>li]:my-1",
72
- a && t && "items-center",
73
- l,
74
- i,
75
- s
17
+ "data-slot": "kbd",
18
+ className: L(
19
+ "bg-muted text-muted-foreground pointer-events-none inline-flex h-5 w-fit min-w-5 items-center justify-center gap-1 rounded-sm px-1 font-sans text-xs font-medium select-none",
20
+ "[&_svg:not([class*='size-'])]:size-3",
21
+ "[[data-slot=tooltip-content]_&]:bg-background/20 [[data-slot=tooltip-content]_&]:text-background dark:[[data-slot=tooltip-content]_&]:bg-background/10",
22
+ r
76
23
  ),
77
- children: [
78
- a && /* @__PURE__ */ e.jsx(
79
- u,
80
- {
81
- className: m(t ? "align-middle" : "translate-y-1", d),
82
- size: 20,
83
- "aria-hidden": "true"
84
- }
85
- ),
86
- t && /* @__PURE__ */ e.jsx("h3", { className: m("font-medium", r), children: t }),
87
- /* @__PURE__ */ e.jsx(
88
- "div",
89
- {
90
- className: m(
91
- a && "col-start-2",
92
- !t && a && "row-start-1",
93
- c,
94
- "overflow-x-auto"
95
- ),
96
- children: n
97
- }
98
- )
99
- ]
24
+ ...a
100
25
  }
101
26
  );
102
- }, V = async ({
103
- search: o,
104
- options: n,
105
- auth: t,
106
- context: s
27
+ }
28
+ function p({ className: r, ...a }) {
29
+ return /* @__PURE__ */ e.jsx(
30
+ "kbd",
31
+ {
32
+ "data-slot": "kbd-group",
33
+ className: L("inline-flex items-center gap-1", r),
34
+ ...a
35
+ }
36
+ );
37
+ }
38
+ const Y = async ({
39
+ search: r,
40
+ options: a,
41
+ auth: s,
42
+ context: n
107
43
  }) => {
108
- const a = n.maxResults ?? 10, l = n.transformResults ?? (() => !0), i = [], d = Y({
109
- search: o,
110
- transformFn: l,
111
- auth: t,
112
- context: s
44
+ const c = a.maxResults ?? 10, o = a.transformResults ?? (() => !0), i = [], m = M({
45
+ search: r,
46
+ transformFn: o,
47
+ auth: s,
48
+ context: n
113
49
  });
114
- for await (const r of d)
115
- if (i.push(r), i.length >= a) break;
50
+ for await (const t of m)
51
+ if (i.push(t), i.length >= c) break;
116
52
  return i;
117
53
  };
118
- async function* Y({
119
- search: o,
120
- transformFn: n,
121
- auth: t,
122
- context: s
54
+ async function* M({
55
+ search: r,
56
+ transformFn: a,
57
+ auth: s,
58
+ context: n
123
59
  }) {
124
- let l = 0;
125
- for (; l < o.results.length; ) {
126
- const i = o.results.slice(
127
- l,
128
- l + 5
60
+ let o = 0;
61
+ for (; o < r.results.length; ) {
62
+ const i = r.results.slice(
63
+ o,
64
+ o + 5
129
65
  );
130
- l += i.length;
131
- const d = await Promise.all(i.map((r) => r.data()));
132
- for (const r of d) {
133
- const c = n({ result: r, auth: t, context: s });
134
- c === !1 || (c === !0 || c == null ? yield r : yield c);
66
+ o += i.length;
67
+ const m = await Promise.all(i.map((t) => t.data()));
68
+ for (const t of m) {
69
+ const l = a({ result: t, auth: s, context: n });
70
+ l === !1 || (l === !0 || l == null ? yield t : yield l);
135
71
  }
136
72
  }
137
73
  }
138
- const Q = (o, n) => {
139
- const t = o.weighted_locations.reduce(
140
- (a, l) => a + l.balanced_score,
74
+ const Q = (r, a) => {
75
+ const s = r.weighted_locations.reduce(
76
+ (c, o) => c + o.balanced_score,
141
77
  0
142
78
  );
143
- return n.weighted_locations.reduce(
144
- (a, l) => a + l.balanced_score,
79
+ return a.weighted_locations.reduce(
80
+ (c, o) => c + o.balanced_score,
145
81
  0
146
- ) - t;
147
- }, y = "cursor-pointer border border-transparent data-[selected=true]:border-border", W = ({
148
- basePath: o,
149
- searchResults: n,
150
- searchTerm: t,
151
- onClose: s,
152
- maxSubResults: a = 4
82
+ ) - s;
83
+ }, v = "cursor-pointer border border-transparent data-[selected=true]:border-border", W = ({
84
+ basePath: r,
85
+ searchResults: a,
86
+ searchTerm: s,
87
+ onClose: n,
88
+ maxSubResults: c = 4
153
89
  }) => {
154
- const l = H(), i = C(null);
155
- T(() => {
156
- requestIdleCallback(() => {
90
+ const o = H(), i = E(null);
91
+ P(() => {
92
+ s && requestAnimationFrame(() => {
157
93
  i.current?.scrollTo({ top: 0 });
158
94
  });
159
- }, [t]);
160
- const d = (r) => o && r.startsWith(o) ? k(r.slice(o.length)) : r;
161
- return /* @__PURE__ */ e.jsxs($, { className: "max-h-[450px]", ref: i, children: [
162
- t && n.length > 0 && /* @__PURE__ */ e.jsx(
163
- b,
95
+ }, [s]);
96
+ const m = (t) => r && t.startsWith(r) ? C(t.slice(r.length)) : t;
97
+ return /* @__PURE__ */ e.jsxs(O, { className: "max-h-[450px]", ref: i, children: [
98
+ s && a.length > 0 && /* @__PURE__ */ e.jsx(
99
+ S,
164
100
  {
165
101
  className: "text-sm text-muted-foreground",
166
- heading: `${n.length} results for "${t}"`
102
+ heading: `${a.length} results for "${s}"`
167
103
  }
168
104
  ),
169
- t && n.map((r) => /* @__PURE__ */ e.jsxs(
170
- b,
105
+ s && a.map((t) => /* @__PURE__ */ e.jsxs(
106
+ S,
171
107
  {
172
108
  children: [
173
109
  /* @__PURE__ */ e.jsx(
174
- f,
110
+ N,
175
111
  {
176
112
  asChild: !0,
177
- value: `${r.meta.title}-${r.url}`,
178
- className: y,
113
+ value: `${t.meta.title}-${t.url}`,
114
+ className: v,
179
115
  onSelect: () => {
180
- l(d(r.url)), s();
116
+ o(m(t.url)), n();
181
117
  },
182
- children: /* @__PURE__ */ e.jsxs(p, { to: d(r.url), children: [
183
- r.meta.section === "openapi" ? /* @__PURE__ */ e.jsx(A, {}) : /* @__PURE__ */ e.jsx(P, {}),
184
- r.meta.title
118
+ children: /* @__PURE__ */ e.jsxs(k, { to: m(t.url), children: [
119
+ t.meta.section === "openapi" ? /* @__PURE__ */ e.jsx(q, {}) : /* @__PURE__ */ e.jsx(I, {}),
120
+ t.meta.category && /* @__PURE__ */ e.jsxs("span", { className: "text-muted-foreground", children: [
121
+ t.meta.category,
122
+ " ›",
123
+ " "
124
+ ] }),
125
+ t.meta.title
185
126
  ] })
186
127
  }
187
128
  ),
188
- r.sub_results.sort(Q).slice(0, a).map((c) => /* @__PURE__ */ e.jsx(
189
- f,
129
+ t.sub_results.sort(Q).slice(0, c).map((l) => /* @__PURE__ */ e.jsx(
130
+ N,
190
131
  {
191
132
  asChild: !0,
192
- value: `sub-${r.meta.title}-${c.url}`,
193
- className: y,
133
+ value: `sub-${t.meta.title}-${l.url}`,
134
+ className: v,
194
135
  onSelect: () => {
195
- l(d(c.url)), s();
136
+ o(m(l.url)), n();
196
137
  },
197
- children: /* @__PURE__ */ e.jsx(p, { to: d(c.url), onClick: s, children: /* @__PURE__ */ e.jsxs("div", { className: "flex flex-col items-start gap-2 ms-2.5 ps-5 border-l border-muted-foreground/50", children: [
198
- /* @__PURE__ */ e.jsx("span", { className: "font-bold", children: c.title }),
138
+ children: /* @__PURE__ */ e.jsx(k, { to: m(l.url), onClick: n, children: /* @__PURE__ */ e.jsxs("div", { className: "flex flex-col items-start gap-2 ms-2.5 ps-5 border-l border-muted-foreground/50", children: [
139
+ /* @__PURE__ */ e.jsx("span", { className: "font-bold", children: l.title }),
199
140
  /* @__PURE__ */ e.jsx(
200
141
  "span",
201
142
  {
202
- className: "text-[13px] [&_mark]:bg-primary [&_mark]:text-primary-foreground",
203
- dangerouslySetInnerHTML: { __html: c.excerpt }
143
+ className: "line-clamp-2 text-[13px] [&_mark]:bg-primary [&_mark]:text-primary-foreground",
144
+ dangerouslySetInnerHTML: { __html: l.excerpt }
204
145
  }
205
146
  )
206
147
  ] }) })
207
148
  },
208
- `sub-${r.meta.title}-${c.url}`
149
+ `sub-${t.meta.title}-${l.url}`
209
150
  ))
210
151
  ]
211
152
  },
212
- [r.meta.title ?? r.excerpt, r.url].join("-")
153
+ [t.meta.title ?? t.excerpt, t.url].join("-")
213
154
  ))
214
155
  ] });
215
- }, x = {
156
+ };
157
+ A(() => import("./IndexingDialog-B5zCiUKr.js"));
158
+ const x = {
216
159
  // Slightly lower than default because API docs tend to have repetitive terms (parameter names, HTTP methods, etc.)
217
160
  termFrequency: 0.8,
218
161
  // Lower than default because API documentation pages tend to be longer due to comprehensive endpoint documentation
@@ -221,104 +164,119 @@ const Q = (o, n) => {
221
164
  termSimilarity: 1.2,
222
165
  // Slightly lower than default because API docs might have legitimate repetition of terms
223
166
  termSaturation: 1.2
224
- }, Z = (o) => import(
167
+ }, Z = (r) => import(
225
168
  /* @vite-ignore */
226
- k(o, "/pagefind/pagefind.js")
227
- ), J = (o) => {
169
+ C(r, "/pagefind/pagefind.js")
170
+ ), J = (r) => {
228
171
  const {
229
- options: { basePath: n }
230
- } = _(), { data: t, ...s } = j({
231
- queryKey: ["pagefind", o.ranking],
172
+ options: { basePath: a }
173
+ } = _(), { data: s, ...n } = w({
174
+ queryKey: ["pagefind", r.ranking],
232
175
  retry: !1,
233
176
  queryFn: async () => {
234
- const a = await Z(n);
235
- return await a.init(), await a.options({
177
+ const c = await Z(a);
178
+ return await c.init(), await c.options({
236
179
  ranking: {
237
- termFrequency: o.ranking?.termFrequency ?? x.termFrequency,
238
- pageLength: o.ranking?.pageLength ?? x.pageLength,
239
- termSimilarity: o.ranking?.termSimilarity ?? x.termSimilarity,
240
- termSaturation: o.ranking?.termSaturation ?? x.termSaturation
180
+ termFrequency: r.ranking?.termFrequency ?? x.termFrequency,
181
+ pageLength: r.ranking?.pageLength ?? x.pageLength,
182
+ termSimilarity: r.ranking?.termSimilarity ?? x.termSimilarity,
183
+ termSaturation: r.ranking?.termSaturation ?? x.termSaturation
241
184
  }
242
- }), a;
185
+ }), c;
243
186
  },
244
187
  enabled: typeof window < "u"
245
188
  });
246
- return s.isError && s.error.message !== "NOT_BUILT_YET" && console.error(s.error), { ...s, pagefind: t };
189
+ return n.isError && n.error.message !== "NOT_BUILT_YET" && console.error(n.error), { ...n, pagefind: s };
247
190
  }, X = ({
248
- isOpen: o,
249
- onClose: n,
250
- options: t
191
+ isOpen: r,
192
+ onClose: a,
193
+ options: s
251
194
  }) => {
252
- const { pagefind: s, error: a, isError: l } = J(t), [i, d] = E(""), r = N(), c = _(), u = C(null), { data: S } = j({
253
- queryKey: ["pagefind-search", i, r.isAuthenticated],
195
+ const { pagefind: n, error: c, isError: o } = J(s), [i, m] = y(""), [t, l] = y(""), g = T(), j = _(), b = E(null), { data: u } = w({
196
+ queryKey: ["pagefind-search", i, g.isAuthenticated],
254
197
  queryFn: async () => {
255
- const v = r.isAuthenticated ? void 0 : { not: { section: G } }, g = await s?.search(i, { filters: v });
256
- return g ? V({ search: g, options: t, auth: r, context: c }) : [];
198
+ const d = g.isAuthenticated ? void 0 : { not: { section: U } }, f = await n?.search(i, { filters: d });
199
+ return f ? Y({ search: f, options: s, auth: g, context: j }) : [];
257
200
  },
258
- placeholderData: L,
259
- enabled: !!s && !!i
201
+ placeholderData: $,
202
+ enabled: !!n && !!i
260
203
  });
261
- return /* @__PURE__ */ e.jsxs(
262
- D,
204
+ return D(() => {
205
+ if (!u?.length) return;
206
+ const d = u.at(0);
207
+ if (!d) return;
208
+ const f = `${d.meta.title}-${d.url}`;
209
+ l(f);
210
+ }, [u]), /* @__PURE__ */ e.jsxs(
211
+ V,
263
212
  {
264
- command: { shouldFilter: !1 },
213
+ command: {
214
+ shouldFilter: !1,
215
+ loop: !0,
216
+ value: t,
217
+ onValueChange: l
218
+ },
265
219
  content: { className: "max-w-[750px]" },
266
- open: o,
267
- onOpenChange: n,
220
+ open: r,
221
+ onOpenChange: a,
268
222
  children: [
269
- /* @__PURE__ */ e.jsx(I, { children: /* @__PURE__ */ e.jsx(U, { children: "Search" }) }),
223
+ /* @__PURE__ */ e.jsx(F, { children: /* @__PURE__ */ e.jsx(G, { children: "Search" }) }),
270
224
  /* @__PURE__ */ e.jsx(
271
- B,
225
+ z,
272
226
  {
273
- ref: u,
227
+ ref: b,
274
228
  placeholder: "Search...",
275
229
  value: i,
276
- onValueChange: d,
277
- disabled: l
230
+ onValueChange: m,
231
+ disabled: o
278
232
  }
279
233
  ),
280
- /* @__PURE__ */ e.jsx(O, { children: i ? /* @__PURE__ */ e.jsxs("div", { className: "flex flex-col items-center", children: [
234
+ /* @__PURE__ */ e.jsx(K, { children: i ? /* @__PURE__ */ e.jsxs("div", { className: "flex flex-col items-center", children: [
281
235
  "No results found.",
282
236
  /* @__PURE__ */ e.jsx(
283
- R,
237
+ B,
284
238
  {
285
239
  variant: "link",
286
240
  onClick: () => {
287
- d(""), u.current?.focus();
241
+ m(""), b.current?.focus();
288
242
  },
289
243
  children: "Clear search"
290
244
  }
291
245
  )
292
246
  ] }) : "Start typing to search" }),
293
- l ? /* @__PURE__ */ e.jsx("div", { className: "p-4 text-sm", children: a.message === "NOT_BUILT_YET" ? /* @__PURE__ */ e.jsxs(M, { type: "info", children: [
294
- "Search is currently not available in development mode by default.",
295
- /* @__PURE__ */ e.jsx("br", {}),
296
- "To still use search in development, run ",
297
- /* @__PURE__ */ e.jsx("code", { children: "zudoku build" }),
298
- " ",
299
- "and copy the ",
300
- /* @__PURE__ */ e.jsx("code", { children: "dist/pagefind" }),
301
- " directory to your",
302
- " ",
303
- /* @__PURE__ */ e.jsx("code", { children: "public" }),
304
- " directory."
305
- ] }) : "An error occurred while loading search." }) : /* @__PURE__ */ e.jsx(
306
- W,
307
- {
308
- basePath: c.options.basePath,
309
- searchResults: S ?? [],
310
- searchTerm: i,
311
- onClose: n,
312
- maxSubResults: t.maxSubResults
313
- }
314
- )
247
+ o && c.message !== "NOT_BUILT_YET" ? /* @__PURE__ */ e.jsx("div", { className: "p-4 text-sm", children: "An error occurred while loading search." }) : /* @__PURE__ */ e.jsxs(e.Fragment, { children: [
248
+ /* @__PURE__ */ e.jsx(
249
+ W,
250
+ {
251
+ basePath: j.options.basePath,
252
+ searchResults: u ?? [],
253
+ searchTerm: i,
254
+ onClose: a,
255
+ maxSubResults: s.maxSubResults
256
+ }
257
+ ),
258
+ /* @__PURE__ */ e.jsxs("div", { className: "flex justify-between p-2 items-center", children: [
259
+ /* @__PURE__ */ e.jsxs("div", { className: "flex items-center text-xs text-muted-foreground", children: [
260
+ /* @__PURE__ */ e.jsxs(p, { className: "ms-0 me-1", children: [
261
+ /* @__PURE__ */ e.jsx(h, { children: "↑" }),
262
+ /* @__PURE__ */ e.jsx(h, { children: "↓" })
263
+ ] }),
264
+ "Navigate",
265
+ /* @__PURE__ */ e.jsx(p, { className: "ms-4 me-1", children: /* @__PURE__ */ e.jsx(h, { children: "↵" }) }),
266
+ "Select",
267
+ /* @__PURE__ */ e.jsx(p, { className: "ms-4 me-1", children: /* @__PURE__ */ e.jsx(h, { children: "Esc" }) }),
268
+ "Close dialog"
269
+ ] }),
270
+ !1
271
+ ] })
272
+ ] })
315
273
  ]
316
274
  }
317
275
  );
318
- }, me = (o) => ({
319
- renderSearch: ({ isOpen: n, onClose: t }) => /* @__PURE__ */ e.jsx(w, { children: /* @__PURE__ */ e.jsx(X, { isOpen: n, onClose: t, options: o }) })
276
+ }, ue = (r) => ({
277
+ renderSearch: ({ isOpen: a, onClose: s }) => /* @__PURE__ */ e.jsx(R, { children: /* @__PURE__ */ e.jsx(X, { isOpen: a, onClose: s, options: r }) })
320
278
  });
321
279
  export {
322
- me as pagefindSearchPlugin
280
+ ue as pagefindSearchPlugin
323
281
  };
324
282
  //# sourceMappingURL=zudoku.plugin-search-pagefind.js.map
@@ -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:\n \"text-gray-600 dark:text-zinc-300 [&_a]:hover:text-gray-700 [&_a]:dark:hover:text-zinc-400\",\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:\n \"text-green-600 dark:text-green-50 [&_a]:hover:text-green-700 [&_a]:dark:hover:text-green-300\",\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:\n \"text-blue-600 dark:text-blue-100 [&_a]:hover:text-blue-800 [&_a]:dark:hover:text-blue-300\",\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:\n \"text-yellow-700 dark:text-yellow-200 [&_a]:hover:text-yellow-800 [&_a]:dark:hover:text-yellow-300\",\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:\n \"text-rose-700 dark:text-rose-100 [&_a]:hover:text-rose-800 [&_a]:dark:hover:text-rose-300\",\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 } 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 type { PagefindSearchFragment, PagefindSubResult } 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 // biome-ignore lint/correctness/useExhaustiveDependencies: Only scroll to top when search term changes\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 // biome-ignore lint/security/noDangerouslySetInnerHtml: Pagefind provides sanitized HTML\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 // biome-ignore lint/suspicious/noConsole: Logging allowed here\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>zudoku build</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/Kbd.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 { cn } from \"./util.js\";\n\nfunction Kbd({ className, ...props }: React.ComponentProps<\"kbd\">) {\n return (\n <kbd\n data-slot=\"kbd\"\n className={cn(\n \"bg-muted text-muted-foreground pointer-events-none inline-flex h-5 w-fit min-w-5 items-center justify-center gap-1 rounded-sm px-1 font-sans text-xs font-medium select-none\",\n \"[&_svg:not([class*='size-'])]:size-3\",\n \"[[data-slot=tooltip-content]_&]:bg-background/20 [[data-slot=tooltip-content]_&]:text-background dark:[[data-slot=tooltip-content]_&]:bg-background/10\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction KbdGroup({ className, ...props }: React.ComponentProps<\"kbd\">) {\n return (\n <kbd\n data-slot=\"kbd-group\"\n className={cn(\"inline-flex items-center gap-1\", className)}\n {...props}\n />\n );\n}\n\nexport { Kbd, KbdGroup };\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 } 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 type { PagefindSearchFragment, PagefindSubResult } 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 if (!searchTerm) return;\n requestAnimationFrame(() => {\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.category && (\n <span className=\"text-muted-foreground\">\n {result.meta.category} &rsaquo;{\" \"}\n </span>\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=\"line-clamp-2 text-[13px] [&_mark]:bg-primary [&_mark]:text-primary-foreground\"\n // biome-ignore lint/security/noDangerouslySetInnerHtml: Pagefind provides sanitized HTML\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 { ListPlusIcon } from \"lucide-react\";\nimport { lazy, useEffect, useRef, useState } from \"react\";\nimport { Button } from \"zudoku/ui/Button.js\";\nimport {\n CommandDialog,\n CommandEmpty,\n CommandInput,\n} from \"zudoku/ui/Command.js\";\nimport { DialogTitle } from \"zudoku/ui/Dialog.js\";\nimport { Kbd, KbdGroup } from \"zudoku/ui/Kbd.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 IndexingDialog = lazy(() => import(\"./IndexingDialog.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 // biome-ignore lint/suspicious/noConsole: Logging allowed here\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 [selectedValue, setSelectedValue] = useState<string>(\"\");\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 useEffect(() => {\n if (!searchResults?.length) return;\n\n const firstResult = searchResults.at(0);\n if (!firstResult) return;\n\n const firstValue = `${firstResult.meta.title}-${firstResult.url}`;\n setSelectedValue(firstValue);\n }, [searchResults]);\n\n return (\n <CommandDialog\n command={{\n shouldFilter: false,\n loop: true,\n value: selectedValue,\n onValueChange: setSelectedValue,\n }}\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 && error.message !== \"NOT_BUILT_YET\" ? (\n <div className=\"p-4 text-sm\">\n An error occurred while loading search.\n </div>\n ) : (\n <>\n <ResultList\n basePath={context.options.basePath}\n searchResults={searchResults ?? []}\n searchTerm={searchTerm}\n onClose={onClose}\n maxSubResults={options.maxSubResults}\n />\n <div className=\"flex justify-between p-2 items-center\">\n <div className=\"flex items-center text-xs text-muted-foreground\">\n <KbdGroup className=\"ms-0 me-1\">\n <Kbd>↑</Kbd>\n <Kbd>↓</Kbd>\n </KbdGroup>\n Navigate\n <KbdGroup className=\"ms-4 me-1\">\n <Kbd>↵</Kbd>\n </KbdGroup>\n Select\n <KbdGroup className=\"ms-4 me-1\">\n <Kbd>Esc</Kbd>\n </KbdGroup>\n Close dialog\n </div>\n {import.meta.env.DEV && (\n <IndexingDialog>\n <Button\n variant=\"outline\"\n className=\"h-7 text-xs text-muted-foreground\"\n >\n <ListPlusIcon />\n Build Search Index\n </Button>\n </IndexingDialog>\n )}\n </div>\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":["Kbd","className","props","jsx","cn","KbdGroup","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","jsxs","CommandList","CommandGroup","CommandItem","Link","BracketsIcon","FileTextIcon","subResult","lazy","DEFAULT_RANKING","importPagefind","usePagefind","useZudoku","pagefind","useQuery","PagefindSearch","isOpen","error","isError","setSearchTerm","useState","selectedValue","setSelectedValue","useAuthState","inputRef","filters","SEARCH_PROTECTED_SECTION","keepPreviousData","useEffect","firstResult","firstValue","CommandDialog","VisuallyHidden","DialogTitle","CommandInput","CommandEmpty","Button","Fragment","pagefindSearchPlugin","ClientOnly"],"mappings":"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"}