markdown-flow-ui 0.1.106-beta.7 → 0.1.106-beta.8

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 (63) hide show
  1. package/dist/_virtual/index.cjs10.js +1 -1
  2. package/dist/_virtual/index.cjs11.js +1 -1
  3. package/dist/_virtual/index.cjs4.js +1 -1
  4. package/dist/_virtual/index.cjs5.js +1 -1
  5. package/dist/_virtual/index.cjs6.js +1 -1
  6. package/dist/_virtual/index.cjs7.js +1 -1
  7. package/dist/_virtual/index.cjs8.js +1 -1
  8. package/dist/_virtual/index.cjs9.js +1 -1
  9. package/dist/_virtual/index.es10.js +3 -2
  10. package/dist/_virtual/index.es10.js.map +1 -1
  11. package/dist/_virtual/index.es11.js +2 -3
  12. package/dist/_virtual/index.es11.js.map +1 -1
  13. package/dist/_virtual/index.es4.js +4 -4
  14. package/dist/_virtual/index.es5.js +4 -4
  15. package/dist/_virtual/index.es6.js +5 -5
  16. package/dist/_virtual/index.es7.js +2 -2
  17. package/dist/_virtual/index.es8.js +2 -3
  18. package/dist/_virtual/index.es8.js.map +1 -1
  19. package/dist/_virtual/index.es9.js +3 -2
  20. package/dist/_virtual/index.es9.js.map +1 -1
  21. package/dist/components/ContentRender/IframeSandbox.cjs.js +5 -13
  22. package/dist/components/ContentRender/IframeSandbox.cjs.js.map +1 -1
  23. package/dist/components/ContentRender/IframeSandbox.es.js +176 -213
  24. package/dist/components/ContentRender/IframeSandbox.es.js.map +1 -1
  25. package/dist/components/Slide/Slide.cjs.js +1 -1
  26. package/dist/components/Slide/Slide.cjs.js.map +1 -1
  27. package/dist/components/Slide/Slide.es.js +335 -344
  28. package/dist/components/Slide/Slide.es.js.map +1 -1
  29. package/dist/components/ui/inputGroup/textarea.cjs.js +1 -1
  30. package/dist/components/ui/inputGroup/textarea.es.js +1 -1
  31. package/dist/markdown-flow-ui/node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.cjs.js +1 -1
  32. package/dist/markdown-flow-ui/node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.cjs.js.map +1 -1
  33. package/dist/markdown-flow-ui/node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.es.js +1 -1
  34. package/dist/markdown-flow-ui/node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/index.cjs.js +1 -1
  35. package/dist/markdown-flow-ui/node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/index.es.js +1 -1
  36. package/dist/markdown-flow-ui/node_modules/.pnpm/hast-util-to-jsx-runtime@2.3.6/node_modules/hast-util-to-jsx-runtime/lib/index.cjs.js +1 -1
  37. package/dist/markdown-flow-ui/node_modules/.pnpm/hast-util-to-jsx-runtime@2.3.6/node_modules/hast-util-to-jsx-runtime/lib/index.es.js +1 -1
  38. package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/c4Diagram-YG6GDRKO.cjs.js +1 -1
  39. package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/c4Diagram-YG6GDRKO.es.js +1 -1
  40. package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-S3R3BYOJ.cjs.js +1 -1
  41. package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-S3R3BYOJ.es.js +1 -1
  42. package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-TZMSLE5B.cjs.js +1 -1
  43. package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-TZMSLE5B.es.js +1 -1
  44. package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/ganttDiagram-LVOFAZNH.cjs.js +1 -1
  45. package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/ganttDiagram-LVOFAZNH.es.js +1 -1
  46. package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/sequenceDiagram-WL72ISMW.cjs.js +1 -1
  47. package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/sequenceDiagram-WL72ISMW.es.js +1 -1
  48. package/dist/markdown-flow-ui/node_modules/.pnpm/rc-input@1.8.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-input/es/BaseInput.cjs.js +1 -1
  49. package/dist/markdown-flow-ui/node_modules/.pnpm/rc-input@1.8.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-input/es/BaseInput.es.js +1 -1
  50. package/dist/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/ResizableTextArea.cjs.js +1 -1
  51. package/dist/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/ResizableTextArea.es.js +1 -1
  52. package/dist/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/TextArea.cjs.js +1 -1
  53. package/dist/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/TextArea.es.js +1 -1
  54. package/dist/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/index.cjs.js +1 -1
  55. package/dist/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/index.es.js +1 -1
  56. package/dist/markdown-flow-ui/node_modules/.pnpm/rc-util@5.44.4_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-util/es/ref.cjs.js +1 -1
  57. package/dist/markdown-flow-ui/node_modules/.pnpm/rc-util@5.44.4_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-util/es/ref.es.js +1 -1
  58. package/dist/markdown-flow-ui/node_modules/.pnpm/style-to-object@1.0.11/node_modules/style-to-object/cjs/index.cjs.js +1 -1
  59. package/dist/markdown-flow-ui/node_modules/.pnpm/style-to-object@1.0.11/node_modules/style-to-object/cjs/index.es.js +1 -1
  60. package/dist/markdown-flow-ui/node_modules/.pnpm/unified@11.0.5/node_modules/unified/lib/index.cjs.js +1 -1
  61. package/dist/markdown-flow-ui/node_modules/.pnpm/unified@11.0.5/node_modules/unified/lib/index.es.js +1 -1
  62. package/dist/markdown-flow-ui-lib.css +1 -1
  63. package/package.json +1 -1
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={exports:{}};exports.__module=e;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../markdown-flow-ui/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.cjs10.js.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../markdown-flow-ui/node_modules/.pnpm/react-is@18.3.1/node_modules/react-is/index.cjs.js");var r=e.__require();exports.reactIsExports=r;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={};exports.__exports=e;
2
2
  //# sourceMappingURL=index.cjs11.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"),r=require("../markdown-flow-ui/node_modules/.pnpm/style-to-js@1.1.18/node_modules/style-to-js/cjs/index.cjs.js");var t=r.__require();const o=e.getDefaultExportFromCjs(t);exports.default=o;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./_commonjsHelpers.cjs.js"),r=require("../markdown-flow-ui/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.cjs4.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"),t=require("../markdown-flow-ui/node_modules/.pnpm/extend@3.0.2/node_modules/extend/index.cjs.js");var r=t.__require();const o=e.getDefaultExportFromCjs(r);exports.default=o;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./_commonjsHelpers.cjs.js"),r=require("../markdown-flow-ui/node_modules/.pnpm/style-to-js@1.1.18/node_modules/style-to-js/cjs/index.cjs.js");var t=r.__require();const o=e.getDefaultExportFromCjs(t);exports.default=o;
2
2
  //# sourceMappingURL=index.cjs5.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"),r=require("../markdown-flow-ui/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;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./_commonjsHelpers.cjs.js"),t=require("../markdown-flow-ui/node_modules/.pnpm/extend@3.0.2/node_modules/extend/index.cjs.js");var r=t.__require();const o=e.getDefaultExportFromCjs(r);exports.default=o;
2
2
  //# sourceMappingURL=index.cjs6.js.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={};exports.__exports=e;
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"});const e=require("../markdown-flow-ui/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;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={};exports.__exports=e;
2
2
  //# sourceMappingURL=index.cjs8.js.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={};exports.__exports=e;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../markdown-flow-ui/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.cjs9.js.map
@@ -1,5 +1,6 @@
1
- var s = { exports: {} };
1
+ import { __require as r } from "../markdown-flow-ui/node_modules/.pnpm/react-is@18.3.1/node_modules/react-is/index.es.js";
2
+ var a = r();
2
3
  export {
3
- s as __module
4
+ a as r
4
5
  };
5
6
  //# sourceMappingURL=index.es10.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,6 +1,5 @@
1
- import { __require as r } from "../markdown-flow-ui/node_modules/.pnpm/react-is@18.3.1/node_modules/react-is/index.es.js";
2
- var a = r();
1
+ var r = {};
3
2
  export {
4
- a as r
3
+ r as __exports
5
4
  };
6
5
  //# sourceMappingURL=index.es11.js.map
@@ -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,8 +1,8 @@
1
1
  import { getDefaultExportFromCjs as r } from "./_commonjsHelpers.es.js";
2
- import { __require as o } from "../markdown-flow-ui/node_modules/.pnpm/style-to-js@1.1.18/node_modules/style-to-js/cjs/index.es.js";
3
- var t = o();
4
- const a = /* @__PURE__ */ r(t);
2
+ import { __require as s } from "../markdown-flow-ui/node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/index.es.js";
3
+ var e = s();
4
+ const t = /* @__PURE__ */ r(e);
5
5
  export {
6
- a as default
6
+ t as default
7
7
  };
8
8
  //# sourceMappingURL=index.es4.js.map
@@ -1,7 +1,7 @@
1
- import { getDefaultExportFromCjs as e } from "./_commonjsHelpers.es.js";
2
- import { __require as r } from "../markdown-flow-ui/node_modules/.pnpm/extend@3.0.2/node_modules/extend/index.es.js";
3
- var t = r();
4
- const a = /* @__PURE__ */ e(t);
1
+ import { getDefaultExportFromCjs as r } from "./_commonjsHelpers.es.js";
2
+ import { __require as o } from "../markdown-flow-ui/node_modules/.pnpm/style-to-js@1.1.18/node_modules/style-to-js/cjs/index.es.js";
3
+ var t = o();
4
+ const a = /* @__PURE__ */ r(t);
5
5
  export {
6
6
  a as default
7
7
  };
@@ -1,8 +1,8 @@
1
- import { getDefaultExportFromCjs as r } from "./_commonjsHelpers.es.js";
2
- import { __require as s } from "../markdown-flow-ui/node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/index.es.js";
3
- var e = s();
4
- const t = /* @__PURE__ */ r(e);
1
+ import { getDefaultExportFromCjs as e } from "./_commonjsHelpers.es.js";
2
+ import { __require as r } from "../markdown-flow-ui/node_modules/.pnpm/extend@3.0.2/node_modules/extend/index.es.js";
3
+ var t = r();
4
+ const a = /* @__PURE__ */ e(t);
5
5
  export {
6
- t as default
6
+ a as default
7
7
  };
8
8
  //# sourceMappingURL=index.es6.js.map
@@ -1,5 +1,5 @@
1
- var r = {};
1
+ var s = { exports: {} };
2
2
  export {
3
- r as __exports
3
+ s as __module
4
4
  };
5
5
  //# sourceMappingURL=index.es7.js.map
@@ -1,6 +1,5 @@
1
- import { __require as r } from "../markdown-flow-ui/node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.es.js";
2
- var i = r();
1
+ var r = {};
3
2
  export {
4
- i as d
3
+ r as __exports
5
4
  };
6
5
  //# sourceMappingURL=index.es8.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es8.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
1
+ {"version":3,"file":"index.es8.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,5 +1,6 @@
1
- var r = {};
1
+ import { __require as r } from "../markdown-flow-ui/node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.es.js";
2
+ var i = r();
2
3
  export {
3
- r as __exports
4
+ i as d
4
5
  };
5
6
  //# sourceMappingURL=index.es9.js.map
@@ -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,25 +1,17 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const x=require("../../_virtual/jsx-runtime.cjs.js"),e=require("react"),Re=require("react-dom/client"),Ee=require("./SandboxApp.cjs.js"),He=require("./ContentRender.cjs.js"),m=require("./utils/iframe-viewport-height.cjs.js"),ae=require("../../lib/sandboxInteraction.cjs.js");let z=null;const ve=()=>(z||(z=Promise.resolve().then(()=>require("./blackboard-vendor.cjs.js")).then(c=>c.injectBlackboardLibraries)),z),Se=/<img\b[^>]*>/i,Ce=180,ye=240,Te=({className:c,promoteScrollToParent:u})=>{const g=c.split(/\s+/).filter(Boolean),p=g.some(a=>{const r=a.split(":"),l=r[r.length-1];return l==="h-screen"||l==="min-h-screen"});return g.flatMap(a=>{const r=a.split(":"),l=r.length-1,i=r[l];if(!u)return i!=="h-screen"&&i!=="min-h-screen"?[a]:(r[l]="h-full",[r.join(":")]);if(i==="h-screen"||i==="min-h-screen")return r[l]="min-h-full",[r.join(":")];if(i==="overflow-y-auto")return r[l]="overflow-y-visible",[r.join(":")];if(i==="overflow-auto"&&p){const y=r.slice(0,-1);return[[...y,"overflow-x-auto"].join(":"),[...y,"overflow-y-visible"].join(":")]}return[a]}).join(" ")},Me=({html:c,enabled:u,promoteScrollToParent:g})=>!u||!c.trim()?c:c.replace(/\bclass\s*=\s*(["'])([^"']*)\1/gi,(p,a,r)=>{const l=Te({className:r,promoteScrollToParent:g});return l===r?p:`class=${a}${l}${a}`}),Ae=({content:c,type:u,className:g,styleLoadingText:p,scriptLoadingText:a,fullScreenButtonText:r,hideFullScreen:l=!1,mode:i="content",replaceRootScreenHeightWithFull:y=!1})=>{const U=e.useRef(null),b=e.useRef(null),N=e.useRef(null),O=e.useRef(()=>{}),[X,he]=e.useState(480),Y=e.useRef(0),[W,de]=e.useState(0),[fe,me]=e.useState(!1),ge=u==="sandbox",T=i==="blackboard",R=T&&u==="sandbox",d=R&&y,h=d,P=e.useRef(""),M=e.useMemo(()=>u==="sandbox"?c:"",[c,u]),o=e.useMemo(()=>Me({html:M,enabled:d,promoteScrollToParent:h}),[M,d,h]),J=e.useMemo(()=>d?m.inspectViewportHeightFromHtmlRootString(M):m.EMPTY_ROOT_HEIGHT_META,[M,d]),K=e.useMemo(()=>!h&&d&&J.hasFullViewportHeight,[J.hasFullViewportHeight,h,d]),[A,Q]=e.useState(o),Z=e.useRef(o),B=e.useRef(o),E=e.useRef(null),H=e.useRef(null),ee=e.useRef(null),te=e.useCallback(n=>{if(typeof window>"u")return;const t=Date.now();t-Y.current<ye||(Y.current=t,window.postMessage({source:ae.SANDBOX_INTERACTION_MESSAGE_SOURCE,type:ae.SANDBOX_INTERACTION_MESSAGE_TYPE,eventType:n},window.location.origin))},[]),q=()=>{E.current!==null&&(window.clearTimeout(E.current),E.current=null)},pe=()=>{H.current!==null&&(window.cancelAnimationFrame(H.current),H.current=null)};e.useEffect(()=>()=>{q(),pe()},[]),e.useEffect(()=>{const n=Z.current;Z.current=o;const t=!!n&&o.length>n.length&&o.startsWith(n),w=Se.test(o);if(!(t&&w)){q(),B.current=o,Q(o);return}B.current=o,q(),E.current=window.setTimeout(()=>{Q(B.current),E.current=null},Ce)},[o]);const j=e.useMemo(()=>R?m.inspectViewportHeightFromHtmlRootString(A).viewportHeightCss:null,[A,R]);e.useEffect(()=>{ee.current=j},[j]);const ne=!!j,v=T&&u==="sandbox"?h?`${X}px`:K?"100%":j??`${X}px`:void 0;e.useEffect(()=>{if(i!=="blackboard"){P.current=o;return}const n=P.current;!(n&&o.startsWith(n))&&n&&de(w=>w+1),P.current=o},[i,o]),e.useEffect(()=>{const n=b.current;if(!n)return;const t=n.contentDocument;if(!t)return;t.open(),t.write(`<!DOCTYPE html>
2
- <html${i==="blackboard"?' style="height: 100%;"':""}>
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const g=require("../../_virtual/jsx-runtime.cjs.js"),e=require("react"),we=require("react-dom/client"),xe=require("./SandboxApp.cjs.js"),Ee=require("./ContentRender.cjs.js"),h=require("./utils/iframe-viewport-height.cjs.js"),le=require("../../lib/sandboxInteraction.cjs.js");let z=null;const He=()=>(z||(z=Promise.resolve().then(()=>require("./blackboard-vendor.cjs.js")).then(l=>l.injectBlackboardLibraries)),z),Ce=/<img\b[^>]*>/i,ve=180,Se=240,Ae=l=>l.split(/\s+/).filter(Boolean).map(i=>{const s=i.split(":");return s[s.length-1]!=="h-screen"&&s[s.length-1]!=="min-h-screen"?i:(s[s.length-1]="h-full",s.join(":"))}).join(" "),Me=(l,i)=>!i||!l.trim()?l:l.replace(/^(\s*<[a-zA-Z][\w:-]*)(\s[^>]*?)?>/,(s,C,p="")=>{const c=p.match(/\bclass\s*=\s*(["'])([^"']*)\1/i);if(!c)return s;const v=Ae(c[2]);return v===c[2]?s:`${C}${p.replace(c[0],`class=${c[1]}${v}${c[1]}`)}>`}),ye=({content:l,type:i,className:s,styleLoadingText:C,scriptLoadingText:p,fullScreenButtonText:c,hideFullScreen:v=!1,mode:u="content",replaceRootScreenHeightWithFull:ce=!1})=>{const G=e.useRef(null),d=e.useRef(null),N=e.useRef(null),_=e.useRef(()=>{}),[ue,ae]=e.useState(480),L=e.useRef(0),[U,he]=e.useState(0),[de,fe]=e.useState(!1),me=i==="sandbox",S=u==="blackboard",b=S&&i==="sandbox",f=b&&ce,V=e.useRef(""),A=e.useMemo(()=>i==="sandbox"?l:"",[l,i]),r=e.useMemo(()=>Me(A,f),[A,f]),W=e.useMemo(()=>f?h.inspectViewportHeightFromHtmlRootString(A):h.EMPTY_ROOT_HEIGHT_META,[A,f]),X=e.useMemo(()=>f&&W.hasFullViewportHeight,[W.hasFullViewportHeight,f]),[M,Y]=e.useState(r),Z=e.useRef(r),O=e.useRef(r),R=e.useRef(null),w=e.useRef(null),J=e.useRef(null),K=e.useCallback(n=>{if(typeof window>"u")return;const t=Date.now();t-L.current<Se||(L.current=t,window.postMessage({source:le.SANDBOX_INTERACTION_MESSAGE_SOURCE,type:le.SANDBOX_INTERACTION_MESSAGE_TYPE,eventType:n},window.location.origin))},[]),B=()=>{R.current!==null&&(window.clearTimeout(R.current),R.current=null)},ge=()=>{w.current!==null&&(window.cancelAnimationFrame(w.current),w.current=null)};e.useEffect(()=>()=>{B(),ge()},[]),e.useEffect(()=>{const n=Z.current;Z.current=r;const t=!!n&&r.length>n.length&&r.startsWith(n),m=Ce.test(r);if(!(t&&m)){B(),O.current=r,Y(r);return}O.current=r,B(),R.current=window.setTimeout(()=>{Y(O.current),R.current=null},ve)},[r]);const y=e.useMemo(()=>b?h.inspectViewportHeightFromHtmlRootString(M).viewportHeightCss:null,[M,b]);e.useEffect(()=>{J.current=y},[y]);const Q=!!y,x=S&&i==="sandbox"?X?"100%":y??`${ue}px`:void 0;e.useEffect(()=>{if(u!=="blackboard"){V.current=r;return}const n=V.current;!(n&&r.startsWith(n))&&n&&he(m=>m+1),V.current=r},[u,r]),e.useEffect(()=>{const n=d.current;if(!n)return;const t=n.contentDocument;if(!t)return;t.open(),t.write(`<!DOCTYPE html>
2
+ <html${u==="blackboard"?' style="height: 100%;"':""}>
3
3
  <head>
4
4
  <meta charset="utf-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <style>
7
7
  :root { color-scheme: light; }
8
- html, body, #root {
9
- width: 100%;
10
- height: ${h?"auto":"100%"};
11
- min-height: 100%;
12
- }
13
- html, body {
14
- margin: 0;
15
- padding: 0;
16
- overflow: ${h?"hidden":"auto"};
17
- }
8
+ html, body, #root { width: 100%; height: 100%; }
9
+ html, body { margin: 0; padding: 0; overflow: auto; }
18
10
  *, *::before, *::after { box-sizing: border-box; }
19
11
  </style>
20
12
  </head>
21
13
  <body>
22
14
  <div id="root"></div>
23
15
  </body>
24
- </html>`),t.close(),t.documentElement.setAttribute("data-theme","light"),t.documentElement.style.colorScheme="light",t.body?.style.setProperty("color-scheme","light");const w=T&&u==="sandbox",D=()=>te("click");w&&t.addEventListener("click",D,!0);const I=t.getElementById("root");if(!I)return;const re=Re.createRoot(I);N.current=re;let S=!1;const oe=s=>({heightAttrValue:s.getAttribute("height"),styleAttrValue:s.getAttribute("style"),classAttrValue:s.getAttribute("class")}),ie=s=>{const f=Array.from(s.children);return f.length===1?f[0]:null},xe=()=>{if(!R||!b.current||!t.body)return null;const s=b.current.ownerDocument?.documentElement?.clientHeight||window.innerHeight,f=ee.current,k=f?m.parseExplicitHeight(f,s):null;if(k!==null)return Math.ceil(k);const _=t.body.querySelector(".sandbox-wrapper")?.firstElementChild;if(!_)return null;const F=Array.from(_.children),C=F.length===1?F[0]:null,le=m.inspectViewportHeightFromNodeChain(C,{getNode:oe,getSingleChild:ie}).viewportHeightCss;if(le){const ue=m.parseExplicitHeight(le,s);if(ue!==null)return Math.ceil(ue)}const ce=m.resolveExplicitHeightFromNodeChain(C,s,{getNode:oe,getSingleChild:ie});return ce!==null?Math.ceil(ce):null},$=()=>{if(!R||!b.current||!t.body)return;const s=t.body.getBoundingClientRect(),f=t.documentElement?.getBoundingClientRect(),k=s.height,se=f?.height||0,_=Math.max(k,se),F=xe(),C=Math.max(200,F??Math.ceil(_));he(G=>G===C?G:C)},V=()=>{requestAnimationFrame(()=>{S||$()})};O.current=V,$(),V(),ge&&ve().then(s=>{S||(s(t),requestAnimationFrame(()=>{S||V()}))}).catch(()=>{S||V()});const L=new ResizeObserver(()=>$());return L.observe(t.body),I&&L.observe(I),()=>{S=!0,L.disconnect(),w&&t.removeEventListener("click",D,!0),setTimeout(()=>{re.unmount(),N.current=null,O.current=()=>{}},0)}},[]),e.useEffect(()=>{const n=()=>{me(!!document.fullscreenElement)};return document.addEventListener("fullscreenchange",n),()=>document.removeEventListener("fullscreenchange",n)},[]);const be=()=>{const n=U.current||b.current;if(n){if(document.fullscreenElement){document.exitFullscreen().catch(()=>{});return}n.requestFullscreen&&n.requestFullscreen().catch(()=>{})}};e.useEffect(()=>{const n=N.current;n&&(n.render(x.jsxRuntimeExports.jsx(Ee.default,{html:A,styleLoadingText:p,scriptLoadingText:a,resetToken:W,hasRootVhHeight:ne,mode:i,stretchRootHeight:K&&!h})),H.current=window.requestAnimationFrame(()=>{O.current?.(),H.current=null}))},[A,p,a,W,i]);const we=["w-full relative content-render-iframe-sandbox",T?"h-full overflow-auto flex flex-col":"aspect-[16/9] overflow-hidden flex items-center justify-center"].filter(Boolean).join(" ");return x.jsxRuntimeExports.jsxs("div",{ref:U,"data-root-vh":ne?"true":"false",className:we,style:v?{height:v,minHeight:v}:void 0,children:[!l&&x.jsxRuntimeExports.jsx("button",{type:"button",onClick:be,className:"absolute top-2 right-2 z-50 p-1.5 bg-black/75 text-white rounded-md cursor-pointer",children:fe?"退出全屏":r||"全屏浏览"}),i==="blackboard"&&u==="markdown"?x.jsxRuntimeExports.jsx("div",{onClick:()=>te("click"),children:x.jsxRuntimeExports.jsx(He.default,{content:c})}):x.jsxRuntimeExports.jsx("iframe",{ref:b,sandbox:"allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox",allow:"fullscreen",allowFullScreen:!0,className:[g,"w-full h-full mx-auto my-auto block"].filter(Boolean).join(" "),style:{height:v??"100%",minHeight:v,margin:"auto",visibility:"visible"}})]})};exports.default=Ae;
16
+ </html>`),t.close(),t.documentElement.setAttribute("data-theme","light"),t.documentElement.style.colorScheme="light",t.body?.style.setProperty("color-scheme","light");const m=S&&i==="sandbox",q=()=>K("click");m&&t.addEventListener("click",q,!0);const T=t.getElementById("root");if(!T)return;const ee=we.createRoot(T);N.current=ee;let E=!1;const te=o=>({heightAttrValue:o.getAttribute("height"),styleAttrValue:o.getAttribute("style"),classAttrValue:o.getAttribute("class")}),ne=o=>{const a=Array.from(o.children);return a.length===1?a[0]:null},Re=()=>{if(!b||!d.current||!t.body)return null;const o=d.current.ownerDocument?.documentElement?.clientHeight||window.innerHeight,a=J.current,j=a?h.parseExplicitHeight(a,o):null;if(j!==null)return Math.ceil(j);const k=t.body.querySelector(".sandbox-wrapper")?.firstElementChild;if(!k)return null;const F=Array.from(k.children),H=F.length===1?F[0]:null,oe=h.inspectViewportHeightFromNodeChain(H,{getNode:te,getSingleChild:ne}).viewportHeightCss;if(oe){const se=h.parseExplicitHeight(oe,o);if(se!==null)return Math.ceil(se)}const ie=h.resolveExplicitHeightFromNodeChain(H,o,{getNode:te,getSingleChild:ne});return ie!==null?Math.ceil(ie):null},P=()=>{if(!b||!d.current||!t.body)return;const o=t.body.getBoundingClientRect(),a=t.documentElement?.getBoundingClientRect(),j=o.height,re=a?.height||0,k=Math.max(j,re),F=Re(),H=Math.max(200,F??Math.ceil(k));ae($=>$===H?$:H)},I=()=>{requestAnimationFrame(()=>{E||P()})};_.current=I,P(),I(),me&&He().then(o=>{E||(o(t),requestAnimationFrame(()=>{E||I()}))}).catch(()=>{E||I()});const D=new ResizeObserver(()=>P());return D.observe(t.body),T&&D.observe(T),()=>{E=!0,D.disconnect(),m&&t.removeEventListener("click",q,!0),setTimeout(()=>{ee.unmount(),N.current=null,_.current=()=>{}},0)}},[]),e.useEffect(()=>{const n=()=>{fe(!!document.fullscreenElement)};return document.addEventListener("fullscreenchange",n),()=>document.removeEventListener("fullscreenchange",n)},[]);const pe=()=>{const n=G.current||d.current;if(n){if(document.fullscreenElement){document.exitFullscreen().catch(()=>{});return}n.requestFullscreen&&n.requestFullscreen().catch(()=>{})}};e.useEffect(()=>{const n=N.current;n&&(n.render(g.jsxRuntimeExports.jsx(xe.default,{html:M,styleLoadingText:C,scriptLoadingText:p,resetToken:U,hasRootVhHeight:Q,mode:u,stretchRootHeight:X})),w.current=window.requestAnimationFrame(()=>{_.current?.(),w.current=null}))},[M,C,p,U,u]);const be=["w-full relative content-render-iframe-sandbox",S?"h-full overflow-auto flex flex-col":"aspect-[16/9] overflow-hidden flex items-center justify-center"].filter(Boolean).join(" ");return g.jsxRuntimeExports.jsxs("div",{ref:G,"data-root-vh":Q?"true":"false",className:be,style:x?{height:x,minHeight:x}:void 0,children:[!v&&g.jsxRuntimeExports.jsx("button",{type:"button",onClick:pe,className:"absolute top-2 right-2 z-50 p-1.5 bg-black/75 text-white rounded-md cursor-pointer",children:de?"退出全屏":c||"全屏浏览"}),u==="blackboard"&&i==="markdown"?g.jsxRuntimeExports.jsx("div",{onClick:()=>K("click"),children:g.jsxRuntimeExports.jsx(Ee.default,{content:l})}):g.jsxRuntimeExports.jsx("iframe",{ref:d,sandbox:"allow-scripts allow-same-origin allow-popups allow-popups-to-escape-sandbox",allow:"fullscreen",allowFullScreen:!0,className:[s,"w-full h-full mx-auto my-auto block"].filter(Boolean).join(" "),style:{height:x??"100%",minHeight:x,margin:"auto",visibility:"visible"}})]})};exports.default=ye;
25
17
  //# 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, useRef, useState } from \"react\";\nimport { createRoot, Root } from \"react-dom/client\";\nimport SandboxApp from \"./SandboxApp\";\nimport ContentRender from \"./ContentRender\";\nimport {\n EMPTY_ROOT_HEIGHT_META,\n inspectViewportHeightFromHtmlRootString,\n inspectViewportHeightFromNodeChain,\n parseExplicitHeight,\n resolveExplicitHeightFromNodeChain,\n} from \"./utils/iframe-viewport-height\";\nimport {\n SANDBOX_INTERACTION_MESSAGE_SOURCE,\n SANDBOX_INTERACTION_MESSAGE_TYPE,\n} from \"../../lib/sandboxInteraction\";\n\ntype InjectBlackboardLibraries =\n typeof import(\"./blackboard-vendor\").injectBlackboardLibraries;\n\n// Cache the sandbox vendor loader so every iframe reuses the same preload request.\nlet blackboardVendorPromise: Promise<InjectBlackboardLibraries> | null = null;\n\nconst loadBlackboardVendor = () => {\n if (!blackboardVendorPromise) {\n blackboardVendorPromise = import(\"./blackboard-vendor\").then(\n (m) => m.injectBlackboardLibraries\n );\n }\n\n return blackboardVendorPromise;\n};\n\nconst COMPLETE_IMAGE_TAG_PATTERN = /<img\\b[^>]*>/i;\nconst POST_IMAGE_STREAM_DEBOUNCE_MS = 180;\nconst SANDBOX_INTERACTION_THROTTLE_MS = 240;\n\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 replaceRootScreenHeightWithFull?: boolean;\n}\n\nconst replaceViewportLayoutTokens = ({\n className,\n promoteScrollToParent,\n}: {\n className: string;\n promoteScrollToParent: boolean;\n}) => {\n const tokens = className.split(/\\s+/).filter(Boolean);\n const hasViewportHeightToken = tokens.some((token) => {\n const segments = token.split(\":\");\n const lastSegment = segments[segments.length - 1];\n\n return lastSegment === \"h-screen\" || lastSegment === \"min-h-screen\";\n });\n\n return tokens\n .flatMap((token) => {\n const segments = token.split(\":\");\n const lastSegmentIndex = segments.length - 1;\n const lastSegment = segments[lastSegmentIndex];\n\n if (!promoteScrollToParent) {\n if (\n lastSegment !== \"h-screen\" &&\n lastSegment !== \"min-h-screen\"\n ) {\n return [token];\n }\n\n segments[lastSegmentIndex] = \"h-full\";\n return [segments.join(\":\")];\n }\n\n if (\n lastSegment === \"h-screen\" ||\n lastSegment === \"min-h-screen\"\n ) {\n segments[lastSegmentIndex] = \"min-h-full\";\n return [segments.join(\":\")];\n }\n\n if (lastSegment === \"overflow-y-auto\") {\n segments[lastSegmentIndex] = \"overflow-y-visible\";\n return [segments.join(\":\")];\n }\n\n if (lastSegment === \"overflow-auto\" && hasViewportHeightToken) {\n const prefix = segments.slice(0, -1);\n\n return [\n [...prefix, \"overflow-x-auto\"].join(\":\"),\n [...prefix, \"overflow-y-visible\"].join(\":\"),\n ];\n }\n\n return [token];\n })\n .join(\" \");\n};\n\nconst replaceViewportLayoutClasses = ({\n html,\n enabled,\n promoteScrollToParent,\n}: {\n html: string;\n enabled: boolean;\n promoteScrollToParent: boolean;\n}) => {\n if (!enabled || !html.trim()) {\n return html;\n }\n\n return html.replace(\n /\\bclass\\s*=\\s*([\"'])([^\"']*)\\1/gi,\n (match, quote: string, className: string) => {\n const nextClassName = replaceViewportLayoutTokens({\n className,\n promoteScrollToParent,\n });\n\n if (nextClassName === className) {\n return match;\n }\n\n return `class=${quote}${nextClassName}${quote}`;\n }\n );\n};\n\nconst IframeSandbox: React.FC<IframeSandboxProps> = ({\n content,\n type,\n className,\n styleLoadingText,\n scriptLoadingText,\n fullScreenButtonText,\n hideFullScreen = false,\n mode = \"content\",\n replaceRootScreenHeightWithFull = false,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const rootRef = useRef<Root | null>(null);\n const updateHeightRef = useRef<() => void>(() => {});\n const [height, setHeight] = useState(480);\n const lastSandboxInteractionTimeRef = useRef(0);\n const [resetToken, setResetToken] = useState(0);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const shouldInjectSandboxVendor = type === \"sandbox\";\n\n const isBlackboardMode = mode === \"blackboard\";\n const shouldMeasureDynamicHeight = isBlackboardMode && type === \"sandbox\";\n const shouldProcessRootScreenHeight =\n shouldMeasureDynamicHeight && replaceRootScreenHeightWithFull;\n const shouldPromoteScrollToParent = shouldProcessRootScreenHeight;\n const prevHtmlRef = useRef<string>(\"\");\n const htmlContent = React.useMemo(\n () => (type === \"sandbox\" ? content : \"\"),\n [content, type]\n );\n const normalizedHtmlContent = React.useMemo(\n () =>\n replaceViewportLayoutClasses({\n html: htmlContent,\n enabled: shouldProcessRootScreenHeight,\n promoteScrollToParent: shouldPromoteScrollToParent,\n }),\n [\n htmlContent,\n shouldProcessRootScreenHeight,\n shouldPromoteScrollToParent,\n ]\n );\n const originalRootHeightMeta = React.useMemo(\n () =>\n shouldProcessRootScreenHeight\n ? inspectViewportHeightFromHtmlRootString(htmlContent)\n : EMPTY_ROOT_HEIGHT_META,\n [htmlContent, shouldProcessRootScreenHeight]\n );\n const shouldStretchRootHeight = React.useMemo(\n () =>\n !shouldPromoteScrollToParent &&\n shouldProcessRootScreenHeight &&\n originalRootHeightMeta.hasFullViewportHeight,\n [\n originalRootHeightMeta.hasFullViewportHeight,\n shouldPromoteScrollToParent,\n shouldProcessRootScreenHeight,\n ]\n );\n const [renderHtmlContent, setRenderHtmlContent] = useState(\n normalizedHtmlContent\n );\n const prevIncomingHtmlRef = useRef(normalizedHtmlContent);\n const pendingHtmlRef = useRef(normalizedHtmlContent);\n const deferRenderTimerRef = useRef<number | null>(null);\n const initialPaintFrameRef = useRef<number | null>(null);\n const renderViewportHeightCssRef = useRef<string | 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 const clearInitialPaintFrames = () => {\n if (initialPaintFrameRef.current !== null) {\n window.cancelAnimationFrame(initialPaintFrameRef.current);\n initialPaintFrameRef.current = null;\n }\n };\n\n useEffect(\n () => () => {\n clearDeferredRenderTimer();\n clearInitialPaintFrames();\n },\n []\n );\n\n useEffect(() => {\n const prevIncomingHtml = prevIncomingHtmlRef.current;\n prevIncomingHtmlRef.current = normalizedHtmlContent;\n\n const isAppendOnlyStream =\n !!prevIncomingHtml &&\n normalizedHtmlContent.length > prevIncomingHtml.length &&\n normalizedHtmlContent.startsWith(prevIncomingHtml);\n const containsCompleteImage = COMPLETE_IMAGE_TAG_PATTERN.test(\n normalizedHtmlContent\n );\n const shouldDeferRender = isAppendOnlyStream && containsCompleteImage;\n\n if (!shouldDeferRender) {\n clearDeferredRenderTimer();\n pendingHtmlRef.current = normalizedHtmlContent;\n setRenderHtmlContent(normalizedHtmlContent);\n return;\n }\n\n pendingHtmlRef.current = normalizedHtmlContent;\n clearDeferredRenderTimer();\n deferRenderTimerRef.current = window.setTimeout(() => {\n setRenderHtmlContent(pendingHtmlRef.current);\n deferRenderTimerRef.current = null;\n }, POST_IMAGE_STREAM_DEBOUNCE_MS);\n }, [normalizedHtmlContent]);\n\n const rootViewportHeightCss = React.useMemo(() => {\n if (!shouldMeasureDynamicHeight) {\n return null;\n }\n\n return inspectViewportHeightFromHtmlRootString(renderHtmlContent)\n .viewportHeightCss;\n }, [renderHtmlContent, shouldMeasureDynamicHeight]);\n\n useEffect(() => {\n renderViewportHeightCssRef.current = rootViewportHeightCss;\n }, [rootViewportHeightCss]);\n\n const hasRootVhHeight = Boolean(rootViewportHeightCss);\n const sandboxViewportHeight =\n isBlackboardMode && type === \"sandbox\"\n ? shouldPromoteScrollToParent\n ? `${height}px`\n : shouldStretchRootHeight\n ? \"100%\"\n : (rootViewportHeightCss ?? `${height}px`)\n : undefined;\n useEffect(() => {\n if (mode !== \"blackboard\") {\n prevHtmlRef.current = normalizedHtmlContent;\n return;\n }\n const prev = prevHtmlRef.current;\n const isContinuation = prev && normalizedHtmlContent.startsWith(prev);\n if (!isContinuation && prev) {\n setResetToken((token) => token + 1);\n }\n prevHtmlRef.current = normalizedHtmlContent;\n }, [mode, normalizedHtmlContent]);\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 :root { color-scheme: light; }\n html, body, #root {\n width: 100%;\n height: ${shouldPromoteScrollToParent ? \"auto\" : \"100%\"};\n min-height: 100%;\n }\n html, body {\n margin: 0;\n padding: 0;\n overflow: ${shouldPromoteScrollToParent ? \"hidden\" : \"auto\"};\n }\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 // Force iframe theme to stay in light mode regardless of host OS preference.\n doc.documentElement.setAttribute(\"data-theme\", \"light\");\n doc.documentElement.style.colorScheme = \"light\";\n doc.body?.style.setProperty(\"color-scheme\", \"light\");\n\n const shouldBridgeSandboxInteraction =\n isBlackboardMode && type === \"sandbox\";\n const handleSandboxClick = () => emitSandboxInteraction(\"click\");\n\n if (shouldBridgeSandboxInteraction) {\n doc.addEventListener(\"click\", handleSandboxClick, 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 const getHeightInspectionNode = (node: HTMLElement) => ({\n heightAttrValue: node.getAttribute(\"height\"),\n styleAttrValue: node.getAttribute(\"style\"),\n classAttrValue: node.getAttribute(\"class\"),\n });\n const getSingleChildElement = (node: HTMLElement) => {\n const childElements = Array.from(node.children) as HTMLElement[];\n\n return childElements.length === 1 ? childElements[0] : null;\n };\n\n const resolveExplicitHeight = () => {\n if (!shouldMeasureDynamicHeight) return null;\n if (!iframeRef.current || !doc.body) return null;\n const parentViewportHeight =\n iframeRef.current.ownerDocument?.documentElement?.clientHeight ||\n window.innerHeight;\n // Reuse parsed height metadata from the current html snapshot first to\n // avoid re-inspecting the same DOM chain on every height tick.\n const precomputedViewportHeightCss = renderViewportHeightCssRef.current;\n const parsed = precomputedViewportHeightCss\n ? parseExplicitHeight(\n precomputedViewportHeightCss,\n parentViewportHeight\n )\n : null;\n\n if (parsed !== null) {\n return Math.ceil(parsed);\n }\n\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 containerChildren = Array.from(container.children) as HTMLElement[];\n const rootContentElement =\n containerChildren.length === 1 ? containerChildren[0] : null;\n const runtimeHeightMeta = inspectViewportHeightFromNodeChain(\n rootContentElement,\n {\n getNode: getHeightInspectionNode,\n getSingleChild: getSingleChildElement,\n }\n );\n const runtimeViewportHeightCss = runtimeHeightMeta.viewportHeightCss;\n\n if (runtimeViewportHeightCss) {\n const runtimeViewportHeight = parseExplicitHeight(\n runtimeViewportHeightCss,\n parentViewportHeight\n );\n\n if (runtimeViewportHeight !== null) {\n return Math.ceil(runtimeViewportHeight);\n }\n }\n\n const explicitPixelHeight = resolveExplicitHeightFromNodeChain(\n rootContentElement,\n parentViewportHeight,\n {\n getNode: getHeightInspectionNode,\n getSingleChild: getSingleChildElement,\n }\n );\n\n return explicitPixelHeight !== null\n ? Math.ceil(explicitPixelHeight)\n : null;\n };\n\n const updateHeight = () => {\n if (!shouldMeasureDynamicHeight) return;\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((prevHeight) =>\n prevHeight === nextHeight ? prevHeight : nextHeight\n );\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 if (shouldInjectSandboxVendor) {\n // Inject Tailwind/DaisyUI/GSAP before rendering sandbox content to avoid FOUC.\n loadBlackboardVendor()\n .then((inject) => {\n if (isDestroyed) return;\n inject(doc);\n requestAnimationFrame(() => {\n if (isDestroyed) return;\n scheduleHeightUpdate();\n });\n })\n .catch(() => {\n if (isDestroyed) return;\n scheduleHeightUpdate();\n });\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(\"click\", handleSandboxClick, true);\n }\n // Defer unmount to avoid React warning when parent is mid-render\n setTimeout(() => {\n root.unmount();\n rootRef.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 styleLoadingText={styleLoadingText}\n scriptLoadingText={scriptLoadingText}\n resetToken={resetToken}\n hasRootVhHeight={hasRootVhHeight}\n mode={mode}\n stretchRootHeight={\n shouldStretchRootHeight && !shouldPromoteScrollToParent\n }\n />\n );\n\n initialPaintFrameRef.current = window.requestAnimationFrame(() => {\n updateHeightRef.current?.();\n initialPaintFrameRef.current = null;\n });\n }, [\n renderHtmlContent,\n styleLoadingText,\n scriptLoadingText,\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 style={\n sandboxViewportHeight\n ? {\n height: sandboxViewportHeight,\n minHeight: sandboxViewportHeight,\n }\n : undefined\n }\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 onClick={() => emitSandboxInteraction(\"click\")}>\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: sandboxViewportHeight ?? \"100%\",\n minHeight: sandboxViewportHeight,\n margin: \"auto\",\n visibility: \"visible\",\n }}\n />\n )}\n </div>\n );\n};\n\nexport default IframeSandbox;\n"],"names":["blackboardVendorPromise","loadBlackboardVendor","m","COMPLETE_IMAGE_TAG_PATTERN","POST_IMAGE_STREAM_DEBOUNCE_MS","SANDBOX_INTERACTION_THROTTLE_MS","replaceViewportLayoutTokens","className","promoteScrollToParent","tokens","hasViewportHeightToken","token","segments","lastSegment","lastSegmentIndex","prefix","replaceViewportLayoutClasses","html","enabled","match","quote","nextClassName","IframeSandbox","content","type","styleLoadingText","scriptLoadingText","fullScreenButtonText","hideFullScreen","mode","replaceRootScreenHeightWithFull","containerRef","useRef","iframeRef","rootRef","updateHeightRef","height","setHeight","useState","lastSandboxInteractionTimeRef","resetToken","setResetToken","isFullscreen","setIsFullscreen","shouldInjectSandboxVendor","isBlackboardMode","shouldMeasureDynamicHeight","shouldProcessRootScreenHeight","shouldPromoteScrollToParent","prevHtmlRef","htmlContent","React","normalizedHtmlContent","originalRootHeightMeta","inspectViewportHeightFromHtmlRootString","EMPTY_ROOT_HEIGHT_META","shouldStretchRootHeight","renderHtmlContent","setRenderHtmlContent","prevIncomingHtmlRef","pendingHtmlRef","deferRenderTimerRef","initialPaintFrameRef","renderViewportHeightCssRef","emitSandboxInteraction","useCallback","eventType","now","SANDBOX_INTERACTION_MESSAGE_SOURCE","SANDBOX_INTERACTION_MESSAGE_TYPE","clearDeferredRenderTimer","clearInitialPaintFrames","useEffect","prevIncomingHtml","isAppendOnlyStream","containsCompleteImage","rootViewportHeightCss","hasRootVhHeight","sandboxViewportHeight","prev","iframe","doc","shouldBridgeSandboxInteraction","handleSandboxClick","rootEl","root","createRoot","isDestroyed","getHeightInspectionNode","node","getSingleChildElement","childElements","resolveExplicitHeight","parentViewportHeight","precomputedViewportHeightCss","parsed","parseExplicitHeight","container","containerChildren","rootContentElement","runtimeViewportHeightCss","inspectViewportHeightFromNodeChain","runtimeViewportHeight","explicitPixelHeight","resolveExplicitHeightFromNodeChain","updateHeight","bodyRect","htmlRect","bodyHeight","htmlHeight","contentHeight","explicitHeight","nextHeight","prevHeight","scheduleHeightUpdate","inject","resizeObserver","onFullscreenChange","toggleFullscreen","target","jsx","SandboxApp","containerClassName","jsxs","ContentRender"],"mappings":"+XAoBA,IAAIA,EAAqE,KAEzE,MAAMC,GAAuB,KACtBD,IACHA,EAA0B,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,4BAAqB,CAAA,EAAE,KACrDE,GAAMA,EAAE,yBAAA,GAINF,GAGHG,GAA6B,gBAC7BC,GAAgC,IAChCC,GAAkC,IAelCC,GAA8B,CAAC,CACnC,UAAAC,EACA,sBAAAC,CACF,IAGM,CACJ,MAAMC,EAASF,EAAU,MAAM,KAAK,EAAE,OAAO,OAAO,EAC9CG,EAAyBD,EAAO,KAAME,GAAU,CACpD,MAAMC,EAAWD,EAAM,MAAM,GAAG,EAC1BE,EAAcD,EAASA,EAAS,OAAS,CAAC,EAEhD,OAAOC,IAAgB,YAAcA,IAAgB,cACvD,CAAC,EAED,OAAOJ,EACJ,QAASE,GAAU,CAClB,MAAMC,EAAWD,EAAM,MAAM,GAAG,EAC1BG,EAAmBF,EAAS,OAAS,EACrCC,EAAcD,EAASE,CAAgB,EAE7C,GAAI,CAACN,EACH,OACEK,IAAgB,YAChBA,IAAgB,eAET,CAACF,CAAK,GAGfC,EAASE,CAAgB,EAAI,SACtB,CAACF,EAAS,KAAK,GAAG,CAAC,GAG5B,GACEC,IAAgB,YAChBA,IAAgB,eAEhB,OAAAD,EAASE,CAAgB,EAAI,aACtB,CAACF,EAAS,KAAK,GAAG,CAAC,EAG5B,GAAIC,IAAgB,kBAClB,OAAAD,EAASE,CAAgB,EAAI,qBACtB,CAACF,EAAS,KAAK,GAAG,CAAC,EAG5B,GAAIC,IAAgB,iBAAmBH,EAAwB,CAC7D,MAAMK,EAASH,EAAS,MAAM,EAAG,EAAE,EAEnC,MAAO,CACL,CAAC,GAAGG,EAAQ,iBAAiB,EAAE,KAAK,GAAG,EACvC,CAAC,GAAGA,EAAQ,oBAAoB,EAAE,KAAK,GAAG,CAAA,CAE9C,CAEA,MAAO,CAACJ,CAAK,CACf,CAAC,EACA,KAAK,GAAG,CACb,EAEMK,GAA+B,CAAC,CACpC,KAAAC,EACA,QAAAC,EACA,sBAAAV,CACF,IAKM,CAACU,GAAW,CAACD,EAAK,OACbA,EAGFA,EAAK,QACV,mCACA,CAACE,EAAOC,EAAeb,IAAsB,CAC3C,MAAMc,EAAgBf,GAA4B,CAChD,UAAAC,EACA,sBAAAC,CAAA,CACD,EAED,OAAIa,IAAkBd,EACbY,EAGF,SAASC,CAAK,GAAGC,CAAa,GAAGD,CAAK,EAC/C,CAAA,EAIEE,GAA8C,CAAC,CACnD,QAAAC,EACA,KAAAC,EACA,UAAAjB,EACA,iBAAAkB,EACA,kBAAAC,EACA,qBAAAC,EACA,eAAAC,EAAiB,GACjB,KAAAC,EAAO,UACP,gCAAAC,EAAkC,EACpC,IAAM,CACJ,MAAMC,EAAeC,EAAAA,OAAuB,IAAI,EAC1CC,EAAYD,EAAAA,OAA0B,IAAI,EAC1CE,EAAUF,EAAAA,OAAoB,IAAI,EAClCG,EAAkBH,EAAAA,OAAmB,IAAM,CAAC,CAAC,EAC7C,CAACI,EAAQC,EAAS,EAAIC,EAAAA,SAAS,GAAG,EAClCC,EAAgCP,EAAAA,OAAO,CAAC,EACxC,CAACQ,EAAYC,EAAa,EAAIH,EAAAA,SAAS,CAAC,EACxC,CAACI,GAAcC,EAAe,EAAIL,EAAAA,SAAS,EAAK,EAChDM,GAA4BpB,IAAS,UAErCqB,EAAmBhB,IAAS,aAC5BiB,EAA6BD,GAAoBrB,IAAS,UAC1DuB,EACJD,GAA8BhB,EAC1BkB,EAA8BD,EAC9BE,EAAcjB,EAAAA,OAAe,EAAE,EAC/BkB,EAAcC,EAAM,QACxB,IAAO3B,IAAS,UAAYD,EAAU,GACtC,CAACA,EAASC,CAAI,CAAA,EAEV4B,EAAwBD,EAAM,QAClC,IACEnC,GAA6B,CAC3B,KAAMkC,EACN,QAASH,EACT,sBAAuBC,CAAA,CACxB,EACH,CACEE,EACAH,EACAC,CAAA,CACF,EAEIK,EAAyBF,EAAM,QACnC,IACEJ,EACIO,EAAAA,wCAAwCJ,CAAW,EACnDK,EAAAA,uBACN,CAACL,EAAaH,CAA6B,CAAA,EAEvCS,EAA0BL,EAAM,QACpC,IACE,CAACH,GACDD,GACAM,EAAuB,sBACzB,CACEA,EAAuB,sBACvBL,EACAD,CAAA,CACF,EAEI,CAACU,EAAmBC,CAAoB,EAAIpB,EAAAA,SAChDc,CAAA,EAEIO,EAAsB3B,EAAAA,OAAOoB,CAAqB,EAClDQ,EAAiB5B,EAAAA,OAAOoB,CAAqB,EAC7CS,EAAsB7B,EAAAA,OAAsB,IAAI,EAChD8B,EAAuB9B,EAAAA,OAAsB,IAAI,EACjD+B,GAA6B/B,EAAAA,OAAsB,IAAI,EAEvDgC,GAAyBC,cAAaC,GAAsB,CAChE,GAAI,OAAO,OAAW,IACpB,OAEF,MAAMC,EAAM,KAAK,IAAA,EAEfA,EAAM5B,EAA8B,QACpClC,KAIFkC,EAA8B,QAAU4B,EACxC,OAAO,YACL,CACE,OAAQC,GAAAA,mCACR,KAAMC,GAAAA,iCACN,UAAAH,CAAA,EAEF,OAAO,SAAS,MAAA,EAEpB,EAAG,CAAA,CAAE,EAECI,EAA2B,IAAM,CACjCT,EAAoB,UAAY,OACpC,OAAO,aAAaA,EAAoB,OAAO,EAC/CA,EAAoB,QAAU,KAChC,EAEMU,GAA0B,IAAM,CAChCT,EAAqB,UAAY,OACnC,OAAO,qBAAqBA,EAAqB,OAAO,EACxDA,EAAqB,QAAU,KAEnC,EAEAU,EAAAA,UACE,IAAM,IAAM,CACVF,EAAA,EACAC,GAAA,CACF,EACA,CAAA,CAAC,EAGHC,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAmBd,EAAoB,QAC7CA,EAAoB,QAAUP,EAE9B,MAAMsB,EACJ,CAAC,CAACD,GACFrB,EAAsB,OAASqB,EAAiB,QAChDrB,EAAsB,WAAWqB,CAAgB,EAC7CE,EAAwBxE,GAA2B,KACvDiD,CAAA,EAIF,GAAI,EAFsBsB,GAAsBC,GAExB,CACtBL,EAAA,EACAV,EAAe,QAAUR,EACzBM,EAAqBN,CAAqB,EAC1C,MACF,CAEAQ,EAAe,QAAUR,EACzBkB,EAAA,EACAT,EAAoB,QAAU,OAAO,WAAW,IAAM,CACpDH,EAAqBE,EAAe,OAAO,EAC3CC,EAAoB,QAAU,IAChC,EAAGzD,EAA6B,CAClC,EAAG,CAACgD,CAAqB,CAAC,EAE1B,MAAMwB,EAAwBzB,EAAM,QAAQ,IACrCL,EAIEQ,EAAAA,wCAAwCG,CAAiB,EAC7D,kBAJM,KAKR,CAACA,EAAmBX,CAA0B,CAAC,EAElD0B,EAAAA,UAAU,IAAM,CACdT,GAA2B,QAAUa,CACvC,EAAG,CAACA,CAAqB,CAAC,EAE1B,MAAMC,GAAkB,EAAQD,EAC1BE,EACJjC,GAAoBrB,IAAS,UACzBwB,EACE,GAAGZ,CAAM,KACToB,EACA,OACCoB,GAAyB,GAAGxC,CAAM,KACrC,OACNoC,EAAAA,UAAU,IAAM,CACd,GAAI3C,IAAS,aAAc,CACzBoB,EAAY,QAAUG,EACtB,MACF,CACA,MAAM2B,EAAO9B,EAAY,QAErB,EADmB8B,GAAQ3B,EAAsB,WAAW2B,CAAI,IAC7CA,GACrBtC,GAAe9B,GAAUA,EAAQ,CAAC,EAEpCsC,EAAY,QAAUG,CACxB,EAAG,CAACvB,EAAMuB,CAAqB,CAAC,EAEhCoB,EAAAA,UAAU,IAAM,CACd,MAAMQ,EAAS/C,EAAU,QACzB,GAAI,CAAC+C,EAAQ,OAEb,MAAMC,EAAMD,EAAO,gBACnB,GAAI,CAACC,EAAK,OAEVA,EAAI,KAAA,EACJA,EAAI,MAAM;AAAA,OACPpD,IAAS,aAAe,yBAA2B,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAQ1CmB,EAA8B,OAAS,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAM3CA,EAA8B,SAAW,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAQ3D,EACJiC,EAAI,MAAA,EAGJA,EAAI,gBAAgB,aAAa,aAAc,OAAO,EACtDA,EAAI,gBAAgB,MAAM,YAAc,QACxCA,EAAI,MAAM,MAAM,YAAY,eAAgB,OAAO,EAEnD,MAAMC,EACJrC,GAAoBrB,IAAS,UACzB2D,EAAqB,IAAMnB,GAAuB,OAAO,EAE3DkB,GACFD,EAAI,iBAAiB,QAASE,EAAoB,EAAI,EAGxD,MAAMC,EAASH,EAAI,eAAe,MAAM,EACxC,GAAI,CAACG,EAAQ,OAEb,MAAMC,GAAOC,GAAAA,WAAWF,CAAM,EAC9BlD,EAAQ,QAAUmD,GAClB,IAAIE,EAAc,GAClB,MAAMC,GAA2BC,IAAuB,CACtD,gBAAiBA,EAAK,aAAa,QAAQ,EAC3C,eAAgBA,EAAK,aAAa,OAAO,EACzC,eAAgBA,EAAK,aAAa,OAAO,CAAA,GAErCC,GAAyBD,GAAsB,CACnD,MAAME,EAAgB,MAAM,KAAKF,EAAK,QAAQ,EAE9C,OAAOE,EAAc,SAAW,EAAIA,EAAc,CAAC,EAAI,IACzD,EAEMC,GAAwB,IAAM,CAElC,GADI,CAAC9C,GACD,CAACb,EAAU,SAAW,CAACgD,EAAI,KAAM,OAAO,KAC5C,MAAMY,EACJ5D,EAAU,QAAQ,eAAe,iBAAiB,cAClD,OAAO,YAGH6D,EAA+B/B,GAA2B,QAC1DgC,EAASD,EACXE,EAAAA,oBACEF,EACAD,CAAA,EAEF,KAEJ,GAAIE,IAAW,KACb,OAAO,KAAK,KAAKA,CAAM,EAMzB,MAAME,EAHUhB,EAAI,KAAK,cACvB,kBAAA,GAEyB,kBAC3B,GAAI,CAACgB,EAAW,OAAO,KACvB,MAAMC,EAAoB,MAAM,KAAKD,EAAU,QAAQ,EACjDE,EACJD,EAAkB,SAAW,EAAIA,EAAkB,CAAC,EAAI,KAQpDE,GAPoBC,EAAAA,mCACxBF,EACA,CACE,QAASX,GACT,eAAgBE,EAAA,CAClB,EAEiD,kBAEnD,GAAIU,GAA0B,CAC5B,MAAME,GAAwBN,EAAAA,oBAC5BI,GACAP,CAAA,EAGF,GAAIS,KAA0B,KAC5B,OAAO,KAAK,KAAKA,EAAqB,CAE1C,CAEA,MAAMC,GAAsBC,EAAAA,mCAC1BL,EACAN,EACA,CACE,QAASL,GACT,eAAgBE,EAAA,CAClB,EAGF,OAAOa,KAAwB,KAC3B,KAAK,KAAKA,EAAmB,EAC7B,IACN,EAEME,EAAe,IAAM,CAEzB,GADI,CAAC3D,GACD,CAACb,EAAU,SAAW,CAACgD,EAAI,KAAM,OACrC,MAAMyB,EAAWzB,EAAI,KAAK,sBAAA,EACpB0B,EAAW1B,EAAI,iBAAiB,sBAAA,EAChC2B,EAAaF,EAAS,OACtBG,GAAaF,GAAU,QAAU,EACjCG,EAAgB,KAAK,IAAIF,EAAYC,EAAU,EAC/CE,EAAiBnB,GAAA,EACjBoB,EAAa,KAAK,IACtB,IACAD,GAAkB,KAAK,KAAKD,CAAa,CAAA,EAE3CzE,GAAW4E,GACTA,IAAeD,EAAaC,EAAaD,CAAA,CAE7C,EACME,EAAuB,IAAM,CACjC,sBAAsB,IAAM,CACtB3B,GACJkB,EAAA,CACF,CAAC,CACH,EACAtE,EAAgB,QAAU+E,EAE1BT,EAAA,EACAS,EAAA,EAEItE,IAEF3C,GAAA,EACG,KAAMkH,GAAW,CACZ5B,IACJ4B,EAAOlC,CAAG,EACV,sBAAsB,IAAM,CACtBM,GACJ2B,EAAA,CACF,CAAC,EACH,CAAC,EACA,MAAM,IAAM,CACP3B,GACJ2B,EAAA,CACF,CAAC,EAGL,MAAME,EAAiB,IAAI,eAAe,IAAMX,GAAc,EAC9D,OAAAW,EAAe,QAAQnC,EAAI,IAAI,EAC3BG,GACFgC,EAAe,QAAQhC,CAAM,EAGxB,IAAM,CACXG,EAAc,GACd6B,EAAe,WAAA,EACXlC,GACFD,EAAI,oBAAoB,QAASE,EAAoB,EAAI,EAG3D,WAAW,IAAM,CACfE,GAAK,QAAA,EACLnD,EAAQ,QAAU,KAClBC,EAAgB,QAAU,IAAM,CAAC,CACnC,EAAG,CAAC,CACN,CACF,EAAG,CAAA,CAAE,EAELqC,EAAAA,UAAU,IAAM,CACd,MAAM6C,EAAqB,IAAM,CAC/B1E,GAAgB,EAAQ,SAAS,iBAAkB,CACrD,EACA,gBAAS,iBAAiB,mBAAoB0E,CAAkB,EACzD,IACL,SAAS,oBAAoB,mBAAoBA,CAAkB,CACvE,EAAG,CAAA,CAAE,EAEL,MAAMC,GAAmB,IAAM,CAC7B,MAAMC,EAASxF,EAAa,SAAWE,EAAU,QACjD,GAAKsF,EACL,IAAI,SAAS,kBAAmB,CAC9B,SAAS,iBAAiB,MAAM,IAAM,CAAC,CAAC,EACxC,MACF,CACIA,EAAO,mBACTA,EAAO,oBAAoB,MAAM,IAAM,CAAC,CAAC,EAE7C,EAEA/C,EAAAA,UAAU,IAAM,CACd,MAAMa,EAAOnD,EAAQ,QAChBmD,IAELA,EAAK,OACHmC,EAAAA,kBAAAA,IAACC,GAAAA,QAAA,CACC,KAAMhE,EACN,iBAAAhC,EACA,kBAAAC,EACE,WAAAc,EACA,gBAAAqC,GACA,KAAAhD,EACA,kBACE2B,GAA2B,CAACR,CAAA,CAAA,CAEhC,EAGJc,EAAqB,QAAU,OAAO,sBAAsB,IAAM,CAChE3B,EAAgB,UAAA,EAChB2B,EAAqB,QAAU,IACjC,CAAC,EACH,EAAG,CACDL,EACAhC,EACAC,EACAc,EACAX,CAAA,CACD,EACD,MAAM6F,GAAqB,CACzB,gDACA7E,EACI,qCACA,gEAAA,EAEH,OAAO,OAAO,EACd,KAAK,GAAG,EAEX,OACE8E,EAAAA,kBAAAA,KAAC,MAAA,CACC,IAAK5F,EACL,eAAc8C,GAAkB,OAAS,QACzC,UAAW6C,GACX,MACE5C,EACI,CACE,OAAQA,EACR,UAAWA,CAAA,EAEb,OAGL,SAAA,CAAA,CAAClD,GACA4F,EAAAA,kBAAAA,IAAC,SAAA,CACC,KAAK,SACL,QAASF,GACT,UACE,qFAGD,SAAA5E,GAAe,OAASf,GAAwB,MAAA,CAAA,EAGpDE,IAAS,cAAgBL,IAAS,mCAChC,MAAA,CAAI,QAAS,IAAMwC,GAAuB,OAAO,EAChD,SAAAwD,wBAACI,GAAAA,QAAA,CAAc,QAAArG,CAAA,CAAkB,EACnC,EAEAiG,EAAAA,kBAAAA,IAAC,SAAA,CACC,IAAKvF,EACL,QAAQ,8EACR,MAAM,aACN,gBAAe,GACf,UAAW,CAAC1B,EAAW,qCAAqC,EACzD,OAAO,OAAO,EACd,KAAK,GAAG,EACX,MAAO,CACL,OAAQuE,GAAyB,OACjC,UAAWA,EACX,OAAQ,OACR,WAAY,SAAA,CACd,CAAA,CACF,CAAA,CAAA,CAIR"}
1
+ {"version":3,"file":"IframeSandbox.cjs.js","sources":["../../../src/components/ContentRender/IframeSandbox.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createRoot, Root } from \"react-dom/client\";\nimport SandboxApp from \"./SandboxApp\";\nimport ContentRender from \"./ContentRender\";\nimport {\n EMPTY_ROOT_HEIGHT_META,\n inspectViewportHeightFromHtmlRootString,\n inspectViewportHeightFromNodeChain,\n parseExplicitHeight,\n resolveExplicitHeightFromNodeChain,\n} from \"./utils/iframe-viewport-height\";\nimport {\n SANDBOX_INTERACTION_MESSAGE_SOURCE,\n SANDBOX_INTERACTION_MESSAGE_TYPE,\n} from \"../../lib/sandboxInteraction\";\n\ntype InjectBlackboardLibraries =\n typeof import(\"./blackboard-vendor\").injectBlackboardLibraries;\n\n// Cache the sandbox vendor loader so every iframe reuses the same preload request.\nlet blackboardVendorPromise: Promise<InjectBlackboardLibraries> | null = null;\n\nconst loadBlackboardVendor = () => {\n if (!blackboardVendorPromise) {\n blackboardVendorPromise = import(\"./blackboard-vendor\").then(\n (m) => m.injectBlackboardLibraries\n );\n }\n\n return blackboardVendorPromise;\n};\n\nconst COMPLETE_IMAGE_TAG_PATTERN = /<img\\b[^>]*>/i;\nconst POST_IMAGE_STREAM_DEBOUNCE_MS = 180;\nconst SANDBOX_INTERACTION_THROTTLE_MS = 240;\n\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 replaceRootScreenHeightWithFull?: boolean;\n}\n\nconst replaceRootScreenHeightToken = (className: string) =>\n className\n .split(/\\s+/)\n .filter(Boolean)\n .map((token) => {\n const segments = token.split(\":\");\n if (\n segments[segments.length - 1] !== \"h-screen\" &&\n segments[segments.length - 1] !== \"min-h-screen\"\n ) {\n return token;\n }\n segments[segments.length - 1] = \"h-full\";\n return segments.join(\":\");\n })\n .join(\" \");\n\nconst replaceRootScreenHeightWithFullClass = (\n html: string,\n enabled: boolean\n) => {\n if (!enabled || !html.trim()) {\n return html;\n }\n\n return html.replace(\n /^(\\s*<[a-zA-Z][\\w:-]*)(\\s[^>]*?)?>/,\n (match, tagStart: string, attrs = \"\") => {\n const classMatch = attrs.match(/\\bclass\\s*=\\s*([\"'])([^\"']*)\\1/i);\n\n if (!classMatch) {\n return match;\n }\n\n const nextClassName = replaceRootScreenHeightToken(classMatch[2]);\n\n if (nextClassName === classMatch[2]) {\n return match;\n }\n\n return `${tagStart}${attrs.replace(\n classMatch[0],\n `class=${classMatch[1]}${nextClassName}${classMatch[1]}`\n )}>`;\n }\n );\n};\n\nconst IframeSandbox: React.FC<IframeSandboxProps> = ({\n content,\n type,\n className,\n styleLoadingText,\n scriptLoadingText,\n fullScreenButtonText,\n hideFullScreen = false,\n mode = \"content\",\n replaceRootScreenHeightWithFull = false,\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const iframeRef = useRef<HTMLIFrameElement>(null);\n const rootRef = useRef<Root | null>(null);\n const updateHeightRef = useRef<() => void>(() => {});\n const [height, setHeight] = useState(480);\n const lastSandboxInteractionTimeRef = useRef(0);\n const [resetToken, setResetToken] = useState(0);\n const [isFullscreen, setIsFullscreen] = useState(false);\n const shouldInjectSandboxVendor = type === \"sandbox\";\n\n const isBlackboardMode = mode === \"blackboard\";\n const shouldMeasureDynamicHeight = isBlackboardMode && type === \"sandbox\";\n const shouldProcessRootScreenHeight =\n shouldMeasureDynamicHeight && replaceRootScreenHeightWithFull;\n const prevHtmlRef = useRef<string>(\"\");\n const htmlContent = React.useMemo(\n () => (type === \"sandbox\" ? content : \"\"),\n [content, type]\n );\n const normalizedHtmlContent = React.useMemo(\n () =>\n replaceRootScreenHeightWithFullClass(\n htmlContent,\n shouldProcessRootScreenHeight\n ),\n [htmlContent, shouldProcessRootScreenHeight]\n );\n const originalRootHeightMeta = React.useMemo(\n () =>\n shouldProcessRootScreenHeight\n ? inspectViewportHeightFromHtmlRootString(htmlContent)\n : EMPTY_ROOT_HEIGHT_META,\n [htmlContent, shouldProcessRootScreenHeight]\n );\n const shouldStretchRootHeight = React.useMemo(\n () =>\n shouldProcessRootScreenHeight &&\n originalRootHeightMeta.hasFullViewportHeight,\n [\n originalRootHeightMeta.hasFullViewportHeight,\n shouldProcessRootScreenHeight,\n ]\n );\n const [renderHtmlContent, setRenderHtmlContent] = useState(\n normalizedHtmlContent\n );\n const prevIncomingHtmlRef = useRef(normalizedHtmlContent);\n const pendingHtmlRef = useRef(normalizedHtmlContent);\n const deferRenderTimerRef = useRef<number | null>(null);\n const initialPaintFrameRef = useRef<number | null>(null);\n const renderViewportHeightCssRef = useRef<string | 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 const clearInitialPaintFrames = () => {\n if (initialPaintFrameRef.current !== null) {\n window.cancelAnimationFrame(initialPaintFrameRef.current);\n initialPaintFrameRef.current = null;\n }\n };\n\n useEffect(\n () => () => {\n clearDeferredRenderTimer();\n clearInitialPaintFrames();\n },\n []\n );\n\n useEffect(() => {\n const prevIncomingHtml = prevIncomingHtmlRef.current;\n prevIncomingHtmlRef.current = normalizedHtmlContent;\n\n const isAppendOnlyStream =\n !!prevIncomingHtml &&\n normalizedHtmlContent.length > prevIncomingHtml.length &&\n normalizedHtmlContent.startsWith(prevIncomingHtml);\n const containsCompleteImage = COMPLETE_IMAGE_TAG_PATTERN.test(\n normalizedHtmlContent\n );\n const shouldDeferRender = isAppendOnlyStream && containsCompleteImage;\n\n if (!shouldDeferRender) {\n clearDeferredRenderTimer();\n pendingHtmlRef.current = normalizedHtmlContent;\n setRenderHtmlContent(normalizedHtmlContent);\n return;\n }\n\n pendingHtmlRef.current = normalizedHtmlContent;\n clearDeferredRenderTimer();\n deferRenderTimerRef.current = window.setTimeout(() => {\n setRenderHtmlContent(pendingHtmlRef.current);\n deferRenderTimerRef.current = null;\n }, POST_IMAGE_STREAM_DEBOUNCE_MS);\n }, [normalizedHtmlContent]);\n\n const rootViewportHeightCss = React.useMemo(() => {\n if (!shouldMeasureDynamicHeight) {\n return null;\n }\n\n return inspectViewportHeightFromHtmlRootString(renderHtmlContent)\n .viewportHeightCss;\n }, [renderHtmlContent, shouldMeasureDynamicHeight]);\n\n useEffect(() => {\n renderViewportHeightCssRef.current = rootViewportHeightCss;\n }, [rootViewportHeightCss]);\n\n const hasRootVhHeight = Boolean(rootViewportHeightCss);\n const sandboxViewportHeight =\n isBlackboardMode && type === \"sandbox\"\n ? shouldStretchRootHeight\n ? \"100%\"\n : (rootViewportHeightCss ?? `${height}px`)\n : undefined;\n useEffect(() => {\n if (mode !== \"blackboard\") {\n prevHtmlRef.current = normalizedHtmlContent;\n return;\n }\n const prev = prevHtmlRef.current;\n const isContinuation = prev && normalizedHtmlContent.startsWith(prev);\n if (!isContinuation && prev) {\n setResetToken((token) => token + 1);\n }\n prevHtmlRef.current = normalizedHtmlContent;\n }, [mode, normalizedHtmlContent]);\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 :root { color-scheme: light; }\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 // Force iframe theme to stay in light mode regardless of host OS preference.\n doc.documentElement.setAttribute(\"data-theme\", \"light\");\n doc.documentElement.style.colorScheme = \"light\";\n doc.body?.style.setProperty(\"color-scheme\", \"light\");\n\n const shouldBridgeSandboxInteraction =\n isBlackboardMode && type === \"sandbox\";\n const handleSandboxClick = () => emitSandboxInteraction(\"click\");\n\n if (shouldBridgeSandboxInteraction) {\n doc.addEventListener(\"click\", handleSandboxClick, 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 const getHeightInspectionNode = (node: HTMLElement) => ({\n heightAttrValue: node.getAttribute(\"height\"),\n styleAttrValue: node.getAttribute(\"style\"),\n classAttrValue: node.getAttribute(\"class\"),\n });\n const getSingleChildElement = (node: HTMLElement) => {\n const childElements = Array.from(node.children) as HTMLElement[];\n\n return childElements.length === 1 ? childElements[0] : null;\n };\n\n const resolveExplicitHeight = () => {\n if (!shouldMeasureDynamicHeight) return null;\n if (!iframeRef.current || !doc.body) return null;\n const parentViewportHeight =\n iframeRef.current.ownerDocument?.documentElement?.clientHeight ||\n window.innerHeight;\n // Reuse parsed height metadata from the current html snapshot first to\n // avoid re-inspecting the same DOM chain on every height tick.\n const precomputedViewportHeightCss = renderViewportHeightCssRef.current;\n const parsed = precomputedViewportHeightCss\n ? parseExplicitHeight(\n precomputedViewportHeightCss,\n parentViewportHeight\n )\n : null;\n\n if (parsed !== null) {\n return Math.ceil(parsed);\n }\n\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 containerChildren = Array.from(container.children) as HTMLElement[];\n const rootContentElement =\n containerChildren.length === 1 ? containerChildren[0] : null;\n const runtimeHeightMeta = inspectViewportHeightFromNodeChain(\n rootContentElement,\n {\n getNode: getHeightInspectionNode,\n getSingleChild: getSingleChildElement,\n }\n );\n const runtimeViewportHeightCss = runtimeHeightMeta.viewportHeightCss;\n\n if (runtimeViewportHeightCss) {\n const runtimeViewportHeight = parseExplicitHeight(\n runtimeViewportHeightCss,\n parentViewportHeight\n );\n\n if (runtimeViewportHeight !== null) {\n return Math.ceil(runtimeViewportHeight);\n }\n }\n\n const explicitPixelHeight = resolveExplicitHeightFromNodeChain(\n rootContentElement,\n parentViewportHeight,\n {\n getNode: getHeightInspectionNode,\n getSingleChild: getSingleChildElement,\n }\n );\n\n return explicitPixelHeight !== null\n ? Math.ceil(explicitPixelHeight)\n : null;\n };\n\n const updateHeight = () => {\n if (!shouldMeasureDynamicHeight) return;\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((prevHeight) =>\n prevHeight === nextHeight ? prevHeight : nextHeight\n );\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 if (shouldInjectSandboxVendor) {\n // Inject Tailwind/DaisyUI/GSAP before rendering sandbox content to avoid FOUC.\n loadBlackboardVendor()\n .then((inject) => {\n if (isDestroyed) return;\n inject(doc);\n requestAnimationFrame(() => {\n if (isDestroyed) return;\n scheduleHeightUpdate();\n });\n })\n .catch(() => {\n if (isDestroyed) return;\n scheduleHeightUpdate();\n });\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(\"click\", handleSandboxClick, true);\n }\n // Defer unmount to avoid React warning when parent is mid-render\n setTimeout(() => {\n root.unmount();\n rootRef.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 styleLoadingText={styleLoadingText}\n scriptLoadingText={scriptLoadingText}\n resetToken={resetToken}\n hasRootVhHeight={hasRootVhHeight}\n mode={mode}\n stretchRootHeight={shouldStretchRootHeight}\n />\n );\n\n initialPaintFrameRef.current = window.requestAnimationFrame(() => {\n updateHeightRef.current?.();\n initialPaintFrameRef.current = null;\n });\n }, [\n renderHtmlContent,\n styleLoadingText,\n scriptLoadingText,\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 style={\n sandboxViewportHeight\n ? {\n height: sandboxViewportHeight,\n minHeight: sandboxViewportHeight,\n }\n : undefined\n }\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 onClick={() => emitSandboxInteraction(\"click\")}>\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: sandboxViewportHeight ?? \"100%\",\n minHeight: sandboxViewportHeight,\n margin: \"auto\",\n visibility: \"visible\",\n }}\n />\n )}\n </div>\n );\n};\n\nexport default IframeSandbox;\n"],"names":["blackboardVendorPromise","loadBlackboardVendor","m","COMPLETE_IMAGE_TAG_PATTERN","POST_IMAGE_STREAM_DEBOUNCE_MS","SANDBOX_INTERACTION_THROTTLE_MS","replaceRootScreenHeightToken","className","token","segments","replaceRootScreenHeightWithFullClass","html","enabled","match","tagStart","attrs","classMatch","nextClassName","IframeSandbox","content","type","styleLoadingText","scriptLoadingText","fullScreenButtonText","hideFullScreen","mode","replaceRootScreenHeightWithFull","containerRef","useRef","iframeRef","rootRef","updateHeightRef","height","setHeight","useState","lastSandboxInteractionTimeRef","resetToken","setResetToken","isFullscreen","setIsFullscreen","shouldInjectSandboxVendor","isBlackboardMode","shouldMeasureDynamicHeight","shouldProcessRootScreenHeight","prevHtmlRef","htmlContent","React","normalizedHtmlContent","originalRootHeightMeta","inspectViewportHeightFromHtmlRootString","EMPTY_ROOT_HEIGHT_META","shouldStretchRootHeight","renderHtmlContent","setRenderHtmlContent","prevIncomingHtmlRef","pendingHtmlRef","deferRenderTimerRef","initialPaintFrameRef","renderViewportHeightCssRef","emitSandboxInteraction","useCallback","eventType","now","SANDBOX_INTERACTION_MESSAGE_SOURCE","SANDBOX_INTERACTION_MESSAGE_TYPE","clearDeferredRenderTimer","clearInitialPaintFrames","useEffect","prevIncomingHtml","isAppendOnlyStream","containsCompleteImage","rootViewportHeightCss","hasRootVhHeight","sandboxViewportHeight","prev","iframe","doc","shouldBridgeSandboxInteraction","handleSandboxClick","rootEl","root","createRoot","isDestroyed","getHeightInspectionNode","node","getSingleChildElement","childElements","resolveExplicitHeight","parentViewportHeight","precomputedViewportHeightCss","parsed","parseExplicitHeight","container","containerChildren","rootContentElement","runtimeViewportHeightCss","inspectViewportHeightFromNodeChain","runtimeViewportHeight","explicitPixelHeight","resolveExplicitHeightFromNodeChain","updateHeight","bodyRect","htmlRect","bodyHeight","htmlHeight","contentHeight","explicitHeight","nextHeight","prevHeight","scheduleHeightUpdate","inject","resizeObserver","onFullscreenChange","toggleFullscreen","target","jsx","SandboxApp","containerClassName","jsxs","ContentRender"],"mappings":"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"}