@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.
- package/LICENSE +21 -0
- package/README.md +211 -0
- package/dist/adapters/next/ButtonMdx.d.ts +4 -0
- package/dist/adapters/next/ButtonMdx.d.ts.map +1 -0
- package/dist/adapters/next/ButtonMdx.jsx +7 -0
- package/dist/adapters/next/ButtonMdx.jsx.map +1 -0
- package/dist/adapters/next/CardMdx.d.ts +4 -0
- package/dist/adapters/next/CardMdx.d.ts.map +1 -0
- package/dist/adapters/next/CardMdx.jsx +7 -0
- package/dist/adapters/next/CardMdx.jsx.map +1 -0
- package/dist/adapters/next/ImageMdx.d.ts +8 -0
- package/dist/adapters/next/ImageMdx.d.ts.map +1 -0
- package/dist/adapters/next/ImageMdx.jsx +7 -0
- package/dist/adapters/next/ImageMdx.jsx.map +1 -0
- package/dist/adapters/next/LinkMdx.d.ts +3 -0
- package/dist/adapters/next/LinkMdx.d.ts.map +1 -0
- package/dist/adapters/next/LinkMdx.jsx +10 -0
- package/dist/adapters/next/LinkMdx.jsx.map +1 -0
- package/dist/adapters/next/index.d.ts +5 -0
- package/dist/adapters/next/index.d.ts.map +1 -0
- package/dist/adapters/next/index.js +5 -0
- package/dist/adapters/next/index.js.map +1 -0
- package/dist/client.d.ts +7 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +7 -0
- package/dist/client.js.map +1 -0
- package/dist/components/AccordionContext.d.ts +8 -0
- package/dist/components/AccordionContext.d.ts.map +1 -0
- package/dist/components/AccordionContext.jsx +4 -0
- package/dist/components/AccordionContext.jsx.map +1 -0
- package/dist/components/AccordionGroupMdx.d.ts +7 -0
- package/dist/components/AccordionGroupMdx.d.ts.map +1 -0
- package/dist/components/AccordionGroupMdx.jsx +17 -0
- package/dist/components/AccordionGroupMdx.jsx.map +1 -0
- package/dist/components/AccordionMdx.d.ts +11 -0
- package/dist/components/AccordionMdx.d.ts.map +1 -0
- package/dist/components/AccordionMdx.jsx +76 -0
- package/dist/components/AccordionMdx.jsx.map +1 -0
- package/dist/components/ButtonMdx.d.ts +18 -0
- package/dist/components/ButtonMdx.d.ts.map +1 -0
- package/dist/components/ButtonMdx.jsx +58 -0
- package/dist/components/ButtonMdx.jsx.map +1 -0
- package/dist/components/CardGroupMdx.d.ts +9 -0
- package/dist/components/CardGroupMdx.d.ts.map +1 -0
- package/dist/components/CardGroupMdx.jsx +29 -0
- package/dist/components/CardGroupMdx.jsx.map +1 -0
- package/dist/components/CardMdx.d.ts +17 -0
- package/dist/components/CardMdx.d.ts.map +1 -0
- package/dist/components/CardMdx.jsx +87 -0
- package/dist/components/CardMdx.jsx.map +1 -0
- package/dist/components/CodeBlock.d.ts +8 -0
- package/dist/components/CodeBlock.d.ts.map +1 -0
- package/dist/components/CodeBlock.jsx +77 -0
- package/dist/components/CodeBlock.jsx.map +1 -0
- package/dist/components/CopyButton.d.ts +6 -0
- package/dist/components/CopyButton.d.ts.map +1 -0
- package/dist/components/CopyButton.jsx +43 -0
- package/dist/components/CopyButton.jsx.map +1 -0
- package/dist/components/FileTreeMdx.d.ts +19 -0
- package/dist/components/FileTreeMdx.d.ts.map +1 -0
- package/dist/components/FileTreeMdx.jsx +79 -0
- package/dist/components/FileTreeMdx.jsx.map +1 -0
- package/dist/components/IconMdx.d.ts +6 -0
- package/dist/components/IconMdx.d.ts.map +1 -0
- package/dist/components/IconMdx.jsx +14 -0
- package/dist/components/IconMdx.jsx.map +1 -0
- package/dist/components/ImageMdx.d.ts +8 -0
- package/dist/components/ImageMdx.d.ts.map +1 -0
- package/dist/components/ImageMdx.jsx +126 -0
- package/dist/components/ImageMdx.jsx.map +1 -0
- package/dist/components/KeyboardMdx.d.ts +10 -0
- package/dist/components/KeyboardMdx.d.ts.map +1 -0
- package/dist/components/KeyboardMdx.jsx +41 -0
- package/dist/components/KeyboardMdx.jsx.map +1 -0
- package/dist/components/LinkMdx.d.ts +4 -0
- package/dist/components/LinkMdx.d.ts.map +1 -0
- package/dist/components/LinkMdx.jsx +9 -0
- package/dist/components/LinkMdx.jsx.map +1 -0
- package/dist/components/NoteMdx.d.ts +13 -0
- package/dist/components/NoteMdx.d.ts.map +1 -0
- package/dist/components/NoteMdx.jsx +87 -0
- package/dist/components/NoteMdx.jsx.map +1 -0
- package/dist/components/ReleaseMdx.d.ts +16 -0
- package/dist/components/ReleaseMdx.d.ts.map +1 -0
- package/dist/components/ReleaseMdx.jsx +56 -0
- package/dist/components/ReleaseMdx.jsx.map +1 -0
- package/dist/components/StepperMdx.d.ts +17 -0
- package/dist/components/StepperMdx.d.ts.map +1 -0
- package/dist/components/StepperMdx.jsx +82 -0
- package/dist/components/StepperMdx.jsx.map +1 -0
- package/dist/components/TableMdx.d.ts +9 -0
- package/dist/components/TableMdx.d.ts.map +1 -0
- package/dist/components/TableMdx.jsx +57 -0
- package/dist/components/TableMdx.jsx.map +1 -0
- package/dist/components/TabsMdx.d.ts +21 -0
- package/dist/components/TabsMdx.d.ts.map +1 -0
- package/dist/components/TabsMdx.jsx +124 -0
- package/dist/components/TabsMdx.jsx.map +1 -0
- package/dist/components/TooltipsMdx.d.ts +10 -0
- package/dist/components/TooltipsMdx.d.ts.map +1 -0
- package/dist/components/TooltipsMdx.jsx +42 -0
- package/dist/components/TooltipsMdx.jsx.map +1 -0
- package/dist/components/YoutubeMdx.d.ts +7 -0
- package/dist/components/YoutubeMdx.d.ts.map +1 -0
- package/dist/components/YoutubeMdx.jsx +15 -0
- package/dist/components/YoutubeMdx.jsx.map +1 -0
- package/dist/components/index.d.ts +17 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +17 -0
- package/dist/components/index.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/registry/index.d.ts +4 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +41 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/server.d.ts +12 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +12 -0
- package/dist/server.js.map +1 -0
- 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 @@
|
|
|
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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"}
|