@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.
Files changed (159) hide show
  1. package/dist/index101.js +2 -2
  2. package/dist/index101.js.map +1 -1
  3. package/dist/index103.js +3 -3
  4. package/dist/index103.js.map +1 -1
  5. package/dist/index108.js +1 -1
  6. package/dist/index108.js.map +1 -1
  7. package/dist/index117.js +1 -1
  8. package/dist/index117.js.map +1 -1
  9. package/dist/index122.js +6 -6
  10. package/dist/index122.js.map +1 -1
  11. package/dist/index126.js +1 -1
  12. package/dist/index126.js.map +1 -1
  13. package/dist/index130.js +2 -2
  14. package/dist/index130.js.map +1 -1
  15. package/dist/index146.js +4 -4
  16. package/dist/index146.js.map +1 -1
  17. package/dist/index152.js +1 -1
  18. package/dist/index152.js.map +1 -1
  19. package/dist/index154.js +2 -2
  20. package/dist/index154.js.map +1 -1
  21. package/dist/index166.js +1 -1
  22. package/dist/index166.js.map +1 -1
  23. package/dist/index168.js +1 -1
  24. package/dist/index168.js.map +1 -1
  25. package/dist/index169.js +1 -1
  26. package/dist/index169.js.map +1 -1
  27. package/dist/index173.js +2 -2
  28. package/dist/index173.js.map +1 -1
  29. package/dist/index175.js +4 -4
  30. package/dist/index175.js.map +1 -1
  31. package/dist/index176.js +2 -2
  32. package/dist/index176.js.map +1 -1
  33. package/dist/index177.js +2 -2
  34. package/dist/index177.js.map +1 -1
  35. package/dist/index184.js +1 -1
  36. package/dist/index184.js.map +1 -1
  37. package/dist/index191.js +3 -3
  38. package/dist/index191.js.map +1 -1
  39. package/dist/index192.js +2 -2
  40. package/dist/index192.js.map +1 -1
  41. package/dist/index201.js +2 -2
  42. package/dist/index201.js.map +1 -1
  43. package/dist/index204.js +4 -4
  44. package/dist/index204.js.map +1 -1
  45. package/dist/index228.js +1 -1
  46. package/dist/index228.js.map +1 -1
  47. package/dist/index229.js +1 -1
  48. package/dist/index229.js.map +1 -1
  49. package/dist/index24.js +2 -2
  50. package/dist/index24.js.map +1 -1
  51. package/dist/index5.js +1 -1
  52. package/dist/index5.js.map +1 -1
  53. package/dist/styles.css +1 -1
  54. package/dist/wc/AICodeBlock.js +41 -41
  55. package/dist/wc/AICodeBlock.js.map +1 -1
  56. package/dist/wc/AIMermaidDiagram.js +7 -7
  57. package/dist/wc/AIMermaidDiagram.js.map +1 -1
  58. package/dist/wc/AIMessage.js +6 -6
  59. package/dist/wc/AIMessage.js.map +1 -1
  60. package/dist/wc/AISource.js +2 -2
  61. package/dist/wc/AISource.js.map +1 -1
  62. package/dist/wc/AIToolCall.js +1 -1
  63. package/dist/wc/AIToolCall.js.map +1 -1
  64. package/dist/wc/Breadcrumb.js +43 -43
  65. package/dist/wc/Breadcrumb.js.map +1 -1
  66. package/dist/wc/DropdownMenu.js +9 -9
  67. package/dist/wc/DropdownMenu.js.map +1 -1
  68. package/dist/wc/Kbd.js +22 -22
  69. package/dist/wc/Kbd.js.map +1 -1
  70. package/dist/wc/button.js +7 -7
  71. package/dist/wc/button.js.map +1 -1
  72. package/dist/wc/close-button.js +19 -19
  73. package/dist/wc/close-button.js.map +1 -1
  74. package/dist/wc/hf-ai-prompt-suggestion.js +14 -14
  75. package/dist/wc/hf-ai-prompt-suggestion.js.map +1 -1
  76. package/dist/wc/hf-ai-reasoning-block.js +13 -13
  77. package/dist/wc/hf-ai-reasoning-block.js.map +1 -1
  78. package/dist/wc/hf-ai-steps.js +53 -53
  79. package/dist/wc/hf-ai-steps.js.map +1 -1
  80. package/dist/wc/hf-ai-system-message.js +26 -26
  81. package/dist/wc/hf-ai-system-message.js.map +1 -1
  82. package/dist/wc/hf-code-snippet.js +35 -35
  83. package/dist/wc/hf-code-snippet.js.map +1 -1
  84. package/dist/wc/hf-command-menu.js +39 -39
  85. package/dist/wc/hf-command-menu.js.map +1 -1
  86. package/dist/wc/hf-data-table.js +3 -3
  87. package/dist/wc/hf-data-table.js.map +1 -1
  88. package/dist/wc/hf-display-value.js +50 -50
  89. package/dist/wc/hf-display-value.js.map +1 -1
  90. package/dist/wc/hf-nav-account-menu.js +5 -5
  91. package/dist/wc/hf-nav-account-menu.js.map +1 -1
  92. package/dist/wc/hf-rich-textarea.js +1 -1
  93. package/dist/wc/hf-rich-textarea.js.map +1 -1
  94. package/dist/wc/hf-steps.js +8 -8
  95. package/dist/wc/hf-steps.js.map +1 -1
  96. package/dist/wc/markdown-renderer.js +1 -1
  97. package/dist/wc/markdown-renderer.js.map +1 -1
  98. package/dist/wc/selection-group.js +26 -26
  99. package/dist/wc/selection-group.js.map +1 -1
  100. package/dist/wc/syntax-highlight.js +4 -4
  101. package/dist/wc/syntax-highlight.js.map +1 -1
  102. package/dist/wc/workflow-step-renderer.js +51 -51
  103. package/dist/wc/workflow-step-renderer.js.map +1 -1
  104. package/dist/wc-react/AICodeBlock.js +17 -17
  105. package/dist/wc-react/AICodeBlock.js.map +1 -1
  106. package/dist/wc-react/AIMermaidDiagram.js +16 -16
  107. package/dist/wc-react/AIMermaidDiagram.js.map +1 -1
  108. package/dist/wc-react/AIMessage.js +7 -7
  109. package/dist/wc-react/AIMessage.js.map +1 -1
  110. package/dist/wc-react/AISource.js +41 -41
  111. package/dist/wc-react/AISource.js.map +1 -1
  112. package/dist/wc-react/AIToolCall.js +6 -6
  113. package/dist/wc-react/AIToolCall.js.map +1 -1
  114. package/dist/wc-react/Breadcrumb.js +18 -18
  115. package/dist/wc-react/Breadcrumb.js.map +1 -1
  116. package/dist/wc-react/DropdownMenu.js +27 -27
  117. package/dist/wc-react/DropdownMenu.js.map +1 -1
  118. package/dist/wc-react/Kbd.js +17 -17
  119. package/dist/wc-react/Kbd.js.map +1 -1
  120. package/dist/wc-react/button.js +12 -12
  121. package/dist/wc-react/button.js.map +1 -1
  122. package/dist/wc-react/close-button.js +19 -19
  123. package/dist/wc-react/close-button.js.map +1 -1
  124. package/dist/wc-react/hf-ai-prompt-suggestion.js +1 -1
  125. package/dist/wc-react/hf-ai-prompt-suggestion.js.map +1 -1
  126. package/dist/wc-react/hf-ai-reasoning-block.js +1 -1
  127. package/dist/wc-react/hf-ai-reasoning-block.js.map +1 -1
  128. package/dist/wc-react/hf-ai-steps.js +33 -33
  129. package/dist/wc-react/hf-ai-steps.js.map +1 -1
  130. package/dist/wc-react/hf-ai-system-message.js +9 -9
  131. package/dist/wc-react/hf-ai-system-message.js.map +1 -1
  132. package/dist/wc-react/hf-code-snippet.js +3 -3
  133. package/dist/wc-react/hf-code-snippet.js.map +1 -1
  134. package/dist/wc-react/hf-command-menu.js +56 -56
  135. package/dist/wc-react/hf-command-menu.js.map +1 -1
  136. package/dist/wc-react/hf-data-table.js +3 -3
  137. package/dist/wc-react/hf-data-table.js.map +1 -1
  138. package/dist/wc-react/hf-display-value.js +58 -58
  139. package/dist/wc-react/hf-display-value.js.map +1 -1
  140. package/dist/wc-react/hf-nav-account-menu.js +7 -7
  141. package/dist/wc-react/hf-nav-account-menu.js.map +1 -1
  142. package/dist/wc-react/hf-rich-textarea.js +5 -5
  143. package/dist/wc-react/hf-rich-textarea.js.map +1 -1
  144. package/dist/wc-react/hf-steps.js +2 -2
  145. package/dist/wc-react/hf-steps.js.map +1 -1
  146. package/dist/wc-react/markdown-renderer.js +1 -1
  147. package/dist/wc-react/markdown-renderer.js.map +1 -1
  148. package/dist/wc-react/selection-group.js +7 -7
  149. package/dist/wc-react/selection-group.js.map +1 -1
  150. package/dist/wc-react/syntax-highlight.js +4 -4
  151. package/dist/wc-react/syntax-highlight.js.map +1 -1
  152. package/dist/wc-react/workflow-step-renderer.js +44 -44
  153. package/dist/wc-react/workflow-step-renderer.js.map +1 -1
  154. package/package.json +1 -1
  155. package/skills/humain-ui/SKILL.md +1 -1
  156. package/skills/humain-ui-wc/SKILL.md +1 -1
  157. package/skills/humain-ui-wc.skill +0 -0
  158. package/skills/humain-ui.skill +0 -0
  159. package/src/tokens.css +4 -0
@@ -1,4 +1,4 @@
1
- import { a as g, r as N } from "./rolldown-runtime.js";
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 q, t as F } from "./syntax-highlight-react.js";
10
- var l = /* @__PURE__ */ g(B(), 1), e = I(), b = R("relative overflow-hidden rounded-xl border border-border bg-muted", {
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 V(o, r) {
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 f({ language: o, fileName: r, showCopyButton: s = !0, onCopy: a, copied: t = !1, className: i, actions: d }) {
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-text-quaternary uppercase",
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, s && /* @__PURE__ */ (0, e.jsxs)(z, {
42
+ children: [d, t && /* @__PURE__ */ (0, e.jsxs)(z, {
43
43
  appearance: "ghost",
44
44
  variant: "secondary",
45
45
  size: "sm",
46
- onClick: a,
47
- "aria-label": t ? "Copied to clipboard" : "Copy code to clipboard",
48
- className: "h-7 px-2 text-text-quaternary hover:text-secondary-foreground transition-colors duration-150 ease-out",
49
- children: [t ? /* @__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", {
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: t ? "Copied!" : "Copy"
51
+ children: s ? "Copied!" : "Copy"
52
52
  })]
53
53
  })]
54
54
  })]
55
55
  });
56
56
  }
57
- f.displayName = "AICodeBlockHeader";
58
- function E({ children: o, showLineNumbers: r, startLineNumber: s }) {
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((a, t) => /* @__PURE__ */ (0, e.jsx)("span", {
65
- className: "text-muted-foreground leading-relaxed",
66
- children: s + t
67
- }, t))
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: s = 1, className: a }) {
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", a),
91
- children: /* @__PURE__ */ (0, e.jsx)(E, {
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: s,
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: s, showHeader: a = !0, showCopyButton: t = !0, showLineNumbers: i = !1, startLineNumber: d = 1, highlightedCode: m, size: v, className: y, headerActions: C }) {
100
- const j = l.useMemo(() => m ? q(m) : F(o), [o, m]), [u, x] = l.useReducer(V, {
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 } = u, p = l.useRef(null);
103
+ }), { copied: k } = f, p = l.useRef(null);
104
104
  l.useEffect(() => {
105
- if (!u.copied) return;
106
- const n = setTimeout(() => {
105
+ if (!f.copied) return;
106
+ const a = setTimeout(() => {
107
107
  x(!1);
108
108
  }, 2e3);
109
109
  return () => {
110
- clearTimeout(n);
110
+ clearTimeout(a);
111
111
  };
112
- }, [u]);
113
- const w = l.useCallback(async () => {
112
+ }, [f]);
113
+ const g = l.useCallback(async () => {
114
114
  try {
115
- const n = p.current?.ownerDocument.defaultView;
116
- if (!n) return;
117
- await n.navigator.clipboard.writeText(o), x(!0);
118
- } catch (n) {
119
- console.error("Failed to copy code:", n);
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: [a && /* @__PURE__ */ (0, e.jsx)(f, {
127
+ children: [n && /* @__PURE__ */ (0, e.jsx)(u, {
128
128
  language: r,
129
- fileName: s,
130
- showCopyButton: t,
131
- onCopy: w,
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-muted-foreground [&_.sh__line]:before:select-none"]),
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: () => f,
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 R({ maxHeight: t }) {
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
- ]), q = l.useCallback(() => {
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)(R, { maxHeight: g })
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)(R, { maxHeight: g })
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: q,
464
- onMouseLeave: q,
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-text-quaternary px-1 tabular-nums",
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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"}
@@ -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-text-quaternary",
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-text-quaternary",
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: q, thumbsDownActive: L, className: H, ...F }, O) => /* @__PURE__ */ (0, e.jsxs)(S, {
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: q,
307
- thumbsDownActive: L,
308
- className: H,
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, {