markdown-flow-ui 0.1.99-beta.1 → 0.1.99-beta.2

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 (48) hide show
  1. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.cjs.js +1 -1
  2. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.cjs.js.map +1 -1
  3. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.es.js +1 -1
  4. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/index.cjs.js +1 -1
  5. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/index.es.js +1 -1
  6. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/c4Diagram-YG6GDRKO.cjs.js +1 -1
  7. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/c4Diagram-YG6GDRKO.cjs.js.map +1 -1
  8. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/c4Diagram-YG6GDRKO.es.js +1 -1
  9. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-S3R3BYOJ.cjs.js +1 -1
  10. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-S3R3BYOJ.cjs.js.map +1 -1
  11. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-S3R3BYOJ.es.js +1 -1
  12. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-TZMSLE5B.cjs.js +1 -1
  13. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-TZMSLE5B.cjs.js.map +1 -1
  14. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-TZMSLE5B.es.js +1 -1
  15. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/ganttDiagram-LVOFAZNH.cjs.js +1 -1
  16. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/ganttDiagram-LVOFAZNH.cjs.js.map +1 -1
  17. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/ganttDiagram-LVOFAZNH.es.js +1 -1
  18. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/sequenceDiagram-WL72ISMW.cjs.js +1 -1
  19. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/sequenceDiagram-WL72ISMW.cjs.js.map +1 -1
  20. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/sequenceDiagram-WL72ISMW.es.js +1 -1
  21. package/dist/Documents/ai-shifu/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
  22. package/dist/Documents/ai-shifu/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
  23. package/dist/Documents/ai-shifu/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
  24. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/react-is@18.3.1/node_modules/react-is/index.cjs.js +1 -1
  25. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/react-is@18.3.1/node_modules/react-is/index.es.js +1 -1
  26. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/style-to-object@1.0.11/node_modules/style-to-object/cjs/index.cjs.js +1 -1
  27. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/style-to-object@1.0.11/node_modules/style-to-object/cjs/index.es.js +1 -1
  28. package/dist/_virtual/index.cjs10.js +1 -1
  29. package/dist/_virtual/index.cjs11.js +1 -1
  30. package/dist/_virtual/index.cjs12.js +1 -1
  31. package/dist/_virtual/index.cjs7.js +1 -1
  32. package/dist/_virtual/index.cjs8.js +1 -1
  33. package/dist/_virtual/index.cjs9.js +1 -1
  34. package/dist/_virtual/index.es10.js +2 -3
  35. package/dist/_virtual/index.es10.js.map +1 -1
  36. package/dist/_virtual/index.es11.js +3 -2
  37. package/dist/_virtual/index.es11.js.map +1 -1
  38. package/dist/_virtual/index.es12.js +2 -2
  39. package/dist/_virtual/index.es7.js +3 -2
  40. package/dist/_virtual/index.es7.js.map +1 -1
  41. package/dist/_virtual/index.es8.js +2 -2
  42. package/dist/_virtual/index.es9.js +2 -3
  43. package/dist/_virtual/index.es9.js.map +1 -1
  44. package/dist/components/ContentRender/IframeSandbox.cjs.js +4 -4
  45. package/dist/components/ContentRender/IframeSandbox.cjs.js.map +1 -1
  46. package/dist/components/ContentRender/IframeSandbox.es.js +134 -134
  47. package/dist/components/ContentRender/IframeSandbox.es.js.map +1 -1
  48. package/package.json +1 -1
@@ -1,99 +1,99 @@
1
- import { j as R } from "../../_virtual/jsx-runtime.es.js";
2
- import tt, { useRef as d, useState as _, useEffect as x } from "react";
3
- import { createRoot as ft } from "react-dom/client";
4
- import pt from "./SandboxApp.es.js";
5
- import { splitContentSegments as bt } from "./utils/split-content.es.js";
6
- import gt from "./ContentRender.es.js";
7
- const wt = () => import("./blackboard-vendor.es.js").then((i) => i.injectBlackboardLibraries), vt = /<img\b[^>]*>/i, xt = 180, Et = "markdown-flow-ui:sandbox", et = "interaction", nt = 240, st = (i) => i.split(/\s+/).filter(Boolean).map((r) => r.split(":").pop() || r), rt = (i) => {
8
- const r = i.trim().toLowerCase();
1
+ import { j as H } from "../../_virtual/jsx-runtime.es.js";
2
+ import J, { useRef as m, useState as k, useEffect as x } from "react";
3
+ import { createRoot as at } from "react-dom/client";
4
+ import ut from "./SandboxApp.es.js";
5
+ import { splitContentSegments as ht } from "./utils/split-content.es.js";
6
+ import dt from "./ContentRender.es.js";
7
+ const mt = () => import("./blackboard-vendor.es.js").then((s) => s.injectBlackboardLibraries), ft = /<img\b[^>]*>/i, pt = 180, gt = "markdown-flow-ui:sandbox", bt = "interaction", wt = 240, tt = (s) => s.split(/\s+/).filter(Boolean).map((r) => r.split(":").pop() || r), K = (s) => {
8
+ const r = s.trim().toLowerCase();
9
9
  if (!r) return null;
10
- const m = r.match(/^([0-9.]+)(vh|dvh|svh|lvh)$/i);
11
- return m ? `${m[1]}${m[2].toLowerCase()}` : null;
12
- }, ot = (i) => {
13
- if (!i.trim()) return null;
14
- const r = st(i);
10
+ const f = r.match(/^([0-9.]+)(vh|dvh|svh|lvh)$/i);
11
+ return f ? `${f[1]}${f[2].toLowerCase()}` : null;
12
+ }, Q = (s) => {
13
+ if (!s.trim()) return null;
14
+ const r = tt(s);
15
15
  if (r.includes("h-screen") || r.includes("h-dvh"))
16
16
  return "100dvh";
17
17
  if (r.includes("h-svh"))
18
18
  return "100svh";
19
19
  if (r.includes("h-lvh"))
20
20
  return "100lvh";
21
- const m = r.find(
22
- (T) => /^h-\[[0-9.]+(vh|dvh|svh|lvh)\]$/i.test(T)
21
+ const f = r.find(
22
+ (R) => /^h-\[[0-9.]+(vh|dvh|svh|lvh)\]$/i.test(R)
23
23
  );
24
- if (!m) return null;
25
- const w = m.match(/^h-\[([0-9.]+)(vh|dvh|svh|lvh)\]$/i);
24
+ if (!f) return null;
25
+ const w = f.match(/^h-\[([0-9.]+)(vh|dvh|svh|lvh)\]$/i);
26
26
  return w ? `${w[1]}${w[2].toLowerCase()}` : null;
27
- }, kt = ({
28
- content: i,
27
+ }, Tt = ({
28
+ content: s,
29
29
  type: r,
30
- className: m,
30
+ className: f,
31
31
  loadingText: w,
32
- styleLoadingText: T,
32
+ styleLoadingText: R,
33
33
  scriptLoadingText: $,
34
- fullScreenButtonText: I,
35
- hideFullScreen: V = !1,
36
- mode: h = "content"
34
+ fullScreenButtonText: N,
35
+ hideFullScreen: L = !1,
36
+ mode: d = "content"
37
37
  }) => {
38
- const P = d(null), v = d(null), L = d(null), W = d(null), O = d(() => {
39
- }), [, it] = _(480), [q, lt] = _(0), [ct, at] = _(!1), G = h === "blackboard", B = d(""), n = tt.useMemo(() => {
40
- const t = bt(i).filter((c) => c.type === "sandbox");
41
- return (h === "blackboard" ? t[t.length - 1]?.value || "" : t.map((c) => c.value).join(`
38
+ const V = m(null), v = m(null), _ = m(null), P = m(null), I = m(() => {
39
+ }), [, et] = k(480), [q, nt] = k(0), [rt, ot] = k(!1), G = d === "blackboard", O = m(""), n = J.useMemo(() => {
40
+ const t = ht(s).filter((a) => a.type === "sandbox");
41
+ return (d === "blackboard" ? t[t.length - 1]?.value || "" : t.map((a) => a.value).join(`
42
42
  `)) || "";
43
- }, [i, h]), [A, U] = _(n), X = d(n), D = d(n), E = d(null), j = () => {
43
+ }, [s, d]), [T, U] = k(n), W = m(n), B = m(n), E = m(null), D = () => {
44
44
  E.current !== null && (window.clearTimeout(E.current), E.current = null);
45
45
  };
46
46
  x(
47
47
  () => () => {
48
- j();
48
+ D();
49
49
  },
50
50
  []
51
51
  ), x(() => {
52
- const e = X.current;
53
- X.current = n;
54
- const t = !!e && n.length > e.length && n.startsWith(e), l = vt.test(n);
52
+ const e = W.current;
53
+ W.current = n;
54
+ const t = !!e && n.length > e.length && n.startsWith(e), l = ft.test(n);
55
55
  if (!(t && l)) {
56
- j(), D.current = n, U(n);
56
+ D(), B.current = n, U(n);
57
57
  return;
58
58
  }
59
- D.current = n, j(), E.current = window.setTimeout(() => {
60
- U(D.current), E.current = null;
61
- }, xt);
59
+ B.current = n, D(), E.current = window.setTimeout(() => {
60
+ U(B.current), E.current = null;
61
+ }, pt);
62
62
  }, [n]);
63
- const Y = !!tt.useMemo(() => {
64
- const e = A.trim();
63
+ const X = !!J.useMemo(() => {
64
+ const e = T.trim();
65
65
  if (!e) return null;
66
66
  const t = e.match(/^<([a-zA-Z][\w:-]*)(\s[^>]*?)?>/);
67
67
  if (!t) return null;
68
- const l = t[2] || "", c = l.match(/\bheight\s*=\s*["']([^"']+)["']/i);
69
- if (c) {
70
- const f = rt(c[1]);
71
- if (f) return f;
68
+ const l = t[2] || "", a = l.match(/\bheight\s*=\s*["']([^"']+)["']/i);
69
+ if (a) {
70
+ const u = K(a[1]);
71
+ if (u) return u;
72
72
  }
73
73
  const C = l.match(/\bstyle\s*=\s*["']([^"']+)["']/i)?.[1]?.match(
74
74
  /\bheight\s*:\s*([^;]+)/i
75
75
  )?.[1];
76
76
  if (C) {
77
- const f = rt(C);
78
- if (f) return f;
77
+ const u = K(C);
78
+ if (u) return u;
79
79
  }
80
- const H = l.match(/\bclass\s*=\s*["']([^"']+)["']/i)?.[1];
81
- return H ? ot(H) : null;
82
- }, [A]);
80
+ const y = l.match(/\bclass\s*=\s*["']([^"']+)["']/i)?.[1];
81
+ return y ? Q(y) : null;
82
+ }, [T]);
83
83
  x(() => {
84
- if (h !== "blackboard") {
85
- B.current = n;
84
+ if (d !== "blackboard") {
85
+ O.current = n;
86
86
  return;
87
87
  }
88
- const e = B.current;
89
- !(e && n.startsWith(e)) && e && lt((l) => l + 1), B.current = n;
90
- }, [n, h]), x(() => {
88
+ const e = O.current;
89
+ !(e && n.startsWith(e)) && e && nt((l) => l + 1), O.current = n;
90
+ }, [n, d]), x(() => {
91
91
  const e = v.current;
92
92
  if (!e) return;
93
93
  const t = e.contentDocument;
94
94
  if (!t) return;
95
95
  t.open(), t.write(`<!DOCTYPE html>
96
- <html${h === "blackboard" ? ' style="height: 100%;"' : ""}>
96
+ <html${d === "blackboard" ? ' style="height: 100%;"' : ""}>
97
97
  <head>
98
98
  <meta charset="utf-8" />
99
99
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
@@ -106,93 +106,93 @@ const wt = () => import("./blackboard-vendor.es.js").then((i) => i.injectBlackbo
106
106
  <body>
107
107
  <div id="root"></div>
108
108
  </body>
109
- </html>`), t.close(), W.current = t;
109
+ </html>`), t.close(), P.current = t;
110
110
  let l = 0;
111
- const c = (o) => {
111
+ const a = (i) => {
112
112
  if (typeof window > "u")
113
113
  return;
114
- const a = Date.now();
115
- o === et && a - l < nt || o === "wheel" && a - l < nt || (l = a, window.postMessage(
114
+ const c = Date.now();
115
+ c - l < wt || (l = c, window.postMessage(
116
116
  {
117
- source: Et,
118
- type: et,
119
- eventType: o
117
+ source: gt,
118
+ type: bt,
119
+ eventType: i
120
120
  },
121
121
  window.location.origin
122
122
  ));
123
- }, y = e.contentWindow, C = G && r === "sandbox", H = () => c("pointerdown"), f = () => c("touchstart"), K = () => c("wheel"), Z = () => c("keydown");
124
- C && y && (t.addEventListener("pointerdown", H, !0), t.addEventListener("touchstart", f, !0), t.addEventListener("wheel", K, { passive: !0 }), y.addEventListener("keydown", Z, !0));
125
- const S = t.getElementById("root");
126
- if (!S) return;
127
- const J = ft(S);
128
- L.current = J;
129
- let k = !1;
130
- const Q = (o, a) => {
131
- const s = o.trim().toLowerCase();
132
- if (!s) return null;
133
- const u = Number.parseFloat(s);
134
- return Number.isNaN(u) ? null : /(dvh|svh|lvh|vh)$/i.test(s) ? u / 100 * a : s.endsWith("px") || /^[0-9.]+$/.test(s) ? u : null;
135
- }, dt = (o, a) => {
136
- if (!o.trim()) return null;
137
- const s = ot(o);
138
- if (s)
139
- return Q(s, a);
140
- const p = st(o).find(
141
- (N) => /^h-\[[0-9.]+px\]$/i.test(N)
123
+ }, j = G && r === "sandbox", C = () => a("pointerdown"), y = () => a("touchstart");
124
+ j && (t.addEventListener("pointerdown", C, !0), t.addEventListener("touchstart", y, !0));
125
+ const u = t.getElementById("root");
126
+ if (!u) return;
127
+ const Y = at(u);
128
+ _.current = Y;
129
+ let A = !1;
130
+ const Z = (i, c) => {
131
+ const o = i.trim().toLowerCase();
132
+ if (!o) return null;
133
+ const h = Number.parseFloat(o);
134
+ return Number.isNaN(h) ? null : /(dvh|svh|lvh|vh)$/i.test(o) ? h / 100 * c : o.endsWith("px") || /^[0-9.]+$/.test(o) ? h : null;
135
+ }, lt = (i, c) => {
136
+ if (!i.trim()) return null;
137
+ const o = Q(i);
138
+ if (o)
139
+ return Z(o, c);
140
+ const p = tt(i).find(
141
+ (S) => /^h-\[[0-9.]+px\]$/i.test(S)
142
142
  );
143
143
  if (!p) return null;
144
- const b = p.match(/^h-\[([0-9.]+)px\]$/i);
145
- if (!b) return null;
146
- const g = Number.parseFloat(b[1]);
147
- return Number.isNaN(g) ? null : g;
148
- }, mt = () => {
144
+ const g = p.match(/^h-\[([0-9.]+)px\]$/i);
145
+ if (!g) return null;
146
+ const b = Number.parseFloat(g[1]);
147
+ return Number.isNaN(b) ? null : b;
148
+ }, ct = () => {
149
149
  if (!v.current || !t.body) return null;
150
- const a = t.body.querySelector(
150
+ const c = t.body.querySelector(
151
151
  ".sandbox-wrapper"
152
152
  )?.firstElementChild;
153
- if (!a) return null;
154
- const s = Array.from(a.children);
155
- if (s.length !== 1) return null;
156
- const u = s[0], p = u.style.height || u.getAttribute("height"), b = v.current.ownerDocument?.documentElement?.clientHeight || window.innerHeight, g = p ? Q(p, b) : null;
157
- if (g !== null)
158
- return Math.ceil(g);
159
- const N = dt(
160
- u.getAttribute("class") || "",
161
- b
153
+ if (!c) return null;
154
+ const o = Array.from(c.children);
155
+ if (o.length !== 1) return null;
156
+ const h = o[0], p = h.style.height || h.getAttribute("height"), g = v.current.ownerDocument?.documentElement?.clientHeight || window.innerHeight, b = p ? Z(p, g) : null;
157
+ if (b !== null)
158
+ return Math.ceil(b);
159
+ const S = lt(
160
+ h.getAttribute("class") || "",
161
+ g
162
162
  );
163
- return N !== null ? Math.ceil(N) : null;
163
+ return S !== null ? Math.ceil(S) : null;
164
164
  }, z = () => {
165
165
  if (!v.current || !t.body) return;
166
- const o = t.body.getBoundingClientRect(), a = t.documentElement?.getBoundingClientRect(), s = o.height, u = a?.height || 0, p = Math.max(s, u), b = mt(), g = Math.max(
166
+ const i = t.body.getBoundingClientRect(), c = t.documentElement?.getBoundingClientRect(), o = i.height, h = c?.height || 0, p = Math.max(o, h), g = ct(), b = Math.max(
167
167
  200,
168
- b ?? Math.ceil(p)
168
+ g ?? Math.ceil(p)
169
169
  );
170
- it(g);
170
+ et(b);
171
171
  }, M = () => {
172
172
  requestAnimationFrame(() => {
173
- k || z();
173
+ A || z();
174
174
  });
175
175
  };
176
- O.current = M, z(), M(), wt().then((o) => {
177
- k || (o(t), M());
176
+ I.current = M, z(), M(), mt().then((i) => {
177
+ A || (i(t), M());
178
178
  }).catch(() => {
179
- k || M();
179
+ A || M();
180
180
  });
181
181
  const F = new ResizeObserver(() => z());
182
- return F.observe(t.body), S && F.observe(S), () => {
183
- k = !0, F.disconnect(), C && y && (t.removeEventListener("pointerdown", H, !0), t.removeEventListener("touchstart", f, !0), t.removeEventListener("wheel", K), y.removeEventListener("keydown", Z, !0)), setTimeout(() => {
184
- J.unmount(), L.current = null, W.current = null, O.current = () => {
182
+ return F.observe(t.body), u && F.observe(u), () => {
183
+ A = !0, F.disconnect(), j && (t.removeEventListener("pointerdown", C, !0), t.removeEventListener("touchstart", y, !0)), setTimeout(() => {
184
+ Y.unmount(), _.current = null, P.current = null, I.current = () => {
185
185
  };
186
186
  }, 0);
187
187
  };
188
188
  }, []), x(() => {
189
189
  const e = () => {
190
- at(!!document.fullscreenElement);
190
+ ot(!!document.fullscreenElement);
191
191
  };
192
192
  return document.addEventListener("fullscreenchange", e), () => document.removeEventListener("fullscreenchange", e);
193
193
  }, []);
194
- const ut = () => {
195
- const e = P.current || v.current;
194
+ const st = () => {
195
+ const e = V.current || v.current;
196
196
  if (e) {
197
197
  if (document.fullscreenElement) {
198
198
  document.exitFullscreen().catch(() => {
@@ -204,60 +204,60 @@ const wt = () => import("./blackboard-vendor.es.js").then((i) => i.injectBlackbo
204
204
  }
205
205
  };
206
206
  x(() => {
207
- const e = L.current;
207
+ const e = _.current;
208
208
  e && (e.render(
209
- /* @__PURE__ */ R.jsx(
210
- pt,
209
+ /* @__PURE__ */ H.jsx(
210
+ ut,
211
211
  {
212
- html: A,
212
+ html: T,
213
213
  loadingText: w,
214
- styleLoadingText: T,
214
+ styleLoadingText: R,
215
215
  scriptLoadingText: $,
216
- fullScreenButtonText: I,
217
- hideFullScreen: V,
216
+ fullScreenButtonText: N,
217
+ hideFullScreen: L,
218
218
  resetToken: q,
219
- hasRootVhHeight: Y,
220
- mode: h
219
+ hasRootVhHeight: X,
220
+ mode: d
221
221
  }
222
222
  )
223
- ), requestAnimationFrame(() => O.current?.()));
223
+ ), requestAnimationFrame(() => I.current?.()));
224
224
  }, [
225
- A,
226
- w,
227
225
  T,
226
+ w,
227
+ R,
228
228
  $,
229
- I,
229
+ N,
230
230
  q,
231
- h
231
+ d
232
232
  ]);
233
- const ht = [
233
+ const it = [
234
234
  "w-full relative content-render-iframe-sandbox",
235
235
  G ? "h-full overflow-auto flex flex-col" : "aspect-[16/9] overflow-hidden flex items-center justify-center"
236
236
  ].filter(Boolean).join(" ");
237
- return /* @__PURE__ */ R.jsxs(
237
+ return /* @__PURE__ */ H.jsxs(
238
238
  "div",
239
239
  {
240
- ref: P,
241
- "data-root-vh": Y ? "true" : "false",
242
- className: ht,
240
+ ref: V,
241
+ "data-root-vh": X ? "true" : "false",
242
+ className: it,
243
243
  children: [
244
- !V && /* @__PURE__ */ R.jsx(
244
+ !L && /* @__PURE__ */ H.jsx(
245
245
  "button",
246
246
  {
247
247
  type: "button",
248
- onClick: ut,
248
+ onClick: st,
249
249
  className: "absolute top-2 right-2 z-50 p-1.5 bg-black/75 text-white rounded-md cursor-pointer",
250
- children: ct ? "退出全屏" : I || "全屏浏览"
250
+ children: rt ? "退出全屏" : N || "全屏浏览"
251
251
  }
252
252
  ),
253
- h === "blackboard" && r === "markdown" ? /* @__PURE__ */ R.jsx(gt, { content: i }) : /* @__PURE__ */ R.jsx(
253
+ d === "blackboard" && r === "markdown" ? /* @__PURE__ */ H.jsx(dt, { content: s }) : /* @__PURE__ */ H.jsx(
254
254
  "iframe",
255
255
  {
256
256
  ref: v,
257
257
  sandbox: "allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox",
258
258
  allow: "fullscreen",
259
259
  allowFullScreen: !0,
260
- className: [m, "w-full h-full mx-auto my-auto block"].filter(Boolean).join(" "),
260
+ className: [f, "w-full h-full mx-auto my-auto block"].filter(Boolean).join(" "),
261
261
  style: {
262
262
  height: "100%",
263
263
  margin: "auto"
@@ -269,6 +269,6 @@ const wt = () => import("./blackboard-vendor.es.js").then((i) => i.injectBlackbo
269
269
  );
270
270
  };
271
271
  export {
272
- kt as default
272
+ Tt as default
273
273
  };
274
274
  //# sourceMappingURL=IframeSandbox.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"IframeSandbox.es.js","sources":["../../../src/components/ContentRender/IframeSandbox.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from \"react\";\nimport { createRoot, Root } from \"react-dom/client\";\nimport SandboxApp from \"./SandboxApp\";\nimport { splitContentSegments } from \"./utils/split-content\";\nimport ContentRender from \"./ContentRender\";\n// Lazy-load iframe vendor libraries and inject them into the sandbox document.\nconst loadBlackboardVendor = () =>\n import(\"./blackboard-vendor\").then((m) => m.injectBlackboardLibraries);\n\nconst COMPLETE_IMAGE_TAG_PATTERN = /<img\\b[^>]*>/i;\nconst POST_IMAGE_STREAM_DEBOUNCE_MS = 180;\nconst SANDBOX_INTERACTION_MESSAGE_SOURCE = \"markdown-flow-ui:sandbox\";\nconst SANDBOX_INTERACTION_MESSAGE_TYPE = \"interaction\";\nconst SANDBOX_INTERACTION_THROTTLE_MS = 240;\nexport interface IframeSandboxProps {\n content: string;\n className?: string;\n loadingText?: string;\n styleLoadingText?: string;\n scriptLoadingText?: string;\n fullScreenButtonText?: string;\n hideFullScreen?: boolean;\n mode?: \"content\" | \"blackboard\";\n type: \"sandbox\" | \"markdown\";\n}\n\nconst normalizeTailwindHeightTokens = (className: string) =>\n className\n .split(/\\s+/)\n .filter(Boolean)\n .map((token) => token.split(\":\").pop() || token);\n\nconst parseViewportHeightCss = (value: string) => {\n const normalized = value.trim().toLowerCase();\n if (!normalized) return null;\n const matched = normalized.match(/^([0-9.]+)(vh|dvh|svh|lvh)$/i);\n if (!matched) return null;\n return `${matched[1]}${matched[2].toLowerCase()}`;\n};\n\nconst extractViewportHeightFromTailwindClass = (className: string) => {\n if (!className.trim()) return null;\n const normalizedTokens = normalizeTailwindHeightTokens(className);\n if (\n normalizedTokens.includes(\"h-screen\") ||\n normalizedTokens.includes(\"h-dvh\")\n ) {\n return \"100dvh\";\n }\n if (normalizedTokens.includes(\"h-svh\")) {\n return \"100svh\";\n }\n if (normalizedTokens.includes(\"h-lvh\")) {\n return \"100lvh\";\n }\n const arbitraryToken = normalizedTokens.find((token) =>\n /^h-\\[[0-9.]+(vh|dvh|svh|lvh)\\]$/i.test(token)\n );\n if (!arbitraryToken) return null;\n const matched = arbitraryToken.match(/^h-\\[([0-9.]+)(vh|dvh|svh|lvh)\\]$/i);\n if (!matched) return null;\n return `${matched[1]}${matched[2].toLowerCase()}`;\n};\n\nconst IframeSandbox: React.FC<IframeSandboxProps> = ({\n content,\n type,\n className,\n loadingText,\n styleLoadingText,\n scriptLoadingText,\n fullScreenButtonText,\n hideFullScreen = false,\n mode = \"content\",\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const rootRef = useRef<Root | null>(null);\n const docRef = useRef<Document | null>(null);\n const updateHeightRef = useRef<() => void>(() => {});\n const [, setHeight] = useState(480);\n const [resetToken, setResetToken] = useState(0);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const isBlackboardMode = mode === \"blackboard\";\n const prevHtmlRef = useRef<string>(\"\");\n const htmlContent = React.useMemo(() => {\n const segments = splitContentSegments(content);\n // console.log('segments=====', segments);\n const sandboxSegments = segments.filter((seg) => seg.type === \"sandbox\");\n const sandboxContent =\n mode === \"blackboard\"\n ? sandboxSegments[sandboxSegments.length - 1]?.value || \"\"\n : sandboxSegments.map((seg) => seg.value).join(\"\\n\");\n return sandboxContent || \"\";\n }, [content, mode]);\n const [renderHtmlContent, setRenderHtmlContent] = useState(htmlContent);\n const prevIncomingHtmlRef = useRef(htmlContent);\n const pendingHtmlRef = useRef(htmlContent);\n const deferRenderTimerRef = useRef<number | null>(null);\n\n const clearDeferredRenderTimer = () => {\n if (deferRenderTimerRef.current === null) return;\n window.clearTimeout(deferRenderTimerRef.current);\n deferRenderTimerRef.current = null;\n };\n\n useEffect(\n () => () => {\n clearDeferredRenderTimer();\n },\n []\n );\n\n useEffect(() => {\n const prevIncomingHtml = prevIncomingHtmlRef.current;\n prevIncomingHtmlRef.current = htmlContent;\n\n const isAppendOnlyStream =\n !!prevIncomingHtml &&\n htmlContent.length > prevIncomingHtml.length &&\n htmlContent.startsWith(prevIncomingHtml);\n const containsCompleteImage = COMPLETE_IMAGE_TAG_PATTERN.test(htmlContent);\n const shouldDeferRender = isAppendOnlyStream && containsCompleteImage;\n\n if (!shouldDeferRender) {\n clearDeferredRenderTimer();\n pendingHtmlRef.current = htmlContent;\n setRenderHtmlContent(htmlContent);\n return;\n }\n\n pendingHtmlRef.current = htmlContent;\n clearDeferredRenderTimer();\n deferRenderTimerRef.current = window.setTimeout(() => {\n setRenderHtmlContent(pendingHtmlRef.current);\n deferRenderTimerRef.current = null;\n }, POST_IMAGE_STREAM_DEBOUNCE_MS);\n }, [htmlContent]);\n\n const rootViewportHeightCss = React.useMemo(() => {\n const normalized = renderHtmlContent.trim();\n if (!normalized) return null;\n const rootMatch = normalized.match(/^<([a-zA-Z][\\w:-]*)(\\s[^>]*?)?>/);\n if (!rootMatch) return null;\n const attrs = rootMatch[2] || \"\";\n const heightAttrMatch = attrs.match(/\\bheight\\s*=\\s*[\"']([^\"']+)[\"']/i);\n if (heightAttrMatch) {\n const explicitHeightCss = parseViewportHeightCss(heightAttrMatch[1]);\n if (explicitHeightCss) return explicitHeightCss;\n }\n const styleAttrMatch = attrs.match(/\\bstyle\\s*=\\s*[\"']([^\"']+)[\"']/i)?.[1];\n const styleHeightMatch = styleAttrMatch?.match(\n /\\bheight\\s*:\\s*([^;]+)/i\n )?.[1];\n if (styleHeightMatch) {\n const styleHeightCss = parseViewportHeightCss(styleHeightMatch);\n if (styleHeightCss) return styleHeightCss;\n }\n const classAttrMatch = attrs.match(/\\bclass\\s*=\\s*[\"']([^\"']+)[\"']/i)?.[1];\n if (!classAttrMatch) return null;\n return extractViewportHeightFromTailwindClass(classAttrMatch);\n }, [renderHtmlContent]);\n const hasRootVhHeight = Boolean(rootViewportHeightCss);\n useEffect(() => {\n if (mode !== \"blackboard\") {\n prevHtmlRef.current = htmlContent;\n return;\n }\n const prev = prevHtmlRef.current;\n const isContinuation = prev && htmlContent.startsWith(prev);\n if (!isContinuation && prev) {\n setResetToken((token) => token + 1);\n }\n prevHtmlRef.current = htmlContent;\n }, [htmlContent, mode]);\n\n useEffect(() => {\n const iframe = iframeRef.current;\n if (!iframe) return undefined;\n\n const doc = iframe.contentDocument;\n if (!doc) return undefined;\n\n doc.open();\n doc.write(`<!DOCTYPE html>\n<html${mode === \"blackboard\" ? ' style=\"height: 100%;\"' : \"\"}>\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <style>\n html, body, #root { width: 100%; height: 100%; }\n html, body { margin: 0; padding: 0; overflow: auto; }\n *, *::before, *::after { box-sizing: border-box; }\n </style>\n </head>\n <body>\n <div id=\"root\"></div>\n </body>\n</html>`);\n doc.close();\n\n docRef.current = doc;\n\n let lastSandboxInteractionTime = 0;\n const notifySandboxInteraction = (eventType: string) => {\n if (typeof window === \"undefined\") {\n return;\n }\n const now = Date.now();\n if (\n eventType === SANDBOX_INTERACTION_MESSAGE_TYPE &&\n now - lastSandboxInteractionTime < SANDBOX_INTERACTION_THROTTLE_MS\n ) {\n return;\n }\n if (\n eventType === \"wheel\" &&\n now - lastSandboxInteractionTime < SANDBOX_INTERACTION_THROTTLE_MS\n ) {\n return;\n }\n lastSandboxInteractionTime = now;\n window.postMessage(\n {\n source: SANDBOX_INTERACTION_MESSAGE_SOURCE,\n type: SANDBOX_INTERACTION_MESSAGE_TYPE,\n eventType,\n },\n window.location.origin\n );\n };\n\n const sandboxWindow = iframe.contentWindow;\n const shouldBridgeSandboxInteraction = isBlackboardMode && type === \"sandbox\";\n const handleSandboxPointerDown = () => notifySandboxInteraction(\"pointerdown\");\n const handleSandboxTouchStart = () => notifySandboxInteraction(\"touchstart\");\n const handleSandboxWheel = () => notifySandboxInteraction(\"wheel\");\n const handleSandboxKeydown = () => notifySandboxInteraction(\"keydown\");\n\n if (shouldBridgeSandboxInteraction && sandboxWindow) {\n doc.addEventListener(\"pointerdown\", handleSandboxPointerDown, true);\n doc.addEventListener(\"touchstart\", handleSandboxTouchStart, true);\n doc.addEventListener(\"wheel\", handleSandboxWheel, { passive: true });\n sandboxWindow.addEventListener(\"keydown\", handleSandboxKeydown, true);\n }\n\n const rootEl = doc.getElementById(\"root\");\n if (!rootEl) return undefined;\n\n const root = createRoot(rootEl);\n rootRef.current = root;\n let isDestroyed = false;\n\n const parseExplicitHeight = (\n value: string,\n parentViewportHeight: number\n ) => {\n const normalized = value.trim().toLowerCase();\n if (!normalized) return null;\n const numeric = Number.parseFloat(normalized);\n if (Number.isNaN(numeric)) return null;\n if (/(dvh|svh|lvh|vh)$/i.test(normalized)) {\n return (numeric / 100) * parentViewportHeight;\n }\n if (normalized.endsWith(\"px\") || /^[0-9.]+$/.test(normalized)) {\n return numeric;\n }\n return null;\n };\n const parseTailwindHeightClass = (\n className: string,\n parentViewportHeight: number\n ) => {\n if (!className.trim()) return null;\n const viewportHeightCss =\n extractViewportHeightFromTailwindClass(className);\n if (viewportHeightCss) {\n return parseExplicitHeight(viewportHeightCss, parentViewportHeight);\n }\n const normalizedTokens = normalizeTailwindHeightTokens(className);\n const arbitraryToken = normalizedTokens.find((token) =>\n /^h-\\[[0-9.]+px\\]$/i.test(token)\n );\n if (!arbitraryToken) return null;\n const matched = arbitraryToken.match(/^h-\\[([0-9.]+)px\\]$/i);\n if (!matched) return null;\n const numeric = Number.parseFloat(matched[1]);\n if (Number.isNaN(numeric)) return null;\n return numeric;\n };\n\n const resolveExplicitHeight = () => {\n if (!iframeRef.current || !doc.body) return null;\n const wrapper = doc.body.querySelector(\n \".sandbox-wrapper\"\n ) as HTMLElement | null;\n const container = wrapper?.firstElementChild as HTMLElement | null;\n if (!container) return null;\n const elements = Array.from(container.children) as HTMLElement[];\n if (elements.length !== 1) return null;\n const target = elements[0];\n const heightValue = target.style.height || target.getAttribute(\"height\");\n const parentViewportHeight =\n iframeRef.current.ownerDocument?.documentElement?.clientHeight ||\n window.innerHeight;\n const parsed = heightValue\n ? parseExplicitHeight(heightValue, parentViewportHeight)\n : null;\n if (parsed !== null) {\n return Math.ceil(parsed);\n }\n const classHeight = parseTailwindHeightClass(\n target.getAttribute(\"class\") || \"\",\n parentViewportHeight\n );\n return classHeight !== null ? Math.ceil(classHeight) : null;\n };\n\n const updateHeight = () => {\n if (!iframeRef.current || !doc.body) return;\n const bodyRect = doc.body.getBoundingClientRect();\n const htmlRect = doc.documentElement?.getBoundingClientRect();\n const bodyHeight = bodyRect.height;\n const htmlHeight = htmlRect?.height || 0;\n const contentHeight = Math.max(bodyHeight, htmlHeight);\n const explicitHeight = resolveExplicitHeight();\n const nextHeight = Math.max(\n 200,\n explicitHeight ?? Math.ceil(contentHeight)\n );\n setHeight(nextHeight);\n };\n const scheduleHeightUpdate = () => {\n requestAnimationFrame(() => {\n if (isDestroyed) return;\n updateHeight();\n });\n };\n updateHeightRef.current = scheduleHeightUpdate;\n\n updateHeight();\n scheduleHeightUpdate();\n\n // Inject Tailwind/DaisyUI/GSAP into iframe for all sandbox modes.\n // Dynamic import keeps ~3.3 MB of vendor libs out of the main bundle.\n // Tailwind's MutationObserver ensures styles apply even if content renders first.\n loadBlackboardVendor()\n .then((inject) => {\n if (isDestroyed) return;\n inject(doc);\n scheduleHeightUpdate();\n })\n .catch(() => {\n if (isDestroyed) return;\n scheduleHeightUpdate();\n });\n\n const resizeObserver = new ResizeObserver(() => updateHeight());\n resizeObserver.observe(doc.body);\n if (rootEl) {\n resizeObserver.observe(rootEl);\n }\n\n return () => {\n isDestroyed = true;\n resizeObserver.disconnect();\n if (shouldBridgeSandboxInteraction && sandboxWindow) {\n doc.removeEventListener(\"pointerdown\", handleSandboxPointerDown, true);\n doc.removeEventListener(\"touchstart\", handleSandboxTouchStart, true);\n doc.removeEventListener(\"wheel\", handleSandboxWheel);\n sandboxWindow.removeEventListener(\"keydown\", handleSandboxKeydown, true);\n }\n // Defer unmount to avoid React warning when parent is mid-render\n setTimeout(() => {\n root.unmount();\n rootRef.current = null;\n docRef.current = null;\n updateHeightRef.current = () => {};\n }, 0);\n };\n }, []);\n\n useEffect(() => {\n const onFullscreenChange = () => {\n setIsFullscreen(Boolean(document.fullscreenElement));\n };\n document.addEventListener(\"fullscreenchange\", onFullscreenChange);\n return () =>\n document.removeEventListener(\"fullscreenchange\", onFullscreenChange);\n }, []);\n\n const toggleFullscreen = () => {\n const target = containerRef.current || iframeRef.current;\n if (!target) return;\n if (document.fullscreenElement) {\n document.exitFullscreen().catch(() => {});\n return;\n }\n if (target.requestFullscreen) {\n target.requestFullscreen().catch(() => {});\n }\n };\n\n useEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n\n root.render(\n <SandboxApp\n html={renderHtmlContent}\n loadingText={loadingText}\n styleLoadingText={styleLoadingText}\n scriptLoadingText={scriptLoadingText}\n fullScreenButtonText={fullScreenButtonText}\n hideFullScreen={hideFullScreen}\n resetToken={resetToken}\n hasRootVhHeight={hasRootVhHeight}\n mode={mode}\n />\n );\n requestAnimationFrame(() => updateHeightRef.current?.());\n }, [\n renderHtmlContent,\n loadingText,\n styleLoadingText,\n scriptLoadingText,\n fullScreenButtonText,\n resetToken,\n mode,\n ]);\n const containerClassName = [\n \"w-full relative content-render-iframe-sandbox\",\n isBlackboardMode\n ? \"h-full overflow-auto flex flex-col\"\n : \"aspect-[16/9] overflow-hidden flex items-center justify-center\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div\n ref={containerRef}\n data-root-vh={hasRootVhHeight ? \"true\" : \"false\"}\n className={containerClassName}\n >\n {!hideFullScreen && (\n <button\n type=\"button\"\n onClick={toggleFullscreen}\n className={\n \"absolute top-2 right-2 z-50 p-1.5 bg-black/75 text-white rounded-md cursor-pointer\"\n }\n >\n {isFullscreen ? \"退出全屏\" : fullScreenButtonText || \"全屏浏览\"}\n </button>\n )}\n {mode === \"blackboard\" && type === \"markdown\" ? (\n <ContentRender content={content} />\n ) : (\n <iframe\n ref={iframeRef}\n sandbox=\"allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox\"\n allow=\"fullscreen\"\n allowFullScreen\n className={[className, \"w-full h-full mx-auto my-auto block\"]\n .filter(Boolean)\n .join(\" \")}\n style={{\n height: \"100%\",\n margin: \"auto\",\n }}\n />\n )}\n </div>\n );\n};\n\nexport default IframeSandbox;\n"],"names":["loadBlackboardVendor","m","COMPLETE_IMAGE_TAG_PATTERN","POST_IMAGE_STREAM_DEBOUNCE_MS","SANDBOX_INTERACTION_MESSAGE_SOURCE","SANDBOX_INTERACTION_MESSAGE_TYPE","SANDBOX_INTERACTION_THROTTLE_MS","normalizeTailwindHeightTokens","className","token","parseViewportHeightCss","value","normalized","matched","extractViewportHeightFromTailwindClass","normalizedTokens","arbitraryToken","IframeSandbox","content","type","loadingText","styleLoadingText","scriptLoadingText","fullScreenButtonText","hideFullScreen","mode","containerRef","useRef","iframeRef","rootRef","docRef","updateHeightRef","setHeight","useState","resetToken","setResetToken","isFullscreen","setIsFullscreen","isBlackboardMode","prevHtmlRef","htmlContent","React","sandboxSegments","splitContentSegments","seg","renderHtmlContent","setRenderHtmlContent","prevIncomingHtmlRef","pendingHtmlRef","deferRenderTimerRef","clearDeferredRenderTimer","useEffect","prevIncomingHtml","isAppendOnlyStream","containsCompleteImage","hasRootVhHeight","rootMatch","attrs","heightAttrMatch","explicitHeightCss","styleHeightMatch","styleHeightCss","classAttrMatch","prev","iframe","doc","lastSandboxInteractionTime","notifySandboxInteraction","eventType","now","sandboxWindow","shouldBridgeSandboxInteraction","handleSandboxPointerDown","handleSandboxTouchStart","handleSandboxWheel","handleSandboxKeydown","rootEl","root","createRoot","isDestroyed","parseExplicitHeight","parentViewportHeight","numeric","parseTailwindHeightClass","viewportHeightCss","resolveExplicitHeight","container","elements","target","heightValue","parsed","classHeight","updateHeight","bodyRect","htmlRect","bodyHeight","htmlHeight","contentHeight","explicitHeight","nextHeight","scheduleHeightUpdate","inject","resizeObserver","onFullscreenChange","toggleFullscreen","jsx","SandboxApp","containerClassName","jsxs","ContentRender"],"mappings":"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"}
1
+ {"version":3,"file":"IframeSandbox.es.js","sources":["../../../src/components/ContentRender/IframeSandbox.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from \"react\";\nimport { createRoot, Root } from \"react-dom/client\";\nimport SandboxApp from \"./SandboxApp\";\nimport { splitContentSegments } from \"./utils/split-content\";\nimport ContentRender from \"./ContentRender\";\n// Lazy-load iframe vendor libraries and inject them into the sandbox document.\nconst loadBlackboardVendor = () =>\n import(\"./blackboard-vendor\").then((m) => m.injectBlackboardLibraries);\n\nconst COMPLETE_IMAGE_TAG_PATTERN = /<img\\b[^>]*>/i;\nconst POST_IMAGE_STREAM_DEBOUNCE_MS = 180;\nconst SANDBOX_INTERACTION_MESSAGE_SOURCE = \"markdown-flow-ui:sandbox\";\nconst SANDBOX_INTERACTION_MESSAGE_TYPE = \"interaction\";\nconst SANDBOX_INTERACTION_THROTTLE_MS = 240;\nexport interface IframeSandboxProps {\n content: string;\n className?: string;\n loadingText?: string;\n styleLoadingText?: string;\n scriptLoadingText?: string;\n fullScreenButtonText?: string;\n hideFullScreen?: boolean;\n mode?: \"content\" | \"blackboard\";\n type: \"sandbox\" | \"markdown\";\n}\n\nconst normalizeTailwindHeightTokens = (className: string) =>\n className\n .split(/\\s+/)\n .filter(Boolean)\n .map((token) => token.split(\":\").pop() || token);\n\nconst parseViewportHeightCss = (value: string) => {\n const normalized = value.trim().toLowerCase();\n if (!normalized) return null;\n const matched = normalized.match(/^([0-9.]+)(vh|dvh|svh|lvh)$/i);\n if (!matched) return null;\n return `${matched[1]}${matched[2].toLowerCase()}`;\n};\n\nconst extractViewportHeightFromTailwindClass = (className: string) => {\n if (!className.trim()) return null;\n const normalizedTokens = normalizeTailwindHeightTokens(className);\n if (\n normalizedTokens.includes(\"h-screen\") ||\n normalizedTokens.includes(\"h-dvh\")\n ) {\n return \"100dvh\";\n }\n if (normalizedTokens.includes(\"h-svh\")) {\n return \"100svh\";\n }\n if (normalizedTokens.includes(\"h-lvh\")) {\n return \"100lvh\";\n }\n const arbitraryToken = normalizedTokens.find((token) =>\n /^h-\\[[0-9.]+(vh|dvh|svh|lvh)\\]$/i.test(token)\n );\n if (!arbitraryToken) return null;\n const matched = arbitraryToken.match(/^h-\\[([0-9.]+)(vh|dvh|svh|lvh)\\]$/i);\n if (!matched) return null;\n return `${matched[1]}${matched[2].toLowerCase()}`;\n};\n\nconst IframeSandbox: React.FC<IframeSandboxProps> = ({\n content,\n type,\n className,\n loadingText,\n styleLoadingText,\n scriptLoadingText,\n fullScreenButtonText,\n hideFullScreen = false,\n mode = \"content\",\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const rootRef = useRef<Root | null>(null);\n const docRef = useRef<Document | null>(null);\n const updateHeightRef = useRef<() => void>(() => {});\n const [, setHeight] = useState(480);\n const [resetToken, setResetToken] = useState(0);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const isBlackboardMode = mode === \"blackboard\";\n const prevHtmlRef = useRef<string>(\"\");\n const htmlContent = React.useMemo(() => {\n const segments = splitContentSegments(content);\n // console.log('segments=====', segments);\n const sandboxSegments = segments.filter((seg) => seg.type === \"sandbox\");\n const sandboxContent =\n mode === \"blackboard\"\n ? sandboxSegments[sandboxSegments.length - 1]?.value || \"\"\n : sandboxSegments.map((seg) => seg.value).join(\"\\n\");\n return sandboxContent || \"\";\n }, [content, mode]);\n const [renderHtmlContent, setRenderHtmlContent] = useState(htmlContent);\n const prevIncomingHtmlRef = useRef(htmlContent);\n const pendingHtmlRef = useRef(htmlContent);\n const deferRenderTimerRef = useRef<number | null>(null);\n\n const clearDeferredRenderTimer = () => {\n if (deferRenderTimerRef.current === null) return;\n window.clearTimeout(deferRenderTimerRef.current);\n deferRenderTimerRef.current = null;\n };\n\n useEffect(\n () => () => {\n clearDeferredRenderTimer();\n },\n []\n );\n\n useEffect(() => {\n const prevIncomingHtml = prevIncomingHtmlRef.current;\n prevIncomingHtmlRef.current = htmlContent;\n\n const isAppendOnlyStream =\n !!prevIncomingHtml &&\n htmlContent.length > prevIncomingHtml.length &&\n htmlContent.startsWith(prevIncomingHtml);\n const containsCompleteImage = COMPLETE_IMAGE_TAG_PATTERN.test(htmlContent);\n const shouldDeferRender = isAppendOnlyStream && containsCompleteImage;\n\n if (!shouldDeferRender) {\n clearDeferredRenderTimer();\n pendingHtmlRef.current = htmlContent;\n setRenderHtmlContent(htmlContent);\n return;\n }\n\n pendingHtmlRef.current = htmlContent;\n clearDeferredRenderTimer();\n deferRenderTimerRef.current = window.setTimeout(() => {\n setRenderHtmlContent(pendingHtmlRef.current);\n deferRenderTimerRef.current = null;\n }, POST_IMAGE_STREAM_DEBOUNCE_MS);\n }, [htmlContent]);\n\n const rootViewportHeightCss = React.useMemo(() => {\n const normalized = renderHtmlContent.trim();\n if (!normalized) return null;\n const rootMatch = normalized.match(/^<([a-zA-Z][\\w:-]*)(\\s[^>]*?)?>/);\n if (!rootMatch) return null;\n const attrs = rootMatch[2] || \"\";\n const heightAttrMatch = attrs.match(/\\bheight\\s*=\\s*[\"']([^\"']+)[\"']/i);\n if (heightAttrMatch) {\n const explicitHeightCss = parseViewportHeightCss(heightAttrMatch[1]);\n if (explicitHeightCss) return explicitHeightCss;\n }\n const styleAttrMatch = attrs.match(/\\bstyle\\s*=\\s*[\"']([^\"']+)[\"']/i)?.[1];\n const styleHeightMatch = styleAttrMatch?.match(\n /\\bheight\\s*:\\s*([^;]+)/i\n )?.[1];\n if (styleHeightMatch) {\n const styleHeightCss = parseViewportHeightCss(styleHeightMatch);\n if (styleHeightCss) return styleHeightCss;\n }\n const classAttrMatch = attrs.match(/\\bclass\\s*=\\s*[\"']([^\"']+)[\"']/i)?.[1];\n if (!classAttrMatch) return null;\n return extractViewportHeightFromTailwindClass(classAttrMatch);\n }, [renderHtmlContent]);\n const hasRootVhHeight = Boolean(rootViewportHeightCss);\n useEffect(() => {\n if (mode !== \"blackboard\") {\n prevHtmlRef.current = htmlContent;\n return;\n }\n const prev = prevHtmlRef.current;\n const isContinuation = prev && htmlContent.startsWith(prev);\n if (!isContinuation && prev) {\n setResetToken((token) => token + 1);\n }\n prevHtmlRef.current = htmlContent;\n }, [htmlContent, mode]);\n\n useEffect(() => {\n const iframe = iframeRef.current;\n if (!iframe) return undefined;\n\n const doc = iframe.contentDocument;\n if (!doc) return undefined;\n\n doc.open();\n doc.write(`<!DOCTYPE html>\n<html${mode === \"blackboard\" ? ' style=\"height: 100%;\"' : \"\"}>\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <style>\n html, body, #root { width: 100%; height: 100%; }\n html, body { margin: 0; padding: 0; overflow: auto; }\n *, *::before, *::after { box-sizing: border-box; }\n </style>\n </head>\n <body>\n <div id=\"root\"></div>\n </body>\n</html>`);\n doc.close();\n\n docRef.current = doc;\n\n let lastSandboxInteractionTime = 0;\n const notifySandboxInteraction = (eventType: string) => {\n if (typeof window === \"undefined\") {\n return;\n }\n const now = Date.now();\n if (now - lastSandboxInteractionTime < SANDBOX_INTERACTION_THROTTLE_MS) {\n return;\n }\n lastSandboxInteractionTime = now;\n window.postMessage(\n {\n source: SANDBOX_INTERACTION_MESSAGE_SOURCE,\n type: SANDBOX_INTERACTION_MESSAGE_TYPE,\n eventType,\n },\n window.location.origin\n );\n };\n\n const shouldBridgeSandboxInteraction =\n isBlackboardMode && type === \"sandbox\";\n const handleSandboxPointerDown = () =>\n notifySandboxInteraction(\"pointerdown\");\n const handleSandboxTouchStart = () =>\n notifySandboxInteraction(\"touchstart\");\n\n if (shouldBridgeSandboxInteraction) {\n doc.addEventListener(\"pointerdown\", handleSandboxPointerDown, true);\n doc.addEventListener(\"touchstart\", handleSandboxTouchStart, true);\n }\n\n const rootEl = doc.getElementById(\"root\");\n if (!rootEl) return undefined;\n\n const root = createRoot(rootEl);\n rootRef.current = root;\n let isDestroyed = false;\n\n const parseExplicitHeight = (\n value: string,\n parentViewportHeight: number\n ) => {\n const normalized = value.trim().toLowerCase();\n if (!normalized) return null;\n const numeric = Number.parseFloat(normalized);\n if (Number.isNaN(numeric)) return null;\n if (/(dvh|svh|lvh|vh)$/i.test(normalized)) {\n return (numeric / 100) * parentViewportHeight;\n }\n if (normalized.endsWith(\"px\") || /^[0-9.]+$/.test(normalized)) {\n return numeric;\n }\n return null;\n };\n const parseTailwindHeightClass = (\n className: string,\n parentViewportHeight: number\n ) => {\n if (!className.trim()) return null;\n const viewportHeightCss =\n extractViewportHeightFromTailwindClass(className);\n if (viewportHeightCss) {\n return parseExplicitHeight(viewportHeightCss, parentViewportHeight);\n }\n const normalizedTokens = normalizeTailwindHeightTokens(className);\n const arbitraryToken = normalizedTokens.find((token) =>\n /^h-\\[[0-9.]+px\\]$/i.test(token)\n );\n if (!arbitraryToken) return null;\n const matched = arbitraryToken.match(/^h-\\[([0-9.]+)px\\]$/i);\n if (!matched) return null;\n const numeric = Number.parseFloat(matched[1]);\n if (Number.isNaN(numeric)) return null;\n return numeric;\n };\n\n const resolveExplicitHeight = () => {\n if (!iframeRef.current || !doc.body) return null;\n const wrapper = doc.body.querySelector(\n \".sandbox-wrapper\"\n ) as HTMLElement | null;\n const container = wrapper?.firstElementChild as HTMLElement | null;\n if (!container) return null;\n const elements = Array.from(container.children) as HTMLElement[];\n if (elements.length !== 1) return null;\n const target = elements[0];\n const heightValue = target.style.height || target.getAttribute(\"height\");\n const parentViewportHeight =\n iframeRef.current.ownerDocument?.documentElement?.clientHeight ||\n window.innerHeight;\n const parsed = heightValue\n ? parseExplicitHeight(heightValue, parentViewportHeight)\n : null;\n if (parsed !== null) {\n return Math.ceil(parsed);\n }\n const classHeight = parseTailwindHeightClass(\n target.getAttribute(\"class\") || \"\",\n parentViewportHeight\n );\n return classHeight !== null ? Math.ceil(classHeight) : null;\n };\n\n const updateHeight = () => {\n if (!iframeRef.current || !doc.body) return;\n const bodyRect = doc.body.getBoundingClientRect();\n const htmlRect = doc.documentElement?.getBoundingClientRect();\n const bodyHeight = bodyRect.height;\n const htmlHeight = htmlRect?.height || 0;\n const contentHeight = Math.max(bodyHeight, htmlHeight);\n const explicitHeight = resolveExplicitHeight();\n const nextHeight = Math.max(\n 200,\n explicitHeight ?? Math.ceil(contentHeight)\n );\n setHeight(nextHeight);\n };\n const scheduleHeightUpdate = () => {\n requestAnimationFrame(() => {\n if (isDestroyed) return;\n updateHeight();\n });\n };\n updateHeightRef.current = scheduleHeightUpdate;\n\n updateHeight();\n scheduleHeightUpdate();\n\n // Inject Tailwind/DaisyUI/GSAP into iframe for all sandbox modes.\n // Dynamic import keeps ~3.3 MB of vendor libs out of the main bundle.\n // Tailwind's MutationObserver ensures styles apply even if content renders first.\n loadBlackboardVendor()\n .then((inject) => {\n if (isDestroyed) return;\n inject(doc);\n scheduleHeightUpdate();\n })\n .catch(() => {\n if (isDestroyed) return;\n scheduleHeightUpdate();\n });\n\n const resizeObserver = new ResizeObserver(() => updateHeight());\n resizeObserver.observe(doc.body);\n if (rootEl) {\n resizeObserver.observe(rootEl);\n }\n\n return () => {\n isDestroyed = true;\n resizeObserver.disconnect();\n if (shouldBridgeSandboxInteraction) {\n doc.removeEventListener(\"pointerdown\", handleSandboxPointerDown, true);\n doc.removeEventListener(\"touchstart\", handleSandboxTouchStart, true);\n }\n // Defer unmount to avoid React warning when parent is mid-render\n setTimeout(() => {\n root.unmount();\n rootRef.current = null;\n docRef.current = null;\n updateHeightRef.current = () => {};\n }, 0);\n };\n }, []);\n\n useEffect(() => {\n const onFullscreenChange = () => {\n setIsFullscreen(Boolean(document.fullscreenElement));\n };\n document.addEventListener(\"fullscreenchange\", onFullscreenChange);\n return () =>\n document.removeEventListener(\"fullscreenchange\", onFullscreenChange);\n }, []);\n\n const toggleFullscreen = () => {\n const target = containerRef.current || iframeRef.current;\n if (!target) return;\n if (document.fullscreenElement) {\n document.exitFullscreen().catch(() => {});\n return;\n }\n if (target.requestFullscreen) {\n target.requestFullscreen().catch(() => {});\n }\n };\n\n useEffect(() => {\n const root = rootRef.current;\n if (!root) return;\n\n root.render(\n <SandboxApp\n html={renderHtmlContent}\n loadingText={loadingText}\n styleLoadingText={styleLoadingText}\n scriptLoadingText={scriptLoadingText}\n fullScreenButtonText={fullScreenButtonText}\n hideFullScreen={hideFullScreen}\n resetToken={resetToken}\n hasRootVhHeight={hasRootVhHeight}\n mode={mode}\n />\n );\n requestAnimationFrame(() => updateHeightRef.current?.());\n }, [\n renderHtmlContent,\n loadingText,\n styleLoadingText,\n scriptLoadingText,\n fullScreenButtonText,\n resetToken,\n mode,\n ]);\n const containerClassName = [\n \"w-full relative content-render-iframe-sandbox\",\n isBlackboardMode\n ? \"h-full overflow-auto flex flex-col\"\n : \"aspect-[16/9] overflow-hidden flex items-center justify-center\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div\n ref={containerRef}\n data-root-vh={hasRootVhHeight ? \"true\" : \"false\"}\n className={containerClassName}\n >\n {!hideFullScreen && (\n <button\n type=\"button\"\n onClick={toggleFullscreen}\n className={\n \"absolute top-2 right-2 z-50 p-1.5 bg-black/75 text-white rounded-md cursor-pointer\"\n }\n >\n {isFullscreen ? \"退出全屏\" : fullScreenButtonText || \"全屏浏览\"}\n </button>\n )}\n {mode === \"blackboard\" && type === \"markdown\" ? (\n <ContentRender content={content} />\n ) : (\n <iframe\n ref={iframeRef}\n sandbox=\"allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox\"\n allow=\"fullscreen\"\n allowFullScreen\n className={[className, \"w-full h-full mx-auto my-auto block\"]\n .filter(Boolean)\n .join(\" \")}\n style={{\n height: \"100%\",\n margin: \"auto\",\n }}\n />\n )}\n </div>\n );\n};\n\nexport default IframeSandbox;\n"],"names":["loadBlackboardVendor","m","COMPLETE_IMAGE_TAG_PATTERN","POST_IMAGE_STREAM_DEBOUNCE_MS","SANDBOX_INTERACTION_MESSAGE_SOURCE","SANDBOX_INTERACTION_MESSAGE_TYPE","SANDBOX_INTERACTION_THROTTLE_MS","normalizeTailwindHeightTokens","className","token","parseViewportHeightCss","value","normalized","matched","extractViewportHeightFromTailwindClass","normalizedTokens","arbitraryToken","IframeSandbox","content","type","loadingText","styleLoadingText","scriptLoadingText","fullScreenButtonText","hideFullScreen","mode","containerRef","useRef","iframeRef","rootRef","docRef","updateHeightRef","setHeight","useState","resetToken","setResetToken","isFullscreen","setIsFullscreen","isBlackboardMode","prevHtmlRef","htmlContent","React","sandboxSegments","splitContentSegments","seg","renderHtmlContent","setRenderHtmlContent","prevIncomingHtmlRef","pendingHtmlRef","deferRenderTimerRef","clearDeferredRenderTimer","useEffect","prevIncomingHtml","isAppendOnlyStream","containsCompleteImage","hasRootVhHeight","rootMatch","attrs","heightAttrMatch","explicitHeightCss","styleHeightMatch","styleHeightCss","classAttrMatch","prev","iframe","doc","lastSandboxInteractionTime","notifySandboxInteraction","eventType","now","shouldBridgeSandboxInteraction","handleSandboxPointerDown","handleSandboxTouchStart","rootEl","root","createRoot","isDestroyed","parseExplicitHeight","parentViewportHeight","numeric","parseTailwindHeightClass","viewportHeightCss","resolveExplicitHeight","container","elements","target","heightValue","parsed","classHeight","updateHeight","bodyRect","htmlRect","bodyHeight","htmlHeight","contentHeight","explicitHeight","nextHeight","scheduleHeightUpdate","inject","resizeObserver","onFullscreenChange","toggleFullscreen","jsx","SandboxApp","containerClassName","jsxs","ContentRender"],"mappings":"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"}
package/package.json CHANGED
@@ -156,7 +156,7 @@
156
156
  "storybook": "storybook dev -p 6006",
157
157
  "test": "echo \"No tests specified\" && exit 0"
158
158
  },
159
- "version": "0.1.99-beta.1",
159
+ "version": "0.1.99-beta.2",
160
160
  "type": "module",
161
161
  "exports": {
162
162
  ".": {