zudoku 0.38.0 → 0.39.1

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 (269) hide show
  1. package/dist/app/entry.server.d.ts +5 -4
  2. package/dist/app/entry.server.js +2 -2
  3. package/dist/app/entry.server.js.map +1 -1
  4. package/dist/app/tailwind.js +14 -0
  5. package/dist/app/tailwind.js.map +1 -1
  6. package/dist/cli/cmds/dev.js +1 -7
  7. package/dist/cli/cmds/dev.js.map +1 -1
  8. package/dist/config/validators/common.d.ts +17 -0
  9. package/dist/config/validators/common.js +1 -0
  10. package/dist/config/validators/common.js.map +1 -1
  11. package/dist/config/validators/validate.d.ts +7 -0
  12. package/dist/lib/components/Bootstrap.d.ts +2 -1
  13. package/dist/lib/components/Bootstrap.js +3 -2
  14. package/dist/lib/components/Bootstrap.js.map +1 -1
  15. package/dist/lib/components/Header.js +2 -2
  16. package/dist/lib/components/Header.js.map +1 -1
  17. package/dist/lib/components/Heading.d.ts +1 -1
  18. package/dist/lib/components/Layout.js +2 -9
  19. package/dist/lib/components/Layout.js.map +1 -1
  20. package/dist/lib/components/Main.js +3 -1
  21. package/dist/lib/components/Main.js.map +1 -1
  22. package/dist/lib/components/MobileTopNavigation.js +6 -3
  23. package/dist/lib/components/MobileTopNavigation.js.map +1 -1
  24. package/dist/lib/components/Pagination.d.ts +10 -0
  25. package/dist/lib/components/Pagination.js +10 -0
  26. package/dist/lib/components/Pagination.js.map +1 -0
  27. package/dist/lib/components/TopNavigation.d.ts +1 -0
  28. package/dist/lib/components/TopNavigation.js +18 -2
  29. package/dist/lib/components/TopNavigation.js.map +1 -1
  30. package/dist/lib/components/Zudoku.js +4 -1
  31. package/dist/lib/components/Zudoku.js.map +1 -1
  32. package/dist/lib/components/context/BypassProtectedRoutesContext.d.ts +1 -0
  33. package/dist/lib/components/context/BypassProtectedRoutesContext.js +3 -0
  34. package/dist/lib/components/context/BypassProtectedRoutesContext.js.map +1 -0
  35. package/dist/lib/components/index.d.ts +2 -1
  36. package/dist/lib/components/navigation/PoweredByZudoku.d.ts +3 -0
  37. package/dist/lib/components/navigation/PoweredByZudoku.js +6 -0
  38. package/dist/lib/components/navigation/PoweredByZudoku.js.map +1 -0
  39. package/dist/lib/components/navigation/SidebarItem.d.ts +1 -0
  40. package/dist/lib/components/navigation/SidebarItem.js +7 -3
  41. package/dist/lib/components/navigation/SidebarItem.js.map +1 -1
  42. package/dist/lib/components/navigation/SidebarWrapper.js +9 -2
  43. package/dist/lib/components/navigation/SidebarWrapper.js.map +1 -1
  44. package/dist/lib/{plugins/markdown → components/navigation}/Toc.js +5 -7
  45. package/dist/lib/components/navigation/Toc.js.map +1 -0
  46. package/dist/lib/components/navigation/ZudokuLogo.d.ts +6 -0
  47. package/dist/lib/components/navigation/ZudokuLogo.js +5 -0
  48. package/dist/lib/components/navigation/ZudokuLogo.js.map +1 -0
  49. package/dist/lib/core/RouteGuard.d.ts +1 -0
  50. package/dist/lib/core/RouteGuard.js +9 -3
  51. package/dist/lib/core/RouteGuard.js.map +1 -1
  52. package/dist/lib/core/ZudokuContext.d.ts +1 -0
  53. package/dist/lib/core/ZudokuContext.js.map +1 -1
  54. package/dist/lib/oas/graphql/index.d.ts +2 -1
  55. package/dist/lib/oas/graphql/index.js +74 -14
  56. package/dist/lib/oas/graphql/index.js.map +1 -1
  57. package/dist/lib/oas/parser/dereference/index.js +2 -0
  58. package/dist/lib/oas/parser/dereference/index.js.map +1 -1
  59. package/dist/lib/oas/parser/index.d.ts +5 -3
  60. package/dist/lib/oas/parser/index.js +0 -22
  61. package/dist/lib/oas/parser/index.js.map +1 -1
  62. package/dist/lib/plugins/api-catalog/index.js +19 -17
  63. package/dist/lib/plugins/api-catalog/index.js.map +1 -1
  64. package/dist/lib/plugins/markdown/MdxPage.js +3 -3
  65. package/dist/lib/plugins/markdown/MdxPage.js.map +1 -1
  66. package/dist/lib/plugins/openapi/ColorizedParam.js +1 -1
  67. package/dist/lib/plugins/openapi/ColorizedParam.js.map +1 -1
  68. package/dist/lib/plugins/openapi/OperationList.d.ts +1 -1
  69. package/dist/lib/plugins/openapi/OperationList.js +28 -8
  70. package/dist/lib/plugins/openapi/OperationList.js.map +1 -1
  71. package/dist/lib/plugins/openapi/OperationListItem.js +1 -1
  72. package/dist/lib/plugins/openapi/OperationListItem.js.map +1 -1
  73. package/dist/lib/plugins/openapi/ParameterListItem.js +2 -1
  74. package/dist/lib/plugins/openapi/ParameterListItem.js.map +1 -1
  75. package/dist/lib/plugins/openapi/SchemaList.d.ts +1 -0
  76. package/dist/lib/plugins/openapi/SchemaList.js +52 -0
  77. package/dist/lib/plugins/openapi/SchemaList.js.map +1 -0
  78. package/dist/lib/plugins/openapi/client/GraphQLClient.d.ts +1 -1
  79. package/dist/lib/plugins/openapi/client/GraphQLClient.js +1 -1
  80. package/dist/lib/plugins/openapi/client/GraphQLClient.js.map +1 -1
  81. package/dist/lib/plugins/openapi/client/useCreateQuery.d.ts +6 -2
  82. package/dist/lib/plugins/openapi/client/useCreateQuery.js +5 -5
  83. package/dist/lib/plugins/openapi/client/useCreateQuery.js.map +1 -1
  84. package/dist/lib/plugins/openapi/components/EnumValues.js +1 -1
  85. package/dist/lib/plugins/openapi/components/EnumValues.js.map +1 -1
  86. package/dist/lib/plugins/openapi/graphql/gql.d.ts +6 -2
  87. package/dist/lib/plugins/openapi/graphql/gql.js +3 -2
  88. package/dist/lib/plugins/openapi/graphql/gql.js.map +1 -1
  89. package/dist/lib/plugins/openapi/graphql/graphql.d.ts +67 -11
  90. package/dist/lib/plugins/openapi/graphql/graphql.js +34 -5
  91. package/dist/lib/plugins/openapi/graphql/graphql.js.map +1 -1
  92. package/dist/lib/plugins/openapi/index.js +12 -0
  93. package/dist/lib/plugins/openapi/index.js.map +1 -1
  94. package/dist/lib/plugins/openapi/schema/LogicalGroup/LogicalGroup.d.ts +1 -2
  95. package/dist/lib/plugins/openapi/schema/LogicalGroup/LogicalGroup.js +2 -2
  96. package/dist/lib/plugins/openapi/schema/LogicalGroup/LogicalGroup.js.map +1 -1
  97. package/dist/lib/plugins/openapi/schema/LogicalGroup/LogicalGroupConnector.d.ts +2 -1
  98. package/dist/lib/plugins/openapi/schema/LogicalGroup/LogicalGroupConnector.js +2 -2
  99. package/dist/lib/plugins/openapi/schema/LogicalGroup/LogicalGroupConnector.js.map +1 -1
  100. package/dist/lib/plugins/openapi/schema/LogicalGroup/LogicalGroupItem.d.ts +0 -1
  101. package/dist/lib/plugins/openapi/schema/LogicalGroup/LogicalGroupItem.js +1 -1
  102. package/dist/lib/plugins/openapi/schema/LogicalGroup/LogicalGroupItem.js.map +1 -1
  103. package/dist/lib/plugins/openapi/schema/SchemaExampleAndDefault.d.ts +4 -0
  104. package/dist/lib/plugins/openapi/schema/SchemaExampleAndDefault.js +12 -0
  105. package/dist/lib/plugins/openapi/schema/SchemaExampleAndDefault.js.map +1 -0
  106. package/dist/lib/plugins/openapi/schema/SchemaPropertyItem.d.ts +2 -4
  107. package/dist/lib/plugins/openapi/schema/SchemaPropertyItem.js +12 -9
  108. package/dist/lib/plugins/openapi/schema/SchemaPropertyItem.js.map +1 -1
  109. package/dist/lib/plugins/openapi/schema/SchemaView.d.ts +1 -2
  110. package/dist/lib/plugins/openapi/schema/SchemaView.js +30 -52
  111. package/dist/lib/plugins/openapi/schema/SchemaView.js.map +1 -1
  112. package/dist/lib/plugins/openapi/schema/utils.d.ts +1 -0
  113. package/dist/lib/plugins/openapi/schema/utils.js +3 -1
  114. package/dist/lib/plugins/openapi/schema/utils.js.map +1 -1
  115. package/dist/lib/plugins/openapi/util/getRoutes.js +9 -3
  116. package/dist/lib/plugins/openapi/util/getRoutes.js.map +1 -1
  117. package/dist/lib/plugins/search-pagefind/PagefindSearch.js +9 -4
  118. package/dist/lib/plugins/search-pagefind/PagefindSearch.js.map +1 -1
  119. package/dist/lib/plugins/search-pagefind/ResultList.d.ts +1 -1
  120. package/dist/lib/plugins/search-pagefind/ResultList.js +6 -12
  121. package/dist/lib/plugins/search-pagefind/ResultList.js.map +1 -1
  122. package/dist/lib/plugins/search-pagefind/index.d.ts +1 -3
  123. package/dist/lib/util/useOnScreen.d.ts +3 -2
  124. package/dist/lib/util/useOnScreen.js +3 -3
  125. package/dist/lib/util/useOnScreen.js.map +1 -1
  126. package/dist/vite/api/schema-codegen.js +2 -2
  127. package/dist/vite/api/schema-codegen.js.map +1 -1
  128. package/dist/vite/api/schema-codegen.test.js +5 -0
  129. package/dist/vite/api/schema-codegen.test.js.map +1 -1
  130. package/dist/vite/build.js +1 -9
  131. package/dist/vite/build.js.map +1 -1
  132. package/dist/vite/plugin-api.js +8 -7
  133. package/dist/vite/plugin-api.js.map +1 -1
  134. package/dist/vite/plugin-search.js +1 -1
  135. package/dist/vite/plugin-search.js.map +1 -1
  136. package/dist/vite/prerender/FileWritingResponse.d.ts +9 -5
  137. package/dist/vite/prerender/FileWritingResponse.js +5 -5
  138. package/dist/vite/prerender/FileWritingResponse.js.map +1 -1
  139. package/dist/vite/prerender/InMemoryResponse.d.ts +16 -0
  140. package/dist/vite/prerender/InMemoryResponse.js +32 -0
  141. package/dist/vite/prerender/InMemoryResponse.js.map +1 -0
  142. package/dist/vite/prerender/PrerenderResponse.d.ts +10 -0
  143. package/dist/vite/prerender/PrerenderResponse.js +2 -0
  144. package/dist/vite/prerender/PrerenderResponse.js.map +1 -0
  145. package/dist/vite/prerender/prerender.d.ts +1 -0
  146. package/dist/vite/prerender/prerender.js +18 -0
  147. package/dist/vite/prerender/prerender.js.map +1 -1
  148. package/dist/vite/prerender/worker.js +36 -8
  149. package/dist/vite/prerender/worker.js.map +1 -1
  150. package/dist/zuplo/with-zuplo.js +4 -0
  151. package/dist/zuplo/with-zuplo.js.map +1 -1
  152. package/lib/{AuthenticationPlugin-Duy_R1TU.js → AuthenticationPlugin-foqdvvkf.js} +2 -2
  153. package/lib/{AuthenticationPlugin-Duy_R1TU.js.map → AuthenticationPlugin-foqdvvkf.js.map} +1 -1
  154. package/lib/{Markdown-DIZ8nBVC.js → Markdown-aF5FdsNi.js} +1339 -1335
  155. package/lib/{Markdown-DIZ8nBVC.js.map → Markdown-aF5FdsNi.js.map} +1 -1
  156. package/lib/MdxPage-JscVnWM8.js +84 -0
  157. package/lib/MdxPage-JscVnWM8.js.map +1 -0
  158. package/lib/{OasProvider-D1A10JeA.js → OasProvider-C7Y53snX.js} +3 -3
  159. package/lib/{OasProvider-D1A10JeA.js.map → OasProvider-C7Y53snX.js.map} +1 -1
  160. package/lib/OperationList-_M8wg22T.js +5066 -0
  161. package/lib/OperationList-_M8wg22T.js.map +1 -0
  162. package/lib/Pagination-DCCvGq0m.js +46 -0
  163. package/lib/Pagination-DCCvGq0m.js.map +1 -0
  164. package/lib/RouteGuard-CqZPoZYJ.js +744 -0
  165. package/lib/RouteGuard-CqZPoZYJ.js.map +1 -0
  166. package/lib/SchemaList-CrKZdUyo.js +148 -0
  167. package/lib/SchemaList-CrKZdUyo.js.map +1 -0
  168. package/lib/SchemaView-B4JHn-BX.js +354 -0
  169. package/lib/SchemaView-B4JHn-BX.js.map +1 -0
  170. package/lib/{Select-fAYcJ0OU.js → Select-DVFRKf1R.js} +3 -3
  171. package/lib/{Select-fAYcJ0OU.js.map → Select-DVFRKf1R.js.map} +1 -1
  172. package/lib/{SlotletProvider-BEwNY8q0.js → SlotletProvider-DXvc0aY6.js} +2 -2
  173. package/lib/{SlotletProvider-BEwNY8q0.js.map → SlotletProvider-DXvc0aY6.js.map} +1 -1
  174. package/lib/Toc-YBsgI72s.js +92 -0
  175. package/lib/Toc-YBsgI72s.js.map +1 -0
  176. package/lib/{createServer-DjgKDpGV.js → createServer-mYvGvmc0.js} +2596 -2502
  177. package/lib/createServer-mYvGvmc0.js.map +1 -0
  178. package/lib/{hook-Cge6LiTK.js → hook-CqpVYDqN.js} +28 -28
  179. package/lib/{hook-Cge6LiTK.js.map → hook-CqpVYDqN.js.map} +1 -1
  180. package/lib/{index-B0y3fTg-.js → index-C8-tlf_X.js} +771 -729
  181. package/lib/index-C8-tlf_X.js.map +1 -0
  182. package/lib/index-D6ktNq4i.js +1863 -0
  183. package/lib/index-D6ktNq4i.js.map +1 -0
  184. package/lib/{mutation-EChriCeF.js → mutation-8LjrN7uz.js} +2 -2
  185. package/lib/{mutation-EChriCeF.js.map → mutation-8LjrN7uz.js.map} +1 -1
  186. package/lib/objectEntries-yMIkr2mI.js +5 -0
  187. package/lib/objectEntries-yMIkr2mI.js.map +1 -0
  188. package/lib/useLatest-hmRS46UF.js +11 -0
  189. package/lib/useLatest-hmRS46UF.js.map +1 -0
  190. package/lib/zudoku.auth-auth0.js +1 -1
  191. package/lib/zudoku.auth-clerk.js +2 -2
  192. package/lib/zudoku.auth-openid.js +2 -2
  193. package/lib/zudoku.components.js +32 -1454
  194. package/lib/zudoku.components.js.map +1 -1
  195. package/lib/zudoku.hooks.js +1 -1
  196. package/lib/zudoku.plugin-api-catalog.js +80 -76
  197. package/lib/zudoku.plugin-api-catalog.js.map +1 -1
  198. package/lib/zudoku.plugin-api-keys.js +3 -3
  199. package/lib/zudoku.plugin-custom-pages.js +1 -1
  200. package/lib/zudoku.plugin-markdown.js +1 -1
  201. package/lib/zudoku.plugin-openapi.js +2 -2
  202. package/lib/zudoku.plugin-search-pagefind.js +132 -137
  203. package/lib/zudoku.plugin-search-pagefind.js.map +1 -1
  204. package/package.json +6 -5
  205. package/src/app/entry.server.tsx +6 -3
  206. package/src/app/tailwind.ts +14 -0
  207. package/src/lib/components/Bootstrap.tsx +13 -6
  208. package/src/lib/components/Header.tsx +2 -2
  209. package/src/lib/components/Layout.tsx +5 -17
  210. package/src/lib/components/Main.tsx +6 -3
  211. package/src/lib/components/MobileTopNavigation.tsx +27 -18
  212. package/src/lib/components/Pagination.tsx +47 -0
  213. package/src/lib/components/TopNavigation.tsx +29 -2
  214. package/src/lib/components/Zudoku.tsx +5 -3
  215. package/src/lib/components/context/BypassProtectedRoutesContext.ts +3 -0
  216. package/src/lib/components/navigation/PoweredByZudoku.tsx +23 -0
  217. package/src/lib/components/navigation/SidebarItem.tsx +10 -4
  218. package/src/lib/components/navigation/SidebarWrapper.tsx +27 -13
  219. package/src/lib/{plugins/markdown → components/navigation}/Toc.tsx +5 -14
  220. package/src/lib/components/navigation/ZudokuLogo.tsx +25 -0
  221. package/src/lib/core/RouteGuard.tsx +26 -4
  222. package/src/lib/core/ZudokuContext.ts +1 -0
  223. package/src/lib/oas/graphql/index.ts +118 -45
  224. package/src/lib/oas/parser/dereference/index.ts +2 -0
  225. package/src/lib/oas/parser/index.ts +7 -29
  226. package/src/lib/plugins/api-catalog/index.tsx +40 -35
  227. package/src/lib/plugins/markdown/MdxPage.tsx +6 -36
  228. package/src/lib/plugins/openapi/ColorizedParam.tsx +1 -1
  229. package/src/lib/plugins/openapi/OperationList.tsx +36 -15
  230. package/src/lib/plugins/openapi/OperationListItem.tsx +7 -2
  231. package/src/lib/plugins/openapi/ParameterListItem.tsx +2 -0
  232. package/src/lib/plugins/openapi/SchemaList.tsx +151 -0
  233. package/src/lib/plugins/openapi/client/GraphQLClient.tsx +1 -1
  234. package/src/lib/plugins/openapi/client/useCreateQuery.ts +12 -5
  235. package/src/lib/plugins/openapi/components/EnumValues.tsx +1 -1
  236. package/src/lib/plugins/openapi/graphql/gql.ts +15 -6
  237. package/src/lib/plugins/openapi/graphql/graphql.ts +104 -15
  238. package/src/lib/plugins/openapi/index.tsx +13 -0
  239. package/src/lib/plugins/openapi/schema/LogicalGroup/LogicalGroup.tsx +1 -8
  240. package/src/lib/plugins/openapi/schema/LogicalGroup/LogicalGroupConnector.tsx +3 -0
  241. package/src/lib/plugins/openapi/schema/LogicalGroup/LogicalGroupItem.tsx +6 -3
  242. package/src/lib/plugins/openapi/schema/SchemaExampleAndDefault.tsx +36 -0
  243. package/src/lib/plugins/openapi/schema/SchemaPropertyItem.tsx +20 -21
  244. package/src/lib/plugins/openapi/schema/SchemaView.tsx +69 -141
  245. package/src/lib/plugins/openapi/schema/utils.ts +7 -1
  246. package/src/lib/plugins/openapi/util/getRoutes.tsx +9 -6
  247. package/src/lib/plugins/search-pagefind/PagefindSearch.tsx +11 -4
  248. package/src/lib/plugins/search-pagefind/ResultList.tsx +5 -16
  249. package/src/lib/plugins/search-pagefind/index.tsx +1 -1
  250. package/src/lib/util/useOnScreen.ts +6 -4
  251. package/dist/cli/dev/pagefind-command.d.ts +0 -3
  252. package/dist/cli/dev/pagefind-command.js +0 -59
  253. package/dist/cli/dev/pagefind-command.js.map +0 -1
  254. package/dist/lib/components/context/PluginSystem.d.ts +0 -1
  255. package/dist/lib/components/context/PluginSystem.js +0 -2
  256. package/dist/lib/components/context/PluginSystem.js.map +0 -1
  257. package/dist/lib/plugins/markdown/Toc.js.map +0 -1
  258. package/lib/MdxPage-JEdbfW-f.js +0 -195
  259. package/lib/MdxPage-JEdbfW-f.js.map +0 -1
  260. package/lib/OperationList-yOmYzMIp.js +0 -5379
  261. package/lib/OperationList-yOmYzMIp.js.map +0 -1
  262. package/lib/createServer-DjgKDpGV.js.map +0 -1
  263. package/lib/index-B0y3fTg-.js.map +0 -1
  264. package/lib/index.esm-CltAN0Tf.js +0 -711
  265. package/lib/index.esm-CltAN0Tf.js.map +0 -1
  266. package/lib/objectEntries-BS7aAgOm.js +0 -12
  267. package/lib/objectEntries-BS7aAgOm.js.map +0 -1
  268. package/src/lib/components/context/PluginSystem.ts +0 -0
  269. /package/dist/lib/{plugins/markdown → components/navigation}/Toc.d.ts +0 -0
@@ -0,0 +1,151 @@
1
+ import slugify from "@sindresorhus/slugify";
2
+ import { useSuspenseQuery } from "@tanstack/react-query";
3
+ import {
4
+ ChevronRightIcon,
5
+ ChevronsDownUpIcon,
6
+ ChevronsUpDownIcon,
7
+ } from "lucide-react";
8
+ import { Button } from "zudoku/ui/Button.js";
9
+ import {
10
+ Collapsible,
11
+ CollapsibleContent,
12
+ CollapsibleTrigger,
13
+ } from "zudoku/ui/Collapsible.js";
14
+ import { CategoryHeading } from "../../components/CategoryHeading.js";
15
+ import { Heading } from "../../components/Heading.js";
16
+ import { Markdown, ProseClasses } from "../../components/Markdown.js";
17
+ import { Toc } from "../../components/navigation/Toc.js";
18
+ import { cn } from "../../util/cn.js";
19
+ import { useCreateQuery } from "./client/useCreateQuery.js";
20
+ import { useOasConfig } from "./context.js";
21
+ import { graphql } from "./graphql/gql.js";
22
+ import { SchemaView } from "./schema/SchemaView.js";
23
+
24
+ const GET_SCHEMAS = graphql(/* GraphQL */ `
25
+ query GetSchemas($input: JSON!, $type: SchemaType!) {
26
+ schema(input: $input, type: $type) {
27
+ title
28
+ description
29
+ summary
30
+ components {
31
+ schemas {
32
+ name
33
+ schema
34
+ extensions
35
+ }
36
+ }
37
+ }
38
+ }
39
+ `);
40
+
41
+ export function SchemaList() {
42
+ const { input, type, versions, version, options } = useOasConfig();
43
+ const schemasQuery = useCreateQuery(GET_SCHEMAS, {
44
+ input,
45
+ type,
46
+ });
47
+ const { data } = useSuspenseQuery(schemasQuery);
48
+
49
+ const schemas = data.schema.components?.schemas ?? [];
50
+
51
+ if (!schemas.length) {
52
+ return <div>No schemas found</div>;
53
+ }
54
+
55
+ const hasMultipleVersions = Object.entries(versions).length > 1;
56
+ const showVersions =
57
+ options?.showVersionSelect === "always" ||
58
+ (hasMultipleVersions && options?.showVersionSelect !== "hide");
59
+
60
+ return (
61
+ <div
62
+ className="grid grid-cols-[--sidecar-grid-cols] gap-8 justify-between"
63
+ data-pagefind-filter="section:openapi"
64
+ data-pagefind-meta="section:openapi"
65
+ >
66
+ <div className="pt-[--padding-content-top] pb-[--padding-content-bottom]">
67
+ <Collapsible className="w-full">
68
+ <div className="flex flex-col gap-y-4 sm:flex-row justify-around items-start sm:items-end">
69
+ <div className="flex-1">
70
+ <CategoryHeading>{data.schema.title}</CategoryHeading>
71
+ <Heading
72
+ level={1}
73
+ id="schemas"
74
+ registerSidebarAnchor
75
+ className="mb-0"
76
+ >
77
+ Schemas
78
+ {showVersions && (
79
+ <span className="text-xl text-muted-foreground ml-1.5">
80
+ ({version})
81
+ </span>
82
+ )}
83
+ </Heading>
84
+ </div>
85
+ {data.schema.description && (
86
+ <CollapsibleTrigger className="flex items-center gap-1 text-sm font-medium text-muted-foreground group">
87
+ <span>API information</span>
88
+ <ChevronsUpDownIcon
89
+ className="group-data-[state=open]:hidden translate-y-px"
90
+ size={14}
91
+ />
92
+ <ChevronsDownUpIcon
93
+ className="group-data-[state=closed]:hidden translate-y-px"
94
+ size={13}
95
+ />
96
+ </CollapsibleTrigger>
97
+ )}
98
+ </div>
99
+ {data.schema.description && (
100
+ <CollapsibleContent className="CollapsibleContent">
101
+ <div
102
+ className={cn(
103
+ ProseClasses,
104
+ "pt-4 max-w-full prose-img:max-w-prose",
105
+ )}
106
+ >
107
+ <Markdown
108
+ className="border rounded bg-muted/25 border-border px-2.5 md:px-4"
109
+ content={data.schema.description}
110
+ />
111
+ </div>
112
+ </CollapsibleContent>
113
+ )}
114
+ </Collapsible>
115
+ <hr className="my-8" />
116
+ <div className="flex flex-col gap-y-5">
117
+ {schemas.map((schema) => (
118
+ <Collapsible key={schema.name} className="group" defaultOpen>
119
+ <Heading
120
+ registerSidebarAnchor
121
+ level={2}
122
+ className="flex items-center gap-1 justify-between w-fit"
123
+ id={slugify(schema.name)}
124
+ >
125
+ {schema.name}{" "}
126
+ <CollapsibleTrigger asChild>
127
+ <Button variant="ghost" size="icon" className="size-6">
128
+ <ChevronRightIcon
129
+ size={16}
130
+ className="group-data-[state=open]:rotate-90 transition cursor-pointer"
131
+ />
132
+ </Button>
133
+ </CollapsibleTrigger>
134
+ </Heading>
135
+ <CollapsibleContent className="mt-4 CollapsibleContent">
136
+ <SchemaView schema={schema.schema} />
137
+ </CollapsibleContent>
138
+ </Collapsible>
139
+ ))}
140
+ </div>
141
+ </div>
142
+ <Toc
143
+ entries={schemas.map((schema) => ({
144
+ id: slugify(schema.name),
145
+ value: schema.name,
146
+ depth: 1,
147
+ }))}
148
+ />
149
+ </div>
150
+ );
151
+ }
@@ -43,7 +43,7 @@ export class GraphQLClient {
43
43
 
44
44
  fetch = async <TResult, TVariables>(
45
45
  query: TypedDocumentString<TResult, TVariables>,
46
- ...[variables]: TVariables extends Record<string, never> ? [] : [TVariables]
46
+ variables?: TVariables,
47
47
  ): Promise<TResult> => {
48
48
  const operationName = query.match(/query (\w+)/)?.[1];
49
49
 
@@ -1,19 +1,26 @@
1
1
  import { stripIgnoredCharacters } from "graphql";
2
- import { useContext } from "react";
2
+ import { use } from "react";
3
3
  import type { TypedDocumentString } from "../graphql/graphql.js";
4
4
  import { GraphQLContext } from "./GraphQLContext.js";
5
5
 
6
+ type NoExtraProps<T, U extends T = T> = U & {
7
+ [K in Exclude<keyof U, keyof T>]?: never;
8
+ };
9
+
6
10
  export const useCreateQuery = <TResult, TVariables>(
7
11
  query: TypedDocumentString<TResult, TVariables>,
8
- ...variables: TVariables extends Record<string, never> ? [] : [TVariables]
12
+ ...[variables]: TVariables extends Record<string, never>
13
+ ? []
14
+ : [NoExtraProps<TVariables>]
9
15
  ) => {
10
- const graphQLClient = useContext(GraphQLContext);
16
+ const graphQLClient = use(GraphQLContext);
17
+
11
18
  if (graphQLClient === undefined) {
12
19
  throw new Error("useGraphQL must be used within a GraphQLProvider");
13
20
  }
14
21
 
15
22
  return {
16
- queryFn: () => graphQLClient.fetch(query, ...variables),
17
- queryKey: [stripIgnoredCharacters(query.toString()), variables[0]],
23
+ queryFn: () => graphQLClient.fetch(query, variables),
24
+ queryKey: [stripIgnoredCharacters(query.toString()), variables],
18
25
  } as const;
19
26
  };
@@ -26,7 +26,7 @@ export const EnumValues = ({
26
26
  <span className="text-muted-foreground">Enum values: </span>
27
27
  {visibleValues.map((value) => (
28
28
  <div key={value}>
29
- <SelectOnClick className="border rounded px-1 font-mono cursor-pointer">
29
+ <SelectOnClick className="border rounded px-1 font-mono">
30
30
  {value}
31
31
  </SelectOnClick>
32
32
  </div>
@@ -16,9 +16,10 @@ type Documents = {
16
16
  "\n query ServersQuery($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n url\n servers {\n url\n }\n }\n }\n": typeof types.ServersQueryDocument;
17
17
  "\n fragment OperationsFragment on OperationItem {\n slug\n summary\n method\n description\n operationId\n contentTypes\n path\n deprecated\n extensions\n parameters {\n name\n in\n description\n required\n schema\n style\n explode\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": typeof types.OperationsFragmentFragmentDoc;
18
18
  "\n query SchemaWarmup($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n openapi\n }\n }\n": typeof types.SchemaWarmupDocument;
19
- "\n query OperationsForTag(\n $input: JSON!\n $type: SchemaType!\n $tag: String\n $untagged: Boolean\n ) {\n schema(input: $input, type: $type) {\n servers {\n url\n }\n description\n summary\n title\n url\n version\n tags(name: $tag) {\n name\n description\n }\n operations(tag: $tag, untagged: $untagged) {\n slug\n ...OperationsFragment\n }\n }\n }\n": typeof types.OperationsForTagDocument;
19
+ "\n query OperationsForTag(\n $input: JSON!\n $type: SchemaType!\n $tag: String\n $untagged: Boolean\n ) {\n schema(input: $input, type: $type) {\n servers {\n url\n }\n description\n summary\n title\n url\n version\n tag(slug: $tag, untagged: $untagged) {\n name\n description\n operations {\n slug\n ...OperationsFragment\n }\n next {\n name\n slug\n }\n prev {\n name\n slug\n }\n }\n }\n }\n": typeof types.OperationsForTagDocument;
20
+ "\n query GetSchemas($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n title\n description\n summary\n components {\n schemas {\n name\n schema\n extensions\n }\n }\n }\n }\n": typeof types.GetSchemasDocument;
20
21
  "\n query getServerQuery($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n url\n servers {\n url\n }\n }\n }\n": typeof types.GetServerQueryDocument;
21
- "\n query GetSidebarOperations($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n tags {\n slug\n name\n extensions\n operations {\n summary\n slug\n method\n operationId\n path\n }\n }\n }\n }\n": typeof types.GetSidebarOperationsDocument;
22
+ "\n query GetSidebarOperations($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n tags {\n slug\n name\n extensions\n operations {\n summary\n slug\n method\n operationId\n path\n }\n }\n components {\n schemas {\n __typename\n }\n }\n }\n }\n": typeof types.GetSidebarOperationsDocument;
22
23
  };
23
24
  const documents: Documents = {
24
25
  "\n query ServersQuery($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n url\n servers {\n url\n }\n }\n }\n":
@@ -27,11 +28,13 @@ const documents: Documents = {
27
28
  types.OperationsFragmentFragmentDoc,
28
29
  "\n query SchemaWarmup($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n openapi\n }\n }\n":
29
30
  types.SchemaWarmupDocument,
30
- "\n query OperationsForTag(\n $input: JSON!\n $type: SchemaType!\n $tag: String\n $untagged: Boolean\n ) {\n schema(input: $input, type: $type) {\n servers {\n url\n }\n description\n summary\n title\n url\n version\n tags(name: $tag) {\n name\n description\n }\n operations(tag: $tag, untagged: $untagged) {\n slug\n ...OperationsFragment\n }\n }\n }\n":
31
+ "\n query OperationsForTag(\n $input: JSON!\n $type: SchemaType!\n $tag: String\n $untagged: Boolean\n ) {\n schema(input: $input, type: $type) {\n servers {\n url\n }\n description\n summary\n title\n url\n version\n tag(slug: $tag, untagged: $untagged) {\n name\n description\n operations {\n slug\n ...OperationsFragment\n }\n next {\n name\n slug\n }\n prev {\n name\n slug\n }\n }\n }\n }\n":
31
32
  types.OperationsForTagDocument,
33
+ "\n query GetSchemas($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n title\n description\n summary\n components {\n schemas {\n name\n schema\n extensions\n }\n }\n }\n }\n":
34
+ types.GetSchemasDocument,
32
35
  "\n query getServerQuery($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n url\n servers {\n url\n }\n }\n }\n":
33
36
  types.GetServerQueryDocument,
34
- "\n query GetSidebarOperations($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n tags {\n slug\n name\n extensions\n operations {\n summary\n slug\n method\n operationId\n path\n }\n }\n }\n }\n":
37
+ "\n query GetSidebarOperations($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n tags {\n slug\n name\n extensions\n operations {\n summary\n slug\n method\n operationId\n path\n }\n }\n components {\n schemas {\n __typename\n }\n }\n }\n }\n":
35
38
  types.GetSidebarOperationsDocument,
36
39
  };
37
40
 
@@ -57,8 +60,14 @@ export function graphql(
57
60
  * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
58
61
  */
59
62
  export function graphql(
60
- source: "\n query OperationsForTag(\n $input: JSON!\n $type: SchemaType!\n $tag: String\n $untagged: Boolean\n ) {\n schema(input: $input, type: $type) {\n servers {\n url\n }\n description\n summary\n title\n url\n version\n tags(name: $tag) {\n name\n description\n }\n operations(tag: $tag, untagged: $untagged) {\n slug\n ...OperationsFragment\n }\n }\n }\n",
63
+ source: "\n query OperationsForTag(\n $input: JSON!\n $type: SchemaType!\n $tag: String\n $untagged: Boolean\n ) {\n schema(input: $input, type: $type) {\n servers {\n url\n }\n description\n summary\n title\n url\n version\n tag(slug: $tag, untagged: $untagged) {\n name\n description\n operations {\n slug\n ...OperationsFragment\n }\n next {\n name\n slug\n }\n prev {\n name\n slug\n }\n }\n }\n }\n",
61
64
  ): typeof import("./graphql.js").OperationsForTagDocument;
65
+ /**
66
+ * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
67
+ */
68
+ export function graphql(
69
+ source: "\n query GetSchemas($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n title\n description\n summary\n components {\n schemas {\n name\n schema\n extensions\n }\n }\n }\n }\n",
70
+ ): typeof import("./graphql.js").GetSchemasDocument;
62
71
  /**
63
72
  * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
64
73
  */
@@ -69,7 +78,7 @@ export function graphql(
69
78
  * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients.
70
79
  */
71
80
  export function graphql(
72
- source: "\n query GetSidebarOperations($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n tags {\n slug\n name\n extensions\n operations {\n summary\n slug\n method\n operationId\n path\n }\n }\n }\n }\n",
81
+ source: "\n query GetSidebarOperations($input: JSON!, $type: SchemaType!) {\n schema(input: $input, type: $type) {\n tags {\n slug\n name\n extensions\n operations {\n summary\n slug\n method\n operationId\n path\n }\n }\n components {\n schemas {\n __typename\n }\n }\n }\n }\n",
73
82
  ): typeof import("./graphql.js").GetSidebarOperationsDocument;
74
83
 
75
84
  export function graphql(source: string) {
@@ -35,6 +35,11 @@ export type Scalars = {
35
35
  JSONSchema: { input: any; output: any };
36
36
  };
37
37
 
38
+ export type Components = {
39
+ __typename?: "Components";
40
+ schemas?: Maybe<Array<SchemaItem>>;
41
+ };
42
+
38
43
  export type EncodingItem = {
39
44
  __typename?: "EncodingItem";
40
45
  allowReserved?: Maybe<Scalars["Boolean"]["output"]>;
@@ -132,6 +137,7 @@ export type ResponseItem = {
132
137
 
133
138
  export type Schema = {
134
139
  __typename?: "Schema";
140
+ components?: Maybe<Components>;
135
141
  description?: Maybe<Scalars["String"]["output"]>;
136
142
  extensions?: Maybe<Scalars["JSONObject"]["output"]>;
137
143
  openapi: Scalars["String"]["output"];
@@ -139,6 +145,7 @@ export type Schema = {
139
145
  paths: Array<PathItem>;
140
146
  servers: Array<Server>;
141
147
  summary?: Maybe<Scalars["String"]["output"]>;
148
+ tag?: Maybe<SchemaTag>;
142
149
  tags: Array<SchemaTag>;
143
150
  title: Scalars["String"]["output"];
144
151
  url?: Maybe<Scalars["String"]["output"]>;
@@ -153,16 +160,28 @@ export type SchemaOperationsArgs = {
153
160
  untagged?: InputMaybe<Scalars["Boolean"]["input"]>;
154
161
  };
155
162
 
156
- export type SchemaTagsArgs = {
163
+ export type SchemaTagArgs = {
157
164
  name?: InputMaybe<Scalars["String"]["input"]>;
165
+ slug?: InputMaybe<Scalars["String"]["input"]>;
166
+ untagged?: InputMaybe<Scalars["Boolean"]["input"]>;
167
+ };
168
+
169
+ export type SchemaItem = {
170
+ __typename?: "SchemaItem";
171
+ extensions?: Maybe<Scalars["JSONObject"]["output"]>;
172
+ name: Scalars["String"]["output"];
173
+ schema: Scalars["JSONSchema"]["output"];
158
174
  };
159
175
 
160
176
  export type SchemaTag = {
161
177
  __typename?: "SchemaTag";
162
178
  description?: Maybe<Scalars["String"]["output"]>;
163
179
  extensions?: Maybe<Scalars["JSONObject"]["output"]>;
180
+ isUntagged: Scalars["Boolean"]["output"];
164
181
  name?: Maybe<Scalars["String"]["output"]>;
182
+ next?: Maybe<SchemaTag>;
165
183
  operations: Array<OperationItem>;
184
+ prev?: Maybe<SchemaTag>;
166
185
  slug?: Maybe<Scalars["String"]["output"]>;
167
186
  };
168
187
 
@@ -292,18 +311,52 @@ export type OperationsForTagQuery = {
292
311
  url?: string | null;
293
312
  version: string;
294
313
  servers: Array<{ __typename?: "Server"; url: string }>;
295
- tags: Array<{
314
+ tag?: {
296
315
  __typename?: "SchemaTag";
297
316
  name?: string | null;
298
317
  description?: string | null;
299
- }>;
300
- operations: Array<
301
- { __typename?: "OperationItem"; slug: string } & {
302
- " $fragmentRefs"?: {
303
- OperationsFragmentFragment: OperationsFragmentFragment;
304
- };
305
- }
306
- >;
318
+ operations: Array<
319
+ { __typename?: "OperationItem"; slug: string } & {
320
+ " $fragmentRefs"?: {
321
+ OperationsFragmentFragment: OperationsFragmentFragment;
322
+ };
323
+ }
324
+ >;
325
+ next?: {
326
+ __typename?: "SchemaTag";
327
+ name?: string | null;
328
+ slug?: string | null;
329
+ } | null;
330
+ prev?: {
331
+ __typename?: "SchemaTag";
332
+ name?: string | null;
333
+ slug?: string | null;
334
+ } | null;
335
+ } | null;
336
+ };
337
+ };
338
+
339
+ export type GetSchemasQueryVariables = Exact<{
340
+ input: Scalars["JSON"]["input"];
341
+ type: SchemaType;
342
+ }>;
343
+
344
+ export type GetSchemasQuery = {
345
+ __typename?: "Query";
346
+ schema: {
347
+ __typename?: "Schema";
348
+ title: string;
349
+ description?: string | null;
350
+ summary?: string | null;
351
+ components?: {
352
+ __typename?: "Components";
353
+ schemas?: Array<{
354
+ __typename?: "SchemaItem";
355
+ name: string;
356
+ schema: any;
357
+ extensions?: any | null;
358
+ }> | null;
359
+ } | null;
307
360
  };
308
361
  };
309
362
 
@@ -344,6 +397,10 @@ export type GetSidebarOperationsQuery = {
344
397
  path: string;
345
398
  }>;
346
399
  }>;
400
+ components?: {
401
+ __typename?: "Components";
402
+ schemas?: Array<{ __typename: "SchemaItem" }> | null;
403
+ } | null;
347
404
  };
348
405
  };
349
406
 
@@ -468,13 +525,21 @@ export const OperationsForTagDocument = new TypedDocumentString(`
468
525
  title
469
526
  url
470
527
  version
471
- tags(name: $tag) {
528
+ tag(slug: $tag, untagged: $untagged) {
472
529
  name
473
530
  description
474
- }
475
- operations(tag: $tag, untagged: $untagged) {
476
- slug
477
- ...OperationsFragment
531
+ operations {
532
+ slug
533
+ ...OperationsFragment
534
+ }
535
+ next {
536
+ name
537
+ slug
538
+ }
539
+ prev {
540
+ name
541
+ slug
542
+ }
478
543
  }
479
544
  }
480
545
  }
@@ -545,6 +610,25 @@ export const OperationsForTagDocument = new TypedDocumentString(`
545
610
  OperationsForTagQuery,
546
611
  OperationsForTagQueryVariables
547
612
  >;
613
+ export const GetSchemasDocument = new TypedDocumentString(`
614
+ query GetSchemas($input: JSON!, $type: SchemaType!) {
615
+ schema(input: $input, type: $type) {
616
+ title
617
+ description
618
+ summary
619
+ components {
620
+ schemas {
621
+ name
622
+ schema
623
+ extensions
624
+ }
625
+ }
626
+ }
627
+ }
628
+ `) as unknown as TypedDocumentString<
629
+ GetSchemasQuery,
630
+ GetSchemasQueryVariables
631
+ >;
548
632
  export const GetServerQueryDocument = new TypedDocumentString(`
549
633
  query getServerQuery($input: JSON!, $type: SchemaType!) {
550
634
  schema(input: $input, type: $type) {
@@ -573,6 +657,11 @@ export const GetSidebarOperationsDocument = new TypedDocumentString(`
573
657
  path
574
658
  }
575
659
  }
660
+ components {
661
+ schemas {
662
+ __typename
663
+ }
664
+ }
576
665
  }
577
666
  }
578
667
  `) as unknown as TypedDocumentString<
@@ -29,6 +29,11 @@ const GetSidebarOperationsQuery = graphql(`
29
29
  path
30
30
  }
31
31
  }
32
+ components {
33
+ schemas {
34
+ __typename
35
+ }
36
+ }
32
37
  }
33
38
  }
34
39
  `);
@@ -168,6 +173,14 @@ export const openApiPlugin = (config: OasPluginConfig): ZudokuPlugin => {
168
173
  );
169
174
  }
170
175
 
176
+ if (data.schema.components?.schemas?.length) {
177
+ categories.push({
178
+ type: "link" as const,
179
+ label: "Schemas",
180
+ href: joinUrl(basePath, versionParam, "~schemas"),
181
+ });
182
+ }
183
+
171
184
  return categories;
172
185
  } catch {
173
186
  return [];
@@ -15,14 +15,12 @@ export const LogicalGroup = ({
15
15
  schemas,
16
16
  type,
17
17
  isOpen,
18
- level,
19
18
  toggleOpen,
20
19
  }: {
21
20
  schemas: SchemaObject[];
22
21
  type: LogicalGroupType;
23
22
  isOpen: boolean;
24
23
  toggleOpen: () => void;
25
- level: number;
26
24
  }) => (
27
25
  <Collapsible.Root open={isOpen} onOpenChange={toggleOpen} asChild>
28
26
  <Card className="px-6">
@@ -34,12 +32,7 @@ export const LogicalGroup = ({
34
32
  <Collapsible.Content className="pb-4">
35
33
  {schemas.map((subSchema, index) => (
36
34
  // eslint-disable-next-line react/no-array-index-key
37
- <LogicalGroupItem
38
- key={index}
39
- type={type}
40
- schema={subSchema}
41
- level={level}
42
- />
35
+ <LogicalGroupItem key={index} type={type} schema={subSchema} />
43
36
  ))}
44
37
  </Collapsible.Content>
45
38
  </Card>
@@ -24,10 +24,12 @@ export const LogicalGroupConnector = ({
24
24
  type,
25
25
  isOpen,
26
26
  className,
27
+ schemeName,
27
28
  }: {
28
29
  type: LogicalGroupType;
29
30
  isOpen: boolean;
30
31
  className?: string;
32
+ schemeName?: string;
31
33
  }) => {
32
34
  return (
33
35
  <div
@@ -48,6 +50,7 @@ export const LogicalGroupConnector = ({
48
50
  >
49
51
  <ChevronDownIcon size={16} />
50
52
  </div>
53
+ <span className="text-sm text-foreground">{schemeName}</span>
51
54
  </div>
52
55
  </div>
53
56
  );
@@ -8,7 +8,6 @@ import { LogicalGroupConnector } from "./LogicalGroupConnector.js";
8
8
  export const LogicalGroupItem = (props: {
9
9
  type: LogicalGroupType;
10
10
  schema: SchemaObject;
11
- level: number;
12
11
  }) => {
13
12
  const [isOpen, setIsOpen] = useState(true);
14
13
 
@@ -19,11 +18,15 @@ export const LogicalGroupItem = (props: {
19
18
  className="group"
20
19
  >
21
20
  <Collapsible.Trigger>
22
- <LogicalGroupConnector type={props.type} isOpen={isOpen} />
21
+ <LogicalGroupConnector
22
+ type={props.type}
23
+ isOpen={isOpen}
24
+ schemeName={props.schema.title}
25
+ />
23
26
  </Collapsible.Trigger>
24
27
  {!isOpen && <div className="wavy-line bg-border translate-y-1" />}
25
28
  <Collapsible.Content>
26
- <SchemaView schema={props.schema} level={props.level + 1} />
29
+ <SchemaView schema={props.schema} />
27
30
  </Collapsible.Content>
28
31
  </Collapsible.Root>
29
32
  );
@@ -0,0 +1,36 @@
1
+ import type { SchemaObject } from "../../../oas/parser/index.js";
2
+ import { SelectOnClick } from "../components/SelectOnClick.js";
3
+
4
+ export const SchemaExampleAndDefault = ({
5
+ schema,
6
+ }: {
7
+ schema: SchemaObject;
8
+ }) => {
9
+ const example = schema.examples?.at(0);
10
+ const defaultValue = schema.default;
11
+
12
+ if (!example && !defaultValue) return null;
13
+
14
+ return (
15
+ <div className="flex flex-col gap-1 text-xs">
16
+ {example && (
17
+ <div>
18
+ <span className="text-muted-foreground">Example: </span>
19
+ <SelectOnClick className="border rounded px-1 font-mono">
20
+ {typeof example === "object" ? JSON.stringify(example) : example}
21
+ </SelectOnClick>
22
+ </div>
23
+ )}
24
+ {defaultValue && (
25
+ <div>
26
+ <span className="text-muted-foreground">Default: </span>
27
+ <SelectOnClick className="border rounded px-1 font-mono">
28
+ {typeof defaultValue === "object"
29
+ ? JSON.stringify(defaultValue)
30
+ : defaultValue}
31
+ </SelectOnClick>
32
+ </div>
33
+ )}
34
+ </div>
35
+ );
36
+ };