zudoku 0.55.0 → 0.56.0

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 (137) hide show
  1. package/dist/app/main.d.ts +1 -1
  2. package/dist/app/main.js +11 -4
  3. package/dist/app/main.js.map +1 -1
  4. package/dist/config/validators/InputNavigationSchema.d.ts +4 -0
  5. package/dist/config/validators/InputNavigationSchema.js +1 -0
  6. package/dist/config/validators/InputNavigationSchema.js.map +1 -1
  7. package/dist/config/validators/validate.d.ts +1 -0
  8. package/dist/config/validators/validate.js +1 -0
  9. package/dist/config/validators/validate.js.map +1 -1
  10. package/dist/flat-config.d.ts +2 -0
  11. package/dist/index.d.ts +1 -0
  12. package/dist/index.js +1 -0
  13. package/dist/index.js.map +1 -1
  14. package/dist/lib/components/BuildCheck.js +7 -0
  15. package/dist/lib/components/BuildCheck.js.map +1 -1
  16. package/dist/lib/components/Header.js +1 -1
  17. package/dist/lib/components/Header.js.map +1 -1
  18. package/dist/lib/components/Layout.js +4 -7
  19. package/dist/lib/components/Layout.js.map +1 -1
  20. package/dist/lib/components/Meta.d.ts +2 -0
  21. package/dist/lib/components/Meta.js +11 -0
  22. package/dist/lib/components/Meta.js.map +1 -0
  23. package/dist/lib/components/context/ZudokuContext.js +1 -1
  24. package/dist/lib/components/context/ZudokuContext.js.map +1 -1
  25. package/dist/lib/components/index.d.ts +1 -0
  26. package/dist/lib/components/index.js +2 -0
  27. package/dist/lib/components/index.js.map +1 -1
  28. package/dist/lib/components/navigation/NavigationCategory.js +1 -1
  29. package/dist/lib/components/navigation/NavigationCategory.js.map +1 -1
  30. package/dist/lib/components/navigation/NavigationItem.js +3 -2
  31. package/dist/lib/components/navigation/NavigationItem.js.map +1 -1
  32. package/dist/lib/components/navigation/utils.js +12 -11
  33. package/dist/lib/components/navigation/utils.js.map +1 -1
  34. package/dist/lib/core/ZudokuContext.d.ts +1 -0
  35. package/dist/lib/core/ZudokuContext.js.map +1 -1
  36. package/dist/lib/plugins/api-keys/SettingsApiKeys.js +1 -1
  37. package/dist/lib/plugins/api-keys/SettingsApiKeys.js.map +1 -1
  38. package/dist/lib/plugins/custom-pages/index.js +3 -0
  39. package/dist/lib/plugins/custom-pages/index.js.map +1 -1
  40. package/dist/lib/ui/CodeBlock.js +8 -8
  41. package/dist/lib/ui/CodeBlock.js.map +1 -1
  42. package/dist/lib/ui/Dialog.js +2 -2
  43. package/dist/lib/ui/Dialog.js.map +1 -1
  44. package/dist/vite/plugin-mdx.js +1 -1
  45. package/dist/vite/plugin-mdx.js.map +1 -1
  46. package/dist/vite/sitemap.js +10 -9
  47. package/dist/vite/sitemap.js.map +1 -1
  48. package/lib/{CodeBlock-NFCmSWOK.js → CodeBlock-yJjjRwj-.js} +17 -17
  49. package/lib/CodeBlock-yJjjRwj-.js.map +1 -0
  50. package/lib/{Command-BYukybsa.js → Command-CfgGXMfJ.js} +2 -2
  51. package/lib/{Command-BYukybsa.js.map → Command-CfgGXMfJ.js.map} +1 -1
  52. package/lib/Dialog-B7YnrNnG.js +114 -0
  53. package/lib/Dialog-B7YnrNnG.js.map +1 -0
  54. package/lib/{MdxPage-D1XC3kwu.js → MdxPage-D49lfheg.js} +7 -7
  55. package/lib/{MdxPage-D1XC3kwu.js.map → MdxPage-D49lfheg.js.map} +1 -1
  56. package/lib/{OAuthErrorPage-CSYvzsNJ.js → OAuthErrorPage-COKL9zOi.js} +6 -6
  57. package/lib/{OAuthErrorPage-CSYvzsNJ.js.map → OAuthErrorPage-COKL9zOi.js.map} +1 -1
  58. package/lib/{OasProvider-Ch3fGSNb.js → OasProvider-CCv_-asV.js} +2 -2
  59. package/lib/{OasProvider-Ch3fGSNb.js.map → OasProvider-CCv_-asV.js.map} +1 -1
  60. package/lib/{OperationList-Boc5tg5n.js → OperationList-DkS0B0y1.js} +11 -11
  61. package/lib/{OperationList-Boc5tg5n.js.map → OperationList-DkS0B0y1.js.map} +1 -1
  62. package/lib/{Pagination-DdqTabDR.js → Pagination-VfR2DCXf.js} +2 -2
  63. package/lib/{Pagination-DdqTabDR.js.map → Pagination-VfR2DCXf.js.map} +1 -1
  64. package/lib/{RouteGuard-D17dUEM_.js → RouteGuard-CSi9-hSR.js} +4 -4
  65. package/lib/{RouteGuard-D17dUEM_.js.map → RouteGuard-CSi9-hSR.js.map} +1 -1
  66. package/lib/{SchemaList-BbkMdqgT.js → SchemaList-B7ezc5Uy.js} +8 -8
  67. package/lib/{SchemaList-BbkMdqgT.js.map → SchemaList-B7ezc5Uy.js.map} +1 -1
  68. package/lib/{SchemaView-Bo48Qzuu.js → SchemaView-BuL-ycaR.js} +4 -4
  69. package/lib/{SchemaView-Bo48Qzuu.js.map → SchemaView-BuL-ycaR.js.map} +1 -1
  70. package/lib/{Select-BgBGJ5cF.js → Select-B9h5k2Pz.js} +3 -3
  71. package/lib/{Select-BgBGJ5cF.js.map → Select-B9h5k2Pz.js.map} +1 -1
  72. package/lib/{SignUp-ckLqfC6h.js → SignUp-Cn_gZ7UN.js} +3 -3
  73. package/lib/{SignUp-ckLqfC6h.js.map → SignUp-Cn_gZ7UN.js.map} +1 -1
  74. package/lib/{Slot-CkWazhCn.js → Slot-BFCJzl5J.js} +365 -365
  75. package/lib/{Slot-CkWazhCn.js.map → Slot-BFCJzl5J.js.map} +1 -1
  76. package/lib/{SyntaxHighlight-DQ64ObSH.js → SyntaxHighlight-CSW4eaIJ.js} +313 -313
  77. package/lib/SyntaxHighlight-CSW4eaIJ.js.map +1 -0
  78. package/lib/{Toc-cVDQRzE6.js → Toc-B9K7a2FS.js} +2 -2
  79. package/lib/{Toc-cVDQRzE6.js.map → Toc-B9K7a2FS.js.map} +1 -1
  80. package/lib/{ZudokuContext-Coxa0DfE.js → ZudokuContext-mDDq1hft.js} +76 -68
  81. package/lib/{ZudokuContext-Coxa0DfE.js.map → ZudokuContext-mDDq1hft.js.map} +1 -1
  82. package/lib/{circular-CshZkiOV.js → circular-BMUvC5RK.js} +2 -2
  83. package/lib/{circular-CshZkiOV.js.map → circular-BMUvC5RK.js.map} +1 -1
  84. package/lib/{createServer-CHAS8ilN.js → createServer-I8dX2VSu.js} +4 -4
  85. package/lib/{createServer-CHAS8ilN.js.map → createServer-I8dX2VSu.js.map} +1 -1
  86. package/lib/{errors-BQk2rSTP.js → errors-D2Qdkul6.js} +2 -2
  87. package/lib/{errors-BQk2rSTP.js.map → errors-D2Qdkul6.js.map} +1 -1
  88. package/lib/{hook-DEPqwjke.js → hook-CGx8MPrU.js} +2 -2
  89. package/lib/{hook-DEPqwjke.js.map → hook-CGx8MPrU.js.map} +1 -1
  90. package/lib/{index-BruDSPOJ.js → index-Cc70HIQT.js} +106 -101
  91. package/lib/index-Cc70HIQT.js.map +1 -0
  92. package/lib/{index-BB_X3XYb.js → index-ChOC1gfC.js} +2 -2
  93. package/lib/{index-BB_X3XYb.js.map → index-ChOC1gfC.js.map} +1 -1
  94. package/lib/{index-BIP4zJwn.js → index-DZqSbZzE.js} +16 -16
  95. package/lib/{index-BIP4zJwn.js.map → index-DZqSbZzE.js.map} +1 -1
  96. package/lib/ui/CodeBlock.js +1 -1
  97. package/lib/ui/Command.js +1 -1
  98. package/lib/ui/Dialog.js +56 -41
  99. package/lib/ui/Dialog.js.map +1 -1
  100. package/lib/ui/SyntaxHighlight.js +3 -3
  101. package/lib/zudoku.auth-auth0.js +1 -1
  102. package/lib/zudoku.auth-azureb2c.js +5 -5
  103. package/lib/zudoku.auth-clerk.js +2 -2
  104. package/lib/zudoku.auth-openid.js +5 -5
  105. package/lib/zudoku.auth-supabase.js +2 -2
  106. package/lib/zudoku.components.js +19 -18
  107. package/lib/zudoku.hooks.js +3 -3
  108. package/lib/zudoku.plugin-api-catalog.js +6 -6
  109. package/lib/zudoku.plugin-api-keys.js +7 -10
  110. package/lib/zudoku.plugin-api-keys.js.map +1 -1
  111. package/lib/zudoku.plugin-custom-pages.js +8 -5
  112. package/lib/zudoku.plugin-custom-pages.js.map +1 -1
  113. package/lib/zudoku.plugin-markdown.js +1 -1
  114. package/lib/zudoku.plugin-openapi.js +3 -3
  115. package/lib/zudoku.plugin-search-pagefind.js +5 -5
  116. package/package.json +6 -6
  117. package/src/app/main.tsx +18 -4
  118. package/src/lib/components/BuildCheck.tsx +10 -0
  119. package/src/lib/components/Header.tsx +3 -2
  120. package/src/lib/components/Layout.tsx +2 -21
  121. package/src/lib/components/Meta.tsx +32 -0
  122. package/src/lib/components/context/ZudokuContext.ts +1 -1
  123. package/src/lib/components/index.ts +2 -0
  124. package/src/lib/components/navigation/NavigationCategory.tsx +1 -1
  125. package/src/lib/components/navigation/NavigationItem.tsx +4 -2
  126. package/src/lib/components/navigation/utils.ts +12 -12
  127. package/src/lib/core/ZudokuContext.ts +1 -0
  128. package/src/lib/plugins/api-keys/SettingsApiKeys.tsx +1 -3
  129. package/src/lib/plugins/custom-pages/index.tsx +3 -0
  130. package/src/lib/ui/CodeBlock.tsx +8 -8
  131. package/src/lib/ui/Dialog.tsx +12 -3
  132. package/lib/CodeBlock-NFCmSWOK.js.map +0 -1
  133. package/lib/Dialog-u9Uz9sTt.js +0 -99
  134. package/lib/Dialog-u9Uz9sTt.js.map +0 -1
  135. package/lib/SyntaxHighlight-DQ64ObSH.js.map +0 -1
  136. package/lib/index-BruDSPOJ.js.map +0 -1
  137. package/src/shiki/langs/vue-vine.js +0 -1
@@ -92,7 +92,7 @@ export const Header = memo(function HeaderInner() {
92
92
  <div className="flex">
93
93
  <Link to={site?.logo?.href ?? "/"}>
94
94
  <div className="flex items-center gap-3.5">
95
- {site?.logo && (
95
+ {site?.logo ? (
96
96
  <>
97
97
  <img
98
98
  src={logoLightSrc}
@@ -109,8 +109,9 @@ export const Header = memo(function HeaderInner() {
109
109
  loading="lazy"
110
110
  />
111
111
  </>
112
+ ) : (
113
+ <span className="font-semibold text-2xl">{site?.title}</span>
112
114
  )}
113
- <span className="font-semibold text-2xl">{site?.title}</span>
114
115
  </div>
115
116
  </Link>
116
117
  </div>
@@ -1,8 +1,6 @@
1
- import { Helmet } from "@zudoku/react-helmet-async";
2
1
  import { Suspense, useEffect, type ReactNode } from "react";
3
- import { Outlet, useLocation } from "react-router";
2
+ import { Outlet } from "react-router";
4
3
  import { cn } from "../util/cn.js";
5
- import { joinUrl } from "../util/joinUrl.js";
6
4
  import { useScrollToAnchor } from "../util/useScrollToAnchor.js";
7
5
  import { useScrollToTop } from "../util/useScrollToTop.js";
8
6
  import { useZudoku } from "./context/ZudokuContext.js";
@@ -19,8 +17,7 @@ const LoadingFallback = () => (
19
17
  );
20
18
 
21
19
  export const Layout = ({ children }: { children?: ReactNode }) => {
22
- const { meta, authentication, options } = useZudoku();
23
- const location = useLocation();
20
+ const { authentication } = useZudoku();
24
21
 
25
22
  useScrollToAnchor();
26
23
  useScrollToTop();
@@ -32,22 +29,6 @@ export const Layout = ({ children }: { children?: ReactNode }) => {
32
29
 
33
30
  return (
34
31
  <>
35
- <Helmet titleTemplate={meta?.title}>
36
- {options.canonicalUrlOrigin && (
37
- <link
38
- rel="canonical"
39
- href={joinUrl(
40
- options.canonicalUrlOrigin,
41
- options.basePath,
42
- location.pathname,
43
- )}
44
- />
45
- )}
46
- {meta?.description && (
47
- <meta name="description" content={meta.description} />
48
- )}
49
- {meta?.favicon && <link rel="icon" href={meta.favicon} />}
50
- </Helmet>
51
32
  <Slot.Target name="layout-before-head" />
52
33
  <Header />
53
34
  <Slot.Target name="layout-after-head" />
@@ -0,0 +1,32 @@
1
+ import { Helmet } from "@zudoku/react-helmet-async";
2
+ import type { PropsWithChildren } from "react";
3
+ import { useLocation } from "react-router";
4
+ import { joinUrl } from "../util/joinUrl.js";
5
+ import { useZudoku } from "./context/ZudokuContext.js";
6
+
7
+ export const Meta = ({ children }: PropsWithChildren) => {
8
+ const { meta, options } = useZudoku();
9
+ const location = useLocation();
10
+
11
+ return (
12
+ <>
13
+ <Helmet titleTemplate={meta?.title} defaultTitle={meta?.defaultTitle}>
14
+ {options.canonicalUrlOrigin && (
15
+ <link
16
+ rel="canonical"
17
+ href={joinUrl(
18
+ options.canonicalUrlOrigin,
19
+ options.basePath,
20
+ location.pathname,
21
+ )}
22
+ />
23
+ )}
24
+ {meta?.description && (
25
+ <meta name="description" content={meta.description} />
26
+ )}
27
+ {meta?.favicon && <link rel="icon" href={meta.favicon} />}
28
+ </Helmet>
29
+ {children}
30
+ </>
31
+ );
32
+ };
@@ -39,7 +39,7 @@ const getItemPath = (item: NavigationItem) => {
39
39
  case "link":
40
40
  return item.to;
41
41
  case "custom-page":
42
- return item.path;
42
+ return joinUrl(item.path);
43
43
  default:
44
44
  return undefined;
45
45
  }
@@ -21,6 +21,7 @@ import { ClientOnly as ClientOnlyImport } from "./ClientOnly.js";
21
21
  import { useZudoku as useZudokuImport } from "./context/ZudokuContext.js";
22
22
  import { Layout as LayoutImport } from "./Layout.js";
23
23
  import { Markdown as MarkdownImport } from "./Markdown.js";
24
+ import { Meta as MetaImport } from "./Meta.js";
24
25
  import { Spinner as SpinnerImport } from "./Spinner.js";
25
26
  import { StatusPage as StatusPageImport } from "./StatusPage.js";
26
27
  import { Typography as TypographyImport } from "./Typography.js";
@@ -43,6 +44,7 @@ export const Link = /*@__PURE__*/ LinkImport;
43
44
  export const BuildCheck = /*@__PURE__*/ BuildCheckImport;
44
45
  export const Zudoku = /*@__PURE__*/ ZudokuImport;
45
46
  export const Typography = /*@__PURE__*/ TypographyImport;
47
+ export const Meta = /*@__PURE__*/ MetaImport;
46
48
 
47
49
  /** @deprecated Import from `zudoku/hooks` instead */
48
50
  export const useMDXComponents = /*@__PURE__*/ useMDXComponentsImport;
@@ -46,7 +46,7 @@ const NavigationCategoryInner = ({
46
46
  }}
47
47
  variant="ghost"
48
48
  size="icon"
49
- className="size-6 hover:bg-[hsl(from_hsl(var(--accent))_h_s_calc(l-5))] hover:dark:bg-[hsl(from_hsl(var(--accent))_h_s_calc(l+5))]"
49
+ className="size-6 hover:bg-[hsl(from_var(--accent)_h_s_calc(l+6*var(--dark)))]"
50
50
  >
51
51
  <ChevronRightIcon
52
52
  size={16}
@@ -114,7 +114,7 @@ export const NavigationItem = ({
114
114
  );
115
115
  case "link":
116
116
  case "custom-page": {
117
- const href = item.type === "link" ? item.to : item.path;
117
+ const href = item.type === "link" ? item.to : joinUrl(item.path);
118
118
  return !href.startsWith("http") ? (
119
119
  <AnchorLink
120
120
  to={{
@@ -124,7 +124,9 @@ export const NavigationItem = ({
124
124
  }}
125
125
  {...{ [DATA_ANCHOR_ATTR]: href.split("#")[1] }}
126
126
  className={navigationListItem({
127
- isActive: href === [location.pathname, activeAnchor].join("#"),
127
+ isActive:
128
+ href ===
129
+ [location.pathname, activeAnchor].filter(Boolean).join("#"),
128
130
  })}
129
131
  onClick={onRequestClose}
130
132
  >
@@ -58,18 +58,18 @@ export const useIsCategoryOpen = (category: NavigationCategory) => {
58
58
  const location = useLocation();
59
59
 
60
60
  return traverseNavigationItem(category, (item) => {
61
- if (item.type === "category" && item.link) {
62
- const categoryLinkPath = joinUrl(item.link.path);
63
- if (categoryLinkPath === location.pathname) {
64
- return true;
65
- }
66
- }
67
-
68
- if (item.type === "doc") {
69
- const docPath = joinUrl(item.path);
70
- if (docPath === location.pathname) {
71
- return true;
72
- }
61
+ switch (item.type) {
62
+ case "category":
63
+ if (!item.link) {
64
+ return undefined;
65
+ }
66
+ return joinUrl(item.link.path) === location.pathname ? true : undefined;
67
+ case "custom-page":
68
+ case "doc":
69
+ return joinUrl(item.path) === location.pathname ? true : undefined;
70
+ case "link":
71
+ default:
72
+ return undefined;
73
73
  }
74
74
  });
75
75
  };
@@ -48,6 +48,7 @@ export type ApiKeyCache = "api-keys";
48
48
 
49
49
  type Metadata = Partial<{
50
50
  title: string;
51
+ defaultTitle?: string;
51
52
  description: string;
52
53
  logo: string;
53
54
  favicon: string;
@@ -183,9 +183,7 @@ export const SettingsApiKeys = ({ service }: { service: ApiKeyService }) => {
183
183
  <Slot.Target name="api-keys-list-page" />
184
184
 
185
185
  <div className="flex justify-between pb-3">
186
- <h1 className="font-medium text-2xl">
187
- API Keys {typeof service.createKey}
188
- </h1>
186
+ <h1 className="font-medium text-2xl">API Keys</h1>
189
187
 
190
188
  {service.createKey && (
191
189
  <Dialog
@@ -20,6 +20,9 @@ export const customPagesPlugin = (
20
20
  customPages.push({
21
21
  path: item.path,
22
22
  element: item.element,
23
+ handle: {
24
+ layout: item.layout ?? "default",
25
+ },
23
26
  });
24
27
  }
25
28
  });
@@ -22,17 +22,17 @@ const IconToLanguageMap: Record<string, RegExp> = {
22
22
  typescript: /(tsx?|typescript)/,
23
23
  javascript: /(jsx?|javascript)/,
24
24
  markdown: /(md|markdown)/,
25
- mdx: /(mdx)/,
26
- json: /(json)/,
27
- yaml: /(yaml)/,
28
- toml: /(toml)/,
29
- bash: /(shell|bash|sh|zsh)/,
25
+ mdx: /mdx/,
26
+ json: /json/,
27
+ yaml: /yaml/,
28
+ toml: /toml/,
29
+ gnubash: /(shell|bash|sh|zsh)/,
30
30
  python: /(py|python)/,
31
- dotnet: /(cs|csharp|vb)/,
31
+ dotnet: /(^cs$|csharp|vb)/,
32
32
  rust: /(rs|rust)/,
33
33
  ruby: /(rb|ruby)/,
34
34
  php: /php/,
35
- html: /html?/,
35
+ html5: /html?/,
36
36
  css: /css/,
37
37
  };
38
38
 
@@ -101,7 +101,7 @@ export const CodeBlock = ({
101
101
  </div>
102
102
  <div
103
103
  className={cn(
104
- "code-block text-sm not-prose scrollbar overflow-x-auto scrollbar [&>code]:p-3 [&>code]:py-2",
104
+ "code-block text-sm not-prose scrollbar overflow-x-auto scrollbar [&_code]:p-3 [&_code]:py-2",
105
105
  props.className,
106
106
  )}
107
107
  ref={ref}
@@ -1,7 +1,7 @@
1
1
  import * as DialogPrimitive from "@radix-ui/react-dialog";
2
2
  import * as React from "react";
3
3
 
4
- import { XIcon } from "lucide-react";
4
+ import { CircleIcon, XIcon } from "lucide-react";
5
5
  import { cn } from "../util/cn.js";
6
6
 
7
7
  const Dialog = DialogPrimitive.Root;
@@ -45,8 +45,17 @@ const DialogContent = React.forwardRef<
45
45
  >
46
46
  {children}
47
47
  {showCloseButton && (
48
- <DialogPrimitive.Close className="absolute left-1 top-1 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground">
49
- <XIcon className="h-3 w-3" strokeWidth={2} />
48
+ <DialogPrimitive.Close className="absolute p-3 group -left-1.5 -top-1.5 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground">
49
+ <CircleIcon
50
+ className="h-2 w-2 transition-all border border-transparent group-hover:border-white/20 rounded-full group-hover:scale-180 group-hover:text-red-400"
51
+ strokeWidth={2}
52
+ fill="currentColor"
53
+ />
54
+ <XIcon
55
+ className="h-2 w-2 absolute top-3 left-3 text-transparent group-hover:text-red-800 transition-colors"
56
+ strokeWidth={2}
57
+ fill="currentColor"
58
+ />
50
59
  <span className="sr-only">Close</span>
51
60
  </DialogPrimitive.Close>
52
61
  )}
@@ -1 +0,0 @@
1
- {"version":3,"file":"CodeBlock-NFCmSWOK.js","sources":["../src/lib/util/useCopyToClipboard.ts","../src/lib/ui/CodeBlock.tsx"],"sourcesContent":["import { useCallback, useState } from \"react\";\n\nexport const useCopyToClipboard = (timeout = 2000) => {\n const [isCopied, setIsCopied] = useState(false);\n\n const copyToClipboard = useCallback(\n (text: string) => {\n void navigator.clipboard.writeText(text);\n setIsCopied(true);\n\n setTimeout(() => setIsCopied(false), timeout);\n },\n [timeout],\n );\n\n return [isCopied, copyToClipboard] as const;\n};\n","import { CheckIcon, CopyIcon } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { useRef } from \"react\";\nimport { cn } from \"../util/cn.js\";\nimport { useCopyToClipboard } from \"../util/useCopyToClipboard.js\";\n\nexport type CodeBlockProps = {\n className?: string;\n noBackground?: boolean;\n wrapLines?: boolean;\n showLanguageIndicator?: boolean;\n language?: string;\n title?: string;\n children?: ReactNode;\n code?: ReactNode;\n showCopy?: \"hover\" | \"always\" | \"never\";\n disabled?: boolean;\n showLineNumbers?: boolean;\n};\n\nconst IconToLanguageMap: Record<string, RegExp> = {\n typescript: /(tsx?|typescript)/,\n javascript: /(jsx?|javascript)/,\n markdown: /(md|markdown)/,\n mdx: /(mdx)/,\n json: /(json)/,\n yaml: /(yaml)/,\n toml: /(toml)/,\n bash: /(shell|bash|sh|zsh)/,\n python: /(py|python)/,\n dotnet: /(cs|csharp|vb)/,\n rust: /(rs|rust)/,\n ruby: /(rb|ruby)/,\n php: /php/,\n html: /html?/,\n css: /css/,\n};\n\nconst getIconUrl = (language?: string) => {\n if (!language) return undefined;\n\n const icon = Object.entries(IconToLanguageMap).find(([_, regex]) =>\n regex.test(language),\n );\n return icon\n ? `https://cdn.simpleicons.org/${icon[0]}/000/fff?viewbox=auto`\n : undefined;\n};\n\nexport const CodeBlock = ({\n children,\n title = \"Code\",\n language,\n showCopy = \"hover\",\n showLanguageIndicator,\n showLineNumbers,\n ...props\n}: CodeBlockProps) => {\n const [isCopied, copyToClipboard] = useCopyToClipboard();\n const ref = useRef<HTMLDivElement>(null);\n\n if (!children) return null;\n\n const iconUrl = showLanguageIndicator ? getIconUrl(language) : undefined;\n\n return (\n <div\n className={cn(\n \"border code-block-wrapper relative group bg-muted/50 rounded-md overflow-hidden\",\n showLineNumbers && \"line-numbers\",\n )}\n >\n <div className=\"border-b flex items-center h-10 font-sans bg-black/2\">\n <div className=\"flex items-center gap-2 flex-1 text-sm w-full px-3\">\n {iconUrl && <img src={iconUrl} className=\"h-3 max-w-4\" />}\n {title}\n </div>{\" \"}\n {showCopy !== \"never\" && (\n <button\n type=\"button\"\n aria-label=\"Copy code\"\n title=\"Copy code\"\n className={cn(\n \"transition px-2 py-2 mx-1 rounded-sm\",\n !isCopied && \"hover:bg-accent hover:brightness-95\",\n )}\n disabled={isCopied}\n onClick={() => {\n if (!ref.current?.textContent) return;\n\n copyToClipboard(ref.current.textContent);\n }}\n >\n {isCopied ? (\n <CheckIcon className=\"text-emerald-600\" size={14} />\n ) : (\n <CopyIcon size={14} />\n )}\n </button>\n )}\n </div>\n <div\n className={cn(\n \"code-block text-sm not-prose scrollbar overflow-x-auto scrollbar [&>code]:p-3 [&>code]:py-2\",\n props.className,\n )}\n ref={ref}\n >\n {children}\n </div>\n </div>\n );\n};\n"],"names":["useCopyToClipboard","timeout","isCopied","setIsCopied","useState","copyToClipboard","useCallback","text","IconToLanguageMap","getIconUrl","language","icon","_","regex","CodeBlock","children","title","showCopy","showLanguageIndicator","showLineNumbers","props","ref","useRef","iconUrl","jsxs","cn","jsx","CheckIcon","CopyIcon"],"mappings":";;;;AAEO,MAAMA,IAAqB,CAACC,IAAU,QAAS;AACpD,QAAM,CAACC,GAAUC,CAAW,IAAIC,EAAS,EAAK,GAExCC,IAAkBC;AAAA,IACtB,CAACC,MAAiB;AAChB,MAAK,UAAU,UAAU,UAAUA,CAAI,GACvCJ,EAAY,EAAI,GAEhB,WAAW,MAAMA,EAAY,EAAK,GAAGF,CAAO;AAAA,IAC9C;AAAA,IACA,CAACA,CAAO;AAAA,EAAA;AAGV,SAAO,CAACC,GAAUG,CAAe;AACnC,GCIMG,IAA4C;AAAA,EAChD,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,KAAK;AACP,GAEMC,IAAa,CAACC,MAAsB;AACxC,MAAI,CAACA,EAAU;AAEf,QAAMC,IAAO,OAAO,QAAQH,CAAiB,EAAE;AAAA,IAAK,CAAC,CAACI,GAAGC,CAAK,MAC5DA,EAAM,KAAKH,CAAQ;AAAA,EAAA;AAErB,SAAOC,IACH,+BAA+BA,EAAK,CAAC,CAAC,0BACtC;AACN,GAEaG,IAAY,CAAC;AAAA,EACxB,UAAAC;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,UAAAN;AAAA,EACA,UAAAO,IAAW;AAAA,EACX,uBAAAC;AAAA,EACA,iBAAAC;AAAA,EACA,GAAGC;AACL,MAAsB;AACpB,QAAM,CAAClB,GAAUG,CAAe,IAAIL,EAAA,GAC9BqB,IAAMC,EAAuB,IAAI;AAEvC,MAAI,CAACP,EAAU,QAAO;AAEtB,QAAMQ,IAAUL,IAAwBT,EAAWC,CAAQ,IAAI;AAE/D,SACEc,gBAAAA,EAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWC;AAAA,QACT;AAAA,QACAN,KAAmB;AAAA,MAAA;AAAA,MAGrB,UAAA;AAAA,QAAAK,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,wDACb,UAAA;AAAA,UAAAA,gBAAAA,EAAAA,KAAC,OAAA,EAAI,WAAU,sDACZ,UAAA;AAAA,YAAAD,KAAWG,gBAAAA,EAAAA,IAAC,OAAA,EAAI,KAAKH,GAAS,WAAU,eAAc;AAAA,YACtDP;AAAA,UAAA,GACH;AAAA,UAAO;AAAA,UACNC,MAAa,WACZS,gBAAAA,EAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAW;AAAA,cACX,OAAM;AAAA,cACN,WAAWD;AAAA,gBACT;AAAA,gBACA,CAACvB,KAAY;AAAA,cAAA;AAAA,cAEf,UAAUA;AAAA,cACV,SAAS,MAAM;AACb,gBAAKmB,EAAI,SAAS,eAElBhB,EAAgBgB,EAAI,QAAQ,WAAW;AAAA,cACzC;AAAA,cAEC,UAAAnB,IACCwB,gBAAAA,EAAAA,IAACC,GAAA,EAAU,WAAU,oBAAmB,MAAM,GAAA,CAAI,IAElDD,gBAAAA,EAAAA,IAACE,GAAA,EAAS,MAAM,GAAA,CAAI;AAAA,YAAA;AAAA,UAAA;AAAA,QAExB,GAEJ;AAAA,QACAF,gBAAAA,EAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACC,WAAWD;AAAA,cACT;AAAA,cACAL,EAAM;AAAA,YAAA;AAAA,YAER,KAAAC;AAAA,YAEC,UAAAN;AAAA,UAAA;AAAA,QAAA;AAAA,MACH;AAAA,IAAA;AAAA,EAAA;AAGN;"}
@@ -1,99 +0,0 @@
1
- import { j as s } from "./jsx-runtime-C5mzlN2N.js";
2
- import * as a from "@radix-ui/react-dialog";
3
- import * as l from "react";
4
- import { XIcon as c } from "lucide-react";
5
- import { c as i } from "./cn-dYga0KKN.js";
6
- const j = a.Root, b = a.Trigger, m = a.Portal, h = a.Close, n = l.forwardRef(({ className: e, ...t }, o) => /* @__PURE__ */ s.jsx(
7
- a.Overlay,
8
- {
9
- ref: o,
10
- className: i(
11
- "fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
12
- e
13
- ),
14
- ...t
15
- }
16
- ));
17
- n.displayName = a.Overlay.displayName;
18
- const f = l.forwardRef(({ className: e, children: t, showCloseButton: o = !0, ...d }, r) => /* @__PURE__ */ s.jsxs(m, { children: [
19
- /* @__PURE__ */ s.jsx(n, {}),
20
- /* @__PURE__ */ s.jsxs(
21
- a.Content,
22
- {
23
- ref: r,
24
- className: i(
25
- "fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",
26
- e
27
- ),
28
- ...d,
29
- children: [
30
- t,
31
- o && /* @__PURE__ */ s.jsxs(a.Close, { className: "absolute left-1 top-1 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground", children: [
32
- /* @__PURE__ */ s.jsx(c, { className: "h-3 w-3", strokeWidth: 2 }),
33
- /* @__PURE__ */ s.jsx("span", { className: "sr-only", children: "Close" })
34
- ] })
35
- ]
36
- }
37
- )
38
- ] }));
39
- f.displayName = a.Content.displayName;
40
- const p = ({
41
- className: e,
42
- ...t
43
- }) => /* @__PURE__ */ s.jsx(
44
- "div",
45
- {
46
- className: i(
47
- "flex flex-col space-y-1.5 text-center sm:text-left",
48
- e
49
- ),
50
- ...t
51
- }
52
- );
53
- p.displayName = "DialogHeader";
54
- const g = ({
55
- className: e,
56
- ...t
57
- }) => /* @__PURE__ */ s.jsx(
58
- "div",
59
- {
60
- className: i(
61
- "flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
62
- e
63
- ),
64
- ...t
65
- }
66
- );
67
- g.displayName = "DialogFooter";
68
- const x = l.forwardRef(({ className: e, ...t }, o) => /* @__PURE__ */ s.jsx(
69
- a.Title,
70
- {
71
- ref: o,
72
- className: i(
73
- "text-lg font-semibold leading-none tracking-tight",
74
- e
75
- ),
76
- ...t
77
- }
78
- ));
79
- x.displayName = a.Title.displayName;
80
- const u = l.forwardRef(({ className: e, ...t }, o) => /* @__PURE__ */ s.jsx(
81
- a.Description,
82
- {
83
- ref: o,
84
- className: i("text-sm text-muted-foreground", e),
85
- ...t
86
- }
87
- ));
88
- u.displayName = a.Description.displayName;
89
- export {
90
- j as D,
91
- f as a,
92
- x as b,
93
- p as c,
94
- u as d,
95
- g as e,
96
- h as f,
97
- b as g
98
- };
99
- //# sourceMappingURL=Dialog-u9Uz9sTt.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Dialog-u9Uz9sTt.js","sources":["../src/lib/ui/Dialog.tsx"],"sourcesContent":["import * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport * as React from \"react\";\n\nimport { XIcon } from \"lucide-react\";\nimport { cn } from \"../util/cn.js\";\n\nconst Dialog = DialogPrimitive.Root;\n\nconst DialogTrigger = DialogPrimitive.Trigger;\n\nconst DialogPortal = DialogPrimitive.Portal;\n\nconst DialogClose = DialogPrimitive.Close;\n\nconst DialogOverlay = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n className={cn(\n \"fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0\",\n className,\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean;\n }\n>(({ className, children, showCloseButton = true, ...props }, ref) => (\n <DialogPortal>\n <DialogOverlay />\n <DialogPrimitive.Content\n ref={ref}\n className={cn(\n \"fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg\",\n className,\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close className=\"absolute left-1 top-1 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground\">\n <XIcon className=\"h-3 w-3\" strokeWidth={2} />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n));\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col space-y-1.5 text-center sm:text-left\",\n className,\n )}\n {...props}\n />\n);\nDialogHeader.displayName = \"DialogHeader\";\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n className,\n )}\n {...props}\n />\n);\nDialogFooter.displayName = \"DialogFooter\";\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight\",\n className,\n )}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n};\n"],"names":["Dialog","DialogPrimitive","DialogTrigger","DialogPortal","DialogClose","DialogOverlay","React","className","props","ref","jsx","cn","DialogContent","children","showCloseButton","jsxs","XIcon","DialogHeader","DialogFooter","DialogTitle","DialogDescription"],"mappings":";;;;;AAMA,MAAMA,IAASC,EAAgB,MAEzBC,IAAgBD,EAAgB,SAEhCE,IAAeF,EAAgB,QAE/BG,IAAcH,EAAgB,OAE9BI,IAAgBC,EAAM,WAG1B,CAAC,EAAE,WAAAC,GAAW,GAAGC,EAAA,GAASC,MAC1BC,gBAAAA,EAAAA;AAAAA,EAACT,EAAgB;AAAA,EAAhB;AAAA,IACC,KAAAQ;AAAA,IACA,WAAWE;AAAA,MACT;AAAA,MACAJ;AAAA,IAAA;AAAA,IAED,GAAGC;AAAA,EAAA;AACN,CACD;AACDH,EAAc,cAAcJ,EAAgB,QAAQ;AAEpD,MAAMW,IAAgBN,EAAM,WAK1B,CAAC,EAAE,WAAAC,GAAW,UAAAM,GAAU,iBAAAC,IAAkB,IAAM,GAAGN,EAAA,GAASC,6BAC3DN,GAAA,EACC,UAAA;AAAA,EAAAO,gBAAAA,EAAAA,IAACL,GAAA,EAAc;AAAA,EACfU,gBAAAA,EAAAA;AAAAA,IAACd,EAAgB;AAAA,IAAhB;AAAA,MACC,KAAAQ;AAAA,MACA,WAAWE;AAAA,QACT;AAAA,QACAJ;AAAA,MAAA;AAAA,MAED,GAAGC;AAAA,MAEH,UAAA;AAAA,QAAAK;AAAA,QACAC,KACCC,gBAAAA,EAAAA,KAACd,EAAgB,OAAhB,EAAsB,WAAU,kRAC/B,UAAA;AAAA,UAAAS,gBAAAA,EAAAA,IAACM,GAAA,EAAM,WAAU,WAAU,aAAa,GAAG;AAAA,UAC3CN,gBAAAA,EAAAA,IAAC,QAAA,EAAK,WAAU,WAAU,UAAA,QAAA,CAAK;AAAA,QAAA,EAAA,CACjC;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAEJ,GACF,CACD;AACDE,EAAc,cAAcX,EAAgB,QAAQ;AAEpD,MAAMgB,IAAe,CAAC;AAAA,EACpB,WAAAV;AAAA,EACA,GAAGC;AACL,MACEE,gBAAAA,EAAAA;AAAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAWC;AAAA,MACT;AAAA,MACAJ;AAAA,IAAA;AAAA,IAED,GAAGC;AAAA,EAAA;AACN;AAEFS,EAAa,cAAc;AAE3B,MAAMC,IAAe,CAAC;AAAA,EACpB,WAAAX;AAAA,EACA,GAAGC;AACL,MACEE,gBAAAA,EAAAA;AAAAA,EAAC;AAAA,EAAA;AAAA,IACC,WAAWC;AAAA,MACT;AAAA,MACAJ;AAAA,IAAA;AAAA,IAED,GAAGC;AAAA,EAAA;AACN;AAEFU,EAAa,cAAc;AAE3B,MAAMC,IAAcb,EAAM,WAGxB,CAAC,EAAE,WAAAC,GAAW,GAAGC,EAAA,GAASC,MAC1BC,gBAAAA,EAAAA;AAAAA,EAACT,EAAgB;AAAA,EAAhB;AAAA,IACC,KAAAQ;AAAA,IACA,WAAWE;AAAA,MACT;AAAA,MACAJ;AAAA,IAAA;AAAA,IAED,GAAGC;AAAA,EAAA;AACN,CACD;AACDW,EAAY,cAAclB,EAAgB,MAAM;AAEhD,MAAMmB,IAAoBd,EAAM,WAG9B,CAAC,EAAE,WAAAC,GAAW,GAAGC,EAAA,GAASC,MAC1BC,gBAAAA,EAAAA;AAAAA,EAACT,EAAgB;AAAA,EAAhB;AAAA,IACC,KAAAQ;AAAA,IACA,WAAWE,EAAG,iCAAiCJ,CAAS;AAAA,IACvD,GAAGC;AAAA,EAAA;AACN,CACD;AACDY,EAAkB,cAAcnB,EAAgB,YAAY;"}