markdown-flow-ui 0.1.120 → 0.1.121
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/_virtual/index.cjs11.js +1 -1
- package/dist/_virtual/index.cjs12.js +1 -1
- package/dist/_virtual/index.cjs4.js +1 -1
- package/dist/_virtual/index.cjs5.js +1 -1
- package/dist/_virtual/index.cjs6.js +1 -1
- package/dist/_virtual/index.cjs8.js +1 -1
- package/dist/_virtual/index.cjs9.js +1 -1
- package/dist/_virtual/index.es10.js +2 -2
- package/dist/_virtual/index.es11.js +3 -3
- package/dist/_virtual/index.es12.js +2 -2
- package/dist/_virtual/index.es4.js +4 -4
- package/dist/_virtual/index.es5.js +4 -4
- package/dist/_virtual/index.es6.js +5 -5
- package/dist/_virtual/index.es8.js +3 -2
- package/dist/_virtual/index.es8.js.map +1 -1
- package/dist/_virtual/index.es9.js +2 -3
- package/dist/_virtual/index.es9.js.map +1 -1
- package/dist/assets/markdown-flow-ui.css +1 -1
- package/dist/components/ContentRender/ContentRender.cjs.js +2 -2
- package/dist/components/ContentRender/ContentRender.cjs.js.map +1 -1
- package/dist/components/ContentRender/ContentRender.d.ts +10 -1
- package/dist/components/ContentRender/ContentRender.es.js +221 -175
- package/dist/components/ContentRender/ContentRender.es.js.map +1 -1
- package/dist/components/ContentRender/ContentRender.stories.d.ts +1 -3
- package/dist/components/ContentRender/index.d.ts +1 -2
- package/dist/components/MarkdownFlow/MarkdownFlow.cjs.js +1 -1
- package/dist/components/MarkdownFlow/MarkdownFlow.cjs.js.map +1 -1
- package/dist/components/MarkdownFlow/MarkdownFlow.d.ts +0 -3
- package/dist/components/MarkdownFlow/MarkdownFlow.es.js +21 -29
- package/dist/components/MarkdownFlow/MarkdownFlow.es.js.map +1 -1
- package/dist/components/Slide/Slide.cjs.js +1 -1
- package/dist/components/Slide/Slide.cjs.js.map +1 -1
- package/dist/components/Slide/Slide.es.js +50 -51
- package/dist/components/Slide/Slide.es.js.map +1 -1
- package/dist/components/Slide/utils/runStreamFixture.d.ts +2 -0
- package/dist/components/ui/inputGroup/textarea.cjs.js +1 -1
- package/dist/components/ui/inputGroup/textarea.es.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.cjs.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.cjs.js.map +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.es.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/index.cjs.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/index.es.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/hast-util-to-jsx-runtime@2.3.6/node_modules/hast-util-to-jsx-runtime/lib/index.cjs.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/hast-util-to-jsx-runtime@2.3.6/node_modules/hast-util-to-jsx-runtime/lib/index.es.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/c4Diagram-YG6GDRKO.cjs.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/c4Diagram-YG6GDRKO.cjs.js.map +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/c4Diagram-YG6GDRKO.es.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-S3R3BYOJ.cjs.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-S3R3BYOJ.cjs.js.map +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-S3R3BYOJ.es.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-TZMSLE5B.cjs.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-TZMSLE5B.cjs.js.map +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-TZMSLE5B.es.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/ganttDiagram-LVOFAZNH.cjs.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/ganttDiagram-LVOFAZNH.cjs.js.map +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/ganttDiagram-LVOFAZNH.es.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/sequenceDiagram-WL72ISMW.cjs.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/sequenceDiagram-WL72ISMW.cjs.js.map +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/sequenceDiagram-WL72ISMW.es.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/rc-input@1.8.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-input/es/BaseInput.cjs.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/rc-input@1.8.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-input/es/BaseInput.es.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/ResizableTextArea.cjs.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/ResizableTextArea.es.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/TextArea.cjs.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/TextArea.es.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/index.cjs.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/index.es.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/rc-util@5.44.4_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-util/es/ref.cjs.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/rc-util@5.44.4_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-util/es/ref.cjs.js.map +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/rc-util@5.44.4_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-util/es/ref.es.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/react-is@18.3.1/node_modules/react-is/index.cjs.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/react-is@18.3.1/node_modules/react-is/index.es.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/unified@11.0.5/node_modules/unified/lib/index.cjs.js +1 -1
- package/dist/markdown-flow-ui/node_modules/.pnpm/unified@11.0.5/node_modules/unified/lib/index.es.js +1 -1
- package/dist/markdown-flow-ui-lib.css +1 -1
- package/package.json +2 -3
- package/dist/components/ContentRender/useTypewriter.d.ts +0 -19
- package/dist/components/ContentRender/useTypewriterStateMachine.cjs.js +0 -2
- package/dist/components/ContentRender/useTypewriterStateMachine.cjs.js.map +0 -1
- package/dist/components/ContentRender/useTypewriterStateMachine.d.ts +0 -19
- package/dist/components/ContentRender/useTypewriterStateMachine.es.js +0 -180
- package/dist/components/ContentRender/useTypewriterStateMachine.es.js.map +0 -1
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
interface UseTypewriterProps {
|
|
2
|
-
content?: string;
|
|
3
|
-
typingSpeed?: number;
|
|
4
|
-
disabled?: boolean;
|
|
5
|
-
}
|
|
6
|
-
interface Segment {
|
|
7
|
-
content: string;
|
|
8
|
-
isMarkdown: boolean;
|
|
9
|
-
type?: string;
|
|
10
|
-
}
|
|
11
|
-
declare const useTypewriterStateMachine: ({ content, typingSpeed, disabled, }?: UseTypewriterProps) => {
|
|
12
|
-
displayContent: string;
|
|
13
|
-
isTyping: boolean;
|
|
14
|
-
isComplete: boolean;
|
|
15
|
-
reset: () => void;
|
|
16
|
-
start: () => void;
|
|
17
|
-
getSegments: () => Segment[];
|
|
18
|
-
};
|
|
19
|
-
export default useTypewriterStateMachine;
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
import { useState as y, useRef as m, useCallback as B, useEffect as S } from "react";
|
|
2
|
-
const D = ({
|
|
3
|
-
content: C = "",
|
|
4
|
-
typingSpeed: _ = 80,
|
|
5
|
-
disabled: x = !1
|
|
6
|
-
} = {}) => {
|
|
7
|
-
const [T, b] = y(""), [g, i] = y(!1), [I, l] = y(!1), c = m([]), a = m(0), k = m(null), h = m(!0), d = m(""), w = m({
|
|
8
|
-
state: "normal",
|
|
9
|
-
buffer: "",
|
|
10
|
-
depth: 0,
|
|
11
|
-
tempBuffer: ""
|
|
12
|
-
}), o = B(() => {
|
|
13
|
-
k.current && (clearTimeout(k.current), k.current = null);
|
|
14
|
-
}, []), M = B((n) => {
|
|
15
|
-
const r = [], e = w.current;
|
|
16
|
-
for (let f = 0; f < n.length; f++) {
|
|
17
|
-
const t = n[f], u = n[f + 1], R = n[f + 2];
|
|
18
|
-
switch (e.state) {
|
|
19
|
-
case "normal":
|
|
20
|
-
if (t === "?" && u === "[") {
|
|
21
|
-
if (e.buffer) {
|
|
22
|
-
for (const s of e.buffer)
|
|
23
|
-
r.push({ content: s, isMarkdown: !1 });
|
|
24
|
-
e.buffer = "";
|
|
25
|
-
}
|
|
26
|
-
e.state = "custom_tag", e.tempBuffer = "?[", f++;
|
|
27
|
-
} else if (t === "`" && u === "`" && R === "`") {
|
|
28
|
-
if (e.buffer) {
|
|
29
|
-
for (const s of e.buffer)
|
|
30
|
-
r.push({ content: s, isMarkdown: !1 });
|
|
31
|
-
e.buffer = "";
|
|
32
|
-
}
|
|
33
|
-
e.state = "code_block", e.tempBuffer = "```", f += 2;
|
|
34
|
-
} else if (t === "`") {
|
|
35
|
-
if (e.buffer) {
|
|
36
|
-
for (const s of e.buffer)
|
|
37
|
-
r.push({ content: s, isMarkdown: !1 });
|
|
38
|
-
e.buffer = "";
|
|
39
|
-
}
|
|
40
|
-
e.state = "inline_code", e.tempBuffer = "`";
|
|
41
|
-
} else if (t === "*" && u === "*") {
|
|
42
|
-
if (e.buffer) {
|
|
43
|
-
for (const s of e.buffer)
|
|
44
|
-
r.push({ content: s, isMarkdown: !1 });
|
|
45
|
-
e.buffer = "";
|
|
46
|
-
}
|
|
47
|
-
e.state = "bold", e.tempBuffer = "**", f++;
|
|
48
|
-
} else if (t === "*") {
|
|
49
|
-
if (e.buffer) {
|
|
50
|
-
for (const s of e.buffer)
|
|
51
|
-
r.push({ content: s, isMarkdown: !1 });
|
|
52
|
-
e.buffer = "";
|
|
53
|
-
}
|
|
54
|
-
e.state = "italic", e.tempBuffer = "*";
|
|
55
|
-
} else if (t === "[") {
|
|
56
|
-
if (e.buffer) {
|
|
57
|
-
for (const s of e.buffer)
|
|
58
|
-
r.push({ content: s, isMarkdown: !1 });
|
|
59
|
-
e.buffer = "";
|
|
60
|
-
}
|
|
61
|
-
e.state = "link_text", e.tempBuffer = "[";
|
|
62
|
-
} else
|
|
63
|
-
e.buffer += t;
|
|
64
|
-
break;
|
|
65
|
-
case "code_block":
|
|
66
|
-
e.tempBuffer += t, t === "`" && u === "`" && R === "`" && (e.tempBuffer += "``", r.push({
|
|
67
|
-
content: e.tempBuffer,
|
|
68
|
-
isMarkdown: !0,
|
|
69
|
-
type: "code-block"
|
|
70
|
-
}), e.tempBuffer = "", e.state = "normal", f += 2);
|
|
71
|
-
break;
|
|
72
|
-
case "inline_code":
|
|
73
|
-
e.tempBuffer += t, t === "`" && (r.push({
|
|
74
|
-
content: e.tempBuffer,
|
|
75
|
-
isMarkdown: !0,
|
|
76
|
-
type: "inline-code"
|
|
77
|
-
}), e.tempBuffer = "", e.state = "normal");
|
|
78
|
-
break;
|
|
79
|
-
case "bold":
|
|
80
|
-
e.tempBuffer += t, t === "*" && u === "*" && (e.tempBuffer += "*", r.push({
|
|
81
|
-
content: e.tempBuffer,
|
|
82
|
-
isMarkdown: !0,
|
|
83
|
-
type: "bold"
|
|
84
|
-
}), e.tempBuffer = "", e.state = "normal", f++);
|
|
85
|
-
break;
|
|
86
|
-
case "italic":
|
|
87
|
-
e.tempBuffer += t, t === "*" && u !== "*" && (r.push({
|
|
88
|
-
content: e.tempBuffer,
|
|
89
|
-
isMarkdown: !0,
|
|
90
|
-
type: "italic"
|
|
91
|
-
}), e.tempBuffer = "", e.state = "normal");
|
|
92
|
-
break;
|
|
93
|
-
case "link_text":
|
|
94
|
-
e.tempBuffer += t, t === "]" && u === "(" && (e.tempBuffer += "(", e.state = "link_url", f++);
|
|
95
|
-
break;
|
|
96
|
-
case "link_url":
|
|
97
|
-
e.tempBuffer += t, t === ")" && (r.push({
|
|
98
|
-
content: e.tempBuffer,
|
|
99
|
-
isMarkdown: !0,
|
|
100
|
-
type: "link"
|
|
101
|
-
}), e.tempBuffer = "", e.state = "normal");
|
|
102
|
-
break;
|
|
103
|
-
case "custom_tag":
|
|
104
|
-
e.tempBuffer += t, t === "]" && (r.push({
|
|
105
|
-
content: e.tempBuffer,
|
|
106
|
-
isMarkdown: !0,
|
|
107
|
-
type: "custom-tag"
|
|
108
|
-
}), e.tempBuffer = "", e.state = "normal");
|
|
109
|
-
break;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
if (e.state === "normal" && e.buffer) {
|
|
113
|
-
for (const f of e.buffer)
|
|
114
|
-
r.push({ content: f, isMarkdown: !1 });
|
|
115
|
-
e.buffer = "";
|
|
116
|
-
}
|
|
117
|
-
return r;
|
|
118
|
-
}, []), p = B(() => {
|
|
119
|
-
if (h.current)
|
|
120
|
-
if (a.current < c.current.length) {
|
|
121
|
-
const n = c.current[a.current];
|
|
122
|
-
b((r) => r + (n?.content || "")), a.current++, h.current && (k.current = setTimeout(p, _));
|
|
123
|
-
} else
|
|
124
|
-
i(!1), l(!0);
|
|
125
|
-
}, [_]);
|
|
126
|
-
S(() => {
|
|
127
|
-
const n = C || "", r = d.current;
|
|
128
|
-
if (n === r)
|
|
129
|
-
return;
|
|
130
|
-
if (x) {
|
|
131
|
-
o(), b(n), i(!1), l(!0), d.current = n;
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
if (n.length >= r.length && n.startsWith(r) && r) {
|
|
135
|
-
const f = n.substring(r.length), t = M(f);
|
|
136
|
-
c.current = [
|
|
137
|
-
...c.current,
|
|
138
|
-
...t
|
|
139
|
-
];
|
|
140
|
-
const u = a.current >= c.current.length;
|
|
141
|
-
l(u), !u && !g && (i(!0), p());
|
|
142
|
-
} else {
|
|
143
|
-
o(), b(""), w.current = {
|
|
144
|
-
state: "normal",
|
|
145
|
-
buffer: "",
|
|
146
|
-
depth: 0,
|
|
147
|
-
tempBuffer: ""
|
|
148
|
-
};
|
|
149
|
-
const f = M(n);
|
|
150
|
-
c.current = f, a.current = 0;
|
|
151
|
-
const t = f.length === 0;
|
|
152
|
-
l(t), !t && n && h.current && (i(!0), p());
|
|
153
|
-
}
|
|
154
|
-
d.current = n;
|
|
155
|
-
}, [C, x, o, M, p, g]), S(() => (h.current = !0, () => {
|
|
156
|
-
h.current = !1, o();
|
|
157
|
-
}), [o]);
|
|
158
|
-
const N = B(() => {
|
|
159
|
-
o(), b(""), c.current = [], a.current = 0, i(!1), l(!1), d.current = "", w.current = {
|
|
160
|
-
state: "normal",
|
|
161
|
-
buffer: "",
|
|
162
|
-
depth: 0,
|
|
163
|
-
tempBuffer: ""
|
|
164
|
-
};
|
|
165
|
-
}, [o]), G = B(() => {
|
|
166
|
-
o(), a.current = 0, b(""), i(!0), l(!1), p();
|
|
167
|
-
}, [o, p]);
|
|
168
|
-
return {
|
|
169
|
-
displayContent: T,
|
|
170
|
-
isTyping: g,
|
|
171
|
-
isComplete: I,
|
|
172
|
-
reset: N,
|
|
173
|
-
start: G,
|
|
174
|
-
getSegments: () => c.current
|
|
175
|
-
};
|
|
176
|
-
};
|
|
177
|
-
export {
|
|
178
|
-
D as default
|
|
179
|
-
};
|
|
180
|
-
//# sourceMappingURL=useTypewriterStateMachine.es.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useTypewriterStateMachine.es.js","sources":["../../../src/components/ContentRender/useTypewriterStateMachine.ts"],"sourcesContent":["import { useState, useEffect, useRef, useCallback } from \"react\";\n\ninterface UseTypewriterProps {\n content?: string;\n typingSpeed?: number;\n disabled?: boolean;\n}\n\ninterface Segment {\n content: string;\n isMarkdown: boolean;\n type?: string;\n}\n\n// State machine states\ntype ParseState =\n | \"normal\"\n | \"code_block\"\n | \"inline_code\"\n | \"bold\"\n | \"italic\"\n | \"link_text\"\n | \"link_url\"\n | \"custom_tag\";\n\ninterface ParserState {\n state: ParseState;\n buffer: string;\n depth: number;\n tempBuffer: string;\n}\n\nconst useTypewriterStateMachine = ({\n content = \"\",\n typingSpeed = 80,\n disabled = false,\n}: UseTypewriterProps = {}) => {\n const [displayContent, setDisplayContent] = useState(\"\");\n const [isTyping, setIsTyping] = useState(false);\n const [isComplete, setIsComplete] = useState(false);\n\n const parsedSegmentsRef = useRef<Segment[]>([]);\n const displayIndexRef = useRef(0);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const isMountedRef = useRef(true);\n const lastContentRef = useRef(\"\");\n const parserStateRef = useRef<ParserState>({\n state: \"normal\",\n buffer: \"\",\n depth: 0,\n tempBuffer: \"\",\n });\n\n // Cleanup function\n const clearTimer = useCallback(() => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n }, []);\n\n // State machine parser - incremental parsing\n const parseWithStateMachine = useCallback((newChars: string): Segment[] => {\n const segments: Segment[] = [];\n const state = parserStateRef.current;\n\n for (let i = 0; i < newChars.length; i++) {\n const char = newChars[i];\n const nextChar = newChars[i + 1];\n const nextNextChar = newChars[i + 2];\n\n switch (state.state) {\n case \"normal\":\n // Check custom tag ?[\n if (char === \"?\" && nextChar === \"[\") {\n if (state.buffer) {\n // Output previous plain text\n for (const c of state.buffer) {\n segments.push({ content: c, isMarkdown: false });\n }\n state.buffer = \"\";\n }\n state.state = \"custom_tag\";\n state.tempBuffer = \"?[\";\n i++;\n }\n // Check code block start\n else if (char === \"`\" && nextChar === \"`\" && nextNextChar === \"`\") {\n if (state.buffer) {\n // Output previous plain text\n for (const c of state.buffer) {\n segments.push({ content: c, isMarkdown: false });\n }\n state.buffer = \"\";\n }\n state.state = \"code_block\";\n state.tempBuffer = \"```\";\n i += 2;\n }\n // Check inline code\n else if (char === \"`\") {\n if (state.buffer) {\n for (const c of state.buffer) {\n segments.push({ content: c, isMarkdown: false });\n }\n state.buffer = \"\";\n }\n state.state = \"inline_code\";\n state.tempBuffer = \"`\";\n }\n // Check bold\n else if (char === \"*\" && nextChar === \"*\") {\n if (state.buffer) {\n for (const c of state.buffer) {\n segments.push({ content: c, isMarkdown: false });\n }\n state.buffer = \"\";\n }\n state.state = \"bold\";\n state.tempBuffer = \"**\";\n i++;\n }\n // Check italic\n else if (char === \"*\") {\n if (state.buffer) {\n for (const c of state.buffer) {\n segments.push({ content: c, isMarkdown: false });\n }\n state.buffer = \"\";\n }\n state.state = \"italic\";\n state.tempBuffer = \"*\";\n }\n // Check link\n else if (char === \"[\") {\n if (state.buffer) {\n for (const c of state.buffer) {\n segments.push({ content: c, isMarkdown: false });\n }\n state.buffer = \"\";\n }\n state.state = \"link_text\";\n state.tempBuffer = \"[\";\n } else {\n state.buffer += char;\n }\n break;\n\n case \"code_block\":\n state.tempBuffer += char;\n // Check code block end\n if (char === \"`\" && nextChar === \"`\" && nextNextChar === \"`\") {\n state.tempBuffer += \"``\";\n segments.push({\n content: state.tempBuffer,\n isMarkdown: true,\n type: \"code-block\",\n });\n state.tempBuffer = \"\";\n state.state = \"normal\";\n i += 2;\n }\n break;\n\n case \"inline_code\":\n state.tempBuffer += char;\n if (char === \"`\") {\n segments.push({\n content: state.tempBuffer,\n isMarkdown: true,\n type: \"inline-code\",\n });\n state.tempBuffer = \"\";\n state.state = \"normal\";\n }\n break;\n\n case \"bold\":\n state.tempBuffer += char;\n if (char === \"*\" && nextChar === \"*\") {\n state.tempBuffer += \"*\";\n segments.push({\n content: state.tempBuffer,\n isMarkdown: true,\n type: \"bold\",\n });\n state.tempBuffer = \"\";\n state.state = \"normal\";\n i++;\n }\n break;\n\n case \"italic\":\n state.tempBuffer += char;\n if (char === \"*\" && nextChar !== \"*\") {\n segments.push({\n content: state.tempBuffer,\n isMarkdown: true,\n type: \"italic\",\n });\n state.tempBuffer = \"\";\n state.state = \"normal\";\n }\n break;\n\n case \"link_text\":\n state.tempBuffer += char;\n if (char === \"]\" && nextChar === \"(\") {\n state.tempBuffer += \"(\";\n state.state = \"link_url\";\n i++;\n }\n break;\n\n case \"link_url\":\n state.tempBuffer += char;\n if (char === \")\") {\n segments.push({\n content: state.tempBuffer,\n isMarkdown: true,\n type: \"link\",\n });\n state.tempBuffer = \"\";\n state.state = \"normal\";\n }\n break;\n\n case \"custom_tag\":\n state.tempBuffer += char;\n if (char === \"]\") {\n segments.push({\n content: state.tempBuffer,\n isMarkdown: true,\n type: \"custom-tag\",\n });\n state.tempBuffer = \"\";\n state.state = \"normal\";\n }\n break;\n }\n }\n\n // Process remaining plain text\n if (state.state === \"normal\" && state.buffer) {\n for (const c of state.buffer) {\n segments.push({ content: c, isMarkdown: false });\n }\n state.buffer = \"\";\n }\n\n return segments;\n }, []);\n\n // Typing function\n const type = useCallback(() => {\n if (!isMountedRef.current) return;\n\n if (displayIndexRef.current < parsedSegmentsRef.current.length) {\n const segment = parsedSegmentsRef.current[displayIndexRef.current];\n setDisplayContent((prev) => prev + (segment?.content || \"\"));\n displayIndexRef.current++;\n\n if (isMountedRef.current) {\n timerRef.current = setTimeout(type, typingSpeed);\n }\n } else {\n setIsTyping(false);\n setIsComplete(true);\n }\n }, [typingSpeed]);\n\n // Main effect\n useEffect(() => {\n const newContent = content || \"\";\n const oldContent = lastContentRef.current;\n\n // If content is the same, don't process\n if (newContent === oldContent) {\n return;\n }\n\n // Disabled mode: show all content immediately\n if (disabled) {\n clearTimer();\n setDisplayContent(newContent);\n setIsTyping(false);\n setIsComplete(true);\n lastContentRef.current = newContent;\n return;\n }\n\n // Check if content is growing\n const isContentGrowth =\n newContent.length >= oldContent.length &&\n newContent.startsWith(oldContent);\n\n if (isContentGrowth && oldContent) {\n // Content growth: parse only new parts\n const newChars = newContent.substring(oldContent.length);\n const newSegments = parseWithStateMachine(newChars);\n parsedSegmentsRef.current = [\n ...parsedSegmentsRef.current,\n ...newSegments,\n ];\n\n // Update completion status\n const isNowComplete =\n displayIndexRef.current >= parsedSegmentsRef.current.length;\n setIsComplete(isNowComplete);\n\n // If there's more content to type, ensure typewriter continues working\n if (!isNowComplete && !isTyping) {\n setIsTyping(true);\n type();\n }\n } else {\n // New content: start over\n clearTimer();\n setDisplayContent(\"\");\n\n // Reset parser state\n parserStateRef.current = {\n state: \"normal\",\n buffer: \"\",\n depth: 0,\n tempBuffer: \"\",\n };\n\n const segments = parseWithStateMachine(newContent);\n parsedSegmentsRef.current = segments;\n displayIndexRef.current = 0;\n\n const isNowComplete = segments.length === 0;\n setIsComplete(isNowComplete);\n\n if (!isNowComplete && newContent && isMountedRef.current) {\n setIsTyping(true);\n type();\n }\n }\n\n lastContentRef.current = newContent;\n }, [content, disabled, clearTimer, parseWithStateMachine, type, isTyping]);\n\n // Cleanup\n useEffect(() => {\n isMountedRef.current = true;\n return () => {\n isMountedRef.current = false;\n clearTimer();\n };\n }, [clearTimer]);\n\n const reset = useCallback(() => {\n clearTimer();\n setDisplayContent(\"\");\n parsedSegmentsRef.current = [];\n displayIndexRef.current = 0;\n setIsTyping(false);\n setIsComplete(false);\n lastContentRef.current = \"\";\n parserStateRef.current = {\n state: \"normal\",\n buffer: \"\",\n depth: 0,\n tempBuffer: \"\",\n };\n }, [clearTimer]);\n\n const start = useCallback(() => {\n clearTimer();\n displayIndexRef.current = 0;\n setDisplayContent(\"\");\n setIsTyping(true);\n setIsComplete(false);\n type();\n }, [clearTimer, type]);\n\n return {\n displayContent,\n isTyping,\n isComplete,\n reset,\n start,\n getSegments: () => parsedSegmentsRef.current,\n };\n};\n\nexport default useTypewriterStateMachine;\n"],"names":["useTypewriterStateMachine","content","typingSpeed","disabled","displayContent","setDisplayContent","useState","isTyping","setIsTyping","isComplete","setIsComplete","parsedSegmentsRef","useRef","displayIndexRef","timerRef","isMountedRef","lastContentRef","parserStateRef","clearTimer","useCallback","parseWithStateMachine","newChars","segments","state","i","char","nextChar","nextNextChar","c","type","segment","prev","useEffect","newContent","oldContent","newSegments","isNowComplete","reset","start"],"mappings":"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"}
|