zudoku 0.0.0-zc17c4c22 → 0.0.0-zd57c18df

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 (232) hide show
  1. package/dist/app/main.js +1 -1
  2. package/dist/app/main.js.map +1 -1
  3. package/dist/config/create-plugin.d.ts +2 -0
  4. package/dist/config/create-plugin.js +55 -0
  5. package/dist/config/create-plugin.js.map +1 -0
  6. package/dist/config/loader.js +2 -2
  7. package/dist/config/loader.js.map +1 -1
  8. package/dist/config/validators/InputNavigationSchema.d.ts +118 -68
  9. package/dist/config/validators/InputNavigationSchema.js +17 -0
  10. package/dist/config/validators/InputNavigationSchema.js.map +1 -1
  11. package/dist/config/validators/NavigationSchema.d.ts +10 -2
  12. package/dist/config/validators/NavigationSchema.js +7 -0
  13. package/dist/config/validators/NavigationSchema.js.map +1 -1
  14. package/dist/config/validators/validate.d.ts +5 -4
  15. package/dist/config/validators/validate.js +2 -0
  16. package/dist/config/validators/validate.js.map +1 -1
  17. package/dist/flat-config.d.ts +12 -0
  18. package/dist/index.d.ts +2 -1
  19. package/dist/index.js +1 -0
  20. package/dist/index.js.map +1 -1
  21. package/dist/lib/components/Bootstrap.js +1 -2
  22. package/dist/lib/components/Bootstrap.js.map +1 -1
  23. package/dist/lib/components/MobileTopNavigation.js +2 -1
  24. package/dist/lib/components/MobileTopNavigation.js.map +1 -1
  25. package/dist/lib/components/Slot.test.js +1 -1
  26. package/dist/lib/components/Slot.test.js.map +1 -1
  27. package/dist/lib/components/TopNavigation.d.ts +7 -1
  28. package/dist/lib/components/TopNavigation.js +7 -2
  29. package/dist/lib/components/TopNavigation.js.map +1 -1
  30. package/dist/lib/components/Zudoku.d.ts +4 -1
  31. package/dist/lib/components/Zudoku.js +4 -7
  32. package/dist/lib/components/Zudoku.js.map +1 -1
  33. package/dist/lib/components/context/ZudokuContext.d.ts +9 -4
  34. package/dist/lib/components/context/ZudokuContext.js +4 -2
  35. package/dist/lib/components/context/ZudokuContext.js.map +1 -1
  36. package/dist/lib/components/context/ZudokuProvider.js +1 -1
  37. package/dist/lib/components/context/ZudokuProvider.js.map +1 -1
  38. package/dist/lib/components/context/ZudokuReactContext.d.ts +11 -0
  39. package/dist/lib/components/context/ZudokuReactContext.js +4 -0
  40. package/dist/lib/components/context/ZudokuReactContext.js.map +1 -0
  41. package/dist/lib/components/navigation/Navigation.js +4 -3
  42. package/dist/lib/components/navigation/Navigation.js.map +1 -1
  43. package/dist/lib/components/navigation/NavigationCategory.js +8 -0
  44. package/dist/lib/components/navigation/NavigationCategory.js.map +1 -1
  45. package/dist/lib/components/navigation/NavigationFilterContext.d.ts +8 -0
  46. package/dist/lib/components/navigation/NavigationFilterContext.js +12 -0
  47. package/dist/lib/components/navigation/NavigationFilterContext.js.map +1 -0
  48. package/dist/lib/components/navigation/NavigationFilterInput.d.ts +3 -0
  49. package/dist/lib/components/navigation/NavigationFilterInput.js +9 -0
  50. package/dist/lib/components/navigation/NavigationFilterInput.js.map +1 -0
  51. package/dist/lib/components/navigation/NavigationItem.js +11 -1
  52. package/dist/lib/components/navigation/NavigationItem.js.map +1 -1
  53. package/dist/lib/components/navigation/utils.d.ts +2 -1
  54. package/dist/lib/components/navigation/utils.js +22 -1
  55. package/dist/lib/components/navigation/utils.js.map +1 -1
  56. package/dist/lib/core/ZudokuContext.d.ts +2 -1
  57. package/dist/lib/core/ZudokuContext.js +3 -1
  58. package/dist/lib/core/ZudokuContext.js.map +1 -1
  59. package/dist/lib/core/__internal.d.ts +1 -0
  60. package/dist/lib/core/__internal.js +2 -0
  61. package/dist/lib/core/__internal.js.map +1 -1
  62. package/dist/lib/core/plugins.d.ts +5 -1
  63. package/dist/lib/core/plugins.js.map +1 -1
  64. package/dist/lib/core/transform-config.d.ts +4 -2
  65. package/dist/lib/core/transform-config.js +33 -13
  66. package/dist/lib/core/transform-config.js.map +1 -1
  67. package/dist/lib/core/transform-config.test.d.ts +1 -0
  68. package/dist/lib/core/transform-config.test.js +83 -0
  69. package/dist/lib/core/transform-config.test.js.map +1 -0
  70. package/dist/lib/errors/ErrorAlert.js +1 -2
  71. package/dist/lib/errors/ErrorAlert.js.map +1 -1
  72. package/dist/lib/hooks/useEvent.test.js +1 -1
  73. package/dist/lib/hooks/useEvent.test.js.map +1 -1
  74. package/dist/lib/plugins/openapi/playground/fileUtils.d.ts +1 -0
  75. package/dist/lib/plugins/openapi/playground/fileUtils.js +3 -0
  76. package/dist/lib/plugins/openapi/playground/fileUtils.js.map +1 -1
  77. package/dist/lib/plugins/openapi/playground/result-panel/AudioPlayer.d.ts +6 -0
  78. package/dist/lib/plugins/openapi/playground/result-panel/AudioPlayer.js +20 -0
  79. package/dist/lib/plugins/openapi/playground/result-panel/AudioPlayer.js.map +1 -0
  80. package/dist/lib/plugins/openapi/playground/result-panel/ResponseTab.js +7 -2
  81. package/dist/lib/plugins/openapi/playground/result-panel/ResponseTab.js.map +1 -1
  82. package/dist/lib/ui/Alert.d.ts +3 -2
  83. package/dist/lib/ui/Alert.js +9 -5
  84. package/dist/lib/ui/Alert.js.map +1 -1
  85. package/dist/lib/ui/InputGroup.d.ts +16 -0
  86. package/dist/lib/ui/InputGroup.js +65 -0
  87. package/dist/lib/ui/InputGroup.js.map +1 -0
  88. package/dist/lib/ui/Secret.js +2 -2
  89. package/dist/lib/ui/Secret.js.map +1 -1
  90. package/dist/vite/config.js +5 -2
  91. package/dist/vite/config.js.map +1 -1
  92. package/dist/vite/plugin-config.js +16 -4
  93. package/dist/vite/plugin-config.js.map +1 -1
  94. package/dist/vite/plugin-theme.js +2 -1
  95. package/dist/vite/plugin-theme.js.map +1 -1
  96. package/dist/vite/prerender/prerender.js +3 -1
  97. package/dist/vite/prerender/prerender.js.map +1 -1
  98. package/dist/vite/prerender/worker.js +3 -1
  99. package/dist/vite/prerender/worker.js.map +1 -1
  100. package/lib/{ClaudeLogo-C6q-Xn_l.js → ClaudeLogo-Br8C_vTq.js} +3 -3
  101. package/lib/{ClaudeLogo-C6q-Xn_l.js.map → ClaudeLogo-Br8C_vTq.js.map} +1 -1
  102. package/lib/{HydrationBoundary-CNF2ZV3E.js → HydrationBoundary-CJu4vUlG.js} +6 -6
  103. package/lib/{HydrationBoundary-CNF2ZV3E.js.map → HydrationBoundary-CJu4vUlG.js.map} +1 -1
  104. package/lib/{MdxPage-B1G4W1TK.js → MdxPage-C0QFAsgv.js} +6 -6
  105. package/lib/{MdxPage-B1G4W1TK.js.map → MdxPage-C0QFAsgv.js.map} +1 -1
  106. package/lib/Mermaid-Chx5BPHn.js +104 -0
  107. package/lib/Mermaid-Chx5BPHn.js.map +1 -0
  108. package/lib/{OAuthErrorPage-01Ke086W.js → OAuthErrorPage-CFz_gBFx.js} +11 -10
  109. package/lib/{OAuthErrorPage-01Ke086W.js.map → OAuthErrorPage-CFz_gBFx.js.map} +1 -1
  110. package/lib/{OasProvider-oHPiMJZg.js → OasProvider-BQ60YgAd.js} +3 -3
  111. package/lib/{OasProvider-oHPiMJZg.js.map → OasProvider-BQ60YgAd.js.map} +1 -1
  112. package/lib/{OperationList-CZ4OK8Pm.js → OperationList-D31urxqy.js} +40 -39
  113. package/lib/{OperationList-CZ4OK8Pm.js.map → OperationList-D31urxqy.js.map} +1 -1
  114. package/lib/{RouteGuard-B1lCR0C_.js → RouteGuard-CVs3yvEs.js} +3 -3
  115. package/lib/{RouteGuard-B1lCR0C_.js.map → RouteGuard-CVs3yvEs.js.map} +1 -1
  116. package/lib/{SchemaList-DoQFkJgM.js → SchemaList-CSVFH585.js} +7 -7
  117. package/lib/{SchemaList-DoQFkJgM.js.map → SchemaList-CSVFH585.js.map} +1 -1
  118. package/lib/{SchemaView-D2k6ZJck.js → SchemaView-D4marpgk.js} +3 -3
  119. package/lib/{SchemaView-D2k6ZJck.js.map → SchemaView-D4marpgk.js.map} +1 -1
  120. package/lib/{Secret-BDBqq4p3.js → Secret-DUpgv4V3.js} +92 -72
  121. package/lib/Secret-DUpgv4V3.js.map +1 -0
  122. package/lib/{SignUp-8kDBaLbO.js → SignUp-Dug1jAGC.js} +4 -4
  123. package/lib/{SignUp-8kDBaLbO.js.map → SignUp-Dug1jAGC.js.map} +1 -1
  124. package/lib/{SyntaxHighlight-hZOFnYl0.js → SyntaxHighlight-BMu0b_hF.js} +8 -8
  125. package/lib/{SyntaxHighlight-hZOFnYl0.js.map → SyntaxHighlight-BMu0b_hF.js.map} +1 -1
  126. package/lib/{Toc-qEIii_-W.js → Toc-BiJ2YL0O.js} +2 -2
  127. package/lib/{Toc-qEIii_-W.js.map → Toc-BiJ2YL0O.js.map} +1 -1
  128. package/lib/{Zudoku-DUsdmPME.js → Zudoku-iyiXgWFY.js} +2777 -2622
  129. package/lib/Zudoku-iyiXgWFY.js.map +1 -0
  130. package/lib/ZudokuContext-CYyb_PB_.js +175 -0
  131. package/lib/ZudokuContext-CYyb_PB_.js.map +1 -0
  132. package/lib/ZudokuReactContext-DGJAP1sN.js +222 -0
  133. package/lib/ZudokuReactContext-DGJAP1sN.js.map +1 -0
  134. package/lib/{circular-D9tSKG2c.js → circular-cPOX8BVJ.js} +2 -2
  135. package/lib/{circular-D9tSKG2c.js.map → circular-cPOX8BVJ.js.map} +1 -1
  136. package/lib/{createServer-BprC4n85.js → createServer-SJT25uZH.js} +4 -4
  137. package/lib/{createServer-BprC4n85.js.map → createServer-SJT25uZH.js.map} +1 -1
  138. package/lib/{errors-7hgPDs1h.js → errors-B77S9iOc.js} +2 -2
  139. package/lib/{errors-7hgPDs1h.js.map → errors-B77S9iOc.js.map} +1 -1
  140. package/lib/{firebase-Dwn-2ju-.js → firebase-C7XKRGLf.js} +25 -24
  141. package/lib/{firebase-Dwn-2ju-.js.map → firebase-C7XKRGLf.js.map} +1 -1
  142. package/lib/{hook-ZEd1Es7D.js → hook-Dz_n9SoE.js} +16 -15
  143. package/lib/{hook-ZEd1Es7D.js.map → hook-Dz_n9SoE.js.map} +1 -1
  144. package/lib/{index-Dxdhrp-I.js → index-BDp2MTiq.js} +2 -2
  145. package/lib/{index-Dxdhrp-I.js.map → index-BDp2MTiq.js.map} +1 -1
  146. package/lib/{index-CyIW9rHv.js → index-Bc2mE-53.js} +642 -606
  147. package/lib/index-Bc2mE-53.js.map +1 -0
  148. package/lib/{index.esm-DG4KaDKR.js → index.esm-Cth49JBv.js} +2 -2
  149. package/lib/index.esm-Cth49JBv.js.map +1 -0
  150. package/lib/{mutation-BISOc7OM.js → mutation-B7eFBLZY.js} +2 -2
  151. package/lib/{mutation-BISOc7OM.js.map → mutation-B7eFBLZY.js.map} +1 -1
  152. package/lib/ui/Alert.js +32 -20
  153. package/lib/ui/Alert.js.map +1 -1
  154. package/lib/ui/InputGroup.js +155 -0
  155. package/lib/ui/InputGroup.js.map +1 -0
  156. package/lib/ui/Secret.js +2 -2
  157. package/lib/ui/Secret.js.map +1 -1
  158. package/lib/ui/SyntaxHighlight.js +2 -2
  159. package/lib/{useMutation-CFMGlAMW.js → useMutation-CErliDZ9.js} +5 -5
  160. package/lib/{useMutation-CFMGlAMW.js.map → useMutation-CErliDZ9.js.map} +1 -1
  161. package/lib/{useSuspenseQuery-CSB_rVek.js → useQuery-ht7aWJ3S.js} +432 -446
  162. package/lib/useQuery-ht7aWJ3S.js.map +1 -0
  163. package/lib/useSuspenseQuery-DQH4Bmc2.js +18 -0
  164. package/lib/useSuspenseQuery-DQH4Bmc2.js.map +1 -0
  165. package/lib/zudoku.__internal.js +524 -500
  166. package/lib/zudoku.__internal.js.map +1 -1
  167. package/lib/zudoku.auth-auth0.js +6 -5
  168. package/lib/zudoku.auth-auth0.js.map +1 -1
  169. package/lib/zudoku.auth-azureb2c.js +14 -13
  170. package/lib/zudoku.auth-azureb2c.js.map +1 -1
  171. package/lib/zudoku.auth-clerk.js +2 -2
  172. package/lib/zudoku.auth-firebase.js +4 -4
  173. package/lib/zudoku.auth-openid.js +7 -6
  174. package/lib/zudoku.auth-openid.js.map +1 -1
  175. package/lib/zudoku.auth-supabase.js +4 -4
  176. package/lib/zudoku.components.js +3 -3
  177. package/lib/zudoku.hooks.js +3 -3
  178. package/lib/zudoku.mermaid.js +3 -3
  179. package/lib/zudoku.plugin-api-catalog.js +28 -27
  180. package/lib/zudoku.plugin-api-catalog.js.map +1 -1
  181. package/lib/zudoku.plugin-api-keys.js +98 -96
  182. package/lib/zudoku.plugin-api-keys.js.map +1 -1
  183. package/lib/zudoku.plugin-custom-pages.js +1 -1
  184. package/lib/zudoku.plugin-markdown.js +1 -1
  185. package/lib/zudoku.plugin-openapi.js +2 -2
  186. package/lib/zudoku.plugin-search-pagefind.js +19 -18
  187. package/lib/zudoku.plugin-search-pagefind.js.map +1 -1
  188. package/lib/zudoku.plugins.js.map +1 -1
  189. package/lib/zudoku.react-query.js +26 -25
  190. package/lib/zudoku.react-query.js.map +1 -1
  191. package/package.json +9 -3
  192. package/src/app/defaultTheme.css +4 -0
  193. package/src/app/main.css +2 -0
  194. package/src/app/main.tsx +1 -1
  195. package/src/lib/components/Bootstrap.tsx +1 -4
  196. package/src/lib/components/MobileTopNavigation.tsx +13 -8
  197. package/src/lib/components/Slot.test.tsx +1 -1
  198. package/src/lib/components/TopNavigation.tsx +25 -7
  199. package/src/lib/components/Zudoku.tsx +18 -14
  200. package/src/lib/components/context/ZudokuContext.ts +3 -6
  201. package/src/lib/components/context/ZudokuProvider.tsx +1 -1
  202. package/src/lib/components/context/ZudokuReactContext.tsx +17 -0
  203. package/src/lib/components/navigation/Navigation.tsx +4 -3
  204. package/src/lib/components/navigation/NavigationCategory.tsx +9 -0
  205. package/src/lib/components/navigation/NavigationFilterContext.tsx +28 -0
  206. package/src/lib/components/navigation/NavigationFilterInput.tsx +35 -0
  207. package/src/lib/components/navigation/NavigationItem.tsx +17 -1
  208. package/src/lib/components/navigation/utils.ts +32 -1
  209. package/src/lib/core/ZudokuContext.ts +7 -1
  210. package/src/lib/core/__internal.tsx +2 -0
  211. package/src/lib/core/plugins.ts +7 -3
  212. package/src/lib/core/transform-config.test.tsx +99 -0
  213. package/src/lib/core/transform-config.ts +57 -19
  214. package/src/lib/errors/ErrorAlert.tsx +1 -6
  215. package/src/lib/hooks/useEvent.test.tsx +1 -1
  216. package/src/lib/plugins/openapi/playground/fileUtils.ts +4 -0
  217. package/src/lib/plugins/openapi/playground/result-panel/AudioPlayer.tsx +50 -0
  218. package/src/lib/plugins/openapi/playground/result-panel/ResponseTab.tsx +33 -17
  219. package/src/lib/ui/Alert.tsx +17 -5
  220. package/src/lib/ui/InputGroup.tsx +168 -0
  221. package/src/lib/ui/Secret.tsx +2 -2
  222. package/lib/Mermaid-B1xNo-pf.js +0 -103
  223. package/lib/Mermaid-B1xNo-pf.js.map +0 -1
  224. package/lib/Secret-BDBqq4p3.js.map +0 -1
  225. package/lib/Separator-BXt1LYnm.js +0 -27
  226. package/lib/Separator-BXt1LYnm.js.map +0 -1
  227. package/lib/Zudoku-DUsdmPME.js.map +0 -1
  228. package/lib/ZudokuContext-BBI06sOx.js +0 -387
  229. package/lib/ZudokuContext-BBI06sOx.js.map +0 -1
  230. package/lib/index-CyIW9rHv.js.map +0 -1
  231. package/lib/index.esm-DG4KaDKR.js.map +0 -1
  232. package/lib/useSuspenseQuery-CSB_rVek.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"MdxPage-B1G4W1TK.js","sources":["../src/lib/plugins/markdown/MdxPage.tsx"],"sourcesContent":["import { useMDXComponents } from \"@mdx-js/react\";\nimport slugify from \"@sindresorhus/slugify\";\nimport { Helmet } from \"@zudoku/react-helmet-async\";\nimport {\n CheckIcon,\n ChevronDownIcon,\n CopyIcon,\n EditIcon,\n ExternalLinkIcon,\n Link2Icon,\n} from \"lucide-react\";\nimport { type PropsWithChildren, useEffect, useState } from \"react\";\nimport { useLocation } from \"react-router\";\nimport { Button } from \"zudoku/ui/Button.js\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"zudoku/ui/DropdownMenu.js\";\nimport { CategoryHeading } from \"../../components/CategoryHeading.js\";\nimport { Heading } from \"../../components/Heading.js\";\nimport { Toc } from \"../../components/navigation/Toc.js\";\nimport {\n useCurrentItem,\n usePrevNext,\n} from \"../../components/navigation/utils.js\";\nimport { Pagination } from \"../../components/Pagination.js\";\nimport { Typography } from \"../../components/Typography.js\";\nimport { joinUrl } from \"../../util/joinUrl.js\";\nimport type { MdxComponentsType } from \"../../util/MdxComponents.js\";\nimport { ChatGPTLogo } from \"./assets/ChatGPTLogo.js\";\nimport { ClaudeLogo } from \"./assets/ClaudeLogo.js\";\nimport type { MarkdownPluginDefaultOptions, MDXImport } from \"./index.js\";\n\ndeclare global {\n interface Window {\n __getReactRefreshIgnoredExports?: (args: {\n id: string;\n }) => string[] | undefined;\n }\n}\n\nconst MarkdownHeadings = {\n h2: ({ children, id }) => (\n <Heading level={2} id={id} registerNavigationAnchor>\n {children}\n </Heading>\n ),\n h3: ({ children, id }) => (\n <Heading level={3} id={id} registerNavigationAnchor>\n {children}\n </Heading>\n ),\n} satisfies MdxComponentsType;\n\nexport const MdxPage = ({\n mdxComponent: MdxComponent,\n basePath,\n frontmatter = {},\n defaultOptions,\n __filepath,\n tableOfContents,\n excerpt,\n}: PropsWithChildren<\n Omit<MDXImport, \"default\"> & {\n basePath: string;\n mdxComponent: MDXImport[\"default\"];\n defaultOptions?: MarkdownPluginDefaultOptions;\n }\n>) => {\n const categoryTitle = useCurrentItem()?.categoryLabel;\n const location = useLocation();\n const [isCopied, setIsCopied] = useState(false);\n\n const title = frontmatter.title;\n const description = frontmatter.description ?? excerpt;\n const category = frontmatter.category ?? categoryTitle;\n const hideToc = frontmatter.toc === false || defaultOptions?.toc === false;\n const pageTitle =\n title ?? tableOfContents.find((item) => item.depth === 1)?.value;\n const hidePager =\n frontmatter.disable_pager ??\n frontmatter.disablePager ??\n defaultOptions?.disablePager ??\n false;\n\n const showLastModified =\n frontmatter.showLastModified ?? defaultOptions?.showLastModified ?? true;\n\n const lastModifiedDate = frontmatter.lastModifiedTime\n ? new Date(frontmatter.lastModifiedTime)\n : null;\n\n const editConfig =\n frontmatter.suggestEdit !== false &&\n (frontmatter.suggestEdit ?? defaultOptions?.suggestEdit);\n\n const editUrl = editConfig\n ? editConfig.url.replaceAll(\"{filePath}\", __filepath)\n : null;\n const editText = editConfig ? editConfig.text || \"Edit this page\" : null;\n\n const copyMarkdownConfig =\n frontmatter.copyPage !== false && defaultOptions?.copyPage !== false;\n\n const markdownUrl = joinUrl(basePath, `${location.pathname}.md`);\n\n const handleCopyMarkdown = async () => {\n const response = await fetch(markdownUrl);\n if (!response.ok) throw new Error(\"Failed to fetch markdown\");\n const markdown = await response.text();\n void navigator.clipboard.writeText(markdown);\n setIsCopied(true);\n setTimeout(() => setIsCopied(false), 2000);\n };\n\n const tocEntries =\n tableOfContents.find((item) => item.depth === 1)?.children ??\n // if `title` is provided by frontmatter it does not appear in the table of contents\n tableOfContents.filter((item) => item.depth === 2);\n\n const showToc = !hideToc && tocEntries.length > 0;\n\n const { prev, next } = usePrevNext();\n\n useEffect(() => {\n if (process.env.NODE_ENV === \"development\") {\n window.__getReactRefreshIgnoredExports = ({ id }) => {\n if (!id.endsWith(__filepath)) return;\n\n return [\"frontmatter\", \"tableOfContents\"];\n };\n\n return () => {\n window.__getReactRefreshIgnoredExports = undefined;\n };\n }\n }, [__filepath]);\n\n return (\n <div\n className=\"grid grid-cols-1 xl:grid-cols-(--sidecar-grid-cols) gap-8 justify-between\"\n data-pagefind-filter=\"section:markdown\"\n data-pagefind-meta=\"section:markdown\"\n >\n <Helmet>\n <title>{pageTitle}</title>\n {description && <meta name=\"description\" content={description} />}\n </Helmet>\n <Typography className=\"max-w-full xl:w-full xl:max-w-3xl flex-1 shrink pt-(--padding-content-top)\">\n {(category || title) && (\n <header className=\"flex items-start justify-between gap-4\">\n <div className=\"flex-1\">\n {category && <CategoryHeading>{category}</CategoryHeading>}\n {title && (\n <Heading level={1} id={slugify(title)}>\n {title}\n </Heading>\n )}\n </div>\n {copyMarkdownConfig && (\n <div className=\"flex items-center border rounded-md\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleCopyMarkdown}\n className=\"rounded-r-none border-r gap-2 h-7\"\n >\n {isCopied ? (\n <CheckIcon size={14} className=\"text-emerald-600\" />\n ) : (\n <CopyIcon size={14} />\n )}\n <span>Copy page</span>\n </Button>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon-xs\"\n className=\"rounded-l-none\"\n >\n <ChevronDownIcon size={14} />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem\n className=\"gap-2\"\n onClick={() =>\n void navigator.clipboard.writeText(window.location.href)\n }\n >\n <Link2Icon className=\"size-4\" />\n Copy link to page\n </DropdownMenuItem>\n <DropdownMenuItem className=\"gap-2\" asChild>\n <a\n href={markdownUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <ExternalLinkIcon className=\"size-4\" />\n Open Markdown page\n </a>\n </DropdownMenuItem>\n <DropdownMenuItem\n className=\"gap-2\"\n onClick={() => {\n const prompt = encodeURIComponent(\n `Help me understand this documentation page: ${window.location.href}`,\n );\n window.open(\n `https://claude.ai/new?q=${prompt}`,\n \"_blank\",\n );\n }}\n >\n <ClaudeLogo className=\"size-4\" />\n Open in Claude\n </DropdownMenuItem>\n <DropdownMenuItem\n className=\"gap-2\"\n onClick={() => {\n const prompt = encodeURIComponent(\n `Help me understand this documentation page: ${window.location.href}`,\n );\n window.open(\n `https://chatgpt.com/?q=${prompt}`,\n \"_blank\",\n );\n }}\n >\n <ChatGPTLogo className=\"size-4\" />\n Open in ChatGPT\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n )}\n </header>\n )}\n\n <MdxComponent\n components={{ ...useMDXComponents(), ...MarkdownHeadings }}\n />\n <div className=\"h-16\" />\n {(showLastModified && lastModifiedDate) || editUrl ? (\n <div className=\"flex justify-between text-xs text-muted-foreground \">\n <div />\n <div className=\"flex items-center gap-2\">\n <div>\n {editUrl && (\n <Button asChild variant=\"ghost\" size=\"sm\">\n <a\n href={editUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1\"\n >\n <EditIcon size={12} />\n {editText}\n </a>\n </Button>\n )}\n </div>\n <div>\n {showLastModified && lastModifiedDate && (\n <div\n title={lastModifiedDate.toLocaleString(undefined, {\n dateStyle: \"full\",\n timeStyle: \"medium\",\n })}\n >\n Last modified on{\" \"}\n <time dateTime={lastModifiedDate.toISOString()}>\n {lastModifiedDate.toLocaleDateString(\"en-US\", {\n dateStyle: \"long\",\n })}\n </time>\n </div>\n )}\n </div>\n </div>\n </div>\n ) : null}\n {!hidePager && (\n <>\n <div className=\"h-px bg-border mt-2 mb-6\" />\n <Pagination\n prev={prev ? { to: prev.id, label: prev.label ?? \"\" } : undefined}\n next={next ? { to: next.id, label: next.label ?? \"\" } : undefined}\n className=\"mb-10\"\n />\n </>\n )}\n </Typography>\n <div className=\"hidden xl:block\" data-pagefind-ignore=\"all\">\n {showToc && <Toc entries={tocEntries} />}\n </div>\n </div>\n );\n};\n"],"names":["MarkdownHeadings","children","id","jsx","Heading","MdxPage","MdxComponent","basePath","frontmatter","defaultOptions","__filepath","tableOfContents","excerpt","categoryTitle","useCurrentItem","location","useLocation","isCopied","setIsCopied","useState","title","description","category","hideToc","pageTitle","item","hidePager","showLastModified","lastModifiedDate","editConfig","editUrl","editText","copyMarkdownConfig","markdownUrl","joinUrl","handleCopyMarkdown","response","markdown","tocEntries","showToc","prev","next","usePrevNext","useEffect","jsxs","Helmet","Typography","CategoryHeading","slugify","Button","CheckIcon","CopyIcon","DropdownMenu","DropdownMenuTrigger","ChevronDownIcon","DropdownMenuContent","DropdownMenuItem","Link2Icon","ExternalLinkIcon","prompt","ClaudeLogo","ChatGPTLogo","useMDXComponents","EditIcon","Fragment","Pagination","Toc"],"mappings":";;;;;;;;;;;;;;AA2CA,MAAMA,KAAmB;AAAA,EACvB,IAAI,CAAC,EAAE,UAAAC,GAAU,IAAAC,EAAA,MACfC,gBAAAA,EAAAA,IAACC,GAAA,EAAQ,OAAO,GAAG,IAAAF,GAAQ,0BAAwB,IAChD,UAAAD,EAAA,CACH;AAAA,EAEF,IAAI,CAAC,EAAE,UAAAA,GAAU,IAAAC,EAAA,MACfC,gBAAAA,EAAAA,IAACC,GAAA,EAAQ,OAAO,GAAG,IAAAF,GAAQ,0BAAwB,IAChD,UAAAD,EAAA,CACH;AAEJ,GAEaI,KAAU,CAAC;AAAA,EACtB,cAAcC;AAAA,EACd,UAAAC;AAAA,EACA,aAAAC,IAAc,CAAA;AAAA,EACd,gBAAAC;AAAA,EACA,YAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,SAAAC;AACF,MAMM;AACJ,QAAMC,IAAgBC,KAAkB,eAClCC,IAAWC,EAAA,GACX,CAACC,GAAUC,CAAW,IAAIC,EAAS,EAAK,GAExCC,IAAQZ,EAAY,OACpBa,IAAcb,EAAY,eAAeI,GACzCU,IAAWd,EAAY,YAAYK,GACnCU,IAAUf,EAAY,QAAQ,MAASC,GAAgB,QAAQ,IAC/De,IACJJ,KAAST,EAAgB,KAAK,CAACc,MAASA,EAAK,UAAU,CAAC,GAAG,OACvDC,IACJlB,EAAY,iBACZA,EAAY,gBACZC,GAAgB,gBAChB,IAEIkB,IACJnB,EAAY,oBAAoBC,GAAgB,oBAAoB,IAEhEmB,IAAmBpB,EAAY,mBACjC,IAAI,KAAKA,EAAY,gBAAgB,IACrC,MAEEqB,IACJrB,EAAY,gBAAgB,OAC3BA,EAAY,eAAeC,GAAgB,cAExCqB,IAAUD,IACZA,EAAW,IAAI,WAAW,cAAcnB,CAAU,IAClD,MACEqB,IAAWF,IAAaA,EAAW,QAAQ,mBAAmB,MAE9DG,IACJxB,EAAY,aAAa,MAASC,GAAgB,aAAa,IAE3DwB,IAAcC,EAAQ3B,GAAU,GAAGQ,EAAS,QAAQ,KAAK,GAEzDoB,IAAqB,YAAY;AACrC,UAAMC,IAAW,MAAM,MAAMH,CAAW;AACxC,QAAI,CAACG,EAAS,GAAI,OAAM,IAAI,MAAM,0BAA0B;AAC5D,UAAMC,IAAW,MAAMD,EAAS,KAAA;AAChC,IAAK,UAAU,UAAU,UAAUC,CAAQ,GAC3CnB,EAAY,EAAI,GAChB,WAAW,MAAMA,EAAY,EAAK,GAAG,GAAI;AAAA,EAC3C,GAEMoB,IACJ3B,EAAgB,KAAK,CAACc,MAASA,EAAK,UAAU,CAAC,GAAG;AAAA,EAElDd,EAAgB,OAAO,CAACc,MAASA,EAAK,UAAU,CAAC,GAE7Cc,IAAU,CAAChB,KAAWe,EAAW,SAAS,GAE1C,EAAE,MAAAE,GAAM,MAAAC,EAAA,IAASC,GAAA;AAEvB,SAAAC,EAAU,MAAM;AACd,QAAI,QAAQ,IAAI,aAAa;AAC3B,oBAAO,kCAAkC,CAAC,EAAE,IAAAzC,QAAS;AACnD,YAAKA,EAAG,SAASQ,CAAU;AAE3B,iBAAO,CAAC,eAAe,iBAAiB;AAAA,MAC1C,GAEO,MAAM;AACX,eAAO,kCAAkC;AAAA,MAC3C;AAAA,EAEJ,GAAG,CAACA,CAAU,CAAC,GAGbkC,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,wBAAqB;AAAA,MACrB,sBAAmB;AAAA,MAEnB,UAAA;AAAA,QAAAA,gBAAAA,OAACC,GAAA,EACC,UAAA;AAAA,UAAA1C,gBAAAA,EAAAA,IAAC,WAAO,UAAAqB,EAAA,CAAU;AAAA,UACjBH,KAAelB,gBAAAA,EAAAA,IAAC,QAAA,EAAK,MAAK,eAAc,SAASkB,EAAA,CAAa;AAAA,QAAA,GACjE;AAAA,QACAuB,gBAAAA,EAAAA,KAACE,GAAA,EAAW,WAAU,8EAClB,UAAA;AAAA,WAAAxB,KAAYF,MACZwB,gBAAAA,EAAAA,KAAC,UAAA,EAAO,WAAU,0CAChB,UAAA;AAAA,YAAAA,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,UACZ,UAAA;AAAA,cAAAtB,KAAYnB,gBAAAA,EAAAA,IAAC4C,KAAiB,UAAAzB,EAAA,CAAS;AAAA,cACvCF,2BACEhB,GAAA,EAAQ,OAAO,GAAG,IAAI4C,EAAQ5B,CAAK,GACjC,UAAAA,EAAA,CACH;AAAA,YAAA,GAEJ;AAAA,YACCY,KACCY,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,uCACb,UAAA;AAAA,cAAAA,gBAAAA,EAAAA;AAAAA,gBAACK;AAAA,gBAAA;AAAA,kBACC,SAAQ;AAAA,kBACR,MAAK;AAAA,kBACL,SAASd;AAAA,kBACT,WAAU;AAAA,kBAET,UAAA;AAAA,oBAAAlB,IACCd,gBAAAA,EAAAA,IAAC+C,GAAA,EAAU,MAAM,IAAI,WAAU,oBAAmB,IAElD/C,gBAAAA,EAAAA,IAACgD,GAAA,EAAS,MAAM,GAAA,CAAI;AAAA,oBAEtBhD,gBAAAA,EAAAA,IAAC,UAAK,UAAA,YAAA,CAAS;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAAA;AAAA,qCAEhBiD,GAAA,EACC,UAAA;AAAA,gBAAAjD,gBAAAA,EAAAA,IAACkD,GAAA,EAAoB,SAAO,IAC1B,UAAAlD,gBAAAA,EAAAA;AAAAA,kBAAC8C;AAAA,kBAAA;AAAA,oBACC,SAAQ;AAAA,oBACR,MAAK;AAAA,oBACL,WAAU;AAAA,oBAEV,UAAA9C,gBAAAA,EAAAA,IAACmD,GAAA,EAAgB,MAAM,GAAA,CAAI;AAAA,kBAAA;AAAA,gBAAA,GAE/B;AAAA,gBACAV,gBAAAA,EAAAA,KAACW,GAAA,EAAoB,OAAM,OACzB,UAAA;AAAA,kBAAAX,gBAAAA,EAAAA;AAAAA,oBAACY;AAAA,oBAAA;AAAA,sBACC,WAAU;AAAA,sBACV,SAAS,MACP,KAAK,UAAU,UAAU,UAAU,OAAO,SAAS,IAAI;AAAA,sBAGzD,UAAA;AAAA,wBAAArD,gBAAAA,EAAAA,IAACsD,GAAA,EAAU,WAAU,SAAA,CAAS;AAAA,wBAAE;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAGlCtD,gBAAAA,EAAAA,IAACqD,GAAA,EAAiB,WAAU,SAAQ,SAAO,IACzC,UAAAZ,gBAAAA,EAAAA;AAAAA,oBAAC;AAAA,oBAAA;AAAA,sBACC,MAAMX;AAAA,sBACN,QAAO;AAAA,sBACP,KAAI;AAAA,sBAEJ,UAAA;AAAA,wBAAA9B,gBAAAA,EAAAA,IAACuD,GAAA,EAAiB,WAAU,SAAA,CAAS;AAAA,wBAAE;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBAAA,GAG3C;AAAA,kBACAd,gBAAAA,EAAAA;AAAAA,oBAACY;AAAA,oBAAA;AAAA,sBACC,WAAU;AAAA,sBACV,SAAS,MAAM;AACb,8BAAMG,IAAS;AAAA,0BACb,+CAA+C,OAAO,SAAS,IAAI;AAAA,wBAAA;AAErE,+BAAO;AAAA,0BACL,2BAA2BA,CAAM;AAAA,0BACjC;AAAA,wBAAA;AAAA,sBAEJ;AAAA,sBAEA,UAAA;AAAA,wBAAAxD,gBAAAA,EAAAA,IAACyD,IAAA,EAAW,WAAU,SAAA,CAAS;AAAA,wBAAE;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,kBAGnChB,gBAAAA,EAAAA;AAAAA,oBAACY;AAAA,oBAAA;AAAA,sBACC,WAAU;AAAA,sBACV,SAAS,MAAM;AACb,8BAAMG,IAAS;AAAA,0BACb,+CAA+C,OAAO,SAAS,IAAI;AAAA,wBAAA;AAErE,+BAAO;AAAA,0BACL,0BAA0BA,CAAM;AAAA,0BAChC;AAAA,wBAAA;AAAA,sBAEJ;AAAA,sBAEA,UAAA;AAAA,wBAAAxD,gBAAAA,EAAAA,IAAC0D,IAAA,EAAY,WAAU,SAAA,CAAS;AAAA,wBAAE;AAAA,sBAAA;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAEpC,EAAA,CACF;AAAA,cAAA,EAAA,CACF;AAAA,YAAA,EAAA,CACF;AAAA,UAAA,GAEJ;AAAA,UAGF1D,gBAAAA,EAAAA;AAAAA,YAACG;AAAA,YAAA;AAAA,cACC,YAAY,EAAE,GAAGwD,GAAA,GAAoB,GAAG9D,GAAA;AAAA,YAAiB;AAAA,UAAA;AAAA,UAE3DG,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,OAAA,CAAO;AAAA,UACpBwB,KAAoBC,KAAqBE,IACzCc,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,uDACb,UAAA;AAAA,YAAAzC,gBAAAA,EAAAA,IAAC,OAAA,EAAI;AAAA,YACLyC,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,cAAAzC,gBAAAA,EAAAA,IAAC,OAAA,EACE,eACCA,gBAAAA,EAAAA,IAAC8C,GAAA,EAAO,SAAO,IAAC,SAAQ,SAAQ,MAAK,MACnC,UAAAL,gBAAAA,EAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAMd;AAAA,kBACN,QAAO;AAAA,kBACP,KAAI;AAAA,kBACJ,WAAU;AAAA,kBAEV,UAAA;AAAA,oBAAA3B,gBAAAA,EAAAA,IAAC4D,GAAA,EAAS,MAAM,GAAA,CAAI;AAAA,oBACnBhC;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAAA,GAEL,EAAA,CAEJ;AAAA,cACA5B,gBAAAA,EAAAA,IAAC,OAAA,EACE,UAAAwB,KAAoBC,KACnBgB,gBAAAA,EAAAA;AAAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,OAAOhB,EAAiB,eAAe,QAAW;AAAA,oBAChD,WAAW;AAAA,oBACX,WAAW;AAAA,kBAAA,CACZ;AAAA,kBACF,UAAA;AAAA,oBAAA;AAAA,oBACkB;AAAA,oBACjBzB,gBAAAA,MAAC,UAAK,UAAUyB,EAAiB,eAC9B,UAAAA,EAAiB,mBAAmB,SAAS;AAAA,sBAC5C,WAAW;AAAA,oBAAA,CACZ,EAAA,CACH;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAAA,EACF,CAEJ;AAAA,YAAA,EAAA,CACF;AAAA,UAAA,EAAA,CACF,IACE;AAAA,UACH,CAACF,KACAkB,gBAAAA,EAAAA,KAAAoB,EAAAA,UAAA,EACE,UAAA;AAAA,YAAA7D,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,2BAAA,CAA2B;AAAA,YAC1CA,gBAAAA,EAAAA;AAAAA,cAAC8D;AAAA,cAAA;AAAA,gBACC,MAAMzB,IAAO,EAAE,IAAIA,EAAK,IAAI,OAAOA,EAAK,SAAS,GAAA,IAAO;AAAA,gBACxD,MAAMC,IAAO,EAAE,IAAIA,EAAK,IAAI,OAAOA,EAAK,SAAS,GAAA,IAAO;AAAA,gBACxD,WAAU;AAAA,cAAA;AAAA,YAAA;AAAA,UACZ,EAAA,CACF;AAAA,QAAA,GAEJ;AAAA,QACAtC,gBAAAA,EAAAA,IAAC,OAAA,EAAI,WAAU,mBAAkB,wBAAqB,OACnD,UAAAoC,KAAWpC,gBAAAA,EAAAA,IAAC+D,GAAA,EAAI,SAAS5B,EAAA,CAAY,EAAA,CACxC;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;"}
1
+ {"version":3,"file":"MdxPage-C0QFAsgv.js","sources":["../src/lib/plugins/markdown/MdxPage.tsx"],"sourcesContent":["import { useMDXComponents } from \"@mdx-js/react\";\nimport slugify from \"@sindresorhus/slugify\";\nimport { Helmet } from \"@zudoku/react-helmet-async\";\nimport {\n CheckIcon,\n ChevronDownIcon,\n CopyIcon,\n EditIcon,\n ExternalLinkIcon,\n Link2Icon,\n} from \"lucide-react\";\nimport { type PropsWithChildren, useEffect, useState } from \"react\";\nimport { useLocation } from \"react-router\";\nimport { Button } from \"zudoku/ui/Button.js\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from \"zudoku/ui/DropdownMenu.js\";\nimport { CategoryHeading } from \"../../components/CategoryHeading.js\";\nimport { Heading } from \"../../components/Heading.js\";\nimport { Toc } from \"../../components/navigation/Toc.js\";\nimport {\n useCurrentItem,\n usePrevNext,\n} from \"../../components/navigation/utils.js\";\nimport { Pagination } from \"../../components/Pagination.js\";\nimport { Typography } from \"../../components/Typography.js\";\nimport { joinUrl } from \"../../util/joinUrl.js\";\nimport type { MdxComponentsType } from \"../../util/MdxComponents.js\";\nimport { ChatGPTLogo } from \"./assets/ChatGPTLogo.js\";\nimport { ClaudeLogo } from \"./assets/ClaudeLogo.js\";\nimport type { MarkdownPluginDefaultOptions, MDXImport } from \"./index.js\";\n\ndeclare global {\n interface Window {\n __getReactRefreshIgnoredExports?: (args: {\n id: string;\n }) => string[] | undefined;\n }\n}\n\nconst MarkdownHeadings = {\n h2: ({ children, id }) => (\n <Heading level={2} id={id} registerNavigationAnchor>\n {children}\n </Heading>\n ),\n h3: ({ children, id }) => (\n <Heading level={3} id={id} registerNavigationAnchor>\n {children}\n </Heading>\n ),\n} satisfies MdxComponentsType;\n\nexport const MdxPage = ({\n mdxComponent: MdxComponent,\n basePath,\n frontmatter = {},\n defaultOptions,\n __filepath,\n tableOfContents,\n excerpt,\n}: PropsWithChildren<\n Omit<MDXImport, \"default\"> & {\n basePath: string;\n mdxComponent: MDXImport[\"default\"];\n defaultOptions?: MarkdownPluginDefaultOptions;\n }\n>) => {\n const categoryTitle = useCurrentItem()?.categoryLabel;\n const location = useLocation();\n const [isCopied, setIsCopied] = useState(false);\n\n const title = frontmatter.title;\n const description = frontmatter.description ?? excerpt;\n const category = frontmatter.category ?? categoryTitle;\n const hideToc = frontmatter.toc === false || defaultOptions?.toc === false;\n const pageTitle =\n title ?? tableOfContents.find((item) => item.depth === 1)?.value;\n const hidePager =\n frontmatter.disable_pager ??\n frontmatter.disablePager ??\n defaultOptions?.disablePager ??\n false;\n\n const showLastModified =\n frontmatter.showLastModified ?? defaultOptions?.showLastModified ?? true;\n\n const lastModifiedDate = frontmatter.lastModifiedTime\n ? new Date(frontmatter.lastModifiedTime)\n : null;\n\n const editConfig =\n frontmatter.suggestEdit !== false &&\n (frontmatter.suggestEdit ?? defaultOptions?.suggestEdit);\n\n const editUrl = editConfig\n ? editConfig.url.replaceAll(\"{filePath}\", __filepath)\n : null;\n const editText = editConfig ? editConfig.text || \"Edit this page\" : null;\n\n const copyMarkdownConfig =\n frontmatter.copyPage !== false && defaultOptions?.copyPage !== false;\n\n const markdownUrl = joinUrl(basePath, `${location.pathname}.md`);\n\n const handleCopyMarkdown = async () => {\n const response = await fetch(markdownUrl);\n if (!response.ok) throw new Error(\"Failed to fetch markdown\");\n const markdown = await response.text();\n void navigator.clipboard.writeText(markdown);\n setIsCopied(true);\n setTimeout(() => setIsCopied(false), 2000);\n };\n\n const tocEntries =\n tableOfContents.find((item) => item.depth === 1)?.children ??\n // if `title` is provided by frontmatter it does not appear in the table of contents\n tableOfContents.filter((item) => item.depth === 2);\n\n const showToc = !hideToc && tocEntries.length > 0;\n\n const { prev, next } = usePrevNext();\n\n useEffect(() => {\n if (process.env.NODE_ENV === \"development\") {\n window.__getReactRefreshIgnoredExports = ({ id }) => {\n if (!id.endsWith(__filepath)) return;\n\n return [\"frontmatter\", \"tableOfContents\"];\n };\n\n return () => {\n window.__getReactRefreshIgnoredExports = undefined;\n };\n }\n }, [__filepath]);\n\n return (\n <div\n className=\"grid grid-cols-1 xl:grid-cols-(--sidecar-grid-cols) gap-8 justify-between\"\n data-pagefind-filter=\"section:markdown\"\n data-pagefind-meta=\"section:markdown\"\n >\n <Helmet>\n <title>{pageTitle}</title>\n {description && <meta name=\"description\" content={description} />}\n </Helmet>\n <Typography className=\"max-w-full xl:w-full xl:max-w-3xl flex-1 shrink pt-(--padding-content-top)\">\n {(category || title) && (\n <header className=\"flex items-start justify-between gap-4\">\n <div className=\"flex-1\">\n {category && <CategoryHeading>{category}</CategoryHeading>}\n {title && (\n <Heading level={1} id={slugify(title)}>\n {title}\n </Heading>\n )}\n </div>\n {copyMarkdownConfig && (\n <div className=\"flex items-center border rounded-md\">\n <Button\n variant=\"ghost\"\n size=\"sm\"\n onClick={handleCopyMarkdown}\n className=\"rounded-r-none border-r gap-2 h-7\"\n >\n {isCopied ? (\n <CheckIcon size={14} className=\"text-emerald-600\" />\n ) : (\n <CopyIcon size={14} />\n )}\n <span>Copy page</span>\n </Button>\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n variant=\"ghost\"\n size=\"icon-xs\"\n className=\"rounded-l-none\"\n >\n <ChevronDownIcon size={14} />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n <DropdownMenuItem\n className=\"gap-2\"\n onClick={() =>\n void navigator.clipboard.writeText(window.location.href)\n }\n >\n <Link2Icon className=\"size-4\" />\n Copy link to page\n </DropdownMenuItem>\n <DropdownMenuItem className=\"gap-2\" asChild>\n <a\n href={markdownUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <ExternalLinkIcon className=\"size-4\" />\n Open Markdown page\n </a>\n </DropdownMenuItem>\n <DropdownMenuItem\n className=\"gap-2\"\n onClick={() => {\n const prompt = encodeURIComponent(\n `Help me understand this documentation page: ${window.location.href}`,\n );\n window.open(\n `https://claude.ai/new?q=${prompt}`,\n \"_blank\",\n );\n }}\n >\n <ClaudeLogo className=\"size-4\" />\n Open in Claude\n </DropdownMenuItem>\n <DropdownMenuItem\n className=\"gap-2\"\n onClick={() => {\n const prompt = encodeURIComponent(\n `Help me understand this documentation page: ${window.location.href}`,\n );\n window.open(\n `https://chatgpt.com/?q=${prompt}`,\n \"_blank\",\n );\n }}\n >\n <ChatGPTLogo className=\"size-4\" />\n Open in ChatGPT\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n </div>\n )}\n </header>\n )}\n\n <MdxComponent\n components={{ ...useMDXComponents(), ...MarkdownHeadings }}\n />\n <div className=\"h-16\" />\n {(showLastModified && lastModifiedDate) || editUrl ? (\n <div className=\"flex justify-between text-xs text-muted-foreground \">\n <div />\n <div className=\"flex items-center gap-2\">\n <div>\n {editUrl && (\n <Button asChild variant=\"ghost\" size=\"sm\">\n <a\n href={editUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"flex items-center gap-1\"\n >\n <EditIcon size={12} />\n {editText}\n </a>\n </Button>\n )}\n </div>\n <div>\n {showLastModified && lastModifiedDate && (\n <div\n title={lastModifiedDate.toLocaleString(undefined, {\n dateStyle: \"full\",\n timeStyle: \"medium\",\n })}\n >\n Last modified on{\" \"}\n <time dateTime={lastModifiedDate.toISOString()}>\n {lastModifiedDate.toLocaleDateString(\"en-US\", {\n dateStyle: \"long\",\n })}\n </time>\n </div>\n )}\n </div>\n </div>\n </div>\n ) : null}\n {!hidePager && (\n <>\n <div className=\"h-px bg-border mt-2 mb-6\" />\n <Pagination\n prev={prev ? { to: prev.id, label: prev.label ?? \"\" } : undefined}\n next={next ? { to: next.id, label: next.label ?? \"\" } : undefined}\n className=\"mb-10\"\n />\n </>\n )}\n </Typography>\n <div className=\"hidden xl:block\" data-pagefind-ignore=\"all\">\n {showToc && <Toc entries={tocEntries} />}\n </div>\n </div>\n );\n};\n"],"names":["MarkdownHeadings","children","id","jsx","Heading","MdxPage","MdxComponent","basePath","frontmatter","defaultOptions","__filepath","tableOfContents","excerpt","categoryTitle","useCurrentItem","location","useLocation","isCopied","setIsCopied","useState","title","description","category","hideToc","pageTitle","item","hidePager","showLastModified","lastModifiedDate","editConfig","editUrl","editText","copyMarkdownConfig","markdownUrl","joinUrl","handleCopyMarkdown","response","markdown","tocEntries","showToc","prev","next","usePrevNext","useEffect","jsxs","Helmet","Typography","CategoryHeading","slugify","Button","CheckIcon","CopyIcon","DropdownMenu","DropdownMenuTrigger","ChevronDownIcon","DropdownMenuContent","DropdownMenuItem","Link2Icon","ExternalLinkIcon","prompt","ClaudeLogo","ChatGPTLogo","useMDXComponents","EditIcon","Fragment","Pagination","Toc"],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ import { j as r } from "./jsx-runtime-BzflLqGi.js";
2
+ import { g } from "./useQuery-ht7aWJ3S.js";
3
+ import { useId as f } from "react";
4
+ import { c as v } from "./index-DI5SPFK9.js";
5
+ import { c as n } from "./cn-5-Gd1Dss.js";
6
+ import { z as p } from "./index-DAWHN3cH.js";
7
+ import "./ZudokuReactContext-DGJAP1sN.js";
8
+ import { S as x } from "./Spinner-CI6bRyZw.js";
9
+ const h = v(
10
+ "grid gap-0.5 rounded-lg border px-2.5 py-2 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4 w-full relative group/alert",
11
+ {
12
+ variants: {
13
+ variant: {
14
+ default: "bg-card text-card-foreground",
15
+ destructive: "text-destructive bg-card bg-destructive/5 border-destructive/20 *:data-[slot=alert-description]:text-destructive-foreground *:[svg]:text-current",
16
+ warning: "text-warning-foreground bg-card bg-warning/10 border-warning/50 *:data-[slot=alert-description]:text-warning-foreground *:[svg]:text-current"
17
+ }
18
+ },
19
+ defaultVariants: {
20
+ variant: "default"
21
+ }
22
+ }
23
+ );
24
+ function w({
25
+ className: e,
26
+ variant: t,
27
+ ...a
28
+ }) {
29
+ return /* @__PURE__ */ r.jsx(
30
+ "div",
31
+ {
32
+ "data-slot": "alert",
33
+ role: "alert",
34
+ className: n(h({ variant: t }), e),
35
+ ...a
36
+ }
37
+ );
38
+ }
39
+ function b({ className: e, ...t }) {
40
+ return /* @__PURE__ */ r.jsx(
41
+ "div",
42
+ {
43
+ "data-slot": "alert-title",
44
+ className: n(
45
+ "font-medium group-has-[>svg]/alert:col-start-2 [&_a]:hover:text-foreground [&_a]:underline [&_a]:underline-offset-3",
46
+ e
47
+ ),
48
+ ...t
49
+ }
50
+ );
51
+ }
52
+ function y({
53
+ className: e,
54
+ ...t
55
+ }) {
56
+ return /* @__PURE__ */ r.jsx(
57
+ "div",
58
+ {
59
+ "data-slot": "alert-description",
60
+ className: n(
61
+ "text-muted-foreground text-sm text-balance md:text-pretty [&_p:not(:last-child)]:mb-4 [&_a]:hover:text-foreground [&_a]:underline [&_a]:underline-offset-3",
62
+ e
63
+ ),
64
+ ...t
65
+ }
66
+ );
67
+ }
68
+ let s = null;
69
+ const j = () => (s || (s = import("mermaid").then((e) => e.default).catch((e) => {
70
+ throw new Error(
71
+ "Mermaid is not installed. Please install it with: npm install mermaid",
72
+ { cause: e }
73
+ );
74
+ })), s), P = ({ chart: e, config: t, ...a }) => {
75
+ const l = f(), o = p(), {
76
+ data: u,
77
+ error: i,
78
+ isPending: c
79
+ } = g({
80
+ queryKey: ["mermaid", e, t, o.resolvedTheme],
81
+ queryFn: async () => {
82
+ const d = await j();
83
+ d.initialize({
84
+ theme: o.resolvedTheme === "dark" ? "dark" : "base",
85
+ ...t
86
+ });
87
+ const { svg: m } = await d.render(l, e);
88
+ return m;
89
+ },
90
+ enabled: typeof window < "u",
91
+ retry: !1
92
+ });
93
+ return i ? /* @__PURE__ */ r.jsxs(w, { className: "flex flex-col gap-2", variant: "destructive", children: [
94
+ /* @__PURE__ */ r.jsx(b, { children: "Mermaid Error" }),
95
+ /* @__PURE__ */ r.jsx(y, { className: "overflow-auto wrap-break-word whitespace-pre-wrap font-mono text-xs", children: i.message })
96
+ ] }) : c ? /* @__PURE__ */ r.jsx(x, {}) : /* @__PURE__ */ r.jsx("div", { ...a, dangerouslySetInnerHTML: { __html: u } });
97
+ };
98
+ export {
99
+ w as A,
100
+ P as M,
101
+ b as a,
102
+ y as b
103
+ };
104
+ //# sourceMappingURL=Mermaid-Chx5BPHn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Mermaid-Chx5BPHn.js","sources":["../src/lib/ui/Alert.tsx","../src/lib/components/Mermaid.tsx"],"sourcesContent":["import { cva, type VariantProps } from \"class-variance-authority\";\nimport type * as React from \"react\";\nimport { cn } from \"../util/cn.js\";\n\nconst alertVariants = cva(\n \"grid gap-0.5 rounded-lg border px-2.5 py-2 text-left text-sm has-data-[slot=alert-action]:relative has-data-[slot=alert-action]:pr-18 has-[>svg]:grid-cols-[auto_1fr] has-[>svg]:gap-x-2 *:[svg]:row-span-2 *:[svg]:translate-y-0.5 *:[svg]:text-current *:[svg:not([class*='size-'])]:size-4 w-full relative group/alert\",\n {\n variants: {\n variant: {\n default: \"bg-card text-card-foreground\",\n destructive:\n \"text-destructive bg-card bg-destructive/5 border-destructive/20 *:data-[slot=alert-description]:text-destructive-foreground *:[svg]:text-current\",\n warning:\n \"text-warning-foreground bg-card bg-warning/10 border-warning/50 *:data-[slot=alert-description]:text-warning-foreground *:[svg]:text-current\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nfunction Alert({\n className,\n variant,\n ...props\n}: React.ComponentProps<\"div\"> & VariantProps<typeof alertVariants>) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\nfunction AlertTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-title\"\n className={cn(\n \"font-medium group-has-[>svg]/alert:col-start-2 [&_a]:hover:text-foreground [&_a]:underline [&_a]:underline-offset-3\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AlertDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\n \"text-muted-foreground text-sm text-balance md:text-pretty [&_p:not(:last-child)]:mb-4 [&_a]:hover:text-foreground [&_a]:underline [&_a]:underline-offset-3\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction AlertAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-action\"\n className={cn(\"absolute top-2 right-2\", className)}\n {...props}\n />\n );\n}\n\nexport { Alert, AlertTitle, AlertDescription, AlertAction };\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { MermaidConfig } from \"mermaid\";\nimport type { ComponentProps } from \"react\";\nimport { useId } from \"react\";\nimport { Alert, AlertDescription, AlertTitle } from \"zudoku/ui/Alert.js\";\nimport { useTheme } from \"../hooks/index.js\";\nimport { Spinner } from \"./Spinner.js\";\n\nexport type MermaidProps = {\n chart: string;\n config?: MermaidConfig;\n} & ComponentProps<\"div\">;\n\nlet mermaidPromise: Promise<typeof import(\"mermaid\").default> | null = null;\n\nconst loadMermaid = () => {\n if (!mermaidPromise) {\n mermaidPromise = import(\"mermaid\")\n .then((mod) => mod.default)\n .catch((error) => {\n throw new Error(\n \"Mermaid is not installed. Please install it with: npm install mermaid\",\n { cause: error },\n );\n });\n }\n return mermaidPromise;\n};\n\nexport const Mermaid = ({ chart, config, ...props }: MermaidProps) => {\n const id = useId();\n const theme = useTheme();\n\n const {\n data: svg,\n error,\n isPending,\n } = useQuery({\n queryKey: [\"mermaid\", chart, config, theme.resolvedTheme],\n queryFn: async () => {\n const mermaid = await loadMermaid();\n mermaid.initialize({\n theme: theme.resolvedTheme === \"dark\" ? \"dark\" : \"base\",\n ...config,\n });\n\n const { svg } = await mermaid.render(id, chart);\n return svg;\n },\n enabled: typeof window !== \"undefined\",\n retry: false,\n });\n\n if (error)\n return (\n <Alert className=\"flex flex-col gap-2\" variant=\"destructive\">\n <AlertTitle>Mermaid Error</AlertTitle>\n <AlertDescription className=\"overflow-auto wrap-break-word whitespace-pre-wrap font-mono text-xs\">\n {error.message}\n </AlertDescription>\n </Alert>\n );\n\n if (isPending) return <Spinner />;\n\n // biome-ignore lint/security/noDangerouslySetInnerHtml: Mermaid generates valid SVG\n return <div {...props} dangerouslySetInnerHTML={{ __html: svg }} />;\n};\n"],"names":["alertVariants","cva","Alert","className","variant","props","jsx","cn","AlertTitle","AlertDescription","mermaidPromise","loadMermaid","mod","error","Mermaid","chart","config","id","useId","theme","useTheme","svg","isPending","useQuery","mermaid","jsxs","Spinner"],"mappings":";;;;;;;;AAIA,MAAMA,IAAgBC;AAAA,EACpB;AAAA,EACA;AAAA,IACE,UAAU;AAAA,MACR,SAAS;AAAA,QACP,SAAS;AAAA,QACT,aACE;AAAA,QACF,SACE;AAAA,MAAA;AAAA,IACJ;AAAA,IAEF,iBAAiB;AAAA,MACf,SAAS;AAAA,IAAA;AAAA,EACX;AAEJ;AAEA,SAASC,EAAM;AAAA,EACb,WAAAC;AAAA,EACA,SAAAC;AAAA,EACA,GAAGC;AACL,GAAqE;AACnE,SACEC,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,MAAK;AAAA,MACL,WAAWC,EAAGP,EAAc,EAAE,SAAAI,EAAA,CAAS,GAAGD,CAAS;AAAA,MAClD,GAAGE;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,SAASG,EAAW,EAAE,WAAAL,GAAW,GAAGE,KAAsC;AACxE,SACEC,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAWC;AAAA,QACT;AAAA,QACAJ;AAAA,MAAA;AAAA,MAED,GAAGE;AAAA,IAAA;AAAA,EAAA;AAGV;AAEA,SAASI,EAAiB;AAAA,EACxB,WAAAN;AAAA,EACA,GAAGE;AACL,GAAgC;AAC9B,SACEC,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAWC;AAAA,QACT;AAAA,QACAJ;AAAA,MAAA;AAAA,MAED,GAAGE;AAAA,IAAA;AAAA,EAAA;AAGV;ACnDA,IAAIK,IAAmE;AAEvE,MAAMC,IAAc,OACbD,MACHA,IAAiB,OAAO,SAAS,EAC9B,KAAK,CAACE,MAAQA,EAAI,OAAO,EACzB,MAAM,CAACC,MAAU;AAChB,QAAM,IAAI;AAAA,IACR;AAAA,IACA,EAAE,OAAOA,EAAA;AAAA,EAAM;AAEnB,CAAC,IAEEH,IAGII,IAAU,CAAC,EAAE,OAAAC,GAAO,QAAAC,GAAQ,GAAGX,QAA0B;AACpE,QAAMY,IAAKC,EAAA,GACLC,IAAQC,EAAA,GAER;AAAA,IACJ,MAAMC;AAAA,IACN,OAAAR;AAAA,IACA,WAAAS;AAAA,EAAA,IACEC,EAAS;AAAA,IACX,UAAU,CAAC,WAAWR,GAAOC,GAAQG,EAAM,aAAa;AAAA,IACxD,SAAS,YAAY;AACnB,YAAMK,IAAU,MAAMb,EAAA;AACtB,MAAAa,EAAQ,WAAW;AAAA,QACjB,OAAOL,EAAM,kBAAkB,SAAS,SAAS;AAAA,QACjD,GAAGH;AAAA,MAAA,CACJ;AAED,YAAM,EAAE,KAAAK,EAAAA,IAAQ,MAAMG,EAAQ,OAAOP,GAAIF,CAAK;AAC9C,aAAOM;AAAAA,IACT;AAAA,IACA,SAAS,OAAO,SAAW;AAAA,IAC3B,OAAO;AAAA,EAAA,CACR;AAED,SAAIR,IAEAY,gBAAAA,EAAAA,KAACvB,GAAA,EAAM,WAAU,uBAAsB,SAAQ,eAC7C,UAAA;AAAA,IAAAI,gBAAAA,EAAAA,IAACE,KAAW,UAAA,gBAAA,CAAa;AAAA,IACzBF,gBAAAA,EAAAA,IAACG,GAAA,EAAiB,WAAU,uEACzB,YAAM,QAAA,CACT;AAAA,EAAA,GACF,IAGAa,IAAkBhB,gBAAAA,MAACoB,GAAA,CAAA,CAAQ,IAGxBpB,gBAAAA,EAAAA,IAAC,SAAK,GAAGD,GAAO,yBAAyB,EAAE,QAAQgB,KAAO;AACnE;"}
@@ -1,18 +1,19 @@
1
1
  import { j as e } from "./jsx-runtime-BzflLqGi.js";
2
- import { u as m } from "./useSuspenseQuery-CSB_rVek.js";
2
+ import { u as m } from "./useSuspenseQuery-DQH4Bmc2.js";
3
3
  import { N as h, L as g } from "./chunk-EPOLDU6W-C6C8jAwd.js";
4
4
  import { Button as o } from "./ui/Button.js";
5
5
  import { HomeIcon as y } from "lucide-react";
6
6
  import "react";
7
- import { H as _, T as c } from "./Zudoku-DUsdmPME.js";
8
- import { a as v, j as f } from "./ZudokuContext-BBI06sOx.js";
7
+ import { H as _, T as c } from "./Zudoku-iyiXgWFY.js";
8
+ import { a as v, j as f } from "./ZudokuContext-CYyb_PB_.js";
9
9
  import "./index-DAWHN3cH.js";
10
- import { O as d } from "./errors-7hgPDs1h.js";
11
- import { u as x } from "./hook-ZEd1Es7D.js";
10
+ import "./ZudokuReactContext-DGJAP1sN.js";
11
+ import { O as d } from "./errors-B77S9iOc.js";
12
+ import { u as x } from "./hook-Dz_n9SoE.js";
12
13
  function w(r, i, n = "/") {
13
14
  return r.startsWith(i) ? n !== "/" && r.startsWith(i + n) ? r.slice(i.length + n.length) : r.slice(i.length) : r;
14
15
  }
15
- function z({
16
+ function I({
16
17
  handleCallback: r
17
18
  }) {
18
19
  const { options: i } = v(), n = m({
@@ -92,7 +93,7 @@ const l = {
92
93
  message: "An unexpected error occurred during authentication. Please try again or contact support."
93
94
  }
94
95
  };
95
- function I({ error: r }) {
96
+ function O({ error: r }) {
96
97
  const { login: i } = x();
97
98
  if (!(r instanceof d))
98
99
  throw r;
@@ -146,7 +147,7 @@ const k = {
146
147
  temporarily_unavailable: "This is usually temporary. Try again in a few minutes."
147
148
  };
148
149
  export {
149
- z as C,
150
- I as O
150
+ I as C,
151
+ O
151
152
  };
152
- //# sourceMappingURL=OAuthErrorPage-01Ke086W.js.map
153
+ //# sourceMappingURL=OAuthErrorPage-CFz_gBFx.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"OAuthErrorPage-01Ke086W.js","sources":["../src/lib/util/url.ts","../src/lib/authentication/components/CallbackHandler.tsx","../src/lib/authentication/components/OAuthErrorPage.tsx"],"sourcesContent":["/**\n * Normalizes a redirect URL by removing the origin and optionally the root path\n */\nexport function normalizeRedirectUrl(\n redirectTo: string,\n origin: string,\n basePath: string = \"/\",\n): string {\n if (!redirectTo.startsWith(origin)) {\n return redirectTo;\n }\n\n if (basePath !== \"/\" && redirectTo.startsWith(origin + basePath)) {\n return redirectTo.slice(origin.length + basePath.length);\n }\n\n return redirectTo.slice(origin.length);\n}\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { Navigate } from \"react-router\";\nimport { useZudoku } from \"zudoku/components\";\nimport { joinUrl } from \"../../util/joinUrl.js\";\nimport { normalizeRedirectUrl } from \"../../util/url.js\";\nimport { OAuthAuthorizationError, type OAuthErrorType } from \"../errors.js\";\n\nexport function CallbackHandler({\n handleCallback,\n}: {\n handleCallback: () => Promise<string>;\n}) {\n const { options } = useZudoku();\n const executeCallback = useSuspenseQuery({\n retry: false,\n queryKey: [\"oauth-callback\", window.location.search],\n queryFn: async () => {\n const url = new URL(window.location.href);\n\n const errorParam = url.searchParams.get(\"error\");\n const errorDescription =\n url.searchParams.get(\"error_description\") ?? undefined;\n const errorUri = url.searchParams.get(\"error_uri\") ?? undefined;\n if (errorParam) {\n throw new OAuthAuthorizationError(\n `OAuth error '${errorParam}': ${errorDescription}`,\n {\n error: errorParam as OAuthErrorType,\n error_description: errorDescription,\n error_uri: errorUri,\n },\n );\n }\n return joinUrl(\n normalizeRedirectUrl(\n await handleCallback(),\n window.location.origin,\n options.basePath,\n ),\n );\n },\n });\n\n return <Navigate to={executeCallback.data} replace />;\n}\n","import { HomeIcon } from \"lucide-react\";\nimport { Link } from \"react-router\";\nimport { Heading } from \"../../components/Heading.js\";\nimport { Typography } from \"../../components/Typography.js\";\nimport { Button } from \"../../ui/Button.js\";\nimport { OAuthAuthorizationError } from \"../errors.js\";\nimport { useAuth } from \"../hook.js\";\n\nconst errorDetailsMap: Record<string, { message: string }> = {\n invalid_request: {\n message:\n \"The authentication request was invalid. Please try signing in again.\",\n },\n unauthorized_client: {\n message:\n \"This application is not authorized to access your account. Please contact support.\",\n },\n access_denied: {\n message:\n \"You denied access to this application. To continue, please sign in and grant access.\",\n },\n unsupported_response_type: {\n message:\n \"The authentication method is not supported. Please contact support.\",\n },\n invalid_scope: {\n message: \"The requested permissions are invalid. Please contact support.\",\n },\n server_error: {\n message:\n \"The authentication server encountered an error. Please try again in a few moments.\",\n },\n temporarily_unavailable: {\n message:\n \"The authentication service is temporarily unavailable. Please try again in a few moments.\",\n },\n // Token errors\n invalid_client: {\n message: \"Invalid application credentials. Please contact support.\",\n },\n invalid_grant: {\n message:\n \"The authentication code has expired or is invalid. Please sign in again.\",\n },\n unsupported_grant_type: {\n message:\n \"The authentication method is not supported. Please contact support.\",\n },\n // Custom errors\n invalid_state: {\n message:\n \"Security validation failed. This may be due to a potential security attack. Please try signing in again.\",\n },\n missing_code_verifier: {\n message:\n \"Authentication security information is missing. Please clear your browser cache and try again.\",\n },\n network_error: {\n message:\n \"A network error occurred during authentication. Please check your connection and try again.\",\n },\n token_expired: {\n message: \"Your authentication session has expired. Please sign in again.\",\n },\n configuration_error: {\n message:\n \"There is an issue with the authentication configuration. Please contact support.\",\n },\n unknown_error: {\n message:\n \"An unexpected error occurred during authentication. Please try again or contact support.\",\n },\n};\n\nexport function OAuthErrorPage({ error }: { error: unknown }) {\n const { login } = useAuth();\n\n if (!(error instanceof OAuthAuthorizationError)) {\n throw error;\n }\n\n const oauthError = error.error;\n const type = oauthError.error;\n\n const details = errorDetailsMap[type] ?? errorDetailsMap.unknown_error;\n\n return (\n <div className=\"min-h-[400px] flex items-center justify-center p-4\">\n <div className=\"max-w-md w-full text-center space-y-6\">\n <div className=\"space-y-4 items-center\">\n <Heading level={2} className=\"text-2xl inline-block font-bold\">\n {titles[type] || \"Authentication Error\"}\n </Heading>\n\n <Typography className=\"text-gray-600 dark:text-gray-300 leading-relaxed\">\n {details?.message}\n </Typography>\n\n {/* Technical details for developers (only in development) */}\n </div>\n\n {/* Action Buttons */}\n <div className=\"space-y-3 pt-4\">\n <div className=\"space-y-2\">\n {(type === \"access_denied\" ||\n type === \"invalid_grant\" ||\n type === \"token_expired\") && (\n <Button\n onClick={() => login()}\n className=\"w-full capitalize\"\n variant={\"default\"}\n >\n Sign in again\n </Button>\n )}\n </div>\n\n <div className=\"flex gap-2\">\n <Button asChild className=\"flex-1\" variant=\"outline\">\n <Link to=\"/\">\n <HomeIcon className=\"w-4 h-4 mr-2\" />\n Go Home\n </Link>\n </Button>\n </div>\n </div>\n\n {/* Additional Help */}\n {helpMessages[type] && (\n <Typography className=\"text-sm text-gray-500 dark:text-gray-400\">\n {helpMessages[type]}\n </Typography>\n )}\n </div>\n </div>\n );\n}\n\nconst titles: Record<string, string> = {\n access_denied: \"Access Denied\",\n invalid_request: \"Invalid Request\",\n unauthorized_client: \"Unauthorized Application\",\n unsupported_response_type: \"Unsupported Method\",\n invalid_scope: \"Invalid Permissions\",\n server_error: \"Server Error\",\n temporarily_unavailable: \"Service Unavailable\",\n invalid_client: \"Invalid Credentials\",\n invalid_grant: \"Authentication Expired\",\n unsupported_grant_type: \"Unsupported Authentication\",\n invalid_state: \"Security Check Failed\",\n missing_code_verifier: \"Security Information Missing\",\n network_error: \"Network Error\",\n token_expired: \"Session Expired\",\n configuration_error: \"Configuration Error\",\n unknown_error: \"Authentication Failed\",\n};\n\nconst helpMessages: Record<string, string> = {\n access_denied:\n \"If you changed your mind, you can try signing in again to grant access.\",\n invalid_state:\n \"This error can occur if you have multiple tabs open or if your session was compromised.\",\n missing_code_verifier:\n \"Try clearing your browser's cache and cookies for this site.\",\n network_error:\n \"Check your internet connection and ensure you can access other websites.\",\n server_error:\n \"The issue is on our end. Our team has been notified and is working to fix it.\",\n temporarily_unavailable:\n \"This is usually temporary. Try again in a few minutes.\",\n};\n"],"names":["normalizeRedirectUrl","redirectTo","origin","basePath","CallbackHandler","handleCallback","options","useZudoku","executeCallback","useSuspenseQuery","url","errorParam","errorDescription","errorUri","OAuthAuthorizationError","joinUrl","Navigate","errorDetailsMap","OAuthErrorPage","error","login","useAuth","type","details","jsxs","jsx","Heading","titles","Typography","Button","Link","HomeIcon","helpMessages"],"mappings":"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"}
1
+ {"version":3,"file":"OAuthErrorPage-CFz_gBFx.js","sources":["../src/lib/util/url.ts","../src/lib/authentication/components/CallbackHandler.tsx","../src/lib/authentication/components/OAuthErrorPage.tsx"],"sourcesContent":["/**\n * Normalizes a redirect URL by removing the origin and optionally the root path\n */\nexport function normalizeRedirectUrl(\n redirectTo: string,\n origin: string,\n basePath: string = \"/\",\n): string {\n if (!redirectTo.startsWith(origin)) {\n return redirectTo;\n }\n\n if (basePath !== \"/\" && redirectTo.startsWith(origin + basePath)) {\n return redirectTo.slice(origin.length + basePath.length);\n }\n\n return redirectTo.slice(origin.length);\n}\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { Navigate } from \"react-router\";\nimport { useZudoku } from \"zudoku/components\";\nimport { joinUrl } from \"../../util/joinUrl.js\";\nimport { normalizeRedirectUrl } from \"../../util/url.js\";\nimport { OAuthAuthorizationError, type OAuthErrorType } from \"../errors.js\";\n\nexport function CallbackHandler({\n handleCallback,\n}: {\n handleCallback: () => Promise<string>;\n}) {\n const { options } = useZudoku();\n const executeCallback = useSuspenseQuery({\n retry: false,\n queryKey: [\"oauth-callback\", window.location.search],\n queryFn: async () => {\n const url = new URL(window.location.href);\n\n const errorParam = url.searchParams.get(\"error\");\n const errorDescription =\n url.searchParams.get(\"error_description\") ?? undefined;\n const errorUri = url.searchParams.get(\"error_uri\") ?? undefined;\n if (errorParam) {\n throw new OAuthAuthorizationError(\n `OAuth error '${errorParam}': ${errorDescription}`,\n {\n error: errorParam as OAuthErrorType,\n error_description: errorDescription,\n error_uri: errorUri,\n },\n );\n }\n return joinUrl(\n normalizeRedirectUrl(\n await handleCallback(),\n window.location.origin,\n options.basePath,\n ),\n );\n },\n });\n\n return <Navigate to={executeCallback.data} replace />;\n}\n","import { HomeIcon } from \"lucide-react\";\nimport { Link } from \"react-router\";\nimport { Heading } from \"../../components/Heading.js\";\nimport { Typography } from \"../../components/Typography.js\";\nimport { Button } from \"../../ui/Button.js\";\nimport { OAuthAuthorizationError } from \"../errors.js\";\nimport { useAuth } from \"../hook.js\";\n\nconst errorDetailsMap: Record<string, { message: string }> = {\n invalid_request: {\n message:\n \"The authentication request was invalid. Please try signing in again.\",\n },\n unauthorized_client: {\n message:\n \"This application is not authorized to access your account. Please contact support.\",\n },\n access_denied: {\n message:\n \"You denied access to this application. To continue, please sign in and grant access.\",\n },\n unsupported_response_type: {\n message:\n \"The authentication method is not supported. Please contact support.\",\n },\n invalid_scope: {\n message: \"The requested permissions are invalid. Please contact support.\",\n },\n server_error: {\n message:\n \"The authentication server encountered an error. Please try again in a few moments.\",\n },\n temporarily_unavailable: {\n message:\n \"The authentication service is temporarily unavailable. Please try again in a few moments.\",\n },\n // Token errors\n invalid_client: {\n message: \"Invalid application credentials. Please contact support.\",\n },\n invalid_grant: {\n message:\n \"The authentication code has expired or is invalid. Please sign in again.\",\n },\n unsupported_grant_type: {\n message:\n \"The authentication method is not supported. Please contact support.\",\n },\n // Custom errors\n invalid_state: {\n message:\n \"Security validation failed. This may be due to a potential security attack. Please try signing in again.\",\n },\n missing_code_verifier: {\n message:\n \"Authentication security information is missing. Please clear your browser cache and try again.\",\n },\n network_error: {\n message:\n \"A network error occurred during authentication. Please check your connection and try again.\",\n },\n token_expired: {\n message: \"Your authentication session has expired. Please sign in again.\",\n },\n configuration_error: {\n message:\n \"There is an issue with the authentication configuration. Please contact support.\",\n },\n unknown_error: {\n message:\n \"An unexpected error occurred during authentication. Please try again or contact support.\",\n },\n};\n\nexport function OAuthErrorPage({ error }: { error: unknown }) {\n const { login } = useAuth();\n\n if (!(error instanceof OAuthAuthorizationError)) {\n throw error;\n }\n\n const oauthError = error.error;\n const type = oauthError.error;\n\n const details = errorDetailsMap[type] ?? errorDetailsMap.unknown_error;\n\n return (\n <div className=\"min-h-[400px] flex items-center justify-center p-4\">\n <div className=\"max-w-md w-full text-center space-y-6\">\n <div className=\"space-y-4 items-center\">\n <Heading level={2} className=\"text-2xl inline-block font-bold\">\n {titles[type] || \"Authentication Error\"}\n </Heading>\n\n <Typography className=\"text-gray-600 dark:text-gray-300 leading-relaxed\">\n {details?.message}\n </Typography>\n\n {/* Technical details for developers (only in development) */}\n </div>\n\n {/* Action Buttons */}\n <div className=\"space-y-3 pt-4\">\n <div className=\"space-y-2\">\n {(type === \"access_denied\" ||\n type === \"invalid_grant\" ||\n type === \"token_expired\") && (\n <Button\n onClick={() => login()}\n className=\"w-full capitalize\"\n variant={\"default\"}\n >\n Sign in again\n </Button>\n )}\n </div>\n\n <div className=\"flex gap-2\">\n <Button asChild className=\"flex-1\" variant=\"outline\">\n <Link to=\"/\">\n <HomeIcon className=\"w-4 h-4 mr-2\" />\n Go Home\n </Link>\n </Button>\n </div>\n </div>\n\n {/* Additional Help */}\n {helpMessages[type] && (\n <Typography className=\"text-sm text-gray-500 dark:text-gray-400\">\n {helpMessages[type]}\n </Typography>\n )}\n </div>\n </div>\n );\n}\n\nconst titles: Record<string, string> = {\n access_denied: \"Access Denied\",\n invalid_request: \"Invalid Request\",\n unauthorized_client: \"Unauthorized Application\",\n unsupported_response_type: \"Unsupported Method\",\n invalid_scope: \"Invalid Permissions\",\n server_error: \"Server Error\",\n temporarily_unavailable: \"Service Unavailable\",\n invalid_client: \"Invalid Credentials\",\n invalid_grant: \"Authentication Expired\",\n unsupported_grant_type: \"Unsupported Authentication\",\n invalid_state: \"Security Check Failed\",\n missing_code_verifier: \"Security Information Missing\",\n network_error: \"Network Error\",\n token_expired: \"Session Expired\",\n configuration_error: \"Configuration Error\",\n unknown_error: \"Authentication Failed\",\n};\n\nconst helpMessages: Record<string, string> = {\n access_denied:\n \"If you changed your mind, you can try signing in again to grant access.\",\n invalid_state:\n \"This error can occur if you have multiple tabs open or if your session was compromised.\",\n missing_code_verifier:\n \"Try clearing your browser's cache and cookies for this site.\",\n network_error:\n \"Check your internet connection and ensure you can access other websites.\",\n server_error:\n \"The issue is on our end. Our team has been notified and is working to fix it.\",\n temporarily_unavailable:\n \"This is usually temporary. Try again in a few minutes.\",\n};\n"],"names":["normalizeRedirectUrl","redirectTo","origin","basePath","CallbackHandler","handleCallback","options","useZudoku","executeCallback","useSuspenseQuery","url","errorParam","errorDescription","errorUri","OAuthAuthorizationError","joinUrl","Navigate","errorDetailsMap","OAuthErrorPage","error","login","useAuth","type","details","jsxs","jsx","Heading","titles","Typography","Button","Link","HomeIcon","helpMessages"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import { j as s } from "./jsx-runtime-BzflLqGi.js";
2
2
  import { useMemo as d } from "react";
3
3
  import { O as f } from "./chunk-EPOLDU6W-C6C8jAwd.js";
4
- import { j } from "./ZudokuContext-BBI06sOx.js";
5
- import { g as c, O as x, G as O } from "./index-CyIW9rHv.js";
4
+ import { j } from "./ZudokuContext-CYyb_PB_.js";
5
+ import { g as c, O as x, G as O } from "./index-Bc2mE-53.js";
6
6
  const y = ({
7
7
  basePath: n,
8
8
  version: e,
@@ -45,4 +45,4 @@ const y = ({
45
45
  export {
46
46
  y as OasProvider
47
47
  };
48
- //# sourceMappingURL=OasProvider-oHPiMJZg.js.map
48
+ //# sourceMappingURL=OasProvider-BQ60YgAd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"OasProvider-oHPiMJZg.js","sources":["../src/lib/plugins/openapi/OasProvider.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { Outlet } from \"react-router\";\nimport { joinUrl } from \"../../util/joinUrl.js\";\nimport type { GraphQLClient } from \"./client/GraphQLClient.js\";\nimport { GraphQLProvider } from \"./client/GraphQLContext.js\";\nimport { OasConfigProvider } from \"./context.js\";\nimport type { OasPluginConfig } from \"./interfaces.js\";\nimport { getVersionMetadata } from \"./util/getRoutes.js\";\n\nexport const OasProvider = ({\n basePath,\n version,\n config,\n client,\n}: {\n basePath: string;\n version?: string;\n config: OasPluginConfig;\n client: GraphQLClient;\n}) => {\n const value = useMemo(() => {\n const {\n versions: availableVersions,\n labels,\n downloadUrls,\n } = getVersionMetadata(config);\n const currentVersion = version ?? availableVersions.at(0);\n\n const versionLinks = Object.fromEntries(\n availableVersions.map((id) => [\n id,\n {\n path: joinUrl(basePath, id),\n label: labels[id] ?? id,\n downloadUrl: downloadUrls[id],\n },\n ]),\n );\n\n const resolveInput = (): string | (() => Promise<unknown>) => {\n if (!Array.isArray(config.input)) {\n return config.input;\n }\n\n const versionConfig = currentVersion\n ? config.input.find((v) => v.path === currentVersion)\n : config.input[0];\n\n if (!versionConfig) {\n throw new Error(`No input found for version: ${currentVersion}`);\n }\n\n return versionConfig.input;\n };\n\n return {\n config: {\n ...config,\n version: currentVersion,\n versions: versionLinks,\n input: resolveInput(),\n },\n };\n }, [config, basePath, version]);\n\n return (\n <OasConfigProvider value={value}>\n <GraphQLProvider client={client}>\n <Outlet />\n </GraphQLProvider>\n </OasConfigProvider>\n );\n};\n"],"names":["OasProvider","basePath","version","config","client","value","useMemo","availableVersions","labels","downloadUrls","getVersionMetadata","currentVersion","versionLinks","id","joinUrl","versionConfig","jsx","OasConfigProvider","GraphQLProvider","Outlet"],"mappings":";;;;;AASO,MAAMA,IAAc,CAAC;AAAA,EAC1B,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,QAAAC;AAAA,EACA,QAAAC;AACF,MAKM;AACJ,QAAMC,IAAQC,EAAQ,MAAM;AAC1B,UAAM;AAAA,MACJ,UAAUC;AAAA,MACV,QAAAC;AAAA,MACA,cAAAC;AAAA,IAAA,IACEC,EAAmBP,CAAM,GACvBQ,IAAiBT,KAAWK,EAAkB,GAAG,CAAC,GAElDK,IAAe,OAAO;AAAA,MAC1BL,EAAkB,IAAI,CAACM,MAAO;AAAA,QAC5BA;AAAA,QACA;AAAA,UACE,MAAMC,EAAQb,GAAUY,CAAE;AAAA,UAC1B,OAAOL,EAAOK,CAAE,KAAKA;AAAA,UACrB,aAAaJ,EAAaI,CAAE;AAAA,QAAA;AAAA,MAC9B,CACD;AAAA,IAAA;AAmBH,WAAO;AAAA,MACL,QAAQ;AAAA,QACN,GAAGV;AAAA,QACH,SAASQ;AAAA,QACT,UAAUC;AAAA,QACV,QArBiB,MAAyC;AAC5D,cAAI,CAAC,MAAM,QAAQT,EAAO,KAAK;AAC7B,mBAAOA,EAAO;AAGhB,gBAAMY,IAAgBJ,IAClBR,EAAO,MAAM,KAAK,CAAC,MAAM,EAAE,SAASQ,CAAc,IAClDR,EAAO,MAAM,CAAC;AAElB,cAAI,CAACY;AACH,kBAAM,IAAI,MAAM,+BAA+BJ,CAAc,EAAE;AAGjE,iBAAOI,EAAc;AAAA,QACvB,GAOW;AAAA,MAAa;AAAA,IACtB;AAAA,EAEJ,GAAG,CAACZ,GAAQF,GAAUC,CAAO,CAAC;AAE9B,SACEc,gBAAAA,EAAAA,IAACC,KAAkB,OAAAZ,GACjB,UAAAW,gBAAAA,EAAAA,IAACE,KAAgB,QAAAd,GACf,UAAAY,gBAAAA,EAAAA,IAACG,GAAA,CAAA,CAAO,EAAA,CACV,EAAA,CACF;AAEJ;"}
1
+ {"version":3,"file":"OasProvider-BQ60YgAd.js","sources":["../src/lib/plugins/openapi/OasProvider.tsx"],"sourcesContent":["import { useMemo } from \"react\";\nimport { Outlet } from \"react-router\";\nimport { joinUrl } from \"../../util/joinUrl.js\";\nimport type { GraphQLClient } from \"./client/GraphQLClient.js\";\nimport { GraphQLProvider } from \"./client/GraphQLContext.js\";\nimport { OasConfigProvider } from \"./context.js\";\nimport type { OasPluginConfig } from \"./interfaces.js\";\nimport { getVersionMetadata } from \"./util/getRoutes.js\";\n\nexport const OasProvider = ({\n basePath,\n version,\n config,\n client,\n}: {\n basePath: string;\n version?: string;\n config: OasPluginConfig;\n client: GraphQLClient;\n}) => {\n const value = useMemo(() => {\n const {\n versions: availableVersions,\n labels,\n downloadUrls,\n } = getVersionMetadata(config);\n const currentVersion = version ?? availableVersions.at(0);\n\n const versionLinks = Object.fromEntries(\n availableVersions.map((id) => [\n id,\n {\n path: joinUrl(basePath, id),\n label: labels[id] ?? id,\n downloadUrl: downloadUrls[id],\n },\n ]),\n );\n\n const resolveInput = (): string | (() => Promise<unknown>) => {\n if (!Array.isArray(config.input)) {\n return config.input;\n }\n\n const versionConfig = currentVersion\n ? config.input.find((v) => v.path === currentVersion)\n : config.input[0];\n\n if (!versionConfig) {\n throw new Error(`No input found for version: ${currentVersion}`);\n }\n\n return versionConfig.input;\n };\n\n return {\n config: {\n ...config,\n version: currentVersion,\n versions: versionLinks,\n input: resolveInput(),\n },\n };\n }, [config, basePath, version]);\n\n return (\n <OasConfigProvider value={value}>\n <GraphQLProvider client={client}>\n <Outlet />\n </GraphQLProvider>\n </OasConfigProvider>\n );\n};\n"],"names":["OasProvider","basePath","version","config","client","value","useMemo","availableVersions","labels","downloadUrls","getVersionMetadata","currentVersion","versionLinks","id","joinUrl","versionConfig","jsx","OasConfigProvider","GraphQLProvider","Outlet"],"mappings":";;;;;AASO,MAAMA,IAAc,CAAC;AAAA,EAC1B,UAAAC;AAAA,EACA,SAAAC;AAAA,EACA,QAAAC;AAAA,EACA,QAAAC;AACF,MAKM;AACJ,QAAMC,IAAQC,EAAQ,MAAM;AAC1B,UAAM;AAAA,MACJ,UAAUC;AAAA,MACV,QAAAC;AAAA,MACA,cAAAC;AAAA,IAAA,IACEC,EAAmBP,CAAM,GACvBQ,IAAiBT,KAAWK,EAAkB,GAAG,CAAC,GAElDK,IAAe,OAAO;AAAA,MAC1BL,EAAkB,IAAI,CAACM,MAAO;AAAA,QAC5BA;AAAA,QACA;AAAA,UACE,MAAMC,EAAQb,GAAUY,CAAE;AAAA,UAC1B,OAAOL,EAAOK,CAAE,KAAKA;AAAA,UACrB,aAAaJ,EAAaI,CAAE;AAAA,QAAA;AAAA,MAC9B,CACD;AAAA,IAAA;AAmBH,WAAO;AAAA,MACL,QAAQ;AAAA,QACN,GAAGV;AAAA,QACH,SAASQ;AAAA,QACT,UAAUC;AAAA,QACV,QArBiB,MAAyC;AAC5D,cAAI,CAAC,MAAM,QAAQT,EAAO,KAAK;AAC7B,mBAAOA,EAAO;AAGhB,gBAAMY,IAAgBJ,IAClBR,EAAO,MAAM,KAAK,CAAC,MAAM,EAAE,SAASQ,CAAc,IAClDR,EAAO,MAAM,CAAC;AAElB,cAAI,CAACY;AACH,kBAAM,IAAI,MAAM,+BAA+BJ,CAAc,EAAE;AAGjE,iBAAOI,EAAc;AAAA,QACvB,GAOW;AAAA,MAAa;AAAA,IACtB;AAAA,EAEJ,GAAG,CAACZ,GAAQF,GAAUC,CAAO,CAAC;AAE9B,SACEc,gBAAAA,EAAAA,IAACC,KAAkB,OAAAZ,GACjB,UAAAW,gBAAAA,EAAAA,IAACE,KAAgB,QAAAd,GACf,UAAAY,gBAAAA,EAAAA,IAACG,GAAA,CAAA,CAAO,EAAA,CACV,EAAA,CACF;AAEJ;"}
@@ -1,17 +1,19 @@
1
1
  import { j as l } from "./jsx-runtime-BzflLqGi.js";
2
- import { u as ya, e as Va } from "./useSuspenseQuery-CSB_rVek.js";
2
+ import { g as Va } from "./useQuery-ht7aWJ3S.js";
3
+ import { u as ya } from "./useSuspenseQuery-DQH4Bmc2.js";
3
4
  import { H as Ja } from "./index.esm-Ca5zvoff.js";
4
5
  import { DownloadIcon as Da, ChevronDownIcon as ga, ExternalLinkIcon as Ie, CopyIcon as kr, ChevronsUpDownIcon as lt, CheckIcon as va, MinusIcon as Qa, PlusIcon as Ka, InfoIcon as xa, ChevronsDownUpIcon as qr } from "lucide-react";
5
6
  import { b as Ya, d as Xa, u as Za } from "./chunk-EPOLDU6W-C6C8jAwd.js";
6
- import { u as ct, a as Sr, d as Je, e as ba, f as Or, P as eo, C as Er, b as Rr, c as Ar, h as to, U as ro } from "./index-CyIW9rHv.js";
7
- import { S as no, a as ao, b as oo, c as io, e as so } from "./Secret-BDBqq4p3.js";
7
+ import { u as ct, a as Sr, d as Je, e as ba, f as Or, P as eo, C as Er, b as Rr, c as Ar, h as to, U as ro } from "./index-Bc2mE-53.js";
8
+ import { S as ja, a as no, b as ao, c as oo, d as io, f as so } from "./Secret-DUpgv4V3.js";
8
9
  import { C as lo } from "./CategoryHeading-DhmodDcq.js";
9
- import { b as co, a as uo, h as po } from "./ZudokuContext-BBI06sOx.js";
10
- import { I as Ce, M as Ue, T as fo, H as Me, g as ja, j as wa, k as $a, l as Sa, c as Oa, b as ho } from "./Zudoku-DUsdmPME.js";
11
- import { S as Ir, i as mo, a as yo, E as Yr, b as go, c as vo, g as xo, P as Tr } from "./SchemaView-D2k6ZJck.js";
12
- import { C as bo, a as jo, P as wo } from "./ClaudeLogo-C6q-Xn_l.js";
10
+ import { a as co, e as uo } from "./ZudokuContext-CYyb_PB_.js";
11
+ import { I as Ce, M as Ue, T as po, H as Me, g as wa, j as $a, k as Sa, l as Oa, b as fo, c as Yr } from "./Zudoku-iyiXgWFY.js";
12
+ import { S as Ir, i as ho, a as mo, E as Xr, b as yo, c as go, g as vo, P as Tr } from "./SchemaView-D4marpgk.js";
13
+ import { C as xo, a as bo, P as jo } from "./ClaudeLogo-Br8C_vTq.js";
13
14
  import { Button as Ne } from "./ui/Button.js";
14
- import { useTransition as Ta, useState as ge, Fragment as $o, useRef as So, useEffect as Cr, useMemo as Oo } from "react";
15
+ import { useTransition as Ta, useState as ge, Fragment as wo, useRef as $o, useEffect as Cr, useMemo as So } from "react";
16
+ import { u as Oo } from "./ZudokuReactContext-DGJAP1sN.js";
15
17
  import "./index-DAWHN3cH.js";
16
18
  import { Slot as To } from "@radix-ui/react-slot";
17
19
  import { c as Ca } from "./index-DI5SPFK9.js";
@@ -19,11 +21,10 @@ import { c as fe } from "./cn-5-Gd1Dss.js";
19
21
  import "@radix-ui/react-separator";
20
22
  import { D as Co, a as Po, b as No, c as Ze } from "./DropdownMenu-DN0jNrjj.js";
21
23
  import { u as ko } from "./useCopyToClipboard-B_085nfO.js";
22
- import { S as Xr } from "./Separator-BXt1LYnm.js";
23
24
  import * as et from "@radix-ui/react-tabs";
24
25
  import { Callout as Zr } from "./ui/Callout.js";
25
26
  import { Card as qo } from "./ui/Card.js";
26
- import { S as at } from "./SyntaxHighlight-hZOFnYl0.js";
27
+ import { S as at } from "./SyntaxHighlight-BMu0b_hF.js";
27
28
  import { Tabs as Eo, TabsList as Ro, TabsTrigger as tt, TabsContent as rt } from "./ui/Tabs.js";
28
29
  import { VisuallyHidden as Ao } from "@radix-ui/react-visually-hidden";
29
30
  import { Frame as Io, FramePanel as _o } from "./ui/Frame.js";
@@ -125,7 +126,7 @@ const Jo = ({
125
126
  window.open(`https://claude.ai/new?q=${a}`, "_blank");
126
127
  },
127
128
  children: [
128
- /* @__PURE__ */ l.jsx(bo, { className: "size-4" }),
129
+ /* @__PURE__ */ l.jsx(xo, { className: "size-4" }),
129
130
  "Use in Claude"
130
131
  ]
131
132
  }
@@ -140,7 +141,7 @@ const Jo = ({
140
141
  window.open(`https://chatgpt.com/?q=${a}`, "_blank");
141
142
  },
142
143
  children: [
143
- /* @__PURE__ */ l.jsx(jo, { className: "size-4" }),
144
+ /* @__PURE__ */ l.jsx(bo, { className: "size-4" }),
144
145
  "Use in ChatGPT"
145
146
  ]
146
147
  }
@@ -454,7 +455,7 @@ const rn = fe, Zo = ({
454
455
  /* @__PURE__ */ l.jsx(tt, { value: "cursor", children: "Cursor" }),
455
456
  /* @__PURE__ */ l.jsx(tt, { value: "vscode", children: "VS Code" })
456
457
  ] }),
457
- /* @__PURE__ */ l.jsxs(fo, { className: "text-sm max-w-full", children: [
458
+ /* @__PURE__ */ l.jsxs(po, { className: "text-sm max-w-full", children: [
458
459
  /* @__PURE__ */ l.jsxs(rt, { value: "claude", className: "space-y-3", children: [
459
460
  /* @__PURE__ */ l.jsxs("ol", { children: [
460
461
  /* @__PURE__ */ l.jsxs("li", { children: [
@@ -622,7 +623,7 @@ const rn = fe, Zo = ({
622
623
  group: n,
623
624
  id: r
624
625
  }) => {
625
- const a = ti(e), [c, i] = ge(!1), t = a.type === "object" || mo(a) && "items" in a && a.items?.type === "object", o = !!(e.description || a.description || a.type === "array" && a.items?.enum || a.enum || a.example !== void 0 || a.default !== void 0);
626
+ const a = ti(e), [c, i] = ge(!1), t = a.type === "object" || ho(a) && "items" in a && a.items?.type === "object", o = !!(e.description || a.description || a.type === "array" && a.items?.enum || a.enum || a.example !== void 0 || a.default !== void 0);
626
627
  return /* @__PURE__ */ l.jsxs(Uo, { children: [
627
628
  /* @__PURE__ */ l.jsxs(en, { className: "gap-y-2", children: [
628
629
  /* @__PURE__ */ l.jsxs("div", { children: [
@@ -652,7 +653,7 @@ const rn = fe, Zo = ({
652
653
  }
653
654
  ) : e.name }) }),
654
655
  /* @__PURE__ */ l.jsx(
655
- yo,
656
+ mo,
656
657
  {
657
658
  className: "inline",
658
659
  schema: a,
@@ -673,8 +674,8 @@ const rn = fe, Zo = ({
673
674
  className: "prose-sm"
674
675
  }
675
676
  ),
676
- a.type === "array" && a.items?.enum ? /* @__PURE__ */ l.jsx(Yr, { values: a.items.enum }) : a.enum && /* @__PURE__ */ l.jsx(Yr, { values: a.enum }),
677
- /* @__PURE__ */ l.jsx(go, { schema: a })
677
+ a.type === "array" && a.items?.enum ? /* @__PURE__ */ l.jsx(Xr, { values: a.items.enum }) : a.enum && /* @__PURE__ */ l.jsx(Xr, { values: a.enum }),
678
+ /* @__PURE__ */ l.jsx(yo, { schema: a })
678
679
  ] })
679
680
  ] }),
680
681
  t && /* @__PURE__ */ l.jsx(Fo, { className: "self-start", children: /* @__PURE__ */ l.jsx(
@@ -729,7 +730,7 @@ const rn = fe, Zo = ({
729
730
  ]
730
731
  }
731
732
  ),
732
- /* @__PURE__ */ l.jsx(Io, { children: /* @__PURE__ */ l.jsx(_o, { className: "p-0!", children: /* @__PURE__ */ l.jsx(Ho, { className: "overflow-clip", children: c.map((i, t) => /* @__PURE__ */ l.jsxs($o, { children: [
733
+ /* @__PURE__ */ l.jsx(Io, { children: /* @__PURE__ */ l.jsx(_o, { className: "p-0!", children: /* @__PURE__ */ l.jsx(Ho, { className: "overflow-clip", children: c.map((i, t) => /* @__PURE__ */ l.jsxs(wo, { children: [
733
734
  t > 0 && /* @__PURE__ */ l.jsx(Mo, {}),
734
735
  /* @__PURE__ */ l.jsx(
735
736
  ri,
@@ -746,7 +747,7 @@ const rn = fe, Zo = ({
746
747
  threshold: n,
747
748
  root: r
748
749
  } = {}) => {
749
- const [a, c] = ge(!1), i = So(null);
750
+ const [a, c] = ge(!1), i = $o(null);
750
751
  return Cr(() => {
751
752
  const t = new IntersectionObserver(
752
753
  ([s]) => {
@@ -823,13 +824,13 @@ const rn = fe, Zo = ({
823
824
  }) => /* @__PURE__ */ l.jsxs(ut, { children: [
824
825
  /* @__PURE__ */ l.jsx(pt, { className: "text-xs flex justify-between items-center", children: /* @__PURE__ */ l.jsxs("div", { className: "flex items-center gap-1.5", children: [
825
826
  /* @__PURE__ */ l.jsx("span", { className: "font-medium", children: "Example Request Body" }),
826
- /* @__PURE__ */ l.jsx(ja, { children: /* @__PURE__ */ l.jsxs(wa, { children: [
827
- /* @__PURE__ */ l.jsx($a, { asChild: !0, children: /* @__PURE__ */ l.jsx(xa, { size: 13 }) }),
828
- /* @__PURE__ */ l.jsx(Sa, { children: "This example is auto-generated from the schema." })
827
+ /* @__PURE__ */ l.jsx(wa, { children: /* @__PURE__ */ l.jsxs($a, { children: [
828
+ /* @__PURE__ */ l.jsx(Sa, { asChild: !0, children: /* @__PURE__ */ l.jsx(xa, { size: 13 }) }),
829
+ /* @__PURE__ */ l.jsx(Oa, { children: "This example is auto-generated from the schema." })
829
830
  ] }) })
830
831
  ] }) }),
831
832
  /* @__PURE__ */ l.jsx(Ur, { className: "p-0", children: r && !n ? /* @__PURE__ */ l.jsx(_r, { code: e }) : /* @__PURE__ */ l.jsx(
832
- Oa,
833
+ ja,
833
834
  {
834
835
  embedded: !0,
835
836
  language: "json",
@@ -1036,9 +1037,9 @@ const rn = fe, Zo = ({
1036
1037
  }
1037
1038
  ) }),
1038
1039
  "Example Responses",
1039
- c && /* @__PURE__ */ l.jsx(ja, { children: /* @__PURE__ */ l.jsxs(wa, { children: [
1040
- /* @__PURE__ */ l.jsx($a, { asChild: !0, children: /* @__PURE__ */ l.jsx(xa, { size: 13 }) }),
1041
- /* @__PURE__ */ l.jsx(Sa, { children: "This example is auto-generated from the schema." })
1040
+ c && /* @__PURE__ */ l.jsx(wa, { children: /* @__PURE__ */ l.jsxs($a, { children: [
1041
+ /* @__PURE__ */ l.jsx(Sa, { asChild: !0, children: /* @__PURE__ */ l.jsx(xa, { size: 13 }) }),
1042
+ /* @__PURE__ */ l.jsx(Oa, { children: "This example is auto-generated from the schema." })
1042
1043
  ] }) })
1043
1044
  ] }),
1044
1045
  /* @__PURE__ */ l.jsx("div", { className: "group-data-[state=closed]/collapsible:invisible", children: /* @__PURE__ */ l.jsx(
@@ -5121,7 +5122,7 @@ const fl = (e) => {
5121
5122
  }
5122
5123
  return r ? r[0] : "";
5123
5124
  }, Pe = (e, n) => {
5124
- if (!e || vo(e))
5125
+ if (!e || go(e))
5125
5126
  return null;
5126
5127
  if (e.example !== void 0)
5127
5128
  return e.example;
@@ -5231,7 +5232,7 @@ const yl = [
5231
5232
  globalSelectedServer: r,
5232
5233
  shouldLazyHighlight: a
5233
5234
  }) => {
5234
- const { options: c } = ct(), i = co(), t = uo(), o = Ha(e.method), [s, u] = Ya(), [, p] = Ta(), d = c?.supportedLanguages ?? yl, m = s.get("lang") ?? c?.examplesLanguage ?? "shell", y = d.find((O) => O.value === m)?.value ?? d.at(0)?.value ?? "shell", j = e.requestBody?.content, b = j && c?.transformExamples ? c.transformExamples({
5235
+ const { options: c } = ct(), i = Oo(), t = co(), o = Ha(e.method), [s, u] = Ya(), [, p] = Ta(), d = c?.supportedLanguages ?? yl, m = s.get("lang") ?? c?.examplesLanguage ?? "shell", y = d.find((O) => O.value === m)?.value ?? d.at(0)?.value ?? "shell", j = e.requestBody?.content, b = j && c?.transformExamples ? c.transformExamples({
5235
5236
  auth: i,
5236
5237
  type: "request",
5237
5238
  operation: e,
@@ -5259,7 +5260,7 @@ const yl = [
5259
5260
  }
5260
5261
  )
5261
5262
  }
5262
- ), T = r || e.servers.at(0)?.url || "", x = Oo(() => {
5263
+ ), T = r || e.servers.at(0)?.url || "", x = So(() => {
5263
5264
  const O = c?.generateCodeSnippet?.({
5264
5265
  selectedLang: y,
5265
5266
  selectedServer: T,
@@ -5345,7 +5346,7 @@ const yl = [
5345
5346
  ] })
5346
5347
  ] }) }),
5347
5348
  /* @__PURE__ */ l.jsx(Ur, { children: a && !A ? /* @__PURE__ */ l.jsx(_r, { code: x ?? "" }) : /* @__PURE__ */ l.jsx(
5348
- Oa,
5349
+ ja,
5349
5350
  {
5350
5351
  embedded: !0,
5351
5352
  language: y,
@@ -5415,7 +5416,7 @@ const yl = [
5415
5416
  globalSelectedServer: n,
5416
5417
  shouldLazyHighlight: r
5417
5418
  }) => {
5418
- const a = Go(bl, e), c = xo(
5419
+ const a = Go(bl, e), c = vo(
5419
5420
  a.parameters ?? [],
5420
5421
  (d) => d.in
5421
5422
  ), { options: i } = ct(), t = n || a.servers.at(0)?.url, o = a.responses.at(0), [s, u] = ge(o?.statusCode), p = a.extensions?.["x-mcp-server"] !== void 0;
@@ -5441,7 +5442,7 @@ const yl = [
5441
5442
  ),
5442
5443
  !p && /* @__PURE__ */ l.jsxs("div", { className: "text-sm flex gap-2 font-mono col-span-full", children: [
5443
5444
  /* @__PURE__ */ l.jsx("span", { className: Ha(a.method), children: a.method.toUpperCase() }),
5444
- /* @__PURE__ */ l.jsxs(ho, { className: "max-w-full truncate flex cursor-pointer", children: [
5445
+ /* @__PURE__ */ l.jsxs(fo, { className: "max-w-full truncate flex cursor-pointer", children: [
5445
5446
  t && /* @__PURE__ */ l.jsx("div", { className: "text-neutral-400 dark:text-neutral-500 truncate", children: t.replace(/\/$/, "") }),
5446
5447
  /* @__PURE__ */ l.jsx("div", { className: "text-neutral-900 dark:text-neutral-200", children: a.path })
5447
5448
  ] })
@@ -5480,7 +5481,7 @@ const yl = [
5480
5481
  d
5481
5482
  ) : []
5482
5483
  ),
5483
- St(a.requestBody?.content?.at(0)?.schema, () => /* @__PURE__ */ l.jsx(Xr, { className: "my-4" })),
5484
+ St(a.requestBody?.content?.at(0)?.schema, () => /* @__PURE__ */ l.jsx(Yr, { className: "my-4" })),
5484
5485
  St(
5485
5486
  a.requestBody?.content?.at(0)?.schema,
5486
5487
  (d) => /* @__PURE__ */ l.jsxs("div", { className: "flex flex-col gap-4", children: [
@@ -5505,7 +5506,7 @@ const yl = [
5505
5506
  /* @__PURE__ */ l.jsx(Ir, { schema: d })
5506
5507
  ] })
5507
5508
  ),
5508
- /* @__PURE__ */ l.jsx(Xr, { className: "my-4" }),
5509
+ /* @__PURE__ */ l.jsx(Yr, { className: "my-4" }),
5509
5510
  a.responses.length > 0 && /* @__PURE__ */ l.jsxs(l.Fragment, { children: [
5510
5511
  /* @__PURE__ */ l.jsxs(Me, { level: 3, id: `${a.slug}/responses`, children: [
5511
5512
  a.summary && /* @__PURE__ */ l.jsxs(Tr, { children: [
@@ -5666,7 +5667,7 @@ const bl = Je(
5666
5667
  }
5667
5668
  }
5668
5669
  `
5669
- ), $l = 30, tc = ({
5670
+ ), $l = 30, rc = ({
5670
5671
  tag: e,
5671
5672
  untagged: n
5672
5673
  }) => {
@@ -5684,7 +5685,7 @@ const bl = Je(
5684
5685
  ...f,
5685
5686
  enabled: typeof window < "u",
5686
5687
  notifyOnChangeProps: []
5687
- }), po(), !p.tag)
5688
+ }), uo(), !p.tag)
5688
5689
  return /* @__PURE__ */ l.jsxs("div", { className: "flex flex-col h-full items-center justify-center text-center", children: [
5689
5690
  /* @__PURE__ */ l.jsx("div", { className: "text-muted-foreground font-medium", children: "No operations found" }),
5690
5691
  /* @__PURE__ */ l.jsx("div", { className: "mt-2 text-sm text-muted-foreground", children: "This API doesn't have any operations defined yet." })
@@ -5810,14 +5811,14 @@ const bl = Je(
5810
5811
  ),
5811
5812
  /* @__PURE__ */ l.jsx("hr", { className: "my-10" })
5812
5813
  ] }, L.slug)),
5813
- /* @__PURE__ */ l.jsx(wo, { className: "mb-4", ...A })
5814
+ /* @__PURE__ */ l.jsx(jo, { className: "mb-4", ...A })
5814
5815
  ] })
5815
5816
  ]
5816
5817
  }
5817
5818
  );
5818
5819
  };
5819
5820
  export {
5820
- tc as OperationList,
5821
+ rc as OperationList,
5821
5822
  bl as OperationsFragment
5822
5823
  };
5823
- //# sourceMappingURL=OperationList-CZ4OK8Pm.js.map
5824
+ //# sourceMappingURL=OperationList-D31urxqy.js.map