markdown-flow-ui 0.1.70-beta.1 → 0.1.71-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/index.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/hast-util-to-jsx-runtime@2.3.6/node_modules/hast-util-to-jsx-runtime/lib/index.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/c4Diagram-YG6GDRKO.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-S3R3BYOJ.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-TZMSLE5B.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/ganttDiagram-LVOFAZNH.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/sequenceDiagram-WL72ISMW.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/style-to-object@1.0.11/node_modules/style-to-object/cjs/index.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/unified@11.0.5/node_modules/unified/lib/index.js +1 -1
- package/dist/_virtual/index10.js +2 -2
- package/dist/_virtual/index5.js +3 -5
- package/dist/_virtual/index5.js.map +1 -1
- package/dist/_virtual/index6.js +4 -4
- package/dist/_virtual/index7.js +5 -3
- package/dist/_virtual/index7.js.map +1 -1
- package/dist/_virtual/index9.js +2 -2
- package/dist/assets/markdown-flow-ui.css +1 -1
- package/dist/components/ContentRender/ContentRender.d.ts +10 -16
- package/dist/components/ContentRender/ContentRender.js +102 -125
- package/dist/components/ContentRender/ContentRender.js.map +1 -1
- package/dist/components/ContentRender/ContentRender.stories.d.ts +1 -12
- package/dist/components/ContentRender/index.d.ts +0 -1
- package/dist/components/ContentRender/plugins/MermaidChart.js +7 -1
- package/dist/components/ContentRender/plugins/MermaidChart.js.map +1 -1
- package/dist/components/ContentRender/utils/mermaid-parse.d.ts +0 -4
- package/dist/components/ContentRender/utils/mermaid-parse.js +65 -112
- package/dist/components/ContentRender/utils/mermaid-parse.js.map +1 -1
- package/dist/components/MarkdownFlow/MarkdownFlow.d.ts +0 -7
- package/dist/components/MarkdownFlow/MarkdownFlow.js +21 -28
- package/dist/components/MarkdownFlow/MarkdownFlow.js.map +1 -1
- package/dist/components/MarkdownFlow/MarkdownFlow.stories.d.ts +1 -3
- package/dist/components/ui/tooltip.js +2 -2
- package/dist/components/ui/tooltip.js.map +1 -1
- package/dist/markdown-flow-ui-lib.css +1 -1
- package/package.json +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/fullscreen.js +0 -19
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/fullscreen.js.map +0 -1
- package/dist/components/ContentRender/ContentBlackboard.d.ts +0 -9
- package/dist/components/ContentRender/ContentBlackboard.js +0 -126
- package/dist/components/ContentRender/ContentBlackboard.js.map +0 -1
- package/dist/components/ContentRender/ContentHtml.d.ts +0 -22
- package/dist/components/ContentRender/ContentHtml.js +0 -108
- package/dist/components/ContentRender/ContentHtml.js.map +0 -1
- package/dist/components/ContentRender/utils/content-html-stream.d.ts +0 -8
- package/dist/components/ContentRender/utils/content-html-stream.js +0 -18
- package/dist/components/ContentRender/utils/content-html-stream.js.map +0 -1
|
@@ -3,16 +3,16 @@ import { CustomRenderBarProps, OnSendContentParams } from '../types';
|
|
|
3
3
|
export interface ContentRenderProps {
|
|
4
4
|
content: string;
|
|
5
5
|
/**
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
6
|
+
+ * Callback invoked when the custom button after content is clicked.
|
|
7
|
+
+ * This button is rendered via the `<custom-button-after-content>` tag in markdown content.
|
|
8
|
+
+ * @example
|
|
9
|
+
+ * ```tsx
|
|
10
|
+
+ * <ContentRender
|
|
11
|
+
+ * content="Hello <custom-button-after-content>Ask</custom-button-after-content>"
|
|
12
|
+
+ * onClickCustomButtonAfterContent={() => console.log('Button clicked')}
|
|
13
|
+
+ * />
|
|
14
|
+
+ * ```
|
|
15
|
+
+ */
|
|
16
16
|
customRenderBar?: CustomRenderBarProps;
|
|
17
17
|
onClickCustomButtonAfterContent?: () => void;
|
|
18
18
|
onSend?: (content: OnSendContentParams) => void;
|
|
@@ -27,13 +27,7 @@ export interface ContentRenderProps {
|
|
|
27
27
|
copyButtonText?: string;
|
|
28
28
|
copiedButtonText?: string;
|
|
29
29
|
dynamicInteractionFormat?: string;
|
|
30
|
-
fullscreenButtonText?: string;
|
|
31
30
|
beforeSend?: (param: OnSendContentParams) => boolean;
|
|
32
|
-
contentHtmlPayload?: string;
|
|
33
|
-
contentType?: "default" | "blackboard";
|
|
34
|
-
renderNarrationAsCaption?: boolean;
|
|
35
|
-
maxVisibleStepNumber?: number;
|
|
36
|
-
visibleStepNumber?: number;
|
|
37
31
|
}
|
|
38
32
|
declare const ContentRender: React.FC<ContentRenderProps>;
|
|
39
33
|
export default ContentRender;
|
|
@@ -1,103 +1,95 @@
|
|
|
1
1
|
import { j as t } from "../../_virtual/jsx-runtime.js";
|
|
2
2
|
/* empty css */
|
|
3
3
|
/* empty css */
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import G from "./ContentBlackboard.js";
|
|
4
|
+
import S, { useRef as x, useEffect as i } from "react";
|
|
5
|
+
import B from "../../_virtual/index.js";
|
|
7
6
|
/* empty css */
|
|
8
7
|
/* empty css */
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
import
|
|
13
|
-
import
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import
|
|
18
|
-
import
|
|
19
|
-
import
|
|
20
|
-
import
|
|
21
|
-
import
|
|
22
|
-
import
|
|
23
|
-
|
|
24
|
-
const
|
|
25
|
-
const n = b(null);
|
|
8
|
+
import P from "./CodeBlock.js";
|
|
9
|
+
import E from "./plugins/CustomVariable.js";
|
|
10
|
+
import h from "./plugins/MermaidChart.js";
|
|
11
|
+
import T from "./useTypewriterStateMachine.js";
|
|
12
|
+
import { preserveCustomVariableProperties as V, restoreCustomVariableProperties as _ } from "./utils/custom-variable-props.js";
|
|
13
|
+
import { subsetLanguages as z, highlightLanguages as A } from "./utils/highlight-languages.js";
|
|
14
|
+
import { parseMarkdownSegments as H, mermaidBlockIsComplete as G } from "./utils/mermaid-parse.js";
|
|
15
|
+
import { Markdown as K } from "../../Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/react-markdown@10.1.0_@types_react@19.2.2_react@19.0.1/node_modules/react-markdown/lib/index.js";
|
|
16
|
+
import $ from "../../Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rehype-raw@7.0.0/node_modules/rehype-raw/lib/index.js";
|
|
17
|
+
import q from "../../Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rehype-highlight@7.0.2/node_modules/rehype-highlight/lib/index.js";
|
|
18
|
+
import D from "../../Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rehype-katex@7.0.1/node_modules/rehype-katex/lib/index.js";
|
|
19
|
+
import F from "../../Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/remark-gfm@4.0.1/node_modules/remark-gfm/lib/index.js";
|
|
20
|
+
import J from "../../Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/remark-math@6.0.0/node_modules/remark-math/lib/index.js";
|
|
21
|
+
import O from "../../Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/remark-breaks@4.0.0/node_modules/remark-breaks/lib/index.js";
|
|
22
|
+
const Q = ({ svg: s }) => {
|
|
23
|
+
const n = x(null);
|
|
26
24
|
return i(() => {
|
|
27
|
-
const
|
|
28
|
-
if (!
|
|
29
|
-
const m =
|
|
30
|
-
m.innerHTML =
|
|
31
|
-
}, [
|
|
32
|
-
},
|
|
33
|
-
content:
|
|
25
|
+
const a = n.current;
|
|
26
|
+
if (!a) return;
|
|
27
|
+
const m = a.shadowRoot ?? a.attachShadow({ mode: "open" });
|
|
28
|
+
m.innerHTML = s;
|
|
29
|
+
}, [s]), /* @__PURE__ */ t.jsx("div", { className: "content-render-svg", ref: n });
|
|
30
|
+
}, ke = ({
|
|
31
|
+
content: s,
|
|
34
32
|
customRenderBar: n,
|
|
35
|
-
onSend:
|
|
33
|
+
onSend: a,
|
|
36
34
|
typingSpeed: m = 30,
|
|
37
|
-
enableTypewriter:
|
|
38
|
-
defaultButtonText:
|
|
39
|
-
defaultInputText:
|
|
40
|
-
defaultSelectedValues:
|
|
41
|
-
readonly:
|
|
42
|
-
onTypeFinished:
|
|
43
|
-
confirmButtonText:
|
|
44
|
-
copyButtonText:
|
|
45
|
-
copiedButtonText:
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
beforeSend: L,
|
|
49
|
-
contentHtmlPayload: l,
|
|
50
|
-
contentType: S = "default",
|
|
51
|
-
renderNarrationAsCaption: B = !1,
|
|
52
|
-
maxVisibleStepNumber: E,
|
|
53
|
-
visibleStepNumber: V
|
|
35
|
+
enableTypewriter: j = !1,
|
|
36
|
+
defaultButtonText: k,
|
|
37
|
+
defaultInputText: b,
|
|
38
|
+
defaultSelectedValues: g,
|
|
39
|
+
readonly: N = !1,
|
|
40
|
+
onTypeFinished: l,
|
|
41
|
+
confirmButtonText: y,
|
|
42
|
+
copyButtonText: C,
|
|
43
|
+
copiedButtonText: v,
|
|
44
|
+
onClickCustomButtonAfterContent: w,
|
|
45
|
+
beforeSend: R
|
|
54
46
|
// tooltipMinLength,
|
|
55
47
|
}) => {
|
|
56
|
-
const { displayContent:
|
|
48
|
+
const { displayContent: u, isComplete: p } = T({
|
|
57
49
|
// processMarkdownText will let code block printf("You win!\n") become printf("You win!<br/>");
|
|
58
50
|
// content: processMarkdownText(content),
|
|
59
|
-
content:
|
|
51
|
+
content: s,
|
|
60
52
|
typingSpeed: m,
|
|
61
|
-
disabled: !
|
|
62
|
-
}),
|
|
53
|
+
disabled: !j
|
|
54
|
+
}), M = {
|
|
63
55
|
"custom-button-after-content": ({
|
|
64
56
|
children: e
|
|
65
57
|
}) => /* @__PURE__ */ t.jsx(
|
|
66
58
|
"button",
|
|
67
59
|
{
|
|
68
60
|
className: "content-render-custom-button-after-content",
|
|
69
|
-
onClick:
|
|
61
|
+
onClick: w,
|
|
70
62
|
children: e
|
|
71
63
|
}
|
|
72
64
|
),
|
|
73
65
|
"custom-variable": (e) => /* @__PURE__ */ t.jsx(
|
|
74
|
-
|
|
66
|
+
E,
|
|
75
67
|
{
|
|
76
68
|
...e,
|
|
77
|
-
readonly:
|
|
78
|
-
defaultButtonText:
|
|
79
|
-
defaultInputText:
|
|
80
|
-
defaultSelectedValues:
|
|
81
|
-
onSend:
|
|
82
|
-
beforeSend:
|
|
83
|
-
confirmButtonText:
|
|
69
|
+
readonly: N,
|
|
70
|
+
defaultButtonText: k,
|
|
71
|
+
defaultInputText: b,
|
|
72
|
+
defaultSelectedValues: g,
|
|
73
|
+
onSend: a,
|
|
74
|
+
beforeSend: R,
|
|
75
|
+
confirmButtonText: y
|
|
84
76
|
}
|
|
85
77
|
),
|
|
86
78
|
code: (e) => {
|
|
87
|
-
const { className: r, children:
|
|
79
|
+
const { className: r, children: o, ...d } = e;
|
|
88
80
|
if (/language-(\w+)/.exec(r || "")?.[1] === "mermaid") {
|
|
89
|
-
const
|
|
90
|
-
return /* @__PURE__ */ t.jsx(
|
|
81
|
+
const f = o?.toString().replace(/\n$/, "") || "", L = G(s, f);
|
|
82
|
+
return /* @__PURE__ */ t.jsx(h, { chart: f, frozen: L });
|
|
91
83
|
}
|
|
92
|
-
return /* @__PURE__ */ t.jsx("code", { className: r, ...
|
|
84
|
+
return /* @__PURE__ */ t.jsx("code", { className: r, ...d, children: o });
|
|
93
85
|
},
|
|
94
86
|
table: ({ ...e }) => /* @__PURE__ */ t.jsx("div", { className: "content-render-table-container", children: /* @__PURE__ */ t.jsx("table", { className: "content-render-table", ...e }) }),
|
|
95
87
|
th: ({ ...e }) => /* @__PURE__ */ t.jsx("th", { className: "content-render-th", ...e }),
|
|
96
88
|
td: ({ ...e }) => /* @__PURE__ */ t.jsx("td", { className: "content-render-td", ...e }),
|
|
97
89
|
tr: ({ ...e }) => /* @__PURE__ */ t.jsx("tr", { className: "content-render-tr", ...e }),
|
|
98
90
|
li: ({ node: e, ...r }) => {
|
|
99
|
-
const
|
|
100
|
-
return typeof
|
|
91
|
+
const o = e?.properties?.className;
|
|
92
|
+
return typeof o == "string" && o.includes("task-list-item") || Array.isArray(o) && o.includes("task-list-item") ? /* @__PURE__ */ t.jsx("li", { className: "content-render-task-list-item", ...r }) : /* @__PURE__ */ t.jsx("li", { ...r });
|
|
101
93
|
},
|
|
102
94
|
ol: ({ ...e }) => /* @__PURE__ */ t.jsx("ol", { className: "content-render-ol", ...e }),
|
|
103
95
|
ul: ({ ...e }) => /* @__PURE__ */ t.jsx("ul", { className: "content-render-ul", ...e }),
|
|
@@ -112,77 +104,62 @@ const re = ({ svg: o }) => {
|
|
|
112
104
|
) : /* @__PURE__ */ t.jsx("input", { ...e }),
|
|
113
105
|
a: ({ children: e, ...r }) => /* @__PURE__ */ t.jsx("a", { target: "_blank", rel: "noopener noreferrer", ...r, children: e }),
|
|
114
106
|
pre: (e) => /* @__PURE__ */ t.jsx(
|
|
115
|
-
|
|
107
|
+
P,
|
|
116
108
|
{
|
|
117
109
|
...e,
|
|
118
|
-
copyButtonText:
|
|
119
|
-
copiedButtonText:
|
|
110
|
+
copyButtonText: C,
|
|
111
|
+
copiedButtonText: v
|
|
120
112
|
}
|
|
121
113
|
)
|
|
122
|
-
}, c =
|
|
114
|
+
}, c = x(!1);
|
|
123
115
|
i(() => {
|
|
124
|
-
|
|
125
|
-
}, [
|
|
116
|
+
p && !c.current && (c.current = !0, l?.());
|
|
117
|
+
}, [p, l]), i(() => {
|
|
126
118
|
c.current = !1;
|
|
127
|
-
}, [
|
|
128
|
-
const
|
|
119
|
+
}, [s]);
|
|
120
|
+
const I = H(u);
|
|
129
121
|
return /* @__PURE__ */ t.jsxs("div", { className: "content-render markdown-body", children: [
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
)
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
renderNarrationAsCaption: B,
|
|
168
|
-
maxVisibleStepNumber: E,
|
|
169
|
-
visibleStepNumber: V
|
|
170
|
-
}
|
|
171
|
-
) : /* @__PURE__ */ t.jsx(
|
|
172
|
-
k,
|
|
173
|
-
{
|
|
174
|
-
payload: l,
|
|
175
|
-
fullscreenButtonText: p
|
|
176
|
-
}
|
|
177
|
-
)),
|
|
178
|
-
n && P.createElement(n, {
|
|
179
|
-
content: o,
|
|
180
|
-
displayContent: f,
|
|
181
|
-
onSend: s
|
|
122
|
+
I.map((e, r) => {
|
|
123
|
+
if (e.type === "text")
|
|
124
|
+
return /* @__PURE__ */ t.jsx(
|
|
125
|
+
K,
|
|
126
|
+
{
|
|
127
|
+
remarkPlugins: [F, J, B, O],
|
|
128
|
+
rehypePlugins: [
|
|
129
|
+
V,
|
|
130
|
+
$,
|
|
131
|
+
_,
|
|
132
|
+
[
|
|
133
|
+
q,
|
|
134
|
+
{ languages: A, subset: z }
|
|
135
|
+
],
|
|
136
|
+
D
|
|
137
|
+
],
|
|
138
|
+
components: M,
|
|
139
|
+
children: e.value
|
|
140
|
+
},
|
|
141
|
+
r
|
|
142
|
+
);
|
|
143
|
+
if (e.type === "mermaid")
|
|
144
|
+
return /* @__PURE__ */ t.jsx(
|
|
145
|
+
h,
|
|
146
|
+
{
|
|
147
|
+
chart: e.value,
|
|
148
|
+
frozen: !e.complete
|
|
149
|
+
},
|
|
150
|
+
r
|
|
151
|
+
);
|
|
152
|
+
if (e.type === "svg")
|
|
153
|
+
return /* @__PURE__ */ t.jsx(Q, { svg: e.value }, r);
|
|
154
|
+
}),
|
|
155
|
+
n && S.createElement(n, {
|
|
156
|
+
content: s,
|
|
157
|
+
displayContent: u,
|
|
158
|
+
onSend: a
|
|
182
159
|
})
|
|
183
160
|
] });
|
|
184
161
|
};
|
|
185
162
|
export {
|
|
186
|
-
|
|
163
|
+
ke as default
|
|
187
164
|
};
|
|
188
165
|
//# sourceMappingURL=ContentRender.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContentRender.js","sources":["../../../src/components/ContentRender/ContentRender.tsx"],"sourcesContent":["import \"highlight.js/styles/github.css\";\nimport \"katex/dist/katex.min.css\";\nimport React, { useEffect, useRef } from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport rehypeHighlight from \"rehype-highlight\";\nimport rehypeKatex from \"rehype-katex\";\nimport rehypeRaw from \"rehype-raw\";\nimport remarkBreaks from \"remark-breaks\";\nimport remarkFlow from \"remark-flow\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkMath from \"remark-math\";\nimport { CustomRenderBarProps, OnSendContentParams } from \"../types\";\nimport ContentBlackboard from \"./ContentBlackboard\";\nimport \"./contentRender.css\";\nimport \"./github-markdown-light.css\";\nimport CodeBlock from \"./CodeBlock\";\nimport CustomButtonInputVariable, {\n ComponentsWithCustomVariable,\n} from \"./plugins/CustomVariable\";\nimport MermaidChart from \"./plugins/MermaidChart\";\nimport ContentHtml from \"./ContentHtml\";\nimport useTypewriterStateMachine from \"./useTypewriterStateMachine\";\nimport {\n preserveCustomVariableProperties,\n restoreCustomVariableProperties,\n} from \"./utils/custom-variable-props\";\nimport {\n highlightLanguages,\n subsetLanguages,\n} from \"./utils/highlight-languages\";\n// import { processMarkdownText } from \"./utils/process-markdown\";\nimport {\n parseMarkdownSegments,\n mermaidBlockIsComplete,\n} from \"./utils/mermaid-parse\";\n// Define component Props type\nexport interface ContentRenderProps {\n content: string;\n /**\n * Callback invoked when the custom button after content is clicked.\n * This button is rendered via the `<custom-button-after-content>` tag in markdown content.\n * @example\n * ```tsx\n * <ContentRender\n * content=\"Hello <custom-button-after-content>Ask</custom-button-after-content>\"\n * onClickCustomButtonAfterContent={() => console.log('Button clicked')}\n * />\n * ```\n */\n customRenderBar?: CustomRenderBarProps;\n onClickCustomButtonAfterContent?: () => void;\n onSend?: (content: OnSendContentParams) => void;\n typingSpeed?: number;\n enableTypewriter?: boolean;\n defaultButtonText?: string;\n defaultInputText?: string; // Text input by user\n defaultSelectedValues?: string[]; // Default selected values for multi-select\n readonly?: boolean;\n onTypeFinished?: () => void;\n // Multi-select confirm button text (i18n support)\n confirmButtonText?: string;\n // Copy button text (i18n support)\n copyButtonText?: string;\n // Copied state text (i18n support)\n copiedButtonText?: string;\n // Dynamic interaction format for multi-select support\n dynamicInteractionFormat?: string;\n // Fullscreen button text for iframe rendering\n fullscreenButtonText?: string;\n beforeSend?: (param: OnSendContentParams) => boolean;\n // Raw payload for content_html stream messages\n contentHtmlPayload?: string;\n // Content render type, blackboard will use ContentBlackboard for streaming chunks\n contentType?: \"default\" | \"blackboard\";\n // Render narration as caption overlay for blackboard streaming mode\n renderNarrationAsCaption?: boolean;\n // Maximum visible step number when using blackboard streaming mode (manual stepping)\n maxVisibleStepNumber?: number;\n // Visible step number for single-step display (non-accumulated)\n visibleStepNumber?: number;\n // tooltipMinLength?: number; // Control minimum character length for tooltip display, default 10\n}\n\n// Render svg string via Shadow DOM to avoid markdown wrapping\nconst SvgBlockInShadow: React.FC<{ svg: string }> = ({ svg }) => {\n const hostRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const host = hostRef.current;\n if (!host) return;\n const shadowRoot = host.shadowRoot ?? host.attachShadow({ mode: \"open\" });\n shadowRoot.innerHTML = svg;\n }, [svg]);\n\n return <div className=\"content-render-svg\" ref={hostRef} />;\n};\n\n// Extended component interface\ntype CustomComponents = ComponentsWithCustomVariable & {\n \"custom-button-after-content\"?: React.ComponentType<{\n children: React.ReactNode;\n }>;\n};\n\nconst ContentRender: React.FC<ContentRenderProps> = ({\n content,\n customRenderBar,\n onSend,\n typingSpeed = 30,\n enableTypewriter = false,\n defaultButtonText,\n defaultInputText,\n defaultSelectedValues,\n readonly = false,\n onTypeFinished,\n confirmButtonText,\n copyButtonText,\n copiedButtonText,\n fullscreenButtonText,\n onClickCustomButtonAfterContent,\n beforeSend,\n contentHtmlPayload,\n contentType = \"default\",\n renderNarrationAsCaption = false,\n maxVisibleStepNumber,\n visibleStepNumber,\n // tooltipMinLength,\n}) => {\n // Use custom Hook to handle typewriter effect\n const { displayContent, isComplete } = useTypewriterStateMachine({\n // processMarkdownText will let code block printf(\"You win!\\n\") become printf(\"You win!<br/>\");\n // content: processMarkdownText(content),\n content: content,\n typingSpeed,\n disabled: !enableTypewriter,\n });\n const components: CustomComponents = {\n \"custom-button-after-content\": ({\n children,\n }: {\n children: React.ReactNode;\n }) => {\n return (\n <button\n className=\"content-render-custom-button-after-content\"\n onClick={onClickCustomButtonAfterContent}\n >\n {children}\n </button>\n );\n },\n \"custom-variable\": (props) => (\n <CustomButtonInputVariable\n {...props}\n readonly={readonly}\n defaultButtonText={defaultButtonText}\n defaultInputText={defaultInputText}\n defaultSelectedValues={defaultSelectedValues}\n onSend={onSend}\n beforeSend={beforeSend}\n confirmButtonText={confirmButtonText}\n // tooltipMinLength={tooltipMinLength}\n />\n ),\n code: (props) => {\n const { className, children, ...rest } = props as {\n className?: string;\n children?: React.ReactNode;\n };\n const match = /language-(\\w+)/.exec(className || \"\");\n const language = match?.[1];\n if (language === \"mermaid\") {\n const chartContent = children?.toString().replace(/\\n$/, \"\") || \"\";\n const frozen = mermaidBlockIsComplete(content, chartContent);\n return <MermaidChart chart={chartContent} frozen={frozen} />;\n }\n\n return (\n <code className={className} {...rest}>\n {children}\n </code>\n );\n },\n table: ({ ...props }) => (\n <div className=\"content-render-table-container\">\n <table className=\"content-render-table\" {...props} />\n </div>\n ),\n th: ({ ...props }) => <th className=\"content-render-th\" {...props} />,\n td: ({ ...props }) => <td className=\"content-render-td\" {...props} />,\n tr: ({ ...props }) => <tr className=\"content-render-tr\" {...props} />,\n li: ({ node, ...props }) => {\n const className = node?.properties?.className;\n const hasTaskListItem =\n (typeof className === \"string\" &&\n className.includes(\"task-list-item\")) ||\n (Array.isArray(className) && className.includes(\"task-list-item\"));\n if (hasTaskListItem) {\n return <li className=\"content-render-task-list-item\" {...props} />;\n }\n return <li {...props} />;\n },\n ol: ({ ...props }) => <ol className=\"content-render-ol\" {...props} />,\n ul: ({ ...props }) => <ul className=\"content-render-ul\" {...props} />,\n input: ({ ...props }) => {\n if (props.type === \"checkbox\") {\n return (\n <input\n type=\"checkbox\"\n className=\"content-render-checkbox\"\n disabled\n {...props}\n />\n );\n }\n return <input {...props} />;\n },\n a: ({ children, ...props }) => (\n <a target=\"_blank\" rel=\"noopener noreferrer\" {...props}>\n {children}\n </a>\n ),\n pre: (props) => (\n <CodeBlock\n {...props}\n copyButtonText={copyButtonText}\n copiedButtonText={copiedButtonText}\n />\n ),\n };\n\n const hasCompleted = useRef(false);\n\n useEffect(() => {\n if (isComplete && !hasCompleted.current) {\n hasCompleted.current = true; // Mark as completed\n onTypeFinished?.(); // Call the passed callback\n }\n }, [isComplete, onTypeFinished]);\n useEffect(() => {\n hasCompleted.current = false; // Reset completion status when content changes\n }, [content]);\n\n const segments = parseMarkdownSegments(displayContent);\n\n return (\n <div className={`content-render markdown-body`}>\n {segments.map((seg, index) => {\n if (seg.type === \"text\") {\n return (\n <ReactMarkdown\n key={index}\n remarkPlugins={[remarkGfm, remarkMath, remarkFlow, remarkBreaks]}\n rehypePlugins={[\n preserveCustomVariableProperties,\n rehypeRaw,\n restoreCustomVariableProperties,\n [\n rehypeHighlight,\n { languages: highlightLanguages, subset: subsetLanguages },\n ],\n rehypeKatex,\n ]}\n components={components}\n >\n {seg.value}\n </ReactMarkdown>\n );\n }\n\n if (seg.type === \"mermaid\") {\n return (\n <MermaidChart\n key={index}\n chart={seg.value}\n frozen={!seg.complete}\n />\n );\n }\n\n if (seg.type === \"svg\") {\n return <SvgBlockInShadow key={index} svg={seg.value} />;\n }\n\n if (seg.type === \"html\") {\n return (\n <ContentHtml\n key={index}\n html={seg.value}\n fullscreenButtonText={fullscreenButtonText}\n />\n );\n }\n\n return null;\n })}\n\n {contentHtmlPayload &&\n (contentType === \"blackboard\" ? (\n <ContentBlackboard\n payload={contentHtmlPayload}\n renderNarrationAsCaption={renderNarrationAsCaption}\n maxVisibleStepNumber={maxVisibleStepNumber}\n visibleStepNumber={visibleStepNumber}\n />\n ) : (\n <ContentHtml\n payload={contentHtmlPayload}\n fullscreenButtonText={fullscreenButtonText}\n />\n ))}\n\n {customRenderBar &&\n React.createElement(customRenderBar, {\n content,\n displayContent,\n onSend,\n })}\n </div>\n );\n};\n\nexport default ContentRender;\n"],"names":["SvgBlockInShadow","svg","hostRef","useRef","useEffect","host","shadowRoot","jsx","ContentRender","content","customRenderBar","onSend","typingSpeed","enableTypewriter","defaultButtonText","defaultInputText","defaultSelectedValues","readonly","onTypeFinished","confirmButtonText","copyButtonText","copiedButtonText","fullscreenButtonText","onClickCustomButtonAfterContent","beforeSend","contentHtmlPayload","contentType","renderNarrationAsCaption","maxVisibleStepNumber","visibleStepNumber","displayContent","isComplete","useTypewriterStateMachine","components","children","props","CustomButtonInputVariable","className","rest","chartContent","frozen","mermaidBlockIsComplete","MermaidChart","node","CodeBlock","hasCompleted","segments","parseMarkdownSegments","jsxs","seg","index","ReactMarkdown","remarkGfm","remarkMath","remarkFlow","remarkBreaks","preserveCustomVariableProperties","rehypeRaw","restoreCustomVariableProperties","rehypeHighlight","highlightLanguages","subsetLanguages","rehypeKatex","ContentHtml","ContentBlackboard","React"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ContentRender.js","sources":["../../../src/components/ContentRender/ContentRender.tsx"],"sourcesContent":["import \"highlight.js/styles/github.css\";\nimport \"katex/dist/katex.min.css\";\nimport React, { useEffect, useRef } from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport rehypeHighlight from \"rehype-highlight\";\nimport rehypeKatex from \"rehype-katex\";\nimport rehypeRaw from \"rehype-raw\";\nimport remarkBreaks from \"remark-breaks\";\nimport remarkFlow from \"remark-flow\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkMath from \"remark-math\";\nimport { CustomRenderBarProps, OnSendContentParams } from \"../types\";\nimport \"./contentRender.css\";\nimport \"./github-markdown-light.css\";\nimport CodeBlock from \"./CodeBlock\";\nimport CustomButtonInputVariable, {\n ComponentsWithCustomVariable,\n} from \"./plugins/CustomVariable\";\nimport MermaidChart from \"./plugins/MermaidChart\";\nimport useTypewriterStateMachine from \"./useTypewriterStateMachine\";\nimport {\n preserveCustomVariableProperties,\n restoreCustomVariableProperties,\n} from \"./utils/custom-variable-props\";\nimport {\n highlightLanguages,\n subsetLanguages,\n} from \"./utils/highlight-languages\";\n// import { processMarkdownText } from \"./utils/process-markdown\";\nimport {\n parseMarkdownSegments,\n mermaidBlockIsComplete,\n} from \"./utils/mermaid-parse\";\n// Define component Props type\nexport interface ContentRenderProps {\n content: string;\n /**\n+ * Callback invoked when the custom button after content is clicked.\n+ * This button is rendered via the `<custom-button-after-content>` tag in markdown content.\n+ * @example\n+ * ```tsx\n+ * <ContentRender\n+ * content=\"Hello <custom-button-after-content>Ask</custom-button-after-content>\"\n+ * onClickCustomButtonAfterContent={() => console.log('Button clicked')}\n+ * />\n+ * ```\n+ */\n customRenderBar?: CustomRenderBarProps;\n onClickCustomButtonAfterContent?: () => void;\n onSend?: (content: OnSendContentParams) => void;\n typingSpeed?: number;\n enableTypewriter?: boolean;\n defaultButtonText?: string;\n defaultInputText?: string; // Text input by user\n defaultSelectedValues?: string[]; // Default selected values for multi-select\n readonly?: boolean;\n onTypeFinished?: () => void;\n // Multi-select confirm button text (i18n support)\n confirmButtonText?: string;\n // Copy button text (i18n support)\n copyButtonText?: string;\n // Copied state text (i18n support)\n copiedButtonText?: string;\n // Dynamic interaction format for multi-select support\n dynamicInteractionFormat?: string;\n beforeSend?: (param: OnSendContentParams) => boolean;\n // tooltipMinLength?: number; // Control minimum character length for tooltip display, default 10\n}\n\n// Render svg string via Shadow DOM to avoid markdown wrapping\nconst SvgBlockInShadow: React.FC<{ svg: string }> = ({ svg }) => {\n const hostRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const host = hostRef.current;\n if (!host) return;\n const shadowRoot = host.shadowRoot ?? host.attachShadow({ mode: \"open\" });\n shadowRoot.innerHTML = svg;\n }, [svg]);\n\n return <div className=\"content-render-svg\" ref={hostRef} />;\n};\n\n// Extended component interface\ntype CustomComponents = ComponentsWithCustomVariable & {\n \"custom-button-after-content\"?: React.ComponentType<{\n children: React.ReactNode;\n }>;\n};\n\nconst ContentRender: React.FC<ContentRenderProps> = ({\n content,\n customRenderBar,\n onSend,\n typingSpeed = 30,\n enableTypewriter = false,\n defaultButtonText,\n defaultInputText,\n defaultSelectedValues,\n readonly = false,\n onTypeFinished,\n confirmButtonText,\n copyButtonText,\n copiedButtonText,\n onClickCustomButtonAfterContent,\n beforeSend,\n // tooltipMinLength,\n}) => {\n // Use custom Hook to handle typewriter effect\n const { displayContent, isComplete } = useTypewriterStateMachine({\n // processMarkdownText will let code block printf(\"You win!\\n\") become printf(\"You win!<br/>\");\n // content: processMarkdownText(content),\n content: content,\n typingSpeed,\n disabled: !enableTypewriter,\n });\n\n const components: CustomComponents = {\n \"custom-button-after-content\": ({\n children,\n }: {\n children: React.ReactNode;\n }) => {\n return (\n <button\n className=\"content-render-custom-button-after-content\"\n onClick={onClickCustomButtonAfterContent}\n >\n {children}\n </button>\n );\n },\n \"custom-variable\": (props) => (\n <CustomButtonInputVariable\n {...props}\n readonly={readonly}\n defaultButtonText={defaultButtonText}\n defaultInputText={defaultInputText}\n defaultSelectedValues={defaultSelectedValues}\n onSend={onSend}\n beforeSend={beforeSend}\n confirmButtonText={confirmButtonText}\n // tooltipMinLength={tooltipMinLength}\n />\n ),\n code: (props) => {\n const { className, children, ...rest } = props as {\n className?: string;\n children?: React.ReactNode;\n };\n const match = /language-(\\w+)/.exec(className || \"\");\n const language = match?.[1];\n if (language === \"mermaid\") {\n const chartContent = children?.toString().replace(/\\n$/, \"\") || \"\";\n const frozen = mermaidBlockIsComplete(content, chartContent);\n return <MermaidChart chart={chartContent} frozen={frozen} />;\n }\n\n return (\n <code className={className} {...rest}>\n {children}\n </code>\n );\n },\n table: ({ ...props }) => (\n <div className=\"content-render-table-container\">\n <table className=\"content-render-table\" {...props} />\n </div>\n ),\n th: ({ ...props }) => <th className=\"content-render-th\" {...props} />,\n td: ({ ...props }) => <td className=\"content-render-td\" {...props} />,\n tr: ({ ...props }) => <tr className=\"content-render-tr\" {...props} />,\n li: ({ node, ...props }) => {\n const className = node?.properties?.className;\n const hasTaskListItem =\n (typeof className === \"string\" &&\n className.includes(\"task-list-item\")) ||\n (Array.isArray(className) && className.includes(\"task-list-item\"));\n if (hasTaskListItem) {\n return <li className=\"content-render-task-list-item\" {...props} />;\n }\n return <li {...props} />;\n },\n ol: ({ ...props }) => <ol className=\"content-render-ol\" {...props} />,\n ul: ({ ...props }) => <ul className=\"content-render-ul\" {...props} />,\n input: ({ ...props }) => {\n if (props.type === \"checkbox\") {\n return (\n <input\n type=\"checkbox\"\n className=\"content-render-checkbox\"\n disabled\n {...props}\n />\n );\n }\n return <input {...props} />;\n },\n a: ({ children, ...props }) => (\n <a target=\"_blank\" rel=\"noopener noreferrer\" {...props}>\n {children}\n </a>\n ),\n pre: (props) => (\n <CodeBlock\n {...props}\n copyButtonText={copyButtonText}\n copiedButtonText={copiedButtonText}\n />\n ),\n };\n\n const hasCompleted = useRef(false);\n\n useEffect(() => {\n if (isComplete && !hasCompleted.current) {\n hasCompleted.current = true; // Mark as completed\n onTypeFinished?.(); // Call the passed callback\n }\n }, [isComplete, onTypeFinished]);\n useEffect(() => {\n hasCompleted.current = false; // Reset completion status when content changes\n }, [content]);\n\n const segments = parseMarkdownSegments(displayContent);\n\n return (\n <div className={`content-render markdown-body`}>\n {segments.map((seg, index) => {\n if (seg.type === \"text\") {\n return (\n <ReactMarkdown\n key={index}\n remarkPlugins={[remarkGfm, remarkMath, remarkFlow, remarkBreaks]}\n rehypePlugins={[\n preserveCustomVariableProperties,\n rehypeRaw,\n restoreCustomVariableProperties,\n [\n rehypeHighlight,\n { languages: highlightLanguages, subset: subsetLanguages },\n ],\n rehypeKatex,\n ]}\n components={components}\n >\n {seg.value}\n </ReactMarkdown>\n );\n }\n\n if (seg.type === \"mermaid\") {\n return (\n <MermaidChart\n key={index}\n chart={seg.value}\n frozen={!seg.complete}\n />\n );\n }\n\n if (seg.type === \"svg\") {\n return <SvgBlockInShadow key={index} svg={seg.value} />;\n }\n })}\n\n {customRenderBar &&\n React.createElement(customRenderBar, {\n content,\n displayContent,\n onSend,\n })}\n </div>\n );\n};\n\nexport default ContentRender;\n"],"names":["SvgBlockInShadow","svg","hostRef","useRef","useEffect","host","shadowRoot","jsx","ContentRender","content","customRenderBar","onSend","typingSpeed","enableTypewriter","defaultButtonText","defaultInputText","defaultSelectedValues","readonly","onTypeFinished","confirmButtonText","copyButtonText","copiedButtonText","onClickCustomButtonAfterContent","beforeSend","displayContent","isComplete","useTypewriterStateMachine","components","children","props","CustomButtonInputVariable","className","rest","chartContent","frozen","mermaidBlockIsComplete","MermaidChart","node","CodeBlock","hasCompleted","segments","parseMarkdownSegments","jsxs","seg","index","ReactMarkdown","remarkGfm","remarkMath","remarkFlow","remarkBreaks","preserveCustomVariableProperties","rehypeRaw","restoreCustomVariableProperties","rehypeHighlight","highlightLanguages","subsetLanguages","rehypeKatex","React"],"mappings":"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"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { StoryObj } from '@storybook/nextjs-vite';
|
|
2
|
-
import { default as React } from 'react';
|
|
3
2
|
declare const meta: {
|
|
4
3
|
title: string;
|
|
5
|
-
component:
|
|
4
|
+
component: import('react').FC<import('./ContentRender').ContentRenderProps>;
|
|
6
5
|
parameters: {
|
|
7
6
|
layout: string;
|
|
8
7
|
};
|
|
@@ -12,10 +11,6 @@ declare const meta: {
|
|
|
12
11
|
control: "text";
|
|
13
12
|
description: string;
|
|
14
13
|
};
|
|
15
|
-
fullscreenButtonText: {
|
|
16
|
-
control: "text";
|
|
17
|
-
description: string;
|
|
18
|
-
};
|
|
19
14
|
};
|
|
20
15
|
args: {
|
|
21
16
|
content: string;
|
|
@@ -36,11 +31,5 @@ export declare const InteractiveMultiSelectDemo: Story;
|
|
|
36
31
|
export declare const ChineseMultiSelectDemo: Story;
|
|
37
32
|
export declare const NativeHtmlElements: Story;
|
|
38
33
|
export declare const CodeBlockShowcase: Story;
|
|
39
|
-
export declare const HtmlCodeBlockAsCode: Story;
|
|
40
34
|
export declare const EnglishChineseTypographyPreview: Story;
|
|
41
35
|
export declare const SVGDemo: Story;
|
|
42
|
-
export declare const HtmlIframeDemo: Story;
|
|
43
|
-
export declare const HtmlIframeWithLoading: Story;
|
|
44
|
-
export declare const HtmlChunkStreaming: Story;
|
|
45
|
-
export declare const HtmlChunkStreamingWithCaption: Story;
|
|
46
|
-
export declare const HtmlChunkStreamingManual: Story;
|
|
@@ -4,5 +4,4 @@ export { default as ContentRender } from './ContentRender';
|
|
|
4
4
|
export { default as MarkdownFlowInput } from './MarkdownFlowInput';
|
|
5
5
|
export { default as useTypewriter } from './useTypewriter';
|
|
6
6
|
export { default as useTypewriterStateMachine } from './useTypewriterStateMachine';
|
|
7
|
-
export { default as ContentBlackboard } from './ContentBlackboard';
|
|
8
7
|
export type { MarkdownFlowInputProps } from './MarkdownFlowInput';
|
|
@@ -55,7 +55,13 @@ const l = {
|
|
|
55
55
|
] })
|
|
56
56
|
] });
|
|
57
57
|
}
|
|
58
|
-
return /* @__PURE__ */ e.jsx("div", { className: "my-4 text-center overflow-auto", children: m ? /* @__PURE__ */ e.jsx(
|
|
58
|
+
return /* @__PURE__ */ e.jsx("div", { className: "my-4 text-center overflow-auto content-render-mermaid", children: m ? /* @__PURE__ */ e.jsx(
|
|
59
|
+
"div",
|
|
60
|
+
{
|
|
61
|
+
className: "content-render-mermaid-inner",
|
|
62
|
+
dangerouslySetInnerHTML: { __html: m }
|
|
63
|
+
}
|
|
64
|
+
) : /* @__PURE__ */ e.jsx("div", { className: "py-8 text-gray-500 italic", children: a?.loading ?? l.loading }) });
|
|
59
65
|
}, M = j.memo(S, (r, a) => r.chart === a.chart && r.frozen === a.frozen);
|
|
60
66
|
export {
|
|
61
67
|
M as default
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MermaidChart.js","sources":["../../../../src/components/ContentRender/plugins/MermaidChart.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport mermaid from \"mermaid\";\n\nexport interface MermaidChartProps {\n chart: string;\n messages?: {\n emptyChart?: string;\n loading?: string;\n badge?: string;\n };\n frozen?: boolean;\n}\n\nconst DEFAULT_MESSAGES = {\n emptyChart: \"Empty chart content\",\n loading: \"Loading Mermaid chart...\",\n badge: \"mermaid\",\n} as const;\n\nconst MERMAID_FONT_STACK =\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, \"Open Sans\", \"Helvetica Neue\", sans-serif';\n\nconst preprocessChart = (raw: string) =>\n raw.trim().replace(/^_streaming\\s*/i, \"\");\n\nconst MermaidChart: React.FC<MermaidChartProps> = ({\n chart,\n messages,\n frozen,\n}) => {\n const [svg, setSvg] = useState(\"\");\n const [error, setError] = useState(\"\");\n const [hasRendered, setHasRendered] = useState(false);\n\n const renderChart = async () => {\n try {\n const cleaned = preprocessChart(chart);\n\n if (!cleaned) {\n setError(messages?.emptyChart ?? DEFAULT_MESSAGES.emptyChart);\n setSvg(\"\");\n return;\n }\n\n // Initialize mermaid with the same font stack used in markdown content.\n // Using a concrete stack avoids clipping caused by `inherit` resolving to\n // Storybook's default font during off-screen rendering.\n mermaid.initialize({\n startOnLoad: false,\n theme: \"default\",\n securityLevel: \"loose\",\n fontFamily: MERMAID_FONT_STACK,\n themeVariables: {\n fontFamily: MERMAID_FONT_STACK,\n },\n });\n\n // use mermaid.parse to check for errors\n try {\n await mermaid.parse(cleaned);\n } catch (parseErr) {\n const parseErrorMsg = String(parseErr).toLowerCase();\n setError(parseErrorMsg);\n setSvg(\"\");\n // once render success, setHasRendered flag\n setHasRendered(true);\n return;\n }\n\n const id = `mermaid-${Date.now()}`;\n\n // Render the chart\n const { svg: renderedSvg } = await mermaid.render(id, cleaned);\n setSvg(renderedSvg);\n setError(\"\");\n } catch (err) {\n const errorMsg = String(err).toLowerCase();\n setError(errorMsg);\n setSvg(\"\");\n }\n };\n\n useEffect(() => {\n if (frozen && hasRendered) return; // 核心:被冻结就不渲染\n renderChart();\n }, [chart, frozen]);\n\n if (error) {\n const displayChart = preprocessChart(chart) || chart.trim();\n return (\n <div className=\"my-4 border border-gray-200 rounded-lg bg-gray-50\">\n <div className=\"px-4 py-3 bg-gray-100 border-b border-gray-200 flex items-center gap-2\">\n <span className=\"text-yellow-600\">⚠️</span>\n <span className=\"text-sm text-yellow-700 font-medium whitespace-pre-wrap\">\n {error}\n </span>\n </div>\n <div className=\"relative\">\n <pre className=\"p-4 text-sm font-mono text-yellow-800\">\n <code>{displayChart}</code>\n </pre>\n <div className=\"absolute top-2 right-2 px-2 py-1 text-xs text-yellow-700 bg-white/90 rounded border border-gray-200\">\n {messages?.badge ?? DEFAULT_MESSAGES.badge}\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"my-4 text-center overflow-auto\">\n {svg ? (\n <div
|
|
1
|
+
{"version":3,"file":"MermaidChart.js","sources":["../../../../src/components/ContentRender/plugins/MermaidChart.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport mermaid from \"mermaid\";\n\nexport interface MermaidChartProps {\n chart: string;\n messages?: {\n emptyChart?: string;\n loading?: string;\n badge?: string;\n };\n frozen?: boolean;\n}\n\nconst DEFAULT_MESSAGES = {\n emptyChart: \"Empty chart content\",\n loading: \"Loading Mermaid chart...\",\n badge: \"mermaid\",\n} as const;\n\nconst MERMAID_FONT_STACK =\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Oxygen, Ubuntu, Cantarell, \"Open Sans\", \"Helvetica Neue\", sans-serif';\n\nconst preprocessChart = (raw: string) =>\n raw.trim().replace(/^_streaming\\s*/i, \"\");\n\nconst MermaidChart: React.FC<MermaidChartProps> = ({\n chart,\n messages,\n frozen,\n}) => {\n const [svg, setSvg] = useState(\"\");\n const [error, setError] = useState(\"\");\n const [hasRendered, setHasRendered] = useState(false);\n\n const renderChart = async () => {\n try {\n const cleaned = preprocessChart(chart);\n\n if (!cleaned) {\n setError(messages?.emptyChart ?? DEFAULT_MESSAGES.emptyChart);\n setSvg(\"\");\n return;\n }\n\n // Initialize mermaid with the same font stack used in markdown content.\n // Using a concrete stack avoids clipping caused by `inherit` resolving to\n // Storybook's default font during off-screen rendering.\n mermaid.initialize({\n startOnLoad: false,\n theme: \"default\",\n securityLevel: \"loose\",\n fontFamily: MERMAID_FONT_STACK,\n themeVariables: {\n fontFamily: MERMAID_FONT_STACK,\n },\n });\n\n // use mermaid.parse to check for errors\n try {\n await mermaid.parse(cleaned);\n } catch (parseErr) {\n const parseErrorMsg = String(parseErr).toLowerCase();\n setError(parseErrorMsg);\n setSvg(\"\");\n // once render success, setHasRendered flag\n setHasRendered(true);\n return;\n }\n\n const id = `mermaid-${Date.now()}`;\n\n // Render the chart\n const { svg: renderedSvg } = await mermaid.render(id, cleaned);\n setSvg(renderedSvg);\n setError(\"\");\n } catch (err) {\n const errorMsg = String(err).toLowerCase();\n setError(errorMsg);\n setSvg(\"\");\n }\n };\n\n useEffect(() => {\n if (frozen && hasRendered) return; // 核心:被冻结就不渲染\n renderChart();\n }, [chart, frozen]);\n\n if (error) {\n const displayChart = preprocessChart(chart) || chart.trim();\n return (\n <div className=\"my-4 border border-gray-200 rounded-lg bg-gray-50\">\n <div className=\"px-4 py-3 bg-gray-100 border-b border-gray-200 flex items-center gap-2\">\n <span className=\"text-yellow-600\">⚠️</span>\n <span className=\"text-sm text-yellow-700 font-medium whitespace-pre-wrap\">\n {error}\n </span>\n </div>\n <div className=\"relative\">\n <pre className=\"p-4 text-sm font-mono text-yellow-800\">\n <code>{displayChart}</code>\n </pre>\n <div className=\"absolute top-2 right-2 px-2 py-1 text-xs text-yellow-700 bg-white/90 rounded border border-gray-200\">\n {messages?.badge ?? DEFAULT_MESSAGES.badge}\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div className=\"my-4 text-center overflow-auto content-render-mermaid\">\n {svg ? (\n <div\n className=\"content-render-mermaid-inner\"\n dangerouslySetInnerHTML={{ __html: svg }}\n />\n ) : (\n <div className=\"py-8 text-gray-500 italic\">\n {messages?.loading ?? DEFAULT_MESSAGES.loading}\n </div>\n )}\n </div>\n );\n};\n\nexport default React.memo(MermaidChart, (prev, next) => {\n return prev.chart === next.chart && prev.frozen === next.frozen;\n});\n"],"names":["DEFAULT_MESSAGES","MERMAID_FONT_STACK","preprocessChart","raw","MermaidChart","chart","messages","frozen","svg","setSvg","useState","error","setError","hasRendered","setHasRendered","renderChart","cleaned","mermaid","parseErr","parseErrorMsg","id","renderedSvg","err","errorMsg","useEffect","displayChart","jsxs","jsx","MermaidChart$1","React","prev","next"],"mappings":"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"}
|
|
@@ -9,10 +9,6 @@ export declare function parseMarkdownSegments(markdown: string): ({
|
|
|
9
9
|
type: "svg";
|
|
10
10
|
value: string;
|
|
11
11
|
complete: boolean;
|
|
12
|
-
} | {
|
|
13
|
-
type: "html";
|
|
14
|
-
value: string;
|
|
15
|
-
complete: boolean;
|
|
16
12
|
})[];
|
|
17
13
|
export declare function parseMermaidBlocks(fullMarkdown: string): {
|
|
18
14
|
code: string;
|