markdown-flow-ui 0.2.19-dev.1 → 0.2.20-dev.1

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.
@@ -1,6 +1,6 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const n=require("react/jsx-runtime"),r=require("react"),Fe=require("../../_virtual/index.cjs"),Pe=require("./utils/sanitize-invalid-tag-name.cjs"),We=require("./utils/strip-svg-text-line-breaks.cjs");;/* empty css */;/* empty css */;/* empty css */;/* empty css */const Ne=require("./CodeBlock.cjs"),$e=require("./plugins/CustomVariable.cjs"),se=require("./plugins/MermaidChart.cjs"),be=require("./utils/custom-variable-props.cjs"),ke=require("./utils/highlight-languages.cjs"),oe=require("./utils/mermaid-parse.cjs"),Re=require("./utils/normalize-inline-html.cjs"),He=require("./IframeSandbox.cjs"),S=require("./utils/typewriter-pacing.cjs"),Qe=require("./utils/split-content.cjs"),Oe=require("../../lib/interaction-defaults.cjs"),Se=require("../../lib/locale.cjs"),je=require("./contentRenderI18n.cjs"),Ue=require("../../node_modules/react-markdown/lib/index.cjs"),Ke=require("../../node_modules/rehype-raw/lib/index.cjs"),Xe=require("../../node_modules/rehype-highlight/lib/index.cjs"),Ye=require("../../node_modules/rehype-katex/lib/index.cjs"),Ze=require("../../node_modules/remark-gfm/lib/index.cjs"),Je=require("../../node_modules/remark-math/lib/index.cjs"),et=require("../../node_modules/remark-breaks/lib/index.cjs"),tt=/<(script|style|link|iframe|html|head|body|meta|title|base|template|div|section|article|main)\b/i,nt=2,Be=({svg:t})=>{const s=r.useRef(null);return r.useEffect(()=>{const o=s.current;if(!o)return;const a=o.shadowRoot??o.attachShadow({mode:"open"}),w="content-render-svg-style";let d=a.getElementById(w);d||(d=document.createElement("style"),d.id=w,d.textContent=`
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const n=require("react/jsx-runtime"),r=require("react"),Fe=require("../../_virtual/index.cjs"),Pe=require("./utils/sanitize-invalid-tag-name.cjs"),We=require("./utils/strip-svg-text-line-breaks.cjs");;/* empty css */;/* empty css */;/* empty css */;/* empty css */const Ne=require("./CodeBlock.cjs"),$e=require("./plugins/CustomVariable.cjs"),se=require("./plugins/MermaidChart.cjs"),ke=require("./utils/custom-variable-props.cjs"),be=require("./utils/highlight-languages.cjs"),oe=require("./utils/mermaid-parse.cjs"),Re=require("./utils/normalize-inline-html.cjs"),He=require("./IframeSandbox.cjs"),N=require("./utils/typewriter-pacing.cjs"),Qe=require("./utils/split-content.cjs"),Oe=require("../../lib/interaction-defaults.cjs"),Se=require("../../lib/locale.cjs"),je=require("./contentRenderI18n.cjs"),Ue=require("../../node_modules/react-markdown/lib/index.cjs"),Ke=require("../../node_modules/rehype-raw/lib/index.cjs"),Xe=require("../../node_modules/rehype-highlight/lib/index.cjs"),Ye=require("../../node_modules/rehype-katex/lib/index.cjs"),Ze=require("../../node_modules/remark-gfm/lib/index.cjs"),Je=require("../../node_modules/remark-math/lib/index.cjs"),et=require("../../node_modules/remark-breaks/lib/index.cjs"),tt=/<(script|style|link|iframe|html|head|body|meta|title|base|template|div|section|article|main)\b/i,nt=2,Be=({svg:t})=>{const s=r.useRef(null);return r.useEffect(()=>{const o=s.current;if(!o)return;const a=o.shadowRoot??o.attachShadow({mode:"open"}),C="content-render-svg-style";let d=a.getElementById(C);d||(d=document.createElement("style"),d.id=C,d.textContent=`
2
2
  svg { height: auto; display: inline-block; }
3
3
  svg.content-render-svg-el--responsive { width: 100%; max-width: 100%; }
4
4
  svg.content-render-svg-el--fixed { max-width: none; }
5
- `,a.appendChild(d)),Array.from(a.childNodes).filter(i=>i!==d).forEach(i=>a.removeChild(i));const D=document.createElement("template"),q=We.stripSvgTextLineBreaks(t);D.innerHTML=q,a.append(D.content.cloneNode(!0));let m=!1,V=!1;a.querySelectorAll("svg").forEach(i=>{const G=i.getAttribute("viewBox");if(!G)return;const _=G.trim().split(/[\s,]+/).map(v=>Number(v));if(_.length!==4||_.some(Number.isNaN))return;const[,,M,k]=_,N=i.getAttribute("width"),L=i.getAttribute("height"),W=v=>{if(!v)return!1;const u=v.trim().toLowerCase();return u==="auto"||u.endsWith("%")},$=v=>{if(!v)return null;const u=v.trim().toLowerCase();if(u==="auto"||u.endsWith("%"))return null;const j=Number.parseFloat(u);return Number.isNaN(j)?null:j},K=W(N),X=W(L),H=!N||N==="0",Q=!L||L==="0",Y=$(N),Z=$(L);if(K||X||H&&Q||Y===M&&Z===k){m=!0,i.classList.add("content-render-svg-el--responsive"),i.classList.remove("content-render-svg-el--fixed"),i.style.width="100%",i.style.height="auto",!i.style.aspectRatio&&k>0&&(i.style.aspectRatio=`${M} / ${k}`);return}V=!0,i.classList.add("content-render-svg-el--fixed"),i.classList.remove("content-render-svg-el--responsive"),H&&M>0&&i.setAttribute("width",`${M}`),Q&&k>0&&i.setAttribute("height",`${k}`)});const z=m&&!V;o.classList.toggle("content-render-svg--responsive",z),o.classList.toggle("content-render-svg--fixed",!z)},[t]),n.jsx("div",{className:"content-render-svg-scroll",children:n.jsx("div",{className:"content-render-svg",ref:s})})},ae=r.createContext(null),rt=t=>{const s=r.useContext(ae),o=r.useContext(Ne.CodeBlockContext);if(!s)throw new Error("Markdown code renderer requires ContentRender context.");const{className:a,children:w,...d}=t;if(/language-(\w+)/.exec(a||"")?.[1]==="mermaid"){const q=w?.toString().replace(/\n$/,"")||"",m=oe.mermaidBlockIsComplete(s.current.renderContent,q);return n.jsx(se.default,{chart:q,frozen:m,messages:s.current.mermaidMessages})}return n.jsx("code",{className:a,...d,dir:d.dir??(o?void 0:"ltr"),children:w})},st=[Ze.default,Je.default,Fe.default,et.default],ot=[be.preserveCustomVariableProperties,Ke.default,Pe.sanitizeInvalidTagName,be.restoreCustomVariableProperties,[Xe.default,{languages:ke.highlightLanguages,subset:ke.subsetLanguages}],Ye.default],ie=({content:t,components:s,locale:o})=>{const a=je.getContentRenderLocaleTexts(o);return n.jsx("div",{className:"markdown-renderer",children:n.jsx(Ue.Markdown,{remarkPlugins:st,rehypePlugins:ot,remarkRehypeOptions:{footnoteLabel:a.footnoteLabel,footnoteBackLabel:(w,d)=>{const B=String(w+1)+(d>1?`-${d}`:"");return a.footnoteBackLabel.replace("{reference}",B)}},components:s,children:t})})},at=t=>{if(t.length<=1)return t;const s=[];return t.forEach(o=>{if(o.type==="sandbox"){s.push(o);return}const a=s[s.length-1];if(a&&a.type!=="sandbox"){s[s.length-1]={type:"markdown",value:`${a.value}${o.value}`};return}s.push({type:"markdown",value:o.value})}),s},it=(t,s)=>{const o=Math.max(1,s),a=Array.from(t);return{chunk:a.slice(0,o).join(""),rest:a.slice(o).join("")}},ct=(t,s)=>t===s?!0:!t||!s||t.length!==s.length?!1:t.every((o,a)=>o===s[a]),ut=t=>{const s=r.useRef(t);return ct(s.current,t)||(s.current=t),s.current},lt=({content:t,contentType:s,locale:o,lang:a,dir:w,customRenderBar:d,onSend:B,typingSpeed:D=40,enableTypewriter:q=!1,typewriterPacing:m="fixed",onTypeFinished:V,onTypewriterStateChange:z,userInput:i,interactionDefaultValueOptions:G,defaultButtonText:_,defaultInputText:M,defaultSelectedValues:k,readonly:N=!1,confirmButtonText:L,copyButtonText:W,copiedButtonText:$,sandboxLoadingText:K,sandboxStyleLoadingText:X,sandboxScriptLoadingText:H,disableSandboxLoadingOverlay:Q=!1,sandboxFullscreenButtonText:Y,sandboxExitFullscreenButtonText:Z,sandboxMode:ce="content",onClickCustomButtonAfterContent:J,beforeSend:v})=>{const u=je.getContentRenderLocaleTexts(o),j=r.useMemo(()=>({loading:u.mermaidLoadingText,emptyChart:u.mermaidEmptyChartText,error:u.mermaidErrorText}),[u]),F=w??Se.getMarkdownFlowDirection(o),P=a??Se.getMarkdownFlowLanguage(o),ue=L||u.confirmButtonText,le=W||u.copyButtonText,de=$||u.copiedButtonText,qe=Y||u.sandboxFullscreenButtonText,Me=Z||u.sandboxExitFullscreenButtonText,f=!!q&&(!s||s==="text"),me=Math.max(0,D),Le=m==="fixed"?t:void 0,[C,fe]=r.useState(()=>f?"":t),O=r.useRef(C),p=r.useRef(""),g=r.useRef({tokens:[],head:0,trailingGrapheme:""}),R=r.useRef(0),he=r.useRef(f),pe=r.useRef(m),xe=r.useRef(t),ee=r.useRef(!1),[Ae,Ee]=r.useState(0);r.useEffect(()=>{const e=he.current,c=pe.current,h=xe.current,b=!!p.current;he.current=f,pe.current=m,xe.current=t,(t!==h||f!==e)&&(ee.current=!1);const x=()=>{p.current="",g.current={tokens:[],head:0,trailingGrapheme:""},R.current=0},A=I=>{O.current=I,fe(I)};if(!f){x(),A(t);return}e||(x(),A(""));const y=e?O.current:"";if(!t.startsWith(y)){x(),A(t),m==="content-aware"&&(g.current={tokens:[],head:0,trailingGrapheme:S.getTrailingTypewriterGrapheme(t)});return}let E=t.slice(y.length);if(!E){p.current="",R.current=0,g.current=m==="content-aware"?{tokens:[],head:0,trailingGrapheme:S.getTrailingTypewriterGrapheme(y)}:{tokens:[],head:0,trailingGrapheme:""};return}if(m==="content-aware"){const I=h.slice(y.length);if(e&&c==="content-aware"&&t.startsWith(h)&&p.current===I){const U=S.appendContentAwareTypewriterQueue(g.current,t.slice(h.length));g.current=U.queue,U.immediateChunk&&(E=E.slice(U.immediateChunk.length),A(`${y}${U.immediateChunk}`))}else g.current={...S.createContentAwareTypewriterQueue(E),trailingGrapheme:S.getTrailingTypewriterGrapheme(y)},R.current=0}else g.current={tokens:[],head:0,trailingGrapheme:""},R.current=0;p.current=E,!b&&E&&Ee(I=>I+1)},[t,f,m]),r.useEffect(()=>{f&&(ee.current||p.current||C!==t||(ee.current=!0,V?.()))},[t,C,f,V]),r.useEffect(()=>{if(!f||!p.current)return;const e=window.setTimeout(()=>{if(!p.current)return;let c="";if(m==="content-aware"){const b=S.consumeContentAwareTypewriterQueue(g.current,R.current+S.CONTENT_AWARE_TYPEWRITER_TICK_BUDGET);c=b.chunk,g.current=b.queue,S.isContentAwareTypewriterQueueEmpty(b.queue)?R.current=0:R.current=b.remainingBudget}else c=it(p.current,nt).chunk;if(!c)return;p.current=p.current.slice(c.length),p.current||(g.current=m==="content-aware"?{tokens:[],head:0,trailingGrapheme:g.current.trailingGrapheme}:{tokens:[],head:0,trailingGrapheme:""},R.current=0);const h=`${O.current}${c}`;O.current=h,fe(h)},me);return()=>window.clearTimeout(e)},[C,Le,f,m,me,Ae]);const ge=r.useMemo(()=>({isTypewriterEnabled:f,isTyping:f&&C!==t,isComplete:C===t,renderedLength:C.length,totalLength:t.length}),[t,C,f]);r.useEffect(()=>{z?.(ge)},[z,ge]);const T=f?C:t,te=r.useMemo(()=>Re.normalizeInlineHtml(T),[T]),ne=r.useMemo(()=>Oe.getInteractionDefaultValues(T,i,G),[G,T,i]),ve=_?.trim()||ne.buttonText,Te=M?.trim()||ne.inputText,Ie=r.useMemo(()=>i?i.split(",").map(e=>e.trim()).filter(Boolean):void 0,[i]),De=k?.length?k:ne.selectedValues||Ie,ye=ut(De),l=r.useRef({direction:F,language:P,mermaidMessages:j,beforeSend:v,locale:o,onClickCustomButtonAfterContent:J,onSend:B,readonly:N,renderContent:T,resolvedConfirmButtonText:ue,resolvedCopiedButtonText:de,resolvedCopyButtonText:le,resolvedDefaultButtonText:ve,resolvedDefaultInputText:Te,resolvedDefaultSelectedValues:ye});l.current={direction:F,language:P,mermaidMessages:j,beforeSend:v,locale:o,onClickCustomButtonAfterContent:J,onSend:B,readonly:N,renderContent:T,resolvedConfirmButtonText:ue,resolvedCopiedButtonText:de,resolvedCopyButtonText:le,resolvedDefaultButtonText:ve,resolvedDefaultInputText:Te,resolvedDefaultSelectedValues:ye};const we=r.useMemo(()=>({"custom-button-after-content":({children:e})=>n.jsx("button",{className:"content-render-custom-button-after-content",onClick:l.current.onClickCustomButtonAfterContent,children:n.jsx("span",{className:"content-render-custom-button-after-content-inner",children:e})}),"custom-variable":e=>n.jsx($e.default,{...e,readonly:l.current.readonly,defaultButtonText:l.current.resolvedDefaultButtonText,defaultInputText:l.current.resolvedDefaultInputText,defaultSelectedValues:l.current.resolvedDefaultSelectedValues,onSend:l.current.onSend,beforeSend:l.current.beforeSend,locale:l.current.locale,dir:l.current.direction,lang:l.current.language,confirmButtonText:l.current.resolvedConfirmButtonText}),code:rt,table:({...e})=>n.jsx("div",{className:"content-render-table-container",children:n.jsx("table",{className:"content-render-table",...e})}),th:({...e})=>n.jsx("th",{className:"content-render-th",...e}),td:({...e})=>n.jsx("td",{className:"content-render-td",...e}),tr:({...e})=>n.jsx("tr",{className:"content-render-tr",...e}),li:({node:e,...c})=>{const h=e?.properties?.className;return typeof h=="string"&&h.includes("task-list-item")||Array.isArray(h)&&h.includes("task-list-item")?n.jsx("li",{className:"content-render-task-list-item",...c}):n.jsx("li",{...c})},ol:({...e})=>n.jsx("ol",{className:"content-render-ol",...e}),ul:({...e})=>n.jsx("ul",{className:"content-render-ul",...e}),input:({...e})=>e.type==="checkbox"?n.jsx("input",{type:"checkbox",className:"content-render-checkbox",disabled:!0,...e}):n.jsx("input",{...e}),a:({children:e,...c})=>n.jsx("a",{target:"_blank",rel:"noopener noreferrer",...c,children:e}),pre:e=>n.jsx(Ne.default,{...e,copyButtonText:l.current.resolvedCopyButtonText,copiedButtonText:l.current.resolvedCopiedButtonText})}),[]),Ce=r.useMemo(()=>tt.test(T),[T]),re=r.useMemo(()=>Ce?Qe.splitContentSegments(T,!0):[],[T,Ce]),Ve=re.some(e=>e.type==="sandbox"),ze=r.useMemo(()=>at(re),[re]),Ge=r.useMemo(()=>oe.parseMarkdownSegments(te),[te]),_e=(e,c)=>{const h=Re.normalizeInlineHtml(e);return oe.parseMarkdownSegments(h).map((x,A)=>{const y=`${c}-${x.type}-${A}`;return x.type==="text"?n.jsx(ae.Provider,{value:l,children:n.jsx(ie,{locale:o,components:we,content:x.value})},y):x.type==="mermaid"?n.jsx(se.default,{chart:x.value,frozen:!x.complete,messages:j},y):x.type==="svg"?n.jsx(Be,{svg:x.value},y):null})};return Ve?n.jsx("div",{className:"content-render markdown-body",dir:F,lang:P,children:ze.map((e,c)=>e.type==="sandbox"?n.jsx(He.default,{hideFullScreen:!0,type:"sandbox",content:e.value,className:"content-render-iframe",locale:o,dir:F,lang:P,loadingText:K,styleLoadingText:X,scriptLoadingText:H,disableLoadingOverlay:Q,fullScreenButtonText:qe,exitFullScreenButtonText:Me,mode:ce},`sandbox-${c}`):n.jsx(r.Fragment,{children:_e(e.value,`md-${c}`)},`md-${c}`))}):n.jsxs("div",{className:"content-render markdown-body",dir:F,lang:P,children:[Ge.map((e,c)=>{if(e.type==="text")return n.jsx(ae.Provider,{value:l,children:n.jsx(ie,{locale:o,components:we,content:e.value})},c);if(e.type==="mermaid")return n.jsx(se.default,{chart:e.value,frozen:!e.complete,messages:j},c);if(e.type==="svg")return n.jsx(Be,{svg:e.value},c)}),d&&n.jsx("div",{className:"content-render-custom-bar",children:r.createElement(d,{content:t,displayContent:te,onSend:B})})]})};exports.MarkdownRenderer=ie;exports.default=lt;
5
+ `,a.appendChild(d)),Array.from(a.childNodes).filter(i=>i!==d).forEach(i=>a.removeChild(i));const V=document.createElement("template"),A=We.stripSvgTextLineBreaks(t);V.innerHTML=A,a.append(V.content.cloneNode(!0));let m=!1,z=!1;a.querySelectorAll("svg").forEach(i=>{const _=i.getAttribute("viewBox");if(!_)return;const F=_.trim().split(/[\s,]+/).map(T=>Number(T));if(F.length!==4||F.some(Number.isNaN))return;const[,,E,R]=F,q=i.getAttribute("width"),I=i.getAttribute("height"),$=T=>{if(!T)return!1;const u=T.trim().toLowerCase();return u==="auto"||u.endsWith("%")},H=T=>{if(!T)return null;const u=T.trim().toLowerCase();if(u==="auto"||u.endsWith("%"))return null;const M=Number.parseFloat(u);return Number.isNaN(M)?null:M},K=$(q),X=$(I),Q=!q||q==="0",O=!I||I==="0",Y=H(q),Z=H(I);if(K||X||Q&&O||Y===E&&Z===R){m=!0,i.classList.add("content-render-svg-el--responsive"),i.classList.remove("content-render-svg-el--fixed"),i.style.width="100%",i.style.height="auto",!i.style.aspectRatio&&R>0&&(i.style.aspectRatio=`${E} / ${R}`);return}z=!0,i.classList.add("content-render-svg-el--fixed"),i.classList.remove("content-render-svg-el--responsive"),Q&&E>0&&i.setAttribute("width",`${E}`),O&&R>0&&i.setAttribute("height",`${R}`)});const G=m&&!z;o.classList.toggle("content-render-svg--responsive",G),o.classList.toggle("content-render-svg--fixed",!G)},[t]),n.jsx("div",{className:"content-render-svg-scroll",children:n.jsx("div",{className:"content-render-svg",ref:s})})},ae=r.createContext(null),rt=t=>{const s=r.useContext(ae),o=r.useContext(Ne.CodeBlockContext);if(!s)throw new Error("Markdown code renderer requires ContentRender context.");const{className:a,children:C,...d}=t;if(/language-(\w+)/.exec(a||"")?.[1]==="mermaid"){const A=C?.toString().replace(/\n$/,"")||"",m=oe.mermaidBlockIsComplete(s.current.renderContent,A);return n.jsx(se.default,{chart:A,frozen:m,messages:s.current.mermaidMessages})}return n.jsx("code",{className:a,...d,dir:d.dir??(o?void 0:"ltr"),children:C})},st=[Ze.default,Je.default,Fe.default,et.default],ot=[ke.preserveCustomVariableProperties,Ke.default,Pe.sanitizeInvalidTagName,ke.restoreCustomVariableProperties,[Xe.default,{languages:be.highlightLanguages,subset:be.subsetLanguages}],Ye.default],ie=({content:t,components:s,locale:o})=>{const a=je.getContentRenderLocaleTexts(o);return n.jsx("div",{className:"markdown-renderer",children:n.jsx(Ue.Markdown,{remarkPlugins:st,rehypePlugins:ot,remarkRehypeOptions:{footnoteLabel:a.footnoteLabel,footnoteBackLabel:(C,d)=>{const j=String(C+1)+(d>1?`-${d}`:"");return a.footnoteBackLabel.replace("{reference}",j)}},components:s,children:t})})},at=t=>{if(t.length<=1)return t;const s=[];return t.forEach(o=>{if(o.type==="sandbox"){s.push(o);return}const a=s[s.length-1];if(a&&a.type!=="sandbox"){s[s.length-1]={type:"markdown",value:`${a.value}${o.value}`};return}s.push({type:"markdown",value:o.value})}),s},it=(t,s)=>{const o=Math.max(1,s),a=Array.from(t);return{chunk:a.slice(0,o).join(""),rest:a.slice(o).join("")}},ct=(t,s)=>t===s?!0:!t||!s||t.length!==s.length?!1:t.every((o,a)=>o===s[a]),ut=t=>{const s=r.useRef(t);return ct(s.current,t)||(s.current=t),s.current},lt=({content:t,contentType:s,locale:o,lang:a,dir:C,customRenderBar:d,onSend:j,typingSpeed:V=40,enableTypewriter:A=!1,typewriterPacing:m="fixed",onTypeFinished:z,onTypewriterStateChange:G,userInput:i,interactionDefaultValueOptions:_,defaultButtonText:F,defaultInputText:E,defaultSelectedValues:R,readonly:q=!1,confirmButtonText:I,copyButtonText:$,copiedButtonText:H,sandboxLoadingText:K,sandboxStyleLoadingText:X,sandboxScriptLoadingText:Q,disableSandboxLoadingOverlay:O=!1,sandboxFullscreenButtonText:Y,sandboxExitFullscreenButtonText:Z,sandboxMode:ce="content",onClickCustomButtonAfterContent:J,beforeSend:T})=>{const u=je.getContentRenderLocaleTexts(o),M=r.useMemo(()=>({loading:u.mermaidLoadingText,emptyChart:u.mermaidEmptyChartText,error:u.mermaidErrorText}),[u]),P=C??Se.getMarkdownFlowDirection(o),W=a??Se.getMarkdownFlowLanguage(o),ue=I||u.confirmButtonText,le=$||u.copyButtonText,de=H||u.copiedButtonText,qe=Y||u.sandboxFullscreenButtonText,Me=Z||u.sandboxExitFullscreenButtonText,f=!!A&&(!s||s==="text"),me=Math.max(0,V),Le=m==="fixed"?t:void 0,[w,fe]=r.useState(()=>f?"":t),U=r.useRef(w),p=r.useRef(""),g=r.useRef({tokens:[],head:0,trailingGrapheme:""}),S=r.useRef(0),he=r.useRef(f),pe=r.useRef(m),xe=r.useRef(t),ee=r.useRef(!1),[Ae,Ee]=r.useState(0);r.useEffect(()=>{const e=he.current,c=pe.current,h=xe.current,k=!!p.current;he.current=f,pe.current=m,xe.current=t,(t!==h||f!==e)&&(ee.current=!1);const x=()=>{p.current="",g.current={tokens:[],head:0,trailingGrapheme:""},S.current=0},L=D=>{U.current=D,fe(D)};if(!f){x(),L(t);return}e||(x(),L(""));const v=e?U.current:"";if(!t.startsWith(v)){x(),L(t),m==="content-aware"&&(g.current={tokens:[],head:0,trailingGrapheme:N.getTrailingTypewriterGrapheme(t)});return}let B=t.slice(v.length);if(!B){p.current="",S.current=0,g.current=m==="content-aware"?{tokens:[],head:0,trailingGrapheme:N.getTrailingTypewriterGrapheme(v)}:{tokens:[],head:0,trailingGrapheme:""};return}if(m==="content-aware"){const D=h.slice(v.length);if(e&&c==="content-aware"&&t.startsWith(h)&&p.current===D){const b=N.appendContentAwareTypewriterQueue(g.current,t.slice(h.length));g.current=b.queue,b.immediateChunk&&(B=B.slice(b.immediateChunk.length),L(`${v}${b.immediateChunk}`))}else{const b=N.appendContentAwareTypewriterQueue({tokens:[],head:0,trailingGrapheme:N.getTrailingTypewriterGrapheme(v)},B);g.current=b.queue,b.immediateChunk&&(B=B.slice(b.immediateChunk.length),L(`${v}${b.immediateChunk}`)),S.current=0}}else g.current={tokens:[],head:0,trailingGrapheme:""},S.current=0;p.current=B,!k&&B&&Ee(D=>D+1)},[t,f,m]),r.useEffect(()=>{f&&(ee.current||p.current||w!==t||(ee.current=!0,z?.()))},[t,w,f,z]),r.useEffect(()=>{if(!f||!p.current)return;const e=window.setTimeout(()=>{if(!p.current)return;let c="";if(m==="content-aware"){const k=N.consumeContentAwareTypewriterQueue(g.current,S.current+N.CONTENT_AWARE_TYPEWRITER_TICK_BUDGET);c=k.chunk,g.current=k.queue,N.isContentAwareTypewriterQueueEmpty(k.queue)?S.current=0:S.current=k.remainingBudget}else c=it(p.current,nt).chunk;if(!c)return;p.current=p.current.slice(c.length),p.current||(g.current=m==="content-aware"?{tokens:[],head:0,trailingGrapheme:g.current.trailingGrapheme}:{tokens:[],head:0,trailingGrapheme:""},S.current=0);const h=`${U.current}${c}`;U.current=h,fe(h)},me);return()=>window.clearTimeout(e)},[w,Le,f,m,me,Ae]);const ge=r.useMemo(()=>({isTypewriterEnabled:f,isTyping:f&&w!==t,isComplete:w===t,renderedLength:w.length,totalLength:t.length}),[t,w,f]);r.useEffect(()=>{G?.(ge)},[G,ge]);const y=f?w:t,te=r.useMemo(()=>Re.normalizeInlineHtml(y),[y]),ne=r.useMemo(()=>Oe.getInteractionDefaultValues(y,i,_),[_,y,i]),ve=F?.trim()||ne.buttonText,Te=E?.trim()||ne.inputText,Ie=r.useMemo(()=>i?i.split(",").map(e=>e.trim()).filter(Boolean):void 0,[i]),De=R?.length?R:ne.selectedValues||Ie,ye=ut(De),l=r.useRef({direction:P,language:W,mermaidMessages:M,beforeSend:T,locale:o,onClickCustomButtonAfterContent:J,onSend:j,readonly:q,renderContent:y,resolvedConfirmButtonText:ue,resolvedCopiedButtonText:de,resolvedCopyButtonText:le,resolvedDefaultButtonText:ve,resolvedDefaultInputText:Te,resolvedDefaultSelectedValues:ye});l.current={direction:P,language:W,mermaidMessages:M,beforeSend:T,locale:o,onClickCustomButtonAfterContent:J,onSend:j,readonly:q,renderContent:y,resolvedConfirmButtonText:ue,resolvedCopiedButtonText:de,resolvedCopyButtonText:le,resolvedDefaultButtonText:ve,resolvedDefaultInputText:Te,resolvedDefaultSelectedValues:ye};const Ce=r.useMemo(()=>({"custom-button-after-content":({children:e})=>n.jsx("button",{className:"content-render-custom-button-after-content",onClick:l.current.onClickCustomButtonAfterContent,children:n.jsx("span",{className:"content-render-custom-button-after-content-inner",children:e})}),"custom-variable":e=>n.jsx($e.default,{...e,readonly:l.current.readonly,defaultButtonText:l.current.resolvedDefaultButtonText,defaultInputText:l.current.resolvedDefaultInputText,defaultSelectedValues:l.current.resolvedDefaultSelectedValues,onSend:l.current.onSend,beforeSend:l.current.beforeSend,locale:l.current.locale,dir:l.current.direction,lang:l.current.language,confirmButtonText:l.current.resolvedConfirmButtonText}),code:rt,table:({...e})=>n.jsx("div",{className:"content-render-table-container",children:n.jsx("table",{className:"content-render-table",...e})}),th:({...e})=>n.jsx("th",{className:"content-render-th",...e}),td:({...e})=>n.jsx("td",{className:"content-render-td",...e}),tr:({...e})=>n.jsx("tr",{className:"content-render-tr",...e}),li:({node:e,...c})=>{const h=e?.properties?.className;return typeof h=="string"&&h.includes("task-list-item")||Array.isArray(h)&&h.includes("task-list-item")?n.jsx("li",{className:"content-render-task-list-item",...c}):n.jsx("li",{...c})},ol:({...e})=>n.jsx("ol",{className:"content-render-ol",...e}),ul:({...e})=>n.jsx("ul",{className:"content-render-ul",...e}),input:({...e})=>e.type==="checkbox"?n.jsx("input",{type:"checkbox",className:"content-render-checkbox",disabled:!0,...e}):n.jsx("input",{...e}),a:({children:e,...c})=>n.jsx("a",{target:"_blank",rel:"noopener noreferrer",...c,children:e}),pre:e=>n.jsx(Ne.default,{...e,copyButtonText:l.current.resolvedCopyButtonText,copiedButtonText:l.current.resolvedCopiedButtonText})}),[]),we=r.useMemo(()=>tt.test(y),[y]),re=r.useMemo(()=>we?Qe.splitContentSegments(y,!0):[],[y,we]),Ve=re.some(e=>e.type==="sandbox"),ze=r.useMemo(()=>at(re),[re]),Ge=r.useMemo(()=>oe.parseMarkdownSegments(te),[te]),_e=(e,c)=>{const h=Re.normalizeInlineHtml(e);return oe.parseMarkdownSegments(h).map((x,L)=>{const v=`${c}-${x.type}-${L}`;return x.type==="text"?n.jsx(ae.Provider,{value:l,children:n.jsx(ie,{locale:o,components:Ce,content:x.value})},v):x.type==="mermaid"?n.jsx(se.default,{chart:x.value,frozen:!x.complete,messages:M},v):x.type==="svg"?n.jsx(Be,{svg:x.value},v):null})};return Ve?n.jsx("div",{className:"content-render markdown-body",dir:P,lang:W,children:ze.map((e,c)=>e.type==="sandbox"?n.jsx(He.default,{hideFullScreen:!0,type:"sandbox",content:e.value,className:"content-render-iframe",locale:o,dir:P,lang:W,loadingText:K,styleLoadingText:X,scriptLoadingText:Q,disableLoadingOverlay:O,fullScreenButtonText:qe,exitFullScreenButtonText:Me,mode:ce},`sandbox-${c}`):n.jsx(r.Fragment,{children:_e(e.value,`md-${c}`)},`md-${c}`))}):n.jsxs("div",{className:"content-render markdown-body",dir:P,lang:W,children:[Ge.map((e,c)=>{if(e.type==="text")return n.jsx(ae.Provider,{value:l,children:n.jsx(ie,{locale:o,components:Ce,content:e.value})},c);if(e.type==="mermaid")return n.jsx(se.default,{chart:e.value,frozen:!e.complete,messages:M},c);if(e.type==="svg")return n.jsx(Be,{svg:e.value},c)}),d&&n.jsx("div",{className:"content-render-custom-bar",children:r.createElement(d,{content:t,displayContent:te,onSend:j})})]})};exports.MarkdownRenderer=ie;exports.default=lt;
6
6
  //# sourceMappingURL=ContentRender.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ContentRender.cjs","sources":["../../../src/components/ContentRender/ContentRender.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport rehypeHighlight from \"rehype-highlight\";\nimport rehypeKatex from \"rehype-katex\";\nimport rehypeRaw from \"rehype-raw\";\nimport remarkBreaks from \"remark-breaks\";\nimport remarkFlow from \"remark-flow\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkMath from \"remark-math\";\nimport type { PluggableList } from \"unified\";\nimport { CustomRenderBarProps, OnSendContentParams } from \"../types\";\nimport { sanitizeInvalidTagName } from \"./utils/sanitize-invalid-tag-name\";\nimport { stripSvgTextLineBreaks } from \"./utils/strip-svg-text-line-breaks\";\nimport \"./contentRender.css\";\nimport \"./github-markdown-light.css\";\nimport \"highlight.js/styles/github.css\";\nimport \"katex/dist/katex.min.css\";\nimport CodeBlock, { CodeBlockContext } from \"./CodeBlock\";\nimport CustomButtonInputVariable, {\n ComponentsWithCustomVariable,\n} from \"./plugins/CustomVariable\";\nimport MermaidChart, { type MermaidChartProps } from \"./plugins/MermaidChart\";\nimport {\n preserveCustomVariableProperties,\n restoreCustomVariableProperties,\n} from \"./utils/custom-variable-props\";\nimport {\n highlightLanguages,\n subsetLanguages,\n} from \"./utils/highlight-languages\";\n// import { processMarkdownText } from \"./utils/process-markdown\";\nimport {\n parseMarkdownSegments,\n mermaidBlockIsComplete,\n} from \"./utils/mermaid-parse\";\nimport { normalizeInlineHtml } from \"./utils/normalize-inline-html\";\nimport IframeSandbox from \"./IframeSandbox\";\nimport {\n appendContentAwareTypewriterQueue,\n CONTENT_AWARE_TYPEWRITER_TICK_BUDGET,\n consumeContentAwareTypewriterQueue,\n createContentAwareTypewriterQueue,\n getTrailingTypewriterGrapheme,\n isContentAwareTypewriterQueueEmpty,\n type ContentAwareTypewriterQueue,\n} from \"./utils/typewriter-pacing\";\nimport {\n splitContentSegments,\n type RenderSegment,\n} from \"./utils/split-content\";\nimport {\n getInteractionDefaultValues,\n type InteractionDefaultValueOptions,\n} from \"../../lib/interaction-defaults\";\nimport {\n getMarkdownFlowDirection,\n getMarkdownFlowLanguage,\n type MarkdownFlowLocale,\n} from \"../../lib/locale\";\nimport { getContentRenderLocaleTexts } from \"./contentRenderI18n\";\n\nconst SANDBOX_TAG_HINT_PATTERN =\n /<(script|style|link|iframe|html|head|body|meta|title|base|template|div|section|article|main)\\b/i;\nconst FIXED_TYPEWRITER_CHUNK_SIZE = 2;\n\nexport type ContentRenderTypewriterPacing = \"fixed\" | \"content-aware\";\n\n// Define component Props type\nexport interface ContentRenderProps {\n content: string;\n contentType?: string;\n /** Locale used for built-in UI text when a more specific text prop is not provided. */\n locale?: MarkdownFlowLocale;\n /** Overrides the locale-derived language; omitted values inherit from the host. */\n lang?: string;\n /** Overrides locale-derived direction; omitted values inherit when no locale is set. */\n dir?: React.HTMLAttributes<HTMLDivElement>[\"dir\"];\n /**\n * Callback invoked when the custom button after content is clicked.\n * This button is rendered via the `<custom-button-after-content>` tag in markdown content.\n * @example\n * ```tsx\n * <ContentRender\n * content=\"Hello <custom-button-after-content>Ask</custom-button-after-content>\"\n * onClickCustomButtonAfterContent={() => console.log('Button clicked')}\n * />\n * ```\n */\n customRenderBar?: CustomRenderBarProps;\n onClickCustomButtonAfterContent?: () => void;\n onSend?: (content: OnSendContentParams) => void;\n typingSpeed?: number;\n enableTypewriter?: boolean;\n /** Controls how much text is revealed per tick. Defaults to the legacy fixed pacing. */\n typewriterPacing?: ContentRenderTypewriterPacing;\n onTypeFinished?: () => void;\n onTypewriterStateChange?: (state: ContentRenderTypewriterState) => void;\n userInput?: string;\n interactionDefaultValueOptions?: InteractionDefaultValueOptions;\n defaultButtonText?: string;\n defaultInputText?: string; // Text input by user\n defaultSelectedValues?: string[]; // Default selected values for multi-select\n readonly?: boolean;\n // Multi-select confirm button text (i18n support)\n confirmButtonText?: string;\n // Copy button text (i18n support)\n copyButtonText?: string;\n // Copied state text (i18n support)\n copiedButtonText?: string;\n // Dynamic interaction format for multi-select support\n dynamicInteractionFormat?: string;\n // Loading text before first HTML block renders inside iframe (i18n support)\n sandboxLoadingText?: string;\n // Loading text while styles are being generated inside iframe\n sandboxStyleLoadingText?: string;\n // Loading text while scripts are being cached/executed inside iframe\n sandboxScriptLoadingText?: string;\n // Disable sandbox loading overlays when upper layers have already entered an error state\n disableSandboxLoadingOverlay?: boolean;\n // Fullscreen button text for iframe sandbox\n sandboxFullscreenButtonText?: string;\n // Exit fullscreen button text for iframe sandbox\n sandboxExitFullscreenButtonText?: string;\n // Sandbox render mode\n sandboxMode?: \"content\" | \"blackboard\";\n beforeSend?: (param: OnSendContentParams) => boolean;\n // tooltipMinLength?: number; // Control minimum character length for tooltip display, default 10\n}\n\nexport interface ContentRenderTypewriterState {\n isTypewriterEnabled: boolean;\n isTyping: boolean;\n isComplete: boolean;\n renderedLength: number;\n totalLength: number;\n}\n\n// Render svg string via Shadow DOM to avoid markdown wrapping\nconst SvgBlockInShadow: React.FC<{ svg: string }> = ({ svg }) => {\n const hostRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const host = hostRef.current;\n if (!host) return;\n const shadowRoot = host.shadowRoot ?? host.attachShadow({ mode: \"open\" });\n const styleId = \"content-render-svg-style\";\n let styleEl = shadowRoot.getElementById(styleId) as HTMLStyleElement | null;\n\n if (!styleEl) {\n styleEl = document.createElement(\"style\");\n styleEl.id = styleId;\n // Keep intrinsic SVG width so the wrapper can scroll horizontally when needed\n styleEl.textContent = `\n svg { height: auto; display: inline-block; }\n svg.content-render-svg-el--responsive { width: 100%; max-width: 100%; }\n svg.content-render-svg-el--fixed { max-width: none; }\n `;\n shadowRoot.appendChild(styleEl);\n }\n\n const nodesToRemove = Array.from(shadowRoot.childNodes).filter(\n (node) => node !== styleEl\n );\n nodesToRemove.forEach((node) => shadowRoot.removeChild(node));\n\n const template = document.createElement(\"template\");\n const cleanedSvg = stripSvgTextLineBreaks(svg);\n template.innerHTML = cleanedSvg;\n shadowRoot.append(template.content.cloneNode(true));\n\n let hasResponsiveSvg = false;\n let hasFixedSvg = false;\n\n shadowRoot.querySelectorAll(\"svg\").forEach((svgEl) => {\n // Derive responsive sizing from viewBox so pure viewBox SVGs stay visible and fluid\n const viewBox = svgEl.getAttribute(\"viewBox\");\n if (!viewBox) return;\n\n const dimensions = viewBox\n .trim()\n .split(/[\\s,]+/)\n .map((value) => Number(value));\n\n if (dimensions.length !== 4 || dimensions.some(Number.isNaN)) return;\n\n const [, , viewBoxWidth, viewBoxHeight] = dimensions;\n const widthAttr = svgEl.getAttribute(\"width\");\n const heightAttr = svgEl.getAttribute(\"height\");\n const isRelativeLength = (value?: string | null) => {\n if (!value) return false;\n const normalized = value.trim().toLowerCase();\n return normalized === \"auto\" || normalized.endsWith(\"%\");\n };\n const toNumericLength = (value?: string | null) => {\n if (!value) return null;\n const normalized = value.trim().toLowerCase();\n if (normalized === \"auto\" || normalized.endsWith(\"%\")) {\n return null;\n }\n const parsed = Number.parseFloat(normalized);\n return Number.isNaN(parsed) ? null : parsed;\n };\n // Treat percentage/auto sizing as responsive so viewBox drives the layout\n const isWidthRelative = isRelativeLength(widthAttr);\n const isHeightRelative = isRelativeLength(heightAttr);\n const widthMissing = !widthAttr || widthAttr === \"0\";\n const heightMissing = !heightAttr || heightAttr === \"0\";\n const numericWidth = toNumericLength(widthAttr);\n const numericHeight = toNumericLength(heightAttr);\n const matchesViewBox =\n numericWidth === viewBoxWidth && numericHeight === viewBoxHeight;\n\n // Prefer responsive layout when sizing is relative or matches the viewBox\n const shouldUseResponsiveSize =\n isWidthRelative ||\n isHeightRelative ||\n (widthMissing && heightMissing) ||\n matchesViewBox;\n\n if (shouldUseResponsiveSize) {\n hasResponsiveSvg = true;\n svgEl.classList.add(\"content-render-svg-el--responsive\");\n svgEl.classList.remove(\"content-render-svg-el--fixed\");\n svgEl.style.width = \"100%\";\n svgEl.style.height = \"auto\";\n if (!svgEl.style.aspectRatio && viewBoxHeight > 0) {\n svgEl.style.aspectRatio = `${viewBoxWidth} / ${viewBoxHeight}`;\n }\n return;\n }\n\n hasFixedSvg = true;\n svgEl.classList.add(\"content-render-svg-el--fixed\");\n svgEl.classList.remove(\"content-render-svg-el--responsive\");\n if (widthMissing && viewBoxWidth > 0) {\n svgEl.setAttribute(\"width\", `${viewBoxWidth}`);\n }\n if (heightMissing && viewBoxHeight > 0) {\n svgEl.setAttribute(\"height\", `${viewBoxHeight}`);\n }\n });\n\n const hostResponsive = hasResponsiveSvg && !hasFixedSvg;\n host.classList.toggle(\"content-render-svg--responsive\", hostResponsive);\n host.classList.toggle(\"content-render-svg--fixed\", !hostResponsive);\n }, [svg]);\n\n return (\n <div className=\"content-render-svg-scroll\">\n <div className=\"content-render-svg\" ref={hostRef} />\n </div>\n );\n};\n\n// Extended component interface\ntype CustomComponents = ComponentsWithCustomVariable & {\n \"custom-button-after-content\"?: React.ComponentType<{\n children: React.ReactNode;\n }>;\n};\n\ntype MarkdownComponentRuntimeValues = {\n direction?: ContentRenderProps[\"dir\"];\n language?: string;\n mermaidMessages: MermaidChartProps[\"messages\"];\n beforeSend?: (param: OnSendContentParams) => boolean;\n locale?: MarkdownFlowLocale;\n onClickCustomButtonAfterContent?: () => void;\n onSend?: (content: OnSendContentParams) => void;\n readonly: boolean;\n renderContent: string;\n resolvedConfirmButtonText: string;\n resolvedCopiedButtonText: string;\n resolvedCopyButtonText: string;\n resolvedDefaultButtonText?: string;\n resolvedDefaultInputText?: string;\n resolvedDefaultSelectedValues?: string[];\n};\n\nconst MarkdownComponentRuntimeContext =\n React.createContext<React.RefObject<MarkdownComponentRuntimeValues> | null>(\n null\n );\n\nconst MarkdownCode = (props: React.ComponentProps<\"code\">) => {\n const runtimeValuesRef = React.useContext(MarkdownComponentRuntimeContext);\n const isInCodeBlock = React.useContext(CodeBlockContext);\n if (!runtimeValuesRef) {\n throw new Error(\"Markdown code renderer requires ContentRender context.\");\n }\n const { className, children, ...rest } = props as {\n className?: string;\n children?: React.ReactNode;\n dir?: string;\n };\n const match = /language-(\\w+)/.exec(className || \"\");\n const language = match?.[1];\n if (language === \"mermaid\") {\n const chartContent = children?.toString().replace(/\\n$/, \"\") || \"\";\n const frozen = mermaidBlockIsComplete(\n runtimeValuesRef.current.renderContent,\n chartContent\n );\n return (\n <MermaidChart\n chart={chartContent}\n frozen={frozen}\n messages={runtimeValuesRef.current.mermaidMessages}\n />\n );\n }\n\n return (\n <code\n className={className}\n {...rest}\n dir={rest.dir ?? (isInCodeBlock ? undefined : \"ltr\")}\n >\n {children}\n </code>\n );\n};\n\nconst remarkPlugins: PluggableList = [\n remarkGfm,\n remarkMath,\n remarkFlow,\n remarkBreaks,\n];\n\nconst rehypePlugins: PluggableList = [\n preserveCustomVariableProperties,\n rehypeRaw,\n sanitizeInvalidTagName,\n restoreCustomVariableProperties,\n [rehypeHighlight, { languages: highlightLanguages, subset: subsetLanguages }],\n rehypeKatex,\n];\n\nexport const MarkdownRenderer: React.FC<{\n content: string;\n components: CustomComponents;\n locale?: MarkdownFlowLocale;\n}> = ({ content: markdownContent, components, locale }) => {\n const texts = getContentRenderLocaleTexts(locale);\n return (\n <div className=\"markdown-renderer\">\n <ReactMarkdown\n remarkPlugins={remarkPlugins}\n rehypePlugins={rehypePlugins}\n remarkRehypeOptions={{\n footnoteLabel: texts.footnoteLabel,\n footnoteBackLabel: (referenceIndex, rereferenceIndex) => {\n const reference =\n String(referenceIndex + 1) +\n (rereferenceIndex > 1 ? `-${rereferenceIndex}` : \"\");\n return texts.footnoteBackLabel.replace(\"{reference}\", reference);\n },\n }}\n components={components}\n >\n {markdownContent}\n </ReactMarkdown>\n </div>\n );\n};\n\nconst mergeNonSandboxSegments = (segments: RenderSegment[]) => {\n if (segments.length <= 1) return segments;\n const merged: RenderSegment[] = [];\n\n segments.forEach((segment) => {\n if (segment.type === \"sandbox\") {\n merged.push(segment);\n return;\n }\n\n const last = merged[merged.length - 1];\n if (last && last.type !== \"sandbox\") {\n merged[merged.length - 1] = {\n type: \"markdown\",\n value: `${last.value}${segment.value}`,\n };\n return;\n }\n\n merged.push({ type: \"markdown\", value: segment.value });\n });\n\n return merged;\n};\n\nconst splitTextByCharacterChunk = (value: string, chunkSize: number) => {\n const safeChunkSize = Math.max(1, chunkSize);\n const characters = Array.from(value);\n\n return {\n chunk: characters.slice(0, safeChunkSize).join(\"\"),\n rest: characters.slice(safeChunkSize).join(\"\"),\n };\n};\n\nconst areStringArraysEqual = (left?: string[], right?: string[]) => {\n if (left === right) {\n return true;\n }\n if (!left || !right || left.length !== right.length) {\n return false;\n }\n return left.every((value, index) => value === right[index]);\n};\n\nconst useStableStringArray = (values?: string[]) => {\n const valuesRef = useRef<string[] | undefined>(values);\n\n if (!areStringArraysEqual(valuesRef.current, values)) {\n valuesRef.current = values;\n }\n\n return valuesRef.current;\n};\n\nconst ContentRender: React.FC<ContentRenderProps> = ({\n content,\n contentType,\n locale,\n lang,\n dir,\n customRenderBar,\n onSend,\n typingSpeed = 40,\n enableTypewriter = false,\n typewriterPacing = \"fixed\",\n onTypeFinished,\n onTypewriterStateChange,\n userInput,\n interactionDefaultValueOptions,\n defaultButtonText,\n defaultInputText,\n defaultSelectedValues,\n readonly = false,\n confirmButtonText,\n copyButtonText,\n copiedButtonText,\n sandboxLoadingText,\n sandboxStyleLoadingText,\n sandboxScriptLoadingText,\n disableSandboxLoadingOverlay = false,\n sandboxFullscreenButtonText,\n sandboxExitFullscreenButtonText,\n sandboxMode = \"content\",\n onClickCustomButtonAfterContent,\n beforeSend,\n // tooltipMinLength,\n}) => {\n const localeTexts = getContentRenderLocaleTexts(locale);\n const mermaidMessages = useMemo(\n () => ({\n loading: localeTexts.mermaidLoadingText,\n emptyChart: localeTexts.mermaidEmptyChartText,\n error: localeTexts.mermaidErrorText,\n }),\n [localeTexts]\n );\n const direction = dir ?? getMarkdownFlowDirection(locale);\n const language = lang ?? getMarkdownFlowLanguage(locale);\n const resolvedConfirmButtonText =\n confirmButtonText || localeTexts.confirmButtonText;\n const resolvedCopyButtonText = copyButtonText || localeTexts.copyButtonText;\n const resolvedCopiedButtonText =\n copiedButtonText || localeTexts.copiedButtonText;\n const resolvedSandboxFullscreenButtonText =\n sandboxFullscreenButtonText || localeTexts.sandboxFullscreenButtonText;\n const resolvedSandboxExitFullscreenButtonText =\n sandboxExitFullscreenButtonText ||\n localeTexts.sandboxExitFullscreenButtonText;\n const shouldApplyTypewriterByContentType =\n !contentType || contentType === \"text\";\n const isTypewriterEnabled =\n Boolean(enableTypewriter) && shouldApplyTypewriterByContentType;\n const typewriterTickMs = Math.max(0, typingSpeed);\n const fixedTypewriterContentVersion =\n typewriterPacing === \"fixed\" ? content : undefined;\n const [displayContent, setDisplayContent] = useState(() =>\n isTypewriterEnabled ? \"\" : content\n );\n const displayContentRef = useRef(displayContent);\n const pendingContentRef = useRef(\"\");\n const contentAwareQueueRef = useRef<ContentAwareTypewriterQueue>({\n tokens: [],\n head: 0,\n trailingGrapheme: \"\",\n });\n const contentAwareBudgetRef = useRef(0);\n const previousTypewriterEnabledRef = useRef(isTypewriterEnabled);\n const previousTypewriterPacingRef = useRef(typewriterPacing);\n const previousSourceContentRef = useRef(content);\n const hasReportedTypeFinishedRef = useRef(false);\n const [typewriterWakeVersion, setTypewriterWakeVersion] = useState(0);\n\n useEffect(() => {\n const wasTypewriterEnabled = previousTypewriterEnabledRef.current;\n const previousTypewriterPacing = previousTypewriterPacingRef.current;\n const previousSourceContent = previousSourceContentRef.current;\n const wasPending = Boolean(pendingContentRef.current);\n\n previousTypewriterEnabledRef.current = isTypewriterEnabled;\n previousTypewriterPacingRef.current = typewriterPacing;\n previousSourceContentRef.current = content;\n\n if (\n content !== previousSourceContent ||\n isTypewriterEnabled !== wasTypewriterEnabled\n ) {\n hasReportedTypeFinishedRef.current = false;\n }\n\n const clearPendingContent = () => {\n pendingContentRef.current = \"\";\n contentAwareQueueRef.current = {\n tokens: [],\n head: 0,\n trailingGrapheme: \"\",\n };\n contentAwareBudgetRef.current = 0;\n };\n\n const updateDisplayContent = (nextContent: string) => {\n displayContentRef.current = nextContent;\n setDisplayContent(nextContent);\n };\n\n if (!isTypewriterEnabled) {\n clearPendingContent();\n updateDisplayContent(content);\n return;\n }\n\n if (!wasTypewriterEnabled) {\n clearPendingContent();\n updateDisplayContent(\"\");\n }\n\n const visibleContent = !wasTypewriterEnabled\n ? \"\"\n : displayContentRef.current;\n\n if (!content.startsWith(visibleContent)) {\n clearPendingContent();\n updateDisplayContent(content);\n if (typewriterPacing === \"content-aware\") {\n contentAwareQueueRef.current = {\n tokens: [],\n head: 0,\n trailingGrapheme: getTrailingTypewriterGrapheme(content),\n };\n }\n return;\n }\n\n let nextPendingContent = content.slice(visibleContent.length);\n if (!nextPendingContent) {\n pendingContentRef.current = \"\";\n contentAwareBudgetRef.current = 0;\n contentAwareQueueRef.current =\n typewriterPacing === \"content-aware\"\n ? {\n tokens: [],\n head: 0,\n trailingGrapheme: getTrailingTypewriterGrapheme(visibleContent),\n }\n : { tokens: [], head: 0, trailingGrapheme: \"\" };\n return;\n }\n\n if (typewriterPacing === \"content-aware\") {\n const previousPendingContent = previousSourceContent.slice(\n visibleContent.length\n );\n const canAppendToCachedQueue =\n wasTypewriterEnabled &&\n previousTypewriterPacing === \"content-aware\" &&\n content.startsWith(previousSourceContent) &&\n pendingContentRef.current === previousPendingContent;\n\n if (canAppendToCachedQueue) {\n const appended = appendContentAwareTypewriterQueue(\n contentAwareQueueRef.current,\n content.slice(previousSourceContent.length)\n );\n contentAwareQueueRef.current = appended.queue;\n\n if (appended.immediateChunk) {\n nextPendingContent = nextPendingContent.slice(\n appended.immediateChunk.length\n );\n updateDisplayContent(`${visibleContent}${appended.immediateChunk}`);\n }\n } else {\n contentAwareQueueRef.current = {\n ...createContentAwareTypewriterQueue(nextPendingContent),\n trailingGrapheme: getTrailingTypewriterGrapheme(visibleContent),\n };\n contentAwareBudgetRef.current = 0;\n }\n } else {\n contentAwareQueueRef.current = {\n tokens: [],\n head: 0,\n trailingGrapheme: \"\",\n };\n contentAwareBudgetRef.current = 0;\n }\n\n pendingContentRef.current = nextPendingContent;\n\n if (!wasPending && nextPendingContent) {\n setTypewriterWakeVersion((version) => version + 1);\n }\n }, [content, isTypewriterEnabled, typewriterPacing]);\n\n useEffect(() => {\n if (!isTypewriterEnabled) {\n return;\n }\n\n if (\n hasReportedTypeFinishedRef.current ||\n pendingContentRef.current ||\n displayContent !== content\n ) {\n return;\n }\n\n hasReportedTypeFinishedRef.current = true;\n onTypeFinished?.();\n }, [content, displayContent, isTypewriterEnabled, onTypeFinished]);\n\n useEffect(() => {\n if (!isTypewriterEnabled || !pendingContentRef.current) {\n return undefined;\n }\n\n const typewriterTimer = window.setTimeout(() => {\n if (!pendingContentRef.current) {\n return;\n }\n\n let chunk = \"\";\n\n if (typewriterPacing === \"content-aware\") {\n const result = consumeContentAwareTypewriterQueue(\n contentAwareQueueRef.current,\n contentAwareBudgetRef.current + CONTENT_AWARE_TYPEWRITER_TICK_BUDGET\n );\n\n chunk = result.chunk;\n contentAwareQueueRef.current = result.queue;\n\n if (isContentAwareTypewriterQueueEmpty(result.queue)) {\n contentAwareBudgetRef.current = 0;\n } else {\n contentAwareBudgetRef.current = result.remainingBudget;\n }\n } else {\n const fixedChunk = splitTextByCharacterChunk(\n pendingContentRef.current,\n FIXED_TYPEWRITER_CHUNK_SIZE\n );\n chunk = fixedChunk.chunk;\n }\n\n if (!chunk) {\n return;\n }\n\n pendingContentRef.current = pendingContentRef.current.slice(chunk.length);\n if (!pendingContentRef.current) {\n contentAwareQueueRef.current =\n typewriterPacing === \"content-aware\"\n ? {\n tokens: [],\n head: 0,\n trailingGrapheme: contentAwareQueueRef.current.trailingGrapheme,\n }\n : { tokens: [], head: 0, trailingGrapheme: \"\" };\n contentAwareBudgetRef.current = 0;\n }\n\n const nextDisplayContent = `${displayContentRef.current}${chunk}`;\n displayContentRef.current = nextDisplayContent;\n setDisplayContent(nextDisplayContent);\n }, typewriterTickMs);\n\n return () => window.clearTimeout(typewriterTimer);\n }, [\n displayContent,\n fixedTypewriterContentVersion,\n isTypewriterEnabled,\n typewriterPacing,\n typewriterTickMs,\n typewriterWakeVersion,\n ]);\n\n const typewriterState = useMemo<ContentRenderTypewriterState>(\n () => ({\n isTypewriterEnabled,\n isTyping: isTypewriterEnabled && displayContent !== content,\n isComplete: displayContent === content,\n renderedLength: displayContent.length,\n totalLength: content.length,\n }),\n [content, displayContent, isTypewriterEnabled]\n );\n\n useEffect(() => {\n onTypewriterStateChange?.(typewriterState);\n }, [onTypewriterStateChange, typewriterState]);\n\n const renderContent = isTypewriterEnabled ? displayContent : content;\n const normalizedContent = useMemo(\n () => normalizeInlineHtml(renderContent),\n [renderContent]\n );\n\n const interactionDefaults = useMemo(\n () =>\n getInteractionDefaultValues(\n renderContent,\n userInput,\n interactionDefaultValueOptions\n ),\n [interactionDefaultValueOptions, renderContent, userInput]\n );\n\n const resolvedDefaultButtonText =\n defaultButtonText?.trim() || interactionDefaults.buttonText;\n const resolvedDefaultInputText =\n defaultInputText?.trim() || interactionDefaults.inputText;\n const fallbackSelectedValues = useMemo(\n () =>\n userInput\n ? userInput\n .split(\",\")\n .map((value) => value.trim())\n .filter(Boolean)\n : undefined,\n [userInput]\n );\n const resolvedDefaultSelectedValues = defaultSelectedValues?.length\n ? defaultSelectedValues\n : interactionDefaults.selectedValues || fallbackSelectedValues;\n const stableDefaultSelectedValues = useStableStringArray(\n resolvedDefaultSelectedValues\n );\n const componentRuntimeValuesRef = useRef<MarkdownComponentRuntimeValues>({\n direction,\n language,\n mermaidMessages,\n beforeSend,\n locale,\n onClickCustomButtonAfterContent,\n onSend,\n readonly,\n renderContent,\n resolvedConfirmButtonText,\n resolvedCopiedButtonText,\n resolvedCopyButtonText,\n resolvedDefaultButtonText,\n resolvedDefaultInputText,\n resolvedDefaultSelectedValues: stableDefaultSelectedValues,\n });\n\n componentRuntimeValuesRef.current = {\n direction,\n language,\n mermaidMessages,\n beforeSend,\n locale,\n onClickCustomButtonAfterContent,\n onSend,\n readonly,\n renderContent,\n resolvedConfirmButtonText,\n resolvedCopiedButtonText,\n resolvedCopyButtonText,\n resolvedDefaultButtonText,\n resolvedDefaultInputText,\n resolvedDefaultSelectedValues: stableDefaultSelectedValues,\n };\n\n const components = useMemo<CustomComponents>(\n () => ({\n \"custom-button-after-content\": ({\n children,\n }: {\n children: React.ReactNode;\n }) => {\n return (\n <button\n className=\"content-render-custom-button-after-content\"\n onClick={\n componentRuntimeValuesRef.current.onClickCustomButtonAfterContent\n }\n >\n <span className=\"content-render-custom-button-after-content-inner\">\n {children}\n </span>\n </button>\n );\n },\n \"custom-variable\": (props) => (\n <CustomButtonInputVariable\n {...props}\n readonly={componentRuntimeValuesRef.current.readonly}\n defaultButtonText={\n componentRuntimeValuesRef.current.resolvedDefaultButtonText\n }\n defaultInputText={\n componentRuntimeValuesRef.current.resolvedDefaultInputText\n }\n defaultSelectedValues={\n componentRuntimeValuesRef.current.resolvedDefaultSelectedValues\n }\n onSend={componentRuntimeValuesRef.current.onSend}\n beforeSend={componentRuntimeValuesRef.current.beforeSend}\n locale={componentRuntimeValuesRef.current.locale}\n dir={componentRuntimeValuesRef.current.direction}\n lang={componentRuntimeValuesRef.current.language}\n confirmButtonText={\n componentRuntimeValuesRef.current.resolvedConfirmButtonText\n }\n // tooltipMinLength={tooltipMinLength}\n />\n ),\n code: MarkdownCode,\n table: ({ ...props }) => (\n <div className=\"content-render-table-container\">\n <table className=\"content-render-table\" {...props} />\n </div>\n ),\n th: ({ ...props }) => <th className=\"content-render-th\" {...props} />,\n td: ({ ...props }) => <td className=\"content-render-td\" {...props} />,\n tr: ({ ...props }) => <tr className=\"content-render-tr\" {...props} />,\n li: ({ node, ...props }) => {\n const className = node?.properties?.className;\n const hasTaskListItem =\n (typeof className === \"string\" &&\n className.includes(\"task-list-item\")) ||\n (Array.isArray(className) && className.includes(\"task-list-item\"));\n if (hasTaskListItem) {\n return <li className=\"content-render-task-list-item\" {...props} />;\n }\n return <li {...props} />;\n },\n ol: ({ ...props }) => <ol className=\"content-render-ol\" {...props} />,\n ul: ({ ...props }) => <ul className=\"content-render-ul\" {...props} />,\n input: ({ ...props }) => {\n if (props.type === \"checkbox\") {\n return (\n <input\n type=\"checkbox\"\n className=\"content-render-checkbox\"\n disabled\n {...props}\n />\n );\n }\n return <input {...props} />;\n },\n a: ({ children, ...props }) => (\n <a target=\"_blank\" rel=\"noopener noreferrer\" {...props}>\n {children}\n </a>\n ),\n pre: (props) => (\n <CodeBlock\n {...props}\n copyButtonText={\n componentRuntimeValuesRef.current.resolvedCopyButtonText\n }\n copiedButtonText={\n componentRuntimeValuesRef.current.resolvedCopiedButtonText\n }\n />\n ),\n }),\n []\n );\n\n const hasPotentialSandboxTags = useMemo(\n () => SANDBOX_TAG_HINT_PATTERN.test(renderContent),\n [renderContent]\n );\n\n const renderSegments = useMemo(\n () =>\n hasPotentialSandboxTags ? splitContentSegments(renderContent, true) : [],\n [renderContent, hasPotentialSandboxTags]\n );\n\n const hasSandbox = renderSegments.some(\n (segment) => segment.type === \"sandbox\"\n );\n const mergedRenderSegments = useMemo(\n () => mergeNonSandboxSegments(renderSegments),\n [renderSegments]\n );\n\n const segments = useMemo(\n () => parseMarkdownSegments(normalizedContent),\n [normalizedContent]\n );\n\n const renderMarkdownSegments = (raw: string, keyPrefix: string) => {\n const normalized = normalizeInlineHtml(raw);\n const parsed = parseMarkdownSegments(normalized);\n\n return parsed.map((seg, index) => {\n const key = `${keyPrefix}-${seg.type}-${index}`;\n\n if (seg.type === \"text\") {\n return (\n <MarkdownComponentRuntimeContext.Provider\n key={key}\n value={componentRuntimeValuesRef}\n >\n <MarkdownRenderer\n locale={locale}\n components={components}\n content={seg.value}\n />\n </MarkdownComponentRuntimeContext.Provider>\n );\n }\n\n if (seg.type === \"mermaid\") {\n return (\n <MermaidChart\n key={key}\n chart={seg.value}\n frozen={!seg.complete}\n messages={mermaidMessages}\n />\n );\n }\n\n if (seg.type === \"svg\") {\n return <SvgBlockInShadow key={key} svg={seg.value} />;\n }\n\n return null;\n });\n };\n\n if (hasSandbox) {\n return (\n <div\n className=\"content-render markdown-body\"\n dir={direction}\n lang={language}\n >\n {mergedRenderSegments.map((segment, idx) =>\n segment.type === \"sandbox\" ? (\n <IframeSandbox\n key={`sandbox-${idx}`}\n hideFullScreen\n type=\"sandbox\"\n content={segment.value}\n className=\"content-render-iframe\"\n locale={locale}\n dir={direction}\n lang={language}\n loadingText={sandboxLoadingText}\n styleLoadingText={sandboxStyleLoadingText}\n scriptLoadingText={sandboxScriptLoadingText}\n disableLoadingOverlay={disableSandboxLoadingOverlay}\n fullScreenButtonText={resolvedSandboxFullscreenButtonText}\n exitFullScreenButtonText={resolvedSandboxExitFullscreenButtonText}\n mode={sandboxMode}\n />\n ) : (\n <React.Fragment key={`md-${idx}`}>\n {renderMarkdownSegments(segment.value, `md-${idx}`)}\n </React.Fragment>\n )\n )}\n </div>\n );\n }\n\n return (\n <div\n className=\"content-render markdown-body\"\n dir={direction}\n lang={language}\n >\n {segments.map((seg, index) => {\n if (seg.type === \"text\") {\n return (\n <MarkdownComponentRuntimeContext.Provider\n key={index}\n value={componentRuntimeValuesRef}\n >\n <MarkdownRenderer\n locale={locale}\n components={components}\n content={seg.value}\n />\n </MarkdownComponentRuntimeContext.Provider>\n );\n }\n\n if (seg.type === \"mermaid\") {\n return (\n <MermaidChart\n key={index}\n chart={seg.value}\n frozen={!seg.complete}\n messages={mermaidMessages}\n />\n );\n }\n\n if (seg.type === \"svg\") {\n return <SvgBlockInShadow key={index} svg={seg.value} />;\n }\n })}\n\n {customRenderBar && (\n <div className=\"content-render-custom-bar\">\n {React.createElement(customRenderBar, {\n content,\n displayContent: normalizedContent,\n onSend,\n })}\n </div>\n )}\n </div>\n );\n};\n\nexport default ContentRender;\n"],"names":["SANDBOX_TAG_HINT_PATTERN","FIXED_TYPEWRITER_CHUNK_SIZE","SvgBlockInShadow","svg","hostRef","useRef","useEffect","host","shadowRoot","styleId","styleEl","node","template","cleanedSvg","stripSvgTextLineBreaks","hasResponsiveSvg","hasFixedSvg","svgEl","viewBox","dimensions","value","viewBoxWidth","viewBoxHeight","widthAttr","heightAttr","isRelativeLength","normalized","toNumericLength","parsed","isWidthRelative","isHeightRelative","widthMissing","heightMissing","numericWidth","numericHeight","hostResponsive","jsx","MarkdownComponentRuntimeContext","React","MarkdownCode","props","runtimeValuesRef","isInCodeBlock","CodeBlockContext","className","children","rest","chartContent","frozen","mermaidBlockIsComplete","MermaidChart","remarkPlugins","remarkGfm","remarkMath","remarkFlow","remarkBreaks","rehypePlugins","preserveCustomVariableProperties","rehypeRaw","sanitizeInvalidTagName","restoreCustomVariableProperties","rehypeHighlight","highlightLanguages","subsetLanguages","rehypeKatex","MarkdownRenderer","markdownContent","components","locale","texts","getContentRenderLocaleTexts","ReactMarkdown","referenceIndex","rereferenceIndex","reference","mergeNonSandboxSegments","segments","merged","segment","last","splitTextByCharacterChunk","chunkSize","safeChunkSize","characters","areStringArraysEqual","left","right","index","useStableStringArray","values","valuesRef","ContentRender","content","contentType","lang","dir","customRenderBar","onSend","typingSpeed","enableTypewriter","typewriterPacing","onTypeFinished","onTypewriterStateChange","userInput","interactionDefaultValueOptions","defaultButtonText","defaultInputText","defaultSelectedValues","readonly","confirmButtonText","copyButtonText","copiedButtonText","sandboxLoadingText","sandboxStyleLoadingText","sandboxScriptLoadingText","disableSandboxLoadingOverlay","sandboxFullscreenButtonText","sandboxExitFullscreenButtonText","sandboxMode","onClickCustomButtonAfterContent","beforeSend","localeTexts","mermaidMessages","useMemo","direction","getMarkdownFlowDirection","language","getMarkdownFlowLanguage","resolvedConfirmButtonText","resolvedCopyButtonText","resolvedCopiedButtonText","resolvedSandboxFullscreenButtonText","resolvedSandboxExitFullscreenButtonText","isTypewriterEnabled","typewriterTickMs","fixedTypewriterContentVersion","displayContent","setDisplayContent","useState","displayContentRef","pendingContentRef","contentAwareQueueRef","contentAwareBudgetRef","previousTypewriterEnabledRef","previousTypewriterPacingRef","previousSourceContentRef","hasReportedTypeFinishedRef","typewriterWakeVersion","setTypewriterWakeVersion","wasTypewriterEnabled","previousTypewriterPacing","previousSourceContent","wasPending","clearPendingContent","updateDisplayContent","nextContent","visibleContent","getTrailingTypewriterGrapheme","nextPendingContent","previousPendingContent","appended","appendContentAwareTypewriterQueue","createContentAwareTypewriterQueue","version","typewriterTimer","chunk","result","consumeContentAwareTypewriterQueue","CONTENT_AWARE_TYPEWRITER_TICK_BUDGET","isContentAwareTypewriterQueueEmpty","nextDisplayContent","typewriterState","renderContent","normalizedContent","normalizeInlineHtml","interactionDefaults","getInteractionDefaultValues","resolvedDefaultButtonText","resolvedDefaultInputText","fallbackSelectedValues","resolvedDefaultSelectedValues","stableDefaultSelectedValues","componentRuntimeValuesRef","CustomButtonInputVariable","CodeBlock","hasPotentialSandboxTags","renderSegments","splitContentSegments","hasSandbox","mergedRenderSegments","parseMarkdownSegments","renderMarkdownSegments","raw","keyPrefix","seg","key","idx","IframeSandbox","jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"ContentRender.cjs","sources":["../../../src/components/ContentRender/ContentRender.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport ReactMarkdown from \"react-markdown\";\nimport rehypeHighlight from \"rehype-highlight\";\nimport rehypeKatex from \"rehype-katex\";\nimport rehypeRaw from \"rehype-raw\";\nimport remarkBreaks from \"remark-breaks\";\nimport remarkFlow from \"remark-flow\";\nimport remarkGfm from \"remark-gfm\";\nimport remarkMath from \"remark-math\";\nimport type { PluggableList } from \"unified\";\nimport { CustomRenderBarProps, OnSendContentParams } from \"../types\";\nimport { sanitizeInvalidTagName } from \"./utils/sanitize-invalid-tag-name\";\nimport { stripSvgTextLineBreaks } from \"./utils/strip-svg-text-line-breaks\";\nimport \"./contentRender.css\";\nimport \"./github-markdown-light.css\";\nimport \"highlight.js/styles/github.css\";\nimport \"katex/dist/katex.min.css\";\nimport CodeBlock, { CodeBlockContext } from \"./CodeBlock\";\nimport CustomButtonInputVariable, {\n ComponentsWithCustomVariable,\n} from \"./plugins/CustomVariable\";\nimport MermaidChart, { type MermaidChartProps } from \"./plugins/MermaidChart\";\nimport {\n preserveCustomVariableProperties,\n restoreCustomVariableProperties,\n} from \"./utils/custom-variable-props\";\nimport {\n highlightLanguages,\n subsetLanguages,\n} from \"./utils/highlight-languages\";\n// import { processMarkdownText } from \"./utils/process-markdown\";\nimport {\n parseMarkdownSegments,\n mermaidBlockIsComplete,\n} from \"./utils/mermaid-parse\";\nimport { normalizeInlineHtml } from \"./utils/normalize-inline-html\";\nimport IframeSandbox from \"./IframeSandbox\";\nimport {\n appendContentAwareTypewriterQueue,\n CONTENT_AWARE_TYPEWRITER_TICK_BUDGET,\n consumeContentAwareTypewriterQueue,\n getTrailingTypewriterGrapheme,\n isContentAwareTypewriterQueueEmpty,\n type ContentAwareTypewriterQueue,\n} from \"./utils/typewriter-pacing\";\nimport {\n splitContentSegments,\n type RenderSegment,\n} from \"./utils/split-content\";\nimport {\n getInteractionDefaultValues,\n type InteractionDefaultValueOptions,\n} from \"../../lib/interaction-defaults\";\nimport {\n getMarkdownFlowDirection,\n getMarkdownFlowLanguage,\n type MarkdownFlowLocale,\n} from \"../../lib/locale\";\nimport { getContentRenderLocaleTexts } from \"./contentRenderI18n\";\n\nconst SANDBOX_TAG_HINT_PATTERN =\n /<(script|style|link|iframe|html|head|body|meta|title|base|template|div|section|article|main)\\b/i;\nconst FIXED_TYPEWRITER_CHUNK_SIZE = 2;\n\nexport type ContentRenderTypewriterPacing = \"fixed\" | \"content-aware\";\n\n// Define component Props type\nexport interface ContentRenderProps {\n content: string;\n contentType?: string;\n /** Locale used for built-in UI text when a more specific text prop is not provided. */\n locale?: MarkdownFlowLocale;\n /** Overrides the locale-derived language; omitted values inherit from the host. */\n lang?: string;\n /** Overrides locale-derived direction; omitted values inherit when no locale is set. */\n dir?: React.HTMLAttributes<HTMLDivElement>[\"dir\"];\n /**\n * Callback invoked when the custom button after content is clicked.\n * This button is rendered via the `<custom-button-after-content>` tag in markdown content.\n * @example\n * ```tsx\n * <ContentRender\n * content=\"Hello <custom-button-after-content>Ask</custom-button-after-content>\"\n * onClickCustomButtonAfterContent={() => console.log('Button clicked')}\n * />\n * ```\n */\n customRenderBar?: CustomRenderBarProps;\n onClickCustomButtonAfterContent?: () => void;\n onSend?: (content: OnSendContentParams) => void;\n typingSpeed?: number;\n enableTypewriter?: boolean;\n /** Controls how much text is revealed per tick. Defaults to the legacy fixed pacing. */\n typewriterPacing?: ContentRenderTypewriterPacing;\n onTypeFinished?: () => void;\n onTypewriterStateChange?: (state: ContentRenderTypewriterState) => void;\n userInput?: string;\n interactionDefaultValueOptions?: InteractionDefaultValueOptions;\n defaultButtonText?: string;\n defaultInputText?: string; // Text input by user\n defaultSelectedValues?: string[]; // Default selected values for multi-select\n readonly?: boolean;\n // Multi-select confirm button text (i18n support)\n confirmButtonText?: string;\n // Copy button text (i18n support)\n copyButtonText?: string;\n // Copied state text (i18n support)\n copiedButtonText?: string;\n // Dynamic interaction format for multi-select support\n dynamicInteractionFormat?: string;\n // Loading text before first HTML block renders inside iframe (i18n support)\n sandboxLoadingText?: string;\n // Loading text while styles are being generated inside iframe\n sandboxStyleLoadingText?: string;\n // Loading text while scripts are being cached/executed inside iframe\n sandboxScriptLoadingText?: string;\n // Disable sandbox loading overlays when upper layers have already entered an error state\n disableSandboxLoadingOverlay?: boolean;\n // Fullscreen button text for iframe sandbox\n sandboxFullscreenButtonText?: string;\n // Exit fullscreen button text for iframe sandbox\n sandboxExitFullscreenButtonText?: string;\n // Sandbox render mode\n sandboxMode?: \"content\" | \"blackboard\";\n beforeSend?: (param: OnSendContentParams) => boolean;\n // tooltipMinLength?: number; // Control minimum character length for tooltip display, default 10\n}\n\nexport interface ContentRenderTypewriterState {\n isTypewriterEnabled: boolean;\n isTyping: boolean;\n isComplete: boolean;\n renderedLength: number;\n totalLength: number;\n}\n\n// Render svg string via Shadow DOM to avoid markdown wrapping\nconst SvgBlockInShadow: React.FC<{ svg: string }> = ({ svg }) => {\n const hostRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const host = hostRef.current;\n if (!host) return;\n const shadowRoot = host.shadowRoot ?? host.attachShadow({ mode: \"open\" });\n const styleId = \"content-render-svg-style\";\n let styleEl = shadowRoot.getElementById(styleId) as HTMLStyleElement | null;\n\n if (!styleEl) {\n styleEl = document.createElement(\"style\");\n styleEl.id = styleId;\n // Keep intrinsic SVG width so the wrapper can scroll horizontally when needed\n styleEl.textContent = `\n svg { height: auto; display: inline-block; }\n svg.content-render-svg-el--responsive { width: 100%; max-width: 100%; }\n svg.content-render-svg-el--fixed { max-width: none; }\n `;\n shadowRoot.appendChild(styleEl);\n }\n\n const nodesToRemove = Array.from(shadowRoot.childNodes).filter(\n (node) => node !== styleEl\n );\n nodesToRemove.forEach((node) => shadowRoot.removeChild(node));\n\n const template = document.createElement(\"template\");\n const cleanedSvg = stripSvgTextLineBreaks(svg);\n template.innerHTML = cleanedSvg;\n shadowRoot.append(template.content.cloneNode(true));\n\n let hasResponsiveSvg = false;\n let hasFixedSvg = false;\n\n shadowRoot.querySelectorAll(\"svg\").forEach((svgEl) => {\n // Derive responsive sizing from viewBox so pure viewBox SVGs stay visible and fluid\n const viewBox = svgEl.getAttribute(\"viewBox\");\n if (!viewBox) return;\n\n const dimensions = viewBox\n .trim()\n .split(/[\\s,]+/)\n .map((value) => Number(value));\n\n if (dimensions.length !== 4 || dimensions.some(Number.isNaN)) return;\n\n const [, , viewBoxWidth, viewBoxHeight] = dimensions;\n const widthAttr = svgEl.getAttribute(\"width\");\n const heightAttr = svgEl.getAttribute(\"height\");\n const isRelativeLength = (value?: string | null) => {\n if (!value) return false;\n const normalized = value.trim().toLowerCase();\n return normalized === \"auto\" || normalized.endsWith(\"%\");\n };\n const toNumericLength = (value?: string | null) => {\n if (!value) return null;\n const normalized = value.trim().toLowerCase();\n if (normalized === \"auto\" || normalized.endsWith(\"%\")) {\n return null;\n }\n const parsed = Number.parseFloat(normalized);\n return Number.isNaN(parsed) ? null : parsed;\n };\n // Treat percentage/auto sizing as responsive so viewBox drives the layout\n const isWidthRelative = isRelativeLength(widthAttr);\n const isHeightRelative = isRelativeLength(heightAttr);\n const widthMissing = !widthAttr || widthAttr === \"0\";\n const heightMissing = !heightAttr || heightAttr === \"0\";\n const numericWidth = toNumericLength(widthAttr);\n const numericHeight = toNumericLength(heightAttr);\n const matchesViewBox =\n numericWidth === viewBoxWidth && numericHeight === viewBoxHeight;\n\n // Prefer responsive layout when sizing is relative or matches the viewBox\n const shouldUseResponsiveSize =\n isWidthRelative ||\n isHeightRelative ||\n (widthMissing && heightMissing) ||\n matchesViewBox;\n\n if (shouldUseResponsiveSize) {\n hasResponsiveSvg = true;\n svgEl.classList.add(\"content-render-svg-el--responsive\");\n svgEl.classList.remove(\"content-render-svg-el--fixed\");\n svgEl.style.width = \"100%\";\n svgEl.style.height = \"auto\";\n if (!svgEl.style.aspectRatio && viewBoxHeight > 0) {\n svgEl.style.aspectRatio = `${viewBoxWidth} / ${viewBoxHeight}`;\n }\n return;\n }\n\n hasFixedSvg = true;\n svgEl.classList.add(\"content-render-svg-el--fixed\");\n svgEl.classList.remove(\"content-render-svg-el--responsive\");\n if (widthMissing && viewBoxWidth > 0) {\n svgEl.setAttribute(\"width\", `${viewBoxWidth}`);\n }\n if (heightMissing && viewBoxHeight > 0) {\n svgEl.setAttribute(\"height\", `${viewBoxHeight}`);\n }\n });\n\n const hostResponsive = hasResponsiveSvg && !hasFixedSvg;\n host.classList.toggle(\"content-render-svg--responsive\", hostResponsive);\n host.classList.toggle(\"content-render-svg--fixed\", !hostResponsive);\n }, [svg]);\n\n return (\n <div className=\"content-render-svg-scroll\">\n <div className=\"content-render-svg\" ref={hostRef} />\n </div>\n );\n};\n\n// Extended component interface\ntype CustomComponents = ComponentsWithCustomVariable & {\n \"custom-button-after-content\"?: React.ComponentType<{\n children: React.ReactNode;\n }>;\n};\n\ntype MarkdownComponentRuntimeValues = {\n direction?: ContentRenderProps[\"dir\"];\n language?: string;\n mermaidMessages: MermaidChartProps[\"messages\"];\n beforeSend?: (param: OnSendContentParams) => boolean;\n locale?: MarkdownFlowLocale;\n onClickCustomButtonAfterContent?: () => void;\n onSend?: (content: OnSendContentParams) => void;\n readonly: boolean;\n renderContent: string;\n resolvedConfirmButtonText: string;\n resolvedCopiedButtonText: string;\n resolvedCopyButtonText: string;\n resolvedDefaultButtonText?: string;\n resolvedDefaultInputText?: string;\n resolvedDefaultSelectedValues?: string[];\n};\n\nconst MarkdownComponentRuntimeContext =\n React.createContext<React.RefObject<MarkdownComponentRuntimeValues> | null>(\n null\n );\n\nconst MarkdownCode = (props: React.ComponentProps<\"code\">) => {\n const runtimeValuesRef = React.useContext(MarkdownComponentRuntimeContext);\n const isInCodeBlock = React.useContext(CodeBlockContext);\n if (!runtimeValuesRef) {\n throw new Error(\"Markdown code renderer requires ContentRender context.\");\n }\n const { className, children, ...rest } = props as {\n className?: string;\n children?: React.ReactNode;\n dir?: string;\n };\n const match = /language-(\\w+)/.exec(className || \"\");\n const language = match?.[1];\n if (language === \"mermaid\") {\n const chartContent = children?.toString().replace(/\\n$/, \"\") || \"\";\n const frozen = mermaidBlockIsComplete(\n runtimeValuesRef.current.renderContent,\n chartContent\n );\n return (\n <MermaidChart\n chart={chartContent}\n frozen={frozen}\n messages={runtimeValuesRef.current.mermaidMessages}\n />\n );\n }\n\n return (\n <code\n className={className}\n {...rest}\n dir={rest.dir ?? (isInCodeBlock ? undefined : \"ltr\")}\n >\n {children}\n </code>\n );\n};\n\nconst remarkPlugins: PluggableList = [\n remarkGfm,\n remarkMath,\n remarkFlow,\n remarkBreaks,\n];\n\nconst rehypePlugins: PluggableList = [\n preserveCustomVariableProperties,\n rehypeRaw,\n sanitizeInvalidTagName,\n restoreCustomVariableProperties,\n [rehypeHighlight, { languages: highlightLanguages, subset: subsetLanguages }],\n rehypeKatex,\n];\n\nexport const MarkdownRenderer: React.FC<{\n content: string;\n components: CustomComponents;\n locale?: MarkdownFlowLocale;\n}> = ({ content: markdownContent, components, locale }) => {\n const texts = getContentRenderLocaleTexts(locale);\n return (\n <div className=\"markdown-renderer\">\n <ReactMarkdown\n remarkPlugins={remarkPlugins}\n rehypePlugins={rehypePlugins}\n remarkRehypeOptions={{\n footnoteLabel: texts.footnoteLabel,\n footnoteBackLabel: (referenceIndex, rereferenceIndex) => {\n const reference =\n String(referenceIndex + 1) +\n (rereferenceIndex > 1 ? `-${rereferenceIndex}` : \"\");\n return texts.footnoteBackLabel.replace(\"{reference}\", reference);\n },\n }}\n components={components}\n >\n {markdownContent}\n </ReactMarkdown>\n </div>\n );\n};\n\nconst mergeNonSandboxSegments = (segments: RenderSegment[]) => {\n if (segments.length <= 1) return segments;\n const merged: RenderSegment[] = [];\n\n segments.forEach((segment) => {\n if (segment.type === \"sandbox\") {\n merged.push(segment);\n return;\n }\n\n const last = merged[merged.length - 1];\n if (last && last.type !== \"sandbox\") {\n merged[merged.length - 1] = {\n type: \"markdown\",\n value: `${last.value}${segment.value}`,\n };\n return;\n }\n\n merged.push({ type: \"markdown\", value: segment.value });\n });\n\n return merged;\n};\n\nconst splitTextByCharacterChunk = (value: string, chunkSize: number) => {\n const safeChunkSize = Math.max(1, chunkSize);\n const characters = Array.from(value);\n\n return {\n chunk: characters.slice(0, safeChunkSize).join(\"\"),\n rest: characters.slice(safeChunkSize).join(\"\"),\n };\n};\n\nconst areStringArraysEqual = (left?: string[], right?: string[]) => {\n if (left === right) {\n return true;\n }\n if (!left || !right || left.length !== right.length) {\n return false;\n }\n return left.every((value, index) => value === right[index]);\n};\n\nconst useStableStringArray = (values?: string[]) => {\n const valuesRef = useRef<string[] | undefined>(values);\n\n if (!areStringArraysEqual(valuesRef.current, values)) {\n valuesRef.current = values;\n }\n\n return valuesRef.current;\n};\n\nconst ContentRender: React.FC<ContentRenderProps> = ({\n content,\n contentType,\n locale,\n lang,\n dir,\n customRenderBar,\n onSend,\n typingSpeed = 40,\n enableTypewriter = false,\n typewriterPacing = \"fixed\",\n onTypeFinished,\n onTypewriterStateChange,\n userInput,\n interactionDefaultValueOptions,\n defaultButtonText,\n defaultInputText,\n defaultSelectedValues,\n readonly = false,\n confirmButtonText,\n copyButtonText,\n copiedButtonText,\n sandboxLoadingText,\n sandboxStyleLoadingText,\n sandboxScriptLoadingText,\n disableSandboxLoadingOverlay = false,\n sandboxFullscreenButtonText,\n sandboxExitFullscreenButtonText,\n sandboxMode = \"content\",\n onClickCustomButtonAfterContent,\n beforeSend,\n // tooltipMinLength,\n}) => {\n const localeTexts = getContentRenderLocaleTexts(locale);\n const mermaidMessages = useMemo(\n () => ({\n loading: localeTexts.mermaidLoadingText,\n emptyChart: localeTexts.mermaidEmptyChartText,\n error: localeTexts.mermaidErrorText,\n }),\n [localeTexts]\n );\n const direction = dir ?? getMarkdownFlowDirection(locale);\n const language = lang ?? getMarkdownFlowLanguage(locale);\n const resolvedConfirmButtonText =\n confirmButtonText || localeTexts.confirmButtonText;\n const resolvedCopyButtonText = copyButtonText || localeTexts.copyButtonText;\n const resolvedCopiedButtonText =\n copiedButtonText || localeTexts.copiedButtonText;\n const resolvedSandboxFullscreenButtonText =\n sandboxFullscreenButtonText || localeTexts.sandboxFullscreenButtonText;\n const resolvedSandboxExitFullscreenButtonText =\n sandboxExitFullscreenButtonText ||\n localeTexts.sandboxExitFullscreenButtonText;\n const shouldApplyTypewriterByContentType =\n !contentType || contentType === \"text\";\n const isTypewriterEnabled =\n Boolean(enableTypewriter) && shouldApplyTypewriterByContentType;\n const typewriterTickMs = Math.max(0, typingSpeed);\n const fixedTypewriterContentVersion =\n typewriterPacing === \"fixed\" ? content : undefined;\n const [displayContent, setDisplayContent] = useState(() =>\n isTypewriterEnabled ? \"\" : content\n );\n const displayContentRef = useRef(displayContent);\n const pendingContentRef = useRef(\"\");\n const contentAwareQueueRef = useRef<ContentAwareTypewriterQueue>({\n tokens: [],\n head: 0,\n trailingGrapheme: \"\",\n });\n const contentAwareBudgetRef = useRef(0);\n const previousTypewriterEnabledRef = useRef(isTypewriterEnabled);\n const previousTypewriterPacingRef = useRef(typewriterPacing);\n const previousSourceContentRef = useRef(content);\n const hasReportedTypeFinishedRef = useRef(false);\n const [typewriterWakeVersion, setTypewriterWakeVersion] = useState(0);\n\n useEffect(() => {\n const wasTypewriterEnabled = previousTypewriterEnabledRef.current;\n const previousTypewriterPacing = previousTypewriterPacingRef.current;\n const previousSourceContent = previousSourceContentRef.current;\n const wasPending = Boolean(pendingContentRef.current);\n\n previousTypewriterEnabledRef.current = isTypewriterEnabled;\n previousTypewriterPacingRef.current = typewriterPacing;\n previousSourceContentRef.current = content;\n\n if (\n content !== previousSourceContent ||\n isTypewriterEnabled !== wasTypewriterEnabled\n ) {\n hasReportedTypeFinishedRef.current = false;\n }\n\n const clearPendingContent = () => {\n pendingContentRef.current = \"\";\n contentAwareQueueRef.current = {\n tokens: [],\n head: 0,\n trailingGrapheme: \"\",\n };\n contentAwareBudgetRef.current = 0;\n };\n\n const updateDisplayContent = (nextContent: string) => {\n displayContentRef.current = nextContent;\n setDisplayContent(nextContent);\n };\n\n if (!isTypewriterEnabled) {\n clearPendingContent();\n updateDisplayContent(content);\n return;\n }\n\n if (!wasTypewriterEnabled) {\n clearPendingContent();\n updateDisplayContent(\"\");\n }\n\n const visibleContent = !wasTypewriterEnabled\n ? \"\"\n : displayContentRef.current;\n\n if (!content.startsWith(visibleContent)) {\n clearPendingContent();\n updateDisplayContent(content);\n if (typewriterPacing === \"content-aware\") {\n contentAwareQueueRef.current = {\n tokens: [],\n head: 0,\n trailingGrapheme: getTrailingTypewriterGrapheme(content),\n };\n }\n return;\n }\n\n let nextPendingContent = content.slice(visibleContent.length);\n if (!nextPendingContent) {\n pendingContentRef.current = \"\";\n contentAwareBudgetRef.current = 0;\n contentAwareQueueRef.current =\n typewriterPacing === \"content-aware\"\n ? {\n tokens: [],\n head: 0,\n trailingGrapheme: getTrailingTypewriterGrapheme(visibleContent),\n }\n : { tokens: [], head: 0, trailingGrapheme: \"\" };\n return;\n }\n\n if (typewriterPacing === \"content-aware\") {\n const previousPendingContent = previousSourceContent.slice(\n visibleContent.length\n );\n const canAppendToCachedQueue =\n wasTypewriterEnabled &&\n previousTypewriterPacing === \"content-aware\" &&\n content.startsWith(previousSourceContent) &&\n pendingContentRef.current === previousPendingContent;\n\n if (canAppendToCachedQueue) {\n const appended = appendContentAwareTypewriterQueue(\n contentAwareQueueRef.current,\n content.slice(previousSourceContent.length)\n );\n contentAwareQueueRef.current = appended.queue;\n\n if (appended.immediateChunk) {\n nextPendingContent = nextPendingContent.slice(\n appended.immediateChunk.length\n );\n updateDisplayContent(`${visibleContent}${appended.immediateChunk}`);\n }\n } else {\n const appended = appendContentAwareTypewriterQueue(\n {\n tokens: [],\n head: 0,\n trailingGrapheme: getTrailingTypewriterGrapheme(visibleContent),\n },\n nextPendingContent\n );\n contentAwareQueueRef.current = appended.queue;\n\n if (appended.immediateChunk) {\n nextPendingContent = nextPendingContent.slice(\n appended.immediateChunk.length\n );\n updateDisplayContent(`${visibleContent}${appended.immediateChunk}`);\n }\n\n contentAwareBudgetRef.current = 0;\n }\n } else {\n contentAwareQueueRef.current = {\n tokens: [],\n head: 0,\n trailingGrapheme: \"\",\n };\n contentAwareBudgetRef.current = 0;\n }\n\n pendingContentRef.current = nextPendingContent;\n\n if (!wasPending && nextPendingContent) {\n setTypewriterWakeVersion((version) => version + 1);\n }\n }, [content, isTypewriterEnabled, typewriterPacing]);\n\n useEffect(() => {\n if (!isTypewriterEnabled) {\n return;\n }\n\n if (\n hasReportedTypeFinishedRef.current ||\n pendingContentRef.current ||\n displayContent !== content\n ) {\n return;\n }\n\n hasReportedTypeFinishedRef.current = true;\n onTypeFinished?.();\n }, [content, displayContent, isTypewriterEnabled, onTypeFinished]);\n\n useEffect(() => {\n if (!isTypewriterEnabled || !pendingContentRef.current) {\n return undefined;\n }\n\n const typewriterTimer = window.setTimeout(() => {\n if (!pendingContentRef.current) {\n return;\n }\n\n let chunk = \"\";\n\n if (typewriterPacing === \"content-aware\") {\n const result = consumeContentAwareTypewriterQueue(\n contentAwareQueueRef.current,\n contentAwareBudgetRef.current + CONTENT_AWARE_TYPEWRITER_TICK_BUDGET\n );\n\n chunk = result.chunk;\n contentAwareQueueRef.current = result.queue;\n\n if (isContentAwareTypewriterQueueEmpty(result.queue)) {\n contentAwareBudgetRef.current = 0;\n } else {\n contentAwareBudgetRef.current = result.remainingBudget;\n }\n } else {\n const fixedChunk = splitTextByCharacterChunk(\n pendingContentRef.current,\n FIXED_TYPEWRITER_CHUNK_SIZE\n );\n chunk = fixedChunk.chunk;\n }\n\n if (!chunk) {\n return;\n }\n\n pendingContentRef.current = pendingContentRef.current.slice(chunk.length);\n if (!pendingContentRef.current) {\n contentAwareQueueRef.current =\n typewriterPacing === \"content-aware\"\n ? {\n tokens: [],\n head: 0,\n trailingGrapheme: contentAwareQueueRef.current.trailingGrapheme,\n }\n : { tokens: [], head: 0, trailingGrapheme: \"\" };\n contentAwareBudgetRef.current = 0;\n }\n\n const nextDisplayContent = `${displayContentRef.current}${chunk}`;\n displayContentRef.current = nextDisplayContent;\n setDisplayContent(nextDisplayContent);\n }, typewriterTickMs);\n\n return () => window.clearTimeout(typewriterTimer);\n }, [\n displayContent,\n fixedTypewriterContentVersion,\n isTypewriterEnabled,\n typewriterPacing,\n typewriterTickMs,\n typewriterWakeVersion,\n ]);\n\n const typewriterState = useMemo<ContentRenderTypewriterState>(\n () => ({\n isTypewriterEnabled,\n isTyping: isTypewriterEnabled && displayContent !== content,\n isComplete: displayContent === content,\n renderedLength: displayContent.length,\n totalLength: content.length,\n }),\n [content, displayContent, isTypewriterEnabled]\n );\n\n useEffect(() => {\n onTypewriterStateChange?.(typewriterState);\n }, [onTypewriterStateChange, typewriterState]);\n\n const renderContent = isTypewriterEnabled ? displayContent : content;\n const normalizedContent = useMemo(\n () => normalizeInlineHtml(renderContent),\n [renderContent]\n );\n\n const interactionDefaults = useMemo(\n () =>\n getInteractionDefaultValues(\n renderContent,\n userInput,\n interactionDefaultValueOptions\n ),\n [interactionDefaultValueOptions, renderContent, userInput]\n );\n\n const resolvedDefaultButtonText =\n defaultButtonText?.trim() || interactionDefaults.buttonText;\n const resolvedDefaultInputText =\n defaultInputText?.trim() || interactionDefaults.inputText;\n const fallbackSelectedValues = useMemo(\n () =>\n userInput\n ? userInput\n .split(\",\")\n .map((value) => value.trim())\n .filter(Boolean)\n : undefined,\n [userInput]\n );\n const resolvedDefaultSelectedValues = defaultSelectedValues?.length\n ? defaultSelectedValues\n : interactionDefaults.selectedValues || fallbackSelectedValues;\n const stableDefaultSelectedValues = useStableStringArray(\n resolvedDefaultSelectedValues\n );\n const componentRuntimeValuesRef = useRef<MarkdownComponentRuntimeValues>({\n direction,\n language,\n mermaidMessages,\n beforeSend,\n locale,\n onClickCustomButtonAfterContent,\n onSend,\n readonly,\n renderContent,\n resolvedConfirmButtonText,\n resolvedCopiedButtonText,\n resolvedCopyButtonText,\n resolvedDefaultButtonText,\n resolvedDefaultInputText,\n resolvedDefaultSelectedValues: stableDefaultSelectedValues,\n });\n\n componentRuntimeValuesRef.current = {\n direction,\n language,\n mermaidMessages,\n beforeSend,\n locale,\n onClickCustomButtonAfterContent,\n onSend,\n readonly,\n renderContent,\n resolvedConfirmButtonText,\n resolvedCopiedButtonText,\n resolvedCopyButtonText,\n resolvedDefaultButtonText,\n resolvedDefaultInputText,\n resolvedDefaultSelectedValues: stableDefaultSelectedValues,\n };\n\n const components = useMemo<CustomComponents>(\n () => ({\n \"custom-button-after-content\": ({\n children,\n }: {\n children: React.ReactNode;\n }) => {\n return (\n <button\n className=\"content-render-custom-button-after-content\"\n onClick={\n componentRuntimeValuesRef.current.onClickCustomButtonAfterContent\n }\n >\n <span className=\"content-render-custom-button-after-content-inner\">\n {children}\n </span>\n </button>\n );\n },\n \"custom-variable\": (props) => (\n <CustomButtonInputVariable\n {...props}\n readonly={componentRuntimeValuesRef.current.readonly}\n defaultButtonText={\n componentRuntimeValuesRef.current.resolvedDefaultButtonText\n }\n defaultInputText={\n componentRuntimeValuesRef.current.resolvedDefaultInputText\n }\n defaultSelectedValues={\n componentRuntimeValuesRef.current.resolvedDefaultSelectedValues\n }\n onSend={componentRuntimeValuesRef.current.onSend}\n beforeSend={componentRuntimeValuesRef.current.beforeSend}\n locale={componentRuntimeValuesRef.current.locale}\n dir={componentRuntimeValuesRef.current.direction}\n lang={componentRuntimeValuesRef.current.language}\n confirmButtonText={\n componentRuntimeValuesRef.current.resolvedConfirmButtonText\n }\n // tooltipMinLength={tooltipMinLength}\n />\n ),\n code: MarkdownCode,\n table: ({ ...props }) => (\n <div className=\"content-render-table-container\">\n <table className=\"content-render-table\" {...props} />\n </div>\n ),\n th: ({ ...props }) => <th className=\"content-render-th\" {...props} />,\n td: ({ ...props }) => <td className=\"content-render-td\" {...props} />,\n tr: ({ ...props }) => <tr className=\"content-render-tr\" {...props} />,\n li: ({ node, ...props }) => {\n const className = node?.properties?.className;\n const hasTaskListItem =\n (typeof className === \"string\" &&\n className.includes(\"task-list-item\")) ||\n (Array.isArray(className) && className.includes(\"task-list-item\"));\n if (hasTaskListItem) {\n return <li className=\"content-render-task-list-item\" {...props} />;\n }\n return <li {...props} />;\n },\n ol: ({ ...props }) => <ol className=\"content-render-ol\" {...props} />,\n ul: ({ ...props }) => <ul className=\"content-render-ul\" {...props} />,\n input: ({ ...props }) => {\n if (props.type === \"checkbox\") {\n return (\n <input\n type=\"checkbox\"\n className=\"content-render-checkbox\"\n disabled\n {...props}\n />\n );\n }\n return <input {...props} />;\n },\n a: ({ children, ...props }) => (\n <a target=\"_blank\" rel=\"noopener noreferrer\" {...props}>\n {children}\n </a>\n ),\n pre: (props) => (\n <CodeBlock\n {...props}\n copyButtonText={\n componentRuntimeValuesRef.current.resolvedCopyButtonText\n }\n copiedButtonText={\n componentRuntimeValuesRef.current.resolvedCopiedButtonText\n }\n />\n ),\n }),\n []\n );\n\n const hasPotentialSandboxTags = useMemo(\n () => SANDBOX_TAG_HINT_PATTERN.test(renderContent),\n [renderContent]\n );\n\n const renderSegments = useMemo(\n () =>\n hasPotentialSandboxTags ? splitContentSegments(renderContent, true) : [],\n [renderContent, hasPotentialSandboxTags]\n );\n\n const hasSandbox = renderSegments.some(\n (segment) => segment.type === \"sandbox\"\n );\n const mergedRenderSegments = useMemo(\n () => mergeNonSandboxSegments(renderSegments),\n [renderSegments]\n );\n\n const segments = useMemo(\n () => parseMarkdownSegments(normalizedContent),\n [normalizedContent]\n );\n\n const renderMarkdownSegments = (raw: string, keyPrefix: string) => {\n const normalized = normalizeInlineHtml(raw);\n const parsed = parseMarkdownSegments(normalized);\n\n return parsed.map((seg, index) => {\n const key = `${keyPrefix}-${seg.type}-${index}`;\n\n if (seg.type === \"text\") {\n return (\n <MarkdownComponentRuntimeContext.Provider\n key={key}\n value={componentRuntimeValuesRef}\n >\n <MarkdownRenderer\n locale={locale}\n components={components}\n content={seg.value}\n />\n </MarkdownComponentRuntimeContext.Provider>\n );\n }\n\n if (seg.type === \"mermaid\") {\n return (\n <MermaidChart\n key={key}\n chart={seg.value}\n frozen={!seg.complete}\n messages={mermaidMessages}\n />\n );\n }\n\n if (seg.type === \"svg\") {\n return <SvgBlockInShadow key={key} svg={seg.value} />;\n }\n\n return null;\n });\n };\n\n if (hasSandbox) {\n return (\n <div\n className=\"content-render markdown-body\"\n dir={direction}\n lang={language}\n >\n {mergedRenderSegments.map((segment, idx) =>\n segment.type === \"sandbox\" ? (\n <IframeSandbox\n key={`sandbox-${idx}`}\n hideFullScreen\n type=\"sandbox\"\n content={segment.value}\n className=\"content-render-iframe\"\n locale={locale}\n dir={direction}\n lang={language}\n loadingText={sandboxLoadingText}\n styleLoadingText={sandboxStyleLoadingText}\n scriptLoadingText={sandboxScriptLoadingText}\n disableLoadingOverlay={disableSandboxLoadingOverlay}\n fullScreenButtonText={resolvedSandboxFullscreenButtonText}\n exitFullScreenButtonText={resolvedSandboxExitFullscreenButtonText}\n mode={sandboxMode}\n />\n ) : (\n <React.Fragment key={`md-${idx}`}>\n {renderMarkdownSegments(segment.value, `md-${idx}`)}\n </React.Fragment>\n )\n )}\n </div>\n );\n }\n\n return (\n <div\n className=\"content-render markdown-body\"\n dir={direction}\n lang={language}\n >\n {segments.map((seg, index) => {\n if (seg.type === \"text\") {\n return (\n <MarkdownComponentRuntimeContext.Provider\n key={index}\n value={componentRuntimeValuesRef}\n >\n <MarkdownRenderer\n locale={locale}\n components={components}\n content={seg.value}\n />\n </MarkdownComponentRuntimeContext.Provider>\n );\n }\n\n if (seg.type === \"mermaid\") {\n return (\n <MermaidChart\n key={index}\n chart={seg.value}\n frozen={!seg.complete}\n messages={mermaidMessages}\n />\n );\n }\n\n if (seg.type === \"svg\") {\n return <SvgBlockInShadow key={index} svg={seg.value} />;\n }\n })}\n\n {customRenderBar && (\n <div className=\"content-render-custom-bar\">\n {React.createElement(customRenderBar, {\n content,\n displayContent: normalizedContent,\n onSend,\n })}\n </div>\n )}\n </div>\n );\n};\n\nexport default ContentRender;\n"],"names":["SANDBOX_TAG_HINT_PATTERN","FIXED_TYPEWRITER_CHUNK_SIZE","SvgBlockInShadow","svg","hostRef","useRef","useEffect","host","shadowRoot","styleId","styleEl","node","template","cleanedSvg","stripSvgTextLineBreaks","hasResponsiveSvg","hasFixedSvg","svgEl","viewBox","dimensions","value","viewBoxWidth","viewBoxHeight","widthAttr","heightAttr","isRelativeLength","normalized","toNumericLength","parsed","isWidthRelative","isHeightRelative","widthMissing","heightMissing","numericWidth","numericHeight","hostResponsive","jsx","MarkdownComponentRuntimeContext","React","MarkdownCode","props","runtimeValuesRef","isInCodeBlock","CodeBlockContext","className","children","rest","chartContent","frozen","mermaidBlockIsComplete","MermaidChart","remarkPlugins","remarkGfm","remarkMath","remarkFlow","remarkBreaks","rehypePlugins","preserveCustomVariableProperties","rehypeRaw","sanitizeInvalidTagName","restoreCustomVariableProperties","rehypeHighlight","highlightLanguages","subsetLanguages","rehypeKatex","MarkdownRenderer","markdownContent","components","locale","texts","getContentRenderLocaleTexts","ReactMarkdown","referenceIndex","rereferenceIndex","reference","mergeNonSandboxSegments","segments","merged","segment","last","splitTextByCharacterChunk","chunkSize","safeChunkSize","characters","areStringArraysEqual","left","right","index","useStableStringArray","values","valuesRef","ContentRender","content","contentType","lang","dir","customRenderBar","onSend","typingSpeed","enableTypewriter","typewriterPacing","onTypeFinished","onTypewriterStateChange","userInput","interactionDefaultValueOptions","defaultButtonText","defaultInputText","defaultSelectedValues","readonly","confirmButtonText","copyButtonText","copiedButtonText","sandboxLoadingText","sandboxStyleLoadingText","sandboxScriptLoadingText","disableSandboxLoadingOverlay","sandboxFullscreenButtonText","sandboxExitFullscreenButtonText","sandboxMode","onClickCustomButtonAfterContent","beforeSend","localeTexts","mermaidMessages","useMemo","direction","getMarkdownFlowDirection","language","getMarkdownFlowLanguage","resolvedConfirmButtonText","resolvedCopyButtonText","resolvedCopiedButtonText","resolvedSandboxFullscreenButtonText","resolvedSandboxExitFullscreenButtonText","isTypewriterEnabled","typewriterTickMs","fixedTypewriterContentVersion","displayContent","setDisplayContent","useState","displayContentRef","pendingContentRef","contentAwareQueueRef","contentAwareBudgetRef","previousTypewriterEnabledRef","previousTypewriterPacingRef","previousSourceContentRef","hasReportedTypeFinishedRef","typewriterWakeVersion","setTypewriterWakeVersion","wasTypewriterEnabled","previousTypewriterPacing","previousSourceContent","wasPending","clearPendingContent","updateDisplayContent","nextContent","visibleContent","getTrailingTypewriterGrapheme","nextPendingContent","previousPendingContent","appended","appendContentAwareTypewriterQueue","version","typewriterTimer","chunk","result","consumeContentAwareTypewriterQueue","CONTENT_AWARE_TYPEWRITER_TICK_BUDGET","isContentAwareTypewriterQueueEmpty","nextDisplayContent","typewriterState","renderContent","normalizedContent","normalizeInlineHtml","interactionDefaults","getInteractionDefaultValues","resolvedDefaultButtonText","resolvedDefaultInputText","fallbackSelectedValues","resolvedDefaultSelectedValues","stableDefaultSelectedValues","componentRuntimeValuesRef","CustomButtonInputVariable","CodeBlock","hasPotentialSandboxTags","renderSegments","splitContentSegments","hasSandbox","mergedRenderSegments","parseMarkdownSegments","renderMarkdownSegments","raw","keyPrefix","seg","key","idx","IframeSandbox","jsxs"],"mappings":"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"}