markdown-flow-ui 0.1.112-beta.0 → 0.1.112-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={};exports.__exports=e;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={exports:{}};exports.__module=e;
2
2
  //# sourceMappingURL=index.cjs10.js.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={exports:{}};exports.__module=e;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});var e={};exports.__exports=e;
2
2
  //# sourceMappingURL=index.cjs9.js.map
@@ -1,5 +1,5 @@
1
- var r = {};
1
+ var s = { exports: {} };
2
2
  export {
3
- r as __exports
3
+ s as __module
4
4
  };
5
5
  //# sourceMappingURL=index.es10.js.map
@@ -1,5 +1,5 @@
1
- var s = { exports: {} };
1
+ var r = {};
2
2
  export {
3
- s as __module
3
+ r as __exports
4
4
  };
5
5
  //# sourceMappingURL=index.es9.js.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const r=require("../../_virtual/jsx-runtime.cjs.js"),e=require("react"),gn=require("../../lib/sandboxInteraction.cjs.js"),Y=require("../../lib/utils.cjs.js"),Rn=require("../ui/loading-overlay-card.cjs.js"),An=require("../ContentRender/ContentRender.cjs.js"),kt=require("../ContentRender/IframeSandbox.cjs.js");require("../ui/inputGroup/input-group.cjs.js");const jt=require("../../lib/interaction-defaults.cjs.js"),Ie=require("../../lib/mobileDevice.cjs.js"),In=require("./Player.cjs.js"),_n=require("./SubtitleOverlay.cjs.js"),ze=require("./constants.cjs.js"),wn=require("./SlideFullscreenHint.cjs.js"),Cn=require("./useSlide.cjs.js"),Tn=require("./useWakePlayerFromIframe.cjs.js"),ce=require("./utils/mobileScreenMode.cjs.js"),Mn=require("./utils/interactionPlayback.cjs.js"),kn=require("./utils/appendedMarkerAdvance.cjs.js"),jn=require("./utils/playbackSequence.cjs.js"),Pt=require("./utils/playerCustomActions.cjs.js"),Pn=require("./utils/playbackTimeStore.cjs.js"),On=require("./utils/playerToggleMode.cjs.js");;/* empty css */const Fn=require("../../markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/chevron-left.cjs.js"),qn=2e3,Bn=300,Nn=160,Ln=16,Ot=e.memo(({content:s,title:o,defaultButtonText:C,defaultInputText:T,defaultSelectedValues:O,confirmButtonText:F,copyButtonText:N,copiedButtonText:X,onSend:_e,readonly:we=!1})=>r.jsxRuntimeExports.jsxs("div",{className:"slide-player__interaction-card",children:[r.jsxRuntimeExports.jsx("div",{className:"slide-player__interaction-header",children:r.jsxRuntimeExports.jsx("p",{className:"slide-player__interaction-title",children:o})}),r.jsxRuntimeExports.jsx("div",{className:"slide-player__interaction-body",children:r.jsxRuntimeExports.jsx(An.default,{content:s,defaultButtonText:C,defaultInputText:T,defaultSelectedValues:O,confirmButtonText:F,copyButtonText:N,copiedButtonText:X,onSend:_e,readonly:we,enableTypewriter:!1,sandboxMode:"content"})})]}));Ot.displayName="InteractionOverlayCard";const Vn=(s,o)=>s.length===o.length&&s.every((C,T)=>{const O=o[T];return C.sequence_number===O?.sequence_number&&C.type===O?.type&&C.content===O?.content}),Kn=s=>typeof s=="string"?`string:${s.length}:${s.slice(-32)}`:typeof s=="number"||typeof s=="boolean"?`primitive:${String(s)}`:e.isValidElement(s)?`element:${String(s.key??"")}`:Array.isArray(s)?`array:${s.length}`:s==null?"null":`object:${typeof s}`,Dn=s=>(s??[]).map(o=>[String(o.segment_index??"none"),o.is_final?"1":"0",String(o.duration_ms??0),String(o.audio_url??""),String(o.audio_data?.length??0)].join(":")).join(","),Un=s=>s.map((o,C)=>[String(o.sequence_number??C),String(o.type),Kn(o.content),String(o.audio_url??""),Dn(o.audio_segments),o.is_renderable===!1?"hidden":"visible",o.is_new?"new":"stable",o.is_speakable?"speakable":"silent",String(o.user_input??""),o.readonly?"readonly":"editable"].join("|")).join("||"),Hn=({elementList:s=[],isStreaming:o=!1,showPlayer:C=!0,playerAlwaysVisible:T=!1,playerClassName:O,fullscreenHeader:F,playerCustomActions:N,playerCustomActionPauseOnActive:X=!0,bufferingText:_e="Buffering...",interactionTitle:we,interactionTexts:de,playerTexts:Ge,playerAutoHideDelay:Ce=3e3,markerAutoAdvanceDelay:Ye=qn,streamInactivityTimeoutMs:Te=ze.DEFAULT_STREAM_INACTIVITY_TIMEOUT_MS,interactionDefaultValueOptions:fe,onSend:Xe,onPlayerVisibilityChange:Me,onMobileViewModeChange:Je,onError:Qe,onStepChange:Ze,enableIframeScaling:Ft=!0,className:qt,onPointerDown:et,...Bt})=>{const me=e.useRef(null),tt=e.useRef(null),ke=e.useRef(null),nt=e.useRef(null),J=e.useRef(null),Q=e.useRef(null),Z=e.useRef(null),ee=e.useRef(null),te=e.useRef(null),rt=e.useRef(null),st=e.useRef([]),je=e.useRef(null),pe=e.useRef(!1),Pe=e.useRef(!1),ne=e.useRef(!1),L=e.useRef(null),ot=e.useRef(null),lt=e.useRef({markerCount:0,currentIndex:-1,canGoNext:!1}),{currentElementList:M,stepElementLists:ut,slideElementList:k,currentIndex:d,audioList:m,currentAudioSequenceIndexes:he,currentStepHasSpeakableElement:x,currentInteractionElement:c,canGoPrev:Nt,canGoNext:v,handlePrev:it,handleNext:g}=Cn.default(s),re=e.useMemo(()=>{if(!(d<0))return k[d]},[d,k]),Lt=k.filter(t=>t.is_renderable!==!1).length===1,y=C&&(k.length>0||m.length>0||!!c),R=e.useMemo(()=>he.map(t=>m[t]?.audioKey).filter(t=>!!t),[m,he]),[at,xe]=e.useState(!0),[Se,se]=e.useState(!1),[oe,ct]=e.useState(!0),[p,V]=e.useState(null),[Vt,S]=e.useState(!1),[K,Oe]=e.useState(!1),[A,dt]=e.useState(!1),[Kt,Fe]=e.useState(!1),[ft,Dt]=e.useState(!0),[qe,Be]=e.useState(!1),[l,Ne]=e.useState(),[be,ve]=e.useState(!1),[Ut,le]=e.useState(0),[Ht,$t]=e.useState(!1),I=e.useMemo(()=>Ie.isMobileDevice(),[]),[ye,Le]=e.useState(ce.DEFAULT_MOBILE_VIEW_MODE),[mt,Ve]=e.useState(!1),[Ke,pt]=e.useState(()=>I?Ie.isLandscapeViewport():!1),[Wt,Ee]=e.useState(!1),D=e.useMemo(()=>Pn.createPlaybackTimeStore(),[]),{effectiveMobileViewMode:P,isImmersiveMobileFullscreen:U,isNativeMobileFullscreen:ht,shouldRotateFullscreenViewport:zt}=e.useMemo(()=>ce.resolveMobileViewModeState({hasManualMobileViewMode:mt,isMobileDevice:I,mobileViewMode:ye}),[mt,I,Ke,ye]),xt=e.useRef(P),_=y&&(T||at),Gt=U&&_,Yt=U&&_,Xt=U||ht,Jt=Ge?.fullscreenHintText??ze.DEFAULT_SLIDE_PLAYER_TEXTS.fullscreenHintText,De=e.useMemo(()=>Un(s),[s]),Qt=e.useCallback(t=>{Ve(!0),Le(t)},[]),St=e.useCallback(()=>{Ve(!1),Le(ce.DEFAULT_MOBILE_VIEW_MODE)},[]),Zt=e.useCallback(()=>{St(),F?.onBack?.()},[F,St]),en=e.useCallback(()=>{Ee(!1)},[]),bt=e.useCallback(t=>{Be(t)},[]),vt=e.useCallback(()=>{Be(t=>!t)},[]),{mountedStepStates:tn,currentMountedStateIndex:nn}=e.useMemo(()=>{const t=[],n=new Map;return ut.forEach((u,f)=>{const i=t.findIndex(a=>Vn(a.elementList,u));if(i>=0){t[i]?.sourceStepIndexes.push(f),n.set(f,i);return}t.push({elementList:u,sourceStepIndexes:[f]}),n.set(f,t.length-1)}),{mountedStepStates:t,currentMountedStateIndex:d>=0?n.get(d)??-1:-1}},[d,ut]),yt=e.useMemo(()=>String(d),[d]),h=e.useMemo(()=>p?m.findIndex(t=>(t.audioKey??"")===p):-1,[m,p]),Ue=e.useMemo(()=>h>=0?m[h]:void 0,[m,h]),rn=Ue?.element?.subtitle_cues??[],ge=e.useMemo(()=>R[0]??"none",[R]),He=e.useMemo(()=>({currentElement:Pt.resolvePlayerCustomActionElement({currentAudioIndex:h,currentAudioSequenceIndexes:he,audioList:m,currentInteractionElement:l,currentStepElement:re}),currentIndex:d,currentStepElement:re,isActive:qe,setActive:bt,toggleActive:vt}),[l,m,h,he,d,re,qe,bt,vt]),$e=e.useMemo(()=>Pt.getPlayerCustomActionCount(N,He),[He,N]),sn=e.useMemo(()=>({"--slide-player-custom-action-count":String($e),"--slide-player-mobile-control-count":String($e+4)}),[$e]),Et=R.length>0,gt=e.useMemo(()=>c?`${c.sequence_number??"none"}:${String(c.content??"")}`:"none",[c]),ue=e.useMemo(()=>[yt,gt].join("|"),[gt,yt]),on=e.useMemo(()=>[ue,Ue?.audioKey??"none",String(h)].join("|"),[h,Ue?.audioKey,ue]),Rt=!!e.useMemo(()=>!ge||ge==="none"?"":m.find(n=>n.audioKey===ge)?.audioUrl?.trim()??"",[m,ge]),q=X&&!!N&&qe,ie=e.useMemo(()=>On.shouldUseAutoAdvanceToggle({canGoNext:v,currentAudioIndex:h,currentStepHasSpeakableElement:x,hasInteraction:!!c}),[v,h,c,x]),B=e.useCallback(()=>{J.current!==null&&(window.clearTimeout(J.current),J.current=null)},[]),j=e.useCallback(()=>{Z.current!==null&&(window.clearTimeout(Z.current),Z.current=null)},[]),w=e.useCallback(()=>{ee.current!==null&&(window.clearTimeout(ee.current),ee.current=null)},[]),H=e.useCallback(()=>{Q.current!==null&&(window.clearTimeout(Q.current),Q.current=null)},[]),$=e.useCallback(()=>{te.current!==null&&(window.clearTimeout(te.current),te.current=null)},[]),W=e.useCallback(()=>{H(),j(),w(),V(null),D.reset(),S(!1),dt(!1),Fe(!1),Ne(void 0),ve(!1),le(0)},[H,j,w,D]),z=e.useCallback(()=>{const t=R[0];return t?(V(t),!0):!1},[R]),Re=e.useCallback(()=>{j(),w(),ve(!1),le(0),!z()&&v&&g()},[v,j,w,g,z]),At=e.useCallback(t=>{if(w(),!t)return;const n=()=>{ee.current=null,le(Nn),ve(!0),L.current=null};ee.current=window.setTimeout(n,Bn)},[w]),b=e.useCallback((t=Se)=>{y&&(xe(!0),B(),!(T||!t||Ce<=0)&&(J.current=window.setTimeout(()=>{xe(!1),J.current=null},Ce)))},[B,Se,T,Ce,y]),ae=!!(c?.readonly||c?.user_input?.trim()),G=!!c&&!ae;e.useEffect(()=>{ct(!0),X&&Be(!1)},[d,X]),e.useEffect(()=>()=>{H(),B(),j(),w(),$()},[H,j,w,B,$]),e.useEffect(()=>{if(!o||Te<=0){$(),je.current=null,Pe.current=!1,ne.current=!1,Oe(!1);return}const t=!Pe.current,n=je.current!==De;return Pe.current=!0,(t||n)&&(je.current=De,ne.current&&(ne.current=!1,Oe(!1))),$(),te.current=window.setTimeout(()=>{te.current=null,!ne.current&&(ne.current=!0,Oe(!0),S(!1),Qe?.({code:ze.SLIDE_ERROR_CODES.STREAM_INACTIVITY_TIMEOUT}))},Te),()=>{$()}},[$,o,Qe,De,Te]),e.useEffect(()=>(Me?.(_),()=>{Me?.(!1)}),[Me,_]),e.useEffect(()=>{I||ye===ce.DEFAULT_MOBILE_VIEW_MODE||(Ve(!1),Le(ce.DEFAULT_MOBILE_VIEW_MODE))},[I,ye]),e.useEffect(()=>{if(!I){pt(!1);return}const t=()=>{pt(Ie.isLandscapeViewport())};return t(),Ie.subscribeMobileDeviceChange(t)},[I]),e.useEffect(()=>{Je?.(P)},[P,Je]),e.useEffect(()=>{const u=xt.current!=="fullscreen"&&P==="fullscreen"&&!Ke;if(xt.current=P,!I){Ee(!1);return}if(u){Ee(!0);return}P!=="fullscreen"&&Ee(!1)},[P,I,Ke]),e.useEffect(()=>{Ze?.(re,d)},[d,re,Ze]),e.useEffect(()=>{const t=lt.current,n=kn.shouldAutoAdvanceIntoAppendedMarker({previousMarkerCount:t.markerCount,nextMarkerCount:k.length,previousIndex:t.currentIndex,previousCanGoNext:t.canGoNext,nextCanGoNext:v,currentAudioKey:p,hasCompletedCurrentStepAudio:A,hasResolvedCurrentInteraction:ae,currentStepHasSpeakableElement:x,currentInteractionElement:c,isAutoAdvanceEnabled:oe,shouldUseSilentStepAutoAdvanceToggle:ie});lt.current={markerCount:k.length,currentIndex:d,canGoNext:v},n&&g()},[v,p,d,c,x,g,A,ae,oe,ie,k.length]),e.useEffect(()=>{if(!y){B(),xe(!1);return}if(T){B(),xe(!0);return}Se||b(!0)},[B,Se,T,y,b]),e.useEffect(()=>{if(typeof window>"u")return;const t=n=>{n.origin===window.location.origin&&gn.isSandboxInteractionMessage(n.data)&&n.data.eventType==="click"&&y&&(se(!0),b(!0))};return window.addEventListener("message",t),()=>{window.removeEventListener("message",t)}},[y,b]),Tn.default({sectionRef:me,enabled:y,onWake:()=>{se(!0),b(!0)}}),e.useEffect(()=>{const{hasPlaybackContextChanged:t,shouldInitializeAudioSequence:n}=jn.getPlaybackSequenceTransition({previousResetKey:ot.current,nextResetKey:ue,currentAudioKey:p,hasCompletedCurrentStepAudio:A});ot.current=ue;const u=L.current===d&&!!c,f=Mn.shouldPresentInteractionOverlay({hasInteraction:!!c,shouldBlockPlaybackForInteraction:G,shouldOpenInteractionOverlayAfterAudio:u,hasPlaybackContextChanged:t,hasResolvedCurrentInteraction:ae,currentStepHasSpeakableElement:x});if(t&&W(),!(M.length===0&&!c)&&!q){if(c&&Ne(c),f){At(c);return}if(w(),L.current=null,!!n&&!z()){if(x){if(K){S(!1);return}S(!0);return}if(v&&!(ie&&!oe))return Q.current=window.setTimeout(()=>{Q.current=null,g()},Ye),()=>{H()}}}},[v,H,M.length,c,p,ue,x,Ye,g,A,K,oe,ae,G,w,W,At,z,q,ie]),e.useEffect(()=>{if(K||q||!x||G){S(!1);return}if(A){S(!1);return}if(Et){S(!1);return}S(!0)},[K,Et,x,A,q,G]),e.useEffect(()=>{p||R.length===0||q||!x||G||A||z()},[p,R,x,A,q,G,z]),e.useEffect(()=>{!p||h>=0||V(null)},[h,p]),e.useEffect(()=>{h>=0||D.reset()},[h,D]),e.useEffect(()=>{Fe(!1)},[on]);const It=e.useMemo(()=>{if(!l)return{};const t=!!l.user_input?.trim();return jt.getInteractionDefaultValues(typeof l.content=="string"?l.content:void 0,l.user_input,t?void 0:fe)},[l,fe]),ln=e.useMemo(()=>{if(!l)return;const t=!!l.user_input?.trim();return jt.getInteractionDefaultSelectedValues(typeof l.content=="string"?l.content:void 0,l.user_input,t?void 0:fe)},[l,fe]),_t=!!l?.user_input?.trim(),wt=!!l?.readonly||_t,Ct=wt||_t,We=!!l&&be,un=e.useCallback(t=>{const u=[...t.selectedValues??[],t.inputText?.trim()??"",t.buttonText?.trim()??""].filter(Boolean).join(", ");Ne(f=>!f||!u?f:{...f,user_input:u}),Xe?.(t,l),Re()},[l,Re,Xe]);e.useEffect(()=>{const t=()=>{$t(document.fullscreenElement===me.current)};return t(),document.addEventListener("fullscreenchange",t),()=>{document.removeEventListener("fullscreenchange",t)}},[]),e.useEffect(()=>{if(!We){le(0);return}const t=rt.current;if(!t)return;const n=()=>{const f=Math.ceil(t.getBoundingClientRect().height);le(f+Ln)};if(n(),typeof ResizeObserver>"u")return;const u=new ResizeObserver(()=>{n()});return u.observe(t),()=>{u.disconnect()}},[We]),e.useEffect(()=>{if(j(),!(!be||!Ct))return Z.current=window.setTimeout(()=>{Z.current=null,Re()},2e3),()=>{j()}},[j,Re,be,Ct]);const an=(t,n={})=>t?t.type==="slot"?r.jsxRuntimeExports.jsx(r.jsxRuntimeExports.Fragment,{children:t.content}):t.type==="html"?r.jsxRuntimeExports.jsx(kt.default,{className:"content-render-iframe",hideFullScreen:!0,mode:"blackboard",replaceRootScreenHeightWithFull:n.replaceRootScreenHeightWithFull,type:"sandbox",content:t.content,enableScaling:Ft}):r.jsxRuntimeExports.jsx(kt.default,{className:"content-render-iframe",hideFullScreen:!0,mode:"blackboard",type:"markdown",content:t.content}):null,cn=(t=[],n=!1)=>{if(t.length===0)return null;const u=t.filter(i=>i.is_renderable!==!1).length,f=t.reduce((i,a,E)=>a.is_renderable!==!1?E:i,-1);return r.jsxRuntimeExports.jsx("div",{className:"slide-stage__content flex w-full flex-col gap-4",children:t.map((i,a)=>{const E=i.type==="html"&&i.is_renderable===!1;return r.jsxRuntimeExports.jsx("div",{ref:n&&a===f?nt:null,"aria-hidden":E||void 0,className:Y.cn("w-full shrink-0",u===1&&i.is_renderable!==!1&&"slide-element--single",E?"pointer-events-none fixed left-[-200vw] top-0 -z-10 h-[100dvh] w-[100vw] overflow-hidden opacity-0":i.is_renderable===!1&&"hidden"),children:an(i,{replaceRootScreenHeightWithFull:u===1&&i.type==="html"&&i.is_renderable!==!1})},i.sequence_number??`${i.type}-${a}`)})})},dn=e.useCallback(()=>{const t=me.current;if(t){if(document.fullscreenElement===t){document.exitFullscreen().catch(()=>{});return}t.requestFullscreen?.().catch(()=>{})}},[]),Tt=e.useCallback(()=>{const t=ke.current;t&&t.scrollTo({top:t.scrollHeight,behavior:"smooth"})},[]),fn=e.useCallback(()=>{pe.current=!0,L.current=null,se(!0),S(!1),b(!0),W(),it()},[it,W,b]),mn=e.useCallback(()=>{pe.current=!0,L.current=null,se(!0),S(!1),b(!0),W(),g()},[g,W,b]),pn=e.useCallback(t=>{if(K||!x||A){S(!1);return}S(t)},[x,A,K]),hn=e.useCallback(t=>{const n=m[t]?.audioKey;if(!n||!p||n!==p)return;const u=R.findIndex(a=>a===n);if(u<0){V(null);return}const f=u+1,i=R[f];if(i){V(i);return}if(V(null),dt(!0),S(!1),v){const a=d+1,E=k[a];Rt&&E?.type==="interaction"&&(L.current=a),g()}},[m,v,d,p,R,g,Rt,k]),xn=e.useCallback(()=>{l&&ve(t=>!t)},[l]),Mt=e.useCallback(t=>{t.stopPropagation(),_&&b(!0)},[at,b]),Sn=e.useCallback(t=>{et?.(t)},[et]),bn=e.useCallback(()=>{se(!0),b(!0)},[b]),Ae=e.useMemo(()=>M.map((t,n)=>`${t.sequence_number??`${t.type}-${n}`}:${String(t.is_new??"")}`),[M]);return e.useEffect(()=>{const t=st.current,f=(t.length>0&&t.length<Ae.length&&t.every((a,E)=>a===Ae[E])?M.slice(t.length):[]).some(a=>a.is_new===!1);if(st.current=Ae,!f)return;const i=window.requestAnimationFrame(()=>{const a=ke.current,E=nt.current;if(!a||!E)return;const vn=a.getBoundingClientRect(),yn=E.getBoundingClientRect(),En=a.scrollTop+(yn.top-vn.top);a.scrollTo({top:Math.max(En,0),behavior:"smooth"})});return()=>{window.cancelAnimationFrame(i)}},[M,Ae]),e.useEffect(()=>{if(!pe.current||(pe.current=!1,M.length===0))return;const t=window.requestAnimationFrame(()=>{Tt()});return()=>{window.cancelAnimationFrame(t)}},[M,Tt]),r.jsxRuntimeExports.jsxs("section",{ref:me,className:Y.cn("relative h-full w-full",I&&"slide--mobile-device",U&&"slide--mobile-landscape",ht&&"slide--mobile-landscape-native",qt),onClick:bn,onPointerDown:Sn,...Bt,children:[Xt?r.jsxRuntimeExports.jsx("div",{"aria-hidden":"true",className:"pointer-events-none fixed left-0 top-0 z-[9999] h-[100vh] max-h-[100vh] w-[100vw]"}):null,r.jsxRuntimeExports.jsxs("div",{ref:tt,className:Y.cn("slide__viewport relative h-full min-h-0 w-full",U&&"slide__viewport--mobile-landscape",U&&!zt&&"slide__viewport--mobile-landscape-native"),children:[Gt?r.jsxRuntimeExports.jsxs("div",{className:"slide-landscape-header",children:[r.jsxRuntimeExports.jsx("button",{"aria-label":F?.backAriaLabel??"Back",className:"slide-landscape-header__back",onClick:Zt,type:"button",children:r.jsxRuntimeExports.jsx(Fn.default,{className:"h-6 w-6 text-white",strokeWidth:2.25})}),F?.content?r.jsxRuntimeExports.jsx("div",{className:"min-w-0 flex-1 overflow-hidden",children:F.content}):null]}):null,r.jsxRuntimeExports.jsx("div",{className:Y.cn("h-full min-h-0 w-full",Yt&&"slide__viewport-content--with-header",Lt?"slide-content--single":"grid gap-4"),children:M.length>0?r.jsxRuntimeExports.jsx("div",{className:"slide-stage",children:r.jsxRuntimeExports.jsx("div",{ref:ke,className:"slide-stage__layer w-full",children:tn.map((t,n)=>{const u=n===nn;return r.jsxRuntimeExports.jsx("div",{"aria-hidden":!u||void 0,className:"w-full h-full",style:{display:u?void 0:"none"},children:cn(t.elementList,u)},t.sourceStepIndexes[0]??n)})})}):null}),Vt?r.jsxRuntimeExports.jsx(Rn.default,{message:_e,className:"absolute left-1/2 top-1/2 z-[3] -translate-x-1/2 -translate-y-1/2"}):null,r.jsxRuntimeExports.jsx(wn.default,{onClose:en,open:Wt,text:Jt}),r.jsxRuntimeExports.jsx(_n.default,{extraBottomOffset:Ut,hasPlayerGap:_,isEnabled:ft&&Kt,isPlayerHidden:y&&!_,playbackTimeStore:D,subtitleCues:rn}),We?r.jsxRuntimeExports.jsx("div",{ref:rt,className:Y.cn("slide-interaction-overlay",_&&y?"slide-interaction-overlay--with-player":"slide-interaction-overlay--standalone"),onClick:Mt,onPointerDown:Mt,style:sn,children:r.jsxRuntimeExports.jsx(Ot,{content:String(l?.content??""),defaultButtonText:It.buttonText??"",defaultInputText:It.inputText??"",defaultSelectedValues:ln,confirmButtonText:de?.confirmButtonText,copyButtonText:de?.copyButtonText,copiedButtonText:de?.copiedButtonText,onSend:un,readonly:wt,title:de?.title??we??"Submit the content below to continue."})}):null,y?r.jsxRuntimeExports.jsx(In.default,{audioList:m,className:Y.cn("absolute left-1/2 bottom-6 z-[2] -translate-x-1/2",O,!_&&"pointer-events-none opacity-0"),currentAudioIndex:h,defaultPlaying:!0,isPlaybackPaused:q,isAutoAdvanceEnabled:oe,hasInteraction:!!l,isInteractionOpen:be,isSubtitleEnabled:ft,onAutoAdvanceToggle:ct,onLoadingChange:pn,onPlaybackStarted:()=>{Fe(!0)},onPlaybackTimeChange:D.setTime,onSubtitleToggle:()=>{Dt(t=>!t)},nextDisabled:!v,onEnded:hn,onFullscreen:dn,isFullscreen:Ht,mobileViewMode:P,settingsPortalContainer:tt.current,onMobileViewModeChange:Qt,onInteractionToggle:xn,onNext:mn,onPrev:fn,prevDisabled:!Nt,showControls:_,texts:Ge,customActionContext:He,customActions:N,useAutoAdvanceToggle:ie}):null]})]})};exports.default=Hn;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const r=require("../../_virtual/jsx-runtime.cjs.js"),t=require("react"),An=require("../../lib/sandboxInteraction.cjs.js"),Y=require("../../lib/utils.cjs.js"),In=require("../ui/loading-overlay-card.cjs.js"),_n=require("../ContentRender/ContentRender.cjs.js"),jt=require("../ContentRender/IframeSandbox.cjs.js");require("../ui/inputGroup/input-group.cjs.js");const Pt=require("../../lib/interaction-defaults.cjs.js"),Ie=require("../../lib/mobileDevice.cjs.js"),wn=require("./Player.cjs.js"),Cn=require("./SubtitleOverlay.cjs.js"),ze=require("./constants.cjs.js"),Tn=require("./SlideFullscreenHint.cjs.js"),Mn=require("./useSlide.cjs.js"),kn=require("./useWakePlayerFromIframe.cjs.js"),ce=require("./utils/mobileScreenMode.cjs.js"),jn=require("./utils/interactionPlayback.cjs.js"),Pn=require("./utils/appendedMarkerAdvance.cjs.js"),On=require("./utils/playbackSequence.cjs.js"),Ot=require("./utils/playerCustomActions.cjs.js"),Fn=require("./utils/playbackTimeStore.cjs.js"),qn=require("./utils/playerToggleMode.cjs.js");;/* empty css */const Bn=require("../../markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/chevron-left.cjs.js"),Ln=2e3,Nn=300,Vn=160,Kn=16,Ft=t.memo(({content:s,title:o,defaultButtonText:C,defaultInputText:T,defaultSelectedValues:F,confirmButtonText:q,copyButtonText:N,copiedButtonText:X,onSend:_e,readonly:we=!1})=>r.jsxRuntimeExports.jsxs("div",{className:"slide-player__interaction-card",children:[r.jsxRuntimeExports.jsx("div",{className:"slide-player__interaction-header",children:r.jsxRuntimeExports.jsx("p",{className:"slide-player__interaction-title",children:o})}),r.jsxRuntimeExports.jsx("div",{className:"slide-player__interaction-body",children:r.jsxRuntimeExports.jsx(_n.default,{content:s,defaultButtonText:C,defaultInputText:T,defaultSelectedValues:F,confirmButtonText:q,copyButtonText:N,copiedButtonText:X,onSend:_e,readonly:we,enableTypewriter:!1,sandboxMode:"content"})})]}));Ft.displayName="InteractionOverlayCard";const Dn=(s,o)=>s.length===o.length&&s.every((C,T)=>{const F=o[T];return C.sequence_number===F?.sequence_number&&C.type===F?.type&&C.content===F?.content}),Un=s=>typeof s=="string"?`string:${s.length}:${s.slice(-32)}`:typeof s=="number"||typeof s=="boolean"?`primitive:${String(s)}`:t.isValidElement(s)?`element:${String(s.key??"")}`:Array.isArray(s)?`array:${s.length}`:s==null?"null":`object:${typeof s}`,Hn=s=>(s??[]).map(o=>[String(o.segment_index??"none"),o.is_final?"1":"0",String(o.duration_ms??0),String(o.audio_url??""),String(o.audio_data?.length??0)].join(":")).join(","),$n=s=>s.map((o,C)=>[String(o.sequence_number??C),String(o.type),Un(o.content),String(o.audio_url??""),Hn(o.audio_segments),o.is_renderable===!1?"hidden":"visible",o.is_new?"new":"stable",o.is_speakable?"speakable":"silent",String(o.user_input??""),o.readonly?"readonly":"editable"].join("|")).join("||"),Wn=({elementList:s=[],isStreaming:o=!1,showPlayer:C=!0,playerAlwaysVisible:T=!1,playerClassName:F,fullscreenHeader:q,playerCustomActions:N,playerCustomActionPauseOnActive:X=!0,bufferingText:_e="Buffering...",interactionTitle:we,interactionTexts:de,playerTexts:Ge,playerAutoHideDelay:Ce=3e3,markerAutoAdvanceDelay:Ye=Ln,streamInactivityTimeoutMs:Te=ze.DEFAULT_STREAM_INACTIVITY_TIMEOUT_MS,interactionDefaultValueOptions:fe,onSend:Xe,onPlayerVisibilityChange:Me,onMobileViewModeChange:Je,onError:Qe,onStepChange:Ze,enableIframeScaling:qt=!0,className:Bt,onPointerDown:et,...Lt})=>{const me=t.useRef(null),tt=t.useRef(null),ke=t.useRef(null),nt=t.useRef(null),J=t.useRef(null),Q=t.useRef(null),Z=t.useRef(null),ee=t.useRef(null),te=t.useRef(null),rt=t.useRef(null),st=t.useRef([]),je=t.useRef(null),pe=t.useRef(!1),Pe=t.useRef(!1),ne=t.useRef(!1),V=t.useRef(null),ot=t.useRef(null),lt=t.useRef({markerCount:0,currentIndex:-1,canGoNext:!1}),{currentElementList:M,stepElementLists:ut,slideElementList:k,currentIndex:f,audioList:p,currentAudioSequenceIndexes:he,currentStepHasSpeakableElement:x,currentInteractionElement:d,canGoPrev:Nt,canGoNext:S,handlePrev:it,handleNext:E}=Mn.default(s),re=t.useMemo(()=>{if(!(f<0))return k[f]},[f,k]),Vt=k.filter(e=>e.is_renderable!==!1).length===1,v=C&&(k.length>0||p.length>0||!!d),R=t.useMemo(()=>he.map(e=>p[e]?.audioKey).filter(e=>!!e),[p,he]),[at,be]=t.useState(!0),[xe,se]=t.useState(!1),[oe,ct]=t.useState(!0),[h,K]=t.useState(null),[Kt,Dt]=t.useState(!1),[D,Oe]=t.useState(!1),[A,dt]=t.useState(!1),[Ut,Fe]=t.useState(!1),[ft,Ht]=t.useState(!0),[qe,Be]=t.useState(!1),[u,Le]=t.useState(),[ye,Se]=t.useState(!1),[$t,le]=t.useState(0),[Wt,zt]=t.useState(!1),I=t.useMemo(()=>Ie.isMobileDevice(),[]),[ve,Ne]=t.useState(ce.DEFAULT_MOBILE_VIEW_MODE),[mt,Ve]=t.useState(!1),[Ke,pt]=t.useState(()=>I?Ie.isLandscapeViewport():!1),[Gt,ge]=t.useState(!1),U=t.useMemo(()=>Fn.createPlaybackTimeStore(),[]),{effectiveMobileViewMode:P,isImmersiveMobileFullscreen:H,isNativeMobileFullscreen:ht,shouldRotateFullscreenViewport:Yt}=t.useMemo(()=>ce.resolveMobileViewModeState({hasManualMobileViewMode:mt,isMobileDevice:I,mobileViewMode:ve}),[mt,I,Ke,ve]),bt=t.useRef(P),_=v&&(T||at),Xt=H&&_,Jt=H&&_,Qt=H||ht,Zt=Ge?.fullscreenHintText??ze.DEFAULT_SLIDE_PLAYER_TEXTS.fullscreenHintText,De=t.useMemo(()=>$n(s),[s]),i=t.useCallback((e,n,l)=>{Dt(e)},[]),xt=t.useCallback(e=>{i(e,e?"external-show-buffering":"external-hide-buffering")},[i]),en=t.useCallback(e=>{Ve(!0),Ne(e)},[]),yt=t.useCallback(()=>{Ve(!1),Ne(ce.DEFAULT_MOBILE_VIEW_MODE)},[]),tn=t.useCallback(()=>{yt(),q?.onBack?.()},[q,yt]),nn=t.useCallback(()=>{ge(!1)},[]),St=t.useCallback(e=>{Be(e)},[]),vt=t.useCallback(()=>{Be(e=>!e)},[]),{mountedStepStates:rn,currentMountedStateIndex:sn}=t.useMemo(()=>{const e=[],n=new Map;return ut.forEach((l,m)=>{const a=e.findIndex(c=>Dn(c.elementList,l));if(a>=0){e[a]?.sourceStepIndexes.push(m),n.set(m,a);return}e.push({elementList:l,sourceStepIndexes:[m]}),n.set(m,e.length-1)}),{mountedStepStates:e,currentMountedStateIndex:f>=0?n.get(f)??-1:-1}},[f,ut]),gt=t.useMemo(()=>String(f),[f]),b=t.useMemo(()=>h?p.findIndex(e=>(e.audioKey??"")===h):-1,[p,h]),Ue=t.useMemo(()=>b>=0?p[b]:void 0,[p,b]),on=Ue?.element?.subtitle_cues??[],Ee=t.useMemo(()=>R[0]??"none",[R]),He=t.useMemo(()=>({currentElement:Ot.resolvePlayerCustomActionElement({currentAudioIndex:b,currentAudioSequenceIndexes:he,audioList:p,currentInteractionElement:u,currentStepElement:re}),currentIndex:f,currentStepElement:re,isActive:qe,setActive:St,toggleActive:vt}),[u,p,b,he,f,re,qe,St,vt]),$e=t.useMemo(()=>Ot.getPlayerCustomActionCount(N,He),[He,N]),ln=t.useMemo(()=>({"--slide-player-custom-action-count":String($e),"--slide-player-mobile-control-count":String($e+4)}),[$e]),Et=R.length>0,Rt=t.useMemo(()=>d?`${d.sequence_number??"none"}:${String(d.content??"")}`:"none",[d]),ue=t.useMemo(()=>[gt,Rt].join("|"),[Rt,gt]),un=t.useMemo(()=>[ue,Ue?.audioKey??"none",String(b)].join("|"),[b,Ue?.audioKey,ue]),At=!!t.useMemo(()=>!Ee||Ee==="none"?"":p.find(n=>n.audioKey===Ee)?.audioUrl?.trim()??"",[p,Ee]),O=X&&!!N&&qe,ie=t.useMemo(()=>qn.shouldUseAutoAdvanceToggle({canGoNext:S,currentAudioIndex:b,currentStepHasSpeakableElement:x,hasInteraction:!!d}),[S,b,d,x]),B=t.useCallback(()=>{J.current!==null&&(window.clearTimeout(J.current),J.current=null)},[]),j=t.useCallback(()=>{Z.current!==null&&(window.clearTimeout(Z.current),Z.current=null)},[]),w=t.useCallback(()=>{ee.current!==null&&(window.clearTimeout(ee.current),ee.current=null)},[]),$=t.useCallback(()=>{Q.current!==null&&(window.clearTimeout(Q.current),Q.current=null)},[]),W=t.useCallback(()=>{te.current!==null&&(window.clearTimeout(te.current),te.current=null)},[]),z=t.useCallback(()=>{$(),j(),w(),K(null),U.reset(),i(!1,"reset-audio-sequence"),dt(!1),Fe(!1),Le(void 0),Se(!1),le(0)},[$,j,w,U,i]),G=t.useCallback(()=>{const e=R[0];return e?(K(e),!0):!1},[R]),Re=t.useCallback(()=>{j(),w(),Se(!1),le(0),!G()&&S&&E()},[S,j,w,E,G]),It=t.useCallback(e=>{if(w(),!e)return;const n=()=>{ee.current=null,le(Vn),Se(!0),V.current=null};ee.current=window.setTimeout(n,Nn)},[w]),y=t.useCallback((e=xe)=>{v&&(be(!0),B(),!(T||!e||Ce<=0)&&(J.current=window.setTimeout(()=>{be(!1),J.current=null},Ce)))},[B,xe,T,Ce,v]),ae=!!(d?.readonly||d?.user_input?.trim()),L=!!d&&!ae;t.useEffect(()=>{ct(!0),X&&Be(!1)},[f,X]),t.useEffect(()=>()=>{$(),B(),j(),w(),W()},[$,j,w,B,W]),t.useEffect(()=>{if(!o||Te<=0){W(),je.current=null,Pe.current=!1,ne.current=!1,Oe(!1);return}const e=!Pe.current,n=je.current!==De;return Pe.current=!0,(e||n)&&(je.current=De,ne.current&&(ne.current=!1,Oe(!1))),W(),te.current=window.setTimeout(()=>{te.current=null,!ne.current&&(ne.current=!0,Oe(!0),i(!1,"stream-inactivity-timeout"),Qe?.({code:ze.SLIDE_ERROR_CODES.STREAM_INACTIVITY_TIMEOUT,setBufferingLoadingVisible:xt}))},Te),()=>{W()}},[W,o,Qe,xt,De,Te,i]),t.useEffect(()=>(Me?.(_),()=>{Me?.(!1)}),[Me,_]),t.useEffect(()=>{I||ve===ce.DEFAULT_MOBILE_VIEW_MODE||(Ve(!1),Ne(ce.DEFAULT_MOBILE_VIEW_MODE))},[I,ve]),t.useEffect(()=>{if(!I){pt(!1);return}const e=()=>{pt(Ie.isLandscapeViewport())};return e(),Ie.subscribeMobileDeviceChange(e)},[I]),t.useEffect(()=>{Je?.(P)},[P,Je]),t.useEffect(()=>{const l=bt.current!=="fullscreen"&&P==="fullscreen"&&!Ke;if(bt.current=P,!I){ge(!1);return}if(l){ge(!0);return}P!=="fullscreen"&&ge(!1)},[P,I,Ke]),t.useEffect(()=>{Ze?.(re,f)},[f,re,Ze]),t.useEffect(()=>{const e=lt.current,n=Pn.shouldAutoAdvanceIntoAppendedMarker({previousMarkerCount:e.markerCount,nextMarkerCount:k.length,previousIndex:e.currentIndex,previousCanGoNext:e.canGoNext,nextCanGoNext:S,currentAudioKey:h,hasCompletedCurrentStepAudio:A,hasResolvedCurrentInteraction:ae,currentStepHasSpeakableElement:x,currentInteractionElement:d,isAutoAdvanceEnabled:oe,shouldUseSilentStepAutoAdvanceToggle:ie});lt.current={markerCount:k.length,currentIndex:f,canGoNext:S},n&&E()},[S,h,f,d,x,E,A,ae,oe,ie,k.length]),t.useEffect(()=>{if(!v){B(),be(!1);return}if(T){B(),be(!0);return}xe||y(!0)},[B,xe,T,v,y]),t.useEffect(()=>{if(typeof window>"u")return;const e=n=>{n.origin===window.location.origin&&An.isSandboxInteractionMessage(n.data)&&n.data.eventType==="click"&&v&&(se(!0),y(!0))};return window.addEventListener("message",e),()=>{window.removeEventListener("message",e)}},[v,y]),kn.default({sectionRef:me,enabled:v,onWake:()=>{se(!0),y(!0)}}),t.useEffect(()=>{const{hasPlaybackContextChanged:e,shouldInitializeAudioSequence:n}=On.getPlaybackSequenceTransition({previousResetKey:ot.current,nextResetKey:ue,currentAudioKey:h,hasCompletedCurrentStepAudio:A});ot.current=ue;const l=V.current===f&&!!d,m=jn.shouldPresentInteractionOverlay({hasInteraction:!!d,shouldBlockPlaybackForInteraction:L,shouldOpenInteractionOverlayAfterAudio:l,hasPlaybackContextChanged:e,hasResolvedCurrentInteraction:ae,currentStepHasSpeakableElement:x});if(e&&z(),!(M.length===0&&!d)&&!O){if(d&&Le(d),m){It(d);return}if(w(),V.current=null,!!n&&!G()){if(x){if(D){i(!1,"step-wait-suppressed-after-timeout");return}i(!0,"step-waiting-for-first-audio");return}if(S&&!(ie&&!oe))return Q.current=window.setTimeout(()=>{Q.current=null,E()},Ye),()=>{$()}}}},[S,$,M.length,d,h,ue,x,Ye,E,A,D,oe,ae,L,w,z,It,G,O,ie,i]),t.useEffect(()=>{if(D||O||!x||L){i(!1,"loading-hidden-blocked-state",{shouldPausePlaybackForCustomAction:O,shouldBlockPlaybackForInteraction:L});return}if(A){i(!1,"loading-hidden-step-audio-completed");return}if(Et){i(!1,"loading-hidden-audio-available");return}i(!0,"loading-visible-awaiting-step-audio")},[D,Et,x,A,O,L,i]),t.useEffect(()=>{h||R.length===0||O||!x||L||A||G()},[h,R,x,A,O,L,G]),t.useEffect(()=>{!h||b>=0||K(null)},[b,h]),t.useEffect(()=>{b>=0||U.reset()},[b,U]),t.useEffect(()=>{Fe(!1)},[un]);const _t=t.useMemo(()=>{if(!u)return{};const e=!!u.user_input?.trim();return Pt.getInteractionDefaultValues(typeof u.content=="string"?u.content:void 0,u.user_input,e?void 0:fe)},[u,fe]),an=t.useMemo(()=>{if(!u)return;const e=!!u.user_input?.trim();return Pt.getInteractionDefaultSelectedValues(typeof u.content=="string"?u.content:void 0,u.user_input,e?void 0:fe)},[u,fe]),wt=!!u?.user_input?.trim(),Ct=!!u?.readonly||wt,Tt=Ct||wt,We=!!u&&ye,cn=t.useCallback(e=>{const l=[...e.selectedValues??[],e.inputText?.trim()??"",e.buttonText?.trim()??""].filter(Boolean).join(", ");Le(m=>!m||!l?m:{...m,user_input:l}),Xe?.(e,u),Re()},[u,Re,Xe]);t.useEffect(()=>{const e=()=>{zt(document.fullscreenElement===me.current)};return e(),document.addEventListener("fullscreenchange",e),()=>{document.removeEventListener("fullscreenchange",e)}},[]),t.useEffect(()=>{if(!We){le(0);return}const e=rt.current;if(!e)return;const n=()=>{const m=Math.ceil(e.getBoundingClientRect().height);le(m+Kn)};if(n(),typeof ResizeObserver>"u")return;const l=new ResizeObserver(()=>{n()});return l.observe(e),()=>{l.disconnect()}},[We]),t.useEffect(()=>{if(j(),!(!ye||!Tt))return Z.current=window.setTimeout(()=>{Z.current=null,Re()},2e3),()=>{j()}},[j,Re,ye,Tt]);const dn=(e,n={})=>e?e.type==="slot"?r.jsxRuntimeExports.jsx(r.jsxRuntimeExports.Fragment,{children:e.content}):e.type==="html"?r.jsxRuntimeExports.jsx(jt.default,{className:"content-render-iframe",hideFullScreen:!0,mode:"blackboard",replaceRootScreenHeightWithFull:n.replaceRootScreenHeightWithFull,type:"sandbox",content:e.content,enableScaling:qt}):r.jsxRuntimeExports.jsx(jt.default,{className:"content-render-iframe",hideFullScreen:!0,mode:"blackboard",type:"markdown",content:e.content}):null,fn=(e=[],n=!1)=>{if(e.length===0)return null;const l=e.filter(a=>a.is_renderable!==!1).length,m=e.reduce((a,c,g)=>c.is_renderable!==!1?g:a,-1);return r.jsxRuntimeExports.jsx("div",{className:"slide-stage__content flex w-full flex-col gap-4",children:e.map((a,c)=>{const g=a.type==="html"&&a.is_renderable===!1;return r.jsxRuntimeExports.jsx("div",{ref:n&&c===m?nt:null,"aria-hidden":g||void 0,className:Y.cn("w-full shrink-0",l===1&&a.is_renderable!==!1&&"slide-element--single",g?"pointer-events-none fixed left-[-200vw] top-0 -z-10 h-[100dvh] w-[100vw] overflow-hidden opacity-0":a.is_renderable===!1&&"hidden"),children:dn(a,{replaceRootScreenHeightWithFull:l===1&&a.type==="html"&&a.is_renderable!==!1})},a.sequence_number??`${a.type}-${c}`)})})},mn=t.useCallback(()=>{const e=me.current;if(e){if(document.fullscreenElement===e){document.exitFullscreen().catch(()=>{});return}e.requestFullscreen?.().catch(()=>{})}},[]),Mt=t.useCallback(()=>{const e=ke.current;e&&e.scrollTo({top:e.scrollHeight,behavior:"smooth"})},[]),pn=t.useCallback(()=>{pe.current=!0,V.current=null,se(!0),i(!1,"player-prev"),y(!0),z(),it()},[it,z,y,i]),hn=t.useCallback(()=>{pe.current=!0,V.current=null,se(!0),i(!1,"player-next"),y(!0),z(),E()},[E,z,y,i]),bn=t.useCallback(e=>{if(D||!x||A){i(!1,"player-loading-change-ignored",{loading:e});return}i(e,e?"player-reported-loading":"player-reported-ready")},[x,A,D,i]),xn=t.useCallback(e=>{const n=p[e]?.audioKey;if(!n||!h||n!==h)return;const l=R.findIndex(c=>c===n);if(l<0){K(null);return}const m=l+1,a=R[m];if(a){K(a);return}if(K(null),dt(!0),i(!1,"player-ended-step-complete"),S){const c=f+1,g=k[c];At&&g?.type==="interaction"&&(V.current=c),E()}},[p,S,f,h,R,E,At,k,i]),yn=t.useCallback(()=>{u&&Se(e=>!e)},[u]),kt=t.useCallback(e=>{e.stopPropagation(),_&&y(!0)},[at,y]),Sn=t.useCallback(e=>{et?.(e)},[et]),vn=t.useCallback(()=>{se(!0),y(!0)},[y]),Ae=t.useMemo(()=>M.map((e,n)=>`${e.sequence_number??`${e.type}-${n}`}:${String(e.is_new??"")}`),[M]);return t.useEffect(()=>{const e=st.current,m=(e.length>0&&e.length<Ae.length&&e.every((c,g)=>c===Ae[g])?M.slice(e.length):[]).some(c=>c.is_new===!1);if(st.current=Ae,!m)return;const a=window.requestAnimationFrame(()=>{const c=ke.current,g=nt.current;if(!c||!g)return;const gn=c.getBoundingClientRect(),En=g.getBoundingClientRect(),Rn=c.scrollTop+(En.top-gn.top);c.scrollTo({top:Math.max(Rn,0),behavior:"smooth"})});return()=>{window.cancelAnimationFrame(a)}},[M,Ae]),t.useEffect(()=>{if(!pe.current||(pe.current=!1,M.length===0))return;const e=window.requestAnimationFrame(()=>{Mt()});return()=>{window.cancelAnimationFrame(e)}},[M,Mt]),r.jsxRuntimeExports.jsxs("section",{ref:me,className:Y.cn("relative h-full w-full",I&&"slide--mobile-device",H&&"slide--mobile-landscape",ht&&"slide--mobile-landscape-native",Bt),onClick:vn,onPointerDown:Sn,...Lt,children:[Qt?r.jsxRuntimeExports.jsx("div",{"aria-hidden":"true",className:"pointer-events-none fixed left-0 top-0 z-[9999] h-[100vh] max-h-[100vh] w-[100vw]"}):null,r.jsxRuntimeExports.jsxs("div",{ref:tt,className:Y.cn("slide__viewport relative h-full min-h-0 w-full",H&&"slide__viewport--mobile-landscape",H&&!Yt&&"slide__viewport--mobile-landscape-native"),children:[Xt?r.jsxRuntimeExports.jsxs("div",{className:"slide-landscape-header",children:[r.jsxRuntimeExports.jsx("button",{"aria-label":q?.backAriaLabel??"Back",className:"slide-landscape-header__back",onClick:tn,type:"button",children:r.jsxRuntimeExports.jsx(Bn.default,{className:"h-6 w-6 text-white",strokeWidth:2.25})}),q?.content?r.jsxRuntimeExports.jsx("div",{className:"min-w-0 flex-1 overflow-hidden",children:q.content}):null]}):null,r.jsxRuntimeExports.jsx("div",{className:Y.cn("h-full min-h-0 w-full",Jt&&"slide__viewport-content--with-header",Vt?"slide-content--single":"grid gap-4"),children:M.length>0?r.jsxRuntimeExports.jsx("div",{className:"slide-stage",children:r.jsxRuntimeExports.jsx("div",{ref:ke,className:"slide-stage__layer w-full",children:rn.map((e,n)=>{const l=n===sn;return r.jsxRuntimeExports.jsx("div",{"aria-hidden":!l||void 0,className:"w-full h-full",style:{display:l?void 0:"none"},children:fn(e.elementList,l)},e.sourceStepIndexes[0]??n)})})}):null}),Kt?r.jsxRuntimeExports.jsx(In.default,{message:_e,className:"absolute left-1/2 top-1/2 z-[3] -translate-x-1/2 -translate-y-1/2"}):null,r.jsxRuntimeExports.jsx(Tn.default,{onClose:nn,open:Gt,text:Zt}),r.jsxRuntimeExports.jsx(Cn.default,{extraBottomOffset:$t,hasPlayerGap:_,isEnabled:ft&&Ut,isPlayerHidden:v&&!_,playbackTimeStore:U,subtitleCues:on}),We?r.jsxRuntimeExports.jsx("div",{ref:rt,className:Y.cn("slide-interaction-overlay",_&&v?"slide-interaction-overlay--with-player":"slide-interaction-overlay--standalone"),onClick:kt,onPointerDown:kt,style:ln,children:r.jsxRuntimeExports.jsx(Ft,{content:String(u?.content??""),defaultButtonText:_t.buttonText??"",defaultInputText:_t.inputText??"",defaultSelectedValues:an,confirmButtonText:de?.confirmButtonText,copyButtonText:de?.copyButtonText,copiedButtonText:de?.copiedButtonText,onSend:cn,readonly:Ct,title:de?.title??we??"Submit the content below to continue."})}):null,v?r.jsxRuntimeExports.jsx(wn.default,{audioList:p,className:Y.cn("absolute left-1/2 bottom-6 z-[2] -translate-x-1/2",F,!_&&"pointer-events-none opacity-0"),currentAudioIndex:b,defaultPlaying:!0,isPlaybackPaused:O,isAutoAdvanceEnabled:oe,hasInteraction:!!u,isInteractionOpen:ye,isSubtitleEnabled:ft,onAutoAdvanceToggle:ct,onLoadingChange:bn,onPlaybackStarted:()=>{Fe(!0)},onPlaybackTimeChange:U.setTime,onSubtitleToggle:()=>{Ht(e=>!e)},nextDisabled:!S,onEnded:xn,onFullscreen:mn,isFullscreen:Wt,mobileViewMode:P,settingsPortalContainer:tt.current,onMobileViewModeChange:en,onInteractionToggle:yn,onNext:hn,onPrev:pn,prevDisabled:!Nt,showControls:_,texts:Ge,customActionContext:He,customActions:N,useAutoAdvanceToggle:ie}):null]})]})};exports.default=Wn;
2
2
  //# sourceMappingURL=Slide.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Slide.cjs.js","sources":["../../../src/components/Slide/Slide.tsx"],"sourcesContent":["import React, {\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { ChevronLeft } from \"lucide-react\";\n\nimport { isSandboxInteractionMessage } from \"../../lib/sandboxInteraction\";\nimport { cn } from \"../../lib/utils\";\nimport LoadingOverlayCard from \"../ui/loading-overlay-card\";\nimport ContentRender from \"../ContentRender\";\nimport type { ContentRenderProps } from \"../ContentRender/ContentRender\";\nimport IframeSandbox from \"../ContentRender/IframeSandbox\";\nimport type { OnSendContentParams } from \"../types\";\nimport {\n getInteractionDefaultSelectedValues,\n getInteractionDefaultValues,\n type InteractionDefaultValueOptions,\n} from \"../../lib/interaction-defaults\";\nimport {\n isLandscapeViewport as getIsFullscreenPreferredViewport,\n isMobileDevice as getIsMobileDevice,\n subscribeMobileDeviceChange,\n} from \"../../lib/mobileDevice\";\nimport Player from \"./Player\";\nimport SubtitleOverlay from \"./SubtitleOverlay\";\nimport type { PlayerProps, SlidePlayerTexts } from \"./Player\";\nimport {\n DEFAULT_SLIDE_PLAYER_TEXTS,\n DEFAULT_STREAM_INACTIVITY_TIMEOUT_MS,\n SLIDE_ERROR_CODES,\n} from \"./constants\";\nimport SlideFullscreenHint from \"./SlideFullscreenHint\";\nimport type { Element } from \"./types\";\nimport useSlide from \"./useSlide\";\nimport useWakePlayerFromIframe from \"./useWakePlayerFromIframe\";\nimport {\n DEFAULT_MOBILE_VIEW_MODE,\n resolveMobileViewModeState,\n type MobileViewMode,\n} from \"./utils/mobileScreenMode\";\nimport { shouldPresentInteractionOverlay } from \"./utils/interactionPlayback\";\nimport { shouldAutoAdvanceIntoAppendedMarker } from \"./utils/appendedMarkerAdvance\";\nimport { getPlaybackSequenceTransition } from \"./utils/playbackSequence\";\nimport {\n getPlayerCustomActionCount,\n resolvePlayerCustomActionElement,\n} from \"./utils/playerCustomActions\";\nimport { createPlaybackTimeStore } from \"./utils/playbackTimeStore\";\nimport { shouldUseAutoAdvanceToggle } from \"./utils/playerToggleMode\";\nimport \"./slide.css\";\nexport type {\n Element,\n ElementAudioSegment,\n ElementSubtitleCue,\n SlidePlayerCustomActionContext,\n SlidePlayerCustomActions,\n} from \"./types\";\n\nconst DEFAULT_MARKER_AUTO_ADVANCE_DELAY_MS = 2000;\nconst DEFAULT_INTERACTION_OVERLAY_OPEN_DELAY_MS = 300;\nconst DEFAULT_INTERACTION_OVERLAY_FALLBACK_OFFSET_PX = 160;\nconst DEFAULT_INTERACTION_SUBTITLE_GAP_PX = 16;\n\ntype RenderSlideElementOptions = {\n replaceRootScreenHeightWithFull?: boolean;\n};\n\ninterface InteractionOverlayCardProps {\n content: string;\n title: string;\n defaultButtonText?: string;\n defaultInputText?: string;\n defaultSelectedValues?: string[];\n confirmButtonText?: string;\n copyButtonText?: string;\n copiedButtonText?: string;\n onSend?: (content: OnSendContentParams) => void;\n readonly?: boolean;\n}\n\nexport interface SlideInteractionTexts\n extends Pick<\n ContentRenderProps,\n \"confirmButtonText\" | \"copyButtonText\" | \"copiedButtonText\"\n > {\n title?: string;\n}\n\nexport type SlideErrorCode =\n (typeof SLIDE_ERROR_CODES)[keyof typeof SLIDE_ERROR_CODES];\n\nexport interface SlideErrorContext {\n code: SlideErrorCode;\n}\n\nexport type SlideFullscreenHeader = {\n content?: React.ReactNode;\n backAriaLabel?: string;\n onBack?: () => void;\n};\n\nconst InteractionOverlayCard = memo(\n ({\n content,\n title,\n defaultButtonText,\n defaultInputText,\n defaultSelectedValues,\n confirmButtonText,\n copyButtonText,\n copiedButtonText,\n onSend,\n readonly = false,\n }: InteractionOverlayCardProps) => (\n <div className=\"slide-player__interaction-card\">\n <div className=\"slide-player__interaction-header\">\n <p className=\"slide-player__interaction-title\">{title}</p>\n </div>\n <div className=\"slide-player__interaction-body\">\n <ContentRender\n content={content}\n defaultButtonText={defaultButtonText}\n defaultInputText={defaultInputText}\n defaultSelectedValues={defaultSelectedValues}\n confirmButtonText={confirmButtonText}\n copyButtonText={copyButtonText}\n copiedButtonText={copiedButtonText}\n onSend={onSend}\n readonly={readonly}\n enableTypewriter={false}\n sandboxMode=\"content\"\n />\n </div>\n </div>\n )\n);\n\nInteractionOverlayCard.displayName = \"InteractionOverlayCard\";\n\nconst areStepElementListsEqual = (\n prevElementList: Element[],\n nextElementList: Element[]\n) =>\n prevElementList.length === nextElementList.length &&\n prevElementList.every((element, index) => {\n const nextElement = nextElementList[index];\n\n return (\n element.sequence_number === nextElement?.sequence_number &&\n element.type === nextElement?.type &&\n element.content === nextElement?.content\n );\n });\n\nconst getStreamContentActivityKey = (content: Element[\"content\"]) => {\n if (typeof content === \"string\") {\n return `string:${content.length}:${content.slice(-32)}`;\n }\n\n if (typeof content === \"number\" || typeof content === \"boolean\") {\n return `primitive:${String(content)}`;\n }\n\n if (React.isValidElement(content)) {\n return `element:${String(content.key ?? \"\")}`;\n }\n\n if (Array.isArray(content)) {\n return `array:${content.length}`;\n }\n\n if (content == null) {\n return \"null\";\n }\n\n return `object:${typeof content}`;\n};\n\nconst getStreamAudioSegmentsActivityKey = (\n audioSegments: Element[\"audio_segments\"]\n) =>\n (audioSegments ?? [])\n .map((segment) =>\n [\n String(segment.segment_index ?? \"none\"),\n segment.is_final ? \"1\" : \"0\",\n String(segment.duration_ms ?? 0),\n String(segment.audio_url ?? \"\"),\n String(segment.audio_data?.length ?? 0),\n ].join(\":\")\n )\n .join(\",\");\n\nconst getStreamActivityKey = (elementList: Element[]) =>\n elementList\n .map((element, index) =>\n [\n String(element.sequence_number ?? index),\n String(element.type),\n getStreamContentActivityKey(element.content),\n String(element.audio_url ?? \"\"),\n getStreamAudioSegmentsActivityKey(element.audio_segments),\n element.is_renderable === false ? \"hidden\" : \"visible\",\n element.is_new ? \"new\" : \"stable\",\n element.is_speakable ? \"speakable\" : \"silent\",\n String(element.user_input ?? \"\"),\n element.readonly ? \"readonly\" : \"editable\",\n ].join(\"|\")\n )\n .join(\"||\");\n\nexport interface SlideProps extends React.ComponentProps<\"section\"> {\n elementList?: Element[];\n isStreaming?: boolean;\n showPlayer?: boolean;\n playerAlwaysVisible?: boolean;\n playerClassName?: string;\n fullscreenHeader?: SlideFullscreenHeader;\n playerCustomActions?: PlayerProps[\"customActions\"];\n playerCustomActionPauseOnActive?: boolean;\n bufferingText?: string;\n interactionTitle?: string;\n interactionTexts?: SlideInteractionTexts;\n playerTexts?: SlidePlayerTexts;\n playerAutoHideDelay?: number;\n markerAutoAdvanceDelay?: number;\n streamInactivityTimeoutMs?: number;\n interactionDefaultValueOptions?: InteractionDefaultValueOptions;\n onSend?: (content: OnSendContentParams, element?: Element) => void;\n onPlayerVisibilityChange?: (visible: boolean) => void;\n onMobileViewModeChange?: (viewMode: MobileViewMode) => void;\n onError?: (error: SlideErrorContext) => void;\n onStepChange?: (element: Element | undefined, index: number) => void;\n enableIframeScaling?: boolean;\n}\n\nconst Slide: React.FC<SlideProps> = ({\n elementList = [],\n isStreaming = false,\n showPlayer = true,\n playerAlwaysVisible = false,\n playerClassName,\n fullscreenHeader,\n playerCustomActions,\n playerCustomActionPauseOnActive = true,\n bufferingText = \"Buffering...\",\n interactionTitle,\n interactionTexts,\n playerTexts,\n playerAutoHideDelay = 3000,\n markerAutoAdvanceDelay = DEFAULT_MARKER_AUTO_ADVANCE_DELAY_MS,\n streamInactivityTimeoutMs = DEFAULT_STREAM_INACTIVITY_TIMEOUT_MS,\n interactionDefaultValueOptions,\n onSend,\n onPlayerVisibilityChange,\n onMobileViewModeChange,\n onError,\n onStepChange,\n enableIframeScaling = true,\n className,\n onPointerDown,\n ...props\n}) => {\n const sectionRef = useRef<HTMLElement | null>(null);\n const viewportRef = useRef<HTMLDivElement | null>(null);\n const stageLayerRef = useRef<HTMLDivElement | null>(null);\n const lastElementRef = useRef<HTMLDivElement | null>(null);\n const playerHideTimerRef = useRef<number | null>(null);\n const autoAdvanceTimerRef = useRef<number | null>(null);\n const interactionAutoCloseTimerRef = useRef<number | null>(null);\n const interactionOverlayOpenTimerRef = useRef<number | null>(null);\n const streamInactivityTimerRef = useRef<number | null>(null);\n const interactionOverlayRef = useRef<HTMLDivElement | null>(null);\n const prevRenderElementKeysRef = useRef<string[]>([]);\n const lastStreamActivityKeyRef = useRef<string | null>(null);\n const shouldScrollToBottomRef = useRef(false);\n const hasStreamStartedRef = useRef(false);\n const hasStreamInactivityTimedOutRef = useRef(false);\n const pendingInteractionOverlayStepIndexRef = useRef<number | null>(null);\n const playbackResetKeyRef = useRef<string | null>(null);\n const appendedMarkerAdvanceStateRef = useRef({\n markerCount: 0,\n currentIndex: -1,\n canGoNext: false,\n });\n const {\n currentElementList,\n stepElementLists,\n slideElementList,\n currentIndex,\n audioList,\n currentAudioSequenceIndexes,\n currentStepHasSpeakableElement,\n currentInteractionElement,\n canGoPrev,\n canGoNext,\n handlePrev: goPrev,\n handleNext: goNext,\n } = useSlide(elementList);\n const currentStepElement = useMemo(() => {\n if (currentIndex < 0) {\n return undefined;\n }\n\n return slideElementList[currentIndex];\n }, [currentIndex, slideElementList]);\n const visibleMarkerCount = slideElementList.filter(\n (element) => element.is_renderable !== false\n ).length;\n const isSingleSlide = visibleMarkerCount === 1;\n const shouldRenderPlayer =\n showPlayer &&\n (slideElementList.length > 0 ||\n audioList.length > 0 ||\n Boolean(currentInteractionElement));\n const currentAudioSequenceKeys = useMemo(\n () =>\n currentAudioSequenceIndexes\n .map((audioIndex) => audioList[audioIndex]?.audioKey)\n .filter((audioKey): audioKey is string => Boolean(audioKey)),\n [audioList, currentAudioSequenceIndexes]\n );\n const [isPlayerVisible, setIsPlayerVisible] = useState(true);\n const [hasPlayerInteracted, setHasPlayerInteracted] = useState(false);\n const [isAutoAdvanceEnabled, setIsAutoAdvanceEnabled] = useState(true);\n const [currentAudioKey, setCurrentAudioKey] = useState<string | null>(null);\n const [isAudioLoadingVisible, setIsAudioLoadingVisible] = useState(false);\n const [hasStreamInactivityTimedOut, setHasStreamInactivityTimedOut] =\n useState(false);\n const [hasCompletedCurrentStepAudio, setHasCompletedCurrentStepAudio] =\n useState(false);\n const [hasCurrentAudioPlaybackStarted, setHasCurrentAudioPlaybackStarted] =\n useState(false);\n const [isSubtitleEnabled, setIsSubtitleEnabled] = useState(true);\n const [isPlayerCustomActionActive, setIsPlayerCustomActionActive] =\n useState(false);\n const [activeInteractionElement, setActiveInteractionElement] = useState<\n Element | undefined\n >();\n const [isInteractionOverlayOpen, setIsInteractionOverlayOpen] =\n useState(false);\n const [\n interactionOverlaySubtitleOffset,\n setInteractionOverlaySubtitleOffset,\n ] = useState(0);\n const [isBrowserFullscreen, setIsBrowserFullscreen] = useState(false);\n const isMobileDevice = useMemo(() => getIsMobileDevice(), []);\n const [mobileViewMode, setMobileViewMode] = useState<MobileViewMode>(\n DEFAULT_MOBILE_VIEW_MODE\n );\n const [hasManualMobileViewMode, setHasManualMobileViewMode] = useState(false);\n const [isViewportFullscreenPreferred, setIsViewportFullscreenPreferred] =\n useState(() =>\n isMobileDevice ? getIsFullscreenPreferredViewport() : false\n );\n const [isFullscreenHintOpen, setIsFullscreenHintOpen] = useState(false);\n const playbackTimeStore = useMemo(() => createPlaybackTimeStore(), []);\n const {\n effectiveMobileViewMode,\n isImmersiveMobileFullscreen,\n isNativeMobileFullscreen,\n shouldRotateFullscreenViewport,\n } = useMemo(\n () =>\n resolveMobileViewModeState({\n hasManualMobileViewMode,\n isMobileDevice,\n isViewportFullscreenPreferred,\n mobileViewMode,\n }),\n [\n hasManualMobileViewMode,\n isMobileDevice,\n isViewportFullscreenPreferred,\n mobileViewMode,\n ]\n );\n const previousEffectiveMobileViewModeRef = useRef(effectiveMobileViewMode);\n const playerVisible =\n shouldRenderPlayer && (playerAlwaysVisible || isPlayerVisible);\n const shouldShowFullscreenHeader =\n isImmersiveMobileFullscreen && playerVisible;\n const shouldApplyFullscreenViewportPadding =\n isImmersiveMobileFullscreen && playerVisible;\n const shouldShowMobileFullscreenMask =\n isImmersiveMobileFullscreen || isNativeMobileFullscreen;\n const fullscreenHintText =\n playerTexts?.fullscreenHintText ??\n DEFAULT_SLIDE_PLAYER_TEXTS.fullscreenHintText;\n const streamActivityKey = useMemo(\n () => getStreamActivityKey(elementList),\n [elementList]\n );\n const handleMobileViewModeSelect = useCallback(\n (nextViewMode: MobileViewMode) => {\n setHasManualMobileViewMode(true);\n setMobileViewMode(nextViewMode);\n },\n []\n );\n const handleMobileViewModeReset = useCallback(() => {\n // Clear manual override so the effective mode returns to the default non-fullscreen state.\n setHasManualMobileViewMode(false);\n setMobileViewMode(DEFAULT_MOBILE_VIEW_MODE);\n }, []);\n const handleFullscreenHeaderBack = useCallback(() => {\n handleMobileViewModeReset();\n fullscreenHeader?.onBack?.();\n }, [fullscreenHeader, handleMobileViewModeReset]);\n const handleFullscreenHintClose = useCallback(() => {\n setIsFullscreenHintOpen(false);\n }, []);\n const setPlayerCustomActionActive = useCallback((active: boolean) => {\n setIsPlayerCustomActionActive(active);\n }, []);\n const togglePlayerCustomActionActive = useCallback(() => {\n setIsPlayerCustomActionActive((previous) => !previous);\n }, []);\n const { mountedStepStates, currentMountedStateIndex } = useMemo(() => {\n const nextMountedStepStates: Array<{\n elementList: Element[];\n sourceStepIndexes: number[];\n }> = [];\n const mountedStateIndexByStep = new Map<number, number>();\n\n stepElementLists.forEach((stepElementList, stepIndex) => {\n const existingMountedStateIndex = nextMountedStepStates.findIndex(\n (mountedStepState) =>\n areStepElementListsEqual(\n mountedStepState.elementList,\n stepElementList\n )\n );\n\n if (existingMountedStateIndex >= 0) {\n nextMountedStepStates[\n existingMountedStateIndex\n ]?.sourceStepIndexes.push(stepIndex);\n mountedStateIndexByStep.set(stepIndex, existingMountedStateIndex);\n return;\n }\n\n nextMountedStepStates.push({\n elementList: stepElementList,\n sourceStepIndexes: [stepIndex],\n });\n mountedStateIndexByStep.set(stepIndex, nextMountedStepStates.length - 1);\n });\n\n return {\n mountedStepStates: nextMountedStepStates,\n currentMountedStateIndex:\n currentIndex >= 0\n ? (mountedStateIndexByStep.get(currentIndex) ?? -1)\n : -1,\n };\n }, [currentIndex, stepElementLists]);\n const currentStepKey = useMemo(() => String(currentIndex), [currentIndex]);\n const currentAudioIndex = useMemo(() => {\n if (!currentAudioKey) {\n return -1;\n }\n\n return audioList.findIndex(\n (audioItem) => (audioItem.audioKey ?? \"\") === currentAudioKey\n );\n }, [audioList, currentAudioKey]);\n const currentAudioItem = useMemo(\n () => (currentAudioIndex >= 0 ? audioList[currentAudioIndex] : undefined),\n [audioList, currentAudioIndex]\n );\n const currentSubtitleCues = currentAudioItem?.element?.subtitle_cues ?? [];\n const currentAudioSequenceStartKey = useMemo(\n () => currentAudioSequenceKeys[0] ?? \"none\",\n [currentAudioSequenceKeys]\n );\n const playerCustomActionContext = useMemo(\n () => ({\n currentElement: resolvePlayerCustomActionElement({\n currentAudioIndex,\n currentAudioSequenceIndexes,\n audioList,\n currentInteractionElement: activeInteractionElement,\n currentStepElement,\n }),\n currentIndex,\n currentStepElement,\n isActive: isPlayerCustomActionActive,\n setActive: setPlayerCustomActionActive,\n toggleActive: togglePlayerCustomActionActive,\n }),\n [\n activeInteractionElement,\n audioList,\n currentAudioIndex,\n currentAudioSequenceIndexes,\n currentIndex,\n currentStepElement,\n isPlayerCustomActionActive,\n setPlayerCustomActionActive,\n togglePlayerCustomActionActive,\n ]\n );\n const playerCustomActionCount = useMemo(\n () =>\n getPlayerCustomActionCount(\n playerCustomActions,\n playerCustomActionContext\n ),\n [playerCustomActionContext, playerCustomActions]\n );\n const interactionOverlayStyle = useMemo(\n () =>\n ({\n \"--slide-player-custom-action-count\": String(playerCustomActionCount),\n \"--slide-player-mobile-control-count\": String(\n playerCustomActionCount + 4\n ),\n }) as React.CSSProperties,\n [playerCustomActionCount]\n );\n const hasAvailableStepAudio = currentAudioSequenceKeys.length > 0;\n const currentInteractionResetKey = useMemo(() => {\n if (!currentInteractionElement) {\n return \"none\";\n }\n\n return `${currentInteractionElement.sequence_number ?? \"none\"}:${String(\n currentInteractionElement.content ?? \"\"\n )}`;\n }, [currentInteractionElement]);\n const currentPlaybackResetKey = useMemo(\n () => [currentStepKey, currentInteractionResetKey].join(\"|\"),\n [currentInteractionResetKey, currentStepKey]\n );\n const currentPlaybackStartedResetKey = useMemo(\n () =>\n [\n currentPlaybackResetKey,\n currentAudioItem?.audioKey ?? \"none\",\n String(currentAudioIndex),\n ].join(\"|\"),\n [currentAudioIndex, currentAudioItem?.audioKey, currentPlaybackResetKey]\n );\n const currentStepAudioUrl = useMemo(() => {\n if (\n !currentAudioSequenceStartKey ||\n currentAudioSequenceStartKey === \"none\"\n ) {\n return \"\";\n }\n\n const currentStepAudioItem = audioList.find(\n (audioItem) => audioItem.audioKey === currentAudioSequenceStartKey\n );\n\n return currentStepAudioItem?.audioUrl?.trim() ?? \"\";\n }, [audioList, currentAudioSequenceStartKey]);\n const hasCurrentStepAudioUrl = Boolean(currentStepAudioUrl);\n const shouldPausePlaybackForCustomAction =\n playerCustomActionPauseOnActive &&\n Boolean(playerCustomActions) &&\n isPlayerCustomActionActive;\n const shouldUseSilentStepAutoAdvanceToggle = useMemo(\n () =>\n shouldUseAutoAdvanceToggle({\n canGoNext,\n currentAudioIndex,\n currentStepHasSpeakableElement,\n hasInteraction: Boolean(currentInteractionElement),\n }),\n [\n canGoNext,\n currentAudioIndex,\n currentInteractionElement,\n currentStepHasSpeakableElement,\n ]\n );\n\n const clearPlayerHideTimer = useCallback(() => {\n if (playerHideTimerRef.current === null) {\n return;\n }\n\n window.clearTimeout(playerHideTimerRef.current);\n playerHideTimerRef.current = null;\n }, []);\n\n const clearInteractionAutoCloseTimer = useCallback(() => {\n if (interactionAutoCloseTimerRef.current === null) {\n return;\n }\n\n window.clearTimeout(interactionAutoCloseTimerRef.current);\n interactionAutoCloseTimerRef.current = null;\n }, []);\n\n const clearInteractionOverlayOpenTimer = useCallback(() => {\n if (interactionOverlayOpenTimerRef.current === null) {\n return;\n }\n\n window.clearTimeout(interactionOverlayOpenTimerRef.current);\n interactionOverlayOpenTimerRef.current = null;\n }, []);\n\n const clearAutoAdvanceTimer = useCallback(() => {\n if (autoAdvanceTimerRef.current === null) {\n return;\n }\n\n window.clearTimeout(autoAdvanceTimerRef.current);\n autoAdvanceTimerRef.current = null;\n }, []);\n\n const clearStreamInactivityTimer = useCallback(() => {\n if (streamInactivityTimerRef.current === null) {\n return;\n }\n\n window.clearTimeout(streamInactivityTimerRef.current);\n streamInactivityTimerRef.current = null;\n }, []);\n\n const resetAudioSequence = useCallback(() => {\n clearAutoAdvanceTimer();\n clearInteractionAutoCloseTimer();\n clearInteractionOverlayOpenTimer();\n setCurrentAudioKey(null);\n playbackTimeStore.reset();\n setIsAudioLoadingVisible(false);\n setHasCompletedCurrentStepAudio(false);\n setHasCurrentAudioPlaybackStarted(false);\n setActiveInteractionElement(undefined);\n setIsInteractionOverlayOpen(false);\n setInteractionOverlaySubtitleOffset(0);\n }, [\n clearAutoAdvanceTimer,\n clearInteractionAutoCloseTimer,\n clearInteractionOverlayOpenTimer,\n playbackTimeStore,\n ]);\n\n const startCurrentAudioSequence = useCallback(() => {\n const nextAudioKey = currentAudioSequenceKeys[0];\n\n if (!nextAudioKey) {\n return false;\n }\n\n // Start the first audio segment for the current step immediately.\n setCurrentAudioKey(nextAudioKey);\n return true;\n }, [currentAudioSequenceKeys]);\n\n const continueAfterInteraction = useCallback(() => {\n clearInteractionAutoCloseTimer();\n clearInteractionOverlayOpenTimer();\n setIsInteractionOverlayOpen(false);\n setInteractionOverlaySubtitleOffset(0);\n\n if (startCurrentAudioSequence()) {\n return;\n }\n\n if (canGoNext) {\n goNext();\n }\n }, [\n canGoNext,\n clearInteractionAutoCloseTimer,\n clearInteractionOverlayOpenTimer,\n goNext,\n startCurrentAudioSequence,\n ]);\n\n const scheduleInteractionOverlayOpen = useCallback(\n (interactionElement?: Element) => {\n clearInteractionOverlayOpenTimer();\n\n if (!interactionElement) {\n return;\n }\n\n const openOverlay = () => {\n interactionOverlayOpenTimerRef.current = null;\n setInteractionOverlaySubtitleOffset(\n DEFAULT_INTERACTION_OVERLAY_FALLBACK_OFFSET_PX\n );\n setIsInteractionOverlayOpen(true);\n pendingInteractionOverlayStepIndexRef.current = null;\n };\n\n interactionOverlayOpenTimerRef.current = window.setTimeout(\n openOverlay,\n DEFAULT_INTERACTION_OVERLAY_OPEN_DELAY_MS\n );\n },\n [clearInteractionOverlayOpenTimer]\n );\n\n const showPlayerControls = useCallback(\n (enableAutoHide = hasPlayerInteracted) => {\n if (!shouldRenderPlayer) {\n return;\n }\n\n setIsPlayerVisible(true);\n clearPlayerHideTimer();\n\n if (playerAlwaysVisible || !enableAutoHide || playerAutoHideDelay <= 0) {\n return;\n }\n\n playerHideTimerRef.current = window.setTimeout(() => {\n setIsPlayerVisible(false);\n playerHideTimerRef.current = null;\n }, playerAutoHideDelay);\n },\n [\n clearPlayerHideTimer,\n hasPlayerInteracted,\n playerAlwaysVisible,\n playerAutoHideDelay,\n shouldRenderPlayer,\n ]\n );\n\n const hasResolvedCurrentInteraction = Boolean(\n currentInteractionElement?.readonly ||\n currentInteractionElement?.user_input?.trim()\n );\n\n const shouldBlockPlaybackForInteraction =\n Boolean(currentInteractionElement) && !hasResolvedCurrentInteraction;\n\n useEffect(() => {\n // Reset silent-step autoplay toggle whenever navigation lands on a new step.\n setIsAutoAdvanceEnabled(true);\n\n if (playerCustomActionPauseOnActive) {\n setIsPlayerCustomActionActive(false);\n }\n }, [currentIndex, playerCustomActionPauseOnActive]);\n\n useEffect(() => {\n return () => {\n clearAutoAdvanceTimer();\n clearPlayerHideTimer();\n clearInteractionAutoCloseTimer();\n clearInteractionOverlayOpenTimer();\n clearStreamInactivityTimer();\n };\n }, [\n clearAutoAdvanceTimer,\n clearInteractionAutoCloseTimer,\n clearInteractionOverlayOpenTimer,\n clearPlayerHideTimer,\n clearStreamInactivityTimer,\n ]);\n\n useEffect(() => {\n if (!isStreaming || streamInactivityTimeoutMs <= 0) {\n clearStreamInactivityTimer();\n lastStreamActivityKeyRef.current = null;\n hasStreamStartedRef.current = false;\n hasStreamInactivityTimedOutRef.current = false;\n setHasStreamInactivityTimedOut(false);\n return;\n }\n\n const hasStreamingStarted = !hasStreamStartedRef.current;\n const hasStreamActivityChanged =\n lastStreamActivityKeyRef.current !== streamActivityKey;\n\n hasStreamStartedRef.current = true;\n\n if (hasStreamingStarted || hasStreamActivityChanged) {\n lastStreamActivityKeyRef.current = streamActivityKey;\n\n if (hasStreamInactivityTimedOutRef.current) {\n hasStreamInactivityTimedOutRef.current = false;\n setHasStreamInactivityTimedOut(false);\n }\n }\n\n clearStreamInactivityTimer();\n\n streamInactivityTimerRef.current = window.setTimeout(() => {\n streamInactivityTimerRef.current = null;\n\n if (hasStreamInactivityTimedOutRef.current) {\n return;\n }\n\n hasStreamInactivityTimedOutRef.current = true;\n setHasStreamInactivityTimedOut(true);\n setIsAudioLoadingVisible(false);\n onError?.({\n code: SLIDE_ERROR_CODES.STREAM_INACTIVITY_TIMEOUT,\n });\n }, streamInactivityTimeoutMs);\n\n return () => {\n clearStreamInactivityTimer();\n };\n }, [\n clearStreamInactivityTimer,\n isStreaming,\n onError,\n streamActivityKey,\n streamInactivityTimeoutMs,\n ]);\n\n useEffect(() => {\n onPlayerVisibilityChange?.(playerVisible);\n\n return () => {\n onPlayerVisibilityChange?.(false);\n };\n }, [onPlayerVisibilityChange, playerVisible]);\n\n useEffect(() => {\n if (isMobileDevice || mobileViewMode === DEFAULT_MOBILE_VIEW_MODE) {\n return;\n }\n\n setHasManualMobileViewMode(false);\n setMobileViewMode(DEFAULT_MOBILE_VIEW_MODE);\n }, [isMobileDevice, mobileViewMode]);\n\n useEffect(() => {\n if (!isMobileDevice) {\n setIsViewportFullscreenPreferred(false);\n return;\n }\n\n const syncViewportFullscreenPreference = () => {\n setIsViewportFullscreenPreferred(getIsFullscreenPreferredViewport());\n };\n\n syncViewportFullscreenPreference();\n\n return subscribeMobileDeviceChange(syncViewportFullscreenPreference);\n }, [isMobileDevice]);\n\n useEffect(() => {\n onMobileViewModeChange?.(effectiveMobileViewMode);\n }, [effectiveMobileViewMode, onMobileViewModeChange]);\n\n useEffect(() => {\n const previousMode = previousEffectiveMobileViewModeRef.current;\n const hasEnteredFullscreen =\n previousMode !== \"fullscreen\" && effectiveMobileViewMode === \"fullscreen\";\n const shouldShowFullscreenHint =\n hasEnteredFullscreen && !isViewportFullscreenPreferred;\n\n previousEffectiveMobileViewModeRef.current = effectiveMobileViewMode;\n\n if (!isMobileDevice) {\n setIsFullscreenHintOpen(false);\n return;\n }\n\n if (shouldShowFullscreenHint) {\n setIsFullscreenHintOpen(true);\n return;\n }\n\n if (effectiveMobileViewMode !== \"fullscreen\") {\n setIsFullscreenHintOpen(false);\n }\n }, [effectiveMobileViewMode, isMobileDevice, isViewportFullscreenPreferred]);\n\n useEffect(() => {\n onStepChange?.(currentStepElement, currentIndex);\n }, [currentIndex, currentStepElement, onStepChange]);\n\n useEffect(() => {\n const previousState = appendedMarkerAdvanceStateRef.current;\n const shouldAdvanceIntoAppendedMarker = shouldAutoAdvanceIntoAppendedMarker(\n {\n previousMarkerCount: previousState.markerCount,\n nextMarkerCount: slideElementList.length,\n previousIndex: previousState.currentIndex,\n previousCanGoNext: previousState.canGoNext,\n nextCanGoNext: canGoNext,\n currentAudioKey,\n hasCompletedCurrentStepAudio,\n hasResolvedCurrentInteraction,\n currentStepHasSpeakableElement,\n currentInteractionElement,\n isAutoAdvanceEnabled,\n shouldUseSilentStepAutoAdvanceToggle,\n }\n );\n\n appendedMarkerAdvanceStateRef.current = {\n markerCount: slideElementList.length,\n currentIndex,\n canGoNext,\n };\n\n if (!shouldAdvanceIntoAppendedMarker) {\n return;\n }\n\n goNext();\n }, [\n canGoNext,\n currentAudioKey,\n currentIndex,\n currentInteractionElement,\n currentStepHasSpeakableElement,\n goNext,\n hasCompletedCurrentStepAudio,\n hasResolvedCurrentInteraction,\n isAutoAdvanceEnabled,\n shouldUseSilentStepAutoAdvanceToggle,\n slideElementList.length,\n ]);\n\n useEffect(() => {\n if (!shouldRenderPlayer) {\n clearPlayerHideTimer();\n setIsPlayerVisible(false);\n return;\n }\n\n if (playerAlwaysVisible) {\n clearPlayerHideTimer();\n setIsPlayerVisible(true);\n return;\n }\n\n if (!hasPlayerInteracted) {\n // Keep the initial player visible briefly, then hide it automatically.\n showPlayerControls(true);\n }\n }, [\n clearPlayerHideTimer,\n hasPlayerInteracted,\n playerAlwaysVisible,\n shouldRenderPlayer,\n showPlayerControls,\n ]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const handleSandboxInteraction = (event: MessageEvent) => {\n if (event.origin !== window.location.origin) {\n return;\n }\n\n if (!isSandboxInteractionMessage(event.data)) {\n return;\n }\n\n if (event.data.eventType !== \"click\") {\n return;\n }\n\n if (!shouldRenderPlayer) {\n return;\n }\n\n // Restore player controls on explicit click/tap without waking on scroll start.\n setHasPlayerInteracted(true);\n showPlayerControls(true);\n };\n\n window.addEventListener(\"message\", handleSandboxInteraction);\n\n return () => {\n window.removeEventListener(\"message\", handleSandboxInteraction);\n };\n }, [shouldRenderPlayer, showPlayerControls]);\n\n useWakePlayerFromIframe({\n sectionRef,\n enabled: shouldRenderPlayer,\n onWake: () => {\n setHasPlayerInteracted(true);\n showPlayerControls(true);\n },\n });\n\n useEffect(() => {\n const { hasPlaybackContextChanged, shouldInitializeAudioSequence } =\n getPlaybackSequenceTransition({\n previousResetKey: playbackResetKeyRef.current,\n nextResetKey: currentPlaybackResetKey,\n currentAudioKey,\n hasCompletedCurrentStepAudio,\n });\n\n playbackResetKeyRef.current = currentPlaybackResetKey;\n\n const shouldOpenInteractionOverlayAfterAudio =\n pendingInteractionOverlayStepIndexRef.current === currentIndex &&\n Boolean(currentInteractionElement);\n const shouldPresentOverlay = shouldPresentInteractionOverlay({\n hasInteraction: Boolean(currentInteractionElement),\n shouldBlockPlaybackForInteraction,\n shouldOpenInteractionOverlayAfterAudio,\n hasPlaybackContextChanged,\n hasResolvedCurrentInteraction,\n currentStepHasSpeakableElement,\n });\n\n if (hasPlaybackContextChanged) {\n resetAudioSequence();\n }\n\n if (currentElementList.length === 0 && !currentInteractionElement) {\n return;\n }\n\n if (shouldPausePlaybackForCustomAction) {\n return;\n }\n\n if (currentInteractionElement) {\n setActiveInteractionElement(currentInteractionElement);\n }\n\n if (shouldPresentOverlay) {\n // Delay auto-presenting the overlay so subtitles can settle above it.\n scheduleInteractionOverlayOpen(currentInteractionElement);\n return;\n }\n\n clearInteractionOverlayOpenTimer();\n pendingInteractionOverlayStepIndexRef.current = null;\n\n if (!shouldInitializeAudioSequence) {\n return;\n }\n\n if (startCurrentAudioSequence()) {\n return;\n }\n\n if (currentStepHasSpeakableElement) {\n if (hasStreamInactivityTimedOut) {\n setIsAudioLoadingVisible(false);\n return;\n }\n\n setIsAudioLoadingVisible(true);\n return;\n }\n\n if (!canGoNext) {\n return;\n }\n\n if (shouldUseSilentStepAutoAdvanceToggle && !isAutoAdvanceEnabled) {\n return;\n }\n\n // Auto-advance silent marker-only steps so playback flow does not stall.\n autoAdvanceTimerRef.current = window.setTimeout(() => {\n autoAdvanceTimerRef.current = null;\n goNext();\n }, markerAutoAdvanceDelay);\n\n return () => {\n clearAutoAdvanceTimer();\n };\n }, [\n canGoNext,\n clearAutoAdvanceTimer,\n currentElementList.length,\n currentInteractionElement,\n currentAudioKey,\n currentPlaybackResetKey,\n currentStepHasSpeakableElement,\n markerAutoAdvanceDelay,\n goNext,\n hasCompletedCurrentStepAudio,\n hasStreamInactivityTimedOut,\n isAutoAdvanceEnabled,\n hasResolvedCurrentInteraction,\n shouldBlockPlaybackForInteraction,\n clearInteractionOverlayOpenTimer,\n resetAudioSequence,\n scheduleInteractionOverlayOpen,\n startCurrentAudioSequence,\n shouldPausePlaybackForCustomAction,\n shouldUseSilentStepAutoAdvanceToggle,\n ]);\n\n useEffect(() => {\n if (\n hasStreamInactivityTimedOut ||\n shouldPausePlaybackForCustomAction ||\n !currentStepHasSpeakableElement ||\n shouldBlockPlaybackForInteraction\n ) {\n setIsAudioLoadingVisible(false);\n return;\n }\n\n if (hasCompletedCurrentStepAudio) {\n setIsAudioLoadingVisible(false);\n return;\n }\n\n if (hasAvailableStepAudio) {\n setIsAudioLoadingVisible(false);\n return;\n }\n\n setIsAudioLoadingVisible(true);\n }, [\n hasStreamInactivityTimedOut,\n hasAvailableStepAudio,\n currentStepHasSpeakableElement,\n hasCompletedCurrentStepAudio,\n shouldPausePlaybackForCustomAction,\n shouldBlockPlaybackForInteraction,\n ]);\n\n useEffect(() => {\n if (currentAudioKey || currentAudioSequenceKeys.length === 0) {\n return;\n }\n\n if (\n shouldPausePlaybackForCustomAction ||\n !currentStepHasSpeakableElement ||\n shouldBlockPlaybackForInteraction\n ) {\n return;\n }\n\n if (hasCompletedCurrentStepAudio) {\n return;\n }\n\n startCurrentAudioSequence();\n }, [\n currentAudioKey,\n currentAudioSequenceKeys,\n currentStepHasSpeakableElement,\n hasCompletedCurrentStepAudio,\n shouldPausePlaybackForCustomAction,\n shouldBlockPlaybackForInteraction,\n startCurrentAudioSequence,\n ]);\n\n useEffect(() => {\n if (!currentAudioKey || currentAudioIndex >= 0) {\n return;\n }\n\n setCurrentAudioKey(null);\n }, [currentAudioIndex, currentAudioKey]);\n\n useEffect(() => {\n if (currentAudioIndex >= 0) {\n return;\n }\n\n playbackTimeStore.reset();\n }, [currentAudioIndex, playbackTimeStore]);\n\n useEffect(() => {\n setHasCurrentAudioPlaybackStarted(false);\n }, [currentPlaybackStartedResetKey]);\n\n const interactionDefaults = useMemo(() => {\n if (!activeInteractionElement) {\n return {};\n }\n\n const shouldPreferResolvedInteractionInput = Boolean(\n activeInteractionElement.user_input?.trim()\n );\n\n return getInteractionDefaultValues(\n typeof activeInteractionElement.content === \"string\"\n ? activeInteractionElement.content\n : undefined,\n activeInteractionElement.user_input,\n shouldPreferResolvedInteractionInput\n ? undefined\n : interactionDefaultValueOptions\n );\n }, [activeInteractionElement, interactionDefaultValueOptions]);\n\n const interactionDefaultSelectedValues = useMemo(() => {\n if (!activeInteractionElement) {\n return undefined;\n }\n\n const shouldPreferResolvedInteractionInput = Boolean(\n activeInteractionElement.user_input?.trim()\n );\n\n return getInteractionDefaultSelectedValues(\n typeof activeInteractionElement.content === \"string\"\n ? activeInteractionElement.content\n : undefined,\n activeInteractionElement.user_input,\n shouldPreferResolvedInteractionInput\n ? undefined\n : interactionDefaultValueOptions\n );\n }, [activeInteractionElement, interactionDefaultValueOptions]);\n\n const hasResolvedInteractionInput = Boolean(\n activeInteractionElement?.user_input?.trim()\n );\n\n const isInteractionReadonly =\n Boolean(activeInteractionElement?.readonly) || hasResolvedInteractionInput;\n const shouldAutoContinueInteraction =\n isInteractionReadonly || hasResolvedInteractionInput;\n const shouldShowInteractionOverlay =\n Boolean(activeInteractionElement) && isInteractionOverlayOpen;\n\n const handleInteractionSend = useCallback(\n (content: OnSendContentParams) => {\n const submittedValues = [\n ...(content.selectedValues ?? []),\n content.inputText?.trim() ?? \"\",\n content.buttonText?.trim() ?? \"\",\n ].filter(Boolean);\n const resolvedUserInput = submittedValues.join(\", \");\n\n setActiveInteractionElement((prevElement) => {\n if (!prevElement || !resolvedUserInput) {\n return prevElement;\n }\n\n return {\n ...prevElement,\n user_input: resolvedUserInput,\n };\n });\n\n onSend?.(content, activeInteractionElement);\n continueAfterInteraction();\n },\n [activeInteractionElement, continueAfterInteraction, onSend]\n );\n\n useEffect(() => {\n // Keep the player icon in sync with the actual fullscreen owner.\n const syncFullscreenState = () => {\n setIsBrowserFullscreen(document.fullscreenElement === sectionRef.current);\n };\n\n syncFullscreenState();\n document.addEventListener(\"fullscreenchange\", syncFullscreenState);\n\n return () => {\n document.removeEventListener(\"fullscreenchange\", syncFullscreenState);\n };\n }, []);\n\n useEffect(() => {\n if (!shouldShowInteractionOverlay) {\n setInteractionOverlaySubtitleOffset(0);\n return;\n }\n\n const interactionOverlayElement = interactionOverlayRef.current;\n\n if (!interactionOverlayElement) {\n return;\n }\n\n const updateSubtitleOffset = () => {\n const overlayHeight = Math.ceil(\n interactionOverlayElement.getBoundingClientRect().height\n );\n\n setInteractionOverlaySubtitleOffset(\n overlayHeight + DEFAULT_INTERACTION_SUBTITLE_GAP_PX\n );\n };\n\n updateSubtitleOffset();\n\n if (typeof ResizeObserver === \"undefined\") {\n return;\n }\n\n const resizeObserver = new ResizeObserver(() => {\n updateSubtitleOffset();\n });\n\n resizeObserver.observe(interactionOverlayElement);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [shouldShowInteractionOverlay]);\n\n useEffect(() => {\n clearInteractionAutoCloseTimer();\n\n if (!isInteractionOverlayOpen || !shouldAutoContinueInteraction) {\n return;\n }\n\n // Auto-close passive interaction markers to keep playback moving.\n interactionAutoCloseTimerRef.current = window.setTimeout(() => {\n interactionAutoCloseTimerRef.current = null;\n\n continueAfterInteraction();\n }, 2000);\n\n return () => {\n clearInteractionAutoCloseTimer();\n };\n }, [\n clearInteractionAutoCloseTimer,\n continueAfterInteraction,\n isInteractionOverlayOpen,\n shouldAutoContinueInteraction,\n ]);\n\n const renderSlideElement = (\n element?: Element,\n options: RenderSlideElementOptions = {}\n ) => {\n if (!element) {\n return null;\n }\n\n if (element.type === \"slot\") {\n return <>{element.content}</>;\n }\n\n if (element.type === \"html\") {\n return (\n <IframeSandbox\n className=\"content-render-iframe\"\n hideFullScreen\n mode=\"blackboard\"\n replaceRootScreenHeightWithFull={\n options.replaceRootScreenHeightWithFull\n }\n type=\"sandbox\"\n content={element.content as string}\n enableScaling={enableIframeScaling}\n />\n );\n }\n\n return (\n <IframeSandbox\n className=\"content-render-iframe\"\n hideFullScreen\n mode=\"blackboard\"\n type=\"markdown\"\n content={element.content as string}\n />\n );\n };\n\n const renderSlideElementList = (\n elementList: Element[] = [],\n isActiveStep = false\n ) => {\n if (elementList.length === 0) {\n return null;\n }\n\n const visibleElementCount = elementList.filter(\n (element) => element.is_renderable !== false\n ).length;\n const lastVisibleElementIndex = elementList.reduce(\n (lastVisibleIndex, element, index) =>\n element.is_renderable !== false ? index : lastVisibleIndex,\n -1\n );\n\n return (\n <div className=\"slide-stage__content flex w-full flex-col gap-4\">\n {elementList.map((element, index) => {\n const isPreRenderedHtml =\n element.type === \"html\" && element.is_renderable === false;\n\n return (\n <div\n key={element.sequence_number ?? `${element.type}-${index}`}\n ref={\n isActiveStep && index === lastVisibleElementIndex\n ? lastElementRef\n : null\n }\n aria-hidden={isPreRenderedHtml || undefined}\n className={cn(\n \"w-full shrink-0\",\n visibleElementCount === 1 &&\n element.is_renderable !== false &&\n \"slide-element--single\",\n isPreRenderedHtml\n ? \"pointer-events-none fixed left-[-200vw] top-0 -z-10 h-[100dvh] w-[100vw] overflow-hidden opacity-0\"\n : element.is_renderable === false && \"hidden\"\n )}\n >\n {renderSlideElement(element, {\n replaceRootScreenHeightWithFull:\n visibleElementCount === 1 &&\n element.type === \"html\" &&\n element.is_renderable !== false,\n })}\n </div>\n );\n })}\n </div>\n );\n };\n\n const handleFullscreen = useCallback(() => {\n const target = sectionRef.current;\n if (!target) {\n return;\n }\n\n if (document.fullscreenElement === target) {\n document.exitFullscreen().catch(() => {});\n return;\n }\n\n target.requestFullscreen?.().catch(() => {});\n }, []);\n\n const scrollStageToBottom = useCallback(() => {\n const stageLayerElement = stageLayerRef.current;\n\n if (!stageLayerElement) {\n return;\n }\n\n // Keep the latest content visible after manual player navigation.\n stageLayerElement.scrollTo({\n top: stageLayerElement.scrollHeight,\n behavior: \"smooth\",\n });\n }, []);\n\n const handlePrev = useCallback(() => {\n shouldScrollToBottomRef.current = true;\n pendingInteractionOverlayStepIndexRef.current = null;\n setHasPlayerInteracted(true);\n setIsAudioLoadingVisible(false);\n showPlayerControls(true);\n resetAudioSequence();\n goPrev();\n }, [goPrev, resetAudioSequence, showPlayerControls]);\n\n const handleNext = useCallback(() => {\n shouldScrollToBottomRef.current = true;\n pendingInteractionOverlayStepIndexRef.current = null;\n setHasPlayerInteracted(true);\n setIsAudioLoadingVisible(false);\n showPlayerControls(true);\n resetAudioSequence();\n goNext();\n }, [goNext, resetAudioSequence, showPlayerControls]);\n\n const handlePlayerLoadingChange = useCallback(\n (loading: boolean) => {\n if (\n hasStreamInactivityTimedOut ||\n !currentStepHasSpeakableElement ||\n hasCompletedCurrentStepAudio\n ) {\n setIsAudioLoadingVisible(false);\n return;\n }\n\n setIsAudioLoadingVisible(loading);\n },\n [\n currentStepHasSpeakableElement,\n hasCompletedCurrentStepAudio,\n hasStreamInactivityTimedOut,\n ]\n );\n\n const handlePlayerEnded = useCallback(\n (audioIndex: number) => {\n const endedAudioKey = audioList[audioIndex]?.audioKey;\n\n if (!endedAudioKey || !currentAudioKey) {\n return;\n }\n\n if (endedAudioKey !== currentAudioKey) {\n return;\n }\n\n const activeSequencePosition = currentAudioSequenceKeys.findIndex(\n (audioSequenceKey) => audioSequenceKey === endedAudioKey\n );\n if (activeSequencePosition < 0) {\n setCurrentAudioKey(null);\n return;\n }\n\n const nextSequencePosition = activeSequencePosition + 1;\n const nextAudioKey = currentAudioSequenceKeys[nextSequencePosition];\n\n if (nextAudioKey) {\n setCurrentAudioKey(nextAudioKey);\n return;\n }\n\n setCurrentAudioKey(null);\n setHasCompletedCurrentStepAudio(true);\n setIsAudioLoadingVisible(false);\n\n if (canGoNext) {\n const nextStepIndex = currentIndex + 1;\n const nextStepElement = slideElementList[nextStepIndex];\n\n if (hasCurrentStepAudioUrl && nextStepElement?.type === \"interaction\") {\n pendingInteractionOverlayStepIndexRef.current = nextStepIndex;\n }\n\n goNext();\n }\n },\n [\n audioList,\n canGoNext,\n currentIndex,\n currentAudioKey,\n currentAudioSequenceKeys,\n goNext,\n hasCurrentStepAudioUrl,\n slideElementList,\n ]\n );\n\n const handleInteractionToggle = useCallback(() => {\n if (!activeInteractionElement) {\n return;\n }\n\n setIsInteractionOverlayOpen((prevOpen) => !prevOpen);\n }, [activeInteractionElement]);\n\n const stopOverlayPropagation = useCallback(\n (\n event:\n | React.PointerEvent<HTMLDivElement>\n | React.MouseEvent<HTMLDivElement>\n ) => {\n event.stopPropagation();\n\n // Keep the player visible a bit longer when users interact with the overlay.\n if (playerVisible) {\n showPlayerControls(true);\n }\n },\n [isPlayerVisible, showPlayerControls]\n );\n\n const handleSurfacePointerDown = useCallback(\n (event: React.PointerEvent<HTMLElement>) => {\n onPointerDown?.(event);\n },\n [onPointerDown]\n );\n\n const handleSurfaceClick = useCallback(() => {\n setHasPlayerInteracted(true);\n showPlayerControls(true);\n }, [showPlayerControls]);\n\n const currentRenderElementKeys = useMemo(\n () =>\n currentElementList.map(\n (element, index) =>\n `${element.sequence_number ?? `${element.type}-${index}`}:${String(element.is_new ?? \"\")}`\n ),\n [currentElementList]\n );\n\n useEffect(() => {\n const prevKeys = prevRenderElementKeysRef.current;\n const hasStablePrefix =\n prevKeys.length > 0 &&\n prevKeys.length < currentRenderElementKeys.length &&\n prevKeys.every((key, index) => key === currentRenderElementKeys[index]);\n const appendedElements = hasStablePrefix\n ? currentElementList.slice(prevKeys.length)\n : [];\n const shouldAutoScrollToAppend = appendedElements.some(\n (element) => element.is_new === false\n );\n\n prevRenderElementKeysRef.current = currentRenderElementKeys;\n\n if (!shouldAutoScrollToAppend) {\n return;\n }\n\n const animationFrameId = window.requestAnimationFrame(() => {\n const stageLayerElement = stageLayerRef.current;\n const targetElement = lastElementRef.current;\n\n if (!stageLayerElement || !targetElement) {\n return;\n }\n\n const stageLayerRect = stageLayerElement.getBoundingClientRect();\n const targetRect = targetElement.getBoundingClientRect();\n const nextScrollTop =\n stageLayerElement.scrollTop + (targetRect.top - stageLayerRect.top);\n\n // Keep newly appended content visible when the current slide grows downward.\n stageLayerElement.scrollTo({\n top: Math.max(nextScrollTop, 0),\n behavior: \"smooth\",\n });\n });\n\n return () => {\n window.cancelAnimationFrame(animationFrameId);\n };\n }, [currentElementList, currentRenderElementKeys]);\n\n useEffect(() => {\n if (!shouldScrollToBottomRef.current) {\n return;\n }\n\n shouldScrollToBottomRef.current = false;\n\n if (currentElementList.length === 0) {\n return;\n }\n\n const animationFrameId = window.requestAnimationFrame(() => {\n scrollStageToBottom();\n });\n\n return () => {\n window.cancelAnimationFrame(animationFrameId);\n };\n }, [currentElementList, scrollStageToBottom]);\n\n return (\n <section\n ref={sectionRef}\n className={cn(\n \"relative h-full w-full\",\n isMobileDevice && \"slide--mobile-device\",\n isImmersiveMobileFullscreen && \"slide--mobile-landscape\",\n isNativeMobileFullscreen && \"slide--mobile-landscape-native\",\n className\n )}\n onClick={handleSurfaceClick}\n onPointerDown={handleSurfacePointerDown}\n {...props}\n >\n {shouldShowMobileFullscreenMask ? (\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none fixed left-0 top-0 z-[9999] h-[100vh] max-h-[100vh] w-[100vw]\"\n />\n ) : null}\n\n <div\n ref={viewportRef}\n className={cn(\n \"slide__viewport relative h-full min-h-0 w-full\",\n isImmersiveMobileFullscreen && \"slide__viewport--mobile-landscape\",\n isImmersiveMobileFullscreen &&\n !shouldRotateFullscreenViewport &&\n \"slide__viewport--mobile-landscape-native\"\n )}\n >\n {shouldShowFullscreenHeader ? (\n <div className=\"slide-landscape-header\">\n <button\n aria-label={fullscreenHeader?.backAriaLabel ?? \"Back\"}\n className=\"slide-landscape-header__back\"\n onClick={handleFullscreenHeaderBack}\n type=\"button\"\n >\n <ChevronLeft className=\"h-6 w-6 text-white\" strokeWidth={2.25} />\n </button>\n\n {fullscreenHeader?.content ? (\n <div className=\"min-w-0 flex-1 overflow-hidden\">\n {fullscreenHeader.content}\n </div>\n ) : null}\n </div>\n ) : null}\n\n <div\n className={cn(\n \"h-full min-h-0 w-full\",\n shouldApplyFullscreenViewportPadding &&\n \"slide__viewport-content--with-header\",\n isSingleSlide ? \"slide-content--single\" : \"grid gap-4\"\n )}\n >\n {currentElementList.length > 0 ? (\n <div className=\"slide-stage\">\n <div ref={stageLayerRef} className=\"slide-stage__layer w-full\">\n {mountedStepStates.map(\n (mountedStepState, mountedStepStateIndex) => {\n const isActiveStep =\n mountedStepStateIndex === currentMountedStateIndex;\n\n return (\n <div\n key={\n mountedStepState.sourceStepIndexes[0] ??\n mountedStepStateIndex\n }\n aria-hidden={!isActiveStep || undefined}\n className=\"w-full h-full\"\n style={{ display: isActiveStep ? undefined : \"none\" }}\n >\n {renderSlideElementList(\n mountedStepState.elementList,\n isActiveStep\n )}\n </div>\n );\n }\n )}\n </div>\n </div>\n ) : null}\n </div>\n\n {isAudioLoadingVisible ? (\n <LoadingOverlayCard\n message={bufferingText}\n className=\"absolute left-1/2 top-1/2 z-[3] -translate-x-1/2 -translate-y-1/2\"\n />\n ) : null}\n\n <SlideFullscreenHint\n onClose={handleFullscreenHintClose}\n open={isFullscreenHintOpen}\n text={fullscreenHintText}\n />\n\n <SubtitleOverlay\n extraBottomOffset={interactionOverlaySubtitleOffset}\n hasPlayerGap={playerVisible}\n isEnabled={isSubtitleEnabled && hasCurrentAudioPlaybackStarted}\n isPlayerHidden={shouldRenderPlayer && !playerVisible}\n playbackTimeStore={playbackTimeStore}\n subtitleCues={currentSubtitleCues}\n />\n\n {shouldShowInteractionOverlay ? (\n <div\n ref={interactionOverlayRef}\n className={cn(\n \"slide-interaction-overlay\",\n playerVisible && shouldRenderPlayer\n ? \"slide-interaction-overlay--with-player\"\n : \"slide-interaction-overlay--standalone\"\n )}\n onClick={stopOverlayPropagation}\n onPointerDown={stopOverlayPropagation}\n style={interactionOverlayStyle}\n >\n <InteractionOverlayCard\n content={String(activeInteractionElement?.content ?? \"\")}\n defaultButtonText={interactionDefaults.buttonText ?? \"\"}\n defaultInputText={interactionDefaults.inputText ?? \"\"}\n defaultSelectedValues={interactionDefaultSelectedValues}\n confirmButtonText={interactionTexts?.confirmButtonText}\n copyButtonText={interactionTexts?.copyButtonText}\n copiedButtonText={interactionTexts?.copiedButtonText}\n onSend={handleInteractionSend}\n readonly={isInteractionReadonly}\n title={\n interactionTexts?.title ??\n interactionTitle ??\n \"Submit the content below to continue.\"\n }\n />\n </div>\n ) : null}\n\n {shouldRenderPlayer ? (\n <Player\n audioList={audioList}\n className={cn(\n \"absolute left-1/2 bottom-6 z-[2] -translate-x-1/2\",\n playerClassName,\n !playerVisible && \"pointer-events-none opacity-0\"\n )}\n currentAudioIndex={currentAudioIndex}\n defaultPlaying\n isPlaybackPaused={shouldPausePlaybackForCustomAction}\n isAutoAdvanceEnabled={isAutoAdvanceEnabled}\n hasInteraction={Boolean(activeInteractionElement)}\n isInteractionOpen={isInteractionOverlayOpen}\n isSubtitleEnabled={isSubtitleEnabled}\n onAutoAdvanceToggle={setIsAutoAdvanceEnabled}\n onLoadingChange={handlePlayerLoadingChange}\n onPlaybackStarted={() => {\n setHasCurrentAudioPlaybackStarted(true);\n }}\n onPlaybackTimeChange={playbackTimeStore.setTime}\n onSubtitleToggle={() => {\n setIsSubtitleEnabled((previousEnabled) => !previousEnabled);\n }}\n nextDisabled={!canGoNext}\n onEnded={handlePlayerEnded}\n onFullscreen={handleFullscreen}\n isFullscreen={isBrowserFullscreen}\n mobileViewMode={effectiveMobileViewMode}\n settingsPortalContainer={viewportRef.current}\n onMobileViewModeChange={handleMobileViewModeSelect}\n onInteractionToggle={handleInteractionToggle}\n onNext={handleNext}\n onPrev={handlePrev}\n prevDisabled={!canGoPrev}\n showControls={playerVisible}\n texts={playerTexts}\n customActionContext={playerCustomActionContext}\n customActions={playerCustomActions}\n useAutoAdvanceToggle={shouldUseSilentStepAutoAdvanceToggle}\n />\n ) : null}\n </div>\n </section>\n );\n};\n\nexport default Slide;\n"],"names":["DEFAULT_MARKER_AUTO_ADVANCE_DELAY_MS","DEFAULT_INTERACTION_OVERLAY_OPEN_DELAY_MS","DEFAULT_INTERACTION_OVERLAY_FALLBACK_OFFSET_PX","DEFAULT_INTERACTION_SUBTITLE_GAP_PX","InteractionOverlayCard","memo","content","title","defaultButtonText","defaultInputText","defaultSelectedValues","confirmButtonText","copyButtonText","copiedButtonText","onSend","readonly","jsxs","jsx","ContentRender","areStepElementListsEqual","prevElementList","nextElementList","element","index","nextElement","getStreamContentActivityKey","React","getStreamAudioSegmentsActivityKey","audioSegments","segment","getStreamActivityKey","elementList","Slide","isStreaming","showPlayer","playerAlwaysVisible","playerClassName","fullscreenHeader","playerCustomActions","playerCustomActionPauseOnActive","bufferingText","interactionTitle","interactionTexts","playerTexts","playerAutoHideDelay","markerAutoAdvanceDelay","streamInactivityTimeoutMs","DEFAULT_STREAM_INACTIVITY_TIMEOUT_MS","interactionDefaultValueOptions","onPlayerVisibilityChange","onMobileViewModeChange","onError","onStepChange","enableIframeScaling","className","onPointerDown","props","sectionRef","useRef","viewportRef","stageLayerRef","lastElementRef","playerHideTimerRef","autoAdvanceTimerRef","interactionAutoCloseTimerRef","interactionOverlayOpenTimerRef","streamInactivityTimerRef","interactionOverlayRef","prevRenderElementKeysRef","lastStreamActivityKeyRef","shouldScrollToBottomRef","hasStreamStartedRef","hasStreamInactivityTimedOutRef","pendingInteractionOverlayStepIndexRef","playbackResetKeyRef","appendedMarkerAdvanceStateRef","currentElementList","stepElementLists","slideElementList","currentIndex","audioList","currentAudioSequenceIndexes","currentStepHasSpeakableElement","currentInteractionElement","canGoPrev","canGoNext","goPrev","goNext","useSlide","currentStepElement","useMemo","isSingleSlide","shouldRenderPlayer","currentAudioSequenceKeys","audioIndex","audioKey","isPlayerVisible","setIsPlayerVisible","useState","hasPlayerInteracted","setHasPlayerInteracted","isAutoAdvanceEnabled","setIsAutoAdvanceEnabled","currentAudioKey","setCurrentAudioKey","isAudioLoadingVisible","setIsAudioLoadingVisible","hasStreamInactivityTimedOut","setHasStreamInactivityTimedOut","hasCompletedCurrentStepAudio","setHasCompletedCurrentStepAudio","hasCurrentAudioPlaybackStarted","setHasCurrentAudioPlaybackStarted","isSubtitleEnabled","setIsSubtitleEnabled","isPlayerCustomActionActive","setIsPlayerCustomActionActive","activeInteractionElement","setActiveInteractionElement","isInteractionOverlayOpen","setIsInteractionOverlayOpen","interactionOverlaySubtitleOffset","setInteractionOverlaySubtitleOffset","isBrowserFullscreen","setIsBrowserFullscreen","isMobileDevice","getIsMobileDevice","mobileViewMode","setMobileViewMode","DEFAULT_MOBILE_VIEW_MODE","hasManualMobileViewMode","setHasManualMobileViewMode","isViewportFullscreenPreferred","setIsViewportFullscreenPreferred","getIsFullscreenPreferredViewport","isFullscreenHintOpen","setIsFullscreenHintOpen","playbackTimeStore","createPlaybackTimeStore","effectiveMobileViewMode","isImmersiveMobileFullscreen","isNativeMobileFullscreen","shouldRotateFullscreenViewport","resolveMobileViewModeState","previousEffectiveMobileViewModeRef","playerVisible","shouldShowFullscreenHeader","shouldApplyFullscreenViewportPadding","shouldShowMobileFullscreenMask","fullscreenHintText","DEFAULT_SLIDE_PLAYER_TEXTS","streamActivityKey","handleMobileViewModeSelect","useCallback","nextViewMode","handleMobileViewModeReset","handleFullscreenHeaderBack","handleFullscreenHintClose","setPlayerCustomActionActive","active","togglePlayerCustomActionActive","previous","mountedStepStates","currentMountedStateIndex","nextMountedStepStates","mountedStateIndexByStep","stepElementList","stepIndex","existingMountedStateIndex","mountedStepState","currentStepKey","currentAudioIndex","audioItem","currentAudioItem","currentSubtitleCues","currentAudioSequenceStartKey","playerCustomActionContext","resolvePlayerCustomActionElement","playerCustomActionCount","getPlayerCustomActionCount","interactionOverlayStyle","hasAvailableStepAudio","currentInteractionResetKey","currentPlaybackResetKey","currentPlaybackStartedResetKey","hasCurrentStepAudioUrl","shouldPausePlaybackForCustomAction","shouldUseSilentStepAutoAdvanceToggle","shouldUseAutoAdvanceToggle","clearPlayerHideTimer","clearInteractionAutoCloseTimer","clearInteractionOverlayOpenTimer","clearAutoAdvanceTimer","clearStreamInactivityTimer","resetAudioSequence","startCurrentAudioSequence","nextAudioKey","continueAfterInteraction","scheduleInteractionOverlayOpen","interactionElement","openOverlay","showPlayerControls","enableAutoHide","hasResolvedCurrentInteraction","shouldBlockPlaybackForInteraction","useEffect","hasStreamingStarted","hasStreamActivityChanged","SLIDE_ERROR_CODES","syncViewportFullscreenPreference","subscribeMobileDeviceChange","shouldShowFullscreenHint","previousState","shouldAdvanceIntoAppendedMarker","shouldAutoAdvanceIntoAppendedMarker","handleSandboxInteraction","event","isSandboxInteractionMessage","useWakePlayerFromIframe","hasPlaybackContextChanged","shouldInitializeAudioSequence","getPlaybackSequenceTransition","shouldOpenInteractionOverlayAfterAudio","shouldPresentOverlay","shouldPresentInteractionOverlay","interactionDefaults","shouldPreferResolvedInteractionInput","getInteractionDefaultValues","interactionDefaultSelectedValues","getInteractionDefaultSelectedValues","hasResolvedInteractionInput","isInteractionReadonly","shouldAutoContinueInteraction","shouldShowInteractionOverlay","handleInteractionSend","resolvedUserInput","prevElement","syncFullscreenState","interactionOverlayElement","updateSubtitleOffset","overlayHeight","resizeObserver","renderSlideElement","options","Fragment","IframeSandbox","renderSlideElementList","isActiveStep","visibleElementCount","lastVisibleElementIndex","lastVisibleIndex","isPreRenderedHtml","cn","handleFullscreen","target","scrollStageToBottom","stageLayerElement","handlePrev","handleNext","handlePlayerLoadingChange","loading","handlePlayerEnded","endedAudioKey","activeSequencePosition","audioSequenceKey","nextSequencePosition","nextStepIndex","nextStepElement","handleInteractionToggle","prevOpen","stopOverlayPropagation","handleSurfacePointerDown","handleSurfaceClick","currentRenderElementKeys","prevKeys","shouldAutoScrollToAppend","key","animationFrameId","targetElement","stageLayerRect","targetRect","nextScrollTop","ChevronLeft","mountedStepStateIndex","LoadingOverlayCard","SlideFullscreenHint","SubtitleOverlay","Player","previousEnabled"],"mappings":"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"}
1
+ {"version":3,"file":"Slide.cjs.js","sources":["../../../src/components/Slide/Slide.tsx"],"sourcesContent":["import React, {\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { ChevronLeft } from \"lucide-react\";\n\nimport { isSandboxInteractionMessage } from \"../../lib/sandboxInteraction\";\nimport { cn } from \"../../lib/utils\";\nimport LoadingOverlayCard from \"../ui/loading-overlay-card\";\nimport ContentRender from \"../ContentRender\";\nimport type { ContentRenderProps } from \"../ContentRender/ContentRender\";\nimport IframeSandbox from \"../ContentRender/IframeSandbox\";\nimport type { OnSendContentParams } from \"../types\";\nimport {\n getInteractionDefaultSelectedValues,\n getInteractionDefaultValues,\n type InteractionDefaultValueOptions,\n} from \"../../lib/interaction-defaults\";\nimport {\n isLandscapeViewport as getIsFullscreenPreferredViewport,\n isMobileDevice as getIsMobileDevice,\n subscribeMobileDeviceChange,\n} from \"../../lib/mobileDevice\";\nimport Player from \"./Player\";\nimport SubtitleOverlay from \"./SubtitleOverlay\";\nimport type { PlayerProps, SlidePlayerTexts } from \"./Player\";\nimport {\n DEFAULT_SLIDE_PLAYER_TEXTS,\n DEFAULT_STREAM_INACTIVITY_TIMEOUT_MS,\n SLIDE_ERROR_CODES,\n} from \"./constants\";\nimport SlideFullscreenHint from \"./SlideFullscreenHint\";\nimport type { Element } from \"./types\";\nimport useSlide from \"./useSlide\";\nimport useWakePlayerFromIframe from \"./useWakePlayerFromIframe\";\nimport {\n DEFAULT_MOBILE_VIEW_MODE,\n resolveMobileViewModeState,\n type MobileViewMode,\n} from \"./utils/mobileScreenMode\";\nimport { shouldPresentInteractionOverlay } from \"./utils/interactionPlayback\";\nimport { shouldAutoAdvanceIntoAppendedMarker } from \"./utils/appendedMarkerAdvance\";\nimport { getPlaybackSequenceTransition } from \"./utils/playbackSequence\";\nimport {\n getPlayerCustomActionCount,\n resolvePlayerCustomActionElement,\n} from \"./utils/playerCustomActions\";\nimport { createPlaybackTimeStore } from \"./utils/playbackTimeStore\";\nimport { shouldUseAutoAdvanceToggle } from \"./utils/playerToggleMode\";\nimport \"./slide.css\";\nexport type {\n Element,\n ElementAudioSegment,\n ElementSubtitleCue,\n SlidePlayerCustomActionContext,\n SlidePlayerCustomActions,\n} from \"./types\";\n\nconst DEFAULT_MARKER_AUTO_ADVANCE_DELAY_MS = 2000;\nconst DEFAULT_INTERACTION_OVERLAY_OPEN_DELAY_MS = 300;\nconst DEFAULT_INTERACTION_OVERLAY_FALLBACK_OFFSET_PX = 160;\nconst DEFAULT_INTERACTION_SUBTITLE_GAP_PX = 16;\n\ntype RenderSlideElementOptions = {\n replaceRootScreenHeightWithFull?: boolean;\n};\n\ninterface InteractionOverlayCardProps {\n content: string;\n title: string;\n defaultButtonText?: string;\n defaultInputText?: string;\n defaultSelectedValues?: string[];\n confirmButtonText?: string;\n copyButtonText?: string;\n copiedButtonText?: string;\n onSend?: (content: OnSendContentParams) => void;\n readonly?: boolean;\n}\n\nexport interface SlideInteractionTexts\n extends Pick<\n ContentRenderProps,\n \"confirmButtonText\" | \"copyButtonText\" | \"copiedButtonText\"\n > {\n title?: string;\n}\n\nexport type SlideErrorCode =\n (typeof SLIDE_ERROR_CODES)[keyof typeof SLIDE_ERROR_CODES];\n\nexport interface SlideErrorContext {\n code: SlideErrorCode;\n setBufferingLoadingVisible: (visible: boolean) => void;\n}\n\nexport type SlideFullscreenHeader = {\n content?: React.ReactNode;\n backAriaLabel?: string;\n onBack?: () => void;\n};\n\nconst InteractionOverlayCard = memo(\n ({\n content,\n title,\n defaultButtonText,\n defaultInputText,\n defaultSelectedValues,\n confirmButtonText,\n copyButtonText,\n copiedButtonText,\n onSend,\n readonly = false,\n }: InteractionOverlayCardProps) => (\n <div className=\"slide-player__interaction-card\">\n <div className=\"slide-player__interaction-header\">\n <p className=\"slide-player__interaction-title\">{title}</p>\n </div>\n <div className=\"slide-player__interaction-body\">\n <ContentRender\n content={content}\n defaultButtonText={defaultButtonText}\n defaultInputText={defaultInputText}\n defaultSelectedValues={defaultSelectedValues}\n confirmButtonText={confirmButtonText}\n copyButtonText={copyButtonText}\n copiedButtonText={copiedButtonText}\n onSend={onSend}\n readonly={readonly}\n enableTypewriter={false}\n sandboxMode=\"content\"\n />\n </div>\n </div>\n )\n);\n\nInteractionOverlayCard.displayName = \"InteractionOverlayCard\";\n\nconst areStepElementListsEqual = (\n prevElementList: Element[],\n nextElementList: Element[]\n) =>\n prevElementList.length === nextElementList.length &&\n prevElementList.every((element, index) => {\n const nextElement = nextElementList[index];\n\n return (\n element.sequence_number === nextElement?.sequence_number &&\n element.type === nextElement?.type &&\n element.content === nextElement?.content\n );\n });\n\nconst getStreamContentActivityKey = (content: Element[\"content\"]) => {\n if (typeof content === \"string\") {\n return `string:${content.length}:${content.slice(-32)}`;\n }\n\n if (typeof content === \"number\" || typeof content === \"boolean\") {\n return `primitive:${String(content)}`;\n }\n\n if (React.isValidElement(content)) {\n return `element:${String(content.key ?? \"\")}`;\n }\n\n if (Array.isArray(content)) {\n return `array:${content.length}`;\n }\n\n if (content == null) {\n return \"null\";\n }\n\n return `object:${typeof content}`;\n};\n\nconst getStreamAudioSegmentsActivityKey = (\n audioSegments: Element[\"audio_segments\"]\n) =>\n (audioSegments ?? [])\n .map((segment) =>\n [\n String(segment.segment_index ?? \"none\"),\n segment.is_final ? \"1\" : \"0\",\n String(segment.duration_ms ?? 0),\n String(segment.audio_url ?? \"\"),\n String(segment.audio_data?.length ?? 0),\n ].join(\":\")\n )\n .join(\",\");\n\nconst getStreamActivityKey = (elementList: Element[]) =>\n elementList\n .map((element, index) =>\n [\n String(element.sequence_number ?? index),\n String(element.type),\n getStreamContentActivityKey(element.content),\n String(element.audio_url ?? \"\"),\n getStreamAudioSegmentsActivityKey(element.audio_segments),\n element.is_renderable === false ? \"hidden\" : \"visible\",\n element.is_new ? \"new\" : \"stable\",\n element.is_speakable ? \"speakable\" : \"silent\",\n String(element.user_input ?? \"\"),\n element.readonly ? \"readonly\" : \"editable\",\n ].join(\"|\")\n )\n .join(\"||\");\n\nexport interface SlideProps extends React.ComponentProps<\"section\"> {\n elementList?: Element[];\n isStreaming?: boolean;\n showPlayer?: boolean;\n playerAlwaysVisible?: boolean;\n playerClassName?: string;\n fullscreenHeader?: SlideFullscreenHeader;\n playerCustomActions?: PlayerProps[\"customActions\"];\n playerCustomActionPauseOnActive?: boolean;\n bufferingText?: string;\n interactionTitle?: string;\n interactionTexts?: SlideInteractionTexts;\n playerTexts?: SlidePlayerTexts;\n playerAutoHideDelay?: number;\n markerAutoAdvanceDelay?: number;\n streamInactivityTimeoutMs?: number;\n interactionDefaultValueOptions?: InteractionDefaultValueOptions;\n onSend?: (content: OnSendContentParams, element?: Element) => void;\n onPlayerVisibilityChange?: (visible: boolean) => void;\n onMobileViewModeChange?: (viewMode: MobileViewMode) => void;\n onError?: (error: SlideErrorContext) => void;\n onStepChange?: (element: Element | undefined, index: number) => void;\n enableIframeScaling?: boolean;\n}\n\nconst Slide: React.FC<SlideProps> = ({\n elementList = [],\n isStreaming = false,\n showPlayer = true,\n playerAlwaysVisible = false,\n playerClassName,\n fullscreenHeader,\n playerCustomActions,\n playerCustomActionPauseOnActive = true,\n bufferingText = \"Buffering...\",\n interactionTitle,\n interactionTexts,\n playerTexts,\n playerAutoHideDelay = 3000,\n markerAutoAdvanceDelay = DEFAULT_MARKER_AUTO_ADVANCE_DELAY_MS,\n streamInactivityTimeoutMs = DEFAULT_STREAM_INACTIVITY_TIMEOUT_MS,\n interactionDefaultValueOptions,\n onSend,\n onPlayerVisibilityChange,\n onMobileViewModeChange,\n onError,\n onStepChange,\n enableIframeScaling = true,\n className,\n onPointerDown,\n ...props\n}) => {\n const sectionRef = useRef<HTMLElement | null>(null);\n const viewportRef = useRef<HTMLDivElement | null>(null);\n const stageLayerRef = useRef<HTMLDivElement | null>(null);\n const lastElementRef = useRef<HTMLDivElement | null>(null);\n const playerHideTimerRef = useRef<number | null>(null);\n const autoAdvanceTimerRef = useRef<number | null>(null);\n const interactionAutoCloseTimerRef = useRef<number | null>(null);\n const interactionOverlayOpenTimerRef = useRef<number | null>(null);\n const streamInactivityTimerRef = useRef<number | null>(null);\n const interactionOverlayRef = useRef<HTMLDivElement | null>(null);\n const prevRenderElementKeysRef = useRef<string[]>([]);\n const lastStreamActivityKeyRef = useRef<string | null>(null);\n const shouldScrollToBottomRef = useRef(false);\n const hasStreamStartedRef = useRef(false);\n const hasStreamInactivityTimedOutRef = useRef(false);\n const pendingInteractionOverlayStepIndexRef = useRef<number | null>(null);\n const playbackResetKeyRef = useRef<string | null>(null);\n const appendedMarkerAdvanceStateRef = useRef({\n markerCount: 0,\n currentIndex: -1,\n canGoNext: false,\n });\n const {\n currentElementList,\n stepElementLists,\n slideElementList,\n currentIndex,\n audioList,\n currentAudioSequenceIndexes,\n currentStepHasSpeakableElement,\n currentInteractionElement,\n canGoPrev,\n canGoNext,\n handlePrev: goPrev,\n handleNext: goNext,\n } = useSlide(elementList);\n const currentStepElement = useMemo(() => {\n if (currentIndex < 0) {\n return undefined;\n }\n\n return slideElementList[currentIndex];\n }, [currentIndex, slideElementList]);\n const visibleMarkerCount = slideElementList.filter(\n (element) => element.is_renderable !== false\n ).length;\n const isSingleSlide = visibleMarkerCount === 1;\n const shouldRenderPlayer =\n showPlayer &&\n (slideElementList.length > 0 ||\n audioList.length > 0 ||\n Boolean(currentInteractionElement));\n const currentAudioSequenceKeys = useMemo(\n () =>\n currentAudioSequenceIndexes\n .map((audioIndex) => audioList[audioIndex]?.audioKey)\n .filter((audioKey): audioKey is string => Boolean(audioKey)),\n [audioList, currentAudioSequenceIndexes]\n );\n const [isPlayerVisible, setIsPlayerVisible] = useState(true);\n const [hasPlayerInteracted, setHasPlayerInteracted] = useState(false);\n const [isAutoAdvanceEnabled, setIsAutoAdvanceEnabled] = useState(true);\n const [currentAudioKey, setCurrentAudioKey] = useState<string | null>(null);\n const [isAudioLoadingVisible, setIsAudioLoadingVisible] = useState(false);\n const [hasStreamInactivityTimedOut, setHasStreamInactivityTimedOut] =\n useState(false);\n const [hasCompletedCurrentStepAudio, setHasCompletedCurrentStepAudio] =\n useState(false);\n const [hasCurrentAudioPlaybackStarted, setHasCurrentAudioPlaybackStarted] =\n useState(false);\n const [isSubtitleEnabled, setIsSubtitleEnabled] = useState(true);\n const [isPlayerCustomActionActive, setIsPlayerCustomActionActive] =\n useState(false);\n const [activeInteractionElement, setActiveInteractionElement] = useState<\n Element | undefined\n >();\n const [isInteractionOverlayOpen, setIsInteractionOverlayOpen] =\n useState(false);\n const [\n interactionOverlaySubtitleOffset,\n setInteractionOverlaySubtitleOffset,\n ] = useState(0);\n const [isBrowserFullscreen, setIsBrowserFullscreen] = useState(false);\n const isMobileDevice = useMemo(() => getIsMobileDevice(), []);\n const [mobileViewMode, setMobileViewMode] = useState<MobileViewMode>(\n DEFAULT_MOBILE_VIEW_MODE\n );\n const [hasManualMobileViewMode, setHasManualMobileViewMode] = useState(false);\n const [isViewportFullscreenPreferred, setIsViewportFullscreenPreferred] =\n useState(() =>\n isMobileDevice ? getIsFullscreenPreferredViewport() : false\n );\n const [isFullscreenHintOpen, setIsFullscreenHintOpen] = useState(false);\n const playbackTimeStore = useMemo(() => createPlaybackTimeStore(), []);\n const {\n effectiveMobileViewMode,\n isImmersiveMobileFullscreen,\n isNativeMobileFullscreen,\n shouldRotateFullscreenViewport,\n } = useMemo(\n () =>\n resolveMobileViewModeState({\n hasManualMobileViewMode,\n isMobileDevice,\n isViewportFullscreenPreferred,\n mobileViewMode,\n }),\n [\n hasManualMobileViewMode,\n isMobileDevice,\n isViewportFullscreenPreferred,\n mobileViewMode,\n ]\n );\n const previousEffectiveMobileViewModeRef = useRef(effectiveMobileViewMode);\n const playerVisible =\n shouldRenderPlayer && (playerAlwaysVisible || isPlayerVisible);\n const shouldShowFullscreenHeader =\n isImmersiveMobileFullscreen && playerVisible;\n const shouldApplyFullscreenViewportPadding =\n isImmersiveMobileFullscreen && playerVisible;\n const shouldShowMobileFullscreenMask =\n isImmersiveMobileFullscreen || isNativeMobileFullscreen;\n const fullscreenHintText =\n playerTexts?.fullscreenHintText ??\n DEFAULT_SLIDE_PLAYER_TEXTS.fullscreenHintText;\n const streamActivityKey = useMemo(\n () => getStreamActivityKey(elementList),\n [elementList]\n );\n const updateAudioLoadingVisibility = useCallback(\n (\n nextVisible: boolean,\n reason: string,\n detail?: Record<string, unknown>\n ) => {\n void reason;\n void detail;\n setIsAudioLoadingVisible(nextVisible);\n },\n []\n );\n const setBufferingLoadingVisible = useCallback(\n (visible: boolean) => {\n updateAudioLoadingVisibility(\n visible,\n visible ? \"external-show-buffering\" : \"external-hide-buffering\"\n );\n },\n [updateAudioLoadingVisibility]\n );\n const handleMobileViewModeSelect = useCallback(\n (nextViewMode: MobileViewMode) => {\n setHasManualMobileViewMode(true);\n setMobileViewMode(nextViewMode);\n },\n []\n );\n const handleMobileViewModeReset = useCallback(() => {\n // Clear manual override so the effective mode returns to the default non-fullscreen state.\n setHasManualMobileViewMode(false);\n setMobileViewMode(DEFAULT_MOBILE_VIEW_MODE);\n }, []);\n const handleFullscreenHeaderBack = useCallback(() => {\n handleMobileViewModeReset();\n fullscreenHeader?.onBack?.();\n }, [fullscreenHeader, handleMobileViewModeReset]);\n const handleFullscreenHintClose = useCallback(() => {\n setIsFullscreenHintOpen(false);\n }, []);\n const setPlayerCustomActionActive = useCallback((active: boolean) => {\n setIsPlayerCustomActionActive(active);\n }, []);\n const togglePlayerCustomActionActive = useCallback(() => {\n setIsPlayerCustomActionActive((previous) => !previous);\n }, []);\n const { mountedStepStates, currentMountedStateIndex } = useMemo(() => {\n const nextMountedStepStates: Array<{\n elementList: Element[];\n sourceStepIndexes: number[];\n }> = [];\n const mountedStateIndexByStep = new Map<number, number>();\n\n stepElementLists.forEach((stepElementList, stepIndex) => {\n const existingMountedStateIndex = nextMountedStepStates.findIndex(\n (mountedStepState) =>\n areStepElementListsEqual(\n mountedStepState.elementList,\n stepElementList\n )\n );\n\n if (existingMountedStateIndex >= 0) {\n nextMountedStepStates[\n existingMountedStateIndex\n ]?.sourceStepIndexes.push(stepIndex);\n mountedStateIndexByStep.set(stepIndex, existingMountedStateIndex);\n return;\n }\n\n nextMountedStepStates.push({\n elementList: stepElementList,\n sourceStepIndexes: [stepIndex],\n });\n mountedStateIndexByStep.set(stepIndex, nextMountedStepStates.length - 1);\n });\n\n return {\n mountedStepStates: nextMountedStepStates,\n currentMountedStateIndex:\n currentIndex >= 0\n ? (mountedStateIndexByStep.get(currentIndex) ?? -1)\n : -1,\n };\n }, [currentIndex, stepElementLists]);\n const currentStepKey = useMemo(() => String(currentIndex), [currentIndex]);\n const currentAudioIndex = useMemo(() => {\n if (!currentAudioKey) {\n return -1;\n }\n\n return audioList.findIndex(\n (audioItem) => (audioItem.audioKey ?? \"\") === currentAudioKey\n );\n }, [audioList, currentAudioKey]);\n const currentAudioItem = useMemo(\n () => (currentAudioIndex >= 0 ? audioList[currentAudioIndex] : undefined),\n [audioList, currentAudioIndex]\n );\n const currentSubtitleCues = currentAudioItem?.element?.subtitle_cues ?? [];\n const currentAudioSequenceStartKey = useMemo(\n () => currentAudioSequenceKeys[0] ?? \"none\",\n [currentAudioSequenceKeys]\n );\n const playerCustomActionContext = useMemo(\n () => ({\n currentElement: resolvePlayerCustomActionElement({\n currentAudioIndex,\n currentAudioSequenceIndexes,\n audioList,\n currentInteractionElement: activeInteractionElement,\n currentStepElement,\n }),\n currentIndex,\n currentStepElement,\n isActive: isPlayerCustomActionActive,\n setActive: setPlayerCustomActionActive,\n toggleActive: togglePlayerCustomActionActive,\n }),\n [\n activeInteractionElement,\n audioList,\n currentAudioIndex,\n currentAudioSequenceIndexes,\n currentIndex,\n currentStepElement,\n isPlayerCustomActionActive,\n setPlayerCustomActionActive,\n togglePlayerCustomActionActive,\n ]\n );\n const playerCustomActionCount = useMemo(\n () =>\n getPlayerCustomActionCount(\n playerCustomActions,\n playerCustomActionContext\n ),\n [playerCustomActionContext, playerCustomActions]\n );\n const interactionOverlayStyle = useMemo(\n () =>\n ({\n \"--slide-player-custom-action-count\": String(playerCustomActionCount),\n \"--slide-player-mobile-control-count\": String(\n playerCustomActionCount + 4\n ),\n }) as React.CSSProperties,\n [playerCustomActionCount]\n );\n const hasAvailableStepAudio = currentAudioSequenceKeys.length > 0;\n const currentInteractionResetKey = useMemo(() => {\n if (!currentInteractionElement) {\n return \"none\";\n }\n\n return `${currentInteractionElement.sequence_number ?? \"none\"}:${String(\n currentInteractionElement.content ?? \"\"\n )}`;\n }, [currentInteractionElement]);\n const currentPlaybackResetKey = useMemo(\n () => [currentStepKey, currentInteractionResetKey].join(\"|\"),\n [currentInteractionResetKey, currentStepKey]\n );\n const currentPlaybackStartedResetKey = useMemo(\n () =>\n [\n currentPlaybackResetKey,\n currentAudioItem?.audioKey ?? \"none\",\n String(currentAudioIndex),\n ].join(\"|\"),\n [currentAudioIndex, currentAudioItem?.audioKey, currentPlaybackResetKey]\n );\n const currentStepAudioUrl = useMemo(() => {\n if (\n !currentAudioSequenceStartKey ||\n currentAudioSequenceStartKey === \"none\"\n ) {\n return \"\";\n }\n\n const currentStepAudioItem = audioList.find(\n (audioItem) => audioItem.audioKey === currentAudioSequenceStartKey\n );\n\n return currentStepAudioItem?.audioUrl?.trim() ?? \"\";\n }, [audioList, currentAudioSequenceStartKey]);\n const hasCurrentStepAudioUrl = Boolean(currentStepAudioUrl);\n const shouldPausePlaybackForCustomAction =\n playerCustomActionPauseOnActive &&\n Boolean(playerCustomActions) &&\n isPlayerCustomActionActive;\n const shouldUseSilentStepAutoAdvanceToggle = useMemo(\n () =>\n shouldUseAutoAdvanceToggle({\n canGoNext,\n currentAudioIndex,\n currentStepHasSpeakableElement,\n hasInteraction: Boolean(currentInteractionElement),\n }),\n [\n canGoNext,\n currentAudioIndex,\n currentInteractionElement,\n currentStepHasSpeakableElement,\n ]\n );\n\n const clearPlayerHideTimer = useCallback(() => {\n if (playerHideTimerRef.current === null) {\n return;\n }\n\n window.clearTimeout(playerHideTimerRef.current);\n playerHideTimerRef.current = null;\n }, []);\n\n const clearInteractionAutoCloseTimer = useCallback(() => {\n if (interactionAutoCloseTimerRef.current === null) {\n return;\n }\n\n window.clearTimeout(interactionAutoCloseTimerRef.current);\n interactionAutoCloseTimerRef.current = null;\n }, []);\n\n const clearInteractionOverlayOpenTimer = useCallback(() => {\n if (interactionOverlayOpenTimerRef.current === null) {\n return;\n }\n\n window.clearTimeout(interactionOverlayOpenTimerRef.current);\n interactionOverlayOpenTimerRef.current = null;\n }, []);\n\n const clearAutoAdvanceTimer = useCallback(() => {\n if (autoAdvanceTimerRef.current === null) {\n return;\n }\n\n window.clearTimeout(autoAdvanceTimerRef.current);\n autoAdvanceTimerRef.current = null;\n }, []);\n\n const clearStreamInactivityTimer = useCallback(() => {\n if (streamInactivityTimerRef.current === null) {\n return;\n }\n\n window.clearTimeout(streamInactivityTimerRef.current);\n streamInactivityTimerRef.current = null;\n }, []);\n\n const resetAudioSequence = useCallback(() => {\n clearAutoAdvanceTimer();\n clearInteractionAutoCloseTimer();\n clearInteractionOverlayOpenTimer();\n setCurrentAudioKey(null);\n playbackTimeStore.reset();\n updateAudioLoadingVisibility(false, \"reset-audio-sequence\");\n setHasCompletedCurrentStepAudio(false);\n setHasCurrentAudioPlaybackStarted(false);\n setActiveInteractionElement(undefined);\n setIsInteractionOverlayOpen(false);\n setInteractionOverlaySubtitleOffset(0);\n }, [\n clearAutoAdvanceTimer,\n clearInteractionAutoCloseTimer,\n clearInteractionOverlayOpenTimer,\n playbackTimeStore,\n updateAudioLoadingVisibility,\n ]);\n\n const startCurrentAudioSequence = useCallback(() => {\n const nextAudioKey = currentAudioSequenceKeys[0];\n\n if (!nextAudioKey) {\n return false;\n }\n\n // Start the first audio segment for the current step immediately.\n setCurrentAudioKey(nextAudioKey);\n return true;\n }, [currentAudioSequenceKeys]);\n\n const continueAfterInteraction = useCallback(() => {\n clearInteractionAutoCloseTimer();\n clearInteractionOverlayOpenTimer();\n setIsInteractionOverlayOpen(false);\n setInteractionOverlaySubtitleOffset(0);\n\n if (startCurrentAudioSequence()) {\n return;\n }\n\n if (canGoNext) {\n goNext();\n }\n }, [\n canGoNext,\n clearInteractionAutoCloseTimer,\n clearInteractionOverlayOpenTimer,\n goNext,\n startCurrentAudioSequence,\n ]);\n\n const scheduleInteractionOverlayOpen = useCallback(\n (interactionElement?: Element) => {\n clearInteractionOverlayOpenTimer();\n\n if (!interactionElement) {\n return;\n }\n\n const openOverlay = () => {\n interactionOverlayOpenTimerRef.current = null;\n setInteractionOverlaySubtitleOffset(\n DEFAULT_INTERACTION_OVERLAY_FALLBACK_OFFSET_PX\n );\n setIsInteractionOverlayOpen(true);\n pendingInteractionOverlayStepIndexRef.current = null;\n };\n\n interactionOverlayOpenTimerRef.current = window.setTimeout(\n openOverlay,\n DEFAULT_INTERACTION_OVERLAY_OPEN_DELAY_MS\n );\n },\n [clearInteractionOverlayOpenTimer]\n );\n\n const showPlayerControls = useCallback(\n (enableAutoHide = hasPlayerInteracted) => {\n if (!shouldRenderPlayer) {\n return;\n }\n\n setIsPlayerVisible(true);\n clearPlayerHideTimer();\n\n if (playerAlwaysVisible || !enableAutoHide || playerAutoHideDelay <= 0) {\n return;\n }\n\n playerHideTimerRef.current = window.setTimeout(() => {\n setIsPlayerVisible(false);\n playerHideTimerRef.current = null;\n }, playerAutoHideDelay);\n },\n [\n clearPlayerHideTimer,\n hasPlayerInteracted,\n playerAlwaysVisible,\n playerAutoHideDelay,\n shouldRenderPlayer,\n ]\n );\n\n const hasResolvedCurrentInteraction = Boolean(\n currentInteractionElement?.readonly ||\n currentInteractionElement?.user_input?.trim()\n );\n\n const shouldBlockPlaybackForInteraction =\n Boolean(currentInteractionElement) && !hasResolvedCurrentInteraction;\n\n useEffect(() => {\n // Reset silent-step autoplay toggle whenever navigation lands on a new step.\n setIsAutoAdvanceEnabled(true);\n\n if (playerCustomActionPauseOnActive) {\n setIsPlayerCustomActionActive(false);\n }\n }, [currentIndex, playerCustomActionPauseOnActive]);\n\n useEffect(() => {\n return () => {\n clearAutoAdvanceTimer();\n clearPlayerHideTimer();\n clearInteractionAutoCloseTimer();\n clearInteractionOverlayOpenTimer();\n clearStreamInactivityTimer();\n };\n }, [\n clearAutoAdvanceTimer,\n clearInteractionAutoCloseTimer,\n clearInteractionOverlayOpenTimer,\n clearPlayerHideTimer,\n clearStreamInactivityTimer,\n ]);\n\n useEffect(() => {\n if (!isStreaming || streamInactivityTimeoutMs <= 0) {\n clearStreamInactivityTimer();\n lastStreamActivityKeyRef.current = null;\n hasStreamStartedRef.current = false;\n hasStreamInactivityTimedOutRef.current = false;\n setHasStreamInactivityTimedOut(false);\n return;\n }\n\n const hasStreamingStarted = !hasStreamStartedRef.current;\n const hasStreamActivityChanged =\n lastStreamActivityKeyRef.current !== streamActivityKey;\n\n hasStreamStartedRef.current = true;\n\n if (hasStreamingStarted || hasStreamActivityChanged) {\n lastStreamActivityKeyRef.current = streamActivityKey;\n\n if (hasStreamInactivityTimedOutRef.current) {\n hasStreamInactivityTimedOutRef.current = false;\n setHasStreamInactivityTimedOut(false);\n }\n }\n\n clearStreamInactivityTimer();\n\n streamInactivityTimerRef.current = window.setTimeout(() => {\n streamInactivityTimerRef.current = null;\n\n if (hasStreamInactivityTimedOutRef.current) {\n return;\n }\n\n hasStreamInactivityTimedOutRef.current = true;\n setHasStreamInactivityTimedOut(true);\n updateAudioLoadingVisibility(false, \"stream-inactivity-timeout\");\n onError?.({\n code: SLIDE_ERROR_CODES.STREAM_INACTIVITY_TIMEOUT,\n setBufferingLoadingVisible,\n });\n }, streamInactivityTimeoutMs);\n\n return () => {\n clearStreamInactivityTimer();\n };\n }, [\n clearStreamInactivityTimer,\n isStreaming,\n onError,\n setBufferingLoadingVisible,\n streamActivityKey,\n streamInactivityTimeoutMs,\n updateAudioLoadingVisibility,\n ]);\n\n useEffect(() => {\n onPlayerVisibilityChange?.(playerVisible);\n\n return () => {\n onPlayerVisibilityChange?.(false);\n };\n }, [onPlayerVisibilityChange, playerVisible]);\n\n useEffect(() => {\n if (isMobileDevice || mobileViewMode === DEFAULT_MOBILE_VIEW_MODE) {\n return;\n }\n\n setHasManualMobileViewMode(false);\n setMobileViewMode(DEFAULT_MOBILE_VIEW_MODE);\n }, [isMobileDevice, mobileViewMode]);\n\n useEffect(() => {\n if (!isMobileDevice) {\n setIsViewportFullscreenPreferred(false);\n return;\n }\n\n const syncViewportFullscreenPreference = () => {\n setIsViewportFullscreenPreferred(getIsFullscreenPreferredViewport());\n };\n\n syncViewportFullscreenPreference();\n\n return subscribeMobileDeviceChange(syncViewportFullscreenPreference);\n }, [isMobileDevice]);\n\n useEffect(() => {\n onMobileViewModeChange?.(effectiveMobileViewMode);\n }, [effectiveMobileViewMode, onMobileViewModeChange]);\n\n useEffect(() => {\n const previousMode = previousEffectiveMobileViewModeRef.current;\n const hasEnteredFullscreen =\n previousMode !== \"fullscreen\" && effectiveMobileViewMode === \"fullscreen\";\n const shouldShowFullscreenHint =\n hasEnteredFullscreen && !isViewportFullscreenPreferred;\n\n previousEffectiveMobileViewModeRef.current = effectiveMobileViewMode;\n\n if (!isMobileDevice) {\n setIsFullscreenHintOpen(false);\n return;\n }\n\n if (shouldShowFullscreenHint) {\n setIsFullscreenHintOpen(true);\n return;\n }\n\n if (effectiveMobileViewMode !== \"fullscreen\") {\n setIsFullscreenHintOpen(false);\n }\n }, [effectiveMobileViewMode, isMobileDevice, isViewportFullscreenPreferred]);\n\n useEffect(() => {\n onStepChange?.(currentStepElement, currentIndex);\n }, [currentIndex, currentStepElement, onStepChange]);\n\n useEffect(() => {\n const previousState = appendedMarkerAdvanceStateRef.current;\n const shouldAdvanceIntoAppendedMarker = shouldAutoAdvanceIntoAppendedMarker(\n {\n previousMarkerCount: previousState.markerCount,\n nextMarkerCount: slideElementList.length,\n previousIndex: previousState.currentIndex,\n previousCanGoNext: previousState.canGoNext,\n nextCanGoNext: canGoNext,\n currentAudioKey,\n hasCompletedCurrentStepAudio,\n hasResolvedCurrentInteraction,\n currentStepHasSpeakableElement,\n currentInteractionElement,\n isAutoAdvanceEnabled,\n shouldUseSilentStepAutoAdvanceToggle,\n }\n );\n\n appendedMarkerAdvanceStateRef.current = {\n markerCount: slideElementList.length,\n currentIndex,\n canGoNext,\n };\n\n if (!shouldAdvanceIntoAppendedMarker) {\n return;\n }\n\n goNext();\n }, [\n canGoNext,\n currentAudioKey,\n currentIndex,\n currentInteractionElement,\n currentStepHasSpeakableElement,\n goNext,\n hasCompletedCurrentStepAudio,\n hasResolvedCurrentInteraction,\n isAutoAdvanceEnabled,\n shouldUseSilentStepAutoAdvanceToggle,\n slideElementList.length,\n ]);\n\n useEffect(() => {\n if (!shouldRenderPlayer) {\n clearPlayerHideTimer();\n setIsPlayerVisible(false);\n return;\n }\n\n if (playerAlwaysVisible) {\n clearPlayerHideTimer();\n setIsPlayerVisible(true);\n return;\n }\n\n if (!hasPlayerInteracted) {\n // Keep the initial player visible briefly, then hide it automatically.\n showPlayerControls(true);\n }\n }, [\n clearPlayerHideTimer,\n hasPlayerInteracted,\n playerAlwaysVisible,\n shouldRenderPlayer,\n showPlayerControls,\n ]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const handleSandboxInteraction = (event: MessageEvent) => {\n if (event.origin !== window.location.origin) {\n return;\n }\n\n if (!isSandboxInteractionMessage(event.data)) {\n return;\n }\n\n if (event.data.eventType !== \"click\") {\n return;\n }\n\n if (!shouldRenderPlayer) {\n return;\n }\n\n // Restore player controls on explicit click/tap without waking on scroll start.\n setHasPlayerInteracted(true);\n showPlayerControls(true);\n };\n\n window.addEventListener(\"message\", handleSandboxInteraction);\n\n return () => {\n window.removeEventListener(\"message\", handleSandboxInteraction);\n };\n }, [shouldRenderPlayer, showPlayerControls]);\n\n useWakePlayerFromIframe({\n sectionRef,\n enabled: shouldRenderPlayer,\n onWake: () => {\n setHasPlayerInteracted(true);\n showPlayerControls(true);\n },\n });\n\n useEffect(() => {\n const { hasPlaybackContextChanged, shouldInitializeAudioSequence } =\n getPlaybackSequenceTransition({\n previousResetKey: playbackResetKeyRef.current,\n nextResetKey: currentPlaybackResetKey,\n currentAudioKey,\n hasCompletedCurrentStepAudio,\n });\n\n playbackResetKeyRef.current = currentPlaybackResetKey;\n\n const shouldOpenInteractionOverlayAfterAudio =\n pendingInteractionOverlayStepIndexRef.current === currentIndex &&\n Boolean(currentInteractionElement);\n const shouldPresentOverlay = shouldPresentInteractionOverlay({\n hasInteraction: Boolean(currentInteractionElement),\n shouldBlockPlaybackForInteraction,\n shouldOpenInteractionOverlayAfterAudio,\n hasPlaybackContextChanged,\n hasResolvedCurrentInteraction,\n currentStepHasSpeakableElement,\n });\n\n if (hasPlaybackContextChanged) {\n resetAudioSequence();\n }\n\n if (currentElementList.length === 0 && !currentInteractionElement) {\n return;\n }\n\n if (shouldPausePlaybackForCustomAction) {\n return;\n }\n\n if (currentInteractionElement) {\n setActiveInteractionElement(currentInteractionElement);\n }\n\n if (shouldPresentOverlay) {\n // Delay auto-presenting the overlay so subtitles can settle above it.\n scheduleInteractionOverlayOpen(currentInteractionElement);\n return;\n }\n\n clearInteractionOverlayOpenTimer();\n pendingInteractionOverlayStepIndexRef.current = null;\n\n if (!shouldInitializeAudioSequence) {\n return;\n }\n\n if (startCurrentAudioSequence()) {\n return;\n }\n\n if (currentStepHasSpeakableElement) {\n if (hasStreamInactivityTimedOut) {\n updateAudioLoadingVisibility(\n false,\n \"step-wait-suppressed-after-timeout\"\n );\n return;\n }\n\n updateAudioLoadingVisibility(true, \"step-waiting-for-first-audio\");\n return;\n }\n\n if (!canGoNext) {\n return;\n }\n\n if (shouldUseSilentStepAutoAdvanceToggle && !isAutoAdvanceEnabled) {\n return;\n }\n\n // Auto-advance silent marker-only steps so playback flow does not stall.\n autoAdvanceTimerRef.current = window.setTimeout(() => {\n autoAdvanceTimerRef.current = null;\n goNext();\n }, markerAutoAdvanceDelay);\n\n return () => {\n clearAutoAdvanceTimer();\n };\n }, [\n canGoNext,\n clearAutoAdvanceTimer,\n currentElementList.length,\n currentInteractionElement,\n currentAudioKey,\n currentPlaybackResetKey,\n currentStepHasSpeakableElement,\n markerAutoAdvanceDelay,\n goNext,\n hasCompletedCurrentStepAudio,\n hasStreamInactivityTimedOut,\n isAutoAdvanceEnabled,\n hasResolvedCurrentInteraction,\n shouldBlockPlaybackForInteraction,\n clearInteractionOverlayOpenTimer,\n resetAudioSequence,\n scheduleInteractionOverlayOpen,\n startCurrentAudioSequence,\n shouldPausePlaybackForCustomAction,\n shouldUseSilentStepAutoAdvanceToggle,\n updateAudioLoadingVisibility,\n ]);\n\n useEffect(() => {\n if (\n hasStreamInactivityTimedOut ||\n shouldPausePlaybackForCustomAction ||\n !currentStepHasSpeakableElement ||\n shouldBlockPlaybackForInteraction\n ) {\n updateAudioLoadingVisibility(false, \"loading-hidden-blocked-state\", {\n shouldPausePlaybackForCustomAction,\n shouldBlockPlaybackForInteraction,\n });\n return;\n }\n\n if (hasCompletedCurrentStepAudio) {\n updateAudioLoadingVisibility(\n false,\n \"loading-hidden-step-audio-completed\"\n );\n return;\n }\n\n if (hasAvailableStepAudio) {\n updateAudioLoadingVisibility(false, \"loading-hidden-audio-available\");\n return;\n }\n\n updateAudioLoadingVisibility(true, \"loading-visible-awaiting-step-audio\");\n }, [\n hasStreamInactivityTimedOut,\n hasAvailableStepAudio,\n currentStepHasSpeakableElement,\n hasCompletedCurrentStepAudio,\n shouldPausePlaybackForCustomAction,\n shouldBlockPlaybackForInteraction,\n updateAudioLoadingVisibility,\n ]);\n\n useEffect(() => {\n if (currentAudioKey || currentAudioSequenceKeys.length === 0) {\n return;\n }\n\n if (\n shouldPausePlaybackForCustomAction ||\n !currentStepHasSpeakableElement ||\n shouldBlockPlaybackForInteraction\n ) {\n return;\n }\n\n if (hasCompletedCurrentStepAudio) {\n return;\n }\n\n startCurrentAudioSequence();\n }, [\n currentAudioKey,\n currentAudioSequenceKeys,\n currentStepHasSpeakableElement,\n hasCompletedCurrentStepAudio,\n shouldPausePlaybackForCustomAction,\n shouldBlockPlaybackForInteraction,\n startCurrentAudioSequence,\n ]);\n\n useEffect(() => {\n if (!currentAudioKey || currentAudioIndex >= 0) {\n return;\n }\n\n setCurrentAudioKey(null);\n }, [currentAudioIndex, currentAudioKey]);\n\n useEffect(() => {\n if (currentAudioIndex >= 0) {\n return;\n }\n\n playbackTimeStore.reset();\n }, [currentAudioIndex, playbackTimeStore]);\n\n useEffect(() => {\n setHasCurrentAudioPlaybackStarted(false);\n }, [currentPlaybackStartedResetKey]);\n\n const interactionDefaults = useMemo(() => {\n if (!activeInteractionElement) {\n return {};\n }\n\n const shouldPreferResolvedInteractionInput = Boolean(\n activeInteractionElement.user_input?.trim()\n );\n\n return getInteractionDefaultValues(\n typeof activeInteractionElement.content === \"string\"\n ? activeInteractionElement.content\n : undefined,\n activeInteractionElement.user_input,\n shouldPreferResolvedInteractionInput\n ? undefined\n : interactionDefaultValueOptions\n );\n }, [activeInteractionElement, interactionDefaultValueOptions]);\n\n const interactionDefaultSelectedValues = useMemo(() => {\n if (!activeInteractionElement) {\n return undefined;\n }\n\n const shouldPreferResolvedInteractionInput = Boolean(\n activeInteractionElement.user_input?.trim()\n );\n\n return getInteractionDefaultSelectedValues(\n typeof activeInteractionElement.content === \"string\"\n ? activeInteractionElement.content\n : undefined,\n activeInteractionElement.user_input,\n shouldPreferResolvedInteractionInput\n ? undefined\n : interactionDefaultValueOptions\n );\n }, [activeInteractionElement, interactionDefaultValueOptions]);\n\n const hasResolvedInteractionInput = Boolean(\n activeInteractionElement?.user_input?.trim()\n );\n\n const isInteractionReadonly =\n Boolean(activeInteractionElement?.readonly) || hasResolvedInteractionInput;\n const shouldAutoContinueInteraction =\n isInteractionReadonly || hasResolvedInteractionInput;\n const shouldShowInteractionOverlay =\n Boolean(activeInteractionElement) && isInteractionOverlayOpen;\n\n const handleInteractionSend = useCallback(\n (content: OnSendContentParams) => {\n const submittedValues = [\n ...(content.selectedValues ?? []),\n content.inputText?.trim() ?? \"\",\n content.buttonText?.trim() ?? \"\",\n ].filter(Boolean);\n const resolvedUserInput = submittedValues.join(\", \");\n\n setActiveInteractionElement((prevElement) => {\n if (!prevElement || !resolvedUserInput) {\n return prevElement;\n }\n\n return {\n ...prevElement,\n user_input: resolvedUserInput,\n };\n });\n\n onSend?.(content, activeInteractionElement);\n continueAfterInteraction();\n },\n [activeInteractionElement, continueAfterInteraction, onSend]\n );\n\n useEffect(() => {\n // Keep the player icon in sync with the actual fullscreen owner.\n const syncFullscreenState = () => {\n setIsBrowserFullscreen(document.fullscreenElement === sectionRef.current);\n };\n\n syncFullscreenState();\n document.addEventListener(\"fullscreenchange\", syncFullscreenState);\n\n return () => {\n document.removeEventListener(\"fullscreenchange\", syncFullscreenState);\n };\n }, []);\n\n useEffect(() => {\n if (!shouldShowInteractionOverlay) {\n setInteractionOverlaySubtitleOffset(0);\n return;\n }\n\n const interactionOverlayElement = interactionOverlayRef.current;\n\n if (!interactionOverlayElement) {\n return;\n }\n\n const updateSubtitleOffset = () => {\n const overlayHeight = Math.ceil(\n interactionOverlayElement.getBoundingClientRect().height\n );\n\n setInteractionOverlaySubtitleOffset(\n overlayHeight + DEFAULT_INTERACTION_SUBTITLE_GAP_PX\n );\n };\n\n updateSubtitleOffset();\n\n if (typeof ResizeObserver === \"undefined\") {\n return;\n }\n\n const resizeObserver = new ResizeObserver(() => {\n updateSubtitleOffset();\n });\n\n resizeObserver.observe(interactionOverlayElement);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [shouldShowInteractionOverlay]);\n\n useEffect(() => {\n clearInteractionAutoCloseTimer();\n\n if (!isInteractionOverlayOpen || !shouldAutoContinueInteraction) {\n return;\n }\n\n // Auto-close passive interaction markers to keep playback moving.\n interactionAutoCloseTimerRef.current = window.setTimeout(() => {\n interactionAutoCloseTimerRef.current = null;\n\n continueAfterInteraction();\n }, 2000);\n\n return () => {\n clearInteractionAutoCloseTimer();\n };\n }, [\n clearInteractionAutoCloseTimer,\n continueAfterInteraction,\n isInteractionOverlayOpen,\n shouldAutoContinueInteraction,\n ]);\n\n const renderSlideElement = (\n element?: Element,\n options: RenderSlideElementOptions = {}\n ) => {\n if (!element) {\n return null;\n }\n\n if (element.type === \"slot\") {\n return <>{element.content}</>;\n }\n\n if (element.type === \"html\") {\n return (\n <IframeSandbox\n className=\"content-render-iframe\"\n hideFullScreen\n mode=\"blackboard\"\n replaceRootScreenHeightWithFull={\n options.replaceRootScreenHeightWithFull\n }\n type=\"sandbox\"\n content={element.content as string}\n enableScaling={enableIframeScaling}\n />\n );\n }\n\n return (\n <IframeSandbox\n className=\"content-render-iframe\"\n hideFullScreen\n mode=\"blackboard\"\n type=\"markdown\"\n content={element.content as string}\n />\n );\n };\n\n const renderSlideElementList = (\n elementList: Element[] = [],\n isActiveStep = false\n ) => {\n if (elementList.length === 0) {\n return null;\n }\n\n const visibleElementCount = elementList.filter(\n (element) => element.is_renderable !== false\n ).length;\n const lastVisibleElementIndex = elementList.reduce(\n (lastVisibleIndex, element, index) =>\n element.is_renderable !== false ? index : lastVisibleIndex,\n -1\n );\n\n return (\n <div className=\"slide-stage__content flex w-full flex-col gap-4\">\n {elementList.map((element, index) => {\n const isPreRenderedHtml =\n element.type === \"html\" && element.is_renderable === false;\n\n return (\n <div\n key={element.sequence_number ?? `${element.type}-${index}`}\n ref={\n isActiveStep && index === lastVisibleElementIndex\n ? lastElementRef\n : null\n }\n aria-hidden={isPreRenderedHtml || undefined}\n className={cn(\n \"w-full shrink-0\",\n visibleElementCount === 1 &&\n element.is_renderable !== false &&\n \"slide-element--single\",\n isPreRenderedHtml\n ? \"pointer-events-none fixed left-[-200vw] top-0 -z-10 h-[100dvh] w-[100vw] overflow-hidden opacity-0\"\n : element.is_renderable === false && \"hidden\"\n )}\n >\n {renderSlideElement(element, {\n replaceRootScreenHeightWithFull:\n visibleElementCount === 1 &&\n element.type === \"html\" &&\n element.is_renderable !== false,\n })}\n </div>\n );\n })}\n </div>\n );\n };\n\n const handleFullscreen = useCallback(() => {\n const target = sectionRef.current;\n if (!target) {\n return;\n }\n\n if (document.fullscreenElement === target) {\n document.exitFullscreen().catch(() => {});\n return;\n }\n\n target.requestFullscreen?.().catch(() => {});\n }, []);\n\n const scrollStageToBottom = useCallback(() => {\n const stageLayerElement = stageLayerRef.current;\n\n if (!stageLayerElement) {\n return;\n }\n\n // Keep the latest content visible after manual player navigation.\n stageLayerElement.scrollTo({\n top: stageLayerElement.scrollHeight,\n behavior: \"smooth\",\n });\n }, []);\n\n const handlePrev = useCallback(() => {\n shouldScrollToBottomRef.current = true;\n pendingInteractionOverlayStepIndexRef.current = null;\n setHasPlayerInteracted(true);\n updateAudioLoadingVisibility(false, \"player-prev\");\n showPlayerControls(true);\n resetAudioSequence();\n goPrev();\n }, [\n goPrev,\n resetAudioSequence,\n showPlayerControls,\n updateAudioLoadingVisibility,\n ]);\n\n const handleNext = useCallback(() => {\n shouldScrollToBottomRef.current = true;\n pendingInteractionOverlayStepIndexRef.current = null;\n setHasPlayerInteracted(true);\n updateAudioLoadingVisibility(false, \"player-next\");\n showPlayerControls(true);\n resetAudioSequence();\n goNext();\n }, [\n goNext,\n resetAudioSequence,\n showPlayerControls,\n updateAudioLoadingVisibility,\n ]);\n\n const handlePlayerLoadingChange = useCallback(\n (loading: boolean) => {\n if (\n hasStreamInactivityTimedOut ||\n !currentStepHasSpeakableElement ||\n hasCompletedCurrentStepAudio\n ) {\n updateAudioLoadingVisibility(false, \"player-loading-change-ignored\", {\n loading,\n });\n return;\n }\n\n updateAudioLoadingVisibility(\n loading,\n loading ? \"player-reported-loading\" : \"player-reported-ready\"\n );\n },\n [\n currentStepHasSpeakableElement,\n hasCompletedCurrentStepAudio,\n hasStreamInactivityTimedOut,\n updateAudioLoadingVisibility,\n ]\n );\n\n const handlePlayerEnded = useCallback(\n (audioIndex: number) => {\n const endedAudioKey = audioList[audioIndex]?.audioKey;\n\n if (!endedAudioKey || !currentAudioKey) {\n return;\n }\n\n if (endedAudioKey !== currentAudioKey) {\n return;\n }\n\n const activeSequencePosition = currentAudioSequenceKeys.findIndex(\n (audioSequenceKey) => audioSequenceKey === endedAudioKey\n );\n if (activeSequencePosition < 0) {\n setCurrentAudioKey(null);\n return;\n }\n\n const nextSequencePosition = activeSequencePosition + 1;\n const nextAudioKey = currentAudioSequenceKeys[nextSequencePosition];\n\n if (nextAudioKey) {\n setCurrentAudioKey(nextAudioKey);\n return;\n }\n\n setCurrentAudioKey(null);\n setHasCompletedCurrentStepAudio(true);\n updateAudioLoadingVisibility(false, \"player-ended-step-complete\");\n\n if (canGoNext) {\n const nextStepIndex = currentIndex + 1;\n const nextStepElement = slideElementList[nextStepIndex];\n\n if (hasCurrentStepAudioUrl && nextStepElement?.type === \"interaction\") {\n pendingInteractionOverlayStepIndexRef.current = nextStepIndex;\n }\n\n goNext();\n }\n },\n [\n audioList,\n canGoNext,\n currentIndex,\n currentAudioKey,\n currentAudioSequenceKeys,\n goNext,\n hasCurrentStepAudioUrl,\n slideElementList,\n updateAudioLoadingVisibility,\n ]\n );\n\n const handleInteractionToggle = useCallback(() => {\n if (!activeInteractionElement) {\n return;\n }\n\n setIsInteractionOverlayOpen((prevOpen) => !prevOpen);\n }, [activeInteractionElement]);\n\n const stopOverlayPropagation = useCallback(\n (\n event:\n | React.PointerEvent<HTMLDivElement>\n | React.MouseEvent<HTMLDivElement>\n ) => {\n event.stopPropagation();\n\n // Keep the player visible a bit longer when users interact with the overlay.\n if (playerVisible) {\n showPlayerControls(true);\n }\n },\n [isPlayerVisible, showPlayerControls]\n );\n\n const handleSurfacePointerDown = useCallback(\n (event: React.PointerEvent<HTMLElement>) => {\n onPointerDown?.(event);\n },\n [onPointerDown]\n );\n\n const handleSurfaceClick = useCallback(() => {\n setHasPlayerInteracted(true);\n showPlayerControls(true);\n }, [showPlayerControls]);\n\n const currentRenderElementKeys = useMemo(\n () =>\n currentElementList.map(\n (element, index) =>\n `${element.sequence_number ?? `${element.type}-${index}`}:${String(element.is_new ?? \"\")}`\n ),\n [currentElementList]\n );\n\n useEffect(() => {\n const prevKeys = prevRenderElementKeysRef.current;\n const hasStablePrefix =\n prevKeys.length > 0 &&\n prevKeys.length < currentRenderElementKeys.length &&\n prevKeys.every((key, index) => key === currentRenderElementKeys[index]);\n const appendedElements = hasStablePrefix\n ? currentElementList.slice(prevKeys.length)\n : [];\n const shouldAutoScrollToAppend = appendedElements.some(\n (element) => element.is_new === false\n );\n\n prevRenderElementKeysRef.current = currentRenderElementKeys;\n\n if (!shouldAutoScrollToAppend) {\n return;\n }\n\n const animationFrameId = window.requestAnimationFrame(() => {\n const stageLayerElement = stageLayerRef.current;\n const targetElement = lastElementRef.current;\n\n if (!stageLayerElement || !targetElement) {\n return;\n }\n\n const stageLayerRect = stageLayerElement.getBoundingClientRect();\n const targetRect = targetElement.getBoundingClientRect();\n const nextScrollTop =\n stageLayerElement.scrollTop + (targetRect.top - stageLayerRect.top);\n\n // Keep newly appended content visible when the current slide grows downward.\n stageLayerElement.scrollTo({\n top: Math.max(nextScrollTop, 0),\n behavior: \"smooth\",\n });\n });\n\n return () => {\n window.cancelAnimationFrame(animationFrameId);\n };\n }, [currentElementList, currentRenderElementKeys]);\n\n useEffect(() => {\n if (!shouldScrollToBottomRef.current) {\n return;\n }\n\n shouldScrollToBottomRef.current = false;\n\n if (currentElementList.length === 0) {\n return;\n }\n\n const animationFrameId = window.requestAnimationFrame(() => {\n scrollStageToBottom();\n });\n\n return () => {\n window.cancelAnimationFrame(animationFrameId);\n };\n }, [currentElementList, scrollStageToBottom]);\n\n return (\n <section\n ref={sectionRef}\n className={cn(\n \"relative h-full w-full\",\n isMobileDevice && \"slide--mobile-device\",\n isImmersiveMobileFullscreen && \"slide--mobile-landscape\",\n isNativeMobileFullscreen && \"slide--mobile-landscape-native\",\n className\n )}\n onClick={handleSurfaceClick}\n onPointerDown={handleSurfacePointerDown}\n {...props}\n >\n {shouldShowMobileFullscreenMask ? (\n <div\n aria-hidden=\"true\"\n className=\"pointer-events-none fixed left-0 top-0 z-[9999] h-[100vh] max-h-[100vh] w-[100vw]\"\n />\n ) : null}\n\n <div\n ref={viewportRef}\n className={cn(\n \"slide__viewport relative h-full min-h-0 w-full\",\n isImmersiveMobileFullscreen && \"slide__viewport--mobile-landscape\",\n isImmersiveMobileFullscreen &&\n !shouldRotateFullscreenViewport &&\n \"slide__viewport--mobile-landscape-native\"\n )}\n >\n {shouldShowFullscreenHeader ? (\n <div className=\"slide-landscape-header\">\n <button\n aria-label={fullscreenHeader?.backAriaLabel ?? \"Back\"}\n className=\"slide-landscape-header__back\"\n onClick={handleFullscreenHeaderBack}\n type=\"button\"\n >\n <ChevronLeft className=\"h-6 w-6 text-white\" strokeWidth={2.25} />\n </button>\n\n {fullscreenHeader?.content ? (\n <div className=\"min-w-0 flex-1 overflow-hidden\">\n {fullscreenHeader.content}\n </div>\n ) : null}\n </div>\n ) : null}\n\n <div\n className={cn(\n \"h-full min-h-0 w-full\",\n shouldApplyFullscreenViewportPadding &&\n \"slide__viewport-content--with-header\",\n isSingleSlide ? \"slide-content--single\" : \"grid gap-4\"\n )}\n >\n {currentElementList.length > 0 ? (\n <div className=\"slide-stage\">\n <div ref={stageLayerRef} className=\"slide-stage__layer w-full\">\n {mountedStepStates.map(\n (mountedStepState, mountedStepStateIndex) => {\n const isActiveStep =\n mountedStepStateIndex === currentMountedStateIndex;\n\n return (\n <div\n key={\n mountedStepState.sourceStepIndexes[0] ??\n mountedStepStateIndex\n }\n aria-hidden={!isActiveStep || undefined}\n className=\"w-full h-full\"\n style={{ display: isActiveStep ? undefined : \"none\" }}\n >\n {renderSlideElementList(\n mountedStepState.elementList,\n isActiveStep\n )}\n </div>\n );\n }\n )}\n </div>\n </div>\n ) : null}\n </div>\n\n {isAudioLoadingVisible ? (\n <LoadingOverlayCard\n message={bufferingText}\n className=\"absolute left-1/2 top-1/2 z-[3] -translate-x-1/2 -translate-y-1/2\"\n />\n ) : null}\n\n <SlideFullscreenHint\n onClose={handleFullscreenHintClose}\n open={isFullscreenHintOpen}\n text={fullscreenHintText}\n />\n\n <SubtitleOverlay\n extraBottomOffset={interactionOverlaySubtitleOffset}\n hasPlayerGap={playerVisible}\n isEnabled={isSubtitleEnabled && hasCurrentAudioPlaybackStarted}\n isPlayerHidden={shouldRenderPlayer && !playerVisible}\n playbackTimeStore={playbackTimeStore}\n subtitleCues={currentSubtitleCues}\n />\n\n {shouldShowInteractionOverlay ? (\n <div\n ref={interactionOverlayRef}\n className={cn(\n \"slide-interaction-overlay\",\n playerVisible && shouldRenderPlayer\n ? \"slide-interaction-overlay--with-player\"\n : \"slide-interaction-overlay--standalone\"\n )}\n onClick={stopOverlayPropagation}\n onPointerDown={stopOverlayPropagation}\n style={interactionOverlayStyle}\n >\n <InteractionOverlayCard\n content={String(activeInteractionElement?.content ?? \"\")}\n defaultButtonText={interactionDefaults.buttonText ?? \"\"}\n defaultInputText={interactionDefaults.inputText ?? \"\"}\n defaultSelectedValues={interactionDefaultSelectedValues}\n confirmButtonText={interactionTexts?.confirmButtonText}\n copyButtonText={interactionTexts?.copyButtonText}\n copiedButtonText={interactionTexts?.copiedButtonText}\n onSend={handleInteractionSend}\n readonly={isInteractionReadonly}\n title={\n interactionTexts?.title ??\n interactionTitle ??\n \"Submit the content below to continue.\"\n }\n />\n </div>\n ) : null}\n\n {shouldRenderPlayer ? (\n <Player\n audioList={audioList}\n className={cn(\n \"absolute left-1/2 bottom-6 z-[2] -translate-x-1/2\",\n playerClassName,\n !playerVisible && \"pointer-events-none opacity-0\"\n )}\n currentAudioIndex={currentAudioIndex}\n defaultPlaying\n isPlaybackPaused={shouldPausePlaybackForCustomAction}\n isAutoAdvanceEnabled={isAutoAdvanceEnabled}\n hasInteraction={Boolean(activeInteractionElement)}\n isInteractionOpen={isInteractionOverlayOpen}\n isSubtitleEnabled={isSubtitleEnabled}\n onAutoAdvanceToggle={setIsAutoAdvanceEnabled}\n onLoadingChange={handlePlayerLoadingChange}\n onPlaybackStarted={() => {\n setHasCurrentAudioPlaybackStarted(true);\n }}\n onPlaybackTimeChange={playbackTimeStore.setTime}\n onSubtitleToggle={() => {\n setIsSubtitleEnabled((previousEnabled) => !previousEnabled);\n }}\n nextDisabled={!canGoNext}\n onEnded={handlePlayerEnded}\n onFullscreen={handleFullscreen}\n isFullscreen={isBrowserFullscreen}\n mobileViewMode={effectiveMobileViewMode}\n settingsPortalContainer={viewportRef.current}\n onMobileViewModeChange={handleMobileViewModeSelect}\n onInteractionToggle={handleInteractionToggle}\n onNext={handleNext}\n onPrev={handlePrev}\n prevDisabled={!canGoPrev}\n showControls={playerVisible}\n texts={playerTexts}\n customActionContext={playerCustomActionContext}\n customActions={playerCustomActions}\n useAutoAdvanceToggle={shouldUseSilentStepAutoAdvanceToggle}\n />\n ) : null}\n </div>\n </section>\n );\n};\n\nexport default Slide;\n"],"names":["DEFAULT_MARKER_AUTO_ADVANCE_DELAY_MS","DEFAULT_INTERACTION_OVERLAY_OPEN_DELAY_MS","DEFAULT_INTERACTION_OVERLAY_FALLBACK_OFFSET_PX","DEFAULT_INTERACTION_SUBTITLE_GAP_PX","InteractionOverlayCard","memo","content","title","defaultButtonText","defaultInputText","defaultSelectedValues","confirmButtonText","copyButtonText","copiedButtonText","onSend","readonly","jsxs","jsx","ContentRender","areStepElementListsEqual","prevElementList","nextElementList","element","index","nextElement","getStreamContentActivityKey","React","getStreamAudioSegmentsActivityKey","audioSegments","segment","getStreamActivityKey","elementList","Slide","isStreaming","showPlayer","playerAlwaysVisible","playerClassName","fullscreenHeader","playerCustomActions","playerCustomActionPauseOnActive","bufferingText","interactionTitle","interactionTexts","playerTexts","playerAutoHideDelay","markerAutoAdvanceDelay","streamInactivityTimeoutMs","DEFAULT_STREAM_INACTIVITY_TIMEOUT_MS","interactionDefaultValueOptions","onPlayerVisibilityChange","onMobileViewModeChange","onError","onStepChange","enableIframeScaling","className","onPointerDown","props","sectionRef","useRef","viewportRef","stageLayerRef","lastElementRef","playerHideTimerRef","autoAdvanceTimerRef","interactionAutoCloseTimerRef","interactionOverlayOpenTimerRef","streamInactivityTimerRef","interactionOverlayRef","prevRenderElementKeysRef","lastStreamActivityKeyRef","shouldScrollToBottomRef","hasStreamStartedRef","hasStreamInactivityTimedOutRef","pendingInteractionOverlayStepIndexRef","playbackResetKeyRef","appendedMarkerAdvanceStateRef","currentElementList","stepElementLists","slideElementList","currentIndex","audioList","currentAudioSequenceIndexes","currentStepHasSpeakableElement","currentInteractionElement","canGoPrev","canGoNext","goPrev","goNext","useSlide","currentStepElement","useMemo","isSingleSlide","shouldRenderPlayer","currentAudioSequenceKeys","audioIndex","audioKey","isPlayerVisible","setIsPlayerVisible","useState","hasPlayerInteracted","setHasPlayerInteracted","isAutoAdvanceEnabled","setIsAutoAdvanceEnabled","currentAudioKey","setCurrentAudioKey","isAudioLoadingVisible","setIsAudioLoadingVisible","hasStreamInactivityTimedOut","setHasStreamInactivityTimedOut","hasCompletedCurrentStepAudio","setHasCompletedCurrentStepAudio","hasCurrentAudioPlaybackStarted","setHasCurrentAudioPlaybackStarted","isSubtitleEnabled","setIsSubtitleEnabled","isPlayerCustomActionActive","setIsPlayerCustomActionActive","activeInteractionElement","setActiveInteractionElement","isInteractionOverlayOpen","setIsInteractionOverlayOpen","interactionOverlaySubtitleOffset","setInteractionOverlaySubtitleOffset","isBrowserFullscreen","setIsBrowserFullscreen","isMobileDevice","getIsMobileDevice","mobileViewMode","setMobileViewMode","DEFAULT_MOBILE_VIEW_MODE","hasManualMobileViewMode","setHasManualMobileViewMode","isViewportFullscreenPreferred","setIsViewportFullscreenPreferred","getIsFullscreenPreferredViewport","isFullscreenHintOpen","setIsFullscreenHintOpen","playbackTimeStore","createPlaybackTimeStore","effectiveMobileViewMode","isImmersiveMobileFullscreen","isNativeMobileFullscreen","shouldRotateFullscreenViewport","resolveMobileViewModeState","previousEffectiveMobileViewModeRef","playerVisible","shouldShowFullscreenHeader","shouldApplyFullscreenViewportPadding","shouldShowMobileFullscreenMask","fullscreenHintText","DEFAULT_SLIDE_PLAYER_TEXTS","streamActivityKey","updateAudioLoadingVisibility","useCallback","nextVisible","reason","detail","setBufferingLoadingVisible","visible","handleMobileViewModeSelect","nextViewMode","handleMobileViewModeReset","handleFullscreenHeaderBack","handleFullscreenHintClose","setPlayerCustomActionActive","active","togglePlayerCustomActionActive","previous","mountedStepStates","currentMountedStateIndex","nextMountedStepStates","mountedStateIndexByStep","stepElementList","stepIndex","existingMountedStateIndex","mountedStepState","currentStepKey","currentAudioIndex","audioItem","currentAudioItem","currentSubtitleCues","currentAudioSequenceStartKey","playerCustomActionContext","resolvePlayerCustomActionElement","playerCustomActionCount","getPlayerCustomActionCount","interactionOverlayStyle","hasAvailableStepAudio","currentInteractionResetKey","currentPlaybackResetKey","currentPlaybackStartedResetKey","hasCurrentStepAudioUrl","shouldPausePlaybackForCustomAction","shouldUseSilentStepAutoAdvanceToggle","shouldUseAutoAdvanceToggle","clearPlayerHideTimer","clearInteractionAutoCloseTimer","clearInteractionOverlayOpenTimer","clearAutoAdvanceTimer","clearStreamInactivityTimer","resetAudioSequence","startCurrentAudioSequence","nextAudioKey","continueAfterInteraction","scheduleInteractionOverlayOpen","interactionElement","openOverlay","showPlayerControls","enableAutoHide","hasResolvedCurrentInteraction","shouldBlockPlaybackForInteraction","useEffect","hasStreamingStarted","hasStreamActivityChanged","SLIDE_ERROR_CODES","syncViewportFullscreenPreference","subscribeMobileDeviceChange","shouldShowFullscreenHint","previousState","shouldAdvanceIntoAppendedMarker","shouldAutoAdvanceIntoAppendedMarker","handleSandboxInteraction","event","isSandboxInteractionMessage","useWakePlayerFromIframe","hasPlaybackContextChanged","shouldInitializeAudioSequence","getPlaybackSequenceTransition","shouldOpenInteractionOverlayAfterAudio","shouldPresentOverlay","shouldPresentInteractionOverlay","interactionDefaults","shouldPreferResolvedInteractionInput","getInteractionDefaultValues","interactionDefaultSelectedValues","getInteractionDefaultSelectedValues","hasResolvedInteractionInput","isInteractionReadonly","shouldAutoContinueInteraction","shouldShowInteractionOverlay","handleInteractionSend","resolvedUserInput","prevElement","syncFullscreenState","interactionOverlayElement","updateSubtitleOffset","overlayHeight","resizeObserver","renderSlideElement","options","Fragment","IframeSandbox","renderSlideElementList","isActiveStep","visibleElementCount","lastVisibleElementIndex","lastVisibleIndex","isPreRenderedHtml","cn","handleFullscreen","target","scrollStageToBottom","stageLayerElement","handlePrev","handleNext","handlePlayerLoadingChange","loading","handlePlayerEnded","endedAudioKey","activeSequencePosition","audioSequenceKey","nextSequencePosition","nextStepIndex","nextStepElement","handleInteractionToggle","prevOpen","stopOverlayPropagation","handleSurfacePointerDown","handleSurfaceClick","currentRenderElementKeys","prevKeys","shouldAutoScrollToAppend","key","animationFrameId","targetElement","stageLayerRect","targetRect","nextScrollTop","ChevronLeft","mountedStepStateIndex","LoadingOverlayCard","SlideFullscreenHint","SubtitleOverlay","Player","previousEnabled"],"mappings":"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"}
@@ -13,6 +13,7 @@ export interface SlideInteractionTexts extends Pick<ContentRenderProps, "confirm
13
13
  export type SlideErrorCode = (typeof SLIDE_ERROR_CODES)[keyof typeof SLIDE_ERROR_CODES];
14
14
  export interface SlideErrorContext {
15
15
  code: SlideErrorCode;
16
+ setBufferingLoadingVisible: (visible: boolean) => void;
16
17
  }
17
18
  export type SlideFullscreenHeader = {
18
19
  content?: React.ReactNode;