markdown-flow-ui 0.2.20-dev.1 → 0.2.20
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.
|
@@ -2,5 +2,5 @@
|
|
|
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 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;
|
|
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=30,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 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":"i8CA4DMA,GACJ,kGACIC,GAA8B,EA2E9BC,GAA8C,CAAC,CAAE,IAAAC,KAAU,CAC/D,MAAMC,EAAUC,EAAAA,OAAuB,IAAI,EAE3CC,OAAAA,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAOH,EAAQ,QACrB,GAAI,CAACG,EAAM,OACX,MAAMC,EAAaD,EAAK,YAAcA,EAAK,aAAa,CAAE,KAAM,OAAQ,EAClEE,EAAU,2BAChB,IAAIC,EAAUF,EAAW,eAAeC,CAAO,EAE1CC,IACHA,EAAU,SAAS,cAAc,OAAO,EACxCA,EAAQ,GAAKD,EAEbC,EAAQ,YAAc;AAAA;AAAA;AAAA;AAAA,QAKtBF,EAAW,YAAYE,CAAO,GAGV,MAAM,KAAKF,EAAW,UAAU,EAAE,OACrDG,GAASA,IAASD,CAAA,EAEP,QAASC,GAASH,EAAW,YAAYG,CAAI,CAAC,EAE5D,MAAMC,EAAW,SAAS,cAAc,UAAU,EAC5CC,EAAaC,GAAAA,uBAAuBX,CAAG,EAC7CS,EAAS,UAAYC,EACrBL,EAAW,OAAOI,EAAS,QAAQ,UAAU,EAAI,CAAC,EAElD,IAAIG,EAAmB,GACnBC,EAAc,GAElBR,EAAW,iBAAiB,KAAK,EAAE,QAASS,GAAU,CAEpD,MAAMC,EAAUD,EAAM,aAAa,SAAS,EAC5C,GAAI,CAACC,EAAS,OAEd,MAAMC,EAAaD,EAChB,KAAA,EACA,MAAM,QAAQ,EACd,IAAKE,GAAU,OAAOA,CAAK,CAAC,EAE/B,GAAID,EAAW,SAAW,GAAKA,EAAW,KAAK,OAAO,KAAK,EAAG,OAE9D,KAAM,CAAA,CAAA,CAAKE,EAAcC,CAAa,EAAIH,EACpCI,EAAYN,EAAM,aAAa,OAAO,EACtCO,EAAaP,EAAM,aAAa,QAAQ,EACxCQ,EAAoBL,GAA0B,CAClD,GAAI,CAACA,EAAO,MAAO,GACnB,MAAMM,EAAaN,EAAM,KAAA,EAAO,YAAA,EAChC,OAAOM,IAAe,QAAUA,EAAW,SAAS,GAAG,CACzD,EACMC,EAAmBP,GAA0B,CACjD,GAAI,CAACA,EAAO,OAAO,KACnB,MAAMM,EAAaN,EAAM,KAAA,EAAO,YAAA,EAChC,GAAIM,IAAe,QAAUA,EAAW,SAAS,GAAG,EAClD,OAAO,KAET,MAAME,EAAS,OAAO,WAAWF,CAAU,EAC3C,OAAO,OAAO,MAAME,CAAM,EAAI,KAAOA,CACvC,EAEMC,EAAkBJ,EAAiBF,CAAS,EAC5CO,EAAmBL,EAAiBD,CAAU,EAC9CO,EAAe,CAACR,GAAaA,IAAc,IAC3CS,EAAgB,CAACR,GAAcA,IAAe,IAC9CS,EAAeN,EAAgBJ,CAAS,EACxCW,EAAgBP,EAAgBH,CAAU,EAWhD,GALEK,GACAC,GACCC,GAAgBC,GANjBC,IAAiBZ,GAAgBa,IAAkBZ,EASxB,CAC3BP,EAAmB,GACnBE,EAAM,UAAU,IAAI,mCAAmC,EACvDA,EAAM,UAAU,OAAO,8BAA8B,EACrDA,EAAM,MAAM,MAAQ,OACpBA,EAAM,MAAM,OAAS,OACjB,CAACA,EAAM,MAAM,aAAeK,EAAgB,IAC9CL,EAAM,MAAM,YAAc,GAAGI,CAAY,MAAMC,CAAa,IAE9D,MACF,CAEAN,EAAc,GACdC,EAAM,UAAU,IAAI,8BAA8B,EAClDA,EAAM,UAAU,OAAO,mCAAmC,EACtDc,GAAgBV,EAAe,GACjCJ,EAAM,aAAa,QAAS,GAAGI,CAAY,EAAE,EAE3CW,GAAiBV,EAAgB,GACnCL,EAAM,aAAa,SAAU,GAAGK,CAAa,EAAE,CAEnD,CAAC,EAED,MAAMa,EAAiBpB,GAAoB,CAACC,EAC5CT,EAAK,UAAU,OAAO,iCAAkC4B,CAAc,EACtE5B,EAAK,UAAU,OAAO,4BAA6B,CAAC4B,CAAc,CACpE,EAAG,CAAChC,CAAG,CAAC,EAGNiC,EAAAA,IAAC,MAAA,CAAI,UAAU,4BACb,SAAAA,EAAAA,IAAC,OAAI,UAAU,qBAAqB,IAAKhC,CAAA,CAAS,CAAA,CACpD,CAEJ,EA2BMiC,GACJC,EAAM,cACJ,IACF,EAEIC,GAAgBC,GAAwC,CAC5D,MAAMC,EAAmBH,EAAM,WAAWD,EAA+B,EACnEK,EAAgBJ,EAAM,WAAWK,mBAAgB,EACvD,GAAI,CAACF,EACH,MAAM,IAAI,MAAM,wDAAwD,EAE1E,KAAM,CAAE,UAAAG,EAAW,SAAAC,EAAU,GAAGC,GAASN,EAOzC,GAFc,iBAAiB,KAAKI,GAAa,EAAE,IAC1B,CAAC,IACT,UAAW,CAC1B,MAAMG,EAAeF,GAAU,SAAA,EAAW,QAAQ,MAAO,EAAE,GAAK,GAC1DG,EAASC,GAAAA,uBACbR,EAAiB,QAAQ,cACzBM,CAAA,EAEF,OACEX,EAAAA,IAACc,GAAAA,QAAA,CACC,MAAOH,EACP,OAAAC,EACA,SAAUP,EAAiB,QAAQ,eAAA,CAAA,CAGzC,CAEA,OACEL,EAAAA,IAAC,OAAA,CACC,UAAAQ,EACC,GAAGE,EACJ,IAAKA,EAAK,MAAQJ,EAAgB,OAAY,OAE7C,SAAAG,CAAA,CAAA,CAGP,EAEMM,GAA+B,CACnCC,GAAAA,QACAC,GAAAA,QACAC,GAAAA,QACAC,GAAAA,OACF,EAEMC,GAA+B,CACnCC,GAAAA,iCACAC,GAAAA,QACAC,GAAAA,uBACAC,GAAAA,gCACA,CAACC,GAAAA,QAAiB,CAAE,UAAWC,GAAAA,mBAAoB,OAAQC,GAAAA,gBAAiB,EAC5EC,GAAAA,OACF,EAEaC,GAIR,CAAC,CAAE,QAASC,EAAiB,WAAAC,EAAY,OAAAC,KAAa,CACzD,MAAMC,EAAQC,GAAAA,4BAA4BF,CAAM,EAChD,OACEhC,EAAAA,IAAC,MAAA,CAAI,UAAU,oBACb,SAAAA,EAAAA,IAACmC,GAAAA,SAAA,CACC,cAAApB,GACA,cAAAK,GACA,oBAAqB,CACnB,cAAea,EAAM,cACrB,kBAAmB,CAACG,EAAgBC,IAAqB,CACvD,MAAMC,EACJ,OAAOF,EAAiB,CAAC,GACxBC,EAAmB,EAAI,IAAIA,CAAgB,GAAK,IACnD,OAAOJ,EAAM,kBAAkB,QAAQ,cAAeK,CAAS,CACjE,CAAA,EAEF,WAAAP,EAEC,SAAAD,CAAA,CAAA,EAEL,CAEJ,EAEMS,GAA2BC,GAA8B,CAC7D,GAAIA,EAAS,QAAU,EAAG,OAAOA,EACjC,MAAMC,EAA0B,CAAA,EAEhC,OAAAD,EAAS,QAASE,GAAY,CAC5B,GAAIA,EAAQ,OAAS,UAAW,CAC9BD,EAAO,KAAKC,CAAO,EACnB,MACF,CAEA,MAAMC,EAAOF,EAAOA,EAAO,OAAS,CAAC,EACrC,GAAIE,GAAQA,EAAK,OAAS,UAAW,CACnCF,EAAOA,EAAO,OAAS,CAAC,EAAI,CAC1B,KAAM,WACN,MAAO,GAAGE,EAAK,KAAK,GAAGD,EAAQ,KAAK,EAAA,EAEtC,MACF,CAEAD,EAAO,KAAK,CAAE,KAAM,WAAY,MAAOC,EAAQ,MAAO,CACxD,CAAC,EAEMD,CACT,EAEMG,GAA4B,CAAC5D,EAAe6D,IAAsB,CACtE,MAAMC,EAAgB,KAAK,IAAI,EAAGD,CAAS,EACrCE,EAAa,MAAM,KAAK/D,CAAK,EAEnC,MAAO,CACL,MAAO+D,EAAW,MAAM,EAAGD,CAAa,EAAE,KAAK,EAAE,EACjD,KAAMC,EAAW,MAAMD,CAAa,EAAE,KAAK,EAAE,CAAA,CAEjD,EAEME,GAAuB,CAACC,EAAiBC,IACzCD,IAASC,EACJ,GAEL,CAACD,GAAQ,CAACC,GAASD,EAAK,SAAWC,EAAM,OACpC,GAEFD,EAAK,MAAM,CAACjE,EAAOmE,IAAUnE,IAAUkE,EAAMC,CAAK,CAAC,EAGtDC,GAAwBC,GAAsB,CAClD,MAAMC,EAAYrF,EAAAA,OAA6BoF,CAAM,EAErD,OAAKL,GAAqBM,EAAU,QAASD,CAAM,IACjDC,EAAU,QAAUD,GAGfC,EAAU,OACnB,EAEMC,GAA8C,CAAC,CACnD,QAAAC,EACA,YAAAC,EAAA,OACAzB,EACA,KAAA0B,EACA,IAAAC,EACA,gBAAAC,EACA,OAAAC,EACA,YAAAC,EAAc,GACd,iBAAAC,EAAmB,GAAA,iBACnBC,EAAmB,QACnB,eAAAC,EACA,wBAAAC,EACA,UAAAC,EACA,+BAAAC,EACA,kBAAAC,EACA,iBAAAC,EACA,sBAAAC,EACA,SAAAC,EAAW,GACX,kBAAAC,EACA,eAAAC,EACA,iBAAAC,EACA,mBAAAC,EACA,wBAAAC,EACA,yBAAAC,EACA,6BAAAC,EAA+B,GAC/B,4BAAAC,EACA,gCAAAC,EACA,YAAAC,GAAc,UACd,gCAAAC,EACA,WAAAC,CAEF,IAAM,CACJ,MAAMC,EAAcnD,GAAAA,4BAA4BF,CAAM,EAChDsD,EAAkBC,EAAAA,QACtB,KAAO,CACL,QAASF,EAAY,mBACrB,WAAYA,EAAY,sBACxB,MAAOA,EAAY,gBAAA,GAErB,CAACA,CAAW,CAAA,EAERG,EAAY7B,GAAO8B,GAAAA,yBAAyBzD,CAAM,EAClD0D,EAAWhC,GAAQiC,GAAAA,wBAAwB3D,CAAM,EACjD4D,GACJnB,GAAqBY,EAAY,kBAC7BQ,GAAyBnB,GAAkBW,EAAY,eACvDS,GACJnB,GAAoBU,EAAY,iBAC5BU,GACJf,GAA+BK,EAAY,4BACvCW,GACJf,GACAI,EAAY,gCAGRY,EACJ,EAAQlC,IAFR,CAACN,GAAeA,IAAgB,QAG5ByC,GAAmB,KAAK,IAAI,EAAGpC,CAAW,EAC1CqC,GACJnC,IAAqB,QAAUR,EAAU,OACrC,CAAC4C,EAAgBC,EAAiB,EAAIC,EAAAA,SAAS,IACnDL,EAAsB,GAAKzC,CAAA,EAEvB+C,EAAoBtI,EAAAA,OAAOmI,CAAc,EACzCI,EAAoBvI,EAAAA,OAAO,EAAE,EAC7BwI,EAAuBxI,EAAAA,OAAoC,CAC/D,OAAQ,CAAA,EACR,KAAM,EACN,iBAAkB,EAAA,CACnB,EACKyI,EAAwBzI,EAAAA,OAAO,CAAC,EAChC0I,GAA+B1I,EAAAA,OAAOgI,CAAmB,EACzDW,GAA8B3I,EAAAA,OAAO+F,CAAgB,EACrD6C,GAA2B5I,EAAAA,OAAOuF,CAAO,EACzCsD,GAA6B7I,EAAAA,OAAO,EAAK,EACzC,CAAC8I,GAAuBC,EAAwB,EAAIV,EAAAA,SAAS,CAAC,EAEpEpI,EAAAA,UAAU,IAAM,CACd,MAAM+I,EAAuBN,GAA6B,QACpDO,EAA2BN,GAA4B,QACvDO,EAAwBN,GAAyB,QACjDO,EAAa,EAAQZ,EAAkB,QAE7CG,GAA6B,QAAUV,EACvCW,GAA4B,QAAU5C,EACtC6C,GAAyB,QAAUrD,GAGjCA,IAAY2D,GACZlB,IAAwBgB,KAExBH,GAA2B,QAAU,IAGvC,MAAMO,EAAsB,IAAM,CAChCb,EAAkB,QAAU,GAC5BC,EAAqB,QAAU,CAC7B,OAAQ,CAAA,EACR,KAAM,EACN,iBAAkB,EAAA,EAEpBC,EAAsB,QAAU,CAClC,EAEMY,EAAwBC,GAAwB,CACpDhB,EAAkB,QAAUgB,EAC5BlB,GAAkBkB,CAAW,CAC/B,EAEA,GAAI,CAACtB,EAAqB,CACxBoB,EAAA,EACAC,EAAqB9D,CAAO,EAC5B,MACF,CAEKyD,IACHI,EAAA,EACAC,EAAqB,EAAE,GAGzB,MAAME,EAAkBP,EAEpBV,EAAkB,QADlB,GAGJ,GAAI,CAAC/C,EAAQ,WAAWgE,CAAc,EAAG,CACvCH,EAAA,EACAC,EAAqB9D,CAAO,EACxBQ,IAAqB,kBACvByC,EAAqB,QAAU,CAC7B,OAAQ,CAAA,EACR,KAAM,EACN,iBAAkBgB,EAAAA,8BAA8BjE,CAAO,CAAA,GAG3D,MACF,CAEA,IAAIkE,EAAqBlE,EAAQ,MAAMgE,EAAe,MAAM,EAC5D,GAAI,CAACE,EAAoB,CACvBlB,EAAkB,QAAU,GAC5BE,EAAsB,QAAU,EAChCD,EAAqB,QACnBzC,IAAqB,gBACjB,CACE,OAAQ,CAAA,EACR,KAAM,EACN,iBAAkByD,EAAAA,8BAA8BD,CAAc,CAAA,EAEhE,CAAE,OAAQ,CAAA,EAAI,KAAM,EAAG,iBAAkB,EAAA,EAC/C,MACF,CAEA,GAAIxD,IAAqB,gBAAiB,CACxC,MAAM2D,EAAyBR,EAAsB,MACnDK,EAAe,MAAA,EAQjB,GALEP,GACAC,IAA6B,iBAC7B1D,EAAQ,WAAW2D,CAAqB,GACxCX,EAAkB,UAAYmB,EAEJ,CAC1B,MAAMC,EAAWC,EAAAA,kCACfpB,EAAqB,QACrBjD,EAAQ,MAAM2D,EAAsB,MAAM,CAAA,EAE5CV,EAAqB,QAAUmB,EAAS,MAEpCA,EAAS,iBACXF,EAAqBA,EAAmB,MACtCE,EAAS,eAAe,MAAA,EAE1BN,EAAqB,GAAGE,CAAc,GAAGI,EAAS,cAAc,EAAE,EAEtE,KAAO,CACL,MAAMA,EAAWC,EAAAA,kCACf,CACE,OAAQ,CAAA,EACR,KAAM,EACN,iBAAkBJ,EAAAA,8BAA8BD,CAAc,CAAA,EAEhEE,CAAA,EAEFjB,EAAqB,QAAUmB,EAAS,MAEpCA,EAAS,iBACXF,EAAqBA,EAAmB,MACtCE,EAAS,eAAe,MAAA,EAE1BN,EAAqB,GAAGE,CAAc,GAAGI,EAAS,cAAc,EAAE,GAGpElB,EAAsB,QAAU,CAClC,CACF,MACED,EAAqB,QAAU,CAC7B,OAAQ,CAAA,EACR,KAAM,EACN,iBAAkB,EAAA,EAEpBC,EAAsB,QAAU,EAGlCF,EAAkB,QAAUkB,EAExB,CAACN,GAAcM,GACjBV,GAA0Bc,GAAYA,EAAU,CAAC,CAErD,EAAG,CAACtE,EAASyC,EAAqBjC,CAAgB,CAAC,EAEnD9F,EAAAA,UAAU,IAAM,CACT+H,IAKHa,GAA2B,SAC3BN,EAAkB,SAClBJ,IAAmB5C,IAKrBsD,GAA2B,QAAU,GACrC7C,IAAA,GACF,EAAG,CAACT,EAAS4C,EAAgBH,EAAqBhC,CAAc,CAAC,EAEjE/F,EAAAA,UAAU,IAAM,CACd,GAAI,CAAC+H,GAAuB,CAACO,EAAkB,QAC7C,OAGF,MAAMuB,EAAkB,OAAO,WAAW,IAAM,CAC9C,GAAI,CAACvB,EAAkB,QACrB,OAGF,IAAIwB,EAAQ,GAEZ,GAAIhE,IAAqB,gBAAiB,CACxC,MAAMiE,EAASC,EAAAA,mCACbzB,EAAqB,QACrBC,EAAsB,QAAUyB,EAAAA,oCAAA,EAGlCH,EAAQC,EAAO,MACfxB,EAAqB,QAAUwB,EAAO,MAElCG,EAAAA,mCAAmCH,EAAO,KAAK,EACjDvB,EAAsB,QAAU,EAEhCA,EAAsB,QAAUuB,EAAO,eAE3C,MAKED,EAJmBpF,GACjB4D,EAAkB,QAClB3I,EAAA,EAEiB,MAGrB,GAAI,CAACmK,EACH,OAGFxB,EAAkB,QAAUA,EAAkB,QAAQ,MAAMwB,EAAM,MAAM,EACnExB,EAAkB,UACrBC,EAAqB,QACnBzC,IAAqB,gBACjB,CACE,OAAQ,CAAA,EACR,KAAM,EACN,iBAAkByC,EAAqB,QAAQ,gBAAA,EAEjD,CAAE,OAAQ,CAAA,EAAI,KAAM,EAAG,iBAAkB,EAAA,EAC/CC,EAAsB,QAAU,GAGlC,MAAM2B,EAAqB,GAAG9B,EAAkB,OAAO,GAAGyB,CAAK,GAC/DzB,EAAkB,QAAU8B,EAC5BhC,GAAkBgC,CAAkB,CACtC,EAAGnC,EAAgB,EAEnB,MAAO,IAAM,OAAO,aAAa6B,CAAe,CAClD,EAAG,CACD3B,EACAD,GACAF,EACAjC,EACAkC,GACAa,EAAA,CACD,EAED,MAAMuB,GAAkB/C,EAAAA,QACtB,KAAO,CACL,oBAAAU,EACA,SAAUA,GAAuBG,IAAmB5C,EACpD,WAAY4C,IAAmB5C,EAC/B,eAAgB4C,EAAe,OAC/B,YAAa5C,EAAQ,MAAA,GAEvB,CAACA,EAAS4C,EAAgBH,CAAmB,CAAA,EAG/C/H,EAAAA,UAAU,IAAM,CACdgG,IAA0BoE,EAAe,CAC3C,EAAG,CAACpE,EAAyBoE,EAAe,CAAC,EAE7C,MAAMC,EAAgBtC,EAAsBG,EAAiB5C,EACvDgF,GAAoBjD,EAAAA,QACxB,IAAMkD,GAAAA,oBAAoBF,CAAa,EACvC,CAACA,CAAa,CAAA,EAGVG,GAAsBnD,EAAAA,QAC1B,IACEoD,GAAAA,4BACEJ,EACApE,EACAC,CAAA,EAEJ,CAACA,EAAgCmE,EAAepE,CAAS,CAAA,EAGrDyE,GACJvE,GAAmB,KAAA,GAAUqE,GAAoB,WAC7CG,GACJvE,GAAkB,KAAA,GAAUoE,GAAoB,UAC5CI,GAAyBvD,EAAAA,QAC7B,IACEpB,EACIA,EACG,MAAM,GAAG,EACT,IAAKnF,GAAUA,EAAM,KAAA,CAAM,EAC3B,OAAO,OAAO,EACjB,OACN,CAACmF,CAAS,CAAA,EAEN4E,GAAgCxE,GAAuB,OACzDA,EACAmE,GAAoB,gBAAkBI,GACpCE,GAA8B5F,GAClC2F,EAAA,EAEIE,EAA4BhL,EAAAA,OAAuC,CACvE,UAAAuH,EACA,SAAAE,EACA,gBAAAJ,EACA,WAAAF,EAAA,OACApD,EACA,gCAAAmD,EACA,OAAAtB,EACA,SAAAW,EACA,cAAA+D,EACA,0BAAA3C,GACA,yBAAAE,GACA,uBAAAD,GACA,0BAAA+C,GACA,yBAAAC,GACA,8BAA+BG,EAAA,CAChC,EAEDC,EAA0B,QAAU,CAClC,UAAAzD,EACA,SAAAE,EACA,gBAAAJ,EACA,WAAAF,EAAA,OACApD,EACA,gCAAAmD,EACA,OAAAtB,EACA,SAAAW,EACA,cAAA+D,EACA,0BAAA3C,GACA,yBAAAE,GACA,uBAAAD,GACA,0BAAA+C,GACA,yBAAAC,GACA,8BAA+BG,EAAA,EAGjC,MAAMjH,GAAawD,EAAAA,QACjB,KAAO,CACL,8BAA+B,CAAC,CAC9B,SAAA9E,CAAA,IAKET,EAAAA,IAAC,SAAA,CACC,UAAU,6CACV,QACEiJ,EAA0B,QAAQ,gCAGpC,SAAAjJ,EAAAA,IAAC,OAAA,CAAK,UAAU,mDACb,SAAAS,CAAA,CACH,CAAA,CAAA,EAIN,kBAAoBL,GAClBJ,EAAAA,IAACkJ,GAAAA,QAAA,CACE,GAAG9I,EACJ,SAAU6I,EAA0B,QAAQ,SAC5C,kBACEA,EAA0B,QAAQ,0BAEpC,iBACEA,EAA0B,QAAQ,yBAEpC,sBACEA,EAA0B,QAAQ,8BAEpC,OAAQA,EAA0B,QAAQ,OAC1C,WAAYA,EAA0B,QAAQ,WAC9C,OAAQA,EAA0B,QAAQ,OAC1C,IAAKA,EAA0B,QAAQ,UACvC,KAAMA,EAA0B,QAAQ,SACxC,kBACEA,EAA0B,QAAQ,yBAAA,CAAA,EAKxC,KAAM9I,GACN,MAAO,CAAC,CAAE,GAAGC,CAAA,IACXJ,EAAAA,IAAC,MAAA,CAAI,UAAU,iCACb,eAAC,QAAA,CAAM,UAAU,uBAAwB,GAAGI,EAAO,EACrD,EAEF,GAAI,CAAC,CAAE,GAAGA,CAAA,IAAYJ,EAAAA,IAAC,KAAA,CAAG,UAAU,oBAAqB,GAAGI,EAAO,EACnE,GAAI,CAAC,CAAE,GAAGA,CAAA,IAAYJ,EAAAA,IAAC,KAAA,CAAG,UAAU,oBAAqB,GAAGI,EAAO,EACnE,GAAI,CAAC,CAAE,GAAGA,CAAA,IAAYJ,EAAAA,IAAC,KAAA,CAAG,UAAU,oBAAqB,GAAGI,EAAO,EACnE,GAAI,CAAC,CAAE,KAAA7B,EAAM,GAAG6B,KAAY,CAC1B,MAAMI,EAAYjC,GAAM,YAAY,UAKpC,OAHG,OAAOiC,GAAc,UACpBA,EAAU,SAAS,gBAAgB,GACpC,MAAM,QAAQA,CAAS,GAAKA,EAAU,SAAS,gBAAgB,EAEzDR,EAAAA,IAAC,KAAA,CAAG,UAAU,gCAAiC,GAAGI,EAAO,EAE3DJ,MAAC,KAAA,CAAI,GAAGI,CAAA,CAAO,CACxB,EACA,GAAI,CAAC,CAAE,GAAGA,CAAA,IAAYJ,EAAAA,IAAC,KAAA,CAAG,UAAU,oBAAqB,GAAGI,EAAO,EACnE,GAAI,CAAC,CAAE,GAAGA,CAAA,IAAYJ,EAAAA,IAAC,KAAA,CAAG,UAAU,oBAAqB,GAAGI,EAAO,EACnE,MAAO,CAAC,CAAE,GAAGA,KACPA,EAAM,OAAS,WAEfJ,EAAAA,IAAC,QAAA,CACC,KAAK,WACL,UAAU,0BACV,SAAQ,GACP,GAAGI,CAAA,CAAA,EAIHJ,MAAC,QAAA,CAAO,GAAGI,CAAA,CAAO,EAE3B,EAAG,CAAC,CAAE,SAAAK,EAAU,GAAGL,CAAA,IACjBJ,EAAAA,IAAC,IAAA,CAAE,OAAO,SAAS,IAAI,sBAAuB,GAAGI,EAC9C,SAAAK,CAAA,CACH,EAEF,IAAML,GACJJ,EAAAA,IAACmJ,GAAAA,QAAA,CACE,GAAG/I,EACJ,eACE6I,EAA0B,QAAQ,uBAEpC,iBACEA,EAA0B,QAAQ,wBAAA,CAAA,CAEtC,GAGJ,CAAA,CAAC,EAGGG,GAA0B7D,EAAAA,QAC9B,IAAM3H,GAAyB,KAAK2K,CAAa,EACjD,CAACA,CAAa,CAAA,EAGVc,GAAiB9D,EAAAA,QACrB,IACE6D,GAA0BE,GAAAA,qBAAqBf,EAAe,EAAI,EAAI,CAAA,EACxE,CAACA,EAAea,EAAuB,CAAA,EAGnCG,GAAaF,GAAe,KAC/B3G,GAAYA,EAAQ,OAAS,SAAA,EAE1B8G,GAAuBjE,EAAAA,QAC3B,IAAMhD,GAAwB8G,EAAc,EAC5C,CAACA,EAAc,CAAA,EAGX7G,GAAW+C,EAAAA,QACf,IAAMkE,GAAAA,sBAAsBjB,EAAiB,EAC7C,CAACA,EAAiB,CAAA,EAGdkB,GAAyB,CAACC,EAAaC,IAAsB,CACjE,MAAMtK,EAAamJ,GAAAA,oBAAoBkB,CAAG,EAG1C,OAFeF,GAAAA,sBAAsBnK,CAAU,EAEjC,IAAI,CAACuK,EAAK1G,IAAU,CAChC,MAAM2G,EAAM,GAAGF,CAAS,IAAIC,EAAI,IAAI,IAAI1G,CAAK,GAE7C,OAAI0G,EAAI,OAAS,OAEb7J,EAAAA,IAACC,GAAgC,SAAhC,CAEC,MAAOgJ,EAEP,SAAAjJ,EAAAA,IAAC6B,GAAA,CAAA,OACCG,EACA,WAAAD,GACA,QAAS8H,EAAI,KAAA,CAAA,CACf,EAPKC,CAAA,EAYPD,EAAI,OAAS,UAEb7J,EAAAA,IAACc,GAAAA,QAAA,CAEC,MAAO+I,EAAI,MACX,OAAQ,CAACA,EAAI,SACb,SAAUvE,CAAA,EAHLwE,CAAA,EAQPD,EAAI,OAAS,MACR7J,EAAAA,IAAClC,GAAA,CAA2B,IAAK+L,EAAI,OAAdC,CAAqB,EAG9C,IACT,CAAC,CACH,EAEA,OAAIP,GAEAvJ,EAAAA,IAAC,MAAA,CACC,UAAU,+BACV,IAAKwF,EACL,KAAME,EAEL,SAAA8D,GAAqB,IAAI,CAAC9G,EAASqH,IAClCrH,EAAQ,OAAS,UACf1C,EAAAA,IAACgK,GAAAA,QAAA,CAEC,eAAc,GACd,KAAK,UACL,QAAStH,EAAQ,MACjB,UAAU,wBAAA,OACVV,EACA,IAAKwD,EACL,KAAME,EACN,YAAad,EACb,iBAAkBC,EAClB,kBAAmBC,EACnB,sBAAuBC,EACvB,qBAAsBgB,GACtB,yBAA0BC,GAC1B,KAAMd,EAAA,EAdD,WAAW6E,CAAG,EAAA,EAiBrB/J,EAAAA,IAACE,EAAM,SAAN,CACE,SAAAwJ,GAAuBhH,EAAQ,MAAO,MAAMqH,CAAG,EAAE,CAAA,EAD/B,MAAMA,CAAG,EAE9B,CAAA,CAEJ,CAAA,EAMJE,EAAAA,KAAC,MAAA,CACC,UAAU,+BACV,IAAKzE,EACL,KAAME,EAEL,SAAA,CAAAlD,GAAS,IAAI,CAACqH,EAAK1G,IAAU,CAC5B,GAAI0G,EAAI,OAAS,OACf,OACE7J,EAAAA,IAACC,GAAgC,SAAhC,CAEC,MAAOgJ,EAEP,SAAAjJ,EAAAA,IAAC6B,GAAA,CAAA,OACCG,EACA,WAAAD,GACA,QAAS8H,EAAI,KAAA,CAAA,CACf,EAPK1G,CAAA,EAYX,GAAI0G,EAAI,OAAS,UACf,OACE7J,EAAAA,IAACc,GAAAA,QAAA,CAEC,MAAO+I,EAAI,MACX,OAAQ,CAACA,EAAI,SACb,SAAUvE,CAAA,EAHLnC,CAAA,EAQX,GAAI0G,EAAI,OAAS,MACf,OAAO7J,EAAAA,IAAClC,GAAA,CAA6B,IAAK+L,EAAI,OAAhB1G,CAAuB,CAEzD,CAAC,EAEAS,GACC5D,EAAAA,IAAC,MAAA,CAAI,UAAU,4BACZ,SAAAE,EAAM,cAAc0D,EAAiB,CACpC,QAAAJ,EACA,eAAgBgF,GAChB,OAAA3E,CAAA,CACD,CAAA,CACH,CAAA,CAAA,CAAA,CAIR"}
|
|
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 = 30,\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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"}
|
|
@@ -165,7 +165,7 @@ const ft = /<(script|style|link|iframe|html|head|body|meta|title|base|template|d
|
|
|
165
165
|
dir: k,
|
|
166
166
|
customRenderBar: u,
|
|
167
167
|
onSend: A,
|
|
168
|
-
typingSpeed: G =
|
|
168
|
+
typingSpeed: G = 30,
|
|
169
169
|
enableTypewriter: D = !1,
|
|
170
170
|
typewriterPacing: d = "fixed",
|
|
171
171
|
onTypeFinished: F,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ContentRender.es.js","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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"}
|
|
1
|
+
{"version":3,"file":"ContentRender.es.js","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 = 30,\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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"}
|