zudoku 0.53.1 → 0.53.3

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 (127) hide show
  1. package/README.md +2 -2
  2. package/dist/app/demo.js +2 -1
  3. package/dist/app/demo.js.map +1 -1
  4. package/dist/app/main.js +3 -9
  5. package/dist/app/main.js.map +1 -1
  6. package/dist/cli/build/handler.js +9 -1
  7. package/dist/cli/build/handler.js.map +1 -1
  8. package/dist/config/loader.js +2 -5
  9. package/dist/config/loader.js.map +1 -1
  10. package/dist/config/validators/BuildSchema.js +5 -0
  11. package/dist/config/validators/BuildSchema.js.map +1 -1
  12. package/dist/config/validators/validate.d.ts +1 -1
  13. package/dist/config/validators/validate.js +11 -2
  14. package/dist/config/validators/validate.js.map +1 -1
  15. package/dist/config/validators/validate.test.js +65 -2
  16. package/dist/config/validators/validate.test.js.map +1 -1
  17. package/dist/flat-config.d.ts +325 -0
  18. package/dist/lib/components/Banner.js +1 -1
  19. package/dist/lib/components/Banner.js.map +1 -1
  20. package/dist/lib/components/CategoryHeading.js +1 -1
  21. package/dist/lib/components/CategoryHeading.js.map +1 -1
  22. package/dist/lib/components/Header.js +1 -1
  23. package/dist/lib/components/Header.js.map +1 -1
  24. package/dist/lib/components/Pagination.js +1 -1
  25. package/dist/lib/components/Pagination.js.map +1 -1
  26. package/dist/lib/components/StatusPage.js +4 -0
  27. package/dist/lib/components/StatusPage.js.map +1 -1
  28. package/dist/lib/components/TopNavigation.d.ts +1 -1
  29. package/dist/lib/components/TopNavigation.js.map +1 -1
  30. package/dist/lib/components/navigation/NavigationWrapper.js +1 -1
  31. package/dist/lib/components/navigation/NavigationWrapper.js.map +1 -1
  32. package/dist/lib/core/ZudokuContext.d.ts +1 -1
  33. package/dist/lib/plugins/api-keys/SettingsApiKeys.js +4 -4
  34. package/dist/lib/plugins/api-keys/SettingsApiKeys.js.map +1 -1
  35. package/dist/lib/plugins/markdown/MdxPage.js +1 -1
  36. package/dist/lib/plugins/markdown/MdxPage.js.map +1 -1
  37. package/dist/lib/plugins/search-inkeep/index.d.ts +5 -22
  38. package/dist/lib/plugins/search-inkeep/index.js +35 -29
  39. package/dist/lib/plugins/search-inkeep/index.js.map +1 -1
  40. package/dist/lib/plugins/search-inkeep/inkeep.d.ts +5 -21
  41. package/dist/lib/plugins/search-inkeep/inkeep.js +10 -19
  42. package/dist/lib/plugins/search-inkeep/inkeep.js.map +1 -1
  43. package/dist/lib/plugins/search-pagefind/PagefindSearch.js +1 -1
  44. package/dist/lib/plugins/search-pagefind/PagefindSearch.js.map +1 -1
  45. package/dist/lib/plugins/search-pagefind/ResultList.d.ts +1 -1
  46. package/dist/lib/plugins/search-pagefind/ResultList.js +12 -5
  47. package/dist/lib/plugins/search-pagefind/ResultList.js.map +1 -1
  48. package/dist/lib/ui/Alert.d.ts +1 -1
  49. package/dist/vite/build.js +7 -1
  50. package/dist/vite/build.js.map +1 -1
  51. package/dist/vite/mdx/remark-last-modified.js +1 -28
  52. package/dist/vite/mdx/remark-last-modified.js.map +1 -1
  53. package/dist/vite/plugin-mdx.js +2 -3
  54. package/dist/vite/plugin-mdx.js.map +1 -1
  55. package/lib/{Alert-CT_ViLrJ.js → Alert-FYKbqjIt.js} +2 -2
  56. package/lib/Alert-FYKbqjIt.js.map +1 -0
  57. package/lib/{MdxPage-8UuEK446.js → MdxPage-DyRuoE_F.js} +16 -16
  58. package/lib/{MdxPage-8UuEK446.js.map → MdxPage-DyRuoE_F.js.map} +1 -1
  59. package/lib/{OasProvider-BsWpguVO.js → OasProvider-CUA-DFGE.js} +2 -2
  60. package/lib/{OasProvider-BsWpguVO.js.map → OasProvider-CUA-DFGE.js.map} +1 -1
  61. package/lib/{OperationList-PnZbf3b2.js → OperationList-CRMvWoTv.js} +7 -7
  62. package/lib/{OperationList-PnZbf3b2.js.map → OperationList-CRMvWoTv.js.map} +1 -1
  63. package/lib/{Pagination-DY7gCrm4.js → Pagination-HZKe5ncg.js} +9 -8
  64. package/lib/Pagination-HZKe5ncg.js.map +1 -0
  65. package/lib/{SchemaList-D6k4DKWH.js → SchemaList-B792ORza.js} +6 -6
  66. package/lib/{SchemaList-D6k4DKWH.js.map → SchemaList-B792ORza.js.map} +1 -1
  67. package/lib/{SchemaView-BhgJ9WB8.js → SchemaView-Bo53TeMb.js} +4 -4
  68. package/lib/{SchemaView-BhgJ9WB8.js.map → SchemaView-Bo53TeMb.js.map} +1 -1
  69. package/lib/{SignUp-CpUD6DUM.js → SignUp-DfVvOCYB.js} +2 -2
  70. package/lib/{SignUp-CpUD6DUM.js.map → SignUp-DfVvOCYB.js.map} +1 -1
  71. package/lib/{Slot-DwZlQ-vX.js → Slot-BpO_AGKJ.js} +13 -5
  72. package/lib/Slot-BpO_AGKJ.js.map +1 -0
  73. package/lib/{SyntaxHighlight-CrjhGEwT.js → SyntaxHighlight-CZgjJ7-f.js} +753 -753
  74. package/lib/SyntaxHighlight-CZgjJ7-f.js.map +1 -0
  75. package/lib/{Toc-WCmwFkX-.js → Toc-DYMzDvOa.js} +2 -2
  76. package/lib/{Toc-WCmwFkX-.js.map → Toc-DYMzDvOa.js.map} +1 -1
  77. package/lib/{circular-BUMjK3JF.js → circular-CLdQ0oUd.js} +2 -2
  78. package/lib/{circular-BUMjK3JF.js.map → circular-CLdQ0oUd.js.map} +1 -1
  79. package/lib/{createServer-BPz8ZCrd.js → createServer-Co4BBP-i.js} +4 -4
  80. package/lib/{createServer-BPz8ZCrd.js.map → createServer-Co4BBP-i.js.map} +1 -1
  81. package/lib/{errors-DY-qOx9n.js → errors-DE1gK7ms.js} +3 -3
  82. package/lib/{errors-DY-qOx9n.js.map → errors-DE1gK7ms.js.map} +1 -1
  83. package/lib/{index-C_xVKbf9.js → index-DLshv89l.js} +581 -566
  84. package/lib/index-DLshv89l.js.map +1 -0
  85. package/lib/{index-CcV90rin.js → index-DLzZDv8_.js} +2 -2
  86. package/lib/{index-CcV90rin.js.map → index-DLzZDv8_.js.map} +1 -1
  87. package/lib/{index-dVBKCNMa.js → index-DYP-V0jG.js} +10 -10
  88. package/lib/{index-dVBKCNMa.js.map → index-DYP-V0jG.js.map} +1 -1
  89. package/lib/ui/Alert.js.map +1 -1
  90. package/lib/ui/SyntaxHighlight.js +1 -1
  91. package/lib/zudoku.auth-azureb2c.js +1553 -1556
  92. package/lib/zudoku.auth-azureb2c.js.map +1 -1
  93. package/lib/zudoku.auth-clerk.js +1 -1
  94. package/lib/zudoku.auth-openid.js +1 -1
  95. package/lib/zudoku.components.js +2 -2
  96. package/lib/zudoku.plugin-api-catalog.js +3 -3
  97. package/lib/zudoku.plugin-api-keys.js +61 -53
  98. package/lib/zudoku.plugin-api-keys.js.map +1 -1
  99. package/lib/zudoku.plugin-markdown.js +1 -1
  100. package/lib/zudoku.plugin-openapi.js +1 -1
  101. package/lib/zudoku.plugin-search-inkeep.js +54 -57
  102. package/lib/zudoku.plugin-search-inkeep.js.map +1 -1
  103. package/lib/zudoku.plugin-search-pagefind.js +106 -102
  104. package/lib/zudoku.plugin-search-pagefind.js.map +1 -1
  105. package/package.json +11 -10
  106. package/src/app/demo.tsx +3 -1
  107. package/src/app/main.tsx +6 -14
  108. package/src/lib/components/Banner.tsx +0 -1
  109. package/src/lib/components/CategoryHeading.tsx +4 -1
  110. package/src/lib/components/Header.tsx +4 -1
  111. package/src/lib/components/Pagination.tsx +1 -0
  112. package/src/lib/components/StatusPage.tsx +5 -0
  113. package/src/lib/components/TopNavigation.tsx +1 -1
  114. package/src/lib/components/navigation/NavigationWrapper.tsx +4 -1
  115. package/src/lib/core/ZudokuContext.ts +1 -1
  116. package/src/lib/plugins/api-keys/SettingsApiKeys.tsx +13 -9
  117. package/src/lib/plugins/markdown/MdxPage.tsx +1 -1
  118. package/src/lib/plugins/search-inkeep/index.tsx +54 -58
  119. package/src/lib/plugins/search-inkeep/inkeep.ts +19 -21
  120. package/src/lib/plugins/search-pagefind/PagefindSearch.tsx +1 -0
  121. package/src/lib/plugins/search-pagefind/ResultList.tsx +13 -4
  122. package/src/lib/ui/Alert.tsx +1 -1
  123. package/lib/Alert-CT_ViLrJ.js.map +0 -1
  124. package/lib/Pagination-DY7gCrm4.js.map +0 -1
  125. package/lib/Slot-DwZlQ-vX.js.map +0 -1
  126. package/lib/SyntaxHighlight-CrjhGEwT.js.map +0 -1
  127. package/lib/index-C_xVKbf9.js.map +0 -1
@@ -81,7 +81,10 @@ export const Header = memo(function HeaderInner() {
81
81
  const borderBottom = "inset-shadow-[0_-1px_0_0_var(--border)]";
82
82
 
83
83
  return (
84
- <header className="sticky lg:top-0 z-10 bg-background/80 backdrop-blur w-full">
84
+ <header
85
+ className="sticky lg:top-0 z-10 bg-background/80 backdrop-blur w-full"
86
+ data-pagefind-ignore="all"
87
+ >
85
88
  <Banner />
86
89
  <div className={cn(borderBottom, "relative")}>
87
90
  <PageProgress />
@@ -22,6 +22,7 @@ export const Pagination = ({
22
22
  prev ? "justify-between" : "justify-end",
23
23
  className,
24
24
  )}
25
+ data-pagefind-ignore="all"
25
26
  >
26
27
  {prev && (
27
28
  <Button variant="ghost" asChild>
@@ -1,5 +1,6 @@
1
1
  import type { ReactNode } from "react";
2
2
  import { ErrorPage } from "./ErrorPage.js";
3
+ import { NotFoundPage } from "./NotFoundPage.js";
3
4
 
4
5
  type StatusPageProps = {
5
6
  statusCode: number;
@@ -79,6 +80,10 @@ const getDefaultContent = (
79
80
  };
80
81
 
81
82
  export const StatusPage = ({ statusCode, message }: StatusPageProps) => {
83
+ if (statusCode === 404) {
84
+ return <NotFoundPage />;
85
+ }
86
+
82
87
  const defaultContent = getDefaultContent(statusCode);
83
88
 
84
89
  return (
@@ -1,7 +1,7 @@
1
1
  import { cx } from "class-variance-authority";
2
2
  import { deepEqual } from "fast-equals";
3
3
  import { Suspense } from "react";
4
- import { NavLink, NavLinkProps } from "react-router";
4
+ import { NavLink, type NavLinkProps } from "react-router";
5
5
  import { type NavigationItem } from "../../config/validators/NavigationSchema.js";
6
6
  import { useAuth } from "../authentication/hook.js";
7
7
  import { joinUrl } from "../util/joinUrl.js";
@@ -19,7 +19,10 @@ export const NavigationWrapper = ({
19
19
  }, []);
20
20
 
21
21
  return (
22
- <div className="grid sticky top-(--header-height) lg:h-[calc(100vh-var(--header-height))] grid-rows-[1fr_min-content] border-r">
22
+ <div
23
+ className="grid sticky top-(--header-height) lg:h-[calc(100vh-var(--header-height))] grid-rows-[1fr_min-content] border-r"
24
+ data-pagefind-ignore="all"
25
+ >
23
26
  <nav
24
27
  ref={navRef}
25
28
  className={cn(
@@ -21,7 +21,7 @@ import {
21
21
  isProfileMenuPlugin,
22
22
  type NavigationPlugin,
23
23
  needsInitialization,
24
- ProfileNavigationItem,
24
+ type ProfileNavigationItem,
25
25
  type ZudokuPlugin,
26
26
  } from "./plugins.js";
27
27
 
@@ -226,8 +226,7 @@ export const SettingsApiKeys = ({ service }: { service: ApiKeyService }) => {
226
226
  ) : (
227
227
  <ul
228
228
  className={cn(
229
- "grid grid-cols-1 divide-y divide-border col-span-6",
230
- "lg:grid-cols-[1fr_min-content]",
229
+ "grid grid-cols-[1fr_min-content] divide-y divide-border col-span-6",
231
230
  )}
232
231
  >
233
232
  {data.map((consumers) => (
@@ -310,7 +309,7 @@ export const SettingsApiKeys = ({ service }: { service: ApiKeyService }) => {
310
309
  disabled={editingConsumerId === consumers.id}
311
310
  >
312
311
  <PencilLineIcon size={16} />
313
- Edit label
312
+ <span className="hidden md:block">Edit label</span>
314
313
  </Button>
315
314
  )}
316
315
  {service.rollKey && (
@@ -330,7 +329,7 @@ export const SettingsApiKeys = ({ service }: { service: ApiKeyService }) => {
330
329
  : undefined
331
330
  }
332
331
  />
333
- Roll key
332
+ <span className="hidden md:block">Roll key</span>
334
333
  </Button>
335
334
  </DialogTrigger>
336
335
  <DialogContent>
@@ -436,21 +435,26 @@ const RevealApiKey = ({
436
435
  return (
437
436
  <div className={cn("grid col-span-full grid-cols-subgrid p-6", className)}>
438
437
  <div className="flex flex-col gap-1">
439
- <div className="flex gap-2 items-center text-sm border rounded-md w-fit px-1">
440
- <div className="font-mono truncate h-9 items-center flex px-2 text-xs gap-2">
438
+ <div className="flex gap-2 items-center text-sm border rounded-md w-full max-w-fit px-1">
439
+ <div className="font-mono w-full h-9 items-center flex px-2 text-xs gap-2">
441
440
  <div
442
441
  className={cn(
443
442
  "rounded-full w-2 h-2 bg-emerald-400 mr-2",
444
443
  (expiresSoon || isExpired) && "bg-neutral-200",
445
444
  )}
446
445
  ></div>
447
- <span>
448
- <span className={revealed ? "" : "opacity-20"}>
446
+ <span className="w-full truncate">
447
+ <div
448
+ className={cn(
449
+ "w-40 inline-block md:w-full truncate",
450
+ revealed ? "" : "opacity-20",
451
+ )}
452
+ >
449
453
  {revealed
450
454
  ? key.slice(0, -5)
451
455
  : "**** ".repeat(key.slice(0, -5).length / 5) +
452
456
  "*".repeat(key.slice(0, -5).length % 5)}
453
- </span>
457
+ </div>
454
458
  <span>{key.slice(-5)}</span>
455
459
  </span>
456
460
  </div>
@@ -178,7 +178,7 @@ export const MdxPage = ({
178
178
  </>
179
179
  )}
180
180
  </Typography>
181
- <div className="hidden xl:block">
181
+ <div className="hidden xl:block" data-pagefind-ignore="all">
182
182
  {showToc && <Toc entries={tocEntries} />}
183
183
  </div>
184
184
  </div>
@@ -1,102 +1,98 @@
1
- import { useEffect, useMemo, useRef, useState } from "react";
1
+ import type {
2
+ InkeepBaseSettings,
3
+ InkeepComponentInstance,
4
+ InkeepJS,
5
+ InkeepSettings,
6
+ } from "@inkeep/cxkit-types";
7
+ import { useEffect, useMemo, useState } from "react";
2
8
  import { ClientOnly } from "../../components/ClientOnly.js";
3
9
  import type { ZudokuPlugin } from "../../core/plugins.js";
4
- import { aiChatSettings, baseSettings } from "./inkeep.js";
5
-
6
- interface PluginInkeepBaseSettings {
7
- apiKey?: string;
8
- integrationId: string;
9
- organizationId: string;
10
- organizationDisplayName?: string;
11
- primaryBrandColor: string;
12
- }
13
-
14
- interface InkeepEmbedConfig {
15
- componentType: string;
16
- targetElement: HTMLElement;
17
- properties: unknown;
18
- }
19
-
20
- interface InkeepWidget {
21
- render: (config: InkeepEmbedConfig & { isOpen: boolean }) => void;
22
- }
10
+ import {
11
+ aiChatSettings,
12
+ baseSettings,
13
+ modalSettings,
14
+ searchSettings,
15
+ } from "./inkeep.js";
23
16
 
24
17
  declare global {
25
- let Inkeep: () => {
26
- embed: (config: InkeepEmbedConfig) => InkeepWidget;
27
- };
18
+ interface Window {
19
+ Inkeep: InkeepJS | undefined;
20
+ }
28
21
  }
29
22
 
30
23
  const InkeepSearch = ({
31
- prefilledQuery,
32
24
  isOpen,
33
25
  onClose,
34
26
  settings,
35
27
  }: {
36
28
  isOpen: boolean;
37
29
  onClose: () => void;
38
- prefilledQuery?: string | null;
39
- settings: PluginInkeepBaseSettings;
30
+ settings: InkeepBaseSettings;
40
31
  }) => {
41
- const ref = useRef<HTMLDivElement>(null);
42
- const widgetRef = useRef<InkeepWidget | null>(null);
43
- const [isInkeepAvailable, setIsInkeepAvailable] = useState(
44
- typeof Inkeep !== "undefined",
45
- );
46
-
47
- const config: InkeepEmbedConfig = useMemo(
32
+ const config = useMemo<InkeepSettings>(
48
33
  () => ({
49
- componentType: "CustomTrigger",
50
- targetElement: ref.current!,
51
- properties: {
52
- isOpen,
53
- onClose,
54
- onOpen: undefined,
55
- baseSettings: { ...baseSettings, ...settings },
56
- searchSettings: {
57
- prefilledQuery: prefilledQuery || undefined,
34
+ baseSettings: {
35
+ ...baseSettings,
36
+ ...settings,
37
+ colorMode: {
38
+ sync: {
39
+ target: "html",
40
+ attributes: ["class"],
41
+ isDarkMode: (attrs) => attrs["class"]?.includes("dark") ?? false,
42
+ },
43
+ },
44
+ },
45
+ modalSettings: {
46
+ ...modalSettings,
47
+ onOpenChange: (newOpen: boolean) => {
48
+ if (!newOpen) onClose();
58
49
  },
59
- aiChatSettings,
60
50
  },
51
+ searchSettings,
52
+ aiChatSettings,
61
53
  }),
62
- [isOpen, onClose, prefilledQuery, settings, ref],
54
+ [onClose, settings],
55
+ );
56
+ const [searchInstance, setSearchInstance] = useState<
57
+ InkeepComponentInstance | undefined
58
+ >(
59
+ typeof window !== "undefined" && window.Inkeep?.ModalSearchAndChat
60
+ ? window.Inkeep.ModalSearchAndChat(config)!
61
+ : undefined,
63
62
  );
64
63
 
65
64
  useEffect(() => {
66
- if (isInkeepAvailable) return;
65
+ if (searchInstance) return;
67
66
 
68
67
  const checkInkeep = setInterval(() => {
69
- if (typeof Inkeep !== "undefined") {
70
- setIsInkeepAvailable(true);
68
+ if (typeof window !== "undefined" && window.Inkeep?.ModalSearchAndChat) {
69
+ const inkeep = window.Inkeep.ModalSearchAndChat(config)!;
70
+ setSearchInstance(inkeep);
71
71
  clearInterval(checkInkeep);
72
72
  }
73
73
  }, 100);
74
74
 
75
75
  return () => clearInterval(checkInkeep);
76
- }, [isInkeepAvailable]);
76
+ }, [config, searchInstance]);
77
77
 
78
78
  useEffect(() => {
79
- if (!isInkeepAvailable || widgetRef.current) return;
80
-
81
- widgetRef.current = Inkeep().embed(config);
82
- }, [config, isInkeepAvailable]);
79
+ if (!searchInstance) return;
83
80
 
84
- useEffect(() => {
85
- widgetRef.current?.render({ ...config, isOpen });
86
- }, [config, isOpen]);
81
+ searchInstance.update({ modalSettings: { isOpen } });
82
+ }, [isOpen, searchInstance]);
87
83
 
88
- return <div ref={ref} />;
84
+ return null;
89
85
  };
90
86
 
91
87
  export const inkeepSearchPlugin = (
92
- settings: PluginInkeepBaseSettings,
88
+ settings: InkeepBaseSettings,
93
89
  ): ZudokuPlugin => {
94
90
  return {
95
91
  getHead: () => {
96
92
  return (
97
93
  <script
98
94
  type="module"
99
- src="https://unpkg.com/@inkeep/uikit-js@0.3.19/dist/embed.js"
95
+ src="https://cdn.jsdelivr.net/npm/@inkeep/cxkit-js@0.5.90/+esm"
100
96
  defer
101
97
  />
102
98
  );
@@ -1,26 +1,24 @@
1
- const baseSettings = {
2
- theme: {
3
- components: {
4
- AIChatPageWrapper: {
5
- defaultProps: {
6
- size: "shrink-vertically",
7
- variant: "no-shadow",
8
- },
9
- },
10
- SearchBarTrigger: {
11
- defaultProps: {
12
- size: "expand",
13
- variant: "subtle", // Choose from 'emphasized' or 'subtle'
14
- },
15
- },
16
- },
17
- },
18
- } as const;
1
+ import type {
2
+ InkeepAIChatSettings,
3
+ InkeepBaseSettings,
4
+ InkeepModalSettings,
5
+ InkeepSearchSettings,
6
+ } from "@inkeep/cxkit-types";
19
7
 
20
- const modalSettings = {};
8
+ const baseSettings: InkeepBaseSettings = {
9
+ primaryBrandColor: "#26D6FF",
10
+ };
21
11
 
22
- const searchSettings = {};
12
+ const modalSettings: InkeepModalSettings = {
13
+ shortcutKey: "k",
14
+ };
23
15
 
24
- const aiChatSettings = {};
16
+ const searchSettings: InkeepSearchSettings = {
17
+ placeholder: "Search...",
18
+ };
19
+
20
+ const aiChatSettings: InkeepAIChatSettings = {
21
+ aiAssistantName: "Assistant",
22
+ };
25
23
 
26
24
  export { aiChatSettings, baseSettings, modalSettings, searchSettings };
@@ -153,6 +153,7 @@ export const PagefindSearch = ({
153
153
  </div>
154
154
  ) : (
155
155
  <ResultList
156
+ basePath={context.options.basePath}
156
157
  searchResults={searchResults ?? []}
157
158
  searchTerm={searchTerm}
158
159
  onClose={onClose}
@@ -2,6 +2,7 @@ import { BracketsIcon, FileTextIcon } from "lucide-react";
2
2
  import { useLayoutEffect, useRef } from "react";
3
3
  import { Link, useNavigate } from "react-router";
4
4
  import { CommandGroup, CommandItem, CommandList } from "zudoku/ui/Command.js";
5
+ import { joinUrl } from "../../util/joinUrl.js";
5
6
  import {
6
7
  type PagefindSearchFragment,
7
8
  type PagefindSubResult,
@@ -22,6 +23,7 @@ const sortSubResults = (a: PagefindSubResult, b: PagefindSubResult) => {
22
23
  const hoverClassname = `cursor-pointer border border-transparent data-[selected=true]:border-border`;
23
24
 
24
25
  export const ResultList = ({
26
+ basePath,
25
27
  searchResults,
26
28
  searchTerm,
27
29
  onClose,
@@ -42,6 +44,13 @@ export const ResultList = ({
42
44
  });
43
45
  }, [searchTerm]);
44
46
 
47
+ const stripBasePath = (url: string) => {
48
+ if (basePath && url.startsWith(basePath)) {
49
+ return joinUrl(url.slice(basePath.length));
50
+ }
51
+ return url;
52
+ };
53
+
45
54
  return (
46
55
  <CommandList className="max-h-[450px]" ref={commandListRef}>
47
56
  {searchTerm && searchResults.length > 0 && (
@@ -60,11 +69,11 @@ export const ResultList = ({
60
69
  value={`${result.meta.title}-${result.url}`}
61
70
  className={hoverClassname}
62
71
  onSelect={() => {
63
- void navigate(result.url);
72
+ void navigate(stripBasePath(result.url));
64
73
  onClose();
65
74
  }}
66
75
  >
67
- <Link to={result.url}>
76
+ <Link to={stripBasePath(result.url)}>
68
77
  {result.meta.section === "openapi" ? (
69
78
  <BracketsIcon />
70
79
  ) : (
@@ -83,11 +92,11 @@ export const ResultList = ({
83
92
  value={`sub-${result.meta.title}-${subResult.url}`}
84
93
  className={hoverClassname}
85
94
  onSelect={() => {
86
- void navigate(subResult.url);
95
+ void navigate(stripBasePath(subResult.url));
87
96
  onClose();
88
97
  }}
89
98
  >
90
- <Link to={subResult.url} onClick={onClose}>
99
+ <Link to={stripBasePath(subResult.url)} onClick={onClose}>
91
100
  <div className="flex flex-col items-start gap-2 ms-2.5 ps-5 border-l border-muted-foreground/50">
92
101
  <span className="font-bold">{subResult.title}</span>
93
102
  <span
@@ -1,5 +1,5 @@
1
1
  import { cva, type VariantProps } from "class-variance-authority";
2
- import * as React from "react";
2
+ import type * as React from "react";
3
3
  import { cn } from "../util/cn.js";
4
4
 
5
5
  const alertVariants = cva(
@@ -1 +0,0 @@
1
- {"version":3,"file":"Alert-CT_ViLrJ.js","sources":["../../../node_modules/.pnpm/@tanstack+query-core@5.74.3/node_modules/@tanstack/query-core/build/modern/mutationObserver.js","../../../node_modules/.pnpm/@tanstack+react-query@5.74.3_react@19.1.0/node_modules/@tanstack/react-query/build/modern/useMutation.js","../src/lib/ui/Alert.tsx"],"sourcesContent":["// src/mutationObserver.ts\nimport { getDefaultState } from \"./mutation.js\";\nimport { notifyManager } from \"./notifyManager.js\";\nimport { Subscribable } from \"./subscribable.js\";\nimport { hashKey, shallowEqualObjects } from \"./utils.js\";\nvar MutationObserver = class extends Subscribable {\n #client;\n #currentResult = void 0;\n #currentMutation;\n #mutateOptions;\n constructor(client, options) {\n super();\n this.#client = client;\n this.setOptions(options);\n this.bindMethods();\n this.#updateResult();\n }\n bindMethods() {\n this.mutate = this.mutate.bind(this);\n this.reset = this.reset.bind(this);\n }\n setOptions(options) {\n const prevOptions = this.options;\n this.options = this.#client.defaultMutationOptions(options);\n if (!shallowEqualObjects(this.options, prevOptions)) {\n this.#client.getMutationCache().notify({\n type: \"observerOptionsUpdated\",\n mutation: this.#currentMutation,\n observer: this\n });\n }\n if (prevOptions?.mutationKey && this.options.mutationKey && hashKey(prevOptions.mutationKey) !== hashKey(this.options.mutationKey)) {\n this.reset();\n } else if (this.#currentMutation?.state.status === \"pending\") {\n this.#currentMutation.setOptions(this.options);\n }\n }\n onUnsubscribe() {\n if (!this.hasListeners()) {\n this.#currentMutation?.removeObserver(this);\n }\n }\n onMutationUpdate(action) {\n this.#updateResult();\n this.#notify(action);\n }\n getCurrentResult() {\n return this.#currentResult;\n }\n reset() {\n this.#currentMutation?.removeObserver(this);\n this.#currentMutation = void 0;\n this.#updateResult();\n this.#notify();\n }\n mutate(variables, options) {\n this.#mutateOptions = options;\n this.#currentMutation?.removeObserver(this);\n this.#currentMutation = this.#client.getMutationCache().build(this.#client, this.options);\n this.#currentMutation.addObserver(this);\n return this.#currentMutation.execute(variables);\n }\n #updateResult() {\n const state = this.#currentMutation?.state ?? getDefaultState();\n this.#currentResult = {\n ...state,\n isPending: state.status === \"pending\",\n isSuccess: state.status === \"success\",\n isError: state.status === \"error\",\n isIdle: state.status === \"idle\",\n mutate: this.mutate,\n reset: this.reset\n };\n }\n #notify(action) {\n notifyManager.batch(() => {\n if (this.#mutateOptions && this.hasListeners()) {\n const variables = this.#currentResult.variables;\n const context = this.#currentResult.context;\n if (action?.type === \"success\") {\n this.#mutateOptions.onSuccess?.(action.data, variables, context);\n this.#mutateOptions.onSettled?.(action.data, null, variables, context);\n } else if (action?.type === \"error\") {\n this.#mutateOptions.onError?.(action.error, variables, context);\n this.#mutateOptions.onSettled?.(\n void 0,\n action.error,\n variables,\n context\n );\n }\n }\n this.listeners.forEach((listener) => {\n listener(this.#currentResult);\n });\n });\n }\n};\nexport {\n MutationObserver\n};\n//# sourceMappingURL=mutationObserver.js.map","\"use client\";\n\n// src/useMutation.ts\nimport * as React from \"react\";\nimport { MutationObserver, notifyManager } from \"@tanstack/query-core\";\nimport { useQueryClient } from \"./QueryClientProvider.js\";\nimport { noop, shouldThrowError } from \"./utils.js\";\nfunction useMutation(options, queryClient) {\n const client = useQueryClient(queryClient);\n const [observer] = React.useState(\n () => new MutationObserver(\n client,\n options\n )\n );\n React.useEffect(() => {\n observer.setOptions(options);\n }, [observer, options]);\n const result = React.useSyncExternalStore(\n React.useCallback(\n (onStoreChange) => observer.subscribe(notifyManager.batchCalls(onStoreChange)),\n [observer]\n ),\n () => observer.getCurrentResult(),\n () => observer.getCurrentResult()\n );\n const mutate = React.useCallback(\n (variables, mutateOptions) => {\n observer.mutate(variables, mutateOptions).catch(noop);\n },\n [observer]\n );\n if (result.error && shouldThrowError(observer.options.throwOnError, [result.error])) {\n throw result.error;\n }\n return { ...result, mutate, mutateAsync: result.mutate };\n}\nexport {\n useMutation\n};\n//# sourceMappingURL=useMutation.js.map","import { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\nimport { cn } from \"../util/cn.js\";\n\nconst alertVariants = cva(\n \"relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground\",\n destructive:\n \"text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nfunction Alert({\n className,\n variant,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof alertVariants>) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-title\"\n className={cn(\n \"col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AlertDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\n \"text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport { Alert, AlertDescription, AlertTitle };\n"],"names":["MutationObserver","Subscribable","#client","#currentResult","#currentMutation","#mutateOptions","client","options","#updateResult","prevOptions","shallowEqualObjects","hashKey","action","#notify","variables","state","getDefaultState","notifyManager","context","listener","useMutation","queryClient","useQueryClient","observer","React","result","onStoreChange","mutate","mutateOptions","noop","shouldThrowError","alertVariants","cva","Alert","className","variant","props","jsx","cn","AlertTitle","AlertDescription"],"mappings":"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","x_google_ignoreList":[0,1]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Pagination-DY7gCrm4.js","sources":["../src/lib/components/Pagination.tsx"],"sourcesContent":["import { ArrowLeftIcon, ArrowRightIcon } from \"lucide-react\";\nimport { Link } from \"react-router\";\nimport { cn } from \"../util/cn.js\";\nimport { Button } from \"./index.js\";\n\nexport const Pagination = ({\n prev,\n next,\n className,\n}: {\n prev: { to: string; label: string } | undefined;\n next: { to: string; label: string } | undefined;\n className?: string;\n}) => {\n const linkClass =\n \"group transition-all p-5 space-x-1 rtl:space-x-reverse transition-all hover:text-foreground\";\n\n return (\n <div\n className={cn(\n \"flex -mx-4 text-muted-foreground font-semibold\",\n prev ? \"justify-between\" : \"justify-end\",\n className,\n )}\n >\n {prev && (\n <Button variant=\"ghost\" asChild>\n <Link to={prev.to} relative=\"path\" className={linkClass}>\n <ArrowLeftIcon size={14} strokeWidth={2.5} />\n <span className=\"text-lg truncate\">{prev.label}</span>\n </Link>\n </Button>\n )}\n {next && (\n <Button variant=\"ghost\" asChild>\n <Link to={next.to} relative=\"path\" className={linkClass}>\n <span className=\"text-lg truncate\">{next.label}</span>\n <ArrowRightIcon size={14} strokeWidth={2.5} />\n </Link>\n </Button>\n )}\n </div>\n );\n};\n"],"names":["Pagination","prev","next","className","linkClass","jsxs","cn","jsx","Button","Link","ArrowLeftIcon","ArrowRightIcon"],"mappings":";;;;;AAKO,MAAMA,IAAa,CAAC;AAAA,EACzB,MAAAC;AAAA,EACA,MAAAC;AAAA,EACA,WAAAC;AACF,MAIM;AACJ,QAAMC,IACJ;AAGA,SAAAC,gBAAAA,EAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC;AAAA,QACT;AAAA,QACAL,IAAO,oBAAoB;AAAA,QAC3BE;AAAA,MACF;AAAA,MAEC,UAAA;AAAA,QAAAF,KACEM,gBAAAA,EAAAA,IAAAC,GAAA,EAAO,SAAQ,SAAQ,SAAO,IAC7B,UAAAH,gBAAAA,EAAAA,KAACI,GAAK,EAAA,IAAIR,EAAK,IAAI,UAAS,QAAO,WAAWG,GAC5C,UAAA;AAAA,UAAAG,gBAAAA,EAAA,IAACG,GAAc,EAAA,MAAM,IAAI,aAAa,KAAK;AAAA,UAC1CH,gBAAAA,EAAA,IAAA,QAAA,EAAK,WAAU,oBAAoB,YAAK,MAAM,CAAA;AAAA,QAAA,EAAA,CACjD,EACF,CAAA;AAAA,QAEDL,KACCK,gBAAAA,EAAAA,IAACC,GAAO,EAAA,SAAQ,SAAQ,SAAO,IAC7B,UAACH,gBAAAA,EAAAA,KAAAI,GAAA,EAAK,IAAIP,EAAK,IAAI,UAAS,QAAO,WAAWE,GAC5C,UAAA;AAAA,UAAAG,gBAAAA,EAAA,IAAC,QAAK,EAAA,WAAU,oBAAoB,UAAAL,EAAK,OAAM;AAAA,UAC9CK,gBAAAA,EAAA,IAAAI,GAAA,EAAe,MAAM,IAAI,aAAa,IAAK,CAAA;AAAA,QAAA,EAAA,CAC9C,EACF,CAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAEJ;AAEJ;"}