zudoku 0.53.2 → 0.53.4

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 (115) hide show
  1. package/dist/app/main.js +3 -9
  2. package/dist/app/main.js.map +1 -1
  3. package/dist/lib/components/Banner.js +1 -1
  4. package/dist/lib/components/Banner.js.map +1 -1
  5. package/dist/lib/components/CategoryHeading.js +1 -1
  6. package/dist/lib/components/CategoryHeading.js.map +1 -1
  7. package/dist/lib/components/Header.js +1 -1
  8. package/dist/lib/components/Header.js.map +1 -1
  9. package/dist/lib/components/Pagination.js +1 -1
  10. package/dist/lib/components/Pagination.js.map +1 -1
  11. package/dist/lib/components/StatusPage.js +4 -0
  12. package/dist/lib/components/StatusPage.js.map +1 -1
  13. package/dist/lib/components/navigation/NavigationWrapper.js +1 -1
  14. package/dist/lib/components/navigation/NavigationWrapper.js.map +1 -1
  15. package/dist/lib/plugins/markdown/MdxPage.js +1 -1
  16. package/dist/lib/plugins/markdown/MdxPage.js.map +1 -1
  17. package/dist/lib/plugins/openapi/OperationList.js +2 -1
  18. package/dist/lib/plugins/openapi/OperationList.js.map +1 -1
  19. package/dist/lib/plugins/search-inkeep/index.d.ts +5 -22
  20. package/dist/lib/plugins/search-inkeep/index.js +35 -29
  21. package/dist/lib/plugins/search-inkeep/index.js.map +1 -1
  22. package/dist/lib/plugins/search-inkeep/inkeep.d.ts +5 -21
  23. package/dist/lib/plugins/search-inkeep/inkeep.js +10 -19
  24. package/dist/lib/plugins/search-inkeep/inkeep.js.map +1 -1
  25. package/dist/lib/plugins/search-pagefind/PagefindSearch.js +1 -1
  26. package/dist/lib/plugins/search-pagefind/PagefindSearch.js.map +1 -1
  27. package/dist/lib/plugins/search-pagefind/ResultList.d.ts +1 -1
  28. package/dist/lib/plugins/search-pagefind/ResultList.js +12 -5
  29. package/dist/lib/plugins/search-pagefind/ResultList.js.map +1 -1
  30. package/dist/lib/ui/Alert.d.ts +1 -1
  31. package/dist/vite/build.js +7 -1
  32. package/dist/vite/build.js.map +1 -1
  33. package/dist/vite/plugin-mdx.js +2 -3
  34. package/dist/vite/plugin-mdx.js.map +1 -1
  35. package/lib/{Alert-CT_ViLrJ.js → Alert-SijAp9LN.js} +3 -3
  36. package/lib/Alert-SijAp9LN.js.map +1 -0
  37. package/lib/{MdxPage-8UuEK446.js → MdxPage-BFKqQsmK.js} +19 -19
  38. package/lib/{MdxPage-8UuEK446.js.map → MdxPage-BFKqQsmK.js.map} +1 -1
  39. package/lib/{OasProvider-BsWpguVO.js → OasProvider-Bdyvd6Ic.js} +2 -2
  40. package/lib/{OasProvider-BsWpguVO.js.map → OasProvider-Bdyvd6Ic.js.map} +1 -1
  41. package/lib/{OperationList-PnZbf3b2.js → OperationList-YZ7k-Rkt.js} +172 -172
  42. package/lib/{OperationList-PnZbf3b2.js.map → OperationList-YZ7k-Rkt.js.map} +1 -1
  43. package/lib/{Pagination-DY7gCrm4.js → Pagination-EViy7EHt.js} +9 -8
  44. package/lib/Pagination-EViy7EHt.js.map +1 -0
  45. package/lib/{RouteGuard-CbKd7_9h.js → RouteGuard-CX6A77iy.js} +2 -2
  46. package/lib/{RouteGuard-CbKd7_9h.js.map → RouteGuard-CX6A77iy.js.map} +1 -1
  47. package/lib/{SchemaList-D6k4DKWH.js → SchemaList--_f8Azv0.js} +8 -8
  48. package/lib/{SchemaList-D6k4DKWH.js.map → SchemaList--_f8Azv0.js.map} +1 -1
  49. package/lib/{SchemaView-BhgJ9WB8.js → SchemaView-7XWvSrbX.js} +4 -4
  50. package/lib/{SchemaView-BhgJ9WB8.js.map → SchemaView-7XWvSrbX.js.map} +1 -1
  51. package/lib/{SignUp-CpUD6DUM.js → SignUp-CXCezG-m.js} +3 -3
  52. package/lib/{SignUp-CpUD6DUM.js.map → SignUp-CXCezG-m.js.map} +1 -1
  53. package/lib/{Slot-DwZlQ-vX.js → Slot-tFjhrd8V.js} +14 -6
  54. package/lib/Slot-tFjhrd8V.js.map +1 -0
  55. package/lib/{SyntaxHighlight-CrjhGEwT.js → SyntaxHighlight-Bp_UsIXG.js} +754 -754
  56. package/lib/SyntaxHighlight-Bp_UsIXG.js.map +1 -0
  57. package/lib/{Toc-WCmwFkX-.js → Toc-Ck0YQtmd.js} +2 -2
  58. package/lib/{Toc-WCmwFkX-.js.map → Toc-Ck0YQtmd.js.map} +1 -1
  59. package/lib/{circular-BUMjK3JF.js → circular-BtKlhs07.js} +2 -2
  60. package/lib/{circular-BUMjK3JF.js.map → circular-BtKlhs07.js.map} +1 -1
  61. package/lib/{createServer-BPz8ZCrd.js → createServer-Di2U1Dg0.js} +4 -4
  62. package/lib/{createServer-BPz8ZCrd.js.map → createServer-Di2U1Dg0.js.map} +1 -1
  63. package/lib/{errors-DY-qOx9n.js → errors-Dv_yAK6M.js} +4 -4
  64. package/lib/{errors-DY-qOx9n.js.map → errors-Dv_yAK6M.js.map} +1 -1
  65. package/lib/{hook-Bd0yS8M0.js → hook-CZjW2buS.js} +420 -413
  66. package/lib/hook-CZjW2buS.js.map +1 -0
  67. package/lib/{index-dVBKCNMa.js → index-BTqwnlI5.js} +13 -13
  68. package/lib/{index-dVBKCNMa.js.map → index-BTqwnlI5.js.map} +1 -1
  69. package/lib/index-Bm35Tkgf.js +107 -0
  70. package/lib/index-Bm35Tkgf.js.map +1 -0
  71. package/lib/{index-CcV90rin.js → index-CeQqiMIG.js} +2 -2
  72. package/lib/{index-CcV90rin.js.map → index-CeQqiMIG.js.map} +1 -1
  73. package/lib/{index-C_xVKbf9.js → index-DKCEJ4Kd.js} +1056 -1040
  74. package/lib/index-DKCEJ4Kd.js.map +1 -0
  75. package/lib/ui/Alert.js.map +1 -1
  76. package/lib/ui/SyntaxHighlight.js +2 -2
  77. package/lib/zudoku.auth-auth0.js +1 -1
  78. package/lib/zudoku.auth-azureb2c.js +1553 -1556
  79. package/lib/zudoku.auth-azureb2c.js.map +1 -1
  80. package/lib/zudoku.auth-clerk.js +2 -2
  81. package/lib/zudoku.auth-openid.js +2 -2
  82. package/lib/zudoku.components.js +5 -5
  83. package/lib/zudoku.hooks.js +3 -3
  84. package/lib/zudoku.plugin-api-catalog.js +5 -5
  85. package/lib/zudoku.plugin-api-keys.js +3 -3
  86. package/lib/zudoku.plugin-custom-pages.js +1 -1
  87. package/lib/zudoku.plugin-markdown.js +1 -1
  88. package/lib/zudoku.plugin-openapi.js +2 -2
  89. package/lib/zudoku.plugin-search-inkeep.js +54 -57
  90. package/lib/zudoku.plugin-search-inkeep.js.map +1 -1
  91. package/lib/zudoku.plugin-search-pagefind.js +107 -103
  92. package/lib/zudoku.plugin-search-pagefind.js.map +1 -1
  93. package/package.json +13 -12
  94. package/src/app/main.tsx +6 -14
  95. package/src/lib/components/Banner.tsx +0 -1
  96. package/src/lib/components/CategoryHeading.tsx +4 -1
  97. package/src/lib/components/Header.tsx +4 -1
  98. package/src/lib/components/Pagination.tsx +1 -0
  99. package/src/lib/components/StatusPage.tsx +5 -0
  100. package/src/lib/components/navigation/NavigationWrapper.tsx +4 -1
  101. package/src/lib/plugins/markdown/MdxPage.tsx +1 -1
  102. package/src/lib/plugins/openapi/OperationList.tsx +3 -1
  103. package/src/lib/plugins/search-inkeep/index.tsx +54 -58
  104. package/src/lib/plugins/search-inkeep/inkeep.ts +19 -21
  105. package/src/lib/plugins/search-pagefind/PagefindSearch.tsx +1 -0
  106. package/src/lib/plugins/search-pagefind/ResultList.tsx +13 -4
  107. package/src/lib/ui/Alert.tsx +1 -1
  108. package/lib/Alert-CT_ViLrJ.js.map +0 -1
  109. package/lib/Pagination-DY7gCrm4.js.map +0 -1
  110. package/lib/Slot-DwZlQ-vX.js.map +0 -1
  111. package/lib/SyntaxHighlight-CrjhGEwT.js.map +0 -1
  112. package/lib/hook-Bd0yS8M0.js.map +0 -1
  113. package/lib/index-C_xVKbf9.js.map +0 -1
  114. package/lib/index-ClhS5TxS.js +0 -107
  115. package/lib/index-ClhS5TxS.js.map +0 -1
@@ -1,14 +1,14 @@
1
1
  import { j as e } from "./jsx-runtime-C5mzlN2N.js";
2
- import { C as w } from "./ClientOnly-E7hGysn1.js";
3
- import { VisuallyHidden as v } from "@radix-ui/react-visually-hidden";
4
- import { u as I, d as k, l as j, m as N, j as L } from "./hook-Bd0yS8M0.js";
5
- import { useRef as C, useLayoutEffect as T, useState as E } from "react";
2
+ import { C as v } from "./ClientOnly-E7hGysn1.js";
3
+ import { VisuallyHidden as I } from "@radix-ui/react-visually-hidden";
4
+ import { j as k, u as N, d as j, l as C, m as L } from "./hook-CZjW2buS.js";
5
+ import { useRef as S, useLayoutEffect as T, useState as E } from "react";
6
6
  import { B as R } from "./Button-BE9IVkWV.js";
7
7
  import { ShieldAlertIcon as F, AlertTriangleIcon as q, InfoIcon as b, LightbulbIcon as z, BracketsIcon as A, FileTextIcon as P } from "lucide-react";
8
8
  import { c as u } from "./cn-wvCW-ho6.js";
9
- import { C as $, a as f, b as h, c as D, d as O, e as B } from "./Command-xsbs2uhf.js";
9
+ import { C as $, a as f, b as h, c as D, d as B, e as O } from "./Command-xsbs2uhf.js";
10
10
  import { b as U } from "./Dialog-CiIdyz6a.js";
11
- import { S as G } from "./RouteGuard-CbKd7_9h.js";
11
+ import { S as G } from "./RouteGuard-CX6A77iy.js";
12
12
  import { a as H, L as p } from "./chunk-DQRVZFIR-DHK7_Ilc.js";
13
13
  const K = {
14
14
  note: {
@@ -52,45 +52,45 @@ const K = {
52
52
  Icon: F
53
53
  }
54
54
  }, M = ({
55
- type: t,
55
+ type: o,
56
56
  children: n,
57
- title: o,
58
- className: l,
57
+ title: t,
58
+ className: s,
59
59
  icon: a = !0
60
60
  }) => {
61
- const { border: s, bg: r, iconColor: i, titleColor: c, textColor: d, Icon: m } = K[t];
61
+ const { border: l, bg: i, iconColor: d, titleColor: r, textColor: c, Icon: m } = K[o];
62
62
  return /* @__PURE__ */ e.jsxs(
63
63
  "div",
64
64
  {
65
65
  className: u(
66
66
  "not-prose rounded-md border p-4 text-md my-2",
67
67
  a && "grid grid-cols-[min-content_1fr] items-baseline grid-rows-[fit-content_1fr] gap-x-4 gap-y-2",
68
- !a && o && "flex flex-col gap-2",
68
+ !a && t && "flex flex-col gap-2",
69
69
  "[&_a]:underline [&_a]:decoration-current [&_a]:decoration-from-font [&_a]:underline-offset-4 hover:[&_a]:decoration-1",
70
70
  "[&_.code-block-wrapper]:border",
71
71
  "[&_ul]:list-disc [&_ol]:list-decimal [&_ul]:ps-4 [&_ul>li]:ps-1 [&_ul>li]:my-1",
72
- a && o && "items-center",
73
- s,
74
- r,
75
- l
72
+ a && t && "items-center",
73
+ l,
74
+ i,
75
+ s
76
76
  ),
77
77
  children: [
78
78
  a && /* @__PURE__ */ e.jsx(
79
79
  m,
80
80
  {
81
- className: u(o ? "align-middle" : "translate-y-1", i),
81
+ className: u(t ? "align-middle" : "translate-y-1", d),
82
82
  size: 20,
83
83
  "aria-hidden": "true"
84
84
  }
85
85
  ),
86
- o && /* @__PURE__ */ e.jsx("h3", { className: u("font-medium", c), children: o }),
86
+ t && /* @__PURE__ */ e.jsx("h3", { className: u("font-medium", r), children: t }),
87
87
  /* @__PURE__ */ e.jsx(
88
88
  "div",
89
89
  {
90
90
  className: u(
91
91
  a && "col-start-2",
92
- !o && a && "row-start-1",
93
- d,
92
+ !t && a && "row-start-1",
93
+ c,
94
94
  "overflow-x-auto"
95
95
  ),
96
96
  children: n
@@ -100,70 +100,73 @@ const K = {
100
100
  }
101
101
  );
102
102
  }, V = async ({
103
- search: t,
103
+ search: o,
104
104
  options: n,
105
- auth: o,
106
- context: l
105
+ auth: t,
106
+ context: s
107
107
  }) => {
108
- const a = n.maxResults ?? 10, s = n.transformResults ?? (() => !0), r = [], i = Y({
109
- search: t,
110
- transformFn: s,
111
- auth: o,
112
- context: l
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
113
113
  });
114
- for await (const c of i)
115
- if (r.push(c), r.length >= a) break;
116
- return r;
114
+ for await (const r of d)
115
+ if (i.push(r), i.length >= a) break;
116
+ return i;
117
117
  };
118
118
  async function* Y({
119
- search: t,
119
+ search: o,
120
120
  transformFn: n,
121
- auth: o,
122
- context: l
121
+ auth: t,
122
+ context: s
123
123
  }) {
124
- let s = 0;
125
- for (; s < t.results.length; ) {
126
- const r = t.results.slice(
127
- s,
128
- s + 5
124
+ let l = 0;
125
+ for (; l < o.results.length; ) {
126
+ const i = o.results.slice(
127
+ l,
128
+ l + 5
129
129
  );
130
- s += r.length;
131
- const i = await Promise.all(r.map((c) => c.data()));
132
- for (const c of i) {
133
- const d = n({ result: c, auth: o, context: l });
134
- d !== !1 && (d === !0 || d == null ? yield c : yield d);
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);
135
135
  }
136
136
  }
137
137
  }
138
- const Q = (t, n) => {
139
- const o = t.weighted_locations.reduce(
140
- (a, s) => a + s.balanced_score,
138
+ const Q = (o, n) => {
139
+ const t = o.weighted_locations.reduce(
140
+ (a, l) => a + l.balanced_score,
141
141
  0
142
142
  );
143
143
  return n.weighted_locations.reduce(
144
- (a, s) => a + s.balanced_score,
144
+ (a, l) => a + l.balanced_score,
145
145
  0
146
- ) - o;
147
- }, y = "cursor-pointer border border-transparent data-[selected=true]:border-border", Z = ({
148
- searchResults: t,
149
- searchTerm: n,
150
- onClose: o,
151
- maxSubResults: l = 4
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
152
153
  }) => {
153
- const a = H(), s = C(null);
154
- return T(() => {
154
+ const l = H(), i = S(null);
155
+ T(() => {
155
156
  requestIdleCallback(() => {
156
- s.current?.scrollTo({ top: 0 });
157
+ i.current?.scrollTo({ top: 0 });
157
158
  });
158
- }, [n]), /* @__PURE__ */ e.jsxs($, { className: "max-h-[450px]", ref: s, children: [
159
- n && t.length > 0 && /* @__PURE__ */ e.jsx(
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(
160
163
  f,
161
164
  {
162
165
  className: "text-sm text-muted-foreground",
163
- heading: `${t.length} results for "${n}"`
166
+ heading: `${n.length} results for "${t}"`
164
167
  }
165
168
  ),
166
- n && t.map((r) => /* @__PURE__ */ e.jsxs(
169
+ t && n.map((r) => /* @__PURE__ */ e.jsxs(
167
170
  f,
168
171
  {
169
172
  children: [
@@ -174,35 +177,35 @@ const Q = (t, n) => {
174
177
  value: `${r.meta.title}-${r.url}`,
175
178
  className: y,
176
179
  onSelect: () => {
177
- a(r.url), o();
180
+ l(d(r.url)), s();
178
181
  },
179
- children: /* @__PURE__ */ e.jsxs(p, { to: r.url, children: [
182
+ children: /* @__PURE__ */ e.jsxs(p, { to: d(r.url), children: [
180
183
  r.meta.section === "openapi" ? /* @__PURE__ */ e.jsx(A, {}) : /* @__PURE__ */ e.jsx(P, {}),
181
184
  r.meta.title
182
185
  ] })
183
186
  }
184
187
  ),
185
- r.sub_results.sort(Q).slice(0, l).map((i) => /* @__PURE__ */ e.jsx(
188
+ r.sub_results.sort(Q).slice(0, a).map((c) => /* @__PURE__ */ e.jsx(
186
189
  h,
187
190
  {
188
191
  asChild: !0,
189
- value: `sub-${r.meta.title}-${i.url}`,
192
+ value: `sub-${r.meta.title}-${c.url}`,
190
193
  className: y,
191
194
  onSelect: () => {
192
- a(i.url), o();
195
+ l(d(c.url)), s();
193
196
  },
194
- children: /* @__PURE__ */ e.jsx(p, { to: i.url, onClick: o, 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: [
195
- /* @__PURE__ */ e.jsx("span", { className: "font-bold", children: i.title }),
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 }),
196
199
  /* @__PURE__ */ e.jsx(
197
200
  "span",
198
201
  {
199
202
  className: "text-[13px] [&_mark]:bg-primary [&_mark]:text-primary-foreground",
200
- dangerouslySetInnerHTML: { __html: i.excerpt }
203
+ dangerouslySetInnerHTML: { __html: c.excerpt }
201
204
  }
202
205
  )
203
206
  ] }) })
204
207
  },
205
- `sub-${r.meta.title}-${i.url}`
208
+ `sub-${r.meta.title}-${c.url}`
206
209
  ))
207
210
  ]
208
211
  },
@@ -218,76 +221,76 @@ const Q = (t, n) => {
218
221
  termSimilarity: 1.2,
219
222
  // Slightly lower than default because API docs might have legitimate repetition of terms
220
223
  termSaturation: 1.2
221
- }, J = (t) => import(
224
+ }, Z = (o) => import(
222
225
  /* @vite-ignore */
223
- L(t, "/pagefind/pagefind.js")
224
- ), W = (t) => {
226
+ k(o, "/pagefind/pagefind.js")
227
+ ), J = (o) => {
225
228
  const {
226
229
  options: { basePath: n }
227
- } = k(), { data: o, ...l } = j({
228
- queryKey: ["pagefind", t.ranking],
230
+ } = j(), { data: t, ...s } = C({
231
+ queryKey: ["pagefind", o.ranking],
229
232
  retry: !1,
230
233
  queryFn: async () => {
231
- const a = await J(n);
234
+ const a = await Z(n);
232
235
  return await a.init(), await a.options({
233
236
  ranking: {
234
- termFrequency: t.ranking?.termFrequency ?? x.termFrequency,
235
- pageLength: t.ranking?.pageLength ?? x.pageLength,
236
- termSimilarity: t.ranking?.termSimilarity ?? x.termSimilarity,
237
- termSaturation: t.ranking?.termSaturation ?? x.termSaturation
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
238
241
  }
239
242
  }), a;
240
243
  },
241
244
  enabled: typeof window < "u"
242
245
  });
243
- return l.isError && l.error.message !== "NOT_BUILT_YET" && console.error(l.error), { ...l, pagefind: o };
246
+ return s.isError && s.error.message !== "NOT_BUILT_YET" && console.error(s.error), { ...s, pagefind: t };
244
247
  }, X = ({
245
- isOpen: t,
248
+ isOpen: o,
246
249
  onClose: n,
247
- options: o
250
+ options: t
248
251
  }) => {
249
- const { pagefind: l, error: a, isError: s } = W(o), [r, i] = E(""), c = I(), d = k(), m = C(null), { data: S } = j({
250
- queryKey: ["pagefind-search", r, c.isAuthenticated],
252
+ const { pagefind: s, error: a, isError: l } = J(t), [i, d] = E(""), r = N(), c = j(), m = S(null), { data: _ } = C({
253
+ queryKey: ["pagefind-search", i, r.isAuthenticated],
251
254
  queryFn: async () => {
252
- const _ = c.isAuthenticated ? void 0 : { not: { section: G } }, g = await l?.search(r, { filters: _ });
253
- return g ? V({ search: g, options: o, auth: c, context: d }) : [];
255
+ const w = r.isAuthenticated ? void 0 : { not: { section: G } }, g = await s?.search(i, { filters: w });
256
+ return g ? V({ search: g, options: t, auth: r, context: c }) : [];
254
257
  },
255
- placeholderData: N,
256
- enabled: !!l && !!r
258
+ placeholderData: L,
259
+ enabled: !!s && !!i
257
260
  });
258
261
  return /* @__PURE__ */ e.jsxs(
259
262
  D,
260
263
  {
261
264
  command: { shouldFilter: !1 },
262
265
  content: { className: "max-w-[750px]" },
263
- open: t,
266
+ open: o,
264
267
  onOpenChange: n,
265
268
  children: [
266
- /* @__PURE__ */ e.jsx(v, { children: /* @__PURE__ */ e.jsx(U, { children: "Search" }) }),
269
+ /* @__PURE__ */ e.jsx(I, { children: /* @__PURE__ */ e.jsx(U, { children: "Search" }) }),
267
270
  /* @__PURE__ */ e.jsx(
268
- O,
271
+ B,
269
272
  {
270
273
  ref: m,
271
274
  placeholder: "Search...",
272
- value: r,
273
- onValueChange: i,
274
- disabled: s
275
+ value: i,
276
+ onValueChange: d,
277
+ disabled: l
275
278
  }
276
279
  ),
277
- /* @__PURE__ */ e.jsx(B, { children: r ? /* @__PURE__ */ e.jsxs("div", { className: "flex flex-col items-center", children: [
280
+ /* @__PURE__ */ e.jsx(O, { children: i ? /* @__PURE__ */ e.jsxs("div", { className: "flex flex-col items-center", children: [
278
281
  "No results found.",
279
282
  /* @__PURE__ */ e.jsx(
280
283
  R,
281
284
  {
282
285
  variant: "link",
283
286
  onClick: () => {
284
- i(""), m.current?.focus();
287
+ d(""), m.current?.focus();
285
288
  },
286
289
  children: "Clear search"
287
290
  }
288
291
  )
289
292
  ] }) : "Start typing to search" }),
290
- s ? /* @__PURE__ */ e.jsx("div", { className: "p-4 text-sm", children: a.message === "NOT_BUILT_YET" ? /* @__PURE__ */ e.jsxs(M, { type: "info", children: [
293
+ l ? /* @__PURE__ */ e.jsx("div", { className: "p-4 text-sm", children: a.message === "NOT_BUILT_YET" ? /* @__PURE__ */ e.jsxs(M, { type: "info", children: [
291
294
  "Search is currently not available in development mode by default.",
292
295
  /* @__PURE__ */ e.jsx("br", {}),
293
296
  "To still use search in development, run ",
@@ -300,19 +303,20 @@ const Q = (t, n) => {
300
303
  /* @__PURE__ */ e.jsx("code", { children: "public" }),
301
304
  " directory."
302
305
  ] }) : "An error occurred while loading search." }) : /* @__PURE__ */ e.jsx(
303
- Z,
306
+ W,
304
307
  {
305
- searchResults: S ?? [],
306
- searchTerm: r,
308
+ basePath: c.options.basePath,
309
+ searchResults: _ ?? [],
310
+ searchTerm: i,
307
311
  onClose: n,
308
- maxSubResults: o.maxSubResults
312
+ maxSubResults: t.maxSubResults
309
313
  }
310
314
  )
311
315
  ]
312
316
  }
313
317
  );
314
- }, ue = (t) => ({
315
- renderSearch: ({ isOpen: n, onClose: o }) => /* @__PURE__ */ e.jsx(w, { children: /* @__PURE__ */ e.jsx(X, { isOpen: n, onClose: o, options: t }) })
318
+ }, ue = (o) => ({
319
+ renderSearch: ({ isOpen: n, onClose: t }) => /* @__PURE__ */ e.jsx(v, { children: /* @__PURE__ */ e.jsx(X, { isOpen: n, onClose: t, options: o }) })
316
320
  });
317
321
  export {
318
322
  ue as pagefindSearchPlugin
@@ -1 +1 @@
1
- {"version":3,"file":"zudoku.plugin-search-pagefind.js","sources":["../src/lib/ui/Callout.tsx","../src/lib/plugins/search-pagefind/get-results.tsx","../src/lib/plugins/search-pagefind/ResultList.tsx","../src/lib/plugins/search-pagefind/PagefindSearch.tsx","../src/lib/plugins/search-pagefind/index.tsx"],"sourcesContent":["import {\n AlertTriangleIcon,\n InfoIcon,\n LightbulbIcon,\n type LucideIcon,\n ShieldAlertIcon,\n} from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../util/cn.js\";\n\nconst stylesMap = {\n note: {\n border: \"border-gray-300 dark:border-zinc-800\",\n bg: \"bg-gray-100 dark:bg-zinc-800/50\",\n iconColor: \"text-gray-600 dark:text-zinc-300\",\n titleColor: \"text-gray-600 dark:text-zinc-300\",\n textColor: \"text-gray-600 dark:text-zinc-300\",\n Icon: InfoIcon as LucideIcon,\n },\n tip: {\n border: \"border-green-500 dark:border-green-800\",\n bg: \"bg-green-200/25 dark:bg-green-950/70\",\n iconColor: \"text-green-600 dark:text-green-200\",\n titleColor: \"text-green-700 dark:text-green-200\",\n textColor: \"text-green-600 dark:text-green-50\",\n Icon: LightbulbIcon as LucideIcon,\n },\n info: {\n border: \"border-blue-400 dark:border-blue-900/60\",\n bg: \"bg-blue-50 dark:bg-blue-950/40\",\n iconColor: \"text-blue-400 dark:text-blue-200\",\n titleColor: \"text-blue-700 dark:text-blue-200\",\n textColor: \"text-blue-600 dark:text-blue-100\",\n Icon: InfoIcon as LucideIcon,\n },\n caution: {\n border: \"border-yellow-400 dark:border-yellow-400/25\",\n bg: \"bg-yellow-100/60 dark:bg-yellow-400/10\",\n iconColor: \"text-yellow-500 dark:text-yellow-300\",\n titleColor: \"text-yellow-600 dark:text-yellow-300\",\n textColor: \"text-yellow-700 dark:text-yellow-200\",\n Icon: AlertTriangleIcon as LucideIcon,\n },\n danger: {\n border: \"border-rose-400 dark:border-rose-800\",\n bg: \"bg-rose-50 dark:bg-rose-950/40\",\n iconColor: \"text-rose-400 dark:text-rose-300\",\n titleColor: \"text-rose-800 dark:text-rose-300\",\n textColor: \"text-rose-700 dark:text-rose-100\",\n Icon: ShieldAlertIcon as LucideIcon,\n },\n} as const;\n\ntype CalloutProps = {\n type: keyof typeof stylesMap;\n title?: string;\n children: ReactNode;\n className?: string;\n icon?: boolean;\n};\n\nexport const Callout = ({\n type,\n children,\n title,\n className,\n icon = true,\n}: CalloutProps) => {\n const { border, bg, iconColor, titleColor, textColor, Icon } =\n stylesMap[type];\n\n return (\n <div\n className={cn(\n \"not-prose rounded-md border p-4 text-md my-2\",\n icon &&\n \"grid grid-cols-[min-content_1fr] items-baseline grid-rows-[fit-content_1fr] gap-x-4 gap-y-2\",\n !icon && title && \"flex flex-col gap-2\",\n \"[&_a]:underline [&_a]:decoration-current [&_a]:decoration-from-font [&_a]:underline-offset-4 hover:[&_a]:decoration-1\",\n \"[&_.code-block-wrapper]:border\",\n \"[&_ul]:list-disc [&_ol]:list-decimal [&_ul]:ps-4 [&_ul>li]:ps-1 [&_ul>li]:my-1\",\n icon && title && \"items-center\",\n border,\n bg,\n className,\n )}\n >\n {icon && (\n <Icon\n className={cn(!title ? \"translate-y-1\" : \"align-middle\", iconColor)}\n size={20}\n aria-hidden=\"true\"\n />\n )}\n {title && <h3 className={cn(\"font-medium\", titleColor)}>{title}</h3>}\n <div\n className={cn(\n icon && \"col-start-2\",\n !title && icon && \"row-start-1\",\n textColor,\n \"overflow-x-auto\",\n )}\n >\n {children}\n </div>\n </div>\n );\n};\n","import type { AuthState } from \"../../authentication/state.js\";\nimport type { ZudokuContext } from \"../../core/ZudokuContext.js\";\nimport type { PagefindOptions } from \"./index.js\";\nimport type { PagefindSearchFragment, PagefindSearchResults } from \"./types.js\";\n\nexport const getResults = async ({\n search,\n options,\n auth,\n context,\n}: {\n search: PagefindSearchResults;\n options: PagefindOptions;\n auth: AuthState;\n context: ZudokuContext;\n}) => {\n const maxResults = options.maxResults ?? 10;\n const transformFn = options.transformResults ?? (() => true);\n\n const transformedResults: PagefindSearchFragment[] = [];\n\n const generator = searchResultGenerator({\n search,\n transformFn,\n auth,\n context,\n });\n\n for await (const result of generator) {\n transformedResults.push(result);\n if (transformedResults.length >= maxResults) break;\n }\n\n return transformedResults;\n};\n\nasync function* searchResultGenerator({\n search,\n transformFn,\n auth,\n context,\n}: {\n search: PagefindSearchResults;\n transformFn: NonNullable<PagefindOptions[\"transformResults\"]>;\n auth: AuthState<unknown>;\n context: ZudokuContext;\n}) {\n const batchSize = 5;\n let processedCount = 0;\n\n while (processedCount < search.results.length) {\n const batch = search.results.slice(\n processedCount,\n processedCount + batchSize,\n );\n processedCount += batch.length;\n\n const batchData = await Promise.all(batch.map((result) => result.data()));\n\n for (const result of batchData) {\n const transformed = transformFn({ result, auth, context });\n\n if (transformed === false) {\n // Skip this result\n continue;\n } else if (transformed === true || transformed == null) {\n // Keep the original result\n yield result;\n } else {\n // Return the transformed result\n yield transformed;\n }\n }\n }\n}\n","import { BracketsIcon, FileTextIcon } from \"lucide-react\";\nimport { useLayoutEffect, useRef } from \"react\";\nimport { Link, useNavigate } from \"react-router\";\nimport { CommandGroup, CommandItem, CommandList } from \"zudoku/ui/Command.js\";\nimport {\n type PagefindSearchFragment,\n type PagefindSubResult,\n} from \"./types.js\";\n\nconst sortSubResults = (a: PagefindSubResult, b: PagefindSubResult) => {\n const aScore = a.weighted_locations.reduce(\n (sum, loc) => sum + loc.balanced_score,\n 0,\n );\n const bScore = b.weighted_locations.reduce(\n (sum, loc) => sum + loc.balanced_score,\n 0,\n );\n return bScore - aScore;\n};\n\nconst hoverClassname = `cursor-pointer border border-transparent data-[selected=true]:border-border`;\n\nexport const ResultList = ({\n searchResults,\n searchTerm,\n onClose,\n maxSubResults = 4,\n}: {\n basePath?: string;\n searchResults: PagefindSearchFragment[];\n searchTerm: string;\n onClose: () => void;\n maxSubResults?: number;\n}) => {\n const navigate = useNavigate();\n const commandListRef = useRef<HTMLDivElement | null>(null);\n\n useLayoutEffect(() => {\n requestIdleCallback(() => {\n commandListRef.current?.scrollTo({ top: 0 });\n });\n }, [searchTerm]);\n\n 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(result.url);\n onClose();\n }}\n >\n <Link to={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(subResult.url);\n onClose();\n }}\n >\n <Link to={subResult.url} onClick={onClose}>\n <div className=\"flex flex-col items-start gap-2 ms-2.5 ps-5 border-l border-muted-foreground/50\">\n <span className=\"font-bold\">{subResult.title}</span>\n <span\n className=\"text-[13px] [&_mark]:bg-primary [&_mark]:text-primary-foreground\"\n dangerouslySetInnerHTML={{ __html: subResult.excerpt }}\n />\n </div>\n </Link>\n </CommandItem>\n ))}\n </CommandGroup>\n ))}\n </CommandList>\n );\n};\n","import { VisuallyHidden } from \"@radix-ui/react-visually-hidden\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport { useRef, useState } from \"react\";\nimport { Button } from \"zudoku/ui/Button.js\";\nimport { Callout } from \"zudoku/ui/Callout.js\";\nimport {\n CommandDialog,\n CommandEmpty,\n CommandInput,\n} from \"zudoku/ui/Command.js\";\nimport { DialogTitle } from \"zudoku/ui/Dialog.js\";\nimport { useAuthState } from \"../../authentication/state.js\";\nimport { useZudoku } from \"../../components/context/ZudokuContext.js\";\nimport { SEARCH_PROTECTED_SECTION } from \"../../core/RouteGuard.js\";\nimport { joinUrl } from \"../../util/joinUrl.js\";\nimport { getResults } from \"./get-results.js\";\nimport type { PagefindOptions } from \"./index.js\";\nimport { ResultList } from \"./ResultList.js\";\nimport type { Pagefind } from \"./types.js\";\n\nconst DEFAULT_RANKING = {\n // Slightly lower than default because API docs tend to have repetitive terms (parameter names, HTTP methods, etc.)\n termFrequency: 0.8,\n // Lower than default because API documentation pages tend to be longer due to comprehensive endpoint documentation\n pageLength: 0.6,\n // Slightly higher than default because in technical documentation, exact matches should be prioritized\n termSimilarity: 1.2,\n // Slightly lower than default because API docs might have legitimate repetition of terms\n termSaturation: 1.2,\n};\n\nconst importPagefind = (basePath?: string): Promise<Pagefind> =>\n import.meta.env.DEV\n ? // @ts-expect-error TypeScript can't resolve the import\n import(/* @vite-ignore */ \"/pagefind/pagefind.js\")\n : import(/* @vite-ignore */ joinUrl(basePath, \"/pagefind/pagefind.js\"));\n\nconst usePagefind = (options: PagefindOptions) => {\n const {\n options: { basePath },\n } = useZudoku();\n const { data: pagefind, ...result } = useQuery<Pagefind>({\n queryKey: [\"pagefind\", options.ranking],\n retry: false,\n queryFn: async () => {\n const pagefind = await importPagefind(basePath);\n await pagefind.init();\n await pagefind.options({\n ranking: {\n termFrequency:\n options.ranking?.termFrequency ?? DEFAULT_RANKING.termFrequency,\n pageLength: options.ranking?.pageLength ?? DEFAULT_RANKING.pageLength,\n termSimilarity:\n options.ranking?.termSimilarity ?? DEFAULT_RANKING.termSimilarity,\n termSaturation:\n options.ranking?.termSaturation ?? DEFAULT_RANKING.termSaturation,\n },\n });\n\n return pagefind;\n },\n enabled: typeof window !== \"undefined\",\n });\n\n if (result.isError && result.error.message !== \"NOT_BUILT_YET\") {\n // eslint-disable-next-line no-console\n console.error(result.error);\n }\n\n return { ...result, pagefind };\n};\n\nexport const PagefindSearch = ({\n isOpen,\n onClose,\n options,\n}: {\n isOpen: boolean;\n onClose: () => void;\n options: PagefindOptions;\n}) => {\n const { pagefind, error, isError } = usePagefind(options);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const auth = useAuthState();\n const context = useZudoku();\n const inputRef = useRef<HTMLInputElement>(null);\n\n const { data: searchResults } = useQuery({\n queryKey: [\"pagefind-search\", searchTerm, auth.isAuthenticated],\n queryFn: async () => {\n const filters = auth.isAuthenticated\n ? undefined\n : { not: { section: SEARCH_PROTECTED_SECTION } };\n\n const search = await pagefind?.search(searchTerm, { filters });\n if (!search) return [];\n return getResults({ search, options, auth, context });\n },\n placeholderData: keepPreviousData,\n enabled: !!pagefind && !!searchTerm,\n });\n\n return (\n <CommandDialog\n command={{ shouldFilter: false }}\n content={{ className: \"max-w-[750px]\" }}\n open={isOpen}\n onOpenChange={onClose}\n >\n <VisuallyHidden>\n <DialogTitle>Search</DialogTitle>\n </VisuallyHidden>\n <CommandInput\n ref={inputRef}\n placeholder=\"Search...\"\n value={searchTerm}\n onValueChange={setSearchTerm}\n disabled={isError}\n />\n <CommandEmpty>\n {searchTerm ? (\n <div className=\"flex flex-col items-center\">\n No results found.\n <Button\n variant=\"link\"\n onClick={() => {\n setSearchTerm(\"\");\n inputRef.current?.focus();\n }}\n >\n Clear search\n </Button>\n </div>\n ) : (\n \"Start typing to search\"\n )}\n </CommandEmpty>\n {isError ? (\n <div className=\"p-4 text-sm\">\n {error.message === \"NOT_BUILT_YET\" ? (\n <Callout type=\"info\">\n Search is currently not available in development mode by default.\n <br />\n To still use search in development, run <code>\n zudoku build\n </code>{\" \"}\n and copy the <code>dist/pagefind</code> directory to your{\" \"}\n <code>public</code> directory.\n </Callout>\n ) : (\n \"An error occurred while loading search.\"\n )}\n </div>\n ) : (\n <ResultList\n 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","searchResults","searchTerm","onClose","maxSubResults","navigate","useNavigate","commandListRef","useRef","useLayoutEffect","CommandList","CommandGroup","CommandItem","Link","BracketsIcon","FileTextIcon","subResult","DEFAULT_RANKING","importPagefind","basePath","joinUrl","usePagefind","useZudoku","pagefind","useQuery","PagefindSearch","isOpen","error","isError","setSearchTerm","useState","useAuthState","inputRef","filters","SEARCH_PROTECTED_SECTION","keepPreviousData","CommandDialog","VisuallyHidden","DialogTitle","CommandInput","CommandEmpty","Button","pagefindSearchPlugin","ClientOnly"],"mappings":"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"}
1
+ {"version":3,"file":"zudoku.plugin-search-pagefind.js","sources":["../src/lib/ui/Callout.tsx","../src/lib/plugins/search-pagefind/get-results.tsx","../src/lib/plugins/search-pagefind/ResultList.tsx","../src/lib/plugins/search-pagefind/PagefindSearch.tsx","../src/lib/plugins/search-pagefind/index.tsx"],"sourcesContent":["import {\n AlertTriangleIcon,\n InfoIcon,\n LightbulbIcon,\n type LucideIcon,\n ShieldAlertIcon,\n} from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../util/cn.js\";\n\nconst stylesMap = {\n note: {\n border: \"border-gray-300 dark:border-zinc-800\",\n bg: \"bg-gray-100 dark:bg-zinc-800/50\",\n iconColor: \"text-gray-600 dark:text-zinc-300\",\n titleColor: \"text-gray-600 dark:text-zinc-300\",\n textColor: \"text-gray-600 dark:text-zinc-300\",\n Icon: InfoIcon as LucideIcon,\n },\n tip: {\n border: \"border-green-500 dark:border-green-800\",\n bg: \"bg-green-200/25 dark:bg-green-950/70\",\n iconColor: \"text-green-600 dark:text-green-200\",\n titleColor: \"text-green-700 dark:text-green-200\",\n textColor: \"text-green-600 dark:text-green-50\",\n Icon: LightbulbIcon as LucideIcon,\n },\n info: {\n border: \"border-blue-400 dark:border-blue-900/60\",\n bg: \"bg-blue-50 dark:bg-blue-950/40\",\n iconColor: \"text-blue-400 dark:text-blue-200\",\n titleColor: \"text-blue-700 dark:text-blue-200\",\n textColor: \"text-blue-600 dark:text-blue-100\",\n Icon: InfoIcon as LucideIcon,\n },\n caution: {\n border: \"border-yellow-400 dark:border-yellow-400/25\",\n bg: \"bg-yellow-100/60 dark:bg-yellow-400/10\",\n iconColor: \"text-yellow-500 dark:text-yellow-300\",\n titleColor: \"text-yellow-600 dark:text-yellow-300\",\n textColor: \"text-yellow-700 dark:text-yellow-200\",\n Icon: AlertTriangleIcon as LucideIcon,\n },\n danger: {\n border: \"border-rose-400 dark:border-rose-800\",\n bg: \"bg-rose-50 dark:bg-rose-950/40\",\n iconColor: \"text-rose-400 dark:text-rose-300\",\n titleColor: \"text-rose-800 dark:text-rose-300\",\n textColor: \"text-rose-700 dark:text-rose-100\",\n Icon: ShieldAlertIcon as LucideIcon,\n },\n} as const;\n\ntype CalloutProps = {\n type: keyof typeof stylesMap;\n title?: string;\n children: ReactNode;\n className?: string;\n icon?: boolean;\n};\n\nexport const Callout = ({\n type,\n children,\n title,\n className,\n icon = true,\n}: CalloutProps) => {\n const { border, bg, iconColor, titleColor, textColor, Icon } =\n stylesMap[type];\n\n return (\n <div\n className={cn(\n \"not-prose rounded-md border p-4 text-md my-2\",\n icon &&\n \"grid grid-cols-[min-content_1fr] items-baseline grid-rows-[fit-content_1fr] gap-x-4 gap-y-2\",\n !icon && title && \"flex flex-col gap-2\",\n \"[&_a]:underline [&_a]:decoration-current [&_a]:decoration-from-font [&_a]:underline-offset-4 hover:[&_a]:decoration-1\",\n \"[&_.code-block-wrapper]:border\",\n \"[&_ul]:list-disc [&_ol]:list-decimal [&_ul]:ps-4 [&_ul>li]:ps-1 [&_ul>li]:my-1\",\n icon && title && \"items-center\",\n border,\n bg,\n className,\n )}\n >\n {icon && (\n <Icon\n className={cn(!title ? \"translate-y-1\" : \"align-middle\", iconColor)}\n size={20}\n aria-hidden=\"true\"\n />\n )}\n {title && <h3 className={cn(\"font-medium\", titleColor)}>{title}</h3>}\n <div\n className={cn(\n icon && \"col-start-2\",\n !title && icon && \"row-start-1\",\n textColor,\n \"overflow-x-auto\",\n )}\n >\n {children}\n </div>\n </div>\n );\n};\n","import type { AuthState } from \"../../authentication/state.js\";\nimport type { ZudokuContext } from \"../../core/ZudokuContext.js\";\nimport type { PagefindOptions } from \"./index.js\";\nimport type { PagefindSearchFragment, PagefindSearchResults } from \"./types.js\";\n\nexport const getResults = async ({\n search,\n options,\n auth,\n context,\n}: {\n search: PagefindSearchResults;\n options: PagefindOptions;\n auth: AuthState;\n context: ZudokuContext;\n}) => {\n const maxResults = options.maxResults ?? 10;\n const transformFn = options.transformResults ?? (() => true);\n\n const transformedResults: PagefindSearchFragment[] = [];\n\n const generator = searchResultGenerator({\n search,\n transformFn,\n auth,\n context,\n });\n\n for await (const result of generator) {\n transformedResults.push(result);\n if (transformedResults.length >= maxResults) break;\n }\n\n return transformedResults;\n};\n\nasync function* searchResultGenerator({\n search,\n transformFn,\n auth,\n context,\n}: {\n search: PagefindSearchResults;\n transformFn: NonNullable<PagefindOptions[\"transformResults\"]>;\n auth: AuthState<unknown>;\n context: ZudokuContext;\n}) {\n const batchSize = 5;\n let processedCount = 0;\n\n while (processedCount < search.results.length) {\n const batch = search.results.slice(\n processedCount,\n processedCount + batchSize,\n );\n processedCount += batch.length;\n\n const batchData = await Promise.all(batch.map((result) => result.data()));\n\n for (const result of batchData) {\n const transformed = transformFn({ result, auth, context });\n\n if (transformed === false) {\n // Skip this result\n continue;\n } else if (transformed === true || transformed == null) {\n // Keep the original result\n yield result;\n } else {\n // Return the transformed result\n yield transformed;\n }\n }\n }\n}\n","import { BracketsIcon, FileTextIcon } from \"lucide-react\";\nimport { useLayoutEffect, useRef } from \"react\";\nimport { Link, useNavigate } from \"react-router\";\nimport { CommandGroup, CommandItem, CommandList } from \"zudoku/ui/Command.js\";\nimport { joinUrl } from \"../../util/joinUrl.js\";\nimport {\n type PagefindSearchFragment,\n type PagefindSubResult,\n} from \"./types.js\";\n\nconst sortSubResults = (a: PagefindSubResult, b: PagefindSubResult) => {\n const aScore = a.weighted_locations.reduce(\n (sum, loc) => sum + loc.balanced_score,\n 0,\n );\n const bScore = b.weighted_locations.reduce(\n (sum, loc) => sum + loc.balanced_score,\n 0,\n );\n return bScore - aScore;\n};\n\nconst hoverClassname = `cursor-pointer border border-transparent data-[selected=true]:border-border`;\n\nexport const ResultList = ({\n basePath,\n searchResults,\n searchTerm,\n onClose,\n maxSubResults = 4,\n}: {\n basePath?: string;\n searchResults: PagefindSearchFragment[];\n searchTerm: string;\n onClose: () => void;\n maxSubResults?: number;\n}) => {\n const navigate = useNavigate();\n const commandListRef = useRef<HTMLDivElement | null>(null);\n\n useLayoutEffect(() => {\n requestIdleCallback(() => {\n commandListRef.current?.scrollTo({ top: 0 });\n });\n }, [searchTerm]);\n\n const stripBasePath = (url: string) => {\n if (basePath && url.startsWith(basePath)) {\n return joinUrl(url.slice(basePath.length));\n }\n return url;\n };\n\n return (\n <CommandList className=\"max-h-[450px]\" ref={commandListRef}>\n {searchTerm && searchResults.length > 0 && (\n <CommandGroup\n className=\"text-sm text-muted-foreground\"\n heading={`${searchResults.length} results for \"${searchTerm}\"`}\n />\n )}\n {searchTerm &&\n searchResults.map((result) => (\n <CommandGroup\n key={[result.meta.title ?? result.excerpt, result.url].join(\"-\")}\n >\n <CommandItem\n asChild\n value={`${result.meta.title}-${result.url}`}\n className={hoverClassname}\n onSelect={() => {\n void navigate(stripBasePath(result.url));\n onClose();\n }}\n >\n <Link to={stripBasePath(result.url)}>\n {result.meta.section === \"openapi\" ? (\n <BracketsIcon />\n ) : (\n <FileTextIcon />\n )}\n {result.meta.title}\n </Link>\n </CommandItem>\n {result.sub_results\n .sort(sortSubResults)\n .slice(0, maxSubResults)\n .map((subResult) => (\n <CommandItem\n asChild\n key={`sub-${result.meta.title}-${subResult.url}`}\n value={`sub-${result.meta.title}-${subResult.url}`}\n className={hoverClassname}\n onSelect={() => {\n void navigate(stripBasePath(subResult.url));\n onClose();\n }}\n >\n <Link to={stripBasePath(subResult.url)} onClick={onClose}>\n <div className=\"flex flex-col items-start gap-2 ms-2.5 ps-5 border-l border-muted-foreground/50\">\n <span className=\"font-bold\">{subResult.title}</span>\n <span\n className=\"text-[13px] [&_mark]:bg-primary [&_mark]:text-primary-foreground\"\n dangerouslySetInnerHTML={{ __html: subResult.excerpt }}\n />\n </div>\n </Link>\n </CommandItem>\n ))}\n </CommandGroup>\n ))}\n </CommandList>\n );\n};\n","import { VisuallyHidden } from \"@radix-ui/react-visually-hidden\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport { useRef, useState } from \"react\";\nimport { Button } from \"zudoku/ui/Button.js\";\nimport { Callout } from \"zudoku/ui/Callout.js\";\nimport {\n CommandDialog,\n CommandEmpty,\n CommandInput,\n} from \"zudoku/ui/Command.js\";\nimport { DialogTitle } from \"zudoku/ui/Dialog.js\";\nimport { useAuthState } from \"../../authentication/state.js\";\nimport { useZudoku } from \"../../components/context/ZudokuContext.js\";\nimport { SEARCH_PROTECTED_SECTION } from \"../../core/RouteGuard.js\";\nimport { joinUrl } from \"../../util/joinUrl.js\";\nimport { getResults } from \"./get-results.js\";\nimport type { PagefindOptions } from \"./index.js\";\nimport { ResultList } from \"./ResultList.js\";\nimport type { Pagefind } from \"./types.js\";\n\nconst DEFAULT_RANKING = {\n // Slightly lower than default because API docs tend to have repetitive terms (parameter names, HTTP methods, etc.)\n termFrequency: 0.8,\n // Lower than default because API documentation pages tend to be longer due to comprehensive endpoint documentation\n pageLength: 0.6,\n // Slightly higher than default because in technical documentation, exact matches should be prioritized\n termSimilarity: 1.2,\n // Slightly lower than default because API docs might have legitimate repetition of terms\n termSaturation: 1.2,\n};\n\nconst importPagefind = (basePath?: string): Promise<Pagefind> =>\n import.meta.env.DEV\n ? // @ts-expect-error TypeScript can't resolve the import\n import(/* @vite-ignore */ \"/pagefind/pagefind.js\")\n : import(/* @vite-ignore */ joinUrl(basePath, \"/pagefind/pagefind.js\"));\n\nconst usePagefind = (options: PagefindOptions) => {\n const {\n options: { basePath },\n } = useZudoku();\n const { data: pagefind, ...result } = useQuery<Pagefind>({\n queryKey: [\"pagefind\", options.ranking],\n retry: false,\n queryFn: async () => {\n const pagefind = await importPagefind(basePath);\n await pagefind.init();\n await pagefind.options({\n ranking: {\n termFrequency:\n options.ranking?.termFrequency ?? DEFAULT_RANKING.termFrequency,\n pageLength: options.ranking?.pageLength ?? DEFAULT_RANKING.pageLength,\n termSimilarity:\n options.ranking?.termSimilarity ?? DEFAULT_RANKING.termSimilarity,\n termSaturation:\n options.ranking?.termSaturation ?? DEFAULT_RANKING.termSaturation,\n },\n });\n\n return pagefind;\n },\n enabled: typeof window !== \"undefined\",\n });\n\n if (result.isError && result.error.message !== \"NOT_BUILT_YET\") {\n // eslint-disable-next-line no-console\n console.error(result.error);\n }\n\n return { ...result, pagefind };\n};\n\nexport const PagefindSearch = ({\n isOpen,\n onClose,\n options,\n}: {\n isOpen: boolean;\n onClose: () => void;\n options: PagefindOptions;\n}) => {\n const { pagefind, error, isError } = usePagefind(options);\n const [searchTerm, setSearchTerm] = useState(\"\");\n const auth = useAuthState();\n const context = useZudoku();\n const inputRef = useRef<HTMLInputElement>(null);\n\n const { data: searchResults } = useQuery({\n queryKey: [\"pagefind-search\", searchTerm, auth.isAuthenticated],\n queryFn: async () => {\n const filters = auth.isAuthenticated\n ? undefined\n : { not: { section: SEARCH_PROTECTED_SECTION } };\n\n const search = await pagefind?.search(searchTerm, { filters });\n if (!search) return [];\n return getResults({ search, options, auth, context });\n },\n placeholderData: keepPreviousData,\n enabled: !!pagefind && !!searchTerm,\n });\n\n return (\n <CommandDialog\n command={{ shouldFilter: false }}\n content={{ className: \"max-w-[750px]\" }}\n open={isOpen}\n onOpenChange={onClose}\n >\n <VisuallyHidden>\n <DialogTitle>Search</DialogTitle>\n </VisuallyHidden>\n <CommandInput\n ref={inputRef}\n placeholder=\"Search...\"\n value={searchTerm}\n onValueChange={setSearchTerm}\n disabled={isError}\n />\n <CommandEmpty>\n {searchTerm ? (\n <div className=\"flex flex-col items-center\">\n No results found.\n <Button\n variant=\"link\"\n onClick={() => {\n setSearchTerm(\"\");\n inputRef.current?.focus();\n }}\n >\n Clear search\n </Button>\n </div>\n ) : (\n \"Start typing to search\"\n )}\n </CommandEmpty>\n {isError ? (\n <div className=\"p-4 text-sm\">\n {error.message === \"NOT_BUILT_YET\" ? (\n <Callout type=\"info\">\n Search is currently not available in development mode by default.\n <br />\n To still use search in development, run <code>\n zudoku build\n </code>{\" \"}\n and copy the <code>dist/pagefind</code> directory to your{\" \"}\n <code>public</code> directory.\n </Callout>\n ) : (\n \"An error occurred while loading search.\"\n )}\n </div>\n ) : (\n <ResultList\n basePath={context.options.basePath}\n searchResults={searchResults ?? []}\n searchTerm={searchTerm}\n onClose={onClose}\n maxSubResults={options.maxSubResults}\n />\n )}\n </CommandDialog>\n );\n};\n","import type { ZudokuConfig } from \"../../../config/validators/validate.js\";\nimport { ClientOnly } from \"../../components/ClientOnly.js\";\nimport type { ZudokuPlugin } from \"../../core/plugins.js\";\nimport { PagefindSearch } from \"./PagefindSearch.js\";\n\nexport type PagefindOptions = Extract<\n ZudokuConfig[\"search\"],\n { type: \"pagefind\" }\n>;\n\nexport const pagefindSearchPlugin = (\n options: PagefindOptions,\n): ZudokuPlugin => {\n return {\n renderSearch: ({ isOpen, onClose }) => (\n <ClientOnly>\n <PagefindSearch isOpen={isOpen} onClose={onClose} options={options} />\n </ClientOnly>\n ),\n };\n};\n"],"names":["stylesMap","InfoIcon","LightbulbIcon","AlertTriangleIcon","ShieldAlertIcon","Callout","type","children","title","className","icon","border","bg","iconColor","titleColor","textColor","Icon","jsxs","cn","jsx","getResults","search","options","auth","context","maxResults","transformFn","transformedResults","generator","searchResultGenerator","result","processedCount","batch","batchData","transformed","sortSubResults","a","b","aScore","sum","loc","hoverClassname","ResultList","basePath","searchResults","searchTerm","onClose","maxSubResults","navigate","useNavigate","commandListRef","useRef","useLayoutEffect","stripBasePath","url","joinUrl","CommandList","CommandGroup","CommandItem","Link","BracketsIcon","FileTextIcon","subResult","DEFAULT_RANKING","importPagefind","usePagefind","useZudoku","pagefind","useQuery","PagefindSearch","isOpen","error","isError","setSearchTerm","useState","useAuthState","inputRef","filters","SEARCH_PROTECTED_SECTION","keepPreviousData","CommandDialog","VisuallyHidden","DialogTitle","CommandInput","CommandEmpty","Button","pagefindSearchPlugin","ClientOnly"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zudoku",
3
- "version": "0.53.2",
3
+ "version": "0.53.4",
4
4
  "type": "module",
5
5
  "homepage": "https://zudoku.dev",
6
6
  "repository": {
@@ -164,16 +164,16 @@
164
164
  "@radix-ui/react-visually-hidden": "1.2.3",
165
165
  "@scalar/openapi-parser": "0.10.17",
166
166
  "@sentry/node": "9.26.0",
167
- "@shikijs/langs": "3.5.0",
168
- "@shikijs/rehype": "3.5.0",
169
- "@shikijs/themes": "3.5.0",
170
- "@shikijs/transformers": "3.5.0",
167
+ "@shikijs/langs": "3.7.0",
168
+ "@shikijs/rehype": "3.7.0",
169
+ "@shikijs/themes": "3.7.0",
170
+ "@shikijs/transformers": "3.7.0",
171
171
  "@sindresorhus/slugify": "2.2.1",
172
172
  "@stefanprobst/rehype-extract-toc": "3.0.0",
173
173
  "@tailwindcss/typography": "0.5.16",
174
174
  "@tailwindcss/vite": "4.1.7",
175
175
  "@tanem/react-nprogress": "5.0.55",
176
- "@tanstack/react-query": "5.74.3",
176
+ "@tanstack/react-query": "5.81.5",
177
177
  "@types/react": "19.1.8",
178
178
  "@types/react-dom": "19.1.6",
179
179
  "@vitejs/plugin-react": "4.4.1",
@@ -208,13 +208,13 @@
208
208
  "minimatch": "10.0.1",
209
209
  "motion": "12.18.1",
210
210
  "nanoevents": "^9.1.0",
211
- "next-themes": "0.4.4",
211
+ "next-themes": "0.4.6",
212
212
  "oauth4webapi": "2.17.0",
213
213
  "object-hash": "3.0.0",
214
214
  "openapi-types": "12.1.3",
215
215
  "pagefind": "1.4.0-alpha.1",
216
216
  "picocolors": "1.1.1",
217
- "piscina": "5.0.0",
217
+ "piscina": "5.1.1",
218
218
  "posthog-node": "4.17.1",
219
219
  "react-error-boundary": "6.0.0",
220
220
  "react-hook-form": "7.57.0",
@@ -233,8 +233,8 @@
233
233
  "remark-parse": "^11.0.0",
234
234
  "remark-rehype": "^11.1.2",
235
235
  "rollup": "4.41.1",
236
- "semver": "7.7.1",
237
- "shiki": "3.5.0",
236
+ "semver": "7.7.2",
237
+ "shiki": "3.7.0",
238
238
  "sitemap": "8.0.0",
239
239
  "spin-delay": "2.0.1",
240
240
  "strip-ansi": "7.1.0",
@@ -247,7 +247,7 @@
247
247
  "vfile": "6.0.3",
248
248
  "vite": "6.3.5",
249
249
  "yaml": "2.8.0",
250
- "yargs": "17.7.2",
250
+ "yargs": "18.0.0",
251
251
  "zod": "3.25.67",
252
252
  "zod-to-ts": "1.2.0",
253
253
  "zustand": "5.0.5"
@@ -255,6 +255,7 @@
255
255
  "devDependencies": {
256
256
  "@graphql-codegen/cli": "5.0.7",
257
257
  "@graphql-codegen/client-preset": "4.8.2",
258
+ "@inkeep/cxkit-types": "0.5.90",
258
259
  "@testing-library/dom": "10.4.0",
259
260
  "@testing-library/jest-dom": "6.6.3",
260
261
  "@testing-library/react": "16.3.0",
@@ -278,7 +279,7 @@
278
279
  "mdast-util-mdx": "3.0.0",
279
280
  "react": "19.1.0",
280
281
  "react-dom": "19.1.0",
281
- "rollup-plugin-visualizer": "5.14.0",
282
+ "rollup-plugin-visualizer": "6.0.3",
282
283
  "tsx": "4.19.4",
283
284
  "typescript": "5.8.3",
284
285
  "vitest": "3.2.3"
package/src/app/main.tsx CHANGED
@@ -82,22 +82,13 @@ export const getRoutesByOptions = (
82
82
  .flatMap((plugin) => (isNavigationPlugin(plugin) ? plugin.getRoutes() : []))
83
83
  .concat(
84
84
  enableStatusPages
85
- ? [400, 403, 404, 405, 414, 416, 500, 501, 502, 503, 504].map(
86
- (statusCode) => ({
87
- path: `/${statusCode}`,
88
- element: <StatusPage statusCode={statusCode} />,
89
- }),
90
- )
85
+ ? [400, 404, 500].map((statusCode) => ({
86
+ path: `/${statusCode}`,
87
+ element: <StatusPage statusCode={statusCode} />,
88
+ }))
91
89
  : [],
92
90
  )
93
- .concat([
94
- {
95
- path: "*",
96
- loader: () => {
97
- throw new Response("Not Found", { status: 404 });
98
- },
99
- },
100
- ]);
91
+ .concat([{ path: "*", element: <StatusPage statusCode={404} /> }]);
101
92
 
102
93
  // @TODO Detect conflicts in routes and log warning
103
94
 
@@ -125,6 +116,7 @@ export const getRoutesByConfig = (config: ZudokuConfig): RouteObject[] => {
125
116
  <Layout />
126
117
  </Zudoku>
127
118
  ),
119
+ hydrateFallbackElement: <div>Loading...</div>,
128
120
  children: [
129
121
  {
130
122
  element: <RouteGuard />,
@@ -34,7 +34,6 @@ export const Banner = () => {
34
34
  "relative text-primary-foreground text-sm font-medium px-4 py-2 flex gap-2 items-center lg:h-(--banner-height)",
35
35
  mappedColor,
36
36
  )}
37
- data-pagefind-ignore="all"
38
37
  style={style}
39
38
  >
40
39
  <div className="w-full">{page.banner.message}</div>
@@ -9,7 +9,10 @@ export const CategoryHeading = ({
9
9
  className?: string;
10
10
  }) => {
11
11
  return (
12
- <div className={cx("text-sm font-semibold text-primary mb-2", className)}>
12
+ <div
13
+ className={cx("text-sm font-semibold text-primary mb-2", className)}
14
+ data-pagefind-ignore="all"
15
+ >
13
16
  {children}
14
17
  </div>
15
18
  );