zudoku 0.16.2 → 0.16.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 (51) hide show
  1. package/dist/app/entry.server.js +4 -5
  2. package/dist/app/entry.server.js.map +1 -1
  3. package/dist/lib/components/Header.js +2 -2
  4. package/dist/lib/components/Header.js.map +1 -1
  5. package/dist/lib/plugins/openapi/CollapsibleCode.js +4 -2
  6. package/dist/lib/plugins/openapi/CollapsibleCode.js.map +1 -1
  7. package/dist/lib/plugins/openapi/ParameterListItem.js +6 -1
  8. package/dist/lib/plugins/openapi/ParameterListItem.js.map +1 -1
  9. package/dist/lib/plugins/openapi/client/createMemoryClient.d.ts +1 -4
  10. package/dist/lib/plugins/openapi/client/createMemoryClient.js +9 -1
  11. package/dist/lib/plugins/openapi/client/createMemoryClient.js.map +1 -1
  12. package/dist/lib/plugins/openapi/client/createWorkerClient.js +2 -1
  13. package/dist/lib/plugins/openapi/client/createWorkerClient.js.map +1 -1
  14. package/dist/lib/ui/ActionButton.d.ts +2 -0
  15. package/dist/lib/ui/ActionButton.js +10 -0
  16. package/dist/lib/ui/ActionButton.js.map +1 -0
  17. package/dist/lib/util/useIsomorphicLayoutEffect.d.ts +3 -0
  18. package/dist/lib/util/useIsomorphicLayoutEffect.js +4 -0
  19. package/dist/lib/util/useIsomorphicLayoutEffect.js.map +1 -0
  20. package/lib/{OperationList-35iw_Gil.js → OperationList-BjppA5yM.js} +116 -113
  21. package/lib/OperationList-BjppA5yM.js.map +1 -0
  22. package/lib/{Route-BsEZmkNl.js → Route-D_djzMv3.js} +2 -2
  23. package/lib/{Route-BsEZmkNl.js.map → Route-D_djzMv3.js.map} +1 -1
  24. package/lib/{Spinner-C6zroowC.js → SidebarBadge-Bbt92M5K.js} +16 -18
  25. package/lib/SidebarBadge-Bbt92M5K.js.map +1 -0
  26. package/lib/Spinner-ChOGyPls.js +51 -0
  27. package/lib/Spinner-ChOGyPls.js.map +1 -0
  28. package/lib/{index-BdD8UbS-.js → index-_gtpPhlu.js} +342 -380
  29. package/lib/index-_gtpPhlu.js.map +1 -0
  30. package/lib/ui/ActionButton.js +24 -0
  31. package/lib/ui/ActionButton.js.map +1 -0
  32. package/lib/urql-core-35Qt_U4i.js +1511 -0
  33. package/lib/{urql-core-KJnLL26g.js.map → urql-core-35Qt_U4i.js.map} +1 -1
  34. package/lib/zudoku.components.js +159 -158
  35. package/lib/zudoku.components.js.map +1 -1
  36. package/lib/zudoku.openapi-worker.js +737 -729
  37. package/lib/zudoku.openapi-worker.js.map +1 -1
  38. package/lib/zudoku.plugin-openapi.js +2 -2
  39. package/package.json +2 -2
  40. package/src/app/entry.server.tsx +9 -5
  41. package/src/lib/components/Header.tsx +5 -5
  42. package/src/lib/plugins/openapi/CollapsibleCode.tsx +5 -8
  43. package/src/lib/plugins/openapi/ParameterListItem.tsx +37 -31
  44. package/src/lib/plugins/openapi/client/createMemoryClient.ts +17 -3
  45. package/src/lib/plugins/openapi/client/createWorkerClient.ts +5 -1
  46. package/src/lib/ui/ActionButton.tsx +28 -0
  47. package/src/lib/util/useIsomorphicLayoutEffect.ts +5 -0
  48. package/lib/OperationList-35iw_Gil.js.map +0 -1
  49. package/lib/Spinner-C6zroowC.js.map +0 -1
  50. package/lib/index-BdD8UbS-.js.map +0 -1
  51. package/lib/urql-core-KJnLL26g.js +0 -1455
@@ -1,12 +1,12 @@
1
1
  import "./jsx-runtime-B6kdoens.js";
2
- import { o as s } from "./index-BdD8UbS-.js";
2
+ import { o as s } from "./index-_gtpPhlu.js";
3
3
  import "./ZudokuContext-BKXGJTmu.js";
4
4
  import "lucide-react";
5
5
  import "zudoku/openapi-worker";
6
6
  import "./hook-sn0zMTkE.js";
7
7
  import "./Markdown-BDcCAWwm.js";
8
8
  import "./ui/Button.js";
9
- import "./urql-core-KJnLL26g.js";
9
+ import "./urql-core-35Qt_U4i.js";
10
10
  import "./router-BsfSoK2j.js";
11
11
  import "./index-CRo94sKK.js";
12
12
  export {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zudoku",
3
- "version": "0.16.2",
3
+ "version": "0.16.3",
4
4
  "type": "module",
5
5
  "homepage": "https://zudoku.dev",
6
6
  "repository": {
@@ -141,7 +141,7 @@
141
141
  "@types/react": "18.3.11",
142
142
  "@types/react-dom": "18.3.1",
143
143
  "@vitejs/plugin-react": "4.3.1",
144
- "@zudoku/config": "0.16.2",
144
+ "@zudoku/config": "0.16.3",
145
145
  "@zudoku/httpsnippet": "10.0.9",
146
146
  "@zudoku/react-helmet-async": "2.0.4",
147
147
  "autoprefixer": "10.4.20",
@@ -11,6 +11,7 @@ import {
11
11
  import "virtual:zudoku-theme.css";
12
12
  import { BootstrapStatic, ServerError } from "zudoku/components";
13
13
  import type { ZudokuConfig } from "../config/config.js";
14
+ import { ssr as urqlSsr } from "../lib/plugins/openapi/client/createMemoryClient.js";
14
15
  import type { FileWritingResponse } from "../vite/prerender.js";
15
16
  import "./main.css";
16
17
  import { getRoutesByConfig } from "./main.js";
@@ -38,9 +39,6 @@ export const render = async ({
38
39
  ? baseRequest
39
40
  : createFetchRequest(baseRequest, response);
40
41
 
41
- if (!request) {
42
- throw new Error("Either fetchRequest or expressRequest must be provided");
43
- }
44
42
  const context = await query(request);
45
43
  let status = 200;
46
44
 
@@ -65,6 +63,7 @@ export const render = async ({
65
63
 
66
64
  const router = createStaticRouter(dataRoutes, context);
67
65
  const helmetContext = {} as HelmetData["context"];
66
+ const graphqlData = urqlSsr.extractData();
68
67
 
69
68
  const { pipe } = renderToPipeableStream(
70
69
  <BootstrapStatic
@@ -83,7 +82,7 @@ export const render = async ({
83
82
  },
84
83
  // for SSG we could use onAllReady instead of onShellReady
85
84
  // https://react.dev/reference/react-dom/server/renderToPipeableStream#waiting-for-all-content-to-load-for-crawlers-and-static-generation
86
- onShellReady() {
85
+ onAllReady() {
87
86
  response.set({ "Content-Type": "text/html" });
88
87
  response.status(status);
89
88
 
@@ -114,7 +113,12 @@ export const render = async ({
114
113
  );
115
114
 
116
115
  transformStream.on("finish", () => {
117
- response.end(htmlEnd);
116
+ response.end(
117
+ htmlEnd?.replace(
118
+ "</body>",
119
+ `<script>window.__URQL_DATA__ = ${JSON.stringify(graphqlData)};</script></body>`,
120
+ ),
121
+ );
118
122
  });
119
123
 
120
124
  pipe(transformStream);
@@ -1,9 +1,9 @@
1
1
  import { MoonStarIcon, SunIcon } from "lucide-react";
2
2
  import { memo } from "react";
3
3
  import { Link } from "react-router-dom";
4
+ import { Button } from "zudoku/ui/Button.js";
4
5
  import { useAuth } from "../authentication/hook.js";
5
6
  import { isProfileMenuPlugin, ProfileNavigationItem } from "../core/plugins.js";
6
- import { Button } from "../ui/Button.js";
7
7
  import {
8
8
  DropdownMenu,
9
9
  DropdownMenuContent,
@@ -134,16 +134,16 @@ export const Header = memo(function HeaderInner() {
134
134
  </DropdownMenu>
135
135
  )
136
136
  )}
137
- <button
138
- type="button"
137
+ <Button
138
+ variant="ghost"
139
139
  aria-label={
140
140
  isDark ? "Switch to light mode" : "Switch to dark mode"
141
141
  }
142
- className="cursor-pointer hover:bg-secondary p-2.5 -m-2.5 rounded-full"
142
+ className="p-2.5 -m-2.5 rounded-full"
143
143
  onClick={toggleTheme}
144
144
  >
145
145
  <ThemeIcon size={18} />
146
- </button>
146
+ </Button>
147
147
  <Slotlet name="head-navigation-end" />
148
148
  </div>
149
149
  </div>
@@ -1,10 +1,4 @@
1
- import {
2
- type CSSProperties,
3
- type ReactNode,
4
- useEffect,
5
- useRef,
6
- useState,
7
- } from "react";
1
+ import { type CSSProperties, type ReactNode, useRef, useState } from "react";
8
2
  import { Button } from "zudoku/ui/Button.js";
9
3
  import {
10
4
  Collapsible,
@@ -12,6 +6,7 @@ import {
12
6
  CollapsibleTrigger,
13
7
  } from "zudoku/ui/Collapsible.js";
14
8
  import { cn } from "../../util/cn.js";
9
+ import useIsomorphicLayoutEffect from "../../util/useIsomorphicLayoutEffect.js";
15
10
 
16
11
  export const CollapsibleCode = ({
17
12
  children,
@@ -24,10 +19,12 @@ export const CollapsibleCode = ({
24
19
  const [isOverflowing, setIsOverflowing] = useState(false);
25
20
  const [open, setOpen] = useState(false);
26
21
 
27
- useEffect(() => {
22
+ useIsomorphicLayoutEffect(() => {
28
23
  const el = contentRef.current;
29
24
  if (!el) return;
30
25
 
26
+ setIsOverflowing(el.scrollHeight > maxHeight);
27
+
31
28
  const observer = new ResizeObserver(() => {
32
29
  setIsOverflowing(el.scrollHeight > maxHeight);
33
30
  });
@@ -27,36 +27,42 @@ export const ParameterListItem = ({
27
27
  parameter: ParameterListItemResult;
28
28
  group: ParameterGroup;
29
29
  id: string;
30
- }) => (
31
- <li className="p-4 bg-border/20 text-sm flex flex-col gap-1">
32
- <div className="flex items-center gap-2">
33
- <code>
34
- {group === "path" ? (
35
- <ColorizedParam
36
- name={parameter.name}
37
- backgroundOpacity="15%"
38
- slug={id + "-" + parameter.name.toLocaleLowerCase()}
39
- />
40
- ) : (
41
- parameter.name
30
+ }) => {
31
+ const paramSchema = getParameterSchema(parameter);
32
+
33
+ return (
34
+ <li className="p-4 bg-border/20 text-sm flex flex-col gap-1">
35
+ <div className="flex items-center gap-2">
36
+ <code>
37
+ {group === "path" ? (
38
+ <ColorizedParam
39
+ name={parameter.name}
40
+ backgroundOpacity="15%"
41
+ slug={id + "-" + parameter.name.toLocaleLowerCase()}
42
+ />
43
+ ) : (
44
+ parameter.name
45
+ )}
46
+ </code>
47
+ {parameter.required && (
48
+ <span className="py-px px-1.5 font-medium bg-primary/75 text-muted rounded-lg">
49
+ required
50
+ </span>
42
51
  )}
43
- </code>
44
- {parameter.required && (
45
- <span className="py-px px-1.5 font-medium bg-primary/75 text-muted rounded-lg">
46
- required
47
- </span>
48
- )}
49
- {getParameterSchema(parameter).type && (
50
- <span className="text-muted-foreground">
51
- {getParameterSchema(parameter).type}
52
- </span>
52
+ {paramSchema.type && (
53
+ <span className="text-muted-foreground">
54
+ {paramSchema.type === "array"
55
+ ? `${paramSchema.items.type}[]`
56
+ : paramSchema.type}
57
+ </span>
58
+ )}
59
+ </div>
60
+ {parameter.description && (
61
+ <Markdown
62
+ content={parameter.description}
63
+ className="text-sm prose-p:my-1 prose-code:whitespace-pre-line"
64
+ />
53
65
  )}
54
- </div>
55
- {parameter.description && (
56
- <Markdown
57
- content={parameter.description}
58
- className="text-sm prose-p:my-1 prose-code:whitespace-pre-line"
59
- />
60
- )}
61
- </li>
62
- );
66
+ </li>
67
+ );
68
+ };
@@ -1,12 +1,25 @@
1
1
  /* eslint-disable no-console */
2
- import { cacheExchange, Client, fetchExchange, mapExchange } from "urql";
2
+ import {
3
+ cacheExchange,
4
+ Client,
5
+ fetchExchange,
6
+ mapExchange,
7
+ ssrExchange,
8
+ } from "urql";
3
9
  import { createServer } from "./createServer.js";
4
10
  import { CreateClientFunction } from "./interfaces.js";
5
11
 
6
- export type WorkerGraphQLMessage = { id: string; body: string };
7
-
8
12
  const localServer = createServer();
9
13
 
14
+ const initialState =
15
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
16
+ typeof window !== "undefined" ? (window as any).__URQL_DATA__ : undefined;
17
+
18
+ export const ssr = ssrExchange({
19
+ isClient: typeof window !== "undefined",
20
+ initialState,
21
+ });
22
+
10
23
  /**
11
24
  * Creates an in memory Client that does not use Workers. This allows
12
25
  * developers to run the simple standalone version of zudoku using the CDN
@@ -45,6 +58,7 @@ export const createClient: CreateClientFunction = () => {
45
58
  console.groupEnd();
46
59
  },
47
60
  }),
61
+ ssr,
48
62
  fetchExchange,
49
63
  ],
50
64
  });
@@ -2,7 +2,10 @@
2
2
  import { monotonicFactory } from "ulidx";
3
3
  import { cacheExchange, Client, fetchExchange, mapExchange } from "urql";
4
4
  import { createWaitForNotify } from "../../../util/createWaitForNotify.js";
5
- import { createClient as createMemoryClient } from "./createMemoryClient.js";
5
+ import {
6
+ createClient as createMemoryClient,
7
+ ssr,
8
+ } from "./createMemoryClient.js";
6
9
  import { CreateClientFunction } from "./interfaces.js";
7
10
 
8
11
  export type WorkerGraphQLMessage = { id: string; body: string };
@@ -69,6 +72,7 @@ export const createClient: CreateClientFunction = ({
69
72
  console.groupEnd();
70
73
  },
71
74
  }),
75
+ ssr,
72
76
  fetchExchange,
73
77
  ],
74
78
  });
@@ -0,0 +1,28 @@
1
+ import { forwardRef } from "react";
2
+ import { Button, type ButtonProps } from "zudoku/ui/Button.js";
3
+ import { Spinner } from "../components/Spinner.js";
4
+ import { cn } from "../util/cn.js";
5
+
6
+ type ActionButtonProps = ButtonProps & { isPending?: boolean };
7
+
8
+ export const ActionButton = forwardRef<HTMLButtonElement, ButtonProps>(
9
+ ({ isPending, children, className, ...props }: ActionButtonProps, ref) => {
10
+ return (
11
+ <Button
12
+ ref={ref}
13
+ disabled={isPending}
14
+ {...props}
15
+ className={cn("relative", className)}
16
+ >
17
+ {isPending && (
18
+ <div className="absolute inset-0 grid place-items-center">
19
+ <Spinner />
20
+ </div>
21
+ )}
22
+ <div className={cn(isPending && "invisible")}>{children}</div>
23
+ </Button>
24
+ );
25
+ },
26
+ );
27
+
28
+ ActionButton.displayName = "ActionButton";
@@ -0,0 +1,5 @@
1
+ import { useEffect, useLayoutEffect } from "react";
2
+ const useIsomorphicLayoutEffect =
3
+ typeof window !== "undefined" ? useLayoutEffect : useEffect;
4
+
5
+ export default useIsomorphicLayoutEffect;
@@ -1 +0,0 @@
1
- {"version":3,"file":"OperationList-35iw_Gil.js","sources":["../src/lib/plugins/openapi/graphql/fragment-masking.ts","../src/lib/plugins/openapi/Endpoint.tsx","../src/lib/util/groupBy.ts","../src/lib/util/renderIf.ts","../src/lib/plugins/openapi/ParameterListItem.tsx","../src/lib/plugins/openapi/ParameterList.tsx","../src/lib/util/objectEntries.ts","../src/lib/plugins/openapi/schema/LogicalGroup/LogicalGroupConnector.tsx","../src/lib/plugins/openapi/schema/LogicalGroup/LogicalGroupItem.tsx","../src/lib/plugins/openapi/schema/LogicalGroup/LogicalGroup.tsx","../src/lib/plugins/openapi/schema/utils.ts","../src/lib/plugins/openapi/schema/SchemaComponents.tsx","../src/lib/plugins/openapi/schema/SchemaView.tsx","../src/lib/plugins/openapi/OperationListItem.tsx","../src/lib/plugins/openapi/OperationList.tsx"],"sourcesContent":["/* eslint-disable */\nimport type {\n DocumentTypeDecoration,\n ResultOf,\n TypedDocumentNode,\n} from \"@graphql-typed-document-node/core\";\nimport type { FragmentDefinitionNode } from \"graphql\";\nimport type { Incremental } from \"./graphql.js\";\n\nexport type FragmentType<\n TDocumentType extends DocumentTypeDecoration<any, any>,\n> =\n TDocumentType extends DocumentTypeDecoration<infer TType, any>\n ? [TType] extends [{ \" $fragmentName\"?: infer TKey }]\n ? TKey extends string\n ? { \" $fragmentRefs\"?: { [key in TKey]: TType } }\n : never\n : never\n : never;\n\n// return non-nullable if `fragmentType` is non-nullable\nexport function useFragment<TType>(\n _documentNode: DocumentTypeDecoration<TType, any>,\n fragmentType: FragmentType<DocumentTypeDecoration<TType, any>>,\n): TType;\n// return nullable if `fragmentType` is undefined\nexport function useFragment<TType>(\n _documentNode: DocumentTypeDecoration<TType, any>,\n fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | undefined,\n): TType | undefined;\n// return nullable if `fragmentType` is nullable\nexport function useFragment<TType>(\n _documentNode: DocumentTypeDecoration<TType, any>,\n fragmentType: FragmentType<DocumentTypeDecoration<TType, any>> | null,\n): TType | null;\n// return nullable if `fragmentType` is nullable or undefined\nexport function useFragment<TType>(\n _documentNode: DocumentTypeDecoration<TType, any>,\n fragmentType:\n | FragmentType<DocumentTypeDecoration<TType, any>>\n | null\n | undefined,\n): TType | null | undefined;\n// return array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n _documentNode: DocumentTypeDecoration<TType, any>,\n fragmentType: Array<FragmentType<DocumentTypeDecoration<TType, any>>>,\n): Array<TType>;\n// return array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n _documentNode: DocumentTypeDecoration<TType, any>,\n fragmentType:\n | Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n | null\n | undefined,\n): Array<TType> | null | undefined;\n// return readonly array of non-nullable if `fragmentType` is array of non-nullable\nexport function useFragment<TType>(\n _documentNode: DocumentTypeDecoration<TType, any>,\n fragmentType: ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>,\n): ReadonlyArray<TType>;\n// return readonly array of nullable if `fragmentType` is array of nullable\nexport function useFragment<TType>(\n _documentNode: DocumentTypeDecoration<TType, any>,\n fragmentType:\n | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n | null\n | undefined,\n): ReadonlyArray<TType> | null | undefined;\nexport function useFragment<TType>(\n _documentNode: DocumentTypeDecoration<TType, any>,\n fragmentType:\n | FragmentType<DocumentTypeDecoration<TType, any>>\n | Array<FragmentType<DocumentTypeDecoration<TType, any>>>\n | ReadonlyArray<FragmentType<DocumentTypeDecoration<TType, any>>>\n | null\n | undefined,\n): TType | Array<TType> | ReadonlyArray<TType> | null | undefined {\n return fragmentType as any;\n}\n\nexport function makeFragmentData<\n F extends DocumentTypeDecoration<any, any>,\n FT extends ResultOf<F>,\n>(data: FT, _fragment: F): FragmentType<F> {\n return data as FragmentType<F>;\n}\nexport function isFragmentReady<TQuery, TFrag>(\n queryNode: DocumentTypeDecoration<TQuery, any>,\n fragmentNode: TypedDocumentNode<TFrag>,\n data:\n | FragmentType<TypedDocumentNode<Incremental<TFrag>, any>>\n | null\n | undefined,\n): data is FragmentType<typeof fragmentNode> {\n const deferredFields = (\n queryNode as {\n __meta__?: { deferredFields: Record<string, (keyof TFrag)[]> };\n }\n ).__meta__?.deferredFields;\n\n if (!deferredFields) return true;\n\n const fragDef = fragmentNode.definitions[0] as\n | FragmentDefinitionNode\n | undefined;\n const fragName = fragDef?.name?.value;\n\n const fields = (fragName && deferredFields[fragName]) || [];\n return fields.length > 0 && fields.every((field) => data && field in data);\n}\n","import { CheckIcon, CopyIcon } from \"lucide-react\";\nimport { useState, useTransition } from \"react\";\nimport { useQuery } from \"urql\";\nimport { useSelectedServerStore } from \"../../authentication/state.js\";\nimport { InlineCode } from \"../../components/InlineCode.js\";\nimport { Button } from \"../../ui/Button.js\";\nimport { useOasConfig } from \"./context.js\";\nimport { graphql } from \"./graphql/index.js\";\nimport { SimpleSelect } from \"./SimpleSelect.js\";\n\nconst ServersQuery = graphql(/* GraphQL */ `\n query ServersQuery($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n url\n servers {\n url\n }\n }\n }\n`);\n\nconst CopyButton = ({ url }: { url: string }) => {\n const [isCopied, setIsCopied] = useState(false);\n\n return (\n <Button\n onClick={() => {\n void navigator.clipboard.writeText(url).then(() => {\n setIsCopied(true);\n setTimeout(() => setIsCopied(false), 2000);\n });\n }}\n variant=\"ghost\"\n size=\"icon\"\n >\n {isCopied ? (\n <CheckIcon className=\"text-green-600\" size={14} />\n ) : (\n <CopyIcon size={14} strokeWidth={1.3} />\n )}\n </Button>\n );\n};\n\nconst context = { suspense: true } as const;\n\nexport const Endpoint = () => {\n const [result] = useQuery({\n query: ServersQuery,\n variables: useOasConfig(),\n context,\n });\n const [, startTransition] = useTransition();\n const { selectedServer, setSelectedServer } = useSelectedServerStore();\n\n if (!result.data) return null;\n\n const { servers } = result.data.schema;\n\n if (servers.length === 1) {\n return (\n <div className=\"flex items-center gap-2\">\n <span className=\"font-medium text-sm\">Endpoint:</span>\n <InlineCode className=\"text-xs px-2 py-1.5\" selectOnClick>\n {servers[0]!.url}\n </InlineCode>\n <CopyButton url={servers[0]!.url} />\n </div>\n );\n }\n\n return (\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"font-medium text-sm\">\n {servers.length > 1 ? \"Endpoints\" : \"Endpoint\"}:\n </span>\n\n <SimpleSelect\n className=\"font-mono text-xs bg-border/50 dark:bg-border/70 py-1.5 max-w-[450px] truncate\"\n onChange={(e) =>\n startTransition(() => {\n setSelectedServer(e.target.value);\n })\n }\n value={selectedServer ?? result.data.schema.url}\n showChevrons={servers.length > 1}\n options={servers.map((server) => ({\n value: server.url,\n label: server.url,\n }))}\n />\n <CopyButton url={selectedServer ?? result.data.schema.url} />\n </div>\n );\n};\n","export const groupBy = <\n T extends Record<PropertyKey, any>,\n KeySelector extends (item: T) => PropertyKey,\n>(\n arr: T[],\n keySelector: KeySelector,\n): Partial<Record<ReturnType<KeySelector>, T[]>> => {\n return arr.reduce(\n (accumulator, val) => {\n const groupedKey = keySelector(val) as ReturnType<KeySelector>;\n if (!accumulator[groupedKey]) {\n accumulator[groupedKey] = [];\n }\n accumulator[groupedKey].push(val);\n return accumulator;\n },\n {} as Record<ReturnType<KeySelector>, T[]>,\n );\n};\n","export const renderIf = <G, R>(\n variable: G | undefined | null,\n callback: (variable: G) => R,\n): R | undefined => (variable ? callback(variable) : undefined);\n","import { Markdown } from \"../../components/Markdown.js\";\nimport { type SchemaObject } from \"../../oas/graphql/index.js\";\nimport { ColorizedParam } from \"./ColorizedParam.js\";\nimport type { OperationListItemResult } from \"./OperationList.js\";\nimport type { ParameterGroup } from \"./OperationListItem.js\";\n\nconst getParameterSchema = (\n parameter: ParameterListItemResult,\n): SchemaObject => {\n if (parameter.schema != null && typeof parameter.schema === \"object\") {\n return parameter.schema;\n }\n return {\n type: \"string\",\n };\n};\n\nexport type ParameterListItemResult = NonNullable<\n OperationListItemResult[\"parameters\"]\n>[number];\n\nexport const ParameterListItem = ({\n parameter,\n group,\n id,\n}: {\n parameter: ParameterListItemResult;\n group: ParameterGroup;\n id: string;\n}) => (\n <li className=\"p-4 bg-border/20 text-sm flex flex-col gap-1\">\n <div className=\"flex items-center gap-2\">\n <code>\n {group === \"path\" ? (\n <ColorizedParam\n name={parameter.name}\n backgroundOpacity=\"15%\"\n slug={id + \"-\" + parameter.name.toLocaleLowerCase()}\n />\n ) : (\n parameter.name\n )}\n </code>\n {parameter.required && (\n <span className=\"py-px px-1.5 font-medium bg-primary/75 text-muted rounded-lg\">\n required\n </span>\n )}\n {getParameterSchema(parameter).type && (\n <span className=\"text-muted-foreground\">\n {getParameterSchema(parameter).type}\n </span>\n )}\n </div>\n {parameter.description && (\n <Markdown\n content={parameter.description}\n className=\"text-sm prose-p:my-1 prose-code:whitespace-pre-line\"\n />\n )}\n </li>\n);\n","import { Heading } from \"../../components/Heading.js\";\nimport { Card } from \"../../ui/Card.js\";\nimport type { ParameterGroup } from \"./OperationListItem.js\";\nimport {\n ParameterListItem,\n type ParameterListItemResult,\n} from \"./ParameterListItem.js\";\n\nexport const ParameterList = ({\n group,\n parameters,\n id,\n}: {\n group: ParameterGroup;\n parameters: ParameterListItemResult[];\n id: string;\n}) => (\n <>\n <Heading level={3} id={`${id}/${group}-parameters`} className=\"capitalize\">\n {group === \"header\" ? \"Headers\" : `${group} Parameters`}\n </Heading>\n <Card>\n <ul className=\"list-none m-0 px-0 divide-y \">\n {parameters\n .sort((a, b) => (a.required === b.required ? 0 : a.required ? -1 : 1))\n .map((parameter) => (\n <ParameterListItem\n key={`${parameter.name}-${parameter.in}`}\n parameter={parameter}\n id={id}\n group={group}\n />\n ))}\n </ul>\n </Card>\n </>\n);\n","type ValueOf<T> = T[keyof T];\ntype Entries<T> = [keyof T, ValueOf<T>][];\n\nexport const objectEntries = <T extends object>(obj: T): Entries<T> =>\n Object.entries(obj) as Entries<T>;\n","import {\n ChevronDownIcon,\n CircleDotIcon,\n CircleFadingPlusIcon,\n CircleIcon,\n} from \"lucide-react\";\nimport { cn } from \"../../../../util/cn.js\";\n\nimport type { LogicalGroupType } from \"../utils.js\";\n\nconst iconMap = {\n AND: <CircleFadingPlusIcon size={16} className=\"fill-card\" />,\n OR: <CircleDotIcon size={16} className=\"fill-card\" />,\n ONE: <CircleIcon size={14} className=\"fill-card\" />,\n} as const;\n\nconst colorClass = {\n AND: \"text-green-500 dark:text-green-300/60\",\n OR: \"text-blue-400 dark:text-blue-500\",\n ONE: \"text-purple-500 dark:text-purple-300/60\",\n} as const;\n\nexport const LogicalGroupConnector = ({\n type,\n isOpen,\n className,\n}: {\n type: LogicalGroupType;\n isOpen: boolean;\n className?: string;\n}) => {\n return (\n <div\n className={cn(\n colorClass[type],\n \"relative text-sm flex py-2\",\n \"before:border-l before:absolute before:-top-2 before:-bottom-2 before:border-border before:border-dashed before:content-['']\",\n className,\n )}\n >\n <div className=\"-translate-x-[7px] flex gap-1 items-center\">\n {iconMap[type]}\n <div\n className={cn(\n \"translate-y-px mx-px opacity-0 group-hover:opacity-100 transition\",\n !isOpen && \"-rotate-90\",\n )}\n >\n <ChevronDownIcon size={16} />\n </div>\n </div>\n </div>\n );\n};\n","import * as Collapsible from \"@radix-ui/react-collapsible\";\nimport { useState } from \"react\";\nimport type { SchemaObject } from \"../../../../oas/parser/index.js\";\nimport { SchemaView } from \"../SchemaView.js\";\nimport type { LogicalGroupType } from \"../utils.js\";\nimport { LogicalGroupConnector } from \"./LogicalGroupConnector.js\";\n\nexport const LogicalGroupItem = (props: {\n type: LogicalGroupType;\n schema: SchemaObject;\n level: number;\n}) => {\n const [isOpen, setIsOpen] = useState(true);\n\n return (\n <Collapsible.Root\n open={isOpen}\n onOpenChange={() => setIsOpen((prev) => !prev)}\n className=\"group\"\n >\n <Collapsible.Trigger>\n <LogicalGroupConnector type={props.type} isOpen={isOpen} />\n </Collapsible.Trigger>\n {!isOpen && <div className=\"wavy-line bg-border translate-y-1\" />}\n <Collapsible.Content>\n <SchemaView schema={props.schema} level={props.level + 1} />\n </Collapsible.Content>\n </Collapsible.Root>\n );\n};\n","import * as Collapsible from \"@radix-ui/react-collapsible\";\nimport { SquareMinusIcon, SquarePlusIcon } from \"lucide-react\";\nimport type { SchemaObject } from \"../../../../oas/parser/index.js\";\nimport { Card } from \"../../../../ui/Card.js\";\nimport type { LogicalGroupType } from \"../utils.js\";\nimport { LogicalGroupItem } from \"./LogicalGroupItem.js\";\n\nconst typeLabel = {\n AND: \"All of\",\n OR: \"Any of\",\n ONE: \"One of\",\n};\n\nexport const LogicalGroup = ({\n schemas,\n type,\n isOpen,\n level,\n toggleOpen,\n}: {\n schemas: SchemaObject[];\n type: LogicalGroupType;\n isOpen: boolean;\n toggleOpen: () => void;\n level: number;\n}) => (\n <Collapsible.Root open={isOpen} onOpenChange={toggleOpen} asChild>\n <Card className=\"px-6\">\n <Collapsible.Trigger className=\"flex gap-2 items-center py-2 w-full text-sm text-muted-foreground -translate-x-1.5\">\n {isOpen ? <SquareMinusIcon size={14} /> : <SquarePlusIcon size={14} />}\n <span>{typeLabel[type]}</span>\n </Collapsible.Trigger>\n\n <Collapsible.Content className=\"pb-4\">\n {schemas.map((subSchema, index) => (\n // eslint-disable-next-line react/no-array-index-key\n <LogicalGroupItem\n key={index}\n type={type}\n schema={subSchema}\n level={level}\n />\n ))}\n </Collapsible.Content>\n </Card>\n </Collapsible.Root>\n);\n","import type { SchemaObject } from \"../../../oas/parser/index.js\";\n\nexport const isComplexType = (value: SchemaObject) =>\n value.type === \"object\" ||\n (value.type === \"array\" &&\n typeof value.items === \"object\" &&\n (!value.items.type || value.items.type === \"object\"));\n\nexport const hasLogicalGroupings = (value: SchemaObject) =>\n Boolean(value.oneOf ?? value.allOf ?? value.anyOf);\n\nexport const LogicalSchemaTypeMap = {\n allOf: \"AND\",\n anyOf: \"OR\",\n oneOf: \"ONE\",\n} as const;\n\nexport type LogicalGroupType = \"AND\" | \"OR\" | \"ONE\";\n","import * as Collapsible from \"@radix-ui/react-collapsible\";\nimport { ListPlusIcon } from \"lucide-react\";\nimport { useCallback, useState } from \"react\";\nimport { Markdown, ProseClasses } from \"../../../components/Markdown.js\";\nimport type { SchemaObject } from \"../../../oas/parser/index.js\";\nimport { Button } from \"../../../ui/Button.js\";\nimport { cn } from \"../../../util/cn.js\";\nimport { objectEntries } from \"../../../util/objectEntries.js\";\nimport { LogicalGroup } from \"./LogicalGroup/LogicalGroup.js\";\nimport { SchemaView } from \"./SchemaView.js\";\nimport {\n hasLogicalGroupings,\n isComplexType,\n LogicalSchemaTypeMap,\n} from \"./utils.js\";\n\nexport const SchemaLogicalGroup = ({\n schema,\n level,\n}: {\n schema: SchemaObject;\n level: number;\n}) => {\n const [isOpen, setIsOpen] = useState(true);\n const toggleOpen = useCallback(() => setIsOpen((prev) => !prev), []);\n\n for (const [key, type] of objectEntries(LogicalSchemaTypeMap)) {\n if (!schema[key]) continue;\n\n return (\n <LogicalGroup\n schemas={schema[key]}\n type={type}\n isOpen={isOpen}\n toggleOpen={toggleOpen}\n level={level}\n />\n );\n }\n};\n\nexport const SchemaPropertyItem = ({\n name,\n schema,\n group,\n level,\n defaultOpen = false,\n showCollapseButton = true,\n}: {\n name: string;\n schema: SchemaObject;\n group: \"required\" | \"optional\" | \"deprecated\";\n level: number;\n defaultOpen?: boolean;\n showCollapseButton?: boolean;\n}) => {\n const [isOpen, setIsOpen] = useState(defaultOpen);\n\n return (\n <li className=\"p-4 bg-border/20 hover:bg-border/30\">\n <div className=\"flex flex-col gap-1 justify-between text-sm\">\n <div className=\"flex gap-2 items-center\">\n <code>{name}</code>\n <span className=\"text-muted-foreground\">\n {schema.type === \"array\" && schema.items.type ? (\n <span>{schema.items.type}[]</span>\n ) : Array.isArray(schema.type) ? (\n <span>{schema.type.join(\" | \")}</span>\n ) : (\n <span>{schema.type}</span>\n )}\n </span>\n {group === \"optional\" && (\n <span className=\"py-px px-1.5 font-medium border rounded-lg\">\n optional\n </span>\n )}\n </div>\n\n {schema.description && (\n <Markdown\n className={cn(ProseClasses, \"text-sm leading-normal line-clamp-4\")}\n content={schema.description}\n />\n )}\n\n {(hasLogicalGroupings(schema) || isComplexType(schema)) && (\n <Collapsible.Root\n defaultOpen={defaultOpen}\n open={isOpen}\n onOpenChange={() => setIsOpen(!isOpen)}\n >\n {showCollapseButton && (\n <Collapsible.Trigger asChild>\n <Button\n variant=\"outline\"\n size=\"sm\"\n className=\"mt-2 flex gap-1.5\"\n >\n <ListPlusIcon size={18} />\n {!isOpen\n ? \"Show nested properties\"\n : \"Hide nested properties\"}\n </Button>\n </Collapsible.Trigger>\n )}\n <Collapsible.Content>\n <div className=\"mt-2\">\n {hasLogicalGroupings(schema) ? (\n <SchemaLogicalGroup schema={schema} level={level + 1} />\n ) : schema.type === \"object\" ? (\n <SchemaView schema={schema} level={level + 1} />\n ) : (\n schema.type === \"array\" &&\n typeof schema.items === \"object\" && (\n <SchemaView schema={schema.items} level={level + 1} />\n )\n )}\n </div>\n </Collapsible.Content>\n </Collapsible.Root>\n )}\n </div>\n </li>\n );\n};\n","import { Markdown, ProseClasses } from \"../../../components/Markdown.js\";\nimport type { SchemaObject } from \"../../../oas/parser/index.js\";\nimport { Card, CardContent, CardHeader, CardTitle } from \"../../../ui/Card.js\";\nimport { cn } from \"../../../util/cn.js\";\nimport { groupBy } from \"../../../util/groupBy.js\";\nimport { SchemaLogicalGroup, SchemaPropertyItem } from \"./SchemaComponents.js\";\nimport { hasLogicalGroupings } from \"./utils.js\";\n\nexport const SchemaView = ({\n schema,\n level = 0,\n defaultOpen = false,\n}: {\n schema?: SchemaObject | null;\n level?: number;\n defaultOpen?: boolean;\n}) => {\n if (!schema || Object.keys(schema).length === 0) {\n return (\n <Card className=\"p-4\">\n <span className=\"text-sm text-muted-foreground italic\">\n No response specified\n </span>\n </Card>\n );\n }\n\n const renderSchema = (schema: SchemaObject, level: number) => {\n if (hasLogicalGroupings(schema)) {\n return <SchemaLogicalGroup schema={schema} level={level} />;\n }\n\n // Sometimes items is not defined\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (schema.type === \"array\" && schema.items) {\n const itemsSchema = schema.items as SchemaObject;\n\n if (\n typeof itemsSchema.type === \"string\" &&\n [\"string\", \"number\", \"boolean\", \"integer\"].includes(itemsSchema.type)\n ) {\n return (\n <Card className=\"p-4\">\n <span className=\"text-sm text-muted-foreground\">\n {itemsSchema.type}[]\n </span>\n {schema.description && (\n <Markdown\n className={cn(\n ProseClasses,\n \"text-sm leading-normal line-clamp-4\",\n )}\n content={schema.description}\n />\n )}\n </Card>\n );\n } else if (itemsSchema.type === \"object\") {\n return (\n <Card className=\"flex flex-col gap-2 bg-border/30 p-4\">\n <span className=\"text-sm text-muted-foreground\">object[]</span>\n {renderSchema(itemsSchema, level + 1)}\n </Card>\n );\n } else {\n return renderSchema(itemsSchema, level + 1);\n }\n }\n\n if (\n schema.type === \"object\" &&\n (!schema.properties || Object.keys(schema.properties).length === 0)\n ) {\n return (\n <Card className=\"p-4 flex gap-2 items-center\">\n {\"name\" in schema && <>{schema.name}</>}\n <span className=\"text-sm text-muted-foreground\">object</span>\n {schema.description && (\n <Markdown\n className={cn(\n ProseClasses,\n \"text-sm leading-normal line-clamp-4\",\n )}\n content={schema.description}\n />\n )}\n </Card>\n );\n }\n\n if (schema.properties) {\n const groupedProperties = groupBy(\n Object.entries(schema.properties),\n ([propertyName, property]) => {\n return property.deprecated\n ? \"deprecated\"\n : schema.required?.includes(propertyName)\n ? \"required\"\n : \"optional\";\n },\n );\n\n const groupNames = [\"required\", \"optional\", \"deprecated\"] as const;\n\n return (\n <Card className=\"divide-y overflow-hidden\">\n {groupNames.map(\n (group) =>\n groupedProperties[group] && (\n <ul key={group} className=\"divide-y\">\n {groupedProperties[group].map(([name, schema]) => (\n <SchemaPropertyItem\n key={name}\n name={name}\n schema={schema}\n group={group}\n level={level}\n defaultOpen={defaultOpen}\n />\n ))}\n </ul>\n ),\n )}\n </Card>\n );\n }\n\n if (\n typeof schema.type === \"string\" &&\n [\"string\", \"number\", \"boolean\", \"integer\", \"null\"].includes(schema.type)\n ) {\n return (\n <Card className=\"p-4\">\n <span className=\"text-sm text-muted-foreground\">{schema.type}</span>\n {schema.description && (\n <Markdown\n className={cn(\n ProseClasses,\n \"text-sm leading-normal line-clamp-4\",\n )}\n content={schema.description}\n />\n )}\n </Card>\n );\n }\n\n if (schema.additionalProperties) {\n return (\n <Card className=\"my-2\">\n <CardHeader>\n <CardTitle>Additional Properties:</CardTitle>\n </CardHeader>\n <CardContent>\n {renderSchema(\n schema.additionalProperties as SchemaObject,\n level + 1,\n )}\n </CardContent>\n </Card>\n );\n }\n\n return null;\n };\n\n return renderSchema(schema, level);\n};\n","import { useState } from \"react\";\nimport { Heading } from \"../../components/Heading.js\";\nimport { Markdown, ProseClasses } from \"../../components/Markdown.js\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"../../ui/Tabs.js\";\nimport { groupBy } from \"../../util/groupBy.js\";\nimport { renderIf } from \"../../util/renderIf.js\";\nimport { OperationsFragment } from \"./OperationList.js\";\nimport { ParameterList } from \"./ParameterList.js\";\nimport { Sidecar } from \"./Sidecar.js\";\nimport { FragmentType, useFragment } from \"./graphql/index.js\";\nimport { SchemaView } from \"./schema/SchemaView.js\";\n\nexport const PARAM_GROUPS = [\"path\", \"query\", \"header\", \"cookie\"] as const;\nexport type ParameterGroup = (typeof PARAM_GROUPS)[number];\n\nexport const OperationListItem = ({\n operationFragment,\n}: {\n operationFragment: FragmentType<typeof OperationsFragment>;\n}) => {\n const operation = useFragment(OperationsFragment, operationFragment);\n const groupedParameters = groupBy(\n operation.parameters ?? [],\n (param) => param.in,\n );\n\n const first = operation.responses.at(0);\n const [selectedResponse, setSelectedResponse] = useState(first?.statusCode);\n\n return (\n <div\n key={operation.operationId}\n className=\"grid grid-cols-1 lg:grid-cols-[4fr_3fr] gap-8 items-start border-b-2 mb-16 pb-16\"\n >\n <div className=\"flex flex-col gap-4\">\n <Heading level={2} id={operation.slug} registerSidebarAnchor>\n {operation.summary}\n </Heading>\n {operation.description && (\n <Markdown\n className={`${ProseClasses} max-w-full prose-img:max-w-prose`}\n content={operation.description}\n />\n )}\n {operation.parameters && operation.parameters.length > 0 && (\n <>\n {PARAM_GROUPS.flatMap((group) =>\n groupedParameters[group]?.length ? (\n <ParameterList\n key={group}\n id={operation.slug}\n parameters={groupedParameters[group]}\n group={group}\n />\n ) : (\n []\n ),\n )}\n </>\n )}\n {renderIf(operation.requestBody?.content?.at(0)?.schema, (schema) => (\n <div className=\"mt-4 flex flex-col gap-4\">\n <Heading\n level={3}\n className=\"capitalize\"\n id={`${operation.slug}/request-body`}\n registerSidebarAnchor\n >\n Request Body\n </Heading>\n <SchemaView schema={schema} />\n </div>\n ))}\n {operation.responses.length > 0 && (\n <>\n <Heading\n level={3}\n className=\"capitalize mt-8 pt-8 border-t\"\n id={`${operation.slug}/responses`}\n registerSidebarAnchor\n >\n Responses\n </Heading>\n <Tabs\n onValueChange={(value) => setSelectedResponse(value)}\n value={selectedResponse}\n >\n {operation.responses.length > 1 && (\n <TabsList>\n {operation.responses.map((response) => (\n <TabsTrigger\n value={response.statusCode}\n key={response.statusCode}\n title={response.description ?? undefined}\n >\n {response.statusCode}\n </TabsTrigger>\n ))}\n </TabsList>\n )}\n <ul className=\"list-none m-0 px-0\">\n {operation.responses.map((response) => (\n <TabsContent\n value={response.statusCode}\n key={response.statusCode}\n >\n <SchemaView\n schema={\n response.content?.find((content) => content.schema)\n ?.schema\n }\n />\n </TabsContent>\n ))}\n </ul>\n </Tabs>\n </>\n )}\n </div>\n\n <Sidecar\n selectedResponse={selectedResponse}\n onSelectResponse={setSelectedResponse}\n operation={operation}\n />\n </div>\n );\n};\n","import { ResultOf } from \"@graphql-typed-document-node/core\";\nimport { useQuery } from \"urql\";\nimport { CategoryHeading } from \"../../components/CategoryHeading.js\";\nimport { DeveloperHint } from \"../../components/DeveloperHint.js\";\nimport { ErrorPage } from \"../../components/ErrorPage.js\";\nimport { Heading } from \"../../components/Heading.js\";\nimport { InlineCode } from \"../../components/InlineCode.js\";\nimport { Markdown, ProseClasses } from \"../../components/Markdown.js\";\nimport { SyntaxHighlight } from \"../../components/SyntaxHighlight.js\";\nimport { cn } from \"../../util/cn.js\";\nimport { Endpoint } from \"./Endpoint.js\";\nimport { OperationListItem } from \"./OperationListItem.js\";\nimport StaggeredRender from \"./StaggeredRender.js\";\nimport { useOasConfig } from \"./context.js\";\nimport { graphql } from \"./graphql/index.js\";\n\nexport const OperationsFragment = graphql(/* GraphQL */ `\n fragment OperationsFragment on OperationItem {\n slug\n summary\n method\n description\n operationId\n contentTypes\n path\n parameters {\n name\n in\n description\n required\n schema\n style\n examples {\n name\n description\n externalValue\n value\n summary\n }\n }\n requestBody {\n content {\n mediaType\n encoding {\n name\n }\n examples {\n name\n description\n externalValue\n value\n summary\n }\n schema\n }\n description\n required\n }\n responses {\n statusCode\n links\n description\n content {\n examples {\n name\n description\n externalValue\n value\n summary\n }\n mediaType\n encoding {\n name\n }\n schema\n }\n }\n }\n`);\n\nexport type OperationListItemResult = ResultOf<typeof OperationsFragment>;\n\nconst AllOperationsQuery = graphql(/* GraphQL */ `\n query AllOperations($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n description\n title\n url\n version\n tags {\n name\n description\n operations {\n slug\n ...OperationsFragment\n }\n }\n }\n }\n`);\n\nconst suspenseContext = { suspense: true };\n\nexport const OperationList = () => {\n const { type, input } = useOasConfig();\n\n const [result] = useQuery({\n query: AllOperationsQuery,\n variables: { type, input },\n context: suspenseContext,\n });\n\n const error = result.error?.graphQLErrors.at(0);\n\n // Looks like there is no Suspense level error handling (yet)?\n // So we handle the error case in the component directly\n if (error) {\n return (\n <ErrorPage\n category=\"Error\"\n title=\"Schema cannot be displayed\"\n message={\n <>\n <DeveloperHint className=\"mb-4\">\n Check your configuration value <InlineCode>apis.type</InlineCode>{\" \"}\n and <InlineCode>apis.input</InlineCode> in the Zudoku config.\n </DeveloperHint>\n An error occurred while trying to fetch the API reference:\n <SyntaxHighlight code={error.toString()} language=\"plain\" />\n </>\n }\n />\n );\n }\n\n if (!result.data) return null;\n\n return (\n <div className=\"pt-[--padding-content-top]\">\n <div\n className={cn(ProseClasses, \"mb-16 max-w-full prose-img:max-w-prose\")}\n >\n <CategoryHeading>Overview</CategoryHeading>\n <Heading level={1} id=\"description\" registerSidebarAnchor>\n {result.data.schema.title}\n </Heading>\n <Markdown content={result.data.schema.description ?? \"\"} />\n </div>\n <hr />\n <div className=\"my-4 flex justify-end\">\n <Endpoint />\n </div>\n\n {result.data.schema.tags\n .filter((tag) => tag.operations.length > 0)\n .map((tag) => (\n <div key={tag.name}>\n {tag.name && <CategoryHeading>{tag.name}</CategoryHeading>}\n {tag.description && (\n <Markdown\n className={`${ProseClasses} max-w-full prose-img:max-w-prose w-full mt-2 mb-12`}\n content={tag.description}\n />\n )}\n <div className=\"operation mb-12\">\n <StaggeredRender>\n {tag.operations.map((fragment) => (\n <OperationListItem\n key={fragment.slug}\n operationFragment={fragment}\n />\n ))}\n </StaggeredRender>\n </div>\n </div>\n ))}\n </div>\n );\n};\n"],"names":["useFragment","_documentNode","fragmentType","ServersQuery","graphql","CopyButton","url","isCopied","setIsCopied","useState","jsx","Button","CheckIcon","CopyIcon","context","Endpoint","result","useQuery","useOasConfig","startTransition","useTransition","selectedServer","setSelectedServer","useSelectedServerStore","servers","jsxs","InlineCode","SimpleSelect","e","server","groupBy","arr","keySelector","accumulator","val","groupedKey","renderIf","variable","callback","getParameterSchema","parameter","ParameterListItem","group","id","ColorizedParam","Markdown","ParameterList","parameters","Fragment","Heading","Card","a","b","objectEntries","obj","iconMap","CircleFadingPlusIcon","CircleDotIcon","CircleIcon","colorClass","LogicalGroupConnector","type","isOpen","className","cn","ChevronDownIcon","LogicalGroupItem","props","setIsOpen","Collapsible","prev","SchemaView","typeLabel","LogicalGroup","schemas","level","toggleOpen","SquareMinusIcon","SquarePlusIcon","subSchema","index","isComplexType","value","hasLogicalGroupings","LogicalSchemaTypeMap","SchemaLogicalGroup","schema","useCallback","key","SchemaPropertyItem","name","defaultOpen","showCollapseButton","ProseClasses","ListPlusIcon","renderSchema","itemsSchema","groupedProperties","propertyName","property","groupNames","CardHeader","CardTitle","CardContent","PARAM_GROUPS","OperationListItem","operationFragment","operation","OperationsFragment","groupedParameters","param","first","selectedResponse","setSelectedResponse","_a","_c","_b","Tabs","TabsList","response","TabsTrigger","TabsContent","content","Sidecar","AllOperationsQuery","suspenseContext","OperationList","input","error","ErrorPage","DeveloperHint","SyntaxHighlight","CategoryHeading","tag","StaggeredRender","fragment"],"mappings":";;;;;;;;;;;;;;AAqEgB,SAAAA,GACdC,GACAC,GAMgE;AACzD,SAAAA;AACT;ACrEA,MAAMC,KAAeC;AAAA;AAAA,EAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAS1C,GAEKC,IAAa,CAAC,EAAE,KAAAC,QAA2B;AAC/C,QAAM,CAACC,GAAUC,CAAW,IAAIC,EAAS,EAAK;AAG5C,SAAAC,gBAAAA,EAAA;AAAA,IAACC;AAAA,IAAA;AAAA,MACC,SAAS,MAAM;AACb,QAAK,UAAU,UAAU,UAAUL,CAAG,EAAE,KAAK,MAAM;AACjD,UAAAE,EAAY,EAAI,GAChB,WAAW,MAAMA,EAAY,EAAK,GAAG,GAAI;AAAA,QAAA,CAC1C;AAAA,MACH;AAAA,MACA,SAAQ;AAAA,MACR,MAAK;AAAA,MAEJ,UACCD,IAAAG,gBAAAA,MAACE,GAAU,EAAA,WAAU,kBAAiB,MAAM,GAAI,CAAA,IAE/CF,gBAAAA,EAAAA,IAAAG,GAAA,EAAS,MAAM,IAAI,aAAa,KAAK;AAAA,IAAA;AAAA,EAAA;AAI9C,GAEMC,KAAU,EAAE,UAAU,MAEfC,KAAW,MAAM;AACtB,QAAA,CAACC,CAAM,IAAIC,EAAS;AAAA,IACxB,OAAOd;AAAA,IACP,WAAWe,EAAa;AAAA,IACxB,SAAAJ;AAAA,EAAA,CACD,GACK,CAAG,EAAAK,CAAe,IAAIC,KACtB,EAAE,gBAAAC,GAAgB,mBAAAC,EAAkB,IAAIC,EAAuB;AAEjE,MAAA,CAACP,EAAO,KAAa,QAAA;AAEzB,QAAM,EAAE,SAAAQ,EAAY,IAAAR,EAAO,KAAK;AAE5B,SAAAQ,EAAQ,WAAW,IAEnBC,gBAAAA,EAAA,KAAC,OAAI,EAAA,WAAU,2BACb,UAAA;AAAA,IAACf,gBAAAA,EAAA,IAAA,QAAA,EAAK,WAAU,uBAAsB,UAAS,aAAA;AAAA,IAC/CA,gBAAAA,EAAAA,IAACgB,KAAW,WAAU,uBAAsB,eAAa,IACtD,UAAAF,EAAQ,CAAC,EAAG,IACf,CAAA;AAAA,0BACCnB,GAAW,EAAA,KAAKmB,EAAQ,CAAC,EAAG,KAAK;AAAA,EACpC,EAAA,CAAA,IAKFC,gBAAAA,EAAA,KAAC,OAAI,EAAA,WAAU,qCACb,UAAA;AAAA,IAACA,gBAAAA,EAAAA,KAAA,QAAA,EAAK,WAAU,uBACb,UAAA;AAAA,MAAQD,EAAA,SAAS,IAAI,cAAc;AAAA,MAAW;AAAA,IAAA,GACjD;AAAA,IAEAd,gBAAAA,EAAA;AAAA,MAACiB;AAAA,MAAA;AAAA,QACC,WAAU;AAAA,QACV,UAAU,CAACC,MACTT,EAAgB,MAAM;AACF,UAAAG,EAAAM,EAAE,OAAO,KAAK;AAAA,QAAA,CACjC;AAAA,QAEH,OAAOP,KAAkBL,EAAO,KAAK,OAAO;AAAA,QAC5C,cAAcQ,EAAQ,SAAS;AAAA,QAC/B,SAASA,EAAQ,IAAI,CAACK,OAAY;AAAA,UAChC,OAAOA,EAAO;AAAA,UACd,OAAOA,EAAO;AAAA,QAAA,EACd;AAAA,MAAA;AAAA,IACJ;AAAA,0BACCxB,GAAW,EAAA,KAAKgB,KAAkBL,EAAO,KAAK,OAAO,KAAK;AAAA,EAC7D,EAAA,CAAA;AAEJ,GC9Fac,IAAU,CAIrBC,GACAC,MAEOD,EAAI;AAAA,EACT,CAACE,GAAaC,MAAQ;AACd,UAAAC,IAAaH,EAAYE,CAAG;AAC9B,WAACD,EAAYE,CAAU,MACbF,EAAAE,CAAU,IAAI,KAEhBF,EAAAE,CAAU,EAAE,KAAKD,CAAG,GACzBD;AAAA,EACT;AAAA,EACA,CAAC;AAAA,GChBQG,KAAW,CACtBC,GACAC,MACmBD,IAAWC,EAASD,CAAQ,IAAI,QCG/CE,IAAqB,CACzBC,MAEIA,EAAU,UAAU,QAAQ,OAAOA,EAAU,UAAW,WACnDA,EAAU,SAEZ;AAAA,EACL,MAAM;AAAA,GAQGC,KAAoB,CAAC;AAAA,EAChC,WAAAD;AAAA,EACA,OAAAE;AAAA,EACA,IAAAC;AACF,MAKElB,gBAAAA,EAAA,KAAC,MAAG,EAAA,WAAU,gDACZ,UAAA;AAAA,EAACA,gBAAAA,EAAAA,KAAA,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,IAACf,gBAAAA,EAAAA,IAAA,QAAA,EACE,gBAAU,SACTA,gBAAAA,EAAA;AAAA,MAACkC;AAAA,MAAA;AAAA,QACC,MAAMJ,EAAU;AAAA,QAChB,mBAAkB;AAAA,QAClB,MAAMG,IAAK,MAAMH,EAAU,KAAK,kBAAkB;AAAA,MAAA;AAAA,IAAA,IAGpDA,EAAU,MAEd;AAAA,IACCA,EAAU,YACT9B,gBAAAA,EAAAA,IAAC,QAAK,EAAA,WAAU,gEAA+D,UAE/E,YAAA;AAAA,IAED6B,EAAmBC,CAAS,EAAE,QAC7B9B,gBAAAA,EAAAA,IAAC,QAAK,EAAA,WAAU,yBACb,UAAA6B,EAAmBC,CAAS,EAAE,KACjC,CAAA;AAAA,EAAA,GAEJ;AAAA,EACCA,EAAU,eACT9B,gBAAAA,EAAA;AAAA,IAACmC;AAAA,IAAA;AAAA,MACC,SAASL,EAAU;AAAA,MACnB,WAAU;AAAA,IAAA;AAAA,EACZ;AAAA,GAEJ,GCpDWM,KAAgB,CAAC;AAAA,EAC5B,OAAAJ;AAAA,EACA,YAAAK;AAAA,EACA,IAAAJ;AACF,MAMIlB,gBAAAA,EAAA,KAAAuB,YAAA,EAAA,UAAA;AAAA,EAAAtC,gBAAAA,MAACuC,KAAQ,OAAO,GAAG,IAAI,GAAGN,CAAE,IAAID,CAAK,eAAe,WAAU,cAC3D,UAAUA,MAAA,WAAW,YAAY,GAAGA,CAAK,eAC5C;AAAA,EACAhC,gBAAAA,EAAAA,IAACwC,KACC,UAACxC,gBAAAA,EAAAA,IAAA,MAAA,EAAG,WAAU,gCACX,UAAAqC,EACE,KAAK,CAACI,GAAGC,MAAOD,EAAE,aAAaC,EAAE,WAAW,IAAID,EAAE,WAAW,KAAK,CAAE,EACpE,IAAI,CAACX,MACJ9B,gBAAAA,EAAA;AAAA,IAAC+B;AAAA,IAAA;AAAA,MAEC,WAAAD;AAAA,MACA,IAAAG;AAAA,MACA,OAAAD;AAAA,IAAA;AAAA,IAHK,GAAGF,EAAU,IAAI,IAAIA,EAAU,EAAE;AAAA,EAAA,CAKzC,GACL,EACF,CAAA;AAAA,GACF,GChCWa,KAAgB,CAAmBC,MAC9C,OAAO,QAAQA,CAAG,GCMdC,KAAU;AAAA,EACd,KAAM7C,gBAAAA,EAAA,IAAA8C,GAAA,EAAqB,MAAM,IAAI,WAAU,aAAY;AAAA,EAC3D,IAAK9C,gBAAAA,EAAA,IAAA+C,GAAA,EAAc,MAAM,IAAI,WAAU,aAAY;AAAA,EACnD,KAAM/C,gBAAAA,EAAA,IAAAgD,GAAA,EAAW,MAAM,IAAI,WAAU,aAAY;AACnD,GAEMC,KAAa;AAAA,EACjB,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AACP,GAEaC,KAAwB,CAAC;AAAA,EACpC,MAAAC;AAAA,EACA,QAAAC;AAAA,EACA,WAAAC;AACF,MAMIrD,gBAAAA,EAAA;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAWsD;AAAA,MACTL,GAAWE,CAAI;AAAA,MACf;AAAA,MACA;AAAA,MACAE;AAAA,IACF;AAAA,IAEA,UAAAtC,gBAAAA,EAAA,KAAC,OAAI,EAAA,WAAU,8CACZ,UAAA;AAAA,MAAA8B,GAAQM,CAAI;AAAA,MACbnD,gBAAAA,EAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAWsD;AAAA,YACT;AAAA,YACA,CAACF,KAAU;AAAA,UACb;AAAA,UAEA,UAAApD,gBAAAA,EAAAA,IAACuD,GAAgB,EAAA,MAAM,GAAI,CAAA;AAAA,QAAA;AAAA,MAC7B;AAAA,IAAA,GACF;AAAA,EAAA;AAAA,GC3COC,KAAmB,CAACC,MAI3B;AACJ,QAAM,CAACL,GAAQM,CAAS,IAAI3D,EAAS,EAAI;AAGvC,SAAAgB,gBAAAA,EAAA;AAAA,IAAC4C,EAAY;AAAA,IAAZ;AAAA,MACC,MAAMP;AAAA,MACN,cAAc,MAAMM,EAAU,CAACE,MAAS,CAACA,CAAI;AAAA,MAC7C,WAAU;AAAA,MAEV,UAAA;AAAA,QAAC5D,gBAAAA,EAAAA,IAAA2D,EAAY,SAAZ,EACC,UAAA3D,gBAAAA,EAAAA,IAACkD,MAAsB,MAAMO,EAAM,MAAM,QAAAL,EAAA,CAAgB,EAC3D,CAAA;AAAA,QACC,CAACA,KAAWpD,gBAAAA,EAAAA,IAAA,OAAA,EAAI,WAAU,oCAAoC,CAAA;AAAA,QAC9DA,gBAAAA,EAAA,IAAA2D,EAAY,SAAZ,EACC,UAAC3D,gBAAAA,EAAAA,IAAA6D,GAAA,EAAW,QAAQJ,EAAM,QAAQ,OAAOA,EAAM,QAAQ,EAAG,CAAA,GAC5D;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN,GCtBMK,KAAY;AAAA,EAChB,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AACP,GAEaC,KAAe,CAAC;AAAA,EAC3B,SAAAC;AAAA,EACA,MAAAb;AAAA,EACA,QAAAC;AAAA,EACA,OAAAa;AAAA,EACA,YAAAC;AACF,MAOGlE,gBAAAA,EAAAA,IAAA2D,EAAY,MAAZ,EAAiB,MAAMP,GAAQ,cAAcc,GAAY,SAAO,IAC/D,UAACnD,gBAAAA,OAAAyB,GAAA,EAAK,WAAU,QACd,UAAA;AAAA,EAAAzB,gBAAAA,EAAA,KAAC4C,EAAY,SAAZ,EAAoB,WAAU,sFAC5B,UAAA;AAAA,IAASP,IAAApD,gBAAAA,EAAA,IAACmE,KAAgB,MAAM,GAAA,CAAI,IAAMnE,gBAAAA,EAAAA,IAAAoE,GAAA,EAAe,MAAM,GAAI,CAAA;AAAA,IACnEpE,gBAAAA,EAAA,IAAA,QAAA,EAAM,UAAU8D,GAAAX,CAAI,EAAE,CAAA;AAAA,EAAA,GACzB;AAAA,EAEAnD,gBAAAA,EAAAA,IAAC2D,EAAY,SAAZ,EAAoB,WAAU,QAC5B,UAAAK,EAAQ,IAAI,CAACK,GAAWC;AAAA;AAAA,IAEvBtE,gBAAAA,EAAA;AAAA,MAACwD;AAAA,MAAA;AAAA,QAEC,MAAAL;AAAA,QACA,QAAQkB;AAAA,QACR,OAAAJ;AAAA,MAAA;AAAA,MAHKK;AAAA,IAIP;AAAA,GACD,GACH;AAAA,EAAA,CACF,EACF,CAAA,GC3CWC,KAAgB,CAACC,MAC5BA,EAAM,SAAS,YACdA,EAAM,SAAS,WACd,OAAOA,EAAM,SAAU,aACtB,CAACA,EAAM,MAAM,QAAQA,EAAM,MAAM,SAAS,WAElCC,IAAsB,CAACD,MAClC,GAAQA,EAAM,SAASA,EAAM,SAASA,EAAM,QAEjCE,KAAuB;AAAA,EAClC,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AACT,GCCaC,IAAqB,CAAC;AAAA,EACjC,QAAAC;AAAA,EACA,OAAAX;AACF,MAGM;AACJ,QAAM,CAACb,GAAQM,CAAS,IAAI3D,EAAS,EAAI,GACnCmE,IAAaW,EAAY,MAAMnB,EAAU,CAACE,MAAS,CAACA,CAAI,GAAG,CAAA,CAAE;AAEnE,aAAW,CAACkB,GAAK3B,CAAI,KAAKR,GAAc+B,EAAoB;AACtD,QAACE,EAAOE,CAAG;AAGb,aAAA9E,gBAAAA,EAAA;AAAA,QAAC+D;AAAA,QAAA;AAAA,UACC,SAASa,EAAOE,CAAG;AAAA,UACnB,MAAA3B;AAAA,UACA,QAAAC;AAAA,UACA,YAAAc;AAAA,UACA,OAAAD;AAAA,QAAA;AAAA,MAAA;AAIR,GAEac,KAAqB,CAAC;AAAA,EACjC,MAAAC;AAAA,EACA,QAAAJ;AAAA,EACA,OAAA5C;AAAA,EACA,OAAAiC;AAAA,EACA,aAAAgB,IAAc;AAAA,EACd,oBAAAC,IAAqB;AACvB,MAOM;AACJ,QAAM,CAAC9B,GAAQM,CAAS,IAAI3D,EAASkF,CAAW;AAEhD,+BACG,MAAG,EAAA,WAAU,uCACZ,UAAClE,gBAAAA,EAAA,KAAA,OAAA,EAAI,WAAU,+CACb,UAAA;AAAA,IAACA,gBAAAA,EAAAA,KAAA,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,MAAAf,gBAAAA,EAAAA,IAAC,UAAM,UAAKgF,EAAA,CAAA;AAAA,MACZhF,gBAAAA,EAAA,IAAC,QAAK,EAAA,WAAU,yBACb,UAAA4E,EAAO,SAAS,WAAWA,EAAO,MAAM,OACvC7D,gBAAAA,EAAAA,KAAC,QAAM,EAAA,UAAA;AAAA,QAAA6D,EAAO,MAAM;AAAA,QAAK;AAAA,MAAA,GAAE,IACzB,MAAM,QAAQA,EAAO,IAAI,0BAC1B,QAAM,EAAA,UAAAA,EAAO,KAAK,KAAK,KAAK,GAAE,0BAE9B,QAAM,EAAA,UAAAA,EAAO,KAAK,CAAA,GAEvB;AAAA,MACC5C,MAAU,cACThC,gBAAAA,EAAAA,IAAC,QAAK,EAAA,WAAU,8CAA6C,UAE7D,YAAA;AAAA,IAAA,GAEJ;AAAA,IAEC4E,EAAO,eACN5E,gBAAAA,EAAA;AAAA,MAACmC;AAAA,MAAA;AAAA,QACC,WAAWmB,EAAG6B,GAAc,qCAAqC;AAAA,QACjE,SAASP,EAAO;AAAA,MAAA;AAAA,IAClB;AAAA,KAGAH,EAAoBG,CAAM,KAAKL,GAAcK,CAAM,MACnD7D,gBAAAA,EAAA;AAAA,MAAC4C,EAAY;AAAA,MAAZ;AAAA,QACC,aAAAsB;AAAA,QACA,MAAM7B;AAAA,QACN,cAAc,MAAMM,EAAU,CAACN,CAAM;AAAA,QAEpC,UAAA;AAAA,UAAA8B,KACElF,gBAAAA,EAAA,IAAA2D,EAAY,SAAZ,EAAoB,SAAO,IAC1B,UAAA5C,gBAAAA,EAAA;AAAA,YAACd;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,WAAU;AAAA,cAEV,UAAA;AAAA,gBAACD,gBAAAA,EAAAA,IAAAoF,GAAA,EAAa,MAAM,GAAI,CAAA;AAAA,gBACtBhC,IAEE,2BADA;AAAA,cACA;AAAA,YAAA;AAAA,UAAA,GAER;AAAA,UAEFpD,gBAAAA,EAAAA,IAAC2D,EAAY,SAAZ,EACC,gCAAC,OAAI,EAAA,WAAU,QACZ,UAAoBc,EAAAG,CAAM,IACxB5E,gBAAAA,MAAA2E,GAAA,EAAmB,QAAAC,GAAgB,OAAOX,IAAQ,GAAG,IACpDW,EAAO,SAAS,WAClB5E,gBAAAA,EAAAA,IAAC6D,KAAW,QAAAe,GAAgB,OAAOX,IAAQ,EAAG,CAAA,IAE9CW,EAAO,SAAS,WAChB,OAAOA,EAAO,SAAU,YACrB5E,gBAAAA,EAAAA,IAAA6D,GAAA,EAAW,QAAQe,EAAO,OAAO,OAAOX,IAAQ,GAAG,GAG1D,EACF,CAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IACF;AAAA,EAAA,EAEJ,CAAA,EACF,CAAA;AAEJ,GCrHaJ,IAAa,CAAC;AAAA,EACzB,QAAAe;AAAA,EACA,OAAAX,IAAQ;AAAA,EACR,aAAAgB,IAAc;AAChB,MAIM;AACJ,MAAI,CAACL,KAAU,OAAO,KAAKA,CAAM,EAAE,WAAW;AAE1C,WAAA5E,gBAAAA,EAAAA,IAACwC,KAAK,WAAU,OACd,gCAAC,QAAK,EAAA,WAAU,wCAAuC,UAAA,wBAEvD,CAAA,EACF,CAAA;AAIE,QAAA6C,IAAe,CAACT,GAAsBX,MAAkB;AACxD,QAAAQ,EAAoBG,CAAM;AAC5B,aAAQ5E,gBAAAA,EAAAA,IAAA2E,GAAA,EAAmB,QAAQC,GAAQ,OAAOX,EAAO,CAAA;AAK3D,QAAIW,EAAO,SAAS,WAAWA,EAAO,OAAO;AAC3C,YAAMU,IAAcV,EAAO;AAE3B,aACE,OAAOU,EAAY,QAAS,YAC5B,CAAC,UAAU,UAAU,WAAW,SAAS,EAAE,SAASA,EAAY,IAAI,IAGlEvE,gBAAAA,EAAA,KAACyB,GAAK,EAAA,WAAU,OACd,UAAA;AAAA,QAACzB,gBAAAA,EAAAA,KAAA,QAAA,EAAK,WAAU,iCACb,UAAA;AAAA,UAAYuE,EAAA;AAAA,UAAK;AAAA,QAAA,GACpB;AAAA,QACCV,EAAO,eACN5E,gBAAAA,EAAA;AAAA,UAACmC;AAAA,UAAA;AAAA,YACC,WAAWmB;AAAA,cACT6B;AAAA,cACA;AAAA,YACF;AAAA,YACA,SAASP,EAAO;AAAA,UAAA;AAAA,QAClB;AAAA,MAEJ,EAAA,CAAA,IAEOU,EAAY,SAAS,WAE5BvE,gBAAAA,EAAA,KAACyB,GAAK,EAAA,WAAU,wCACd,UAAA;AAAA,QAACxC,gBAAAA,EAAA,IAAA,QAAA,EAAK,WAAU,iCAAgC,UAAQ,YAAA;AAAA,QACvDqF,EAAaC,GAAarB,IAAQ,CAAC;AAAA,MACtC,EAAA,CAAA,IAGKoB,EAAaC,GAAarB,IAAQ,CAAC;AAAA,IAE9C;AAEA,QACEW,EAAO,SAAS,aACf,CAACA,EAAO,cAAc,OAAO,KAAKA,EAAO,UAAU,EAAE,WAAW;AAG/D,aAAA7D,gBAAAA,EAAA,KAACyB,GAAK,EAAA,WAAU,+BACb,UAAA;AAAA,QAAA,UAAUoC,KAAU5E,gBAAAA,MAAAsC,EAAAA,UAAA,EAAG,UAAAsC,EAAO,MAAK;AAAA,QACnC5E,gBAAAA,EAAA,IAAA,QAAA,EAAK,WAAU,iCAAgC,UAAM,UAAA;AAAA,QACrD4E,EAAO,eACN5E,gBAAAA,EAAA;AAAA,UAACmC;AAAA,UAAA;AAAA,YACC,WAAWmB;AAAA,cACT6B;AAAA,cACA;AAAA,YACF;AAAA,YACA,SAASP,EAAO;AAAA,UAAA;AAAA,QAClB;AAAA,MAEJ,EAAA,CAAA;AAIJ,QAAIA,EAAO,YAAY;AACrB,YAAMW,IAAoBnE;AAAA,QACxB,OAAO,QAAQwD,EAAO,UAAU;AAAA,QAChC,CAAC,CAACY,GAAcC,CAAQ,MAAM;;AACrB,iBAAAA,EAAS,aACZ,gBACAb,IAAAA,EAAO,aAAPA,QAAAA,EAAiB,SAASY,KACxB,aACA;AAAA,QACR;AAAA,MAAA,GAGIE,IAAa,CAAC,YAAY,YAAY,YAAY;AAExD,aACG1F,gBAAAA,EAAAA,IAAAwC,GAAA,EAAK,WAAU,4BACb,UAAWkD,EAAA;AAAA,QACV,CAAC1D,MACCuD,EAAkBvD,CAAK,2BACpB,MAAe,EAAA,WAAU,YACvB,UAAAuD,EAAkBvD,CAAK,EAAE,IAAI,CAAC,CAACgD,GAAMJ,CAAM,MAC1C5E,gBAAAA,EAAA;AAAA,UAAC+E;AAAA,UAAA;AAAA,YAEC,MAAAC;AAAA,YACA,QAAQJ;AAAAA,YACR,OAAA5C;AAAA,YACA,OAAOiC;AAAAA,YACP,aAAAgB;AAAA,UAAA;AAAA,UALKD;AAAA,QAAA,CAOR,KAVMhD,CAWT;AAAA,MAGR,EAAA,CAAA;AAAA,IAEJ;AAEA,WACE,OAAO4C,EAAO,QAAS,YACvB,CAAC,UAAU,UAAU,WAAW,WAAW,MAAM,EAAE,SAASA,EAAO,IAAI,IAGrE7D,gBAAAA,EAAA,KAACyB,GAAK,EAAA,WAAU,OACd,UAAA;AAAA,MAAAxC,gBAAAA,EAAA,IAAC,QAAK,EAAA,WAAU,iCAAiC,UAAA4E,EAAO,MAAK;AAAA,MAC5DA,EAAO,eACN5E,gBAAAA,EAAA;AAAA,QAACmC;AAAA,QAAA;AAAA,UACC,WAAWmB;AAAA,YACT6B;AAAA,YACA;AAAA,UACF;AAAA,UACA,SAASP,EAAO;AAAA,QAAA;AAAA,MAClB;AAAA,IAEJ,EAAA,CAAA,IAIAA,EAAO,uBAEP7D,gBAAAA,EAAA,KAACyB,GAAK,EAAA,WAAU,QACd,UAAA;AAAA,MAAAxC,gBAAAA,MAAC2F,IACC,EAAA,UAAA3F,gBAAAA,EAAA,IAAC4F,IAAU,EAAA,UAAA,yBAAsB,CAAA,GACnC;AAAA,4BACCC,IACE,EAAA,UAAAR;AAAA,QACCT,EAAO;AAAA,QACPX,IAAQ;AAAA,MAAA,GAEZ;AAAA,IACF,EAAA,CAAA,IAIG;AAAA,EAAA;AAGF,SAAAoB,EAAaT,GAAQX,CAAK;AACnC,GC3Ja6B,KAAe,CAAC,QAAQ,SAAS,UAAU,QAAQ,GAGnDC,KAAoB,CAAC;AAAA,EAChC,mBAAAC;AACF,MAEM;;AACE,QAAAC,IAAY3G,GAAY4G,IAAoBF,CAAiB,GAC7DG,IAAoB/E;AAAA,IACxB6E,EAAU,cAAc,CAAC;AAAA,IACzB,CAACG,MAAUA,EAAM;AAAA,EAAA,GAGbC,IAAQJ,EAAU,UAAU,GAAG,CAAC,GAChC,CAACK,GAAkBC,CAAmB,IAAIxG,EAASsG,KAAA,gBAAAA,EAAO,UAAU;AAGxE,SAAAtF,gBAAAA,EAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MAEC,WAAU;AAAA,MAEV,UAAA;AAAA,QAACA,gBAAAA,EAAAA,KAAA,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,UAACf,gBAAAA,EAAAA,IAAAuC,GAAA,EAAQ,OAAO,GAAG,IAAI0D,EAAU,MAAM,uBAAqB,IACzD,UAAAA,EAAU,QACb,CAAA;AAAA,UACCA,EAAU,eACTjG,gBAAAA,EAAA;AAAA,YAACmC;AAAA,YAAA;AAAA,cACC,WAAW,GAAGgD,CAAY;AAAA,cAC1B,SAASc,EAAU;AAAA,YAAA;AAAA,UACrB;AAAA,UAEDA,EAAU,cAAcA,EAAU,WAAW,SAAS,yCAElD,UAAaH,GAAA;AAAA,YAAQ,CAAC9D,MAAA;;AACrB,sBAAAwE,IAAAL,EAAkBnE,CAAK,MAAvB,QAAAwE,EAA0B,SACxBxG,gBAAAA,EAAA;AAAA,gBAACoC;AAAA,gBAAA;AAAA,kBAEC,IAAI6D,EAAU;AAAA,kBACd,YAAYE,EAAkBnE,CAAK;AAAA,kBACnC,OAAAA;AAAA,gBAAA;AAAA,gBAHKA;AAAA,cAAA,IAMP,CAAC;AAAA;AAAA,UAAA,GAGP;AAAA,UAEDN,IAAS+E,KAAAC,KAAAF,IAAAP,EAAU,gBAAV,gBAAAO,EAAuB,YAAvB,gBAAAE,EAAgC,GAAG,OAAnC,gBAAAD,EAAuC,QAAQ,CAAC7B,MACvD7D,gBAAAA,EAAA,KAAA,OAAA,EAAI,WAAU,4BACb,UAAA;AAAA,YAAAf,gBAAAA,EAAA;AAAA,cAACuC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,gBACP,WAAU;AAAA,gBACV,IAAI,GAAG0D,EAAU,IAAI;AAAA,gBACrB,uBAAqB;AAAA,gBACtB,UAAA;AAAA,cAAA;AAAA,YAED;AAAA,YACAjG,gBAAAA,MAAC6D,KAAW,QAAAe,GAAgB;AAAA,UAAA,EAAA,CAC9B,CACD;AAAA,UACAqB,EAAU,UAAU,SAAS,KAE1BlF,gBAAAA,EAAAA,KAAAuB,EAAAA,UAAA,EAAA,UAAA;AAAA,YAAAtC,gBAAAA,EAAA;AAAA,cAACuC;AAAA,cAAA;AAAA,gBACC,OAAO;AAAA,gBACP,WAAU;AAAA,gBACV,IAAI,GAAG0D,EAAU,IAAI;AAAA,gBACrB,uBAAqB;AAAA,gBACtB,UAAA;AAAA,cAAA;AAAA,YAED;AAAA,YACAlF,gBAAAA,EAAA;AAAA,cAAC4F;AAAA,cAAA;AAAA,gBACC,eAAe,CAACnC,MAAU+B,EAAoB/B,CAAK;AAAA,gBACnD,OAAO8B;AAAA,gBAEN,UAAA;AAAA,kBAAUL,EAAA,UAAU,SAAS,KAC5BjG,gBAAAA,EAAA,IAAC4G,KACE,UAAUX,EAAA,UAAU,IAAI,CAACY,MACxB7G,gBAAAA,EAAA;AAAA,oBAAC8G;AAAA,oBAAA;AAAA,sBACC,OAAOD,EAAS;AAAA,sBAEhB,OAAOA,EAAS,eAAe;AAAA,sBAE9B,UAASA,EAAA;AAAA,oBAAA;AAAA,oBAHLA,EAAS;AAAA,kBAKjB,CAAA,GACH;AAAA,kBAEF7G,gBAAAA,EAAAA,IAAC,QAAG,WAAU,sBACX,YAAU,UAAU,IAAI,CAAC6G;;AACxB7G,2CAAAA,EAAA;AAAA,sBAAC+G;AAAA,sBAAA;AAAA,wBACC,OAAOF,EAAS;AAAA,wBAGhB,UAAA7G,gBAAAA,EAAA;AAAA,0BAAC6D;AAAA,0BAAA;AAAA,4BACC,SACE6C,KAAAF,IAAAK,EAAS,YAAT,gBAAAL,EAAkB,KAAK,CAACQ,MAAYA,EAAQ,YAA5C,gBAAAN,EACI;AAAA,0BAAA;AAAA,wBAER;AAAA,sBAAA;AAAA,sBAPKG,EAAS;AAAA,oBASjB;AAAA,mBAAA,GACH;AAAA,gBAAA;AAAA,cAAA;AAAA,YACF;AAAA,UAAA,GACF;AAAA,QAAA,GAEJ;AAAA,QAEA7G,gBAAAA,EAAA;AAAA,UAACiH;AAAA,UAAA;AAAA,YACC,kBAAAX;AAAA,YACA,kBAAkBC;AAAA,YAClB,WAAAN;AAAA,UAAA;AAAA,QACF;AAAA,MAAA;AAAA,IAAA;AAAA,IA7FKA,EAAU;AAAA,EAAA;AAgGrB,GC/GaC,KAAqBxG;AAAA;AAAA,EAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA8DvD,GAIKwH,KAAqBxH;AAAA;AAAA,EAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBhD,GAEKyH,KAAkB,EAAE,UAAU,MAEvBC,KAAgB,MAAM;;AACjC,QAAM,EAAE,MAAAjE,GAAM,OAAAkE,EAAM,IAAI7G,EAAa,GAE/B,CAACF,CAAM,IAAIC,EAAS;AAAA,IACxB,OAAO2G;AAAA,IACP,WAAW,EAAE,MAAA/D,GAAM,OAAAkE,EAAM;AAAA,IACzB,SAASF;AAAA,EAAA,CACV,GAEKG,KAAQd,IAAAlG,EAAO,UAAP,gBAAAkG,EAAc,cAAc,GAAG;AAI7C,SAAIc,IAEAtH,gBAAAA,EAAA;AAAA,IAACuH;AAAA,IAAA;AAAA,MACC,UAAS;AAAA,MACT,OAAM;AAAA,MACN,SAEIxG,gBAAAA,EAAA,KAAAuB,YAAA,EAAA,UAAA;AAAA,QAACvB,gBAAAA,EAAAA,KAAAyG,GAAA,EAAc,WAAU,QAAO,UAAA;AAAA,UAAA;AAAA,UACCxH,gBAAAA,EAAAA,IAACgB,KAAW,UAAS,YAAA,CAAA;AAAA,UAAc;AAAA,UAAI;AAAA,UAClEhB,gBAAAA,EAAAA,IAACgB,KAAW,UAAU,aAAA,CAAA;AAAA,UAAa;AAAA,QAAA,GACzC;AAAA,QAAgB;AAAA,8BAEfyG,GAAgB,EAAA,MAAMH,EAAM,YAAY,UAAS,SAAQ;AAAA,MAAA,GAC5D;AAAA,IAAA;AAAA,EAAA,IAMHhH,EAAO,OAGVS,gBAAAA,EAAA,KAAC,OAAI,EAAA,WAAU,8BACb,UAAA;AAAA,IAAAA,gBAAAA,EAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWuC,EAAG6B,GAAc,wCAAwC;AAAA,QAEpE,UAAA;AAAA,UAAAnF,gBAAAA,EAAAA,IAAC0H,KAAgB,UAAQ,WAAA,CAAA;AAAA,UACzB1H,gBAAAA,EAAAA,IAACuC,GAAQ,EAAA,OAAO,GAAG,IAAG,eAAc,uBAAqB,IACtD,UAAAjC,EAAO,KAAK,OAAO,MACtB,CAAA;AAAA,gCACC6B,GAAS,EAAA,SAAS7B,EAAO,KAAK,OAAO,eAAe,IAAI;AAAA,QAAA;AAAA,MAAA;AAAA,IAC3D;AAAA,0BACC,MAAG,EAAA;AAAA,0BACH,OAAI,EAAA,WAAU,yBACb,UAAAN,gBAAAA,MAACK,KAAS,CAAA,GACZ;AAAA,IAECC,EAAO,KAAK,OAAO,KACjB,OAAO,CAACqH,MAAQA,EAAI,WAAW,SAAS,CAAC,EACzC,IAAI,CAACA,6BACH,OACE,EAAA,UAAA;AAAA,MAAAA,EAAI,QAAQ3H,gBAAAA,MAAC0H,GAAiB,EAAA,UAAAC,EAAI,MAAK;AAAA,MACvCA,EAAI,eACH3H,gBAAAA,EAAA;AAAA,QAACmC;AAAA,QAAA;AAAA,UACC,WAAW,GAAGgD,CAAY;AAAA,UAC1B,SAASwC,EAAI;AAAA,QAAA;AAAA,MACf;AAAA,MAEF3H,gBAAAA,EAAAA,IAAC,OAAI,EAAA,WAAU,mBACb,UAAAA,gBAAAA,EAAA,IAAC4H,MACE,UAAID,EAAA,WAAW,IAAI,CAACE,MACnB7H,gBAAAA,EAAA;AAAA,QAAC+F;AAAA,QAAA;AAAA,UAEC,mBAAmB8B;AAAA,QAAA;AAAA,QADdA,EAAS;AAAA,MAAA,CAGjB,GACH,EACF,CAAA;AAAA,IAAA,KAjBQF,EAAI,IAkBd,CACD;AAAA,EACL,EAAA,CAAA,IAzCuB;AA2C3B;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"Spinner-C6zroowC.js","sources":["../src/lib/components/navigation/SidebarBadge.tsx","../src/lib/components/Spinner.tsx"],"sourcesContent":["import { cn } from \"../../util/cn.js\";\n\nexport const TextColorMap = {\n green: \"text-green-600\",\n blue: \"text-sky-600\",\n yellow: \"text-yellow-600\",\n red: \"text-red-600\",\n purple: \"text-purple-600\",\n indigo: \"text-indigo-600\",\n gray: \"text-gray-600\",\n};\n\nexport const ColorMap = {\n green: \"bg-green-400 dark:bg-green-800\",\n blue: \"bg-sky-400 dark:bg-sky-800\",\n yellow: \"bg-yellow-400 dark:bg-yellow-800\",\n red: \"bg-red-400 dark:bg-red-800\",\n purple: \"bg-purple-400 dark:bg-purple-600\",\n indigo: \"bg-indigo-400 dark:bg-indigo-600\",\n gray: \"bg-gray-400 dark:bg-gray-600\",\n};\n\nexport const SidebarBadge = ({\n color,\n label,\n className,\n}: {\n color: keyof typeof ColorMap;\n label: string;\n className?: string;\n}) => {\n return (\n <span\n className={cn(\n \"mt-0.5 flex items-center duration-200 transition-opacity text-center uppercase font-mono text-[0.65rem] font-bold rounded text-background dark:text-zinc-50 h-4 px-1\",\n ColorMap[color],\n className,\n )}\n >\n {label}\n </span>\n );\n};\n","import { LoaderCircle } from \"lucide-react\";\n\nexport const Spinner = ({ size = 16 }: { size?: number }) => (\n <LoaderCircle size={size} className=\"animate-spin\" />\n);\n"],"names":["TextColorMap","ColorMap","SidebarBadge","color","label","className","jsx","cn","Spinner","size","LoaderCircle"],"mappings":";;;AAEO,MAAMA,IAAe;AAAA,EAC1B,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AACR,GAEaC,IAAW;AAAA,EACtB,OAAO;AAAA,EACP,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AACR,GAEaC,IAAe,CAAC;AAAA,EAC3B,OAAAC;AAAA,EACA,OAAAC;AAAA,EACA,WAAAC;AACF,MAMIC,gBAAAA,EAAA;AAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAWC;AAAA,MACT;AAAA,MACAN,EAASE,CAAK;AAAA,MACdE;AAAA,IACF;AAAA,IAEC,UAAAD;AAAA,EAAA;AAAA,GCrCMI,IAAU,CAAC,EAAE,MAAAC,IAAO,SAC9BH,gBAAAA,MAAAI,GAAA,EAAa,MAAAD,GAAY,WAAU,eAAe,CAAA;"}