@docubook/mdx-content 1.0.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 (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +211 -0
  3. package/dist/adapters/next/ButtonMdx.d.ts +4 -0
  4. package/dist/adapters/next/ButtonMdx.d.ts.map +1 -0
  5. package/dist/adapters/next/ButtonMdx.jsx +7 -0
  6. package/dist/adapters/next/ButtonMdx.jsx.map +1 -0
  7. package/dist/adapters/next/CardMdx.d.ts +4 -0
  8. package/dist/adapters/next/CardMdx.d.ts.map +1 -0
  9. package/dist/adapters/next/CardMdx.jsx +7 -0
  10. package/dist/adapters/next/CardMdx.jsx.map +1 -0
  11. package/dist/adapters/next/ImageMdx.d.ts +8 -0
  12. package/dist/adapters/next/ImageMdx.d.ts.map +1 -0
  13. package/dist/adapters/next/ImageMdx.jsx +7 -0
  14. package/dist/adapters/next/ImageMdx.jsx.map +1 -0
  15. package/dist/adapters/next/LinkMdx.d.ts +3 -0
  16. package/dist/adapters/next/LinkMdx.d.ts.map +1 -0
  17. package/dist/adapters/next/LinkMdx.jsx +10 -0
  18. package/dist/adapters/next/LinkMdx.jsx.map +1 -0
  19. package/dist/adapters/next/index.d.ts +5 -0
  20. package/dist/adapters/next/index.d.ts.map +1 -0
  21. package/dist/adapters/next/index.js +5 -0
  22. package/dist/adapters/next/index.js.map +1 -0
  23. package/dist/client.d.ts +7 -0
  24. package/dist/client.d.ts.map +1 -0
  25. package/dist/client.js +7 -0
  26. package/dist/client.js.map +1 -0
  27. package/dist/components/AccordionContext.d.ts +8 -0
  28. package/dist/components/AccordionContext.d.ts.map +1 -0
  29. package/dist/components/AccordionContext.jsx +4 -0
  30. package/dist/components/AccordionContext.jsx.map +1 -0
  31. package/dist/components/AccordionGroupMdx.d.ts +7 -0
  32. package/dist/components/AccordionGroupMdx.d.ts.map +1 -0
  33. package/dist/components/AccordionGroupMdx.jsx +17 -0
  34. package/dist/components/AccordionGroupMdx.jsx.map +1 -0
  35. package/dist/components/AccordionMdx.d.ts +11 -0
  36. package/dist/components/AccordionMdx.d.ts.map +1 -0
  37. package/dist/components/AccordionMdx.jsx +76 -0
  38. package/dist/components/AccordionMdx.jsx.map +1 -0
  39. package/dist/components/ButtonMdx.d.ts +18 -0
  40. package/dist/components/ButtonMdx.d.ts.map +1 -0
  41. package/dist/components/ButtonMdx.jsx +58 -0
  42. package/dist/components/ButtonMdx.jsx.map +1 -0
  43. package/dist/components/CardGroupMdx.d.ts +9 -0
  44. package/dist/components/CardGroupMdx.d.ts.map +1 -0
  45. package/dist/components/CardGroupMdx.jsx +29 -0
  46. package/dist/components/CardGroupMdx.jsx.map +1 -0
  47. package/dist/components/CardMdx.d.ts +17 -0
  48. package/dist/components/CardMdx.d.ts.map +1 -0
  49. package/dist/components/CardMdx.jsx +87 -0
  50. package/dist/components/CardMdx.jsx.map +1 -0
  51. package/dist/components/CodeBlock.d.ts +8 -0
  52. package/dist/components/CodeBlock.d.ts.map +1 -0
  53. package/dist/components/CodeBlock.jsx +77 -0
  54. package/dist/components/CodeBlock.jsx.map +1 -0
  55. package/dist/components/CopyButton.d.ts +6 -0
  56. package/dist/components/CopyButton.d.ts.map +1 -0
  57. package/dist/components/CopyButton.jsx +43 -0
  58. package/dist/components/CopyButton.jsx.map +1 -0
  59. package/dist/components/FileTreeMdx.d.ts +19 -0
  60. package/dist/components/FileTreeMdx.d.ts.map +1 -0
  61. package/dist/components/FileTreeMdx.jsx +79 -0
  62. package/dist/components/FileTreeMdx.jsx.map +1 -0
  63. package/dist/components/IconMdx.d.ts +6 -0
  64. package/dist/components/IconMdx.d.ts.map +1 -0
  65. package/dist/components/IconMdx.jsx +14 -0
  66. package/dist/components/IconMdx.jsx.map +1 -0
  67. package/dist/components/ImageMdx.d.ts +8 -0
  68. package/dist/components/ImageMdx.d.ts.map +1 -0
  69. package/dist/components/ImageMdx.jsx +126 -0
  70. package/dist/components/ImageMdx.jsx.map +1 -0
  71. package/dist/components/KeyboardMdx.d.ts +10 -0
  72. package/dist/components/KeyboardMdx.d.ts.map +1 -0
  73. package/dist/components/KeyboardMdx.jsx +41 -0
  74. package/dist/components/KeyboardMdx.jsx.map +1 -0
  75. package/dist/components/LinkMdx.d.ts +4 -0
  76. package/dist/components/LinkMdx.d.ts.map +1 -0
  77. package/dist/components/LinkMdx.jsx +9 -0
  78. package/dist/components/LinkMdx.jsx.map +1 -0
  79. package/dist/components/NoteMdx.d.ts +13 -0
  80. package/dist/components/NoteMdx.d.ts.map +1 -0
  81. package/dist/components/NoteMdx.jsx +87 -0
  82. package/dist/components/NoteMdx.jsx.map +1 -0
  83. package/dist/components/ReleaseMdx.d.ts +16 -0
  84. package/dist/components/ReleaseMdx.d.ts.map +1 -0
  85. package/dist/components/ReleaseMdx.jsx +56 -0
  86. package/dist/components/ReleaseMdx.jsx.map +1 -0
  87. package/dist/components/StepperMdx.d.ts +17 -0
  88. package/dist/components/StepperMdx.d.ts.map +1 -0
  89. package/dist/components/StepperMdx.jsx +82 -0
  90. package/dist/components/StepperMdx.jsx.map +1 -0
  91. package/dist/components/TableMdx.d.ts +9 -0
  92. package/dist/components/TableMdx.d.ts.map +1 -0
  93. package/dist/components/TableMdx.jsx +57 -0
  94. package/dist/components/TableMdx.jsx.map +1 -0
  95. package/dist/components/TabsMdx.d.ts +21 -0
  96. package/dist/components/TabsMdx.d.ts.map +1 -0
  97. package/dist/components/TabsMdx.jsx +124 -0
  98. package/dist/components/TabsMdx.jsx.map +1 -0
  99. package/dist/components/TooltipsMdx.d.ts +10 -0
  100. package/dist/components/TooltipsMdx.d.ts.map +1 -0
  101. package/dist/components/TooltipsMdx.jsx +42 -0
  102. package/dist/components/TooltipsMdx.jsx.map +1 -0
  103. package/dist/components/YoutubeMdx.d.ts +7 -0
  104. package/dist/components/YoutubeMdx.d.ts.map +1 -0
  105. package/dist/components/YoutubeMdx.jsx +15 -0
  106. package/dist/components/YoutubeMdx.jsx.map +1 -0
  107. package/dist/components/index.d.ts +17 -0
  108. package/dist/components/index.d.ts.map +1 -0
  109. package/dist/components/index.js +17 -0
  110. package/dist/components/index.js.map +1 -0
  111. package/dist/index.d.ts +21 -0
  112. package/dist/index.d.ts.map +1 -0
  113. package/dist/index.js +20 -0
  114. package/dist/index.js.map +1 -0
  115. package/dist/registry/index.d.ts +4 -0
  116. package/dist/registry/index.d.ts.map +1 -0
  117. package/dist/registry/index.js +41 -0
  118. package/dist/registry/index.js.map +1 -0
  119. package/dist/server.d.ts +12 -0
  120. package/dist/server.d.ts.map +1 -0
  121. package/dist/server.js +12 -0
  122. package/dist/server.js.map +1 -0
  123. package/package.json +75 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CardGroupMdx.d.ts","sourceRoot":"","sources":["../../src/components/CardGroupMdx.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEtD,KAAK,iBAAiB,GAAG;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,KAAK,CAAC,EAAE,aAAa,CAAC;CACzB,CAAC;AAEF,wBAAgB,YAAY,CAAC,EAAE,IAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,iBAAiB,+BAmC5E"}
@@ -0,0 +1,29 @@
1
+ export function CardGroupMdx({ cols = 2, children, style }) {
2
+ const columnCount = Math.max(1, Math.min(4, cols));
3
+ return (<>
4
+ <div className="docubook-card-group" style={{
5
+ "--docubook-card-group-template": `repeat(${columnCount}, minmax(240px, 1fr))`,
6
+ ...style,
7
+ }}>
8
+ {children}
9
+ </div>
10
+ <style>{`
11
+ .docubook-card-group {
12
+ display: grid;
13
+ grid-template-columns: 1fr;
14
+ gap: 1rem;
15
+ margin: 1.2rem 0;
16
+ align-items: stretch;
17
+ width: 100%;
18
+ grid-auto-rows: minmax(0, auto);
19
+ }
20
+
21
+ @media (min-width: 768px) {
22
+ .docubook-card-group {
23
+ grid-template-columns: var(--docubook-card-group-template, repeat(2, minmax(220px, 1fr)));
24
+ }
25
+ }
26
+ `}</style>
27
+ </>);
28
+ }
29
+ //# sourceMappingURL=CardGroupMdx.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CardGroupMdx.jsx","sourceRoot":"","sources":["../../src/components/CardGroupMdx.tsx"],"names":[],"mappings":"AAQA,MAAM,UAAU,YAAY,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAqB;IACzE,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IAEnD,OAAO,CACH,EACI;YAAA,CAAC,GAAG,CACA,SAAS,CAAC,qBAAqB,CAC/B,KAAK,CAAC,CACF;YACI,gCAAgC,EAAE,UAAU,WAAW,uBAAuB;YAC9E,GAAG,KAAK;SAEhB,CAAC,CAED;gBAAA,CAAC,QAAQ,CACb;YAAA,EAAE,GAAG,CACL;YAAA,CAAC,KAAK,CAAC,CAAC;;;;;;;;;;;;;;;;aAgBP,CAAC,EAAE,KAAK,CACb;QAAA,GAAG,CACN,CAAC;AACN,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { ComponentType, CSSProperties, HTMLAttributes, ReactNode } from "react";
2
+ import { IconProp } from "./IconMdx";
3
+ import type { LinkMdxProps } from "./LinkMdx";
4
+ type LinkRenderer = ComponentType<LinkMdxProps>;
5
+ export type CardMdxProps = HTMLAttributes<HTMLDivElement> & {
6
+ title: string;
7
+ icon?: IconProp;
8
+ href?: string;
9
+ horizontal?: boolean;
10
+ children?: ReactNode;
11
+ style?: CSSProperties;
12
+ /** Internal adapter hook: inject framework link component without duplicating styles. */
13
+ __LinkComponent?: LinkRenderer;
14
+ };
15
+ export declare function CardMdx({ title, icon, href, horizontal, children, style, className, __LinkComponent, ...props }: CardMdxProps): import("react").JSX.Element;
16
+ export {};
17
+ //# sourceMappingURL=CardMdx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CardMdx.d.ts","sourceRoot":"","sources":["../../src/components/CardMdx.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAErF,OAAO,EAAE,QAAQ,EAAqB,MAAM,WAAW,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAE9C,KAAK,YAAY,GAAG,aAAa,CAAC,YAAY,CAAC,CAAC;AAEhD,MAAM,MAAM,YAAY,GAAG,cAAc,CAAC,cAAc,CAAC,GAAG;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,yFAAyF;IACzF,eAAe,CAAC,EAAE,YAAY,CAAC;CAClC,CAAC;AAgBF,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,GAAG,KAAK,EAAE,EAAE,YAAY,+BAkG7H"}
@@ -0,0 +1,87 @@
1
+ "use client";
2
+ import { useState } from "react";
3
+ import { LinkMdx } from "./LinkMdx";
4
+ import { resolveLucideIcon } from "./IconMdx";
5
+ const baseStyle = {
6
+ display: "block",
7
+ border: "1px solid hsl(var(--border, 210 14% 94%))",
8
+ borderRadius: 14,
9
+ background: "hsl(var(--card, 0 0% 100%))",
10
+ color: "hsl(var(--foreground, 222 12% 12%))",
11
+ textDecoration: "none",
12
+ padding: "1rem",
13
+ minHeight: 120,
14
+ boxShadow: "0 0 0 rgba(0,0,0,0)",
15
+ transition: "border-color 0.2s ease, box-shadow 0.24s ease, transform 0.24s ease, color 0.2s ease",
16
+ overflow: "hidden",
17
+ };
18
+ export function CardMdx({ title, icon, href, horizontal, children, style, className, __LinkComponent, ...props }) {
19
+ const [hover, setHover] = useState(false);
20
+ const resolvedIcon = resolveLucideIcon(icon);
21
+ const LinkComponent = __LinkComponent ?? LinkMdx;
22
+ const content = (<div style={{
23
+ display: "grid",
24
+ gridTemplateColumns: horizontal ? "auto 1fr" : "1fr",
25
+ gap: horizontal ? "0.75rem" : "0.4rem",
26
+ alignItems: horizontal ? "flex-start" : "flex-start",
27
+ }}>
28
+ {resolvedIcon ? (<span aria-hidden="true" style={{
29
+ display: "block",
30
+ alignItems: "center",
31
+ justifyContent: "center",
32
+ width: "1rem",
33
+ height: "1rem",
34
+ borderRadius: "999px",
35
+ backgroundColor: "hsl(var(--primary, 210 100% 56%)) / 0.14",
36
+ color: "hsl(var(--primary, 210 100% 40%))",
37
+ fontSize: "2rem",
38
+ transition: "transform 0.2s ease, color 0.2s ease",
39
+ transform: hover ? "scale(1.05)" : "scale(1)",
40
+ }}>
41
+ {resolvedIcon}
42
+ </span>) : null}
43
+ <div style={{ display: "grid", gridAutoRows: "min-content", gap: 0 }}>
44
+ <div style={{ fontWeight: 700, fontSize: "1.22rem", lineHeight: 1.3, color: "hsl(var(--foreground, 222 12% 12%))" }}>
45
+ {title}
46
+ </div>
47
+ {children ? (<div style={{
48
+ color: "hsl(var(--muted-foreground, 215 18% 62%))",
49
+ fontSize: "0.96rem",
50
+ lineHeight: 1.42,
51
+ marginTop: "-0.5rem",
52
+ }}>
53
+ {children}
54
+ </div>) : null}
55
+ </div>
56
+ </div>);
57
+ const interactiveStyle = href
58
+ ? {
59
+ cursor: "pointer",
60
+ borderColor: hover ? "hsl(var(--primary, 210 80% 56%))" : "hsl(var(--border, 210 14% 94%))",
61
+ boxShadow: hover
62
+ ? "0 11px 28px rgba(34, 129, 227, 0.15)"
63
+ : "0 0 0 rgba(0, 0, 0, 0)",
64
+ transform: hover ? "translateY(-2px)" : "translateY(0)",
65
+ }
66
+ : {
67
+ borderColor: "hsl(var(--border, 210 14% 94%))",
68
+ boxShadow: "0 0 0 rgba(0, 0, 0, 0)",
69
+ };
70
+ const combinedStyle = { ...baseStyle, ...interactiveStyle, ...style };
71
+ const divProps = {
72
+ onMouseEnter: () => setHover(true),
73
+ onMouseLeave: () => setHover(false),
74
+ style: combinedStyle,
75
+ ...(className ? { className } : {}),
76
+ ...props,
77
+ };
78
+ if (href) {
79
+ return (<LinkComponent href={href} onMouseEnter={() => setHover(true)} onMouseLeave={() => setHover(false)} style={combinedStyle} {...(className ? { className } : {})} {...props}>
80
+ {content}
81
+ </LinkComponent>);
82
+ }
83
+ return (<div {...divProps}>
84
+ {content}
85
+ </div>);
86
+ }
87
+ //# sourceMappingURL=CardMdx.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CardMdx.jsx","sourceRoot":"","sources":["../../src/components/CardMdx.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { ComponentProps } from "react";
2
+ type CodeBlockProps = ComponentProps<"pre"> & {
3
+ raw?: string;
4
+ "data-title"?: string;
5
+ };
6
+ export declare function CodeBlock({ children, raw, ...rest }: CodeBlockProps): import("react").JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=CodeBlock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeBlock.d.ts","sourceRoot":"","sources":["../../src/components/CodeBlock.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAa,MAAM,OAAO,CAAC;AA4BvD,KAAK,cAAc,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAuDF,wBAAgB,SAAS,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,EAAE,cAAc,+BA2BnE"}
@@ -0,0 +1,77 @@
1
+ import { SiJavascript, SiTypescript, SiReact, SiPython, SiGo, SiPhp, SiRuby, SiSwift, SiKotlin, SiHtml5, SiCss, SiSass, SiPostgresql, SiGraphql, SiYaml, SiToml, SiDocker, SiNginx, SiGit, SiGnubash, SiMarkdown, } from "react-icons/si";
2
+ import { FaJava, FaCode, FaFileAlt } from "react-icons/fa";
3
+ import { TbJson } from "react-icons/tb";
4
+ import { CopyButton } from "./CopyButton";
5
+ function getLanguage(className = "") {
6
+ const match = className.match(/language-(\w+)/);
7
+ return match ? match[1] : "text";
8
+ }
9
+ function getLanguageIcon(language) {
10
+ const normalized = language.toLowerCase();
11
+ const iconProps = { size: 14 };
12
+ const map = {
13
+ gitignore: <SiGit {...iconProps}/>,
14
+ docker: <SiDocker {...iconProps}/>,
15
+ dockerfile: <SiDocker {...iconProps}/>,
16
+ nginx: <SiNginx {...iconProps}/>,
17
+ sql: <SiPostgresql {...iconProps}/>,
18
+ graphql: <SiGraphql {...iconProps}/>,
19
+ yaml: <SiYaml {...iconProps}/>,
20
+ yml: <SiYaml {...iconProps}/>,
21
+ toml: <SiToml {...iconProps}/>,
22
+ json: <TbJson {...iconProps}/>,
23
+ md: <SiMarkdown {...iconProps}/>,
24
+ markdown: <SiMarkdown {...iconProps}/>,
25
+ bash: <SiGnubash {...iconProps}/>,
26
+ sh: <SiGnubash {...iconProps}/>,
27
+ shell: <SiGnubash {...iconProps}/>,
28
+ swift: <SiSwift {...iconProps}/>,
29
+ kotlin: <SiKotlin {...iconProps}/>,
30
+ kt: <SiKotlin {...iconProps}/>,
31
+ kts: <SiKotlin {...iconProps}/>,
32
+ rb: <SiRuby {...iconProps}/>,
33
+ ruby: <SiRuby {...iconProps}/>,
34
+ php: <SiPhp {...iconProps}/>,
35
+ go: <SiGo {...iconProps}/>,
36
+ py: <SiPython {...iconProps}/>,
37
+ python: <SiPython {...iconProps}/>,
38
+ java: <FaJava {...iconProps}/>,
39
+ tsx: <SiReact {...iconProps}/>,
40
+ typescript: <SiTypescript {...iconProps}/>,
41
+ ts: <SiTypescript {...iconProps}/>,
42
+ jsx: <SiReact {...iconProps}/>,
43
+ js: <SiJavascript {...iconProps}/>,
44
+ javascript: <SiJavascript {...iconProps}/>,
45
+ html: <SiHtml5 {...iconProps}/>,
46
+ css: <SiCss {...iconProps}/>,
47
+ scss: <SiSass {...iconProps}/>,
48
+ sass: <SiSass {...iconProps}/>,
49
+ text: <FaFileAlt {...iconProps}/>,
50
+ plaintext: <FaFileAlt {...iconProps}/>,
51
+ };
52
+ return map[normalized] || <FaCode {...iconProps}/>;
53
+ }
54
+ export function CodeBlock({ children, raw, ...rest }) {
55
+ const { className, "data-title": title, ...props } = rest;
56
+ const language = getLanguage(className);
57
+ return (<div style={{ border: "1px solid hsl(var(--border, 210 14% 94%))", borderRadius: 12, overflow: "hidden", margin: "1rem 0" }}>
58
+ <div style={{
59
+ display: "flex",
60
+ alignItems: "center",
61
+ justifyContent: "space-between",
62
+ padding: "0.45rem 0.6rem",
63
+ borderBottom: "1px solid hsl(var(--border, 210 14% 94%))",
64
+ background: "hsl(var(--muted, 210 12% 96%))",
65
+ }}>
66
+ <div style={{ display: "flex", alignItems: "center", gap: 6, fontSize: "0.78rem", color: "hsl(var(--muted-foreground, 215 20% 65%))" }}>
67
+ {getLanguageIcon(language)}
68
+ <span>{title || language}</span>
69
+ </div>
70
+ {raw ? <CopyButton content={raw}/> : null}
71
+ </div>
72
+ <pre {...props} className={className} style={{ margin: 0, padding: "0.9rem", overflowX: "auto" }}>
73
+ {children}
74
+ </pre>
75
+ </div>);
76
+ }
77
+ //# sourceMappingURL=CodeBlock.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeBlock.jsx","sourceRoot":"","sources":["../../src/components/CodeBlock.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ type CopyButtonProps = {
2
+ content: string;
3
+ };
4
+ export declare function CopyButton({ content }: CopyButtonProps): import("react").JSX.Element;
5
+ export {};
6
+ //# sourceMappingURL=CopyButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CopyButton.d.ts","sourceRoot":"","sources":["../../src/components/CopyButton.tsx"],"names":[],"mappings":"AAIA,KAAK,eAAe,GAAG;IACnB,OAAO,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAgB,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,eAAe,+BAiDtD"}
@@ -0,0 +1,43 @@
1
+ "use client";
2
+ import { useEffect, useId, useRef, useState } from "react";
3
+ export function CopyButton({ content }) {
4
+ const [copied, setCopied] = useState(false);
5
+ const timeoutRef = useRef(null);
6
+ const statusId = useId();
7
+ useEffect(() => {
8
+ return () => {
9
+ if (timeoutRef.current) {
10
+ clearTimeout(timeoutRef.current);
11
+ }
12
+ };
13
+ }, []);
14
+ async function onCopy() {
15
+ try {
16
+ await navigator.clipboard.writeText(content);
17
+ setCopied(true);
18
+ if (timeoutRef.current) {
19
+ clearTimeout(timeoutRef.current);
20
+ }
21
+ timeoutRef.current = setTimeout(() => setCopied(false), 1600);
22
+ }
23
+ catch {
24
+ setCopied(false);
25
+ }
26
+ }
27
+ return (<button type="button" onClick={onCopy} aria-label={copied ? "Copied" : "Copy code"} aria-describedby={statusId} style={{
28
+ position: "relative",
29
+ border: "1px solid hsl(var(--border, 210 14% 94%))",
30
+ borderRadius: 8,
31
+ background: "hsl(var(--card, 0 0% 100%))",
32
+ color: "hsl(var(--foreground, 222 12% 12%))",
33
+ fontSize: "0.78rem",
34
+ padding: "0.35rem 0.55rem",
35
+ cursor: "copy",
36
+ }}>
37
+ {copied ? "Copied" : "Copy"}
38
+ <span id={statusId} aria-live="polite" style={{ position: "absolute", left: -9999, top: "auto" }}>
39
+ {copied ? "Code copied to clipboard" : "Ready to copy code"}
40
+ </span>
41
+ </button>);
42
+ }
43
+ //# sourceMappingURL=CopyButton.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CopyButton.jsx","sourceRoot":"","sources":["../../src/components/CopyButton.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAM3D,MAAM,UAAU,UAAU,CAAC,EAAE,OAAO,EAAmB;IACnD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,MAAM,CAAuC,IAAI,CAAC,CAAC;IACtE,MAAM,QAAQ,GAAG,KAAK,EAAE,CAAC;IAEzB,SAAS,CAAC,GAAG,EAAE;QACX,OAAO,GAAG,EAAE;YACR,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACrB,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACrC,CAAC;QACL,CAAC,CAAC;IACN,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,KAAK,UAAU,MAAM;QACjB,IAAI,CAAC;YACD,MAAM,SAAS,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAC7C,SAAS,CAAC,IAAI,CAAC,CAAC;YAChB,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACrB,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACrC,CAAC;YACD,UAAU,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;QAClE,CAAC;QAAC,MAAM,CAAC;YACL,SAAS,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACL,CAAC;IAED,OAAO,CACH,CAAC,MAAM,CACH,IAAI,CAAC,QAAQ,CACb,OAAO,CAAC,CAAC,MAAM,CAAC,CAChB,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAC5C,gBAAgB,CAAC,CAAC,QAAQ,CAAC,CAC3B,KAAK,CAAC,CAAC;YACH,QAAQ,EAAE,UAAU;YACpB,MAAM,EAAE,2CAA2C;YACnD,YAAY,EAAE,CAAC;YACf,UAAU,EAAE,6BAA6B;YACzC,KAAK,EAAE,qCAAqC;YAC5C,QAAQ,EAAE,SAAS;YACnB,OAAO,EAAE,iBAAiB;YAC1B,MAAM,EAAE,MAAM;SACjB,CAAC,CAEF;YAAA,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAC3B;YAAA,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAC7F;gBAAA,CAAC,MAAM,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,oBAAoB,CAC/D;YAAA,EAAE,IAAI,CACV;QAAA,EAAE,MAAM,CAAC,CACZ,CAAC;AACN,CAAC"}
@@ -0,0 +1,19 @@
1
+ import React, { type CSSProperties, type HTMLAttributes, type ReactNode } from "react";
2
+ type FilesMdxProps = HTMLAttributes<HTMLDivElement> & {
3
+ children?: ReactNode;
4
+ style?: CSSProperties;
5
+ };
6
+ type FolderMdxProps = HTMLAttributes<HTMLDivElement> & {
7
+ name: string;
8
+ children?: ReactNode;
9
+ style?: CSSProperties;
10
+ };
11
+ type FileMdxProps = HTMLAttributes<HTMLDivElement> & {
12
+ name: string;
13
+ style?: CSSProperties;
14
+ };
15
+ export declare function FilesMdx({ children, style, className, ...props }: FilesMdxProps): React.JSX.Element;
16
+ export declare function FolderMdx({ name, children, style, className, ...props }: FolderMdxProps): React.JSX.Element;
17
+ export declare function FileMdx({ name, style, className, ...props }: FileMdxProps): React.JSX.Element;
18
+ export {};
19
+ //# sourceMappingURL=FileTreeMdx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileTreeMdx.d.ts","sourceRoot":"","sources":["../../src/components/FileTreeMdx.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAmB,KAAK,aAAa,EAAE,KAAK,cAAc,EAAsB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAG5H,KAAK,aAAa,GAAG,cAAc,CAAC,cAAc,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,aAAa,CAAA;CAAE,CAAC;AACtG,KAAK,cAAc,GAAG,cAAc,CAAC,cAAc,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;IAAC,KAAK,CAAC,EAAE,aAAa,CAAA;CAAE,CAAC;AACrH,KAAK,YAAY,GAAG,cAAc,CAAC,cAAc,CAAC,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,aAAa,CAAA;CAAE,CAAC;AAE7F,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,aAAa,qBAqB/E;AAED,wBAAgB,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,cAAc,qBAgFvF;AAED,wBAAgB,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,YAAY,qBAiCzE"}
@@ -0,0 +1,79 @@
1
+ 'use client';
2
+ import React, { useId, useState } from "react";
3
+ import { ChevronRight, File as FileIcon, Folder as FolderIcon, FolderOpen } from "lucide-react";
4
+ export function FilesMdx({ children, style, className, ...props }) {
5
+ return (<div className={className} {...props} role="tree" aria-label={props["aria-label"] ?? "File tree"} style={{
6
+ border: "1px solid hsl(var(--border, 210 14% 94%))",
7
+ borderRadius: 12,
8
+ padding: "0.5rem",
9
+ margin: "1rem 0",
10
+ background: "hsla(var(--card, 0 0% 100%) / 0.9)",
11
+ backdropFilter: "blur(8px)",
12
+ boxShadow: "0 10px 20px rgba(0,0,0,0.05)",
13
+ ...style,
14
+ }}>
15
+ {children}
16
+ </div>);
17
+ }
18
+ export function FolderMdx({ name, children, style, className, ...props }) {
19
+ const [isOpen, setIsOpen] = useState(true);
20
+ const [isHovered, setIsHovered] = useState(false);
21
+ const [isFocused, setIsFocused] = useState(false);
22
+ const hasChildren = React.Children.count(children) > 0;
23
+ const groupId = useId();
24
+ const handleKeyDown = (event) => {
25
+ if (!hasChildren) {
26
+ return;
27
+ }
28
+ if (event.key === "ArrowRight") {
29
+ event.preventDefault();
30
+ setIsOpen(true);
31
+ return;
32
+ }
33
+ if (event.key === "ArrowLeft") {
34
+ event.preventDefault();
35
+ setIsOpen(false);
36
+ return;
37
+ }
38
+ if (event.key === "Enter" || event.key === " ") {
39
+ event.preventDefault();
40
+ setIsOpen((prev) => !prev);
41
+ }
42
+ };
43
+ return (<div className={className} {...props} role="treeitem" aria-expanded={hasChildren ? isOpen : undefined} style={{ marginLeft: "0.35rem", ...style }}>
44
+ <button type="button" className="flex items-center gap-2 rounded-md py-1.5 px-2 transition-colors duration-150" onClick={() => hasChildren && setIsOpen((prev) => !prev)} onMouseEnter={() => setIsHovered(true)} onMouseLeave={() => setIsHovered(false)} onFocus={() => setIsFocused(true)} onBlur={() => setIsFocused(false)} onKeyDown={handleKeyDown} aria-label={`${isOpen ? "Collapse" : "Expand"} folder ${name}`} aria-expanded={hasChildren ? isOpen : undefined} aria-controls={hasChildren ? groupId : undefined} style={{
45
+ cursor: hasChildren ? "pointer" : "default",
46
+ width: "100%",
47
+ border: "none",
48
+ textAlign: "left",
49
+ background: isHovered || isFocused ? "hsla(var(--muted, 210 20% 92%) / 0.45)" : "transparent",
50
+ }}>
51
+ {hasChildren ? (<ChevronRight className="h-3.5 w-3.5 transition-transform duration-200" style={{ transform: isOpen ? "rotate(90deg)" : "rotate(0deg)", color: isHovered || isFocused ? "hsl(var(--primary, 210 100% 56%))" : "var(--muted-foreground)" }}/>) : (<div className="w-3.5"/>)}
52
+ {isOpen ? (<FolderOpen className="h-4 w-4" style={{ color: isHovered || isFocused ? "hsl(var(--primary, 210 100% 56%))" : "var(--muted-foreground)" }}/>) : (<FolderIcon className="h-4 w-4" style={{ color: isHovered || isFocused ? "hsl(var(--primary, 210 100% 56%))" : "var(--muted-foreground)" }}/>)}
53
+ <span style={{ fontWeight: 600, color: isHovered || isFocused ? "hsl(var(--primary, 210 100% 56%))" : "var(--foreground)" }}>{name}</span>
54
+ </button>
55
+ {isOpen && hasChildren && (<div id={groupId} role="group" style={{ marginLeft: "1rem", borderLeft: "2px solid hsl(var(--border, 210 20% 85%))", paddingLeft: "0.6rem" }}>
56
+ {children}
57
+ </div>)}
58
+ </div>);
59
+ }
60
+ export function FileMdx({ name, style, className, ...props }) {
61
+ const [isHovered, setIsHovered] = useState(false);
62
+ const [isFocused, setIsFocused] = useState(false);
63
+ const fileExtension = name.split(".").pop()?.toUpperCase();
64
+ return (<div className={className} {...props} role="treeitem" tabIndex={0} style={{
65
+ display: "flex",
66
+ alignItems: "center",
67
+ gap: "0.5rem",
68
+ padding: "0.33rem 0.5rem",
69
+ borderRadius: "0.45rem",
70
+ userSelect: "none",
71
+ background: isHovered || isFocused ? "hsla(var(--muted, 210 20% 92%) / 0.35)" : "transparent",
72
+ ...style,
73
+ }} onMouseEnter={() => setIsHovered(true)} onMouseLeave={() => setIsHovered(false)} onFocus={() => setIsFocused(true)} onBlur={() => setIsFocused(false)}>
74
+ <FileIcon className="h-3.5 w-3.5" style={{ color: isHovered || isFocused ? "hsl(var(--primary, 210 100% 56%))" : "var(--muted-foreground)" }}/>
75
+ <span style={{ fontFamily: "SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace", fontSize: "0.9rem", color: "var(--foreground)" }}>{name}</span>
76
+ {(isHovered || isFocused) && fileExtension && (<span style={{ marginLeft: "auto", fontSize: "0.7rem", color: "var(--muted-foreground)" }}>{fileExtension}</span>)}
77
+ </div>);
78
+ }
79
+ //# sourceMappingURL=FileTreeMdx.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileTreeMdx.jsx","sourceRoot":"","sources":["../../src/components/FileTreeMdx.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import * as LucideIcons from "lucide-react";
2
+ import type { ReactNode } from "react";
3
+ export type IconName = keyof typeof LucideIcons;
4
+ export type IconProp = IconName | string;
5
+ export declare function resolveLucideIcon(icon?: IconProp): ReactNode;
6
+ //# sourceMappingURL=IconMdx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconMdx.d.ts","sourceRoot":"","sources":["../../src/components/IconMdx.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAE,SAAS,EAAiB,MAAM,OAAO,CAAC;AAEtD,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,WAAW,CAAC;AAChD,MAAM,MAAM,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;AAIzC,wBAAgB,iBAAiB,CAAC,IAAI,CAAC,EAAE,QAAQ,GAAG,SAAS,CAa5D"}
@@ -0,0 +1,14 @@
1
+ import * as LucideIcons from "lucide-react";
2
+ const DEFAULT_ICON_SIZE = 20;
3
+ export function resolveLucideIcon(icon) {
4
+ if (!icon) {
5
+ return undefined;
6
+ }
7
+ const IconComponent = LucideIcons[icon];
8
+ if (!IconComponent) {
9
+ // Unknown icon key: avoid rendering invalid React elements.
10
+ return undefined;
11
+ }
12
+ return <IconComponent size={DEFAULT_ICON_SIZE}/>;
13
+ }
14
+ //# sourceMappingURL=IconMdx.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconMdx.jsx","sourceRoot":"","sources":["../../src/components/IconMdx.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,cAAc,CAAC;AAO5C,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B,MAAM,UAAU,iBAAiB,CAAC,IAAe;IAC7C,IAAI,CAAC,IAAI,EAAE,CAAC;QACR,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,MAAM,aAAa,GAAG,WAAW,CAAC,IAAgB,CAA2C,CAAC;IAE9F,IAAI,CAAC,aAAa,EAAE,CAAC;QACjB,4DAA4D;QAC5D,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,iBAAiB,CAAC,EAAG,CAAC;AACtD,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type ComponentProps, type ComponentType } from "react";
2
+ export type ImageMdxProps = Omit<ComponentProps<"img">, "src"> & {
3
+ src?: any;
4
+ zoom?: boolean;
5
+ ImageComponent?: ComponentType<any>;
6
+ };
7
+ export declare function ImageMdx({ src, alt, width, height, zoom, style, ImageComponent, ...props }: ImageMdxProps): import("react").JSX.Element | null;
8
+ //# sourceMappingURL=ImageMdx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageMdx.d.ts","sourceRoot":"","sources":["../../src/components/ImageMdx.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAsC,KAAK,cAAc,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAEpG,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,GAAG;IAC7D,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,cAAc,CAAC,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC;CACvC,CAAC;AAEF,wBAAgB,QAAQ,CAAC,EACrB,GAAG,EACH,GAAa,EACb,KAAW,EACX,MAAY,EACZ,IAAW,EACX,KAAK,EACL,cAAc,EACd,GAAG,KAAK,EACX,EAAE,aAAa,sCAsKf"}
@@ -0,0 +1,126 @@
1
+ "use client";
2
+ import { createPortal } from "react-dom";
3
+ import { useEffect, useId, useRef, useState } from "react";
4
+ export function ImageMdx({ src, alt = "image", width = 800, height = 350, zoom = true, style, ImageComponent, ...props }) {
5
+ const Image = ImageComponent ?? "img";
6
+ const [isOpen, setIsOpen] = useState(false);
7
+ const scrollYRef = useRef(0);
8
+ const closeButtonRef = useRef(null);
9
+ const dialogId = useId();
10
+ useEffect(() => {
11
+ if (!isOpen)
12
+ return;
13
+ scrollYRef.current = window.scrollY;
14
+ document.body.style.position = "fixed";
15
+ document.body.style.top = `-${scrollYRef.current}px`;
16
+ document.body.style.width = "100%";
17
+ closeButtonRef.current?.focus();
18
+ const onEsc = (e) => {
19
+ if (e.key === "Escape")
20
+ setIsOpen(false);
21
+ };
22
+ const onFocusTrap = (e) => {
23
+ if (e.key !== "Tab")
24
+ return;
25
+ const dialog = document.getElementById(dialogId);
26
+ const focusable = dialog?.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])');
27
+ if (!focusable || focusable.length === 0)
28
+ return;
29
+ const first = focusable[0];
30
+ const last = focusable[focusable.length - 1];
31
+ if (!e.shiftKey && document.activeElement === last) {
32
+ e.preventDefault();
33
+ first.focus();
34
+ }
35
+ if (e.shiftKey && document.activeElement === first) {
36
+ e.preventDefault();
37
+ last.focus();
38
+ }
39
+ };
40
+ window.addEventListener("keydown", onEsc);
41
+ window.addEventListener("keydown", onFocusTrap);
42
+ return () => {
43
+ document.body.style.position = "";
44
+ document.body.style.top = "";
45
+ document.body.style.width = "";
46
+ window.scrollTo(0, scrollYRef.current);
47
+ window.removeEventListener("keydown", onEsc);
48
+ window.removeEventListener("keydown", onFocusTrap);
49
+ };
50
+ }, [dialogId, isOpen]);
51
+ if (!src)
52
+ return null;
53
+ const canZoom = zoom;
54
+ return (<>
55
+ <button type="button" onClick={() => canZoom && setIsOpen(true)} aria-label={canZoom ? "Zoom image" : "Image"} style={{
56
+ position: "relative",
57
+ width: "100%",
58
+ border: "none",
59
+ background: "transparent",
60
+ padding: 0,
61
+ margin: "1rem 0",
62
+ cursor: canZoom ? "zoom-in" : "default",
63
+ }}>
64
+ <Image src={src} alt={alt} width={typeof width === "number" ? width : parseInt(width, 10)} height={typeof height === "number" ? height : parseInt(height, 10)} style={{
65
+ width: "100%",
66
+ height: "auto",
67
+ borderRadius: 10,
68
+ objectFit: "contain",
69
+ ...style,
70
+ }} {...props}/>
71
+ </button>
72
+
73
+ {canZoom && isOpen ? (<Portal>
74
+ <div id={dialogId} role="dialog" aria-modal="true" aria-label="Image preview" onClick={() => setIsOpen(false)} style={{
75
+ position: "fixed",
76
+ inset: 0,
77
+ zIndex: 99999,
78
+ background: "rgba(0,0,0,0.88)",
79
+ display: "flex",
80
+ alignItems: "center",
81
+ justifyContent: "center",
82
+ padding: "1rem",
83
+ }}>
84
+ <button ref={closeButtonRef} type="button" aria-label="Close image preview" onClick={(e) => {
85
+ e.stopPropagation();
86
+ setIsOpen(false);
87
+ }} style={{
88
+ position: "absolute",
89
+ top: 16,
90
+ right: 16,
91
+ border: "1px solid rgba(255,255,255,0.24)",
92
+ borderRadius: 8,
93
+ background: "rgba(0,0,0,0.45)",
94
+ color: "#fff",
95
+ padding: "0.4rem 0.55rem",
96
+ cursor: "pointer",
97
+ }}>
98
+ Close
99
+ </button>
100
+
101
+ <div onClick={(e) => e.stopPropagation()} style={{
102
+ maxWidth: "92vw",
103
+ maxHeight: "90vh",
104
+ display: "flex",
105
+ alignItems: "center",
106
+ justifyContent: "center",
107
+ }}>
108
+ <Image src={src} alt={alt} width={1920} height={1080} style={{
109
+ width: "auto",
110
+ height: "auto",
111
+ maxWidth: "92vw",
112
+ maxHeight: "90vh",
113
+ objectFit: "contain",
114
+ borderRadius: 10,
115
+ }}/>
116
+ </div>
117
+ </div>
118
+ </Portal>) : null}
119
+ </>);
120
+ }
121
+ function Portal({ children }) {
122
+ if (typeof window === "undefined")
123
+ return null;
124
+ return createPortal(children, document.body);
125
+ }
126
+ //# sourceMappingURL=ImageMdx.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageMdx.jsx","sourceRoot":"","sources":["../../src/components/ImageMdx.tsx"],"names":[],"mappings":"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"}