@humain/ui 2.2.7 → 2.2.9
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/dist/index101.js +2 -2
- package/dist/index101.js.map +1 -1
- package/dist/index103.js +3 -3
- package/dist/index103.js.map +1 -1
- package/dist/index108.js +1 -1
- package/dist/index108.js.map +1 -1
- package/dist/index117.js +1 -1
- package/dist/index117.js.map +1 -1
- package/dist/index122.js +6 -6
- package/dist/index122.js.map +1 -1
- package/dist/index126.js +1 -1
- package/dist/index126.js.map +1 -1
- package/dist/index130.js +2 -2
- package/dist/index130.js.map +1 -1
- package/dist/index146.js +4 -4
- package/dist/index146.js.map +1 -1
- package/dist/index152.js +1 -1
- package/dist/index152.js.map +1 -1
- package/dist/index154.js +2 -2
- package/dist/index154.js.map +1 -1
- package/dist/index166.js +1 -1
- package/dist/index166.js.map +1 -1
- package/dist/index168.js +1 -1
- package/dist/index168.js.map +1 -1
- package/dist/index169.js +1 -1
- package/dist/index169.js.map +1 -1
- package/dist/index173.js +2 -2
- package/dist/index173.js.map +1 -1
- package/dist/index175.js +4 -4
- package/dist/index175.js.map +1 -1
- package/dist/index176.js +2 -2
- package/dist/index176.js.map +1 -1
- package/dist/index177.js +2 -2
- package/dist/index177.js.map +1 -1
- package/dist/index184.js +1 -1
- package/dist/index184.js.map +1 -1
- package/dist/index191.js +3 -3
- package/dist/index191.js.map +1 -1
- package/dist/index192.js +2 -2
- package/dist/index192.js.map +1 -1
- package/dist/index201.js +2 -2
- package/dist/index201.js.map +1 -1
- package/dist/index204.js +4 -4
- package/dist/index204.js.map +1 -1
- package/dist/index228.js +1 -1
- package/dist/index228.js.map +1 -1
- package/dist/index229.js +1 -1
- package/dist/index229.js.map +1 -1
- package/dist/index24.js +2 -2
- package/dist/index24.js.map +1 -1
- package/dist/index5.js +1 -1
- package/dist/index5.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/wc/AICodeBlock.js +41 -41
- package/dist/wc/AICodeBlock.js.map +1 -1
- package/dist/wc/AIMermaidDiagram.js +7 -7
- package/dist/wc/AIMermaidDiagram.js.map +1 -1
- package/dist/wc/AIMessage.js +6 -6
- package/dist/wc/AIMessage.js.map +1 -1
- package/dist/wc/AISource.js +2 -2
- package/dist/wc/AISource.js.map +1 -1
- package/dist/wc/AIToolCall.js +1 -1
- package/dist/wc/AIToolCall.js.map +1 -1
- package/dist/wc/Breadcrumb.js +43 -43
- package/dist/wc/Breadcrumb.js.map +1 -1
- package/dist/wc/DropdownMenu.js +9 -9
- package/dist/wc/DropdownMenu.js.map +1 -1
- package/dist/wc/Kbd.js +22 -22
- package/dist/wc/Kbd.js.map +1 -1
- package/dist/wc/button.js +7 -7
- package/dist/wc/button.js.map +1 -1
- package/dist/wc/close-button.js +19 -19
- package/dist/wc/close-button.js.map +1 -1
- package/dist/wc/hf-ai-prompt-suggestion.js +14 -14
- package/dist/wc/hf-ai-prompt-suggestion.js.map +1 -1
- package/dist/wc/hf-ai-reasoning-block.js +13 -13
- package/dist/wc/hf-ai-reasoning-block.js.map +1 -1
- package/dist/wc/hf-ai-steps.js +53 -53
- package/dist/wc/hf-ai-steps.js.map +1 -1
- package/dist/wc/hf-ai-system-message.js +26 -26
- package/dist/wc/hf-ai-system-message.js.map +1 -1
- package/dist/wc/hf-code-snippet.js +35 -35
- package/dist/wc/hf-code-snippet.js.map +1 -1
- package/dist/wc/hf-command-menu.js +39 -39
- package/dist/wc/hf-command-menu.js.map +1 -1
- package/dist/wc/hf-data-table.js +3 -3
- package/dist/wc/hf-data-table.js.map +1 -1
- package/dist/wc/hf-display-value.js +50 -50
- package/dist/wc/hf-display-value.js.map +1 -1
- package/dist/wc/hf-nav-account-menu.js +5 -5
- package/dist/wc/hf-nav-account-menu.js.map +1 -1
- package/dist/wc/hf-rich-textarea.js +1 -1
- package/dist/wc/hf-rich-textarea.js.map +1 -1
- package/dist/wc/hf-steps.js +8 -8
- package/dist/wc/hf-steps.js.map +1 -1
- package/dist/wc/markdown-renderer.js +1 -1
- package/dist/wc/markdown-renderer.js.map +1 -1
- package/dist/wc/selection-group.js +26 -26
- package/dist/wc/selection-group.js.map +1 -1
- package/dist/wc/syntax-highlight.js +4 -4
- package/dist/wc/syntax-highlight.js.map +1 -1
- package/dist/wc/workflow-step-renderer.js +51 -51
- package/dist/wc/workflow-step-renderer.js.map +1 -1
- package/dist/wc-react/AICodeBlock.js +17 -17
- package/dist/wc-react/AICodeBlock.js.map +1 -1
- package/dist/wc-react/AIMermaidDiagram.js +16 -16
- package/dist/wc-react/AIMermaidDiagram.js.map +1 -1
- package/dist/wc-react/AIMessage.js +7 -7
- package/dist/wc-react/AIMessage.js.map +1 -1
- package/dist/wc-react/AISource.js +41 -41
- package/dist/wc-react/AISource.js.map +1 -1
- package/dist/wc-react/AIToolCall.js +6 -6
- package/dist/wc-react/AIToolCall.js.map +1 -1
- package/dist/wc-react/Breadcrumb.js +18 -18
- package/dist/wc-react/Breadcrumb.js.map +1 -1
- package/dist/wc-react/DropdownMenu.js +27 -27
- package/dist/wc-react/DropdownMenu.js.map +1 -1
- package/dist/wc-react/Kbd.js +17 -17
- package/dist/wc-react/Kbd.js.map +1 -1
- package/dist/wc-react/button.js +12 -12
- package/dist/wc-react/button.js.map +1 -1
- package/dist/wc-react/close-button.js +19 -19
- package/dist/wc-react/close-button.js.map +1 -1
- package/dist/wc-react/hf-ai-prompt-suggestion.js +1 -1
- package/dist/wc-react/hf-ai-prompt-suggestion.js.map +1 -1
- package/dist/wc-react/hf-ai-reasoning-block.js +1 -1
- package/dist/wc-react/hf-ai-reasoning-block.js.map +1 -1
- package/dist/wc-react/hf-ai-steps.js +33 -33
- package/dist/wc-react/hf-ai-steps.js.map +1 -1
- package/dist/wc-react/hf-ai-system-message.js +9 -9
- package/dist/wc-react/hf-ai-system-message.js.map +1 -1
- package/dist/wc-react/hf-code-snippet.js +3 -3
- package/dist/wc-react/hf-code-snippet.js.map +1 -1
- package/dist/wc-react/hf-command-menu.js +56 -56
- package/dist/wc-react/hf-command-menu.js.map +1 -1
- package/dist/wc-react/hf-data-table.js +3 -3
- package/dist/wc-react/hf-data-table.js.map +1 -1
- package/dist/wc-react/hf-display-value.js +58 -58
- package/dist/wc-react/hf-display-value.js.map +1 -1
- package/dist/wc-react/hf-nav-account-menu.js +7 -7
- package/dist/wc-react/hf-nav-account-menu.js.map +1 -1
- package/dist/wc-react/hf-rich-textarea.js +5 -5
- package/dist/wc-react/hf-rich-textarea.js.map +1 -1
- package/dist/wc-react/hf-steps.js +2 -2
- package/dist/wc-react/hf-steps.js.map +1 -1
- package/dist/wc-react/markdown-renderer.js +1 -1
- package/dist/wc-react/markdown-renderer.js.map +1 -1
- package/dist/wc-react/selection-group.js +7 -7
- package/dist/wc-react/selection-group.js.map +1 -1
- package/dist/wc-react/syntax-highlight.js +4 -4
- package/dist/wc-react/syntax-highlight.js.map +1 -1
- package/dist/wc-react/workflow-step-renderer.js +44 -44
- package/dist/wc-react/workflow-step-renderer.js.map +1 -1
- package/package.json +1 -1
- package/skills/humain-ui/SKILL.md +1 -1
- package/skills/humain-ui-wc/SKILL.md +1 -1
- package/skills/humain-ui-wc.skill +0 -0
- package/skills/humain-ui.skill +0 -0
- package/src/tokens.css +4 -0
package/dist/wc/AICodeBlock.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as
|
|
1
|
+
import { a as w, r as N } from "./rolldown-runtime.js";
|
|
2
2
|
import { i as B, t as I } from "./vendor/react.js";
|
|
3
3
|
import { n as c } from "./utils.js";
|
|
4
4
|
import { t as A } from "./check.js";
|
|
@@ -6,8 +6,8 @@ import { t as H } from "./copy.js";
|
|
|
6
6
|
import { t as R } from "./dist.js";
|
|
7
7
|
import { t as z } from "./button.js";
|
|
8
8
|
import { n as T } from "./syntax-highlight.js";
|
|
9
|
-
import { n as
|
|
10
|
-
var l = /* @__PURE__ */
|
|
9
|
+
import { n as F, t as V } from "./syntax-highlight-react.js";
|
|
10
|
+
var l = /* @__PURE__ */ w(B(), 1), e = I(), b = R("relative overflow-hidden rounded-xl border border-border bg-muted", {
|
|
11
11
|
variants: { size: {
|
|
12
12
|
sm: "text-xs",
|
|
13
13
|
md: "text-sm",
|
|
@@ -15,7 +15,7 @@ var l = /* @__PURE__ */ g(B(), 1), e = I(), b = R("relative overflow-hidden roun
|
|
|
15
15
|
} },
|
|
16
16
|
defaultVariants: { size: "md" }
|
|
17
17
|
});
|
|
18
|
-
function
|
|
18
|
+
function E(o, r) {
|
|
19
19
|
return r ? {
|
|
20
20
|
copied: !0,
|
|
21
21
|
resetKey: o.resetKey + 1
|
|
@@ -24,7 +24,7 @@ function V(o, r) {
|
|
|
24
24
|
copied: !1
|
|
25
25
|
};
|
|
26
26
|
}
|
|
27
|
-
function
|
|
27
|
+
function u({ language: o, fileName: r, showCopyButton: t = !0, onCopy: n, copied: s = !1, className: i, actions: d }) {
|
|
28
28
|
return /* @__PURE__ */ (0, e.jsxs)("div", {
|
|
29
29
|
"data-slot": "ai-code-block-header",
|
|
30
30
|
className: c("flex items-center justify-between px-4 py-2 border-b border-border bg-accent", i),
|
|
@@ -34,37 +34,37 @@ function f({ language: o, fileName: r, showCopyButton: s = !0, onCopy: a, copied
|
|
|
34
34
|
className: "text-sm font-medium text-secondary-foreground",
|
|
35
35
|
children: r
|
|
36
36
|
}), o && !r && /* @__PURE__ */ (0, e.jsx)("span", {
|
|
37
|
-
className: "text-xs font-medium text-
|
|
37
|
+
className: "text-xs font-medium text-secondary-foreground uppercase",
|
|
38
38
|
children: o
|
|
39
39
|
})]
|
|
40
40
|
}), /* @__PURE__ */ (0, e.jsxs)("div", {
|
|
41
41
|
className: "flex items-center gap-2",
|
|
42
|
-
children: [d,
|
|
42
|
+
children: [d, t && /* @__PURE__ */ (0, e.jsxs)(z, {
|
|
43
43
|
appearance: "ghost",
|
|
44
44
|
variant: "secondary",
|
|
45
45
|
size: "sm",
|
|
46
|
-
onClick:
|
|
47
|
-
"aria-label":
|
|
48
|
-
className: "h-7 px-2 text-
|
|
49
|
-
children: [
|
|
46
|
+
onClick: n,
|
|
47
|
+
"aria-label": s ? "Copied to clipboard" : "Copy code to clipboard",
|
|
48
|
+
className: "h-7 px-2 text-secondary-foreground hover:text-foreground transition-colors duration-150 ease-out",
|
|
49
|
+
children: [s ? /* @__PURE__ */ (0, e.jsx)(A, { className: "size-4 text-success delight-bounce-in motion-reduce:animate-none" }) : /* @__PURE__ */ (0, e.jsx)(H, { className: "size-4" }), /* @__PURE__ */ (0, e.jsx)("span", {
|
|
50
50
|
className: "ms-1.5 text-xs",
|
|
51
|
-
children:
|
|
51
|
+
children: s ? "Copied!" : "Copy"
|
|
52
52
|
})]
|
|
53
53
|
})]
|
|
54
54
|
})]
|
|
55
55
|
});
|
|
56
56
|
}
|
|
57
|
-
|
|
58
|
-
function
|
|
57
|
+
u.displayName = "AICodeBlockHeader";
|
|
58
|
+
function K({ children: o, showLineNumbers: r, startLineNumber: t }) {
|
|
59
59
|
return r && typeof o == "string" ? /* @__PURE__ */ (0, e.jsxs)("div", {
|
|
60
60
|
className: "flex",
|
|
61
61
|
children: [/* @__PURE__ */ (0, e.jsx)("div", {
|
|
62
62
|
className: "flex flex-col items-end pe-4 select-none border-e border-border me-4",
|
|
63
63
|
children: o.split(`
|
|
64
|
-
`).map((
|
|
65
|
-
className: "text-
|
|
66
|
-
children:
|
|
67
|
-
},
|
|
64
|
+
`).map((n, s) => /* @__PURE__ */ (0, e.jsx)("span", {
|
|
65
|
+
className: "text-secondary-foreground leading-relaxed",
|
|
66
|
+
children: t + s
|
|
67
|
+
}, s))
|
|
68
68
|
}), /* @__PURE__ */ (0, e.jsx)("section", {
|
|
69
69
|
className: "flex-1 overflow-x-auto [overflow-wrap:normal] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring",
|
|
70
70
|
"aria-label": "Code content",
|
|
@@ -84,39 +84,39 @@ function E({ children: o, showLineNumbers: r, startLineNumber: s }) {
|
|
|
84
84
|
})
|
|
85
85
|
});
|
|
86
86
|
}
|
|
87
|
-
function _({ children: o, showLineNumbers: r = !1, startLineNumber:
|
|
87
|
+
function _({ children: o, showLineNumbers: r = !1, startLineNumber: t = 1, className: n }) {
|
|
88
88
|
return /* @__PURE__ */ (0, e.jsx)("div", {
|
|
89
89
|
"data-slot": "ai-code-block-content",
|
|
90
|
-
className: c("p-4 text-sm font-mono leading-relaxed",
|
|
91
|
-
children: /* @__PURE__ */ (0, e.jsx)(
|
|
90
|
+
className: c("p-4 text-sm font-mono leading-relaxed", n),
|
|
91
|
+
children: /* @__PURE__ */ (0, e.jsx)(K, {
|
|
92
92
|
showLineNumbers: r,
|
|
93
|
-
startLineNumber:
|
|
93
|
+
startLineNumber: t,
|
|
94
94
|
children: o
|
|
95
95
|
})
|
|
96
96
|
});
|
|
97
97
|
}
|
|
98
98
|
_.displayName = "AICodeBlockContent";
|
|
99
|
-
function h({ code: o, language: r = "plaintext", fileName:
|
|
100
|
-
const j = l.useMemo(() => m ?
|
|
99
|
+
function h({ code: o, language: r = "plaintext", fileName: t, showHeader: n = !0, showCopyButton: s = !0, showLineNumbers: i = !1, startLineNumber: d = 1, highlightedCode: m, size: v, className: y, headerActions: C }) {
|
|
100
|
+
const j = l.useMemo(() => m ? F(m) : V(o), [o, m]), [f, x] = l.useReducer(E, {
|
|
101
101
|
copied: !1,
|
|
102
102
|
resetKey: 0
|
|
103
|
-
}), { copied: k } =
|
|
103
|
+
}), { copied: k } = f, p = l.useRef(null);
|
|
104
104
|
l.useEffect(() => {
|
|
105
|
-
if (!
|
|
106
|
-
const
|
|
105
|
+
if (!f.copied) return;
|
|
106
|
+
const a = setTimeout(() => {
|
|
107
107
|
x(!1);
|
|
108
108
|
}, 2e3);
|
|
109
109
|
return () => {
|
|
110
|
-
clearTimeout(
|
|
110
|
+
clearTimeout(a);
|
|
111
111
|
};
|
|
112
|
-
}, [
|
|
113
|
-
const
|
|
112
|
+
}, [f]);
|
|
113
|
+
const g = l.useCallback(async () => {
|
|
114
114
|
try {
|
|
115
|
-
const
|
|
116
|
-
if (!
|
|
117
|
-
await
|
|
118
|
-
} catch (
|
|
119
|
-
console.error("Failed to copy code:",
|
|
115
|
+
const a = p.current?.ownerDocument.defaultView;
|
|
116
|
+
if (!a) return;
|
|
117
|
+
await a.navigator.clipboard.writeText(o), x(!0);
|
|
118
|
+
} catch (a) {
|
|
119
|
+
console.error("Failed to copy code:", a);
|
|
120
120
|
}
|
|
121
121
|
}, [o]);
|
|
122
122
|
return /* @__PURE__ */ (0, e.jsxs)("div", {
|
|
@@ -124,15 +124,15 @@ function h({ code: o, language: r = "plaintext", fileName: s, showHeader: a = !0
|
|
|
124
124
|
"data-slot": "ai-code-block",
|
|
125
125
|
className: c(b({ size: v }), y),
|
|
126
126
|
style: T,
|
|
127
|
-
children: [
|
|
127
|
+
children: [n && /* @__PURE__ */ (0, e.jsx)(u, {
|
|
128
128
|
language: r,
|
|
129
|
-
fileName:
|
|
130
|
-
showCopyButton:
|
|
131
|
-
onCopy:
|
|
129
|
+
fileName: t,
|
|
130
|
+
showCopyButton: s,
|
|
131
|
+
onCopy: g,
|
|
132
132
|
copied: k,
|
|
133
133
|
actions: C
|
|
134
134
|
}), /* @__PURE__ */ (0, e.jsx)("section", {
|
|
135
|
-
className: c("p-4 overflow-x-auto font-mono leading-relaxed [overflow-wrap:normal] !bg-transparent !m-0 !border-0 !rounded-none", "[&_.sh__line]:block [&_.sh__line]:leading-relaxed", i && ["[&_.sh__line]:[counter-increment:sh-line]", "[&_.sh__line]:before:[content:counter(sh-line)] [&_.sh__line]:before:inline-block [&_.sh__line]:before:w-8 [&_.sh__line]:before:me-4 [&_.sh__line]:before:text-end [&_.sh__line]:before:text-
|
|
135
|
+
className: c("p-4 overflow-x-auto font-mono leading-relaxed [overflow-wrap:normal] !bg-transparent !m-0 !border-0 !rounded-none", "[&_.sh__line]:block [&_.sh__line]:leading-relaxed", i && ["[&_.sh__line]:[counter-increment:sh-line]", "[&_.sh__line]:before:[content:counter(sh-line)] [&_.sh__line]:before:inline-block [&_.sh__line]:before:w-8 [&_.sh__line]:before:me-4 [&_.sh__line]:before:text-end [&_.sh__line]:before:text-secondary-foreground [&_.sh__line]:before:select-none"]),
|
|
136
136
|
style: i ? { counterReset: `sh-line ${d - 1}` } : void 0,
|
|
137
137
|
"aria-label": "Code content",
|
|
138
138
|
tabIndex: 0,
|
|
@@ -147,7 +147,7 @@ h.displayName = "AICodeBlock";
|
|
|
147
147
|
var L = /* @__PURE__ */ N({
|
|
148
148
|
AICodeBlock: () => h,
|
|
149
149
|
AICodeBlockContent: () => _,
|
|
150
|
-
AICodeBlockHeader: () =>
|
|
150
|
+
AICodeBlockHeader: () => u,
|
|
151
151
|
codeBlockVariants: () => b
|
|
152
152
|
});
|
|
153
153
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AICodeBlock.js","names":[],"sources":["../../src/components/organisms/ai/AICodeBlock/AICodeBlock.tsx","../../src/components/organisms/ai/AICodeBlock/index.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport { Check, Copy } from 'lucide-react';\nimport * as React from 'react';\nimport { Button } from '@/components/atoms/buttons/Button';\nimport { SUGAR_HIGH_STYLE } from '@/lib/syntax-highlight';\nimport {\n renderHighlightedCode,\n renderHighlightedMarkup,\n} from '@/lib/syntax-highlight-react';\nimport { cn } from '@/lib/utils';\n\n// =============================================================================\n// Variants\n// =============================================================================\n\nconst codeBlockVariants = cva(\n 'relative overflow-hidden rounded-xl border border-border bg-muted',\n {\n variants: {\n size: {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\ninterface CopyFeedbackState {\n copied: boolean;\n resetKey: number;\n}\n\nfunction copyFeedbackReducer(\n state: CopyFeedbackState,\n copied: boolean,\n): CopyFeedbackState {\n return copied\n ? { copied: true, resetKey: state.resetKey + 1 }\n : { ...state, copied: false };\n}\n\n// =============================================================================\n// Code Block Header\n// =============================================================================\n\nexport interface AICodeBlockHeaderProps {\n /** Programming language */\n language?: string;\n /** File name to display */\n fileName?: string;\n /** Whether to show copy button */\n showCopyButton?: boolean;\n /** Callback when copy is clicked */\n onCopy?: () => void;\n /** Whether content was copied */\n copied?: boolean;\n /** Additional class name */\n className?: string;\n /** Extra actions to render */\n actions?: React.ReactNode;\n}\n\nfunction AICodeBlockHeader({\n language,\n fileName,\n showCopyButton = true,\n onCopy,\n copied = false,\n className,\n actions,\n}: AICodeBlockHeaderProps) {\n return (\n <div\n data-slot=\"ai-code-block-header\"\n className={cn(\n 'flex items-center justify-between px-4 py-2 border-b border-border bg-accent',\n className,\n )}\n >\n <div className=\"flex items-center gap-2\">\n {fileName && (\n <span className=\"text-sm font-medium text-secondary-foreground\">\n {fileName}\n </span>\n )}\n {language && !fileName && (\n <span className=\"text-xs font-medium text-text-quaternary uppercase\">\n {language}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {actions}\n {showCopyButton && (\n <Button\n appearance=\"ghost\"\n variant=\"secondary\"\n size=\"sm\"\n onClick={onCopy}\n aria-label={\n copied ? 'Copied to clipboard' : 'Copy code to clipboard'\n }\n className=\"h-7 px-2 text-text-quaternary hover:text-secondary-foreground transition-colors duration-150 ease-out\"\n >\n {copied ? (\n <Check className=\"size-4 text-success delight-bounce-in motion-reduce:animate-none\" />\n ) : (\n <Copy className=\"size-4\" />\n )}\n <span className=\"ms-1.5 text-xs\">\n {copied ? 'Copied!' : 'Copy'}\n </span>\n </Button>\n )}\n </div>\n </div>\n );\n}\n\nAICodeBlockHeader.displayName = 'AICodeBlockHeader';\n\n// =============================================================================\n// Code Block Content\n// =============================================================================\n\nexport interface AICodeBlockContentProps {\n /** Code content */\n children: React.ReactNode;\n /** Whether to show line numbers */\n showLineNumbers?: boolean;\n /** Starting line number */\n startLineNumber?: number;\n /** Additional class name */\n className?: string;\n}\n\ninterface AICodeBlockContentBodyProps {\n children: React.ReactNode;\n showLineNumbers: boolean;\n startLineNumber: number;\n}\n\nfunction AICodeBlockContentBody({\n children,\n showLineNumbers,\n startLineNumber,\n}: AICodeBlockContentBodyProps): React.ReactNode {\n if (showLineNumbers && typeof children === 'string') {\n const lines = children.split('\\n');\n return (\n <div className=\"flex\">\n <div className=\"flex flex-col items-end pe-4 select-none border-e border-border me-4\">\n {lines.map((_, index) => (\n <span key={index} className=\"text-muted-foreground leading-relaxed\">\n {startLineNumber + index}\n </span>\n ))}\n </div>\n <section\n className=\"flex-1 overflow-x-auto [overflow-wrap:normal] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring\"\n aria-label=\"Code content\"\n // biome-ignore lint/a11y/noNoninteractiveTabindex: Focusable scroll region satisfies axe scrollable-region-focusable.\n tabIndex={0}\n >\n <pre className=\"m-0 [overflow-wrap:normal]\">\n <code>{children}</code>\n </pre>\n </section>\n </div>\n );\n }\n\n return (\n <section\n className=\"overflow-x-auto [overflow-wrap:normal] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring\"\n aria-label=\"Code content\"\n // biome-ignore lint/a11y/noNoninteractiveTabindex: Focusable scroll region satisfies axe scrollable-region-focusable.\n tabIndex={0}\n >\n <pre className=\"m-0 [overflow-wrap:normal]\">\n <code>{children}</code>\n </pre>\n </section>\n );\n}\n\nfunction AICodeBlockContent({\n children,\n showLineNumbers = false,\n startLineNumber = 1,\n className,\n}: AICodeBlockContentProps) {\n return (\n <div\n data-slot=\"ai-code-block-content\"\n className={cn('p-4 text-sm font-mono leading-relaxed', className)}\n >\n <AICodeBlockContentBody\n showLineNumbers={showLineNumbers}\n startLineNumber={startLineNumber}\n >\n {children}\n </AICodeBlockContentBody>\n </div>\n );\n}\n\nAICodeBlockContent.displayName = 'AICodeBlockContent';\n\n// =============================================================================\n// Main AICodeBlock Component\n// =============================================================================\n\nexport interface AICodeBlockProps\n extends VariantProps<typeof codeBlockVariants> {\n /** Code content to display */\n code: string;\n /** Programming language for syntax highlighting */\n language?: string;\n /** File name to display in header */\n fileName?: string;\n /** Whether to show the header */\n showHeader?: boolean;\n /** Whether to show copy button */\n showCopyButton?: boolean;\n /** Whether to show line numbers */\n showLineNumbers?: boolean;\n /** Starting line number */\n startLineNumber?: number;\n /** Pre-highlighted HTML content */\n highlightedCode?: string;\n /** Additional class name */\n className?: string;\n /** Extra actions for the header */\n headerActions?: React.ReactNode;\n}\n\nfunction AICodeBlock({\n code,\n language = 'plaintext',\n fileName,\n showHeader = true,\n showCopyButton = true,\n showLineNumbers = false,\n startLineNumber = 1,\n highlightedCode,\n size,\n className,\n headerActions,\n}: AICodeBlockProps) {\n const highlightedContent = React.useMemo(\n () =>\n highlightedCode\n ? renderHighlightedMarkup(highlightedCode)\n : renderHighlightedCode(code),\n [code, highlightedCode],\n );\n const [copyFeedback, setCopyFeedback] = React.useReducer(\n copyFeedbackReducer,\n { copied: false, resetKey: 0 },\n );\n const { copied } = copyFeedback;\n const rootRef = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n if (!copyFeedback.copied) return;\n\n const copyResetTimer = setTimeout(() => {\n setCopyFeedback(false);\n }, 2000);\n\n return () => {\n clearTimeout(copyResetTimer);\n };\n }, [copyFeedback]);\n\n const handleCopy = React.useCallback(async () => {\n try {\n // SSR guard: access clipboard via ref's ownerDocument\n const win = rootRef.current?.ownerDocument.defaultView;\n if (!win) return;\n await win.navigator.clipboard.writeText(code);\n setCopyFeedback(true);\n } catch (err) {\n console.error('Failed to copy code:', err);\n }\n }, [code]);\n\n return (\n <div\n ref={rootRef}\n data-slot=\"ai-code-block\"\n className={cn(codeBlockVariants({ size }), className)}\n style={SUGAR_HIGH_STYLE}\n >\n {showHeader && (\n <AICodeBlockHeader\n language={language}\n fileName={fileName}\n showCopyButton={showCopyButton}\n onCopy={handleCopy}\n copied={copied}\n actions={headerActions}\n />\n )}\n <section\n className={cn(\n 'p-4 overflow-x-auto font-mono leading-relaxed [overflow-wrap:normal] !bg-transparent !m-0 !border-0 !rounded-none',\n '[&_.sh__line]:block [&_.sh__line]:leading-relaxed',\n showLineNumbers && [\n '[&_.sh__line]:[counter-increment:sh-line]',\n '[&_.sh__line]:before:[content:counter(sh-line)] [&_.sh__line]:before:inline-block [&_.sh__line]:before:w-8 [&_.sh__line]:before:me-4 [&_.sh__line]:before:text-end [&_.sh__line]:before:text-muted-foreground [&_.sh__line]:before:select-none',\n ],\n )}\n style={\n showLineNumbers\n ? ({\n counterReset: `sh-line ${startLineNumber - 1}`,\n } as React.CSSProperties)\n : undefined\n }\n aria-label=\"Code content\"\n // biome-ignore lint/a11y/noNoninteractiveTabindex: Focusable scroll region satisfies axe scrollable-region-focusable.\n tabIndex={0}\n >\n <pre className=\"!m-0 !bg-transparent [overflow-wrap:normal]\">\n {highlightedContent}\n </pre>\n </section>\n </div>\n );\n}\n\nAICodeBlock.displayName = 'AICodeBlock';\n\nexport {\n AICodeBlock,\n AICodeBlockContent,\n AICodeBlockHeader,\n codeBlockVariants,\n};\n","export * from './AICodeBlock';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AICodeBlock.js","names":[],"sources":["../../src/components/organisms/ai/AICodeBlock/AICodeBlock.tsx","../../src/components/organisms/ai/AICodeBlock/index.ts"],"sourcesContent":["import { cva, type VariantProps } from 'class-variance-authority';\nimport { Check, Copy } from 'lucide-react';\nimport * as React from 'react';\nimport { Button } from '@/components/atoms/buttons/Button';\nimport { SUGAR_HIGH_STYLE } from '@/lib/syntax-highlight';\nimport {\n renderHighlightedCode,\n renderHighlightedMarkup,\n} from '@/lib/syntax-highlight-react';\nimport { cn } from '@/lib/utils';\n\n// =============================================================================\n// Variants\n// =============================================================================\n\nconst codeBlockVariants = cva(\n 'relative overflow-hidden rounded-xl border border-border bg-muted',\n {\n variants: {\n size: {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n },\n },\n defaultVariants: {\n size: 'md',\n },\n },\n);\n\ninterface CopyFeedbackState {\n copied: boolean;\n resetKey: number;\n}\n\nfunction copyFeedbackReducer(\n state: CopyFeedbackState,\n copied: boolean,\n): CopyFeedbackState {\n return copied\n ? { copied: true, resetKey: state.resetKey + 1 }\n : { ...state, copied: false };\n}\n\n// =============================================================================\n// Code Block Header\n// =============================================================================\n\nexport interface AICodeBlockHeaderProps {\n /** Programming language */\n language?: string;\n /** File name to display */\n fileName?: string;\n /** Whether to show copy button */\n showCopyButton?: boolean;\n /** Callback when copy is clicked */\n onCopy?: () => void;\n /** Whether content was copied */\n copied?: boolean;\n /** Additional class name */\n className?: string;\n /** Extra actions to render */\n actions?: React.ReactNode;\n}\n\nfunction AICodeBlockHeader({\n language,\n fileName,\n showCopyButton = true,\n onCopy,\n copied = false,\n className,\n actions,\n}: AICodeBlockHeaderProps) {\n return (\n <div\n data-slot=\"ai-code-block-header\"\n className={cn(\n 'flex items-center justify-between px-4 py-2 border-b border-border bg-accent',\n className,\n )}\n >\n <div className=\"flex items-center gap-2\">\n {fileName && (\n <span className=\"text-sm font-medium text-secondary-foreground\">\n {fileName}\n </span>\n )}\n {language && !fileName && (\n <span className=\"text-xs font-medium text-secondary-foreground uppercase\">\n {language}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-2\">\n {actions}\n {showCopyButton && (\n <Button\n appearance=\"ghost\"\n variant=\"secondary\"\n size=\"sm\"\n onClick={onCopy}\n aria-label={\n copied ? 'Copied to clipboard' : 'Copy code to clipboard'\n }\n className=\"h-7 px-2 text-secondary-foreground hover:text-foreground transition-colors duration-150 ease-out\"\n >\n {copied ? (\n <Check className=\"size-4 text-success delight-bounce-in motion-reduce:animate-none\" />\n ) : (\n <Copy className=\"size-4\" />\n )}\n <span className=\"ms-1.5 text-xs\">\n {copied ? 'Copied!' : 'Copy'}\n </span>\n </Button>\n )}\n </div>\n </div>\n );\n}\n\nAICodeBlockHeader.displayName = 'AICodeBlockHeader';\n\n// =============================================================================\n// Code Block Content\n// =============================================================================\n\nexport interface AICodeBlockContentProps {\n /** Code content */\n children: React.ReactNode;\n /** Whether to show line numbers */\n showLineNumbers?: boolean;\n /** Starting line number */\n startLineNumber?: number;\n /** Additional class name */\n className?: string;\n}\n\ninterface AICodeBlockContentBodyProps {\n children: React.ReactNode;\n showLineNumbers: boolean;\n startLineNumber: number;\n}\n\nfunction AICodeBlockContentBody({\n children,\n showLineNumbers,\n startLineNumber,\n}: AICodeBlockContentBodyProps): React.ReactNode {\n if (showLineNumbers && typeof children === 'string') {\n const lines = children.split('\\n');\n return (\n <div className=\"flex\">\n <div className=\"flex flex-col items-end pe-4 select-none border-e border-border me-4\">\n {lines.map((_, index) => (\n <span\n key={index}\n className=\"text-secondary-foreground leading-relaxed\"\n >\n {startLineNumber + index}\n </span>\n ))}\n </div>\n <section\n className=\"flex-1 overflow-x-auto [overflow-wrap:normal] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring\"\n aria-label=\"Code content\"\n // biome-ignore lint/a11y/noNoninteractiveTabindex: Focusable scroll region satisfies axe scrollable-region-focusable.\n tabIndex={0}\n >\n <pre className=\"m-0 [overflow-wrap:normal]\">\n <code>{children}</code>\n </pre>\n </section>\n </div>\n );\n }\n\n return (\n <section\n className=\"overflow-x-auto [overflow-wrap:normal] focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-ring\"\n aria-label=\"Code content\"\n // biome-ignore lint/a11y/noNoninteractiveTabindex: Focusable scroll region satisfies axe scrollable-region-focusable.\n tabIndex={0}\n >\n <pre className=\"m-0 [overflow-wrap:normal]\">\n <code>{children}</code>\n </pre>\n </section>\n );\n}\n\nfunction AICodeBlockContent({\n children,\n showLineNumbers = false,\n startLineNumber = 1,\n className,\n}: AICodeBlockContentProps) {\n return (\n <div\n data-slot=\"ai-code-block-content\"\n className={cn('p-4 text-sm font-mono leading-relaxed', className)}\n >\n <AICodeBlockContentBody\n showLineNumbers={showLineNumbers}\n startLineNumber={startLineNumber}\n >\n {children}\n </AICodeBlockContentBody>\n </div>\n );\n}\n\nAICodeBlockContent.displayName = 'AICodeBlockContent';\n\n// =============================================================================\n// Main AICodeBlock Component\n// =============================================================================\n\nexport interface AICodeBlockProps\n extends VariantProps<typeof codeBlockVariants> {\n /** Code content to display */\n code: string;\n /** Programming language for syntax highlighting */\n language?: string;\n /** File name to display in header */\n fileName?: string;\n /** Whether to show the header */\n showHeader?: boolean;\n /** Whether to show copy button */\n showCopyButton?: boolean;\n /** Whether to show line numbers */\n showLineNumbers?: boolean;\n /** Starting line number */\n startLineNumber?: number;\n /** Pre-highlighted HTML content */\n highlightedCode?: string;\n /** Additional class name */\n className?: string;\n /** Extra actions for the header */\n headerActions?: React.ReactNode;\n}\n\nfunction AICodeBlock({\n code,\n language = 'plaintext',\n fileName,\n showHeader = true,\n showCopyButton = true,\n showLineNumbers = false,\n startLineNumber = 1,\n highlightedCode,\n size,\n className,\n headerActions,\n}: AICodeBlockProps) {\n const highlightedContent = React.useMemo(\n () =>\n highlightedCode\n ? renderHighlightedMarkup(highlightedCode)\n : renderHighlightedCode(code),\n [code, highlightedCode],\n );\n const [copyFeedback, setCopyFeedback] = React.useReducer(\n copyFeedbackReducer,\n { copied: false, resetKey: 0 },\n );\n const { copied } = copyFeedback;\n const rootRef = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n if (!copyFeedback.copied) return;\n\n const copyResetTimer = setTimeout(() => {\n setCopyFeedback(false);\n }, 2000);\n\n return () => {\n clearTimeout(copyResetTimer);\n };\n }, [copyFeedback]);\n\n const handleCopy = React.useCallback(async () => {\n try {\n // SSR guard: access clipboard via ref's ownerDocument\n const win = rootRef.current?.ownerDocument.defaultView;\n if (!win) return;\n await win.navigator.clipboard.writeText(code);\n setCopyFeedback(true);\n } catch (err) {\n console.error('Failed to copy code:', err);\n }\n }, [code]);\n\n return (\n <div\n ref={rootRef}\n data-slot=\"ai-code-block\"\n className={cn(codeBlockVariants({ size }), className)}\n style={SUGAR_HIGH_STYLE}\n >\n {showHeader && (\n <AICodeBlockHeader\n language={language}\n fileName={fileName}\n showCopyButton={showCopyButton}\n onCopy={handleCopy}\n copied={copied}\n actions={headerActions}\n />\n )}\n <section\n className={cn(\n 'p-4 overflow-x-auto font-mono leading-relaxed [overflow-wrap:normal] !bg-transparent !m-0 !border-0 !rounded-none',\n '[&_.sh__line]:block [&_.sh__line]:leading-relaxed',\n showLineNumbers && [\n '[&_.sh__line]:[counter-increment:sh-line]',\n '[&_.sh__line]:before:[content:counter(sh-line)] [&_.sh__line]:before:inline-block [&_.sh__line]:before:w-8 [&_.sh__line]:before:me-4 [&_.sh__line]:before:text-end [&_.sh__line]:before:text-secondary-foreground [&_.sh__line]:before:select-none',\n ],\n )}\n style={\n showLineNumbers\n ? ({\n counterReset: `sh-line ${startLineNumber - 1}`,\n } as React.CSSProperties)\n : undefined\n }\n aria-label=\"Code content\"\n // biome-ignore lint/a11y/noNoninteractiveTabindex: Focusable scroll region satisfies axe scrollable-region-focusable.\n tabIndex={0}\n >\n <pre className=\"!m-0 !bg-transparent [overflow-wrap:normal]\">\n {highlightedContent}\n </pre>\n </section>\n </div>\n );\n}\n\nAICodeBlock.displayName = 'AICodeBlock';\n\nexport {\n AICodeBlock,\n AICodeBlockContent,\n AICodeBlockHeader,\n codeBlockVariants,\n};\n","export * from './AICodeBlock';\n"],"mappings":"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"}
|
|
@@ -266,7 +266,7 @@ var h = {
|
|
|
266
266
|
function ee(t) {
|
|
267
267
|
return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(t)}`;
|
|
268
268
|
}
|
|
269
|
-
function
|
|
269
|
+
function q({ maxHeight: t }) {
|
|
270
270
|
return /* @__PURE__ */ (0, a.jsx)("div", {
|
|
271
271
|
className: "flex items-center justify-center p-8 rounded-xl border border-border bg-muted",
|
|
272
272
|
style: {
|
|
@@ -425,7 +425,7 @@ function S({ code: t, theme: i = "auto", caption: r, interactive: e = !1, maxHei
|
|
|
425
425
|
x,
|
|
426
426
|
e,
|
|
427
427
|
d
|
|
428
|
-
]),
|
|
428
|
+
]), R = l.useCallback(() => {
|
|
429
429
|
D(!1);
|
|
430
430
|
}, []), P = l.useCallback(() => {
|
|
431
431
|
d(h);
|
|
@@ -433,7 +433,7 @@ function S({ code: t, theme: i = "auto", caption: r, interactive: e = !1, maxHei
|
|
|
433
433
|
if (A) return /* @__PURE__ */ (0, a.jsx)("div", {
|
|
434
434
|
ref: b,
|
|
435
435
|
"data-slot": "ai-mermaid-diagram-status",
|
|
436
|
-
children: /* @__PURE__ */ (0, a.jsx)(
|
|
436
|
+
children: /* @__PURE__ */ (0, a.jsx)(q, { maxHeight: g })
|
|
437
437
|
});
|
|
438
438
|
if (T) return /* @__PURE__ */ (0, a.jsx)("div", {
|
|
439
439
|
ref: b,
|
|
@@ -446,7 +446,7 @@ function S({ code: t, theme: i = "auto", caption: r, interactive: e = !1, maxHei
|
|
|
446
446
|
if (!M) return /* @__PURE__ */ (0, a.jsx)("div", {
|
|
447
447
|
ref: b,
|
|
448
448
|
"data-slot": "ai-mermaid-diagram-status",
|
|
449
|
-
children: /* @__PURE__ */ (0, a.jsx)(
|
|
449
|
+
children: /* @__PURE__ */ (0, a.jsx)(q, { maxHeight: g })
|
|
450
450
|
});
|
|
451
451
|
const U = ee(M);
|
|
452
452
|
return /* @__PURE__ */ (0, a.jsxs)("figure", {
|
|
@@ -460,8 +460,8 @@ function S({ code: t, theme: i = "auto", caption: r, interactive: e = !1, maxHei
|
|
|
460
460
|
onWheel: _,
|
|
461
461
|
onMouseDown: O,
|
|
462
462
|
onMouseMove: H,
|
|
463
|
-
onMouseUp:
|
|
464
|
-
onMouseLeave:
|
|
463
|
+
onMouseUp: R,
|
|
464
|
+
onMouseLeave: R,
|
|
465
465
|
children: [/* @__PURE__ */ (0, a.jsx)("div", {
|
|
466
466
|
className: j("flex items-center justify-center p-4", g !== void 0 && "overflow-auto"),
|
|
467
467
|
...g !== void 0 ? {
|
|
@@ -538,7 +538,7 @@ function S({ code: t, theme: i = "auto", caption: r, interactive: e = !1, maxHei
|
|
|
538
538
|
})
|
|
539
539
|
}),
|
|
540
540
|
/* @__PURE__ */ (0, a.jsxs)("span", {
|
|
541
|
-
className: "text-xs text-
|
|
541
|
+
className: "text-xs text-secondary-foreground px-1 tabular-nums",
|
|
542
542
|
children: [Math.round(c.scale * 100), "%"]
|
|
543
543
|
})
|
|
544
544
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AIMermaidDiagram.js","names":[],"sources":["../../src/components/organisms/ai/AIMermaidDiagram/mermaid-theme.ts","../../src/components/organisms/ai/AIMermaidDiagram/AIMermaidDiagram.tsx","../../src/components/organisms/ai/AIMermaidDiagram/index.ts"],"sourcesContent":["import type { MermaidConfig } from 'mermaid';\n\n/**\n * Build a color palette by resolving CSS custom properties at runtime.\n * Uses a single getComputedStyle() call for efficiency, then reads\n * all token values from the cached CSSStyleDeclaration object.\n * Falls back to hard-coded hex when tokens are unavailable (SSR, missing vars).\n */\nfunction resolveColors(el?: Element | null) {\n if (typeof window === 'undefined') {\n return {\n blue500: '#3b82f6',\n blue600: '#2563eb',\n gray900: '#0f172a',\n gray50: '#f8fafc',\n gray300: '#cbd5e1',\n gray500: '#475569',\n gray200: '#e2e8f0',\n gray700: '#334155',\n gray800: '#1e293b',\n gray100: '#f1f5f9',\n };\n }\n\n const ownerDocument = el?.ownerDocument;\n const OwnerWindow = ownerDocument?.defaultView;\n\n if (!ownerDocument || !OwnerWindow) {\n return {\n blue500: '#3b82f6',\n blue600: '#2563eb',\n gray900: '#0f172a',\n gray50: '#f8fafc',\n gray300: '#cbd5e1',\n gray500: '#475569',\n gray200: '#e2e8f0',\n gray700: '#334155',\n gray800: '#1e293b',\n gray100: '#f1f5f9',\n };\n }\n\n const styles = OwnerWindow.getComputedStyle(\n el ?? ownerDocument.documentElement,\n );\n const r = (token: string, fallback: string) =>\n styles.getPropertyValue(token).trim() || fallback;\n\n return {\n blue500: r('--blue-500', '#3b82f6'),\n blue600: r('--blue-600', '#2563eb'),\n gray900: r('--gray-900', '#0f172a'),\n gray50: r('--gray-50', '#f8fafc'),\n gray300: r('--gray-300', '#cbd5e1'),\n gray500: r('--gray-500', '#475569'),\n gray200: r('--gray-200', '#e2e8f0'),\n gray700: r('--gray-700', '#334155'),\n gray800: r('--gray-800', '#1e293b'),\n gray100: r('--gray-100', '#f1f5f9'),\n };\n}\n\n/**\n * Get mermaid configuration based on theme\n *\n * Maps design system tokens to mermaid theme variables.\n * Colors are resolved from CSS custom properties at runtime so the\n * diagram follows whatever palette the host page provides. Hard-coded\n * fallbacks are used when getComputedStyle cannot read the tokens.\n */\nexport function getMermaidConfig(\n theme: 'light' | 'dark',\n el?: Element | null,\n): MermaidConfig {\n const isDark = theme === 'dark';\n const c = resolveColors(el);\n\n return {\n startOnLoad: false,\n securityLevel: 'strict',\n suppressErrorRendering: true,\n theme: 'base',\n themeVariables: {\n // Base colors\n primaryColor: isDark ? c.blue500 : c.blue600,\n primaryTextColor: isDark ? c.gray50 : c.gray900,\n primaryBorderColor: isDark ? c.gray500 : c.gray300,\n\n // Secondary colors\n secondaryColor: isDark ? c.gray700 : c.gray200,\n secondaryTextColor: isDark ? c.gray100 : c.gray800,\n secondaryBorderColor: isDark ? c.gray500 : c.gray300,\n\n // Tertiary colors\n tertiaryColor: isDark ? c.gray800 : c.gray100,\n tertiaryTextColor: isDark ? c.gray200 : c.gray700,\n tertiaryBorderColor: isDark ? c.gray700 : c.gray200,\n\n // Background\n background: isDark ? c.gray900 : '#ffffff',\n mainBkg: isDark ? c.gray800 : c.gray50,\n\n // Text\n textColor: isDark ? c.gray200 : c.gray800,\n titleColor: isDark ? c.gray50 : c.gray900,\n\n // Lines and borders\n lineColor: isDark ? c.gray500 : '#94a3b8',\n nodeBorder: isDark ? c.gray500 : c.gray300,\n\n // Notes\n noteBkgColor: isDark ? c.gray700 : '#fef9c3',\n noteTextColor: isDark ? c.gray100 : c.gray800,\n noteBorderColor: isDark ? c.gray500 : '#fde047',\n\n // Flowchart specific\n clusterBkg: isDark ? c.gray800 : c.gray100,\n clusterBorder: isDark ? c.gray700 : c.gray200,\n\n // Sequence diagram specific\n actorBkg: isDark ? c.gray800 : c.gray50,\n actorBorder: isDark ? c.gray500 : c.gray300,\n actorTextColor: isDark ? c.gray100 : c.gray800,\n actorLineColor: isDark ? '#64748b' : '#94a3b8',\n signalColor: isDark ? '#64748b' : '#64748b',\n signalTextColor: isDark ? c.gray200 : c.gray800,\n labelBoxBkgColor: isDark ? c.gray700 : c.gray100,\n labelBoxBorderColor: isDark ? c.gray500 : c.gray300,\n labelTextColor: isDark ? c.gray100 : c.gray800,\n loopTextColor: isDark ? c.gray100 : c.gray800,\n activationBkgColor: isDark ? c.blue500 : '#dbeafe',\n activationBorderColor: isDark ? c.blue600 : c.blue500,\n sequenceNumberColor: isDark ? c.gray50 : c.gray900,\n\n // Class diagram specific\n classText: isDark ? c.gray200 : c.gray800,\n\n // State diagram specific\n labelColor: isDark ? c.gray200 : c.gray800,\n\n // ER diagram specific\n entityBorder: isDark ? c.gray500 : c.gray300,\n entityBkg: isDark ? c.gray800 : c.gray50,\n entityTextColor: isDark ? c.gray100 : c.gray800,\n relationColor: isDark ? '#64748b' : '#94a3b8',\n relationLabelColor: isDark ? c.gray200 : c.gray800,\n relationLabelBackground: isDark ? c.gray900 : '#ffffff',\n attributeBackgroundColorOdd: isDark ? c.gray700 : c.gray100,\n attributeBackgroundColorEven: isDark ? c.gray800 : c.gray50,\n\n // Gantt chart specific\n sectionBkgColor: isDark ? c.gray700 : c.gray200,\n altSectionBkgColor: isDark ? c.gray800 : c.gray100,\n sectionBkgColor2: isDark ? c.gray800 : c.gray50,\n gridColor: isDark ? c.gray700 : c.gray200,\n doneTaskBkgColor: isDark ? '#22c55e' : '#86efac',\n doneTaskBorderColor: isDark ? '#16a34a' : '#22c55e',\n activeTaskBkgColor: isDark ? c.blue500 : '#93c5fd',\n activeTaskBorderColor: isDark ? c.blue600 : c.blue500,\n critBkgColor: isDark ? '#ef4444' : '#fecaca',\n critBorderColor: isDark ? '#dc2626' : '#ef4444',\n taskBkgColor: isDark ? c.gray500 : c.gray300,\n taskBorderColor: isDark ? '#64748b' : '#94a3b8',\n taskTextColor: isDark ? c.gray100 : c.gray800,\n taskTextOutsideColor: isDark ? c.gray200 : c.gray800,\n taskTextLightColor: isDark ? c.gray50 : c.gray900,\n todayLineColor: isDark ? '#f472b6' : '#ec4899',\n\n // Pie chart specific\n pieStrokeColor: isDark ? c.gray900 : '#ffffff',\n pieLegendTextColor: isDark ? c.gray200 : c.gray800,\n pieSectionTextColor: isDark ? c.gray50 : c.gray900,\n pieStrokeWidth: '2px',\n pieOuterStrokeWidth: '2px',\n pie1: isDark ? c.blue500 : c.blue600,\n pie2: isDark ? '#22c55e' : '#16a34a',\n pie3: isDark ? '#f59e0b' : '#d97706',\n pie4: isDark ? '#ef4444' : '#dc2626',\n pie5: isDark ? '#a855f7' : '#9333ea',\n pie6: isDark ? '#ec4899' : '#db2777',\n pie7: isDark ? '#06b6d4' : '#0891b2',\n pie8: isDark ? '#84cc16' : '#65a30d',\n pie9: isDark ? '#f97316' : '#ea580c',\n pie10: isDark ? '#6366f1' : '#4f46e5',\n pie11: isDark ? '#14b8a6' : '#0d9488',\n pie12: isDark ? '#f43f5e' : '#e11d48',\n\n // Mindmap specific\n mindmapColors: isDark\n ? [c.blue500, '#22c55e', '#f59e0b', '#ef4444', '#a855f7', '#ec4899']\n : [c.blue600, '#16a34a', '#d97706', '#dc2626', '#9333ea', '#db2777'],\n\n // Git diagram specific\n git0: isDark ? c.blue500 : c.blue600,\n git1: isDark ? '#22c55e' : '#16a34a',\n git2: isDark ? '#f59e0b' : '#d97706',\n git3: isDark ? '#ef4444' : '#dc2626',\n git4: isDark ? '#a855f7' : '#9333ea',\n git5: isDark ? '#ec4899' : '#db2777',\n git6: isDark ? '#06b6d4' : '#0891b2',\n git7: isDark ? '#84cc16' : '#65a30d',\n gitBranchLabel0: isDark ? c.gray50 : c.gray900,\n gitBranchLabel1: isDark ? c.gray50 : c.gray900,\n gitBranchLabel2: isDark ? c.gray50 : c.gray900,\n gitBranchLabel3: isDark ? c.gray50 : c.gray900,\n gitBranchLabel4: isDark ? c.gray50 : c.gray900,\n gitBranchLabel5: isDark ? c.gray50 : c.gray900,\n gitBranchLabel6: isDark ? c.gray50 : c.gray900,\n gitBranchLabel7: isDark ? c.gray50 : c.gray900,\n commitLabelColor: isDark ? c.gray50 : c.gray900,\n commitLabelBackground: isDark ? c.gray700 : c.gray200,\n\n // Quadrant chart specific\n quadrant1Fill: isDark ? c.blue500 : '#dbeafe',\n quadrant2Fill: isDark ? '#22c55e' : '#dcfce7',\n quadrant3Fill: isDark ? '#f59e0b' : '#fef3c7',\n quadrant4Fill: isDark ? '#ef4444' : '#fee2e2',\n quadrant1TextFill: isDark ? c.gray50 : c.gray800,\n quadrant2TextFill: isDark ? c.gray50 : c.gray800,\n quadrant3TextFill: isDark ? c.gray50 : c.gray800,\n quadrant4TextFill: isDark ? c.gray50 : c.gray800,\n quadrantPointFill: isDark ? c.gray200 : c.gray800,\n quadrantPointTextFill: isDark ? c.gray200 : c.gray800,\n quadrantExternalBorderStrokeFill: isDark ? c.gray500 : c.gray300,\n quadrantInternalBorderStrokeFill: isDark ? c.gray700 : c.gray200,\n quadrantTitleFill: isDark ? c.gray50 : c.gray900,\n quadrantXAxisTextFill: isDark ? c.gray200 : c.gray800,\n quadrantYAxisTextFill: isDark ? c.gray200 : c.gray800,\n\n // Timeline specific\n cScale0: isDark ? c.blue500 : c.blue600,\n cScale1: isDark ? '#22c55e' : '#16a34a',\n cScale2: isDark ? '#f59e0b' : '#d97706',\n cScale3: isDark ? '#ef4444' : '#dc2626',\n cScale4: isDark ? '#a855f7' : '#9333ea',\n cScale5: isDark ? '#ec4899' : '#db2777',\n cScale6: isDark ? '#06b6d4' : '#0891b2',\n cScale7: isDark ? '#84cc16' : '#65a30d',\n\n // Font settings\n fontFamily:\n 'ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\"',\n fontSize: '14px',\n },\n flowchart: {\n htmlLabels: true,\n curve: 'basis',\n padding: 15,\n nodeSpacing: 50,\n rankSpacing: 50,\n },\n sequence: {\n diagramMarginX: 50,\n diagramMarginY: 10,\n actorMargin: 50,\n width: 150,\n height: 65,\n boxMargin: 10,\n boxTextMargin: 5,\n noteMargin: 10,\n messageMargin: 35,\n mirrorActors: true,\n bottomMarginAdj: 1,\n showSequenceNumbers: false,\n },\n gantt: {\n titleTopMargin: 25,\n barHeight: 20,\n barGap: 4,\n topPadding: 50,\n leftPadding: 75,\n gridLineStartPadding: 35,\n fontSize: 11,\n sectionFontSize: 11,\n numberSectionStyles: 4,\n },\n er: {\n diagramPadding: 20,\n layoutDirection: 'TB',\n minEntityWidth: 100,\n minEntityHeight: 75,\n entityPadding: 15,\n stroke: isDark ? c.gray500 : c.gray300,\n fill: isDark ? c.gray800 : c.gray50,\n fontSize: 12,\n },\n pie: {\n textPosition: 0.75,\n },\n mindmap: {\n padding: 10,\n maxNodeWidth: 200,\n },\n class: {\n titleTopMargin: 25,\n },\n state: {\n dividerMargin: 10,\n sizeUnit: 5,\n padding: 8,\n textHeight: 10,\n titleShift: -15,\n noteMargin: 10,\n forkWidth: 70,\n forkHeight: 7,\n miniPadding: 2,\n fontSizeFactor: 5.02,\n fontSize: 24,\n labelHeight: 16,\n edgeLengthFactor: '20',\n compositTitleSize: 35,\n radius: 5,\n },\n };\n}\n","'use client';\n\nimport * as React from 'react';\nimport { Skeleton } from '@/components/atoms/display/Skeleton';\nimport { AICodeBlock } from '@/components/organisms/ai/AICodeBlock';\nimport { cn } from '@/lib/utils';\nimport { getMermaidConfig } from './mermaid-theme';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface AIMermaidDiagramProps {\n /** Mermaid diagram definition */\n code: string;\n /** Theme - follows design system */\n theme?: 'light' | 'dark' | 'auto';\n /** Optional caption below diagram */\n caption?: string;\n /** Allow pan/zoom for complex diagrams */\n interactive?: boolean;\n /** Max height before scrolling */\n maxHeight?: number;\n /** Additional class name */\n className?: string;\n}\n\nfunction getFiniteMaxHeight(maxHeight: number | undefined): number | undefined {\n return typeof maxHeight === 'number' &&\n Number.isFinite(maxHeight) &&\n maxHeight >= 0\n ? maxHeight\n : undefined;\n}\n\ntype DiagramTransform = {\n x: number;\n y: number;\n scale: number;\n};\n\ntype DiagramTransformState = {\n code: string;\n transform: DiagramTransform;\n};\n\nconst DEFAULT_TRANSFORM: DiagramTransform = { x: 0, y: 0, scale: 1 };\n\nfunction svgToDataUri(svg: string): string {\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\n}\n\n// =============================================================================\n// Loading State\n// =============================================================================\n\nfunction DiagramSkeleton({ maxHeight }: { maxHeight?: number }) {\n return (\n <div\n className=\"flex items-center justify-center p-8 rounded-xl border border-border bg-muted\"\n style={{ minHeight: 200, maxHeight }}\n >\n <div className=\"flex flex-col items-center gap-4 w-full max-w-md\">\n <Skeleton className=\"h-4 w-3/4\" />\n <div className=\"flex items-center justify-center gap-4 w-full\">\n <Skeleton className=\"h-16 w-24 rounded-lg\" />\n <Skeleton className=\"h-1 w-8\" />\n <Skeleton className=\"h-16 w-24 rounded-lg\" />\n <Skeleton className=\"h-1 w-8\" />\n <Skeleton className=\"h-16 w-24 rounded-lg\" />\n </div>\n <Skeleton className=\"h-4 w-1/2\" />\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// Error State\n// =============================================================================\n\ninterface DiagramErrorProps {\n code: string;\n error: string;\n}\n\nfunction DiagramError({ code, error }: DiagramErrorProps) {\n return (\n <div className=\"space-y-2\">\n <div\n className=\"flex items-center gap-2 px-3 py-2 rounded-lg bg-destructive/20 text-destructive text-sm\"\n role=\"alert\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className=\"size-4 flex-shrink-0\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z\"\n clipRule=\"evenodd\"\n />\n </svg>\n <span className=\"font-medium\">Diagram parse error:</span>\n <span className=\"truncate\">{error}</span>\n </div>\n <AICodeBlock code={code} language=\"mermaid\" showLineNumbers />\n </div>\n );\n}\n\n// =============================================================================\n// Hook to detect theme\n// =============================================================================\n\nfunction getDocumentTheme(\n ownerDocument: Document | undefined,\n): 'light' | 'dark' {\n return ownerDocument?.documentElement.classList.contains('dark')\n ? 'dark'\n : 'light';\n}\n\nfunction useResolvedTheme(\n theme: 'light' | 'dark' | 'auto',\n ownerRef: React.RefObject<HTMLElement | null>,\n): 'light' | 'dark' | undefined {\n const [resolvedTheme, setResolvedTheme] = React.useState<\n 'light' | 'dark' | undefined\n >(() => (theme === 'auto' ? undefined : theme));\n\n React.useEffect(() => {\n if (theme !== 'auto') {\n setResolvedTheme(theme);\n return;\n }\n\n const ownerDocument = ownerRef.current?.ownerDocument;\n const OwnerMutationObserver = ownerDocument?.defaultView?.MutationObserver;\n if (!ownerDocument || !OwnerMutationObserver) {\n setResolvedTheme('light');\n return;\n }\n\n // Observe class changes on document element\n const observer = new OwnerMutationObserver(() => {\n setResolvedTheme(getDocumentTheme(ownerDocument));\n });\n\n observer.observe(ownerDocument.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n });\n\n // Set initial value\n setResolvedTheme(getDocumentTheme(ownerDocument));\n\n return () => observer.disconnect();\n }, [theme, ownerRef]);\n\n return resolvedTheme;\n}\n\n// =============================================================================\n// Main Component\n// =============================================================================\n\n// Counter for unique IDs\nlet diagramIdCounter = 0;\n\nfunction AIMermaidDiagram({\n code,\n theme = 'auto',\n caption,\n interactive = false,\n maxHeight,\n className,\n}: AIMermaidDiagramProps) {\n const safeMaxHeight = getFiniteMaxHeight(maxHeight);\n const [svgContent, setSvgContent] = React.useState<string | null>(null);\n const [error, setError] = React.useState<string | null>(null);\n const [isLoading, setIsLoading] = React.useState(true);\n const ownerRef = React.useRef<HTMLElement | null>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const resolvedTheme = useResolvedTheme(theme, ownerRef);\n const idRef = React.useRef<string>(`mermaid-diagram-${++diagramIdCounter}`);\n const setOwnerNode = React.useCallback((node: HTMLElement | null) => {\n ownerRef.current = node;\n }, []);\n\n // Pan/zoom state for interactive mode\n const [transformState, setTransformState] =\n React.useState<DiagramTransformState>(() => ({\n code,\n transform: DEFAULT_TRANSFORM,\n }));\n const [isDragging, setIsDragging] = React.useState(false);\n const dragStartRef = React.useRef({ x: 0, y: 0 });\n\n React.useEffect(() => {\n if (!resolvedTheme) {\n return;\n }\n\n const activeTheme = resolvedTheme;\n let cancelled = false;\n\n async function renderDiagram() {\n setIsLoading(true);\n setError(null);\n setSvgContent(null);\n\n try {\n // Dynamically import mermaid\n const mermaid = (await import('mermaid')).default;\n\n // Initialize with theme config\n const config = getMermaidConfig(\n activeTheme,\n ownerRef.current ?? containerRef.current,\n );\n mermaid.initialize(config);\n\n // Generate unique ID for this render\n const id = `${idRef.current}-${Date.now()}`;\n\n // Render the diagram\n // Note: mermaid.render returns sanitized SVG (securityLevel: 'strict')\n const { svg } = await mermaid.render(id, code.trim());\n\n if (!cancelled) {\n setSvgContent(svg);\n setError(null);\n }\n } catch (err) {\n if (!cancelled) {\n const errorMessage =\n err instanceof Error ? err.message : 'Failed to parse diagram';\n setError(errorMessage);\n setSvgContent(null);\n }\n } finally {\n if (!cancelled) {\n setIsLoading(false);\n }\n }\n }\n\n renderDiagram();\n\n return () => {\n cancelled = true;\n };\n }, [code, resolvedTheme]);\n\n const transform =\n transformState.code === code ? transformState.transform : DEFAULT_TRANSFORM;\n\n const setTransformForCode = React.useCallback(\n (\n nextTransform:\n | DiagramTransform\n | ((current: DiagramTransform) => DiagramTransform),\n ) => {\n setTransformState((current) => {\n const currentTransform =\n current.code === code ? current.transform : DEFAULT_TRANSFORM;\n const transform =\n typeof nextTransform === 'function'\n ? nextTransform(currentTransform)\n : nextTransform;\n return { code, transform };\n });\n },\n [code],\n );\n\n // Interactive handlers\n const handleWheel = React.useCallback(\n (e: React.WheelEvent) => {\n if (!interactive) return;\n e.preventDefault();\n\n const delta = e.deltaY > 0 ? 0.9 : 1.1;\n const newScale = Math.min(Math.max(transform.scale * delta, 0.5), 3);\n\n setTransformForCode((prev) => ({\n ...prev,\n scale: newScale,\n }));\n },\n [interactive, setTransformForCode, transform.scale],\n );\n\n const handleMouseDown = React.useCallback(\n (e: React.MouseEvent) => {\n if (!interactive) return;\n setIsDragging(true);\n dragStartRef.current = {\n x: e.clientX - transform.x,\n y: e.clientY - transform.y,\n };\n },\n [interactive, transform.x, transform.y],\n );\n\n const handleMouseMove = React.useCallback(\n (e: React.MouseEvent) => {\n if (!isDragging || !interactive) return;\n setTransformForCode((prev) => ({\n ...prev,\n x: e.clientX - dragStartRef.current.x,\n y: e.clientY - dragStartRef.current.y,\n }));\n },\n [isDragging, interactive, setTransformForCode],\n );\n\n const handleMouseUp = React.useCallback(() => {\n setIsDragging(false);\n }, []);\n\n const handleReset = React.useCallback(() => {\n setTransformForCode(DEFAULT_TRANSFORM);\n }, [setTransformForCode]);\n\n // Loading state\n if (isLoading) {\n return (\n <div ref={setOwnerNode} data-slot=\"ai-mermaid-diagram-status\">\n <DiagramSkeleton maxHeight={safeMaxHeight} />\n </div>\n );\n }\n\n // Error state\n if (error) {\n return (\n <div ref={setOwnerNode} data-slot=\"ai-mermaid-diagram-status\">\n <DiagramError code={code} error={error} />\n </div>\n );\n }\n\n // Render SVG\n if (!svgContent) {\n return (\n <div ref={setOwnerNode} data-slot=\"ai-mermaid-diagram-status\">\n <DiagramSkeleton maxHeight={safeMaxHeight} />\n </div>\n );\n }\n const svgDataUri = svgToDataUri(svgContent);\n\n return (\n <figure\n ref={setOwnerNode}\n data-slot=\"ai-mermaid-diagram\"\n className={cn('space-y-2', className)}\n >\n {/* biome-ignore lint/a11y/noStaticElementInteractions: Interactive mode requires mouse handlers for pan/zoom */}\n <div\n ref={containerRef}\n className={cn(\n 'relative overflow-hidden rounded-xl border border-border bg-muted',\n interactive && 'cursor-grab',\n isDragging && 'cursor-grabbing',\n )}\n style={{ maxHeight: safeMaxHeight }}\n onWheel={handleWheel}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n >\n {/* SVG Container */}\n <div\n className={cn(\n 'flex items-center justify-center p-4',\n safeMaxHeight !== undefined && 'overflow-auto',\n )}\n {...(safeMaxHeight !== undefined\n ? { tabIndex: 0, role: 'region', 'aria-label': 'Diagram view' }\n : {})}\n style={\n interactive\n ? {\n transform: `translate(${transform.x}px, ${transform.y}px) scale(${transform.scale})`,\n transformOrigin: 'center center',\n transition: isDragging ? 'none' : 'transform 0.1s ease-out',\n }\n : undefined\n }\n >\n <img\n src={svgDataUri}\n alt=\"Mermaid diagram\"\n className=\"block max-w-full h-auto\"\n draggable={false}\n />\n </div>\n\n {/* Interactive controls */}\n {interactive && (\n <div className=\"absolute bottom-2 right-2 flex items-center gap-1 bg-card/80 supports-backdrop-filter:backdrop-blur-sm rounded-lg border border-border p-1\">\n <button\n type=\"button\"\n onClick={() =>\n setTransformForCode((prev) => ({\n ...prev,\n scale: Math.min(prev.scale * 1.2, 3),\n }))\n }\n className=\"p-1.5 rounded hover:bg-muted text-secondary-foreground hover:text-foreground transition-colors focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-ring\"\n aria-label=\"Zoom in\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className=\"size-4\"\n >\n <path d=\"M10.75 4.75a.75.75 0 00-1.5 0v4.5h-4.5a.75.75 0 000 1.5h4.5v4.5a.75.75 0 001.5 0v-4.5h4.5a.75.75 0 000-1.5h-4.5v-4.5z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() =>\n setTransformForCode((prev) => ({\n ...prev,\n scale: Math.max(prev.scale * 0.8, 0.5),\n }))\n }\n className=\"p-1.5 rounded hover:bg-muted text-secondary-foreground hover:text-foreground transition-colors focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-ring\"\n aria-label=\"Zoom out\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className=\"size-4\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M4 10a.75.75 0 01.75-.75h10.5a.75.75 0 010 1.5H4.75A.75.75 0 014 10z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n <div className=\"w-px h-4 bg-border-secondary mx-0.5\" />\n <button\n type=\"button\"\n onClick={handleReset}\n className=\"p-1.5 rounded hover:bg-muted text-secondary-foreground hover:text-foreground transition-colors focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-ring\"\n aria-label=\"Reset view\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className=\"size-4\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M15.312 11.424a5.5 5.5 0 01-9.201 2.466l-.312-.311h2.433a.75.75 0 000-1.5H3.989a.75.75 0 00-.75.75v4.242a.75.75 0 001.5 0v-2.43l.31.31a7 7 0 0011.712-3.138.75.75 0 00-1.449-.39zm1.23-3.723a.75.75 0 00.219-.53V2.929a.75.75 0 00-1.5 0v2.43l-.31-.31A7 7 0 003.239 8.188a.75.75 0 101.448.389A5.5 5.5 0 0113.89 6.11l.311.31h-2.432a.75.75 0 000 1.5h4.243a.75.75 0 00.53-.219z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n <span className=\"text-xs text-text-quaternary px-1 tabular-nums\">\n {Math.round(transform.scale * 100)}%\n </span>\n </div>\n )}\n </div>\n\n {/* Caption */}\n {caption && (\n <figcaption className=\"text-sm text-muted-foreground text-center px-4\">\n {caption}\n </figcaption>\n )}\n </figure>\n );\n}\n\nAIMermaidDiagram.displayName = 'AIMermaidDiagram';\n\nexport { AIMermaidDiagram };\nexport default AIMermaidDiagram;\n","export * from './AIMermaidDiagram';\nexport { default } from './AIMermaidDiagram';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AIMermaidDiagram.js","names":[],"sources":["../../src/components/organisms/ai/AIMermaidDiagram/mermaid-theme.ts","../../src/components/organisms/ai/AIMermaidDiagram/AIMermaidDiagram.tsx","../../src/components/organisms/ai/AIMermaidDiagram/index.ts"],"sourcesContent":["import type { MermaidConfig } from 'mermaid';\n\n/**\n * Build a color palette by resolving CSS custom properties at runtime.\n * Uses a single getComputedStyle() call for efficiency, then reads\n * all token values from the cached CSSStyleDeclaration object.\n * Falls back to hard-coded hex when tokens are unavailable (SSR, missing vars).\n */\nfunction resolveColors(el?: Element | null) {\n if (typeof window === 'undefined') {\n return {\n blue500: '#3b82f6',\n blue600: '#2563eb',\n gray900: '#0f172a',\n gray50: '#f8fafc',\n gray300: '#cbd5e1',\n gray500: '#475569',\n gray200: '#e2e8f0',\n gray700: '#334155',\n gray800: '#1e293b',\n gray100: '#f1f5f9',\n };\n }\n\n const ownerDocument = el?.ownerDocument;\n const OwnerWindow = ownerDocument?.defaultView;\n\n if (!ownerDocument || !OwnerWindow) {\n return {\n blue500: '#3b82f6',\n blue600: '#2563eb',\n gray900: '#0f172a',\n gray50: '#f8fafc',\n gray300: '#cbd5e1',\n gray500: '#475569',\n gray200: '#e2e8f0',\n gray700: '#334155',\n gray800: '#1e293b',\n gray100: '#f1f5f9',\n };\n }\n\n const styles = OwnerWindow.getComputedStyle(\n el ?? ownerDocument.documentElement,\n );\n const r = (token: string, fallback: string) =>\n styles.getPropertyValue(token).trim() || fallback;\n\n return {\n blue500: r('--blue-500', '#3b82f6'),\n blue600: r('--blue-600', '#2563eb'),\n gray900: r('--gray-900', '#0f172a'),\n gray50: r('--gray-50', '#f8fafc'),\n gray300: r('--gray-300', '#cbd5e1'),\n gray500: r('--gray-500', '#475569'),\n gray200: r('--gray-200', '#e2e8f0'),\n gray700: r('--gray-700', '#334155'),\n gray800: r('--gray-800', '#1e293b'),\n gray100: r('--gray-100', '#f1f5f9'),\n };\n}\n\n/**\n * Get mermaid configuration based on theme\n *\n * Maps design system tokens to mermaid theme variables.\n * Colors are resolved from CSS custom properties at runtime so the\n * diagram follows whatever palette the host page provides. Hard-coded\n * fallbacks are used when getComputedStyle cannot read the tokens.\n */\nexport function getMermaidConfig(\n theme: 'light' | 'dark',\n el?: Element | null,\n): MermaidConfig {\n const isDark = theme === 'dark';\n const c = resolveColors(el);\n\n return {\n startOnLoad: false,\n securityLevel: 'strict',\n suppressErrorRendering: true,\n theme: 'base',\n themeVariables: {\n // Base colors\n primaryColor: isDark ? c.blue500 : c.blue600,\n primaryTextColor: isDark ? c.gray50 : c.gray900,\n primaryBorderColor: isDark ? c.gray500 : c.gray300,\n\n // Secondary colors\n secondaryColor: isDark ? c.gray700 : c.gray200,\n secondaryTextColor: isDark ? c.gray100 : c.gray800,\n secondaryBorderColor: isDark ? c.gray500 : c.gray300,\n\n // Tertiary colors\n tertiaryColor: isDark ? c.gray800 : c.gray100,\n tertiaryTextColor: isDark ? c.gray200 : c.gray700,\n tertiaryBorderColor: isDark ? c.gray700 : c.gray200,\n\n // Background\n background: isDark ? c.gray900 : '#ffffff',\n mainBkg: isDark ? c.gray800 : c.gray50,\n\n // Text\n textColor: isDark ? c.gray200 : c.gray800,\n titleColor: isDark ? c.gray50 : c.gray900,\n\n // Lines and borders\n lineColor: isDark ? c.gray500 : '#94a3b8',\n nodeBorder: isDark ? c.gray500 : c.gray300,\n\n // Notes\n noteBkgColor: isDark ? c.gray700 : '#fef9c3',\n noteTextColor: isDark ? c.gray100 : c.gray800,\n noteBorderColor: isDark ? c.gray500 : '#fde047',\n\n // Flowchart specific\n clusterBkg: isDark ? c.gray800 : c.gray100,\n clusterBorder: isDark ? c.gray700 : c.gray200,\n\n // Sequence diagram specific\n actorBkg: isDark ? c.gray800 : c.gray50,\n actorBorder: isDark ? c.gray500 : c.gray300,\n actorTextColor: isDark ? c.gray100 : c.gray800,\n actorLineColor: isDark ? '#64748b' : '#94a3b8',\n signalColor: isDark ? '#64748b' : '#64748b',\n signalTextColor: isDark ? c.gray200 : c.gray800,\n labelBoxBkgColor: isDark ? c.gray700 : c.gray100,\n labelBoxBorderColor: isDark ? c.gray500 : c.gray300,\n labelTextColor: isDark ? c.gray100 : c.gray800,\n loopTextColor: isDark ? c.gray100 : c.gray800,\n activationBkgColor: isDark ? c.blue500 : '#dbeafe',\n activationBorderColor: isDark ? c.blue600 : c.blue500,\n sequenceNumberColor: isDark ? c.gray50 : c.gray900,\n\n // Class diagram specific\n classText: isDark ? c.gray200 : c.gray800,\n\n // State diagram specific\n labelColor: isDark ? c.gray200 : c.gray800,\n\n // ER diagram specific\n entityBorder: isDark ? c.gray500 : c.gray300,\n entityBkg: isDark ? c.gray800 : c.gray50,\n entityTextColor: isDark ? c.gray100 : c.gray800,\n relationColor: isDark ? '#64748b' : '#94a3b8',\n relationLabelColor: isDark ? c.gray200 : c.gray800,\n relationLabelBackground: isDark ? c.gray900 : '#ffffff',\n attributeBackgroundColorOdd: isDark ? c.gray700 : c.gray100,\n attributeBackgroundColorEven: isDark ? c.gray800 : c.gray50,\n\n // Gantt chart specific\n sectionBkgColor: isDark ? c.gray700 : c.gray200,\n altSectionBkgColor: isDark ? c.gray800 : c.gray100,\n sectionBkgColor2: isDark ? c.gray800 : c.gray50,\n gridColor: isDark ? c.gray700 : c.gray200,\n doneTaskBkgColor: isDark ? '#22c55e' : '#86efac',\n doneTaskBorderColor: isDark ? '#16a34a' : '#22c55e',\n activeTaskBkgColor: isDark ? c.blue500 : '#93c5fd',\n activeTaskBorderColor: isDark ? c.blue600 : c.blue500,\n critBkgColor: isDark ? '#ef4444' : '#fecaca',\n critBorderColor: isDark ? '#dc2626' : '#ef4444',\n taskBkgColor: isDark ? c.gray500 : c.gray300,\n taskBorderColor: isDark ? '#64748b' : '#94a3b8',\n taskTextColor: isDark ? c.gray100 : c.gray800,\n taskTextOutsideColor: isDark ? c.gray200 : c.gray800,\n taskTextLightColor: isDark ? c.gray50 : c.gray900,\n todayLineColor: isDark ? '#f472b6' : '#ec4899',\n\n // Pie chart specific\n pieStrokeColor: isDark ? c.gray900 : '#ffffff',\n pieLegendTextColor: isDark ? c.gray200 : c.gray800,\n pieSectionTextColor: isDark ? c.gray50 : c.gray900,\n pieStrokeWidth: '2px',\n pieOuterStrokeWidth: '2px',\n pie1: isDark ? c.blue500 : c.blue600,\n pie2: isDark ? '#22c55e' : '#16a34a',\n pie3: isDark ? '#f59e0b' : '#d97706',\n pie4: isDark ? '#ef4444' : '#dc2626',\n pie5: isDark ? '#a855f7' : '#9333ea',\n pie6: isDark ? '#ec4899' : '#db2777',\n pie7: isDark ? '#06b6d4' : '#0891b2',\n pie8: isDark ? '#84cc16' : '#65a30d',\n pie9: isDark ? '#f97316' : '#ea580c',\n pie10: isDark ? '#6366f1' : '#4f46e5',\n pie11: isDark ? '#14b8a6' : '#0d9488',\n pie12: isDark ? '#f43f5e' : '#e11d48',\n\n // Mindmap specific\n mindmapColors: isDark\n ? [c.blue500, '#22c55e', '#f59e0b', '#ef4444', '#a855f7', '#ec4899']\n : [c.blue600, '#16a34a', '#d97706', '#dc2626', '#9333ea', '#db2777'],\n\n // Git diagram specific\n git0: isDark ? c.blue500 : c.blue600,\n git1: isDark ? '#22c55e' : '#16a34a',\n git2: isDark ? '#f59e0b' : '#d97706',\n git3: isDark ? '#ef4444' : '#dc2626',\n git4: isDark ? '#a855f7' : '#9333ea',\n git5: isDark ? '#ec4899' : '#db2777',\n git6: isDark ? '#06b6d4' : '#0891b2',\n git7: isDark ? '#84cc16' : '#65a30d',\n gitBranchLabel0: isDark ? c.gray50 : c.gray900,\n gitBranchLabel1: isDark ? c.gray50 : c.gray900,\n gitBranchLabel2: isDark ? c.gray50 : c.gray900,\n gitBranchLabel3: isDark ? c.gray50 : c.gray900,\n gitBranchLabel4: isDark ? c.gray50 : c.gray900,\n gitBranchLabel5: isDark ? c.gray50 : c.gray900,\n gitBranchLabel6: isDark ? c.gray50 : c.gray900,\n gitBranchLabel7: isDark ? c.gray50 : c.gray900,\n commitLabelColor: isDark ? c.gray50 : c.gray900,\n commitLabelBackground: isDark ? c.gray700 : c.gray200,\n\n // Quadrant chart specific\n quadrant1Fill: isDark ? c.blue500 : '#dbeafe',\n quadrant2Fill: isDark ? '#22c55e' : '#dcfce7',\n quadrant3Fill: isDark ? '#f59e0b' : '#fef3c7',\n quadrant4Fill: isDark ? '#ef4444' : '#fee2e2',\n quadrant1TextFill: isDark ? c.gray50 : c.gray800,\n quadrant2TextFill: isDark ? c.gray50 : c.gray800,\n quadrant3TextFill: isDark ? c.gray50 : c.gray800,\n quadrant4TextFill: isDark ? c.gray50 : c.gray800,\n quadrantPointFill: isDark ? c.gray200 : c.gray800,\n quadrantPointTextFill: isDark ? c.gray200 : c.gray800,\n quadrantExternalBorderStrokeFill: isDark ? c.gray500 : c.gray300,\n quadrantInternalBorderStrokeFill: isDark ? c.gray700 : c.gray200,\n quadrantTitleFill: isDark ? c.gray50 : c.gray900,\n quadrantXAxisTextFill: isDark ? c.gray200 : c.gray800,\n quadrantYAxisTextFill: isDark ? c.gray200 : c.gray800,\n\n // Timeline specific\n cScale0: isDark ? c.blue500 : c.blue600,\n cScale1: isDark ? '#22c55e' : '#16a34a',\n cScale2: isDark ? '#f59e0b' : '#d97706',\n cScale3: isDark ? '#ef4444' : '#dc2626',\n cScale4: isDark ? '#a855f7' : '#9333ea',\n cScale5: isDark ? '#ec4899' : '#db2777',\n cScale6: isDark ? '#06b6d4' : '#0891b2',\n cScale7: isDark ? '#84cc16' : '#65a30d',\n\n // Font settings\n fontFamily:\n 'ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\"',\n fontSize: '14px',\n },\n flowchart: {\n htmlLabels: true,\n curve: 'basis',\n padding: 15,\n nodeSpacing: 50,\n rankSpacing: 50,\n },\n sequence: {\n diagramMarginX: 50,\n diagramMarginY: 10,\n actorMargin: 50,\n width: 150,\n height: 65,\n boxMargin: 10,\n boxTextMargin: 5,\n noteMargin: 10,\n messageMargin: 35,\n mirrorActors: true,\n bottomMarginAdj: 1,\n showSequenceNumbers: false,\n },\n gantt: {\n titleTopMargin: 25,\n barHeight: 20,\n barGap: 4,\n topPadding: 50,\n leftPadding: 75,\n gridLineStartPadding: 35,\n fontSize: 11,\n sectionFontSize: 11,\n numberSectionStyles: 4,\n },\n er: {\n diagramPadding: 20,\n layoutDirection: 'TB',\n minEntityWidth: 100,\n minEntityHeight: 75,\n entityPadding: 15,\n stroke: isDark ? c.gray500 : c.gray300,\n fill: isDark ? c.gray800 : c.gray50,\n fontSize: 12,\n },\n pie: {\n textPosition: 0.75,\n },\n mindmap: {\n padding: 10,\n maxNodeWidth: 200,\n },\n class: {\n titleTopMargin: 25,\n },\n state: {\n dividerMargin: 10,\n sizeUnit: 5,\n padding: 8,\n textHeight: 10,\n titleShift: -15,\n noteMargin: 10,\n forkWidth: 70,\n forkHeight: 7,\n miniPadding: 2,\n fontSizeFactor: 5.02,\n fontSize: 24,\n labelHeight: 16,\n edgeLengthFactor: '20',\n compositTitleSize: 35,\n radius: 5,\n },\n };\n}\n","'use client';\n\nimport * as React from 'react';\nimport { Skeleton } from '@/components/atoms/display/Skeleton';\nimport { AICodeBlock } from '@/components/organisms/ai/AICodeBlock';\nimport { cn } from '@/lib/utils';\nimport { getMermaidConfig } from './mermaid-theme';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface AIMermaidDiagramProps {\n /** Mermaid diagram definition */\n code: string;\n /** Theme - follows design system */\n theme?: 'light' | 'dark' | 'auto';\n /** Optional caption below diagram */\n caption?: string;\n /** Allow pan/zoom for complex diagrams */\n interactive?: boolean;\n /** Max height before scrolling */\n maxHeight?: number;\n /** Additional class name */\n className?: string;\n}\n\nfunction getFiniteMaxHeight(maxHeight: number | undefined): number | undefined {\n return typeof maxHeight === 'number' &&\n Number.isFinite(maxHeight) &&\n maxHeight >= 0\n ? maxHeight\n : undefined;\n}\n\ntype DiagramTransform = {\n x: number;\n y: number;\n scale: number;\n};\n\ntype DiagramTransformState = {\n code: string;\n transform: DiagramTransform;\n};\n\nconst DEFAULT_TRANSFORM: DiagramTransform = { x: 0, y: 0, scale: 1 };\n\nfunction svgToDataUri(svg: string): string {\n return `data:image/svg+xml;charset=utf-8,${encodeURIComponent(svg)}`;\n}\n\n// =============================================================================\n// Loading State\n// =============================================================================\n\nfunction DiagramSkeleton({ maxHeight }: { maxHeight?: number }) {\n return (\n <div\n className=\"flex items-center justify-center p-8 rounded-xl border border-border bg-muted\"\n style={{ minHeight: 200, maxHeight }}\n >\n <div className=\"flex flex-col items-center gap-4 w-full max-w-md\">\n <Skeleton className=\"h-4 w-3/4\" />\n <div className=\"flex items-center justify-center gap-4 w-full\">\n <Skeleton className=\"h-16 w-24 rounded-lg\" />\n <Skeleton className=\"h-1 w-8\" />\n <Skeleton className=\"h-16 w-24 rounded-lg\" />\n <Skeleton className=\"h-1 w-8\" />\n <Skeleton className=\"h-16 w-24 rounded-lg\" />\n </div>\n <Skeleton className=\"h-4 w-1/2\" />\n </div>\n </div>\n );\n}\n\n// =============================================================================\n// Error State\n// =============================================================================\n\ninterface DiagramErrorProps {\n code: string;\n error: string;\n}\n\nfunction DiagramError({ code, error }: DiagramErrorProps) {\n return (\n <div className=\"space-y-2\">\n <div\n className=\"flex items-center gap-2 px-3 py-2 rounded-lg bg-destructive/20 text-destructive text-sm\"\n role=\"alert\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className=\"size-4 flex-shrink-0\"\n aria-hidden=\"true\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-8-5a.75.75 0 01.75.75v4.5a.75.75 0 01-1.5 0v-4.5A.75.75 0 0110 5zm0 10a1 1 0 100-2 1 1 0 000 2z\"\n clipRule=\"evenodd\"\n />\n </svg>\n <span className=\"font-medium\">Diagram parse error:</span>\n <span className=\"truncate\">{error}</span>\n </div>\n <AICodeBlock code={code} language=\"mermaid\" showLineNumbers />\n </div>\n );\n}\n\n// =============================================================================\n// Hook to detect theme\n// =============================================================================\n\nfunction getDocumentTheme(\n ownerDocument: Document | undefined,\n): 'light' | 'dark' {\n return ownerDocument?.documentElement.classList.contains('dark')\n ? 'dark'\n : 'light';\n}\n\nfunction useResolvedTheme(\n theme: 'light' | 'dark' | 'auto',\n ownerRef: React.RefObject<HTMLElement | null>,\n): 'light' | 'dark' | undefined {\n const [resolvedTheme, setResolvedTheme] = React.useState<\n 'light' | 'dark' | undefined\n >(() => (theme === 'auto' ? undefined : theme));\n\n React.useEffect(() => {\n if (theme !== 'auto') {\n setResolvedTheme(theme);\n return;\n }\n\n const ownerDocument = ownerRef.current?.ownerDocument;\n const OwnerMutationObserver = ownerDocument?.defaultView?.MutationObserver;\n if (!ownerDocument || !OwnerMutationObserver) {\n setResolvedTheme('light');\n return;\n }\n\n // Observe class changes on document element\n const observer = new OwnerMutationObserver(() => {\n setResolvedTheme(getDocumentTheme(ownerDocument));\n });\n\n observer.observe(ownerDocument.documentElement, {\n attributes: true,\n attributeFilter: ['class'],\n });\n\n // Set initial value\n setResolvedTheme(getDocumentTheme(ownerDocument));\n\n return () => observer.disconnect();\n }, [theme, ownerRef]);\n\n return resolvedTheme;\n}\n\n// =============================================================================\n// Main Component\n// =============================================================================\n\n// Counter for unique IDs\nlet diagramIdCounter = 0;\n\nfunction AIMermaidDiagram({\n code,\n theme = 'auto',\n caption,\n interactive = false,\n maxHeight,\n className,\n}: AIMermaidDiagramProps) {\n const safeMaxHeight = getFiniteMaxHeight(maxHeight);\n const [svgContent, setSvgContent] = React.useState<string | null>(null);\n const [error, setError] = React.useState<string | null>(null);\n const [isLoading, setIsLoading] = React.useState(true);\n const ownerRef = React.useRef<HTMLElement | null>(null);\n const containerRef = React.useRef<HTMLDivElement>(null);\n const resolvedTheme = useResolvedTheme(theme, ownerRef);\n const idRef = React.useRef<string>(`mermaid-diagram-${++diagramIdCounter}`);\n const setOwnerNode = React.useCallback((node: HTMLElement | null) => {\n ownerRef.current = node;\n }, []);\n\n // Pan/zoom state for interactive mode\n const [transformState, setTransformState] =\n React.useState<DiagramTransformState>(() => ({\n code,\n transform: DEFAULT_TRANSFORM,\n }));\n const [isDragging, setIsDragging] = React.useState(false);\n const dragStartRef = React.useRef({ x: 0, y: 0 });\n\n React.useEffect(() => {\n if (!resolvedTheme) {\n return;\n }\n\n const activeTheme = resolvedTheme;\n let cancelled = false;\n\n async function renderDiagram() {\n setIsLoading(true);\n setError(null);\n setSvgContent(null);\n\n try {\n // Dynamically import mermaid\n const mermaid = (await import('mermaid')).default;\n\n // Initialize with theme config\n const config = getMermaidConfig(\n activeTheme,\n ownerRef.current ?? containerRef.current,\n );\n mermaid.initialize(config);\n\n // Generate unique ID for this render\n const id = `${idRef.current}-${Date.now()}`;\n\n // Render the diagram\n // Note: mermaid.render returns sanitized SVG (securityLevel: 'strict')\n const { svg } = await mermaid.render(id, code.trim());\n\n if (!cancelled) {\n setSvgContent(svg);\n setError(null);\n }\n } catch (err) {\n if (!cancelled) {\n const errorMessage =\n err instanceof Error ? err.message : 'Failed to parse diagram';\n setError(errorMessage);\n setSvgContent(null);\n }\n } finally {\n if (!cancelled) {\n setIsLoading(false);\n }\n }\n }\n\n renderDiagram();\n\n return () => {\n cancelled = true;\n };\n }, [code, resolvedTheme]);\n\n const transform =\n transformState.code === code ? transformState.transform : DEFAULT_TRANSFORM;\n\n const setTransformForCode = React.useCallback(\n (\n nextTransform:\n | DiagramTransform\n | ((current: DiagramTransform) => DiagramTransform),\n ) => {\n setTransformState((current) => {\n const currentTransform =\n current.code === code ? current.transform : DEFAULT_TRANSFORM;\n const transform =\n typeof nextTransform === 'function'\n ? nextTransform(currentTransform)\n : nextTransform;\n return { code, transform };\n });\n },\n [code],\n );\n\n // Interactive handlers\n const handleWheel = React.useCallback(\n (e: React.WheelEvent) => {\n if (!interactive) return;\n e.preventDefault();\n\n const delta = e.deltaY > 0 ? 0.9 : 1.1;\n const newScale = Math.min(Math.max(transform.scale * delta, 0.5), 3);\n\n setTransformForCode((prev) => ({\n ...prev,\n scale: newScale,\n }));\n },\n [interactive, setTransformForCode, transform.scale],\n );\n\n const handleMouseDown = React.useCallback(\n (e: React.MouseEvent) => {\n if (!interactive) return;\n setIsDragging(true);\n dragStartRef.current = {\n x: e.clientX - transform.x,\n y: e.clientY - transform.y,\n };\n },\n [interactive, transform.x, transform.y],\n );\n\n const handleMouseMove = React.useCallback(\n (e: React.MouseEvent) => {\n if (!isDragging || !interactive) return;\n setTransformForCode((prev) => ({\n ...prev,\n x: e.clientX - dragStartRef.current.x,\n y: e.clientY - dragStartRef.current.y,\n }));\n },\n [isDragging, interactive, setTransformForCode],\n );\n\n const handleMouseUp = React.useCallback(() => {\n setIsDragging(false);\n }, []);\n\n const handleReset = React.useCallback(() => {\n setTransformForCode(DEFAULT_TRANSFORM);\n }, [setTransformForCode]);\n\n // Loading state\n if (isLoading) {\n return (\n <div ref={setOwnerNode} data-slot=\"ai-mermaid-diagram-status\">\n <DiagramSkeleton maxHeight={safeMaxHeight} />\n </div>\n );\n }\n\n // Error state\n if (error) {\n return (\n <div ref={setOwnerNode} data-slot=\"ai-mermaid-diagram-status\">\n <DiagramError code={code} error={error} />\n </div>\n );\n }\n\n // Render SVG\n if (!svgContent) {\n return (\n <div ref={setOwnerNode} data-slot=\"ai-mermaid-diagram-status\">\n <DiagramSkeleton maxHeight={safeMaxHeight} />\n </div>\n );\n }\n const svgDataUri = svgToDataUri(svgContent);\n\n return (\n <figure\n ref={setOwnerNode}\n data-slot=\"ai-mermaid-diagram\"\n className={cn('space-y-2', className)}\n >\n {/* biome-ignore lint/a11y/noStaticElementInteractions: Interactive mode requires mouse handlers for pan/zoom */}\n <div\n ref={containerRef}\n className={cn(\n 'relative overflow-hidden rounded-xl border border-border bg-muted',\n interactive && 'cursor-grab',\n isDragging && 'cursor-grabbing',\n )}\n style={{ maxHeight: safeMaxHeight }}\n onWheel={handleWheel}\n onMouseDown={handleMouseDown}\n onMouseMove={handleMouseMove}\n onMouseUp={handleMouseUp}\n onMouseLeave={handleMouseUp}\n >\n {/* SVG Container */}\n <div\n className={cn(\n 'flex items-center justify-center p-4',\n safeMaxHeight !== undefined && 'overflow-auto',\n )}\n {...(safeMaxHeight !== undefined\n ? { tabIndex: 0, role: 'region', 'aria-label': 'Diagram view' }\n : {})}\n style={\n interactive\n ? {\n transform: `translate(${transform.x}px, ${transform.y}px) scale(${transform.scale})`,\n transformOrigin: 'center center',\n transition: isDragging ? 'none' : 'transform 0.1s ease-out',\n }\n : undefined\n }\n >\n <img\n src={svgDataUri}\n alt=\"Mermaid diagram\"\n className=\"block max-w-full h-auto\"\n draggable={false}\n />\n </div>\n\n {/* Interactive controls */}\n {interactive && (\n <div className=\"absolute bottom-2 right-2 flex items-center gap-1 bg-card/80 supports-backdrop-filter:backdrop-blur-sm rounded-lg border border-border p-1\">\n <button\n type=\"button\"\n onClick={() =>\n setTransformForCode((prev) => ({\n ...prev,\n scale: Math.min(prev.scale * 1.2, 3),\n }))\n }\n className=\"p-1.5 rounded hover:bg-muted text-secondary-foreground hover:text-foreground transition-colors focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-ring\"\n aria-label=\"Zoom in\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className=\"size-4\"\n >\n <path d=\"M10.75 4.75a.75.75 0 00-1.5 0v4.5h-4.5a.75.75 0 000 1.5h4.5v4.5a.75.75 0 001.5 0v-4.5h4.5a.75.75 0 000-1.5h-4.5v-4.5z\" />\n </svg>\n </button>\n <button\n type=\"button\"\n onClick={() =>\n setTransformForCode((prev) => ({\n ...prev,\n scale: Math.max(prev.scale * 0.8, 0.5),\n }))\n }\n className=\"p-1.5 rounded hover:bg-muted text-secondary-foreground hover:text-foreground transition-colors focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-ring\"\n aria-label=\"Zoom out\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className=\"size-4\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M4 10a.75.75 0 01.75-.75h10.5a.75.75 0 010 1.5H4.75A.75.75 0 014 10z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n <div className=\"w-px h-4 bg-border-secondary mx-0.5\" />\n <button\n type=\"button\"\n onClick={handleReset}\n className=\"p-1.5 rounded hover:bg-muted text-secondary-foreground hover:text-foreground transition-colors focus-visible:outline-2 focus-visible:outline-offset-1 focus-visible:outline-ring\"\n aria-label=\"Reset view\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 20 20\"\n fill=\"currentColor\"\n className=\"size-4\"\n >\n <path\n fillRule=\"evenodd\"\n d=\"M15.312 11.424a5.5 5.5 0 01-9.201 2.466l-.312-.311h2.433a.75.75 0 000-1.5H3.989a.75.75 0 00-.75.75v4.242a.75.75 0 001.5 0v-2.43l.31.31a7 7 0 0011.712-3.138.75.75 0 00-1.449-.39zm1.23-3.723a.75.75 0 00.219-.53V2.929a.75.75 0 00-1.5 0v2.43l-.31-.31A7 7 0 003.239 8.188a.75.75 0 101.448.389A5.5 5.5 0 0113.89 6.11l.311.31h-2.432a.75.75 0 000 1.5h4.243a.75.75 0 00.53-.219z\"\n clipRule=\"evenodd\"\n />\n </svg>\n </button>\n <span className=\"text-xs text-secondary-foreground px-1 tabular-nums\">\n {Math.round(transform.scale * 100)}%\n </span>\n </div>\n )}\n </div>\n\n {/* Caption */}\n {caption && (\n <figcaption className=\"text-sm text-muted-foreground text-center px-4\">\n {caption}\n </figcaption>\n )}\n </figure>\n );\n}\n\nAIMermaidDiagram.displayName = 'AIMermaidDiagram';\n\nexport { AIMermaidDiagram };\nexport default AIMermaidDiagram;\n","export * from './AIMermaidDiagram';\nexport { default } from './AIMermaidDiagram';\n"],"mappings":"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"}
|
package/dist/wc/AIMessage.js
CHANGED
|
@@ -72,7 +72,7 @@ A.displayName = "AIMessage.Reactions";
|
|
|
72
72
|
function N({ onClick: s, active: a, className: t }) {
|
|
73
73
|
return /* @__PURE__ */ (0, e.jsx)(b, {
|
|
74
74
|
icon: /* @__PURE__ */ (0, e.jsx)(ee, {
|
|
75
|
-
className: "size-4 text-
|
|
75
|
+
className: "size-4 text-muted-foreground",
|
|
76
76
|
"aria-hidden": "true"
|
|
77
77
|
}),
|
|
78
78
|
onClick: s,
|
|
@@ -85,7 +85,7 @@ N.displayName = "AIMessage.ThumbsUp";
|
|
|
85
85
|
function I({ onClick: s, active: a, className: t }) {
|
|
86
86
|
return /* @__PURE__ */ (0, e.jsx)(b, {
|
|
87
87
|
icon: /* @__PURE__ */ (0, e.jsx)(Z, {
|
|
88
|
-
className: "size-4 text-
|
|
88
|
+
className: "size-4 text-muted-foreground",
|
|
89
89
|
"aria-hidden": "true"
|
|
90
90
|
}),
|
|
91
91
|
onClick: s,
|
|
@@ -293,7 +293,7 @@ var S = (0, d.forwardRef)(({ type: s = "received", isAgent: a = !1, compact: t =
|
|
|
293
293
|
});
|
|
294
294
|
});
|
|
295
295
|
S.displayName = "AIMessage.Root";
|
|
296
|
-
var D = (0, d.forwardRef)(({ type: s = "received", content: a, senderName: t, timestamp: r, avatar: n, isAgent: i = !1, compact: c = !1, isTyping: l = !1, markdown: u, onInteraction: m, attachments: f, reactions: x, showActions: v = !1, onThumbsUp: h, onThumbsDown: g, onCopy: j, onShowList: E, onReactionClick: P, onAttachmentClick: $, thumbsUpActive:
|
|
296
|
+
var D = (0, d.forwardRef)(({ type: s = "received", content: a, senderName: t, timestamp: r, avatar: n, isAgent: i = !1, compact: c = !1, isTyping: l = !1, markdown: u, onInteraction: m, attachments: f, reactions: x, showActions: v = !1, onThumbsUp: h, onThumbsDown: g, onCopy: j, onShowList: E, onReactionClick: P, onAttachmentClick: $, thumbsUpActive: L, thumbsDownActive: H, className: q, ...F }, O) => /* @__PURE__ */ (0, e.jsxs)(S, {
|
|
297
297
|
ref: O,
|
|
298
298
|
type: s,
|
|
299
299
|
isAgent: i,
|
|
@@ -303,9 +303,9 @@ var D = (0, d.forwardRef)(({ type: s = "received", content: a, senderName: t, ti
|
|
|
303
303
|
onThumbsDown: g,
|
|
304
304
|
onCopy: j,
|
|
305
305
|
onShowList: E,
|
|
306
|
-
thumbsUpActive:
|
|
307
|
-
thumbsDownActive:
|
|
308
|
-
className:
|
|
306
|
+
thumbsUpActive: L,
|
|
307
|
+
thumbsDownActive: H,
|
|
308
|
+
className: q,
|
|
309
309
|
...F,
|
|
310
310
|
children: [
|
|
311
311
|
s !== "sent" && !c && n && (d.isValidElement(n) ? n : /* @__PURE__ */ (0, e.jsx)(z, {
|