zudoku 0.66.5 → 0.66.7

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 (153) hide show
  1. package/dist/app/main.d.ts +6 -6
  2. package/dist/config/validators/InputNavigationSchema.d.ts +2 -0
  3. package/dist/config/validators/InputNavigationSchema.js +1 -0
  4. package/dist/config/validators/InputNavigationSchema.js.map +1 -1
  5. package/dist/config/validators/NavigationSchema.js +6 -1
  6. package/dist/config/validators/NavigationSchema.js.map +1 -1
  7. package/dist/flat-config.d.ts +1 -0
  8. package/dist/index.d.ts +2 -1
  9. package/dist/index.js +2 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/lib/authentication/providers/auth0.js +11 -7
  12. package/dist/lib/authentication/providers/auth0.js.map +1 -1
  13. package/dist/lib/authentication/providers/clerk.js +0 -22
  14. package/dist/lib/authentication/providers/clerk.js.map +1 -1
  15. package/dist/lib/authentication/providers/supabase.js +6 -15
  16. package/dist/lib/authentication/providers/supabase.js.map +1 -1
  17. package/dist/lib/components/Pagination.js +2 -2
  18. package/dist/lib/components/Pagination.js.map +1 -1
  19. package/dist/lib/components/index.d.ts +3 -0
  20. package/dist/lib/components/index.js +4 -0
  21. package/dist/lib/components/index.js.map +1 -1
  22. package/dist/lib/components/navigation/NavigationItem.js +2 -2
  23. package/dist/lib/components/navigation/NavigationItem.js.map +1 -1
  24. package/dist/lib/core/react-query.d.ts +1 -0
  25. package/dist/lib/core/react-query.js +2 -0
  26. package/dist/lib/core/react-query.js.map +1 -0
  27. package/dist/lib/oas/graphql/circular.d.ts +2 -0
  28. package/dist/lib/oas/graphql/circular.js +32 -10
  29. package/dist/lib/oas/graphql/circular.js.map +1 -1
  30. package/dist/lib/oas/graphql/circular.test.d.ts +1 -0
  31. package/dist/lib/oas/graphql/circular.test.js +152 -0
  32. package/dist/lib/oas/graphql/circular.test.js.map +1 -0
  33. package/dist/lib/plugins/openapi/OperationList.js +5 -1
  34. package/dist/lib/plugins/openapi/OperationList.js.map +1 -1
  35. package/dist/lib/plugins/openapi/schema/utils.js +11 -3
  36. package/dist/lib/plugins/openapi/schema/utils.js.map +1 -1
  37. package/dist/vite/api/SchemaManager.d.ts +1 -0
  38. package/dist/vite/api/SchemaManager.js +9 -3
  39. package/dist/vite/api/SchemaManager.js.map +1 -1
  40. package/dist/vite/config.js +2 -0
  41. package/dist/vite/config.js.map +1 -1
  42. package/dist/vite/prerender/utils.js +9 -3
  43. package/dist/vite/prerender/utils.js.map +1 -1
  44. package/lib/{ClaudeLogo-ByzA8TYR.js → ClaudeLogo-DHxJUhN_.js} +21 -21
  45. package/lib/ClaudeLogo-DHxJUhN_.js.map +1 -0
  46. package/lib/HydrationBoundary-CNF2ZV3E.js +601 -0
  47. package/lib/HydrationBoundary-CNF2ZV3E.js.map +1 -0
  48. package/lib/Input-Cx-GeKoF.js +22 -0
  49. package/lib/Input-Cx-GeKoF.js.map +1 -0
  50. package/lib/{MdxPage-Bh5YNRV9.js → MdxPage-CD36PJ17.js} +8 -8
  51. package/lib/{MdxPage-Bh5YNRV9.js.map → MdxPage-CD36PJ17.js.map} +1 -1
  52. package/lib/{Mermaid-CGRoylZf.js → Mermaid-Koc3z8mU.js} +3 -3
  53. package/lib/{Mermaid-CGRoylZf.js.map → Mermaid-Koc3z8mU.js.map} +1 -1
  54. package/lib/{OAuthErrorPage-CsTKz5hX.js → OAuthErrorPage-4mN5DA86.js} +23 -22
  55. package/lib/{OAuthErrorPage-CsTKz5hX.js.map → OAuthErrorPage-4mN5DA86.js.map} +1 -1
  56. package/lib/{OasProvider-BBAbJiYa.js → OasProvider-DSe-hk5Y.js} +4 -4
  57. package/lib/{OasProvider-BBAbJiYa.js.map → OasProvider-DSe-hk5Y.js.map} +1 -1
  58. package/lib/{OperationList-DUxrNisd.js → OperationList-CaknPbvq.js} +148 -144
  59. package/lib/{OperationList-DUxrNisd.js.map → OperationList-CaknPbvq.js.map} +1 -1
  60. package/lib/{RouteGuard-CIN9Ou-r.js → RouteGuard--A04ESy8.js} +4 -4
  61. package/lib/{RouteGuard-CIN9Ou-r.js.map → RouteGuard--A04ESy8.js.map} +1 -1
  62. package/lib/{SchemaList-BbnkfjIe.js → SchemaList-Dw3-CJPb.js} +7 -7
  63. package/lib/{SchemaList-BbnkfjIe.js.map → SchemaList-Dw3-CJPb.js.map} +1 -1
  64. package/lib/{SchemaView-BrUf6_nP.js → SchemaView-DyJkiQkD.js} +94 -91
  65. package/lib/SchemaView-DyJkiQkD.js.map +1 -0
  66. package/lib/{SignUp-AlaaduyY.js → SignUp-DRvN-8cq.js} +4 -4
  67. package/lib/{SignUp-AlaaduyY.js.map → SignUp-DRvN-8cq.js.map} +1 -1
  68. package/lib/{SyntaxHighlight-DveJcTOQ.js → SyntaxHighlight-klTH8c6-.js} +372 -363
  69. package/lib/SyntaxHighlight-klTH8c6-.js.map +1 -0
  70. package/lib/{Toc-B4ShtN-I.js → Toc-PbuF-u9x.js} +2 -2
  71. package/lib/{Toc-B4ShtN-I.js.map → Toc-PbuF-u9x.js.map} +1 -1
  72. package/lib/ZudokuContext-BZB1TWdT.js +387 -0
  73. package/lib/ZudokuContext-BZB1TWdT.js.map +1 -0
  74. package/lib/chunk-EPOLDU6W-C6C8jAwd.js +8558 -0
  75. package/lib/chunk-EPOLDU6W-C6C8jAwd.js.map +1 -0
  76. package/lib/{circular-CuSWVYOZ.js → circular-DFquXeY2.js} +771 -749
  77. package/lib/{circular-CuSWVYOZ.js.map → circular-DFquXeY2.js.map} +1 -1
  78. package/lib/{createServer-B1_RUTJP.js → createServer-BXZ0CAUn.js} +4 -4
  79. package/lib/{createServer-B1_RUTJP.js.map → createServer-BXZ0CAUn.js.map} +1 -1
  80. package/lib/{errors-iDfQAr_v.js → errors-rWHkzVTd.js} +2 -2
  81. package/lib/{errors-iDfQAr_v.js.map → errors-rWHkzVTd.js.map} +1 -1
  82. package/lib/{firebase-I54w2ZsH.js → firebase-BmGU1FuD.js} +18 -16
  83. package/lib/{firebase-I54w2ZsH.js.map → firebase-BmGU1FuD.js.map} +1 -1
  84. package/lib/{hook-BxWvqzB0.js → hook-BGlHBdET.js} +3 -3
  85. package/lib/{hook-BxWvqzB0.js.map → hook-BGlHBdET.js.map} +1 -1
  86. package/lib/{index-A5Cre871.js → index-BDsEwofZ.js} +1709 -1707
  87. package/lib/index-BDsEwofZ.js.map +1 -0
  88. package/lib/{index-B4puReRo.js → index-BQB9hb6n.js} +152 -150
  89. package/lib/{index-B4puReRo.js.map → index-BQB9hb6n.js.map} +1 -1
  90. package/lib/{index-CjTisMeX.js → index-DBjOT2H1.js} +4 -4
  91. package/lib/{index-CjTisMeX.js.map → index-DBjOT2H1.js.map} +1 -1
  92. package/lib/{index-Dbrv6d94.js → index-DRBOFufT.js} +2 -2
  93. package/lib/{index-Dbrv6d94.js.map → index-DRBOFufT.js.map} +1 -1
  94. package/lib/{index.esm-BxIXRKtj.js → index.esm-Cx8B1YJQ.js} +2 -2
  95. package/lib/index.esm-Cx8B1YJQ.js.map +1 -0
  96. package/lib/{mutation-Cq0wKBqW.js → mutation-BISOc7OM.js} +2 -2
  97. package/lib/{mutation-Cq0wKBqW.js.map → mutation-BISOc7OM.js.map} +1 -1
  98. package/lib/ui/SyntaxHighlight.js +2 -2
  99. package/lib/{Input-nskrp_mj.js → useMutation-CFMGlAMW.js} +23 -40
  100. package/lib/useMutation-CFMGlAMW.js.map +1 -0
  101. package/lib/useSuspenseQuery-CSB_rVek.js +1226 -0
  102. package/lib/useSuspenseQuery-CSB_rVek.js.map +1 -0
  103. package/lib/zudoku.__internal.js +929 -1458
  104. package/lib/zudoku.__internal.js.map +1 -1
  105. package/lib/zudoku.auth-auth0.js +16 -16
  106. package/lib/zudoku.auth-auth0.js.map +1 -1
  107. package/lib/zudoku.auth-azureb2c.js +4 -4
  108. package/lib/zudoku.auth-clerk.js +52 -75
  109. package/lib/zudoku.auth-clerk.js.map +1 -1
  110. package/lib/zudoku.auth-firebase.js +4 -4
  111. package/lib/zudoku.auth-openid.js +4 -4
  112. package/lib/zudoku.auth-supabase.js +31 -40
  113. package/lib/zudoku.auth-supabase.js.map +1 -1
  114. package/lib/zudoku.components.js +22 -19
  115. package/lib/zudoku.components.js.map +1 -1
  116. package/lib/zudoku.hooks.js +3 -3
  117. package/lib/zudoku.mermaid.js +3 -3
  118. package/lib/zudoku.plugin-api-catalog.js +7 -6
  119. package/lib/zudoku.plugin-api-catalog.js.map +1 -1
  120. package/lib/zudoku.plugin-api-keys.js +23 -21
  121. package/lib/zudoku.plugin-api-keys.js.map +1 -1
  122. package/lib/zudoku.plugin-custom-pages.js +1 -1
  123. package/lib/zudoku.plugin-markdown.js +1 -1
  124. package/lib/zudoku.plugin-openapi.js +3 -3
  125. package/lib/zudoku.plugin-redirect.js +1 -1
  126. package/lib/zudoku.plugin-search-pagefind.js +30 -29
  127. package/lib/zudoku.plugin-search-pagefind.js.map +1 -1
  128. package/lib/zudoku.react-query.js +440 -0
  129. package/lib/zudoku.react-query.js.map +1 -0
  130. package/lib/zudoku.router.js +1130 -1404
  131. package/lib/zudoku.router.js.map +1 -1
  132. package/package.json +14 -10
  133. package/src/lib/authentication/providers/auth0.tsx +15 -9
  134. package/src/lib/authentication/providers/clerk.tsx +0 -26
  135. package/src/lib/authentication/providers/supabase.tsx +6 -15
  136. package/src/lib/components/Pagination.tsx +4 -5
  137. package/src/lib/components/index.ts +4 -0
  138. package/src/lib/components/navigation/NavigationItem.tsx +9 -3
  139. package/src/lib/core/react-query.ts +1 -0
  140. package/src/lib/oas/graphql/circular.test.ts +186 -0
  141. package/src/lib/oas/graphql/circular.ts +49 -10
  142. package/src/lib/plugins/openapi/OperationList.tsx +6 -1
  143. package/src/lib/plugins/openapi/schema/utils.ts +15 -4
  144. package/lib/ClaudeLogo-ByzA8TYR.js.map +0 -1
  145. package/lib/Input-nskrp_mj.js.map +0 -1
  146. package/lib/SchemaView-BrUf6_nP.js.map +0 -1
  147. package/lib/SyntaxHighlight-DveJcTOQ.js.map +0 -1
  148. package/lib/ZudokuContext-CDJYKqMY.js +0 -1581
  149. package/lib/ZudokuContext-CDJYKqMY.js.map +0 -1
  150. package/lib/chunk-PVWAREVJ-ClM0m2aJ.js +0 -7965
  151. package/lib/chunk-PVWAREVJ-ClM0m2aJ.js.map +0 -1
  152. package/lib/index-A5Cre871.js.map +0 -1
  153. package/lib/index.esm-BxIXRKtj.js.map +0 -1
@@ -1,21 +1,22 @@
1
1
  import { j as e } from "./jsx-runtime-BzflLqGi.js";
2
2
  import { C as R } from "./ClientOnly-E7hGysn1.js";
3
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-CDJYKqMY.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-GUVe7pmt.js";
8
- import { C as O, a as S, b as N, c as V, d as z, e as K } from "./Command-N6VujV30.js";
9
- import { c as G } from "./Dialog-hlvmmQ_c.js";
10
- import { cn as L } from "./ui/util.js";
11
- import { S as U } from "./RouteGuard-CIN9Ou-r.js";
12
- import { u as H, L as k } from "./chunk-PVWAREVJ-ClM0m2aJ.js";
4
+ import { e as C, k as T } from "./useSuspenseQuery-CSB_rVek.js";
5
+ import { BracketsIcon as $, FileTextIcon as q } from "lucide-react";
6
+ import { useRef as _, useLayoutEffect as I, lazy as P, useState as y, useEffect as A } from "react";
7
+ import { B as D } from "./Button-GUVe7pmt.js";
8
+ import { C as B, a as S, b as N, c as O, d as V, e as z } from "./Command-N6VujV30.js";
9
+ import { c as K } from "./Dialog-hlvmmQ_c.js";
10
+ import { cn as w } from "./ui/util.js";
11
+ import { j as E, u as G, a as L } from "./ZudokuContext-BZB1TWdT.js";
12
+ import { S as U } from "./RouteGuard--A04ESy8.js";
13
+ import { u as H, L as k } from "./chunk-EPOLDU6W-C6C8jAwd.js";
13
14
  function h({ className: r, ...a }) {
14
15
  return /* @__PURE__ */ e.jsx(
15
16
  "kbd",
16
17
  {
17
18
  "data-slot": "kbd",
18
- className: L(
19
+ className: w(
19
20
  "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
21
  "[&_svg:not([class*='size-'])]:size-3",
21
22
  "[[data-slot=tooltip-content]_&]:bg-background/20 [[data-slot=tooltip-content]_&]:text-background dark:[[data-slot=tooltip-content]_&]:bg-background/10",
@@ -30,7 +31,7 @@ function p({ className: r, ...a }) {
30
31
  "kbd",
31
32
  {
32
33
  "data-slot": "kbd-group",
33
- className: L("inline-flex items-center gap-1", r),
34
+ className: w("inline-flex items-center gap-1", r),
34
35
  ...a
35
36
  }
36
37
  );
@@ -87,14 +88,14 @@ const Q = (r, a) => {
87
88
  onClose: n,
88
89
  maxSubResults: c = 4
89
90
  }) => {
90
- const o = H(), i = E(null);
91
- P(() => {
91
+ const o = H(), i = _(null);
92
+ I(() => {
92
93
  s && requestAnimationFrame(() => {
93
94
  i.current?.scrollTo({ top: 0 });
94
95
  });
95
96
  }, [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: [
97
+ const m = (t) => r && t.startsWith(r) ? E(t.slice(r.length)) : t;
98
+ return /* @__PURE__ */ e.jsxs(B, { className: "max-h-[450px]", ref: i, children: [
98
99
  s && a.length > 0 && /* @__PURE__ */ e.jsx(
99
100
  S,
100
101
  {
@@ -116,7 +117,7 @@ const Q = (r, a) => {
116
117
  o(m(t.url)), n();
117
118
  },
118
119
  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.section === "openapi" ? /* @__PURE__ */ e.jsx($, {}) : /* @__PURE__ */ e.jsx(q, {}),
120
121
  t.meta.category && /* @__PURE__ */ e.jsxs("span", { className: "text-muted-foreground", children: [
121
122
  t.meta.category,
122
123
  " ›",
@@ -154,7 +155,7 @@ const Q = (r, a) => {
154
155
  ))
155
156
  ] });
156
157
  };
157
- A(() => import("./IndexingDialog-D0YdGfbn.js"));
158
+ P(() => import("./IndexingDialog-D0YdGfbn.js"));
158
159
  const x = {
159
160
  // Slightly lower than default because API docs tend to have repetitive terms (parameter names, HTTP methods, etc.)
160
161
  termFrequency: 0.8,
@@ -166,11 +167,11 @@ const x = {
166
167
  termSaturation: 1.2
167
168
  }, Z = (r) => import(
168
169
  /* @vite-ignore */
169
- C(r, "/pagefind/pagefind.js")
170
+ E(r, "/pagefind/pagefind.js")
170
171
  ), J = (r) => {
171
172
  const {
172
173
  options: { basePath: a }
173
- } = _(), { data: s, ...n } = w({
174
+ } = L(), { data: s, ...n } = C({
174
175
  queryKey: ["pagefind", r.ranking],
175
176
  retry: !1,
176
177
  queryFn: async () => {
@@ -192,23 +193,23 @@ const x = {
192
193
  onClose: a,
193
194
  options: s
194
195
  }) => {
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
+ const { pagefind: n, error: c, isError: o } = J(s), [i, m] = y(""), [t, l] = y(""), g = G(), j = L(), b = _(null), { data: u } = C({
196
197
  queryKey: ["pagefind-search", i, g.isAuthenticated],
197
198
  queryFn: async () => {
198
199
  const d = g.isAuthenticated ? void 0 : { not: { section: U } }, f = await n?.search(i, { filters: d });
199
200
  return f ? Y({ search: f, options: s, auth: g, context: j }) : [];
200
201
  },
201
- placeholderData: $,
202
+ placeholderData: T,
202
203
  enabled: !!n && !!i
203
204
  });
204
- return D(() => {
205
+ return A(() => {
205
206
  if (!u?.length) return;
206
207
  const d = u.at(0);
207
208
  if (!d) return;
208
209
  const f = `${d.meta.title}-${d.url}`;
209
210
  l(f);
210
211
  }, [u]), /* @__PURE__ */ e.jsxs(
211
- V,
212
+ O,
212
213
  {
213
214
  command: {
214
215
  shouldFilter: !1,
@@ -220,9 +221,9 @@ const x = {
220
221
  open: r,
221
222
  onOpenChange: a,
222
223
  children: [
223
- /* @__PURE__ */ e.jsx(F, { children: /* @__PURE__ */ e.jsx(G, { children: "Search" }) }),
224
+ /* @__PURE__ */ e.jsx(F, { children: /* @__PURE__ */ e.jsx(K, { children: "Search" }) }),
224
225
  /* @__PURE__ */ e.jsx(
225
- z,
226
+ V,
226
227
  {
227
228
  ref: b,
228
229
  placeholder: "Search...",
@@ -231,10 +232,10 @@ const x = {
231
232
  disabled: o
232
233
  }
233
234
  ),
234
- /* @__PURE__ */ e.jsx(K, { children: i ? /* @__PURE__ */ e.jsxs("div", { className: "flex flex-col items-center", children: [
235
+ /* @__PURE__ */ e.jsx(z, { children: i ? /* @__PURE__ */ e.jsxs("div", { className: "flex flex-col items-center", children: [
235
236
  "No results found.",
236
237
  /* @__PURE__ */ e.jsx(
237
- B,
238
+ D,
238
239
  {
239
240
  variant: "link",
240
241
  onClick: () => {
@@ -273,10 +274,10 @@ const x = {
273
274
  ]
274
275
  }
275
276
  );
276
- }, ue = (r) => ({
277
+ }, fe = (r) => ({
277
278
  renderSearch: ({ isOpen: a, onClose: s }) => /* @__PURE__ */ e.jsx(R, { children: /* @__PURE__ */ e.jsx(X, { isOpen: a, onClose: s, options: r }) })
278
279
  });
279
280
  export {
280
- ue as pagefindSearchPlugin
281
+ fe as pagefindSearchPlugin
281
282
  };
282
283
  //# sourceMappingURL=zudoku.plugin-search-pagefind.js.map
@@ -1 +1 @@
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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"}
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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"}