markdown-flow-ui 0.1.100-beta.27 → 0.1.100-beta.28

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 (28) hide show
  1. package/dist/Documents/ai-shifu/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
  2. package/dist/Documents/ai-shifu/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
  3. package/dist/Documents/ai-shifu/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
  4. package/dist/Documents/ai-shifu/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
  5. package/dist/Documents/ai-shifu/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
  6. package/dist/Documents/ai-shifu/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
  7. package/dist/Documents/ai-shifu/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
  8. package/dist/Documents/ai-shifu/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
  9. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/style-to-object@1.0.11/node_modules/style-to-object/cjs/index.cjs.js +1 -1
  10. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/style-to-object@1.0.11/node_modules/style-to-object/cjs/index.es.js +1 -1
  11. package/dist/_virtual/index.cjs6.js +1 -1
  12. package/dist/_virtual/index.cjs7.js +1 -1
  13. package/dist/_virtual/index.es6.js +2 -5
  14. package/dist/_virtual/index.es6.js.map +1 -1
  15. package/dist/_virtual/index.es7.js +5 -2
  16. package/dist/_virtual/index.es7.js.map +1 -1
  17. package/dist/components/ContentRender/IframeSandbox.cjs.js +1 -1
  18. package/dist/components/ContentRender/IframeSandbox.cjs.js.map +1 -1
  19. package/dist/components/ContentRender/IframeSandbox.es.js +29 -27
  20. package/dist/components/ContentRender/IframeSandbox.es.js.map +1 -1
  21. package/dist/components/Slide/Slide.cjs.js +1 -1
  22. package/dist/components/Slide/Slide.cjs.js.map +1 -1
  23. package/dist/components/Slide/Slide.es.js +117 -109
  24. package/dist/components/Slide/Slide.es.js.map +1 -1
  25. package/dist/components/ui/inputGroup/textarea.cjs.js +1 -1
  26. package/dist/components/ui/inputGroup/textarea.es.js +1 -1
  27. package/dist/markdown-flow-ui-lib.css +1 -1
  28. package/package.json +1 -1
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const H=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/objectSpread2.cjs.js"),te=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/extends.cjs.js"),i=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/defineProperty.cjs.js"),oe=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/typeof.cjs.js"),u=require("../../../../../../../../../_virtual/index.cjs6.js"),n=require("react"),T=require("./utils/commonUtils.cjs.js");var de=n.forwardRef(function(e,U){var p,x,y,$=e.inputElement,N=e.children,r=e.prefixCls,k=e.prefix,f=e.suffix,C=e.addonBefore,W=e.addonAfter,z=e.className,J=e.style,m=e.disabled,I=e.readOnly,K=e.focused,E=e.triggerFocus,d=e.allowClear,b=e.value,h=e.handleReset,L=e.hidden,t=e.classes,a=e.classNames,g=e.dataAttrs,o=e.styles,l=e.components,w=e.onClear,M=N??$,Q=l?.affixWrapper||"span",V=l?.groupWrapper||"span",X=l?.wrapper||"span",S=l?.groupAddon||"span",A=n.useRef(null),Y=function(s){var q;(q=A.current)!==null&&q!==void 0&&q.contains(s.target)&&E?.()},j=T.hasPrefixSuffix(e),c=n.cloneElement(M,{value:b,className:u.default((p=M.props)===null||p===void 0?void 0:p.className,!j&&a?.variant)||null}),B=n.useRef(null);if(n.useImperativeHandle(U,function(){return{nativeElement:B.current||A.current}}),j){var D=null;if(d){var Z=!m&&!I&&b,R="".concat(r,"-clear-icon"),P=oe.default(d)==="object"&&d!==null&&d!==void 0&&d.clearIcon?d.clearIcon:"✖";D=n.createElement("button",{type:"button",tabIndex:-1,onClick:function(s){h?.(s),w?.()},onMouseDown:function(s){return s.preventDefault()},className:u.default(R,i.default(i.default({},"".concat(R,"-hidden"),!Z),"".concat(R,"-has-suffix"),!!f))},P)}var v="".concat(r,"-affix-wrapper"),ee=u.default(v,i.default(i.default(i.default(i.default(i.default({},"".concat(r,"-disabled"),m),"".concat(v,"-disabled"),m),"".concat(v,"-focused"),K),"".concat(v,"-readonly"),I),"".concat(v,"-input-with-clear-btn"),f&&d&&b),t?.affixWrapper,a?.affixWrapper,a?.variant),ae=(f||d)&&n.createElement("span",{className:u.default("".concat(r,"-suffix"),a?.suffix),style:o?.suffix},D,f);c=n.createElement(Q,te.default({className:ee,style:o?.affixWrapper,onClick:Y},g?.affixWrapper,{ref:A}),k&&n.createElement("span",{className:u.default("".concat(r,"-prefix"),a?.prefix),style:o?.prefix},k),c,ae)}if(T.hasAddon(e)){var _="".concat(r,"-group"),O="".concat(_,"-addon"),F="".concat(_,"-wrapper"),ne=u.default("".concat(r,"-wrapper"),_,t?.wrapper,a?.wrapper),le=u.default(F,i.default({},"".concat(F,"-disabled"),m),t?.group,a?.groupWrapper);c=n.createElement(V,{className:le,ref:B},n.createElement(X,{className:ne},C&&n.createElement(S,{className:O},C),c,W&&n.createElement(S,{className:O},W)))}return n.cloneElement(c,{className:u.default((x=c.props)===null||x===void 0?void 0:x.className,z)||null,style:H.default(H.default({},(y=c.props)===null||y===void 0?void 0:y.style),J),hidden:L})});exports.default=de;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const H=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/objectSpread2.cjs.js"),te=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/extends.cjs.js"),i=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/defineProperty.cjs.js"),oe=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/typeof.cjs.js"),u=require("../../../../../../../../../_virtual/index.cjs7.js"),n=require("react"),T=require("./utils/commonUtils.cjs.js");var de=n.forwardRef(function(e,U){var p,x,y,$=e.inputElement,N=e.children,r=e.prefixCls,k=e.prefix,f=e.suffix,C=e.addonBefore,W=e.addonAfter,z=e.className,J=e.style,m=e.disabled,I=e.readOnly,K=e.focused,E=e.triggerFocus,d=e.allowClear,b=e.value,h=e.handleReset,L=e.hidden,t=e.classes,a=e.classNames,g=e.dataAttrs,o=e.styles,l=e.components,w=e.onClear,M=N??$,Q=l?.affixWrapper||"span",V=l?.groupWrapper||"span",X=l?.wrapper||"span",S=l?.groupAddon||"span",A=n.useRef(null),Y=function(s){var q;(q=A.current)!==null&&q!==void 0&&q.contains(s.target)&&E?.()},j=T.hasPrefixSuffix(e),c=n.cloneElement(M,{value:b,className:u.default((p=M.props)===null||p===void 0?void 0:p.className,!j&&a?.variant)||null}),B=n.useRef(null);if(n.useImperativeHandle(U,function(){return{nativeElement:B.current||A.current}}),j){var D=null;if(d){var Z=!m&&!I&&b,R="".concat(r,"-clear-icon"),P=oe.default(d)==="object"&&d!==null&&d!==void 0&&d.clearIcon?d.clearIcon:"✖";D=n.createElement("button",{type:"button",tabIndex:-1,onClick:function(s){h?.(s),w?.()},onMouseDown:function(s){return s.preventDefault()},className:u.default(R,i.default(i.default({},"".concat(R,"-hidden"),!Z),"".concat(R,"-has-suffix"),!!f))},P)}var v="".concat(r,"-affix-wrapper"),ee=u.default(v,i.default(i.default(i.default(i.default(i.default({},"".concat(r,"-disabled"),m),"".concat(v,"-disabled"),m),"".concat(v,"-focused"),K),"".concat(v,"-readonly"),I),"".concat(v,"-input-with-clear-btn"),f&&d&&b),t?.affixWrapper,a?.affixWrapper,a?.variant),ae=(f||d)&&n.createElement("span",{className:u.default("".concat(r,"-suffix"),a?.suffix),style:o?.suffix},D,f);c=n.createElement(Q,te.default({className:ee,style:o?.affixWrapper,onClick:Y},g?.affixWrapper,{ref:A}),k&&n.createElement("span",{className:u.default("".concat(r,"-prefix"),a?.prefix),style:o?.prefix},k),c,ae)}if(T.hasAddon(e)){var _="".concat(r,"-group"),O="".concat(_,"-addon"),F="".concat(_,"-wrapper"),ne=u.default("".concat(r,"-wrapper"),_,t?.wrapper,a?.wrapper),le=u.default(F,i.default({},"".concat(F,"-disabled"),m),t?.group,a?.groupWrapper);c=n.createElement(V,{className:le,ref:B},n.createElement(X,{className:ne},C&&n.createElement(S,{className:O},C),c,W&&n.createElement(S,{className:O},W)))}return n.cloneElement(c,{className:u.default((x=c.props)===null||x===void 0?void 0:x.className,z)||null,style:H.default(H.default({},(y=c.props)===null||y===void 0?void 0:y.style),J),hidden:L})});exports.default=de;
2
2
  //# sourceMappingURL=BaseInput.cjs.js.map
@@ -2,7 +2,7 @@ import $ from "../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/hel
2
2
  import oe from "../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/extends.es.js";
3
3
  import r from "../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/defineProperty.es.js";
4
4
  import te from "../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/typeof.es.js";
5
- import d from "../../../../../../../../../_virtual/index.es6.js";
5
+ import d from "../../../../../../../../../_virtual/index.es7.js";
6
6
  import l, { useRef as q, cloneElement as ie } from "react";
7
7
  import { hasPrefixSuffix as re, hasAddon as de } from "./utils/commonUtils.es.js";
8
8
  var xe = /* @__PURE__ */ l.forwardRef(function(e, z) {
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const Y=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/extends.cjs.js"),F=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/defineProperty.cjs.js"),N=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/objectSpread2.cjs.js"),J=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/typeof.cjs.js"),f=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/slicedToArray.cjs.js"),K=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.cjs.js"),Q=require("../../../../../../../../../_virtual/index.cjs6.js"),ee=require("../../../../rc-resize-observer@1.4.3_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-resize-observer/es/index.cjs.js"),j=require("../../../../rc-util@5.44.4_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-util/es/hooks/useLayoutEffect.cjs.js"),te=require("../../../../rc-util@5.44.4_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-util/es/hooks/useMergedState.cjs.js"),w=require("../../../../rc-util@5.44.4_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-util/es/raf.cjs.js"),ae=require("react"),re=require("./calculateNodeHeight.cjs.js");function ne(n){const o=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(n){for(const e in n)if(e!=="default"){const s=Object.getOwnPropertyDescriptor(n,e);Object.defineProperty(o,e,s.get?s:{enumerable:!0,get:()=>n[e]})}}return o.default=n,Object.freeze(o)}const t=ne(ae);var ue=["prefixCls","defaultValue","value","autoSize","onResize","className","style","disabled","onChange","onInternalAutoSize"],g=0,m=1,_=2,le=t.forwardRef(function(n,o){var e=n,s=e.prefixCls,O=e.defaultValue,p=e.value,a=e.autoSize,i=e.onResize,T=e.className,$=e.style,b=e.disabled,c=e.onChange,d=e.onInternalAutoSize,P=K.default(e,ue),V=te.default(O,{value:p,postState:function(r){return r??""}}),y=f.default(V,2),D=y[0],Z=y[1],H=function(r){Z(r.target.value),c?.(r)},S=t.useRef();t.useImperativeHandle(o,function(){return{textArea:S.current}});var L=t.useMemo(function(){return a&&J.default(a)==="object"?[a.minRows,a.maxRows]:[]},[a]),E=f.default(L,2),q=E[0],x=E[1],R=!!a,k=t.useState(_),A=f.default(k,2),u=A[0],v=A[1],B=t.useState(),I=f.default(B,2),G=I[0],U=I[1],M=function(){v(g),process.env.NODE_ENV==="test"&&d?.()};j.default(function(){R&&M()},[p,q,x,R]),j.default(function(){if(u===g)v(m);else if(u===m){var l=re.default(S.current,!1,q,x);v(_),U(l)}},[u]);var h=t.useRef(),C=function(){w.default.cancel(h.current)},W=function(r){u===_&&(i?.(r),a&&(C(),h.current=w.default(function(){M()})))};t.useEffect(function(){return C},[]);var X=R?G:null,z=N.default(N.default({},$),X);return(u===g||u===m)&&(z.overflowY="hidden",z.overflowX="hidden"),t.createElement(ee.default,{onResize:W,disabled:!(a||i)},t.createElement("textarea",Y.default({},P,{ref:S,style:z,className:Q.default(s,T,F.default({},"".concat(s,"-disabled"),b)),disabled:b,value:D,onChange:H})))});exports.default=le;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const Y=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/extends.cjs.js"),F=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/defineProperty.cjs.js"),N=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/objectSpread2.cjs.js"),J=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/typeof.cjs.js"),f=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/slicedToArray.cjs.js"),K=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.cjs.js"),Q=require("../../../../../../../../../_virtual/index.cjs7.js"),ee=require("../../../../rc-resize-observer@1.4.3_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-resize-observer/es/index.cjs.js"),j=require("../../../../rc-util@5.44.4_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-util/es/hooks/useLayoutEffect.cjs.js"),te=require("../../../../rc-util@5.44.4_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-util/es/hooks/useMergedState.cjs.js"),w=require("../../../../rc-util@5.44.4_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-util/es/raf.cjs.js"),ae=require("react"),re=require("./calculateNodeHeight.cjs.js");function ne(n){const o=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(n){for(const e in n)if(e!=="default"){const s=Object.getOwnPropertyDescriptor(n,e);Object.defineProperty(o,e,s.get?s:{enumerable:!0,get:()=>n[e]})}}return o.default=n,Object.freeze(o)}const t=ne(ae);var ue=["prefixCls","defaultValue","value","autoSize","onResize","className","style","disabled","onChange","onInternalAutoSize"],g=0,m=1,_=2,le=t.forwardRef(function(n,o){var e=n,s=e.prefixCls,O=e.defaultValue,p=e.value,a=e.autoSize,i=e.onResize,T=e.className,$=e.style,b=e.disabled,c=e.onChange,d=e.onInternalAutoSize,P=K.default(e,ue),V=te.default(O,{value:p,postState:function(r){return r??""}}),y=f.default(V,2),D=y[0],Z=y[1],H=function(r){Z(r.target.value),c?.(r)},S=t.useRef();t.useImperativeHandle(o,function(){return{textArea:S.current}});var L=t.useMemo(function(){return a&&J.default(a)==="object"?[a.minRows,a.maxRows]:[]},[a]),E=f.default(L,2),q=E[0],x=E[1],R=!!a,k=t.useState(_),A=f.default(k,2),u=A[0],v=A[1],B=t.useState(),I=f.default(B,2),G=I[0],U=I[1],M=function(){v(g),process.env.NODE_ENV==="test"&&d?.()};j.default(function(){R&&M()},[p,q,x,R]),j.default(function(){if(u===g)v(m);else if(u===m){var l=re.default(S.current,!1,q,x);v(_),U(l)}},[u]);var h=t.useRef(),C=function(){w.default.cancel(h.current)},W=function(r){u===_&&(i?.(r),a&&(C(),h.current=w.default(function(){M()})))};t.useEffect(function(){return C},[]);var X=R?G:null,z=N.default(N.default({},$),X);return(u===g||u===m)&&(z.overflowY="hidden",z.overflowX="hidden"),t.createElement(ee.default,{onResize:W,disabled:!(a||i)},t.createElement("textarea",Y.default({},P,{ref:S,style:z,className:Q.default(s,T,F.default({},"".concat(s,"-disabled"),b)),disabled:b,value:D,onChange:H})))});exports.default=le;
2
2
  //# sourceMappingURL=ResizableTextArea.cjs.js.map
@@ -4,7 +4,7 @@ import w from "../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/hel
4
4
  import J from "../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/typeof.es.js";
5
5
  import s from "../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/slicedToArray.es.js";
6
6
  import K from "../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.es.js";
7
- import Q from "../../../../../../../../../_virtual/index.es6.js";
7
+ import Q from "../../../../../../../../../_virtual/index.es7.js";
8
8
  import ee from "../../../../rc-resize-observer@1.4.3_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-resize-observer/es/index.es.js";
9
9
  import M from "../../../../rc-util@5.44.4_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-util/es/hooks/useLayoutEffect.es.js";
10
10
  import te from "../../../../rc-util@5.44.4_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-util/es/hooks/useMergedState.es.js";
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const be=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/extends.cjs.js"),X=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/defineProperty.cjs.js"),d=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/objectSpread2.cjs.js"),ze=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/toConsumableArray.cjs.js"),x=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/slicedToArray.cjs.js"),qe=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.cjs.js"),g=require("../../../../../../../../../_virtual/index.cjs6.js"),Te=require("../../../../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"),Ae=require("../../../../rc-util@5.44.4_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-util/es/hooks/useMergedState.cjs.js"),n=require("react"),Fe=require("../../../../rc-input@1.8.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-input/es/hooks/useCount.cjs.js"),Y=require("../../../../rc-input@1.8.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-input/es/utils/commonUtils.cjs.js"),Ne=require("./ResizableTextArea.cjs.js");var Oe=["defaultValue","value","onFocus","onBlur","onChange","allowClear","maxLength","onCompositionStart","onCompositionEnd","suffix","prefixCls","showCount","count","className","style","disabled","hidden","classNames","styles","onResize","onClear","onPressEnter","readOnly","autoSize","onKeyDown"],$e=n.forwardRef(function(t,Z){var C,B=t.defaultValue,_=t.value,p=t.onFocus,y=t.onBlur,L=t.onChange,R=t.allowClear,M=t.maxLength,S=t.onCompositionStart,w=t.onCompositionEnd,ee=t.suffix,P=t.prefixCls,s=P===void 0?"rc-textarea":P,E=t.showCount,te=t.count,ae=t.className,v=t.style,m=t.disabled,ne=t.hidden,l=t.classNames,i=t.styles,b=t.onResize,oe=t.onClear,D=t.onPressEnter,K=t.readOnly,V=t.autoSize,z=t.onKeyDown,le=qe.default(t,Oe),re=Ae.default(B,{value:_,defaultValue:B}),W=x.default(re,2),q=W[0],j=W[1],T=q==null?"":String(q),ue=n.useState(!1),k=x.default(ue,2),se=k[0],A=k[1],F=n.useRef(!1),ie=n.useState(null),H=x.default(ie,2),de=H[0],ce=H[1],U=n.useRef(null),N=n.useRef(null),r=function(){var e;return(e=N.current)===null||e===void 0?void 0:e.textArea},G=function(){r().focus()};n.useImperativeHandle(Z,function(){var a;return{resizableTextArea:N.current,focus:G,blur:function(){r().blur()},nativeElement:((a=U.current)===null||a===void 0?void 0:a.nativeElement)||r()}}),n.useEffect(function(){A(function(a){return!m&&a})},[m]);var fe=n.useState(null),J=x.default(fe,2),O=J[0],ve=J[1];n.useEffect(function(){if(O){var a;(a=r()).setSelectionRange.apply(a,ze.default(O))}},[O]);var o=Fe.default(te,E),c=(C=o.max)!==null&&C!==void 0?C:M,me=Number(c)>0,$=o.strategy(T),he=!!c&&$>c,Q=function(e,u){var h=u;!F.current&&o.exceedFormatter&&o.max&&o.strategy(u)>o.max&&(h=o.exceedFormatter(u,{max:o.max}),u!==h&&ve([r().selectionStart||0,r().selectionEnd||0])),j(h),Y.resolveOnChange(e.currentTarget,e,L,h)},xe=function(e){F.current=!0,S?.(e)},ge=function(e){F.current=!1,Q(e,e.currentTarget.value),w?.(e)},Ce=function(e){Q(e,e.target.value)},pe=function(e){e.key==="Enter"&&D&&D(e),z?.(e)},ye=function(e){A(!0),p?.(e)},Re=function(e){A(!1),y?.(e)},Se=function(e){j(""),G(),Y.resolveOnChange(r(),e,L)},I=ee,f;o.show&&(o.showFormatter?f=o.showFormatter({value:T,count:$,maxLength:c}):f="".concat($).concat(me?" / ".concat(c):""),I=n.createElement(n.Fragment,null,I,n.createElement("span",{className:g.default("".concat(s,"-data-count"),l?.count),style:i?.count},f)));var we=function(e){var u;b?.(e),(u=r())!==null&&u!==void 0&&u.style.height&&ce(!0)},Ee=!V&&!E&&!R;return n.createElement(Te.default,{ref:U,value:T,allowClear:R,handleReset:Se,suffix:I,prefixCls:s,classNames:d.default(d.default({},l),{},{affixWrapper:g.default(l?.affixWrapper,X.default(X.default({},"".concat(s,"-show-count"),E),"".concat(s,"-textarea-allow-clear"),R))}),disabled:m,focused:se,className:g.default(ae,he&&"".concat(s,"-out-of-range")),style:d.default(d.default({},v),de&&!Ee?{height:"auto"}:{}),dataAttrs:{affixWrapper:{"data-count":typeof f=="string"?f:void 0}},hidden:ne,readOnly:K,onClear:oe},n.createElement(Ne.default,be.default({},le,{autoSize:V,maxLength:M,onKeyDown:pe,onChange:Ce,onFocus:ye,onBlur:Re,onCompositionStart:xe,onCompositionEnd:ge,className:g.default(l?.textarea),style:d.default(d.default({},i?.textarea),{},{resize:v?.resize}),disabled:m,prefixCls:s,onResize:we,ref:N,readOnly:K})))});exports.default=$e;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const be=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/extends.cjs.js"),X=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/defineProperty.cjs.js"),d=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/objectSpread2.cjs.js"),ze=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/toConsumableArray.cjs.js"),x=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/slicedToArray.cjs.js"),qe=require("../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.cjs.js"),g=require("../../../../../../../../../_virtual/index.cjs7.js"),Te=require("../../../../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"),Ae=require("../../../../rc-util@5.44.4_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-util/es/hooks/useMergedState.cjs.js"),n=require("react"),Fe=require("../../../../rc-input@1.8.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-input/es/hooks/useCount.cjs.js"),Y=require("../../../../rc-input@1.8.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-input/es/utils/commonUtils.cjs.js"),Ne=require("./ResizableTextArea.cjs.js");var Oe=["defaultValue","value","onFocus","onBlur","onChange","allowClear","maxLength","onCompositionStart","onCompositionEnd","suffix","prefixCls","showCount","count","className","style","disabled","hidden","classNames","styles","onResize","onClear","onPressEnter","readOnly","autoSize","onKeyDown"],$e=n.forwardRef(function(t,Z){var C,B=t.defaultValue,_=t.value,p=t.onFocus,y=t.onBlur,L=t.onChange,R=t.allowClear,M=t.maxLength,S=t.onCompositionStart,w=t.onCompositionEnd,ee=t.suffix,P=t.prefixCls,s=P===void 0?"rc-textarea":P,E=t.showCount,te=t.count,ae=t.className,v=t.style,m=t.disabled,ne=t.hidden,l=t.classNames,i=t.styles,b=t.onResize,oe=t.onClear,D=t.onPressEnter,K=t.readOnly,V=t.autoSize,z=t.onKeyDown,le=qe.default(t,Oe),re=Ae.default(B,{value:_,defaultValue:B}),W=x.default(re,2),q=W[0],j=W[1],T=q==null?"":String(q),ue=n.useState(!1),k=x.default(ue,2),se=k[0],A=k[1],F=n.useRef(!1),ie=n.useState(null),H=x.default(ie,2),de=H[0],ce=H[1],U=n.useRef(null),N=n.useRef(null),r=function(){var e;return(e=N.current)===null||e===void 0?void 0:e.textArea},G=function(){r().focus()};n.useImperativeHandle(Z,function(){var a;return{resizableTextArea:N.current,focus:G,blur:function(){r().blur()},nativeElement:((a=U.current)===null||a===void 0?void 0:a.nativeElement)||r()}}),n.useEffect(function(){A(function(a){return!m&&a})},[m]);var fe=n.useState(null),J=x.default(fe,2),O=J[0],ve=J[1];n.useEffect(function(){if(O){var a;(a=r()).setSelectionRange.apply(a,ze.default(O))}},[O]);var o=Fe.default(te,E),c=(C=o.max)!==null&&C!==void 0?C:M,me=Number(c)>0,$=o.strategy(T),he=!!c&&$>c,Q=function(e,u){var h=u;!F.current&&o.exceedFormatter&&o.max&&o.strategy(u)>o.max&&(h=o.exceedFormatter(u,{max:o.max}),u!==h&&ve([r().selectionStart||0,r().selectionEnd||0])),j(h),Y.resolveOnChange(e.currentTarget,e,L,h)},xe=function(e){F.current=!0,S?.(e)},ge=function(e){F.current=!1,Q(e,e.currentTarget.value),w?.(e)},Ce=function(e){Q(e,e.target.value)},pe=function(e){e.key==="Enter"&&D&&D(e),z?.(e)},ye=function(e){A(!0),p?.(e)},Re=function(e){A(!1),y?.(e)},Se=function(e){j(""),G(),Y.resolveOnChange(r(),e,L)},I=ee,f;o.show&&(o.showFormatter?f=o.showFormatter({value:T,count:$,maxLength:c}):f="".concat($).concat(me?" / ".concat(c):""),I=n.createElement(n.Fragment,null,I,n.createElement("span",{className:g.default("".concat(s,"-data-count"),l?.count),style:i?.count},f)));var we=function(e){var u;b?.(e),(u=r())!==null&&u!==void 0&&u.style.height&&ce(!0)},Ee=!V&&!E&&!R;return n.createElement(Te.default,{ref:U,value:T,allowClear:R,handleReset:Se,suffix:I,prefixCls:s,classNames:d.default(d.default({},l),{},{affixWrapper:g.default(l?.affixWrapper,X.default(X.default({},"".concat(s,"-show-count"),E),"".concat(s,"-textarea-allow-clear"),R))}),disabled:m,focused:se,className:g.default(ae,he&&"".concat(s,"-out-of-range")),style:d.default(d.default({},v),de&&!Ee?{height:"auto"}:{}),dataAttrs:{affixWrapper:{"data-count":typeof f=="string"?f:void 0}},hidden:ne,readOnly:K,onClear:oe},n.createElement(Ne.default,be.default({},le,{autoSize:V,maxLength:M,onKeyDown:pe,onChange:Ce,onFocus:ye,onBlur:Re,onCompositionStart:xe,onCompositionEnd:ge,className:g.default(l?.textarea),style:d.default(d.default({},i?.textarea),{},{resize:v?.resize}),disabled:m,prefixCls:s,onResize:we,ref:N,readOnly:K})))});exports.default=$e;
2
2
  //# sourceMappingURL=TextArea.cjs.js.map
@@ -4,7 +4,7 @@ import d from "../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/hel
4
4
  import Ae from "../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/toConsumableArray.es.js";
5
5
  import x from "../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/slicedToArray.es.js";
6
6
  import Fe from "../../../../@babel_runtime@7.28.4/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.es.js";
7
- import h from "../../../../../../../../../_virtual/index.es6.js";
7
+ import h from "../../../../../../../../../_virtual/index.es7.js";
8
8
  import Ne from "../../../../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";
9
9
  import Te from "../../../../rc-util@5.44.4_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-util/es/hooks/useMergedState.es.js";
10
10
  import o, { useRef as Y, useImperativeHandle as $e, useEffect as Ie } from "react";
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./TextArea.cjs.js");require("../../../../../../../../../_virtual/index.cjs6.js");require("../../../../rc-resize-observer@1.4.3_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-resize-observer/es/index.cjs.js");require("../../../../rc-util@5.44.4_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-util/es/hooks/useLayoutEffect.cjs.js");require("react");require("../../../../rc-util@5.44.4_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-util/es/raf.cjs.js");exports.default=e.default;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./TextArea.cjs.js");require("../../../../../../../../../_virtual/index.cjs7.js");require("../../../../rc-resize-observer@1.4.3_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-resize-observer/es/index.cjs.js");require("../../../../rc-util@5.44.4_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-util/es/hooks/useLayoutEffect.cjs.js");require("react");require("../../../../rc-util@5.44.4_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-util/es/raf.cjs.js");exports.default=e.default;
2
2
  //# sourceMappingURL=index.cjs.js.map
@@ -1,5 +1,5 @@
1
1
  import t from "./TextArea.es.js";
2
- import "../../../../../../../../../_virtual/index.es6.js";
2
+ import "../../../../../../../../../_virtual/index.es7.js";
3
3
  import "../../../../rc-resize-observer@1.4.3_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-resize-observer/es/index.es.js";
4
4
  import "../../../../rc-util@5.44.4_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-util/es/hooks/useLayoutEffect.es.js";
5
5
  import "react";
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("../../../../../../../../../_virtual/index.cjs7.js"),a=require("../../../../inline-style-parser@0.2.4/node_modules/inline-style-parser/index.cjs.js");var i;function d(){if(i)return t.__exports;i=1;var s=t.__exports&&t.__exports.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t.__exports,"__esModule",{value:!0}),t.__exports.default=l;const f=s(a.__require());function l(e,o){let r=null;if(!e||typeof e!="string")return r;const c=(0,f.default)(e),p=typeof o=="function";return c.forEach(u=>{if(u.type!=="declaration")return;const{property:_,value:n}=u;p?o(_,n,u):n&&(r=r||{},r[_]=n)}),r}return t.__exports}exports.__require=d;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("../../../../../../../../../_virtual/index.cjs6.js"),a=require("../../../../inline-style-parser@0.2.4/node_modules/inline-style-parser/index.cjs.js");var i;function d(){if(i)return t.__exports;i=1;var s=t.__exports&&t.__exports.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t.__exports,"__esModule",{value:!0}),t.__exports.default=l;const f=s(a.__require());function l(e,o){let r=null;if(!e||typeof e!="string")return r;const c=(0,f.default)(e),p=typeof o=="function";return c.forEach(u=>{if(u.type!=="declaration")return;const{property:_,value:n}=u;p?o(_,n,u):n&&(r=r||{},r[_]=n)}),r}return t.__exports}exports.__require=d;
2
2
  //# sourceMappingURL=index.cjs.js.map
@@ -1,4 +1,4 @@
1
- import { __exports as r } from "../../../../../../../../../_virtual/index.es7.js";
1
+ import { __exports as r } from "../../../../../../../../../_virtual/index.es6.js";
2
2
  import { __require as p } from "../../../../inline-style-parser@0.2.4/node_modules/inline-style-parser/index.es.js";
3
3
  var f;
4
4
  function q() {
@@ -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("../Documents/ai-shifu/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.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={};exports.__exports=e;
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.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("./_commonjsHelpers.cjs.js"),r=require("../Documents/ai-shifu/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.cjs7.js.map
@@ -1,8 +1,5 @@
1
- import { getDefaultExportFromCjs as r } from "./_commonjsHelpers.es.js";
2
- import { __require as s } from "../Documents/ai-shifu/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
+ var r = {};
5
2
  export {
6
- t as default
3
+ r as __exports
7
4
  };
8
5
  //# sourceMappingURL=index.es6.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es6.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
1
+ {"version":3,"file":"index.es6.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,5 +1,8 @@
1
- var r = {};
1
+ import { getDefaultExportFromCjs as r } from "./_commonjsHelpers.es.js";
2
+ import { __require as s } from "../Documents/ai-shifu/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);
2
5
  export {
3
- r as __exports
6
+ t as default
4
7
  };
5
8
  //# sourceMappingURL=index.es7.js.map
@@ -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,4 +1,4 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const w=require("../../_virtual/jsx-runtime.cjs.js"),r=require("react"),Ne=require("react-dom/client"),_e=require("./SandboxApp.cjs.js"),Pe=require("./utils/split-content.cjs.js"),Ve=require("./ContentRender.cjs.js"),de=require("../../lib/sandboxInteraction.cjs.js");let K=null;const ge=()=>(K||(K=Promise.resolve().then(()=>require("./blackboard-vendor.cjs.js")).then(e=>e.injectBlackboardLibraries)),K);typeof window<"u"&&ge();const Fe=/<img\b[^>]*>/i,je=180,Oe=240,ke=/<img\b[^>]*\bsrc\s*=\s*["']([^"']+)["'][^>]*>/gi,he=new Map,k=new Set,De=e=>{const t=Array.from(e.matchAll(ke));return Array.from(new Set(t.map(n=>n[1]?.trim()).filter(n=>!!n)))},Be=e=>{if(!e)return Promise.resolve();const t=he.get(e);if(t)return t;const n=new Promise(i=>{if(typeof window>"u"){k.add(e),i();return}const s=new window.Image;s.decoding="sync",s.loading="eager",s.fetchPriority="high";const c=()=>{(typeof s.decode=="function"?s.decode().catch(()=>{}):Promise.resolve()).finally(()=>{k.add(e),i()})};s.onload=()=>{c()},s.onerror=()=>{k.add(e),i()},s.src=e,s.complete&&s.naturalWidth>0&&c()});return he.set(e,n),n},me=(e=[])=>Promise.allSettled(e.map(t=>Be(t))),pe=e=>e.split(/\s+/).filter(Boolean).map(t=>t.split(":").pop()||t),D=e=>{const t=e.trim().toLowerCase();if(!t)return null;const n=t.match(/^([0-9.]+)(vh|dvh|svh|lvh)$/i);return n?`${n[1]}${n[2].toLowerCase()}`:null},Q=e=>{if(!e.trim())return null;const t=pe(e);if(t.includes("h-screen")||t.includes("h-dvh"))return"100dvh";if(t.includes("h-svh"))return"100svh";if(t.includes("h-lvh"))return"100lvh";const n=t.find(s=>/^h-\[[0-9.]+(vh|dvh|svh|lvh)\]$/i.test(s));if(!n)return null;const i=n.match(/^h-\[([0-9.]+)(vh|dvh|svh|lvh)\]$/i);return i?`${i[1]}${i[2].toLowerCase()}`:null},Le=new Set(["base","link","meta","script","style","template","title"]),be=e=>!Le.has(e.tagName.toLowerCase()),$e=e=>Array.from(e.childNodes).find(t=>t.nodeType===Node.ELEMENT_NODE&&be(t))||null,qe=e=>{const t=[];let n=$e(e);for(;n;){t.push(n);const i=Array.from(n.children).filter(s=>be(s));if(i.length!==1)break;n=i[0]}return t},ze=e=>{const t=e.getAttribute("height"),n=t?D(t):null;if(n)return n;const i=e.getAttribute("style")?.match(/\bheight\s*:\s*([^;]+)/i)?.[1]||null,s=i?D(i):null;return s||Q(e.getAttribute("class")||"")},we=e=>e==="100vh"||e==="100dvh"||e==="100svh"||e==="100lvh",ve=e=>{const t=qe(e);let n=null,i=!1;return t.forEach(s=>{const c=ze(s);!n&&c&&(n=c),we(c)&&(i=!0)}),{viewportHeightCss:n,hasFullViewportHeight:i}},Ge=e=>{const t=e.trim();if(!t)return{viewportHeightCss:null,hasFullViewportHeight:!1};const i=t.match(/^<([a-zA-Z][\w:-]*)(\s[^>]*?)?>/)?.[2]||"",s=i.match(/\bheight\s*=\s*["']([^"']+)["']/i)?.[1],m=i.match(/\bstyle\s*=\s*["']([^"']+)["']/i)?.[1]?.match(/\bheight\s*:\s*([^;]+)/i)?.[1],y=i.match(/\bclass\s*=\s*["']([^"']+)["']/i)?.[1],h=(s?D(s):null)||(m?D(m):null)||(y?Q(y):null);return{viewportHeightCss:h,hasFullViewportHeight:we(h)}},fe=e=>{const t=e.trim();if(!t)return{viewportHeightCss:null,hasFullViewportHeight:!1};if(typeof document>"u")return Ge(t);const n=document.createElement("template");return n.innerHTML=t,ve(n.content)},Xe=e=>e.split(/\s+/).filter(Boolean).map(t=>{const n=t.split(":");return n[n.length-1]!=="h-screen"?t:(n[n.length-1]="h-full",n.join(":"))}).join(" "),Ue=(e,t)=>!t||!e.trim()?e:e.replace(/^(\s*<[a-zA-Z][\w:-]*)(\s[^>]*?)?>/,(n,i,s="")=>{const c=s.match(/\bclass\s*=\s*(["'])([^"']*)\1/i);if(!c)return n;const m=Xe(c[2]);return m===c[2]?n:`${i}${s.replace(c[0],`class=${c[1]}${m}${c[1]}`)}>`}),We=({content:e,type:t,className:n,loadingText:i,styleLoadingText:s,scriptLoadingText:c,fullScreenButtonText:m,hideFullScreen:y=!1,mode:h="content",replaceRootScreenHeightWithFull:N=!1})=>{const ee=r.useRef(null),H=r.useRef(null),B=r.useRef(null),te=r.useRef(null),L=r.useRef(()=>{}),[Ee,xe]=r.useState(480),ne=r.useRef(0),[re,Re]=r.useState(0),[He,Ce]=r.useState(!1),[,$]=r.useState(!0),ye=t==="sandbox",q=h==="blackboard",z=r.useRef(""),_=r.useMemo(()=>{const o=Pe.splitContentSegments(e).filter(p=>p.type==="sandbox");return(h==="blackboard"?o[o.length-1]?.value||"":o.map(p=>p.value).join(`
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const w=require("../../_virtual/jsx-runtime.cjs.js"),r=require("react"),Ne=require("react-dom/client"),_e=require("./SandboxApp.cjs.js"),Pe=require("./utils/split-content.cjs.js"),Ve=require("./ContentRender.cjs.js"),de=require("../../lib/sandboxInteraction.cjs.js");let K=null;const ge=()=>(K||(K=Promise.resolve().then(()=>require("./blackboard-vendor.cjs.js")).then(e=>e.injectBlackboardLibraries)),K);typeof window<"u"&&ge();const Fe=/<img\b[^>]*>/i,je=180,Oe=240,ke=/<img\b[^>]*\bsrc\s*=\s*["']([^"']+)["'][^>]*>/gi,he=new Map,k=new Set,De=e=>{const t=Array.from(e.matchAll(ke));return Array.from(new Set(t.map(n=>n[1]?.trim()).filter(n=>!!n)))},Be=e=>{if(!e)return Promise.resolve();const t=he.get(e);if(t)return t;const n=new Promise(i=>{if(typeof window>"u"){k.add(e),i();return}const s=new window.Image;s.decoding="sync",s.loading="eager",s.fetchPriority="high";const c=()=>{(typeof s.decode=="function"?s.decode().catch(()=>{}):Promise.resolve()).finally(()=>{k.add(e),i()})};s.onload=()=>{c()},s.onerror=()=>{k.add(e),i()},s.src=e,s.complete&&s.naturalWidth>0&&c()});return he.set(e,n),n},me=(e=[])=>Promise.allSettled(e.map(t=>Be(t))),pe=e=>e.split(/\s+/).filter(Boolean).map(t=>t.split(":").pop()||t),D=e=>{const t=e.trim().toLowerCase();if(!t)return null;const n=t.match(/^([0-9.]+)(vh|dvh|svh|lvh)$/i);return n?`${n[1]}${n[2].toLowerCase()}`:null},Q=e=>{if(!e.trim())return null;const t=pe(e);if(t.includes("h-screen")||t.includes("h-dvh")||t.includes("min-h-screen")||t.includes("min-h-dvh"))return"100dvh";if(t.includes("h-svh")||t.includes("min-h-svh"))return"100svh";if(t.includes("h-lvh")||t.includes("min-h-lvh"))return"100lvh";const n=t.find(s=>/^(h|min-h)-\[[0-9.]+(vh|dvh|svh|lvh)\]$/i.test(s));if(!n)return null;const i=n.match(/^(h|min-h)-\[([0-9.]+)(vh|dvh|svh|lvh)\]$/i);return i?`${i[2]}${i[3].toLowerCase()}`:null},Le=new Set(["base","link","meta","script","style","template","title"]),be=e=>!Le.has(e.tagName.toLowerCase()),$e=e=>Array.from(e.childNodes).find(t=>t.nodeType===Node.ELEMENT_NODE&&be(t))||null,qe=e=>{const t=[];let n=$e(e);for(;n;){t.push(n);const i=Array.from(n.children).filter(s=>be(s));if(i.length!==1)break;n=i[0]}return t},ze=e=>{const t=e.getAttribute("height"),n=t?D(t):null;if(n)return n;const i=e.getAttribute("style")?.match(/\bheight\s*:\s*([^;]+)/i)?.[1]||null,s=i?D(i):null;return s||Q(e.getAttribute("class")||"")},we=e=>e==="100vh"||e==="100dvh"||e==="100svh"||e==="100lvh",ve=e=>{const t=qe(e);let n=null,i=!1;return t.forEach(s=>{const c=ze(s);!n&&c&&(n=c),we(c)&&(i=!0)}),{viewportHeightCss:n,hasFullViewportHeight:i}},Ge=e=>{const t=e.trim();if(!t)return{viewportHeightCss:null,hasFullViewportHeight:!1};const i=t.match(/^<([a-zA-Z][\w:-]*)(\s[^>]*?)?>/)?.[2]||"",s=i.match(/\bheight\s*=\s*["']([^"']+)["']/i)?.[1],m=i.match(/\bstyle\s*=\s*["']([^"']+)["']/i)?.[1]?.match(/\bheight\s*:\s*([^;]+)/i)?.[1],y=i.match(/\bclass\s*=\s*["']([^"']+)["']/i)?.[1],h=(s?D(s):null)||(m?D(m):null)||(y?Q(y):null);return{viewportHeightCss:h,hasFullViewportHeight:we(h)}},fe=e=>{const t=e.trim();if(!t)return{viewportHeightCss:null,hasFullViewportHeight:!1};if(typeof document>"u")return Ge(t);const n=document.createElement("template");return n.innerHTML=t,ve(n.content)},Xe=e=>e.split(/\s+/).filter(Boolean).map(t=>{const n=t.split(":");return n[n.length-1]!=="h-screen"&&n[n.length-1]!=="min-h-screen"?t:(n[n.length-1]="h-full",n.join(":"))}).join(" "),Ue=(e,t)=>!t||!e.trim()?e:e.replace(/^(\s*<[a-zA-Z][\w:-]*)(\s[^>]*?)?>/,(n,i,s="")=>{const c=s.match(/\bclass\s*=\s*(["'])([^"']*)\1/i);if(!c)return n;const m=Xe(c[2]);return m===c[2]?n:`${i}${s.replace(c[0],`class=${c[1]}${m}${c[1]}`)}>`}),We=({content:e,type:t,className:n,loadingText:i,styleLoadingText:s,scriptLoadingText:c,fullScreenButtonText:m,hideFullScreen:y=!1,mode:h="content",replaceRootScreenHeightWithFull:N=!1})=>{const ee=r.useRef(null),H=r.useRef(null),B=r.useRef(null),te=r.useRef(null),L=r.useRef(()=>{}),[Ee,xe]=r.useState(480),ne=r.useRef(0),[re,Re]=r.useState(0),[He,Ce]=r.useState(!1),[,$]=r.useState(!0),ye=t==="sandbox",q=h==="blackboard",z=r.useRef(""),_=r.useMemo(()=>{const o=Pe.splitContentSegments(e).filter(p=>p.type==="sandbox");return(h==="blackboard"?o[o.length-1]?.value||"":o.map(p=>p.value).join(`
2
2
  `))||""},[e,h]),u=r.useMemo(()=>Ue(_,N),[_,N]),S=r.useMemo(()=>De(u),[u]),oe=r.useMemo(()=>fe(_),[_]),se=r.useMemo(()=>N&&oe.hasFullViewportHeight,[oe.hasFullViewportHeight,N]),[P,G]=r.useState(u),ie=r.useRef(u),X=r.useRef(u),A=r.useRef(null),T=r.useRef(null),U=r.useRef(null),W=r.useRef(0),C=r.useCallback(l=>{if(typeof window>"u")return;const o=Date.now();o-ne.current<Oe||(ne.current=o,window.postMessage({source:de.SANDBOX_INTERACTION_MESSAGE_SOURCE,type:de.SANDBOX_INTERACTION_MESSAGE_TYPE,eventType:l},window.location.origin))},[]),le=()=>{A.current!==null&&(window.clearTimeout(A.current),A.current=null)},Se=()=>{T.current!==null&&(window.cancelAnimationFrame(T.current),T.current=null),U.current!==null&&(window.cancelAnimationFrame(U.current),U.current=null)};r.useEffect(()=>()=>{le(),Se()},[]),r.useEffect(()=>{me(S)},[S]),r.useEffect(()=>{const l=ie.current;ie.current=u;const o=!!l&&u.length>l.length&&u.startsWith(l),g=Fe.test(u),p=o&&g&&S.some(v=>!k.has(v)),V=o&&g;if(X.current=u,le(),p){const v=W.current+1;W.current=v,me(S).then(()=>{W.current===v&&G(X.current)});return}if(!V){G(u);return}A.current=window.setTimeout(()=>{G(X.current),A.current=null},je)},[S,u]);const ce=r.useMemo(()=>fe(P).viewportHeightCss,[P]),ue=!!ce,M=q&&t==="sandbox"?se?"100%":ce??`${Ee}px`:void 0;r.useEffect(()=>{if(h!=="blackboard"){z.current=u;return}const l=z.current;!(l&&u.startsWith(l))&&l&&Re(g=>g+1),z.current=u},[h,u]),r.useEffect(()=>{const l=H.current;if(!l)return;const o=l.contentDocument;if(!o)return;o.open(),o.write(`<!DOCTYPE html>
3
3
  <html${h==="blackboard"?' style="height: 100%;"':""}>
4
4
  <head>
@@ -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 { Loader2 } from \"lucide-react\";\nimport SandboxApp from \"./SandboxApp\";\nimport { splitContentSegments } from \"./utils/split-content\";\nimport ContentRender from \"./ContentRender\";\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\n// Warm the sandbox vendor chunk as early as possible in the browser.\nif (typeof window !== \"undefined\") {\n void loadBlackboardVendor();\n}\n\nconst COMPLETE_IMAGE_TAG_PATTERN = /<img\\b[^>]*>/i;\nconst POST_IMAGE_STREAM_DEBOUNCE_MS = 180;\nconst SANDBOX_INTERACTION_THROTTLE_MS = 240;\nconst COMPLETE_IMAGE_SOURCE_PATTERN =\n /<img\\b[^>]*\\bsrc\\s*=\\s*[\"']([^\"']+)[\"'][^>]*>/gi;\nconst SANDBOX_IMAGE_PRELOAD_CACHE = new Map<string, Promise<void>>();\nconst SANDBOX_IMAGE_READY_CACHE = new Set<string>();\n\nconst extractCompleteImageSources = (html: string) => {\n const matches = Array.from(html.matchAll(COMPLETE_IMAGE_SOURCE_PATTERN));\n return Array.from(\n new Set(\n matches\n .map((match) => match[1]?.trim())\n .filter((src): src is string => Boolean(src))\n )\n );\n};\n\nconst preloadSandboxImage = (src: string) => {\n if (!src) {\n return Promise.resolve();\n }\n\n const cached = SANDBOX_IMAGE_PRELOAD_CACHE.get(src);\n if (cached) {\n return cached;\n }\n\n const nextPromise = new Promise<void>((resolve) => {\n if (typeof window === \"undefined\") {\n SANDBOX_IMAGE_READY_CACHE.add(src);\n resolve();\n return;\n }\n\n const image = new window.Image();\n image.decoding = \"sync\";\n image.loading = \"eager\";\n image.fetchPriority = \"high\";\n\n const settleWhenRenderable = () => {\n const decodePromise =\n typeof image.decode === \"function\"\n ? image.decode().catch(() => undefined)\n : Promise.resolve();\n\n void decodePromise.finally(() => {\n SANDBOX_IMAGE_READY_CACHE.add(src);\n resolve();\n });\n };\n\n image.onload = () => {\n settleWhenRenderable();\n };\n image.onerror = () => {\n SANDBOX_IMAGE_READY_CACHE.add(src);\n resolve();\n };\n image.src = src;\n\n if (image.complete && image.naturalWidth > 0) {\n settleWhenRenderable();\n }\n });\n\n SANDBOX_IMAGE_PRELOAD_CACHE.set(src, nextPromise);\n return nextPromise;\n};\n\nconst preloadSandboxImages = (sources: string[] = []) =>\n Promise.allSettled(sources.map((source) => preloadSandboxImage(source)));\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 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 SANDBOX_IGNORED_TAG_NAMES = new Set([\n \"base\",\n \"link\",\n \"meta\",\n \"script\",\n \"style\",\n \"template\",\n \"title\",\n]);\n\nconst isSandboxRenderableElement = (element: Element) =>\n !SANDBOX_IGNORED_TAG_NAMES.has(element.tagName.toLowerCase());\n\nconst getFirstRenderableElementChild = (root: ParentNode) =>\n Array.from(root.childNodes).find(\n (node): node is HTMLElement =>\n node.nodeType === Node.ELEMENT_NODE &&\n isSandboxRenderableElement(node as HTMLElement)\n ) || null;\n\nconst getInspectableSandboxElementChain = (root: ParentNode) => {\n const chain: HTMLElement[] = [];\n let current = getFirstRenderableElementChild(root);\n\n while (current) {\n chain.push(current);\n\n const childElements = Array.from(current.children).filter(\n (element): element is HTMLElement => isSandboxRenderableElement(element)\n );\n\n if (childElements.length !== 1) {\n break;\n }\n\n current = childElements[0];\n }\n\n return chain;\n};\n\nconst extractViewportHeightFromElement = (element: HTMLElement) => {\n const heightAttrValue = element.getAttribute(\"height\");\n const attrViewportHeight = heightAttrValue\n ? parseViewportHeightCss(heightAttrValue)\n : null;\n\n if (attrViewportHeight) {\n return attrViewportHeight;\n }\n\n const styleHeightValue =\n element.getAttribute(\"style\")?.match(/\\bheight\\s*:\\s*([^;]+)/i)?.[1] ||\n null;\n const styleViewportHeight = styleHeightValue\n ? parseViewportHeightCss(styleHeightValue)\n : null;\n\n if (styleViewportHeight) {\n return styleViewportHeight;\n }\n\n return extractViewportHeightFromTailwindClass(\n element.getAttribute(\"class\") || \"\"\n );\n};\n\nconst isFullViewportHeightCss = (value: string | null) =>\n value === \"100vh\" ||\n value === \"100dvh\" ||\n value === \"100svh\" ||\n value === \"100lvh\";\n\nconst inspectSandboxPrimaryHeight = (root: ParentNode) => {\n const inspectableElements = getInspectableSandboxElementChain(root);\n let viewportHeightCss: string | null = null;\n let hasFullViewportHeight = false;\n\n inspectableElements.forEach((element) => {\n const elementViewportHeight = extractViewportHeightFromElement(element);\n\n if (!viewportHeightCss && elementViewportHeight) {\n viewportHeightCss = elementViewportHeight;\n }\n\n if (isFullViewportHeightCss(elementViewportHeight)) {\n hasFullViewportHeight = true;\n }\n });\n\n return {\n viewportHeightCss,\n hasFullViewportHeight,\n };\n};\n\nconst inspectRootHeightFromHtmlString = (html: string) => {\n const normalized = html.trim();\n\n if (!normalized) {\n return {\n viewportHeightCss: null,\n hasFullViewportHeight: false,\n };\n }\n\n const rootMatch = normalized.match(/^<([a-zA-Z][\\w:-]*)(\\s[^>]*?)?>/);\n const attrs = rootMatch?.[2] || \"\";\n const heightAttrValue = attrs.match(/\\bheight\\s*=\\s*[\"']([^\"']+)[\"']/i)?.[1];\n const styleAttrValue = attrs.match(/\\bstyle\\s*=\\s*[\"']([^\"']+)[\"']/i)?.[1];\n const styleHeightValue = styleAttrValue?.match(\n /\\bheight\\s*:\\s*([^;]+)/i\n )?.[1];\n const classAttrValue = attrs.match(/\\bclass\\s*=\\s*[\"']([^\"']+)[\"']/i)?.[1];\n const viewportHeightCss =\n (heightAttrValue ? parseViewportHeightCss(heightAttrValue) : null) ||\n (styleHeightValue ? parseViewportHeightCss(styleHeightValue) : null) ||\n (classAttrValue\n ? extractViewportHeightFromTailwindClass(classAttrValue)\n : null);\n\n return {\n viewportHeightCss,\n hasFullViewportHeight: isFullViewportHeightCss(viewportHeightCss),\n };\n};\n\nconst inspectSandboxPrimaryHeightFromHtml = (html: string) => {\n const normalized = html.trim();\n\n if (!normalized) {\n return {\n viewportHeightCss: null,\n hasFullViewportHeight: false,\n };\n }\n\n if (typeof document === \"undefined\") {\n return inspectRootHeightFromHtmlString(normalized);\n }\n\n const template = document.createElement(\"template\");\n template.innerHTML = normalized;\n\n return inspectSandboxPrimaryHeight(template.content);\n};\n\nconst replaceRootScreenHeightToken = (className: string) =>\n className\n .split(/\\s+/)\n .filter(Boolean)\n .map((token) => {\n const segments = token.split(\":\");\n if (segments[segments.length - 1] !== \"h-screen\") {\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 loadingText,\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 docRef = useRef<Document | 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 [, setIsSandboxVendorReady] = useState(true);\n const shouldInjectSandboxVendor = type === \"sandbox\";\n\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 normalizedHtmlContent = React.useMemo(\n () =>\n replaceRootScreenHeightWithFullClass(\n htmlContent,\n replaceRootScreenHeightWithFull\n ),\n [htmlContent, replaceRootScreenHeightWithFull]\n );\n const completeImageSources = React.useMemo(\n () => extractCompleteImageSources(normalizedHtmlContent),\n [normalizedHtmlContent]\n );\n const htmlHeightMeta = React.useMemo(\n () => inspectSandboxPrimaryHeightFromHtml(htmlContent),\n [htmlContent]\n );\n const shouldStretchRootHeight = React.useMemo(\n () =>\n replaceRootScreenHeightWithFull && htmlHeightMeta.hasFullViewportHeight,\n [htmlHeightMeta.hasFullViewportHeight, replaceRootScreenHeightWithFull]\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 initialPaintCommitFrameRef = useRef<number | null>(null);\n const imagePreloadRequestIdRef = useRef(0);\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 if (initialPaintCommitFrameRef.current !== null) {\n window.cancelAnimationFrame(initialPaintCommitFrameRef.current);\n initialPaintCommitFrameRef.current = null;\n }\n };\n\n useEffect(\n () => () => {\n clearDeferredRenderTimer();\n clearInitialPaintFrames();\n },\n []\n );\n\n useEffect(() => {\n void preloadSandboxImages(completeImageSources);\n }, [completeImageSources]);\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 hasPendingImagePreload =\n isAppendOnlyStream &&\n containsCompleteImage &&\n completeImageSources.some(\n (source) => !SANDBOX_IMAGE_READY_CACHE.has(source)\n );\n const shouldDeferRender = isAppendOnlyStream && containsCompleteImage;\n\n pendingHtmlRef.current = normalizedHtmlContent;\n clearDeferredRenderTimer();\n\n if (hasPendingImagePreload) {\n const requestId = imagePreloadRequestIdRef.current + 1;\n imagePreloadRequestIdRef.current = requestId;\n\n void preloadSandboxImages(completeImageSources).then(() => {\n if (imagePreloadRequestIdRef.current !== requestId) {\n return;\n }\n\n setRenderHtmlContent(pendingHtmlRef.current);\n });\n return;\n }\n\n if (!shouldDeferRender) {\n setRenderHtmlContent(normalizedHtmlContent);\n return;\n }\n\n deferRenderTimerRef.current = window.setTimeout(() => {\n setRenderHtmlContent(pendingHtmlRef.current);\n deferRenderTimerRef.current = null;\n }, POST_IMAGE_STREAM_DEBOUNCE_MS);\n }, [completeImageSources, normalizedHtmlContent]);\n\n const rootViewportHeightCss = React.useMemo(\n () =>\n inspectSandboxPrimaryHeightFromHtml(renderHtmlContent).viewportHeightCss,\n [renderHtmlContent]\n );\n const hasRootVhHeight = Boolean(rootViewportHeightCss);\n const sandboxViewportHeight =\n isBlackboardMode && type === \"sandbox\"\n ? shouldStretchRootHeight\n ? \"100%\"\n : (rootViewportHeightCss ?? `${height}px`)\n : undefined;\n const shouldShowHtmlFallbackWhilePreparingSandbox = false;\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 html, body, #root { width: 100%; height: 100%; }\n html, body { margin: 0; padding: 0; overflow: auto; }\n *, *::before, *::after { box-sizing: border-box; }\n </style>\n </head>\n <body>\n <div id=\"root\"></div>\n </body>\n</html>`);\n doc.close();\n\n docRef.current = doc;\n\n 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 parentViewportHeight =\n iframeRef.current.ownerDocument?.documentElement?.clientHeight ||\n window.innerHeight;\n const { viewportHeightCss } = inspectSandboxPrimaryHeight(doc.body);\n const parsed = viewportHeightCss\n ? parseExplicitHeight(viewportHeightCss, parentViewportHeight)\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 target = wrapper?.querySelector(\n \".sandbox-container > *\"\n ) as HTMLElement | null;\n\n if (!target) return null;\n\n const heightValue = target.style.height || target.getAttribute(\"height\");\n const explicitPixelHeight = heightValue\n ? parseExplicitHeight(heightValue, parentViewportHeight)\n : null;\n\n if (explicitPixelHeight !== null) {\n return Math.ceil(explicitPixelHeight);\n }\n\n const classHeight = parseTailwindHeightClass(\n target.getAttribute(\"class\") || \"\",\n parentViewportHeight\n );\n\n return classHeight !== null ? Math.ceil(classHeight) : null;\n };\n\n const updateHeight = () => {\n if (!iframeRef.current || !doc.body) return;\n const bodyRect = doc.body.getBoundingClientRect();\n const htmlRect = doc.documentElement?.getBoundingClientRect();\n const bodyHeight = bodyRect.height;\n const htmlHeight = htmlRect?.height || 0;\n const contentHeight = Math.max(bodyHeight, htmlHeight);\n const explicitHeight = resolveExplicitHeight();\n const nextHeight = Math.max(\n 200,\n explicitHeight ?? Math.ceil(contentHeight)\n );\n setHeight(nextHeight);\n };\n const scheduleHeightUpdate = () => {\n requestAnimationFrame(() => {\n if (isDestroyed) return;\n updateHeight();\n });\n };\n updateHeightRef.current = scheduleHeightUpdate;\n\n updateHeight();\n scheduleHeightUpdate();\n\n if (!shouldInjectSandboxVendor) {\n setIsSandboxVendorReady(true);\n } else {\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 setIsSandboxVendorReady(true);\n scheduleHeightUpdate();\n });\n })\n .catch(() => {\n if (isDestroyed) return;\n setIsSandboxVendorReady(true);\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(\"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 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 stretchRootHeight={shouldStretchRootHeight}\n />\n );\n\n initialPaintFrameRef.current = window.requestAnimationFrame(() => {\n updateHeightRef.current?.();\n initialPaintFrameRef.current = null;\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 : \"aspect-[16/9] overflow-hidden flex items-center justify-center\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const shouldShowSandboxLoading = false;\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\n onMouseDown={() => emitSandboxInteraction(\"mousedown\")}\n onPointerDown={() => emitSandboxInteraction(\"pointerdown\")}\n onTouchStart={() => emitSandboxInteraction(\"touchstart\")}\n >\n <ContentRender content={content} />\n </div>\n ) : (\n <>\n {shouldShowHtmlFallbackWhilePreparingSandbox ? (\n <div\n aria-hidden\n className=\"absolute inset-0 z-10 overflow-hidden\"\n style={{\n height: sandboxViewportHeight ?? \"100%\",\n minHeight: sandboxViewportHeight,\n }}\n >\n <div\n className=\"h-full w-full\"\n dangerouslySetInnerHTML={{ __html: renderHtmlContent }}\n />\n </div>\n ) : null}\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 {shouldShowSandboxLoading ? (\n <div className=\"pointer-events-none absolute inset-0 z-20 flex items-center justify-center\">\n <Loader2\n aria-label={loadingText || \"Preparing sandbox styles\"}\n className=\"text-primary h-7 w-7 animate-spin\"\n />\n </div>\n ) : null}\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","COMPLETE_IMAGE_SOURCE_PATTERN","SANDBOX_IMAGE_PRELOAD_CACHE","SANDBOX_IMAGE_READY_CACHE","extractCompleteImageSources","html","matches","match","src","preloadSandboxImage","cached","nextPromise","resolve","image","settleWhenRenderable","preloadSandboxImages","sources","source","normalizeTailwindHeightTokens","className","token","parseViewportHeightCss","value","normalized","matched","extractViewportHeightFromTailwindClass","normalizedTokens","arbitraryToken","SANDBOX_IGNORED_TAG_NAMES","isSandboxRenderableElement","element","getFirstRenderableElementChild","root","node","getInspectableSandboxElementChain","chain","current","childElements","extractViewportHeightFromElement","heightAttrValue","attrViewportHeight","styleHeightValue","styleViewportHeight","isFullViewportHeightCss","inspectSandboxPrimaryHeight","inspectableElements","viewportHeightCss","hasFullViewportHeight","elementViewportHeight","inspectRootHeightFromHtmlString","attrs","classAttrValue","inspectSandboxPrimaryHeightFromHtml","template","replaceRootScreenHeightToken","segments","replaceRootScreenHeightWithFullClass","enabled","tagStart","classMatch","nextClassName","IframeSandbox","content","type","loadingText","styleLoadingText","scriptLoadingText","fullScreenButtonText","hideFullScreen","mode","replaceRootScreenHeightWithFull","containerRef","useRef","iframeRef","rootRef","docRef","updateHeightRef","height","setHeight","useState","lastSandboxInteractionTimeRef","resetToken","setResetToken","isFullscreen","setIsFullscreen","setIsSandboxVendorReady","shouldInjectSandboxVendor","isBlackboardMode","prevHtmlRef","htmlContent","React","sandboxSegments","splitContentSegments","seg","normalizedHtmlContent","completeImageSources","htmlHeightMeta","shouldStretchRootHeight","renderHtmlContent","setRenderHtmlContent","prevIncomingHtmlRef","pendingHtmlRef","deferRenderTimerRef","initialPaintFrameRef","initialPaintCommitFrameRef","imagePreloadRequestIdRef","emitSandboxInteraction","useCallback","eventType","now","SANDBOX_INTERACTION_MESSAGE_SOURCE","SANDBOX_INTERACTION_MESSAGE_TYPE","clearDeferredRenderTimer","clearInitialPaintFrames","useEffect","prevIncomingHtml","isAppendOnlyStream","containsCompleteImage","hasPendingImagePreload","shouldDeferRender","requestId","rootViewportHeightCss","hasRootVhHeight","sandboxViewportHeight","prev","iframe","doc","shouldBridgeSandboxInteraction","handleSandboxPointerDown","handleSandboxMouseDown","handleSandboxTouchStart","rootEl","createRoot","isDestroyed","parseExplicitHeight","parentViewportHeight","numeric","parseTailwindHeightClass","resolveExplicitHeight","parsed","target","heightValue","explicitPixelHeight","classHeight","updateHeight","bodyRect","htmlRect","bodyHeight","htmlHeight","contentHeight","explicitHeight","nextHeight","scheduleHeightUpdate","inject","resizeObserver","onFullscreenChange","toggleFullscreen","jsx","SandboxApp","containerClassName","jsxs","ContentRender","Fragment"],"mappings":"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"}
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 { Loader2 } from \"lucide-react\";\nimport SandboxApp from \"./SandboxApp\";\nimport { splitContentSegments } from \"./utils/split-content\";\nimport ContentRender from \"./ContentRender\";\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\n// Warm the sandbox vendor chunk as early as possible in the browser.\nif (typeof window !== \"undefined\") {\n void loadBlackboardVendor();\n}\n\nconst COMPLETE_IMAGE_TAG_PATTERN = /<img\\b[^>]*>/i;\nconst POST_IMAGE_STREAM_DEBOUNCE_MS = 180;\nconst SANDBOX_INTERACTION_THROTTLE_MS = 240;\nconst COMPLETE_IMAGE_SOURCE_PATTERN =\n /<img\\b[^>]*\\bsrc\\s*=\\s*[\"']([^\"']+)[\"'][^>]*>/gi;\nconst SANDBOX_IMAGE_PRELOAD_CACHE = new Map<string, Promise<void>>();\nconst SANDBOX_IMAGE_READY_CACHE = new Set<string>();\n\nconst extractCompleteImageSources = (html: string) => {\n const matches = Array.from(html.matchAll(COMPLETE_IMAGE_SOURCE_PATTERN));\n return Array.from(\n new Set(\n matches\n .map((match) => match[1]?.trim())\n .filter((src): src is string => Boolean(src))\n )\n );\n};\n\nconst preloadSandboxImage = (src: string) => {\n if (!src) {\n return Promise.resolve();\n }\n\n const cached = SANDBOX_IMAGE_PRELOAD_CACHE.get(src);\n if (cached) {\n return cached;\n }\n\n const nextPromise = new Promise<void>((resolve) => {\n if (typeof window === \"undefined\") {\n SANDBOX_IMAGE_READY_CACHE.add(src);\n resolve();\n return;\n }\n\n const image = new window.Image();\n image.decoding = \"sync\";\n image.loading = \"eager\";\n image.fetchPriority = \"high\";\n\n const settleWhenRenderable = () => {\n const decodePromise =\n typeof image.decode === \"function\"\n ? image.decode().catch(() => undefined)\n : Promise.resolve();\n\n void decodePromise.finally(() => {\n SANDBOX_IMAGE_READY_CACHE.add(src);\n resolve();\n });\n };\n\n image.onload = () => {\n settleWhenRenderable();\n };\n image.onerror = () => {\n SANDBOX_IMAGE_READY_CACHE.add(src);\n resolve();\n };\n image.src = src;\n\n if (image.complete && image.naturalWidth > 0) {\n settleWhenRenderable();\n }\n });\n\n SANDBOX_IMAGE_PRELOAD_CACHE.set(src, nextPromise);\n return nextPromise;\n};\n\nconst preloadSandboxImages = (sources: string[] = []) =>\n Promise.allSettled(sources.map((source) => preloadSandboxImage(source)));\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 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 normalizedTokens.includes(\"min-h-screen\") ||\n normalizedTokens.includes(\"min-h-dvh\")\n ) {\n return \"100dvh\";\n }\n if (\n normalizedTokens.includes(\"h-svh\") ||\n normalizedTokens.includes(\"min-h-svh\")\n ) {\n return \"100svh\";\n }\n if (\n normalizedTokens.includes(\"h-lvh\") ||\n normalizedTokens.includes(\"min-h-lvh\")\n ) {\n return \"100lvh\";\n }\n const arbitraryToken = normalizedTokens.find((token) =>\n /^(h|min-h)-\\[[0-9.]+(vh|dvh|svh|lvh)\\]$/i.test(token)\n );\n if (!arbitraryToken) return null;\n const matched = arbitraryToken.match(\n /^(h|min-h)-\\[([0-9.]+)(vh|dvh|svh|lvh)\\]$/i\n );\n if (!matched) return null;\n return `${matched[2]}${matched[3].toLowerCase()}`;\n};\n\nconst SANDBOX_IGNORED_TAG_NAMES = new Set([\n \"base\",\n \"link\",\n \"meta\",\n \"script\",\n \"style\",\n \"template\",\n \"title\",\n]);\n\nconst isSandboxRenderableElement = (element: Element) =>\n !SANDBOX_IGNORED_TAG_NAMES.has(element.tagName.toLowerCase());\n\nconst getFirstRenderableElementChild = (root: ParentNode) =>\n Array.from(root.childNodes).find(\n (node): node is HTMLElement =>\n node.nodeType === Node.ELEMENT_NODE &&\n isSandboxRenderableElement(node as HTMLElement)\n ) || null;\n\nconst getInspectableSandboxElementChain = (root: ParentNode) => {\n const chain: HTMLElement[] = [];\n let current = getFirstRenderableElementChild(root);\n\n while (current) {\n chain.push(current);\n\n const childElements = Array.from(current.children).filter(\n (element): element is HTMLElement => isSandboxRenderableElement(element)\n );\n\n if (childElements.length !== 1) {\n break;\n }\n\n current = childElements[0];\n }\n\n return chain;\n};\n\nconst extractViewportHeightFromElement = (element: HTMLElement) => {\n const heightAttrValue = element.getAttribute(\"height\");\n const attrViewportHeight = heightAttrValue\n ? parseViewportHeightCss(heightAttrValue)\n : null;\n\n if (attrViewportHeight) {\n return attrViewportHeight;\n }\n\n const styleHeightValue =\n element.getAttribute(\"style\")?.match(/\\bheight\\s*:\\s*([^;]+)/i)?.[1] ||\n null;\n const styleViewportHeight = styleHeightValue\n ? parseViewportHeightCss(styleHeightValue)\n : null;\n\n if (styleViewportHeight) {\n return styleViewportHeight;\n }\n\n return extractViewportHeightFromTailwindClass(\n element.getAttribute(\"class\") || \"\"\n );\n};\n\nconst isFullViewportHeightCss = (value: string | null) =>\n value === \"100vh\" ||\n value === \"100dvh\" ||\n value === \"100svh\" ||\n value === \"100lvh\";\n\nconst inspectSandboxPrimaryHeight = (root: ParentNode) => {\n const inspectableElements = getInspectableSandboxElementChain(root);\n let viewportHeightCss: string | null = null;\n let hasFullViewportHeight = false;\n\n inspectableElements.forEach((element) => {\n const elementViewportHeight = extractViewportHeightFromElement(element);\n\n if (!viewportHeightCss && elementViewportHeight) {\n viewportHeightCss = elementViewportHeight;\n }\n\n if (isFullViewportHeightCss(elementViewportHeight)) {\n hasFullViewportHeight = true;\n }\n });\n\n return {\n viewportHeightCss,\n hasFullViewportHeight,\n };\n};\n\nconst inspectRootHeightFromHtmlString = (html: string) => {\n const normalized = html.trim();\n\n if (!normalized) {\n return {\n viewportHeightCss: null,\n hasFullViewportHeight: false,\n };\n }\n\n const rootMatch = normalized.match(/^<([a-zA-Z][\\w:-]*)(\\s[^>]*?)?>/);\n const attrs = rootMatch?.[2] || \"\";\n const heightAttrValue = attrs.match(/\\bheight\\s*=\\s*[\"']([^\"']+)[\"']/i)?.[1];\n const styleAttrValue = attrs.match(/\\bstyle\\s*=\\s*[\"']([^\"']+)[\"']/i)?.[1];\n const styleHeightValue = styleAttrValue?.match(\n /\\bheight\\s*:\\s*([^;]+)/i\n )?.[1];\n const classAttrValue = attrs.match(/\\bclass\\s*=\\s*[\"']([^\"']+)[\"']/i)?.[1];\n const viewportHeightCss =\n (heightAttrValue ? parseViewportHeightCss(heightAttrValue) : null) ||\n (styleHeightValue ? parseViewportHeightCss(styleHeightValue) : null) ||\n (classAttrValue\n ? extractViewportHeightFromTailwindClass(classAttrValue)\n : null);\n\n return {\n viewportHeightCss,\n hasFullViewportHeight: isFullViewportHeightCss(viewportHeightCss),\n };\n};\n\nconst inspectSandboxPrimaryHeightFromHtml = (html: string) => {\n const normalized = html.trim();\n\n if (!normalized) {\n return {\n viewportHeightCss: null,\n hasFullViewportHeight: false,\n };\n }\n\n if (typeof document === \"undefined\") {\n return inspectRootHeightFromHtmlString(normalized);\n }\n\n const template = document.createElement(\"template\");\n template.innerHTML = normalized;\n\n return inspectSandboxPrimaryHeight(template.content);\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 loadingText,\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 docRef = useRef<Document | 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 [, setIsSandboxVendorReady] = useState(true);\n const shouldInjectSandboxVendor = type === \"sandbox\";\n\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 normalizedHtmlContent = React.useMemo(\n () =>\n replaceRootScreenHeightWithFullClass(\n htmlContent,\n replaceRootScreenHeightWithFull\n ),\n [htmlContent, replaceRootScreenHeightWithFull]\n );\n const completeImageSources = React.useMemo(\n () => extractCompleteImageSources(normalizedHtmlContent),\n [normalizedHtmlContent]\n );\n const htmlHeightMeta = React.useMemo(\n () => inspectSandboxPrimaryHeightFromHtml(htmlContent),\n [htmlContent]\n );\n const shouldStretchRootHeight = React.useMemo(\n () =>\n replaceRootScreenHeightWithFull && htmlHeightMeta.hasFullViewportHeight,\n [htmlHeightMeta.hasFullViewportHeight, replaceRootScreenHeightWithFull]\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 initialPaintCommitFrameRef = useRef<number | null>(null);\n const imagePreloadRequestIdRef = useRef(0);\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 if (initialPaintCommitFrameRef.current !== null) {\n window.cancelAnimationFrame(initialPaintCommitFrameRef.current);\n initialPaintCommitFrameRef.current = null;\n }\n };\n\n useEffect(\n () => () => {\n clearDeferredRenderTimer();\n clearInitialPaintFrames();\n },\n []\n );\n\n useEffect(() => {\n void preloadSandboxImages(completeImageSources);\n }, [completeImageSources]);\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 hasPendingImagePreload =\n isAppendOnlyStream &&\n containsCompleteImage &&\n completeImageSources.some(\n (source) => !SANDBOX_IMAGE_READY_CACHE.has(source)\n );\n const shouldDeferRender = isAppendOnlyStream && containsCompleteImage;\n\n pendingHtmlRef.current = normalizedHtmlContent;\n clearDeferredRenderTimer();\n\n if (hasPendingImagePreload) {\n const requestId = imagePreloadRequestIdRef.current + 1;\n imagePreloadRequestIdRef.current = requestId;\n\n void preloadSandboxImages(completeImageSources).then(() => {\n if (imagePreloadRequestIdRef.current !== requestId) {\n return;\n }\n\n setRenderHtmlContent(pendingHtmlRef.current);\n });\n return;\n }\n\n if (!shouldDeferRender) {\n setRenderHtmlContent(normalizedHtmlContent);\n return;\n }\n\n deferRenderTimerRef.current = window.setTimeout(() => {\n setRenderHtmlContent(pendingHtmlRef.current);\n deferRenderTimerRef.current = null;\n }, POST_IMAGE_STREAM_DEBOUNCE_MS);\n }, [completeImageSources, normalizedHtmlContent]);\n\n const rootViewportHeightCss = React.useMemo(\n () =>\n inspectSandboxPrimaryHeightFromHtml(renderHtmlContent).viewportHeightCss,\n [renderHtmlContent]\n );\n const hasRootVhHeight = Boolean(rootViewportHeightCss);\n const sandboxViewportHeight =\n isBlackboardMode && type === \"sandbox\"\n ? shouldStretchRootHeight\n ? \"100%\"\n : (rootViewportHeightCss ?? `${height}px`)\n : undefined;\n const shouldShowHtmlFallbackWhilePreparingSandbox = false;\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 html, body, #root { width: 100%; height: 100%; }\n html, body { margin: 0; padding: 0; overflow: auto; }\n *, *::before, *::after { box-sizing: border-box; }\n </style>\n </head>\n <body>\n <div id=\"root\"></div>\n </body>\n</html>`);\n doc.close();\n\n docRef.current = doc;\n\n 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 parentViewportHeight =\n iframeRef.current.ownerDocument?.documentElement?.clientHeight ||\n window.innerHeight;\n const { viewportHeightCss } = inspectSandboxPrimaryHeight(doc.body);\n const parsed = viewportHeightCss\n ? parseExplicitHeight(viewportHeightCss, parentViewportHeight)\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 target = wrapper?.querySelector(\n \".sandbox-container > *\"\n ) as HTMLElement | null;\n\n if (!target) return null;\n\n const heightValue = target.style.height || target.getAttribute(\"height\");\n const explicitPixelHeight = heightValue\n ? parseExplicitHeight(heightValue, parentViewportHeight)\n : null;\n\n if (explicitPixelHeight !== null) {\n return Math.ceil(explicitPixelHeight);\n }\n\n const classHeight = parseTailwindHeightClass(\n target.getAttribute(\"class\") || \"\",\n parentViewportHeight\n );\n\n return classHeight !== null ? Math.ceil(classHeight) : null;\n };\n\n const updateHeight = () => {\n if (!iframeRef.current || !doc.body) return;\n const bodyRect = doc.body.getBoundingClientRect();\n const htmlRect = doc.documentElement?.getBoundingClientRect();\n const bodyHeight = bodyRect.height;\n const htmlHeight = htmlRect?.height || 0;\n const contentHeight = Math.max(bodyHeight, htmlHeight);\n const explicitHeight = resolveExplicitHeight();\n const nextHeight = Math.max(\n 200,\n explicitHeight ?? Math.ceil(contentHeight)\n );\n setHeight(nextHeight);\n };\n const scheduleHeightUpdate = () => {\n requestAnimationFrame(() => {\n if (isDestroyed) return;\n updateHeight();\n });\n };\n updateHeightRef.current = scheduleHeightUpdate;\n\n updateHeight();\n scheduleHeightUpdate();\n\n if (!shouldInjectSandboxVendor) {\n setIsSandboxVendorReady(true);\n } else {\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 setIsSandboxVendorReady(true);\n scheduleHeightUpdate();\n });\n })\n .catch(() => {\n if (isDestroyed) return;\n setIsSandboxVendorReady(true);\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(\"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 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 stretchRootHeight={shouldStretchRootHeight}\n />\n );\n\n initialPaintFrameRef.current = window.requestAnimationFrame(() => {\n updateHeightRef.current?.();\n initialPaintFrameRef.current = null;\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 : \"aspect-[16/9] overflow-hidden flex items-center justify-center\",\n ]\n .filter(Boolean)\n .join(\" \");\n\n const shouldShowSandboxLoading = false;\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\n onMouseDown={() => emitSandboxInteraction(\"mousedown\")}\n onPointerDown={() => emitSandboxInteraction(\"pointerdown\")}\n onTouchStart={() => emitSandboxInteraction(\"touchstart\")}\n >\n <ContentRender content={content} />\n </div>\n ) : (\n <>\n {shouldShowHtmlFallbackWhilePreparingSandbox ? (\n <div\n aria-hidden\n className=\"absolute inset-0 z-10 overflow-hidden\"\n style={{\n height: sandboxViewportHeight ?? \"100%\",\n minHeight: sandboxViewportHeight,\n }}\n >\n <div\n className=\"h-full w-full\"\n dangerouslySetInnerHTML={{ __html: renderHtmlContent }}\n />\n </div>\n ) : null}\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 {shouldShowSandboxLoading ? (\n <div className=\"pointer-events-none absolute inset-0 z-20 flex items-center justify-center\">\n <Loader2\n aria-label={loadingText || \"Preparing sandbox styles\"}\n className=\"text-primary h-7 w-7 animate-spin\"\n />\n </div>\n ) : null}\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","COMPLETE_IMAGE_SOURCE_PATTERN","SANDBOX_IMAGE_PRELOAD_CACHE","SANDBOX_IMAGE_READY_CACHE","extractCompleteImageSources","html","matches","match","src","preloadSandboxImage","cached","nextPromise","resolve","image","settleWhenRenderable","preloadSandboxImages","sources","source","normalizeTailwindHeightTokens","className","token","parseViewportHeightCss","value","normalized","matched","extractViewportHeightFromTailwindClass","normalizedTokens","arbitraryToken","SANDBOX_IGNORED_TAG_NAMES","isSandboxRenderableElement","element","getFirstRenderableElementChild","root","node","getInspectableSandboxElementChain","chain","current","childElements","extractViewportHeightFromElement","heightAttrValue","attrViewportHeight","styleHeightValue","styleViewportHeight","isFullViewportHeightCss","inspectSandboxPrimaryHeight","inspectableElements","viewportHeightCss","hasFullViewportHeight","elementViewportHeight","inspectRootHeightFromHtmlString","attrs","classAttrValue","inspectSandboxPrimaryHeightFromHtml","template","replaceRootScreenHeightToken","segments","replaceRootScreenHeightWithFullClass","enabled","tagStart","classMatch","nextClassName","IframeSandbox","content","type","loadingText","styleLoadingText","scriptLoadingText","fullScreenButtonText","hideFullScreen","mode","replaceRootScreenHeightWithFull","containerRef","useRef","iframeRef","rootRef","docRef","updateHeightRef","height","setHeight","useState","lastSandboxInteractionTimeRef","resetToken","setResetToken","isFullscreen","setIsFullscreen","setIsSandboxVendorReady","shouldInjectSandboxVendor","isBlackboardMode","prevHtmlRef","htmlContent","React","sandboxSegments","splitContentSegments","seg","normalizedHtmlContent","completeImageSources","htmlHeightMeta","shouldStretchRootHeight","renderHtmlContent","setRenderHtmlContent","prevIncomingHtmlRef","pendingHtmlRef","deferRenderTimerRef","initialPaintFrameRef","initialPaintCommitFrameRef","imagePreloadRequestIdRef","emitSandboxInteraction","useCallback","eventType","now","SANDBOX_INTERACTION_MESSAGE_SOURCE","SANDBOX_INTERACTION_MESSAGE_TYPE","clearDeferredRenderTimer","clearInitialPaintFrames","useEffect","prevIncomingHtml","isAppendOnlyStream","containsCompleteImage","hasPendingImagePreload","shouldDeferRender","requestId","rootViewportHeightCss","hasRootVhHeight","sandboxViewportHeight","prev","iframe","doc","shouldBridgeSandboxInteraction","handleSandboxPointerDown","handleSandboxMouseDown","handleSandboxTouchStart","rootEl","createRoot","isDestroyed","parseExplicitHeight","parentViewportHeight","numeric","parseTailwindHeightClass","resolveExplicitHeight","parsed","target","heightValue","explicitPixelHeight","classHeight","updateHeight","bodyRect","htmlRect","bodyHeight","htmlHeight","contentHeight","explicitHeight","nextHeight","scheduleHeightUpdate","inject","resizeObserver","onFullscreenChange","toggleFullscreen","jsx","SandboxApp","containerClassName","jsxs","ContentRender","Fragment"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { j as w } from "../../_virtual/jsx-runtime.es.js";
2
- import R, { useRef as d, useState as V, useCallback as Ve, useEffect as C } from "react";
2
+ import R, { useRef as h, useState as V, useCallback as Ve, useEffect as C } from "react";
3
3
  import { createRoot as Fe } from "react-dom/client";
4
4
  import Pe from "./SandboxApp.es.js";
5
5
  import { splitContentSegments as ke } from "./utils/split-content.es.js";
@@ -51,18 +51,20 @@ const Le = /<img\b[^>]*>/i, $e = 180, je = 240, ze = /<img\b[^>]*\bsrc\s*=\s*["'
51
51
  }, ne = (e) => {
52
52
  if (!e.trim()) return null;
53
53
  const t = we(e);
54
- if (t.includes("h-screen") || t.includes("h-dvh"))
54
+ if (t.includes("h-screen") || t.includes("h-dvh") || t.includes("min-h-screen") || t.includes("min-h-dvh"))
55
55
  return "100dvh";
56
- if (t.includes("h-svh"))
56
+ if (t.includes("h-svh") || t.includes("min-h-svh"))
57
57
  return "100svh";
58
- if (t.includes("h-lvh"))
58
+ if (t.includes("h-lvh") || t.includes("min-h-lvh"))
59
59
  return "100lvh";
60
60
  const n = t.find(
61
- (o) => /^h-\[[0-9.]+(vh|dvh|svh|lvh)\]$/i.test(o)
61
+ (o) => /^(h|min-h)-\[[0-9.]+(vh|dvh|svh|lvh)\]$/i.test(o)
62
62
  );
63
63
  if (!n) return null;
64
- const s = n.match(/^h-\[([0-9.]+)(vh|dvh|svh|lvh)\]$/i);
65
- return s ? `${s[1]}${s[2].toLowerCase()}` : null;
64
+ const s = n.match(
65
+ /^(h|min-h)-\[([0-9.]+)(vh|dvh|svh|lvh)\]$/i
66
+ );
67
+ return s ? `${s[2]}${s[3].toLowerCase()}` : null;
66
68
  }, Xe = /* @__PURE__ */ new Set([
67
69
  "base",
68
70
  "link",
@@ -113,10 +115,10 @@ const Le = /<img\b[^>]*>/i, $e = 180, je = 240, ze = /<img\b[^>]*\bsrc\s*=\s*["'
113
115
  };
114
116
  const s = t.match(/^<([a-zA-Z][\w:-]*)(\s[^>]*?)?>/)?.[2] || "", o = s.match(/\bheight\s*=\s*["']([^"']+)["']/i)?.[1], m = s.match(/\bstyle\s*=\s*["']([^"']+)["']/i)?.[1]?.match(
115
117
  /\bheight\s*:\s*([^;]+)/i
116
- )?.[1], S = s.match(/\bclass\s*=\s*["']([^"']+)["']/i)?.[1], h = (o ? j(o) : null) || (m ? j(m) : null) || (S ? ne(S) : null);
118
+ )?.[1], S = s.match(/\bclass\s*=\s*["']([^"']+)["']/i)?.[1], d = (o ? j(o) : null) || (m ? j(m) : null) || (S ? ne(S) : null);
117
119
  return {
118
- viewportHeightCss: h,
119
- hasFullViewportHeight: He(h)
120
+ viewportHeightCss: d,
121
+ hasFullViewportHeight: He(d)
120
122
  };
121
123
  }, pe = (e) => {
122
124
  const t = e.trim();
@@ -131,7 +133,7 @@ const Le = /<img\b[^>]*>/i, $e = 180, je = 240, ze = /<img\b[^>]*\bsrc\s*=\s*["'
131
133
  return n.innerHTML = t, Ee(n.content);
132
134
  }, Je = (e) => e.split(/\s+/).filter(Boolean).map((t) => {
133
135
  const n = t.split(":");
134
- return n[n.length - 1] !== "h-screen" ? t : (n[n.length - 1] = "h-full", n.join(":"));
136
+ return n[n.length - 1] !== "h-screen" && n[n.length - 1] !== "min-h-screen" ? t : (n[n.length - 1] = "h-full", n.join(":"));
135
137
  }).join(" "), Ke = (e, t) => !t || !e.trim() ? e : e.replace(
136
138
  /^(\s*<[a-zA-Z][\w:-]*)(\s[^>]*?)?>/,
137
139
  (n, s, o = "") => {
@@ -153,15 +155,15 @@ const Le = /<img\b[^>]*>/i, $e = 180, je = 240, ze = /<img\b[^>]*\bsrc\s*=\s*["'
153
155
  scriptLoadingText: l,
154
156
  fullScreenButtonText: m,
155
157
  hideFullScreen: S = !1,
156
- mode: h = "content",
158
+ mode: d = "content",
157
159
  replaceRootScreenHeightWithFull: F = !1
158
160
  }) => {
159
- const re = d(null), y = d(null), z = d(null), oe = d(null), G = d(() => {
160
- }), [xe, Ce] = V(480), se = d(0), [ie, ye] = V(0), [Ae, Re] = V(!1), [, q] = V(!0), Se = t === "sandbox", X = h === "blackboard", U = d(""), P = R.useMemo(() => {
161
+ const re = h(null), y = h(null), z = h(null), oe = h(null), G = h(() => {
162
+ }), [xe, Ce] = V(480), se = h(0), [ie, ye] = V(0), [Ae, Re] = V(!1), [, q] = V(!0), Se = t === "sandbox", X = d === "blackboard", U = h(""), P = R.useMemo(() => {
161
163
  const r = ke(e).filter((p) => p.type === "sandbox");
162
- return (h === "blackboard" ? r[r.length - 1]?.value || "" : r.map((p) => p.value).join(`
164
+ return (d === "blackboard" ? r[r.length - 1]?.value || "" : r.map((p) => p.value).join(`
163
165
  `)) || "";
164
- }, [e, h]), c = R.useMemo(
166
+ }, [e, d]), c = R.useMemo(
165
167
  () => Ke(
166
168
  P,
167
169
  F
@@ -178,7 +180,7 @@ const Le = /<img\b[^>]*>/i, $e = 180, je = 240, ze = /<img\b[^>]*\bsrc\s*=\s*["'
178
180
  [le.hasFullViewportHeight, F]
179
181
  ), [k, W] = V(
180
182
  c
181
- ), ae = d(c), Y = d(c), M = d(null), I = d(null), Z = d(null), J = d(0), A = Ve((i) => {
183
+ ), ae = h(c), Y = h(c), M = h(null), I = h(null), Z = h(null), J = h(0), A = Ve((i) => {
182
184
  if (typeof window > "u")
183
185
  return;
184
186
  const r = Date.now();
@@ -225,24 +227,24 @@ const Le = /<img\b[^>]*>/i, $e = 180, je = 240, ze = /<img\b[^>]*\bsrc\s*=\s*["'
225
227
  W(Y.current), M.current = null;
226
228
  }, $e);
227
229
  }, [T, c]);
228
- const de = R.useMemo(
230
+ const he = R.useMemo(
229
231
  () => pe(k).viewportHeightCss,
230
232
  [k]
231
- ), he = !!de, N = X && t === "sandbox" ? ce ? "100%" : de ?? `${xe}px` : void 0;
233
+ ), de = !!he, N = X && t === "sandbox" ? ce ? "100%" : he ?? `${xe}px` : void 0;
232
234
  C(() => {
233
- if (h !== "blackboard") {
235
+ if (d !== "blackboard") {
234
236
  U.current = c;
235
237
  return;
236
238
  }
237
239
  const i = U.current;
238
240
  !(i && c.startsWith(i)) && i && ye((g) => g + 1), U.current = c;
239
- }, [h, c]), C(() => {
241
+ }, [d, c]), C(() => {
240
242
  const i = y.current;
241
243
  if (!i) return;
242
244
  const r = i.contentDocument;
243
245
  if (!r) return;
244
246
  r.open(), r.write(`<!DOCTYPE html>
245
- <html${h === "blackboard" ? ' style="height: 100%;"' : ""}>
247
+ <html${d === "blackboard" ? ' style="height: 100%;"' : ""}>
246
248
  <head>
247
249
  <meta charset="utf-8" />
248
250
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
@@ -357,8 +359,8 @@ const Le = /<img\b[^>]*>/i, $e = 180, je = 240, ze = /<img\b[^>]*\bsrc\s*=\s*["'
357
359
  fullScreenButtonText: m,
358
360
  hideFullScreen: S,
359
361
  resetToken: ie,
360
- hasRootVhHeight: he,
361
- mode: h,
362
+ hasRootVhHeight: de,
363
+ mode: d,
362
364
  stretchRootHeight: ce
363
365
  }
364
366
  )
@@ -372,7 +374,7 @@ const Le = /<img\b[^>]*>/i, $e = 180, je = 240, ze = /<img\b[^>]*\bsrc\s*=\s*["'
372
374
  l,
373
375
  m,
374
376
  ie,
375
- h
377
+ d
376
378
  ]);
377
379
  const Ie = [
378
380
  "w-full relative content-render-iframe-sandbox",
@@ -382,7 +384,7 @@ const Le = /<img\b[^>]*>/i, $e = 180, je = 240, ze = /<img\b[^>]*\bsrc\s*=\s*["'
382
384
  "div",
383
385
  {
384
386
  ref: re,
385
- "data-root-vh": he ? "true" : "false",
387
+ "data-root-vh": de ? "true" : "false",
386
388
  className: Ie,
387
389
  style: N ? {
388
390
  height: N,
@@ -398,7 +400,7 @@ const Le = /<img\b[^>]*>/i, $e = 180, je = 240, ze = /<img\b[^>]*\bsrc\s*=\s*["'
398
400
  children: Ae ? "退出全屏" : m || "全屏浏览"
399
401
  }
400
402
  ),
401
- h === "blackboard" && t === "markdown" ? /* @__PURE__ */ w.jsx(
403
+ d === "blackboard" && t === "markdown" ? /* @__PURE__ */ w.jsx(
402
404
  "div",
403
405
  {
404
406
  onMouseDown: () => A("mousedown"),