markdown-flow-ui 0.1.100-beta.30 → 0.1.100-beta.31
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.cjs10.js +1 -1
- package/dist/_virtual/index.cjs11.js +1 -1
- package/dist/_virtual/index.cjs12.js +1 -1
- package/dist/_virtual/index.cjs2.js +1 -1
- package/dist/_virtual/index.cjs3.js +1 -1
- package/dist/_virtual/index.cjs4.js +1 -1
- package/dist/_virtual/index.cjs7.js +1 -1
- package/dist/_virtual/index.cjs9.js +1 -1
- package/dist/_virtual/index.es10.js +3 -2
- package/dist/_virtual/index.es10.js.map +1 -1
- package/dist/_virtual/index.es11.js +2 -3
- package/dist/_virtual/index.es11.js.map +1 -1
- package/dist/_virtual/index.es12.js +2 -2
- package/dist/_virtual/index.es2.js +5 -2
- package/dist/_virtual/index.es2.js.map +1 -1
- package/dist/_virtual/index.es3.js +2 -4
- package/dist/_virtual/index.es3.js.map +1 -1
- package/dist/_virtual/index.es4.js +4 -5
- package/dist/_virtual/index.es4.js.map +1 -1
- package/dist/_virtual/index.es7.js +2 -3
- package/dist/_virtual/index.es7.js.map +1 -1
- package/dist/_virtual/index.es9.js +3 -2
- package/dist/_virtual/index.es9.js.map +1 -1
- package/dist/components/ContentRender/IframeSandbox.cjs.js +5 -5
- package/dist/components/ContentRender/IframeSandbox.cjs.js.map +1 -1
- package/dist/components/ContentRender/IframeSandbox.es.js +167 -147
- package/dist/components/ContentRender/IframeSandbox.es.js.map +1 -1
- package/dist/components/ContentRender/SandboxApp.cjs.js +1 -1
- package/dist/components/ContentRender/SandboxApp.cjs.js.map +1 -1
- package/dist/components/ContentRender/SandboxApp.es.js +4 -1
- package/dist/components/ContentRender/SandboxApp.es.js.map +1 -1
- package/dist/components/ui/inputGroup/textarea.cjs.js +1 -1
- package/dist/components/ui/inputGroup/textarea.es.js +1 -1
- package/dist/node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.cjs.js +1 -1
- package/dist/node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.cjs.js.map +1 -1
- package/dist/node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.es.js +1 -1
- package/dist/node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/index.cjs.js +1 -1
- package/dist/node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/index.es.js +1 -1
- package/dist/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/c4Diagram-YG6GDRKO.cjs.js +1 -1
- package/dist/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/c4Diagram-YG6GDRKO.cjs.js.map +1 -1
- package/dist/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/c4Diagram-YG6GDRKO.es.js +1 -1
- package/dist/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-S3R3BYOJ.cjs.js +1 -1
- package/dist/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-S3R3BYOJ.cjs.js.map +1 -1
- package/dist/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-S3R3BYOJ.es.js +1 -1
- package/dist/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-TZMSLE5B.cjs.js +1 -1
- package/dist/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-TZMSLE5B.cjs.js.map +1 -1
- package/dist/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-TZMSLE5B.es.js +1 -1
- package/dist/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/ganttDiagram-LVOFAZNH.cjs.js +1 -1
- package/dist/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/ganttDiagram-LVOFAZNH.cjs.js.map +1 -1
- package/dist/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/ganttDiagram-LVOFAZNH.es.js +1 -1
- package/dist/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/sequenceDiagram-WL72ISMW.cjs.js +1 -1
- package/dist/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/sequenceDiagram-WL72ISMW.cjs.js.map +1 -1
- package/dist/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/sequenceDiagram-WL72ISMW.es.js +1 -1
- package/dist/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/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/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/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/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/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/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/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/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/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/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/node_modules/.pnpm/react-is@18.3.1/node_modules/react-is/index.cjs.js +1 -1
- package/dist/node_modules/.pnpm/react-is@18.3.1/node_modules/react-is/index.es.js +1 -1
- package/dist/node_modules/.pnpm/remark-flow@0.1.6/node_modules/remark-flow/dist/index.cjs.js +1 -1
- package/dist/node_modules/.pnpm/remark-flow@0.1.6/node_modules/remark-flow/dist/index.es.js +1 -1
- package/dist/node_modules/.pnpm/remark-flow@0.1.6/node_modules/remark-flow/dist/remark-custom-variable.cjs.js +1 -1
- package/dist/node_modules/.pnpm/remark-flow@0.1.6/node_modules/remark-flow/dist/remark-custom-variable.es.js +1 -1
- package/dist/node_modules/.pnpm/remark-flow@0.1.6/node_modules/remark-flow/dist/remark-interaction.cjs.js +1 -1
- package/dist/node_modules/.pnpm/remark-flow@0.1.6/node_modules/remark-flow/dist/remark-interaction.es.js +1 -1
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.cjs.js");var r=e.__require();exports.distExports=r;
|
|
2
2
|
//# sourceMappingURL=index.cjs10.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={exports:{}};exports.__module=e;
|
|
2
2
|
//# sourceMappingURL=index.cjs11.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={};exports.__exports=e;
|
|
2
2
|
//# sourceMappingURL=index.cjs12.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./_commonjsHelpers.cjs.js"),r=require("../node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/index.cjs.js");var s=r.__require();const t=e.getDefaultExportFromCjs(s);exports.default=t;
|
|
2
2
|
//# sourceMappingURL=index.cjs2.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={};exports.__exports=e;
|
|
2
2
|
//# sourceMappingURL=index.cjs3.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./_commonjsHelpers.cjs.js"),
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./_commonjsHelpers.cjs.js"),t=require("../node_modules/.pnpm/unist-util-visit@5.0.0/node_modules/unist-util-visit/index.cjs.js"),r=e.getAugmentedNamespace(t);exports.default=r;
|
|
2
2
|
//# sourceMappingURL=index.cjs4.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={exports:{}};exports.__module=e;
|
|
2
2
|
//# sourceMappingURL=index.cjs7.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../node_modules/.pnpm/react-is@18.3.1/node_modules/react-is/index.cjs.js");var r=e.__require();exports.reactIsExports=r;
|
|
2
2
|
//# sourceMappingURL=index.cjs9.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es10.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.es10.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es11.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.es11.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
import { getDefaultExportFromCjs as r } from "./_commonjsHelpers.es.js";
|
|
2
|
+
import { __require as s } from "../node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/index.es.js";
|
|
3
|
+
var e = s();
|
|
4
|
+
const t = /* @__PURE__ */ r(e);
|
|
2
5
|
export {
|
|
3
|
-
|
|
6
|
+
t as default
|
|
4
7
|
};
|
|
5
8
|
//# sourceMappingURL=index.es2.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es2.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.es2.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
import * as r from "../node_modules/.pnpm/unist-util-visit@5.0.0/node_modules/unist-util-visit/index.es.js";
|
|
3
|
-
const m = /* @__PURE__ */ e(r);
|
|
1
|
+
var r = {};
|
|
4
2
|
export {
|
|
5
|
-
|
|
3
|
+
r as __exports
|
|
6
4
|
};
|
|
7
5
|
//# sourceMappingURL=index.es3.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es3.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.es3.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import
|
|
3
|
-
|
|
4
|
-
const t = /* @__PURE__ */ r(e);
|
|
1
|
+
import { getAugmentedNamespace as e } from "./_commonjsHelpers.es.js";
|
|
2
|
+
import * as r from "../node_modules/.pnpm/unist-util-visit@5.0.0/node_modules/unist-util-visit/index.es.js";
|
|
3
|
+
const m = /* @__PURE__ */ e(r);
|
|
5
4
|
export {
|
|
6
|
-
|
|
5
|
+
m as default
|
|
7
6
|
};
|
|
8
7
|
//# sourceMappingURL=index.es4.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es4.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.es4.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es7.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.es7.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es9.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.es9.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const
|
|
2
|
-
`))||""},[c,
|
|
3
|
-
<html${
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const E=require("../../_virtual/jsx-runtime.cjs.js"),n=require("react"),be=require("react-dom/client"),pe=require("./SandboxApp.cjs.js"),ge=require("./utils/split-content.cjs.js"),ve=require("./ContentRender.cjs.js"),we=()=>Promise.resolve().then(()=>require("./blackboard-vendor.cjs.js")).then(c=>c.injectBlackboardLibraries),xe=/<img\b[^>]*>/i,Ee=180,Re="markdown-flow-ui:sandbox",He="interaction",ye=240,ie=c=>c.split(/\s+/).filter(Boolean).map(s=>s.split(":").pop()||s),oe=c=>{const s=c.trim().toLowerCase();if(!s)return null;const f=s.match(/^([0-9.]+)(vh|dvh|svh|lvh)$/i);return f?`${f[1]}${f[2].toLowerCase()}`:null},se=c=>{if(!c.trim())return null;const s=ie(c);if(s.includes("h-screen")||s.includes("h-dvh"))return"100dvh";if(s.includes("h-svh"))return"100svh";if(s.includes("h-lvh"))return"100lvh";const f=s.find(T=>/^h-\[[0-9.]+(vh|dvh|svh|lvh)\]$/i.test(T));if(!f)return null;const v=f.match(/^h-\[([0-9.]+)(vh|dvh|svh|lvh)\]$/i);return v?`${v[1]}${v[2].toLowerCase()}`:null},Ce=({content:c,type:s,className:f,loadingText:v,styleLoadingText:T,scriptLoadingText:P,fullScreenButtonText:O,hideFullScreen:V=!1,mode:u="content",minAspectRatio:W=16/9,maxAspectRatio:G=4/3})=>{const _=n.useRef(null),w=n.useRef(null),I=n.useRef(null),U=n.useRef(null),R=n.useRef(()=>{}),X=n.useRef(0),[Y,ce]=n.useState(480),[M,Z]=n.useState(0),[J,le]=n.useState(0),[D,ue]=n.useState(!1),A=u==="blackboard",L=n.useRef(""),o=n.useMemo(()=>{const e=ge.splitContentSegments(c).filter(a=>a.type==="sandbox");return(u==="blackboard"?e[e.length-1]?.value||"":e.map(a=>a.value).join(`
|
|
2
|
+
`))||""},[c,u]),[k,K]=n.useState(o),Q=n.useRef(o),q=n.useRef(o),H=n.useRef(null),x=n.useCallback(t=>{if(typeof window>"u")return;const e=Date.now();e-X.current<ye||(X.current=e,window.postMessage({source:Re,type:He,eventType:t},window.location.origin))},[]),z=()=>{H.current!==null&&(window.clearTimeout(H.current),H.current=null)};n.useEffect(()=>()=>{z()},[]),n.useEffect(()=>{const t=Q.current;Q.current=o;const e=!!t&&o.length>t.length&&o.startsWith(t),r=xe.test(o);if(!(e&&r)){z(),q.current=o,K(o);return}q.current=o,z(),H.current=window.setTimeout(()=>{K(q.current),H.current=null},Ee)},[o]);const ee=!!n.useMemo(()=>{const t=k.trim();if(!t)return null;const e=t.match(/^<([a-zA-Z][\w:-]*)(\s[^>]*?)?>/);if(!e)return null;const r=e[2]||"",a=r.match(/\bheight\s*=\s*["']([^"']+)["']/i);if(a){const b=oe(a[1]);if(b)return b}const y=r.match(/\bstyle\s*=\s*["']([^"']+)["']/i)?.[1]?.match(/\bheight\s*:\s*([^;]+)/i)?.[1];if(y){const b=oe(y);if(b)return b}const m=r.match(/\bclass\s*=\s*["']([^"']+)["']/i)?.[1];return m?se(m):null},[k]);n.useEffect(()=>{if(u!=="blackboard"){L.current=o;return}const t=L.current;!(t&&o.startsWith(t))&&t&&le(r=>r+1),L.current=o},[o,u]),n.useEffect(()=>{const t=w.current;if(!t)return;const e=t.contentDocument;if(!e)return;e.open(),e.write(`<!DOCTYPE html>
|
|
3
|
+
<html${u==="blackboard"?' style="height: 100%;"':""}>
|
|
4
4
|
<head>
|
|
5
5
|
<meta charset="utf-8" />
|
|
6
6
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
7
7
|
<style>
|
|
8
8
|
html, body, #root { width: 100%; }
|
|
9
|
-
${
|
|
9
|
+
${u==="blackboard"?"html, body, #root { height: 100%; }":""}
|
|
10
10
|
html, body { margin: 0; padding: 0; overflow: auto; }
|
|
11
11
|
*, *::before, *::after { box-sizing: border-box; }
|
|
12
12
|
</style>
|
|
@@ -14,5 +14,5 @@
|
|
|
14
14
|
<body>
|
|
15
15
|
<div id="root"></div>
|
|
16
16
|
</body>
|
|
17
|
-
</html>`),e.close(),U.current=e;const
|
|
17
|
+
</html>`),e.close(),U.current=e;const r=A&&s==="sandbox",a=()=>x("pointerdown"),B=()=>x("mousedown"),y=()=>x("touchstart");r&&(e.addEventListener("pointerdown",a,!0),e.addEventListener("mousedown",B,!0),e.addEventListener("touchstart",y,!0));const m=e.getElementById("root");if(!m)return;const b=be.createRoot(m);I.current=b;let j=!1;const ne=(l,d)=>{const i=l.trim().toLowerCase();if(!i)return null;const h=Number.parseFloat(i);return Number.isNaN(h)?null:/(dvh|svh|lvh|vh)$/i.test(i)?h/100*d:i.endsWith("px")||/^[0-9.]+$/.test(i)?h:null},he=(l,d)=>{if(!l.trim())return null;const i=se(l);if(i)return ne(i,d);const p=ie(l).find(N=>/^h-\[[0-9.]+px\]$/i.test(N));if(!p)return null;const g=p.match(/^h-\[([0-9.]+)px\]$/i);if(!g)return null;const S=Number.parseFloat(g[1]);return Number.isNaN(S)?null:S},fe=()=>{if(!w.current||!e.body)return null;const d=e.body.querySelector(".sandbox-wrapper")?.firstElementChild;if(!d)return null;const i=Array.from(d.children);if(i.length!==1)return null;const h=i[0],p=h.style.height||h.getAttribute("height"),g=w.current.ownerDocument?.documentElement?.clientHeight||window.innerHeight,S=p?ne(p,g):null;if(S!==null)return Math.ceil(S);const N=he(h.getAttribute("class")||"",g);return N!==null?Math.ceil(N):null},me=()=>{if(!e.body)return 0;const l=e.body.scrollHeight,d=e.documentElement?.scrollHeight||0,h=e.body.querySelector(".sandbox-container")?.scrollHeight||0,p=m?.getBoundingClientRect(),g=p?Math.ceil(p.height):0;return Math.max(l,d,h,g)},F=()=>{if(!w.current||!e.body)return;const l=me(),d=fe(),i=Math.max(200,d??Math.ceil(l));ce(i)},C=()=>{requestAnimationFrame(()=>{j||F()})};R.current=C,F(),C(),we().then(l=>{j||(l(e),C())}).catch(()=>{j||C()});const $=new ResizeObserver(()=>F());$.observe(e.body),m&&$.observe(m);const re=new MutationObserver(()=>{C()});return re.observe(e.body,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["style","class"]}),()=>{j=!0,$.disconnect(),re.disconnect(),r&&(e.removeEventListener("pointerdown",a,!0),e.removeEventListener("mousedown",B,!0),e.removeEventListener("touchstart",y,!0)),setTimeout(()=>{b.unmount(),I.current=null,U.current=null,R.current=()=>{}},0)}},[]),n.useEffect(()=>{const t=()=>{ue(!!document.fullscreenElement)};return document.addEventListener("fullscreenchange",t),()=>document.removeEventListener("fullscreenchange",t)},[]),n.useEffect(()=>{const t=_.current;if(!t)return;const e=new ResizeObserver(r=>{Z(r[0]?.contentRect.width??t.clientWidth)});return e.observe(t),Z(t.clientWidth),()=>e.disconnect()},[]);const te=n.useMemo(()=>{if(A||M===0||D)return;const t=Math.round(M/W),e=Math.round(M/G);return{height:Math.max(t,Math.min(e,Y))}},[A,M,Y,D,W,G]),ae=()=>{const t=_.current||w.current;if(t){if(document.fullscreenElement){document.exitFullscreen().catch(()=>{});return}t.requestFullscreen&&t.requestFullscreen().catch(()=>{})}};n.useEffect(()=>{const t=I.current;if(!t)return;t.render(E.jsxRuntimeExports.jsx(pe.default,{html:k,loadingText:v,styleLoadingText:T,scriptLoadingText:P,fullScreenButtonText:O,hideFullScreen:V,resetToken:J,hasRootVhHeight:ee,mode:u})),requestAnimationFrame(()=>R.current?.());const e=setTimeout(()=>R.current?.(),100),r=setTimeout(()=>R.current?.(),500);return()=>{clearTimeout(e),clearTimeout(r)}},[k,v,T,P,O,J,u]);const de=["w-full relative content-render-iframe-sandbox",A?"h-full overflow-auto flex flex-col":te?"overflow-hidden flex items-center justify-center":"aspect-[16/9] overflow-hidden flex items-center justify-center"].filter(Boolean).join(" ");return E.jsxRuntimeExports.jsxs("div",{ref:_,"data-root-vh":ee?"true":"false",className:de,style:te,children:[!V&&E.jsxRuntimeExports.jsx("button",{type:"button",onClick:ae,className:"absolute top-2 right-2 z-50 p-1.5 bg-black/75 text-white rounded-md cursor-pointer",children:D?"退出全屏":O||"全屏浏览"}),u==="blackboard"&&s==="markdown"?E.jsxRuntimeExports.jsx("div",{onMouseDown:()=>x("mousedown"),onPointerDown:()=>x("pointerdown"),onTouchStart:()=>x("touchstart"),children:E.jsxRuntimeExports.jsx(ve.default,{content:c})}):E.jsxRuntimeExports.jsx("iframe",{ref:w,sandbox:"allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox",allow:"fullscreen",allowFullScreen:!0,className:[f,"w-full h-full mx-auto my-auto block"].filter(Boolean).join(" "),style:{height:"100%",margin:"auto"}})]})};exports.default=Ce;
|
|
18
18
|
//# sourceMappingURL=IframeSandbox.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IframeSandbox.cjs.js","sources":["../../../src/components/ContentRender/IframeSandbox.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, 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 /** Min aspect ratio for content mode (width/height). Default 16/9. Set same as maxAspectRatio to lock height. */\n minAspectRatio?: number;\n /** Max aspect ratio for content mode (width/height). Default 4/3. Set same as minAspectRatio to lock height. */\n maxAspectRatio?: number;\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 minAspectRatio = 16 / 9,\n maxAspectRatio = 4 / 3,\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 lastSandboxInteractionTimeRef = useRef(0);\n const [contentHeight, setContentHeight] = useState(480);\n const [containerWidth, setContainerWidth] = useState(0);\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 emitSandboxInteraction = useCallback((eventType: string) => {\n if (typeof window === \"undefined\") {\n return;\n }\n const now = Date.now();\n if (\n now - lastSandboxInteractionTimeRef.current <\n SANDBOX_INTERACTION_THROTTLE_MS\n ) {\n return;\n }\n lastSandboxInteractionTimeRef.current = 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 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%; }\n ${mode === \"blackboard\" ? \"html, body, #root { 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 const shouldBridgeSandboxInteraction =\n isBlackboardMode && type === \"sandbox\";\n const handleSandboxPointerDown = () =>\n emitSandboxInteraction(\"pointerdown\");\n const handleSandboxMouseDown = () => emitSandboxInteraction(\"mousedown\");\n const handleSandboxTouchStart = () => emitSandboxInteraction(\"touchstart\");\n\n if (shouldBridgeSandboxInteraction) {\n doc.addEventListener(\"pointerdown\", handleSandboxPointerDown, true);\n doc.addEventListener(\"mousedown\", handleSandboxMouseDown, 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 bodyH = doc.body.scrollHeight;\n const htmlH = doc.documentElement?.scrollHeight || 0;\n const measuredHeight = Math.max(bodyH, htmlH);\n const explicitHeight = resolveExplicitHeight();\n const nextHeight = Math.max(\n 200,\n explicitHeight ?? Math.ceil(measuredHeight)\n );\n setContentHeight(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(\"mousedown\", handleSandboxMouseDown, 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 useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n const ro = new ResizeObserver((entries) => {\n setContainerWidth(entries[0]?.contentRect.width ?? el.clientWidth);\n });\n ro.observe(el);\n setContainerWidth(el.clientWidth);\n return () => ro.disconnect();\n }, []);\n\n const contentModeStyle = useMemo<\n React.CSSProperties | undefined\n >(() => {\n if (isBlackboardMode || containerWidth === 0 || isFullscreen)\n return undefined;\n const minH = Math.round(containerWidth / minAspectRatio);\n const maxH = Math.round(containerWidth / maxAspectRatio);\n const clampedH = Math.max(minH, Math.min(maxH, contentHeight));\n return { height: clampedH };\n }, [isBlackboardMode, containerWidth, contentHeight, isFullscreen, minAspectRatio, maxAspectRatio]);\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 : contentModeStyle\n ? \"overflow-hidden flex items-center justify-center\"\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 style={contentModeStyle}\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 <div\n onMouseDown={() => emitSandboxInteraction(\"mousedown\")}\n onPointerDown={() => emitSandboxInteraction(\"pointerdown\")}\n onTouchStart={() => emitSandboxInteraction(\"touchstart\")}\n >\n <ContentRender content={content} />\n </div>\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","minAspectRatio","maxAspectRatio","containerRef","useRef","iframeRef","rootRef","docRef","updateHeightRef","lastSandboxInteractionTimeRef","contentHeight","setContentHeight","useState","containerWidth","setContainerWidth","resetToken","setResetToken","isFullscreen","setIsFullscreen","isBlackboardMode","prevHtmlRef","htmlContent","React","sandboxSegments","splitContentSegments","seg","renderHtmlContent","setRenderHtmlContent","prevIncomingHtmlRef","pendingHtmlRef","deferRenderTimerRef","emitSandboxInteraction","useCallback","eventType","now","clearDeferredRenderTimer","useEffect","prevIncomingHtml","isAppendOnlyStream","containsCompleteImage","hasRootVhHeight","rootMatch","attrs","heightAttrMatch","explicitHeightCss","styleHeightMatch","styleHeightCss","classAttrMatch","prev","iframe","doc","shouldBridgeSandboxInteraction","handleSandboxPointerDown","handleSandboxMouseDown","handleSandboxTouchStart","rootEl","root","createRoot","isDestroyed","parseExplicitHeight","parentViewportHeight","numeric","parseTailwindHeightClass","viewportHeightCss","resolveExplicitHeight","container","elements","target","heightValue","parsed","classHeight","updateHeight","bodyH","htmlH","measuredHeight","explicitHeight","nextHeight","scheduleHeightUpdate","inject","resizeObserver","onFullscreenChange","el","ro","entries","contentModeStyle","useMemo","minH","maxH","toggleFullscreen","jsx","SandboxApp","containerClassName","jsxs","ContentRender"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"IframeSandbox.cjs.js","sources":["../../../src/components/ContentRender/IframeSandbox.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, 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 /** Min aspect ratio for content mode (width/height). Default 16/9. Set same as maxAspectRatio to lock height. */\n minAspectRatio?: number;\n /** Max aspect ratio for content mode (width/height). Default 4/3. Set same as minAspectRatio to lock height. */\n maxAspectRatio?: number;\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 minAspectRatio = 16 / 9,\n maxAspectRatio = 4 / 3,\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 lastSandboxInteractionTimeRef = useRef(0);\n const [contentHeight, setContentHeight] = useState(480);\n const [containerWidth, setContainerWidth] = useState(0);\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 emitSandboxInteraction = useCallback((eventType: string) => {\n if (typeof window === \"undefined\") {\n return;\n }\n const now = Date.now();\n if (\n now - lastSandboxInteractionTimeRef.current <\n SANDBOX_INTERACTION_THROTTLE_MS\n ) {\n return;\n }\n lastSandboxInteractionTimeRef.current = 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 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%; }\n ${mode === \"blackboard\" ? \"html, body, #root { 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 const shouldBridgeSandboxInteraction =\n isBlackboardMode && type === \"sandbox\";\n const handleSandboxPointerDown = () =>\n emitSandboxInteraction(\"pointerdown\");\n const handleSandboxMouseDown = () => emitSandboxInteraction(\"mousedown\");\n const handleSandboxTouchStart = () => emitSandboxInteraction(\"touchstart\");\n\n if (shouldBridgeSandboxInteraction) {\n doc.addEventListener(\"pointerdown\", handleSandboxPointerDown, true);\n doc.addEventListener(\"mousedown\", handleSandboxMouseDown, 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 measureContentHeight = () => {\n if (!doc.body) return 0;\n // Measure from multiple sources to get the true content height:\n // 1. scrollHeight of body and html (includes overflowed content)\n const bodyScrollH = doc.body.scrollHeight;\n const htmlScrollH = doc.documentElement?.scrollHeight || 0;\n // 2. Direct measurement of the sandbox-container if present\n const sandboxContainer = doc.body.querySelector(\n \".sandbox-container\"\n ) as HTMLElement | null;\n const containerScrollH = sandboxContainer?.scrollHeight || 0;\n // 3. BoundingClientRect of rootEl for rendered dimensions\n const rootRect = rootEl?.getBoundingClientRect();\n const rootH = rootRect ? Math.ceil(rootRect.height) : 0;\n return Math.max(bodyScrollH, htmlScrollH, containerScrollH, rootH);\n };\n\n const updateHeight = () => {\n if (!iframeRef.current || !doc.body) return;\n const measuredHeight = measureContentHeight();\n const explicitHeight = resolveExplicitHeight();\n const nextHeight = Math.max(\n 200,\n explicitHeight ?? Math.ceil(measuredHeight)\n );\n setContentHeight(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 // MutationObserver as backup: detect DOM changes that ResizeObserver might miss\n // (e.g. content injected by scripts, images loading, dynamic rendering)\n const mutationObserver = new MutationObserver(() => {\n scheduleHeightUpdate();\n });\n mutationObserver.observe(doc.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: [\"style\", \"class\"],\n });\n\n return () => {\n isDestroyed = true;\n resizeObserver.disconnect();\n mutationObserver.disconnect();\n if (shouldBridgeSandboxInteraction) {\n doc.removeEventListener(\"pointerdown\", handleSandboxPointerDown, true);\n doc.removeEventListener(\"mousedown\", handleSandboxMouseDown, 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 useEffect(() => {\n const el = containerRef.current;\n if (!el) return;\n const ro = new ResizeObserver((entries) => {\n setContainerWidth(entries[0]?.contentRect.width ?? el.clientWidth);\n });\n ro.observe(el);\n setContainerWidth(el.clientWidth);\n return () => ro.disconnect();\n }, []);\n\n const contentModeStyle = useMemo<\n React.CSSProperties | undefined\n >(() => {\n if (isBlackboardMode || containerWidth === 0 || isFullscreen)\n return undefined;\n const minH = Math.round(containerWidth / minAspectRatio);\n const maxH = Math.round(containerWidth / maxAspectRatio);\n const clampedH = Math.max(minH, Math.min(maxH, contentHeight));\n return { height: clampedH };\n }, [isBlackboardMode, containerWidth, contentHeight, isFullscreen, minAspectRatio, maxAspectRatio]);\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 // SandboxApp renders content via DOM manipulation in its useEffect.\n // Schedule multiple measurements to catch async content (scripts, images, styles).\n requestAnimationFrame(() => updateHeightRef.current?.());\n const t1 = setTimeout(() => updateHeightRef.current?.(), 100);\n const t2 = setTimeout(() => updateHeightRef.current?.(), 500);\n return () => {\n clearTimeout(t1);\n clearTimeout(t2);\n };\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 : contentModeStyle\n ? \"overflow-hidden flex items-center justify-center\"\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 style={contentModeStyle}\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 <div\n onMouseDown={() => emitSandboxInteraction(\"mousedown\")}\n onPointerDown={() => emitSandboxInteraction(\"pointerdown\")}\n onTouchStart={() => emitSandboxInteraction(\"touchstart\")}\n >\n <ContentRender content={content} />\n </div>\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","minAspectRatio","maxAspectRatio","containerRef","useRef","iframeRef","rootRef","docRef","updateHeightRef","lastSandboxInteractionTimeRef","contentHeight","setContentHeight","useState","containerWidth","setContainerWidth","resetToken","setResetToken","isFullscreen","setIsFullscreen","isBlackboardMode","prevHtmlRef","htmlContent","React","sandboxSegments","splitContentSegments","seg","renderHtmlContent","setRenderHtmlContent","prevIncomingHtmlRef","pendingHtmlRef","deferRenderTimerRef","emitSandboxInteraction","useCallback","eventType","now","clearDeferredRenderTimer","useEffect","prevIncomingHtml","isAppendOnlyStream","containsCompleteImage","hasRootVhHeight","rootMatch","attrs","heightAttrMatch","explicitHeightCss","styleHeightMatch","styleHeightCss","classAttrMatch","prev","iframe","doc","shouldBridgeSandboxInteraction","handleSandboxPointerDown","handleSandboxMouseDown","handleSandboxTouchStart","rootEl","root","createRoot","isDestroyed","parseExplicitHeight","parentViewportHeight","numeric","parseTailwindHeightClass","viewportHeightCss","resolveExplicitHeight","container","elements","target","heightValue","parsed","classHeight","measureContentHeight","bodyScrollH","htmlScrollH","containerScrollH","rootRect","rootH","updateHeight","measuredHeight","explicitHeight","nextHeight","scheduleHeightUpdate","inject","resizeObserver","mutationObserver","onFullscreenChange","el","ro","entries","contentModeStyle","useMemo","minH","maxH","toggleFullscreen","jsx","SandboxApp","t1","t2","containerClassName","jsxs","ContentRender"],"mappings":"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"}
|