markdown-flow-ui 0.1.115-beta.3 → 0.1.115-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (21) hide show
  1. package/dist/_virtual/index.cjs10.js +1 -1
  2. package/dist/_virtual/index.cjs9.js +1 -1
  3. package/dist/_virtual/index.es10.js +2 -2
  4. package/dist/_virtual/index.es9.js +2 -2
  5. package/dist/components/Slide/Player.cjs.js.map +1 -1
  6. package/dist/components/Slide/Player.es.js.map +1 -1
  7. package/dist/components/Slide/Slide.cjs.js +1 -1
  8. package/dist/components/Slide/Slide.cjs.js.map +1 -1
  9. package/dist/components/Slide/Slide.es.js +537 -579
  10. package/dist/components/Slide/Slide.es.js.map +1 -1
  11. package/dist/components/Slide/utils/playbackSequence.cjs.js +1 -1
  12. package/dist/components/Slide/utils/playbackSequence.cjs.js.map +1 -1
  13. package/dist/components/Slide/utils/playbackSequence.d.ts +4 -0
  14. package/dist/components/Slide/utils/playbackSequence.es.js +20 -7
  15. package/dist/components/Slide/utils/playbackSequence.es.js.map +1 -1
  16. package/dist/markdown-flow-ui/node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.cjs.js +1 -1
  17. package/dist/markdown-flow-ui/node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.cjs.js.map +1 -1
  18. package/dist/markdown-flow-ui/node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.es.js +1 -1
  19. package/dist/markdown-flow-ui/node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/index.cjs.js +1 -1
  20. package/dist/markdown-flow-ui/node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/index.es.js +1 -1
  21. package/package.json +1 -1
@@ -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"),t=require("react"),pn=require("../../lib/sandboxInteraction.cjs.js"),X=require("../../lib/utils.cjs.js"),hn=require("../ui/loading-overlay-card.cjs.js"),xn=require("../ContentRender/ContentRender.cjs.js"),yt=require("../ContentRender/IframeSandbox.cjs.js");require("../ui/inputGroup/input-group.cjs.js");const At=require("../../lib/interaction-defaults.cjs.js"),Ee=require("../../lib/mobileDevice.cjs.js"),bn=require("./Player.cjs.js"),Sn=require("./SubtitleOverlay.cjs.js"),vn=require("./useSlide.cjs.js"),gn=require("./useWakePlayerFromIframe.cjs.js"),ie=require("./utils/mobileScreenMode.cjs.js"),En=require("./utils/interactionPlayback.cjs.js"),yn=require("./utils/appendedMarkerAdvance.cjs.js"),An=require("./utils/playbackSequence.cjs.js"),Rt=require("./utils/playerCustomActions.cjs.js"),Rn=require("./utils/playbackTimeStore.cjs.js"),wn=require("./utils/playerToggleMode.cjs.js");;/* empty css */const In=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"),Cn=2e3,_n=300,Mn=160,kn=16,Oe="waitingForAudio",wt={waitingForAudio:"Waiting for current slide audio...",loadingAudio:"Loading current slide audio...",waitingForMoreAudio:"Waiting for more current slide audio..."},Tn=(d,v)=>typeof d=="string"?d:d[v]??d[Oe]??wt[v],jn=(d,v)=>v?d!=="loadingAudio":!1,Pn=(d,v={})=>{const m=Object.entries(v).map(([B,g])=>`${B}=${String(g)}`).join(", ");return m?`[slide-debug] ${d} | ${m}`:`[slide-debug] ${d}`},It=t.memo(({content:d,title:v,defaultButtonText:m,defaultInputText:B,defaultSelectedValues:g,confirmButtonText:O,copyButtonText:J,copiedButtonText:ye,onSend:Ae,readonly:L=!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:v})}),r.jsxRuntimeExports.jsx("div",{className:"slide-player__interaction-body",children:r.jsxRuntimeExports.jsx(xn.default,{content:d,defaultButtonText:m,defaultInputText:B,defaultSelectedValues:g,confirmButtonText:O,copyButtonText:J,copiedButtonText:ye,onSend:Ae,readonly:L,enableTypewriter:!1,sandboxMode:"content"})})]}));It.displayName="InteractionOverlayCard";const Fn=(d,v)=>d.length===v.length&&d.every((m,B)=>{const g=v[B];return m.sequence_number===g?.sequence_number&&m.type===g?.type&&m.content===g?.content}),Bn=({elementList:d=[],showPlayer:v=!0,playerAlwaysVisible:m=!1,playerClassName:B,fullscreenHeader:g,playerCustomActions:O,playerCustomActionPauseOnActive:J=!0,bufferingText:ye=wt,interactionTitle:Ae,interactionTexts:L,playerTexts:Ct,playerAutoHideDelay:Re=3e3,markerAutoAdvanceDelay:Le=Cn,interactionDefaultValueOptions:ae,onSend:De,onPlayerVisibilityChange:we,onMobileViewModeChange:Ve,onStepChange:Ke,enableIframeScaling:_t=!0,disableLoadingOverlay:I=!1,className:Mt,onPointerDown:Ue,...kt})=>{const ce=t.useRef(null),$e=t.useRef(null),Ie=t.useRef(null),We=t.useRef(null),Q=t.useRef(null),Z=t.useRef(null),ee=t.useRef(null),te=t.useRef(null),He=t.useRef(null),Ge=t.useRef([]),de=t.useRef(!1),D=t.useRef(null),ze=t.useRef(null),Ye=t.useRef({markerCount:0,currentIndex:-1,canGoNext:!1}),Xe=t.useRef(new Set),{currentElementList:T,stepElementLists:Je,slideElementList:j,currentIndex:u,audioList:p,currentAudioSequenceIndexes:fe,currentStepHasSpeakableElement:E,currentInteractionElement:a,canGoPrev:Tt,canGoNext:f,handlePrev:Qe,handleNext:C}=vn.default(d),ne=t.useMemo(()=>{if(!(u<0))return j[u]},[u,j]),jt=j.filter(e=>e.is_renderable!==!1).length===1,A=v&&(j.length>0||p.length>0||!!a),h=t.useMemo(()=>fe.map(e=>p[e]?.audioKey).filter(e=>!!e),[p,fe]),R=t.useCallback((e,n={})=>{if(typeof window>"u")return;const s=`${u}:${e}`;Xe.current.has(s)||(Xe.current.add(s),window.alert(Pn(e,{step:u,...n})))},[u]),[Ze,me]=t.useState(!0),[pe,re]=t.useState(!1),[se,et]=t.useState(!0),[x,V]=t.useState(null),[Pt,b]=t.useState(!1),[Ft,Ce]=t.useState(Oe),[_,tt]=t.useState(!1),[Bt,_e]=t.useState(!1),[nt,Nt]=t.useState(!0),[Me,ke]=t.useState(!1),[o,Te]=t.useState(),[he,xe]=t.useState(!1),[qt,oe]=t.useState(0),[rt,Ot]=t.useState(!1),P=t.useMemo(()=>Ee.isMobileDevice(),[]),[be,je]=t.useState(ie.DEFAULT_MOBILE_VIEW_MODE),[st,Pe]=t.useState(!1),[Lt,ot]=t.useState(()=>P?Ee.isLandscapeViewport():!1),K=t.useMemo(()=>Rn.createPlaybackTimeStore(),[]),{effectiveMobileViewMode:U,isImmersiveMobileFullscreen:$,isNativeMobileFullscreen:ut,shouldRotateFullscreenViewport:Dt}=t.useMemo(()=>ie.resolveMobileViewModeState({hasManualMobileViewMode:st,isMobileDevice:P,mobileViewMode:be}),[st,P,Lt,be]),Vt=t.useRef(U),M=A&&(m||Ze),Kt=$&&M,Ut=$&&M,$t=$||ut,lt=rt&&!P,Wt=t.useCallback(e=>{Pe(!0),je(e)},[]),it=t.useCallback(()=>{Pe(!1),je(ie.DEFAULT_MOBILE_VIEW_MODE)},[]),Ht=t.useCallback(()=>{it(),g?.onBack?.()},[g,it]),at=t.useCallback(e=>{ke(e)},[]),ct=t.useCallback(()=>{ke(e=>!e)},[]),{mountedStepStates:Gt,currentMountedStateIndex:zt}=t.useMemo(()=>{const e=[],n=new Map;return Je.forEach((s,c)=>{const l=e.findIndex(i=>Fn(i.elementList,s));if(l>=0){e[l]?.sourceStepIndexes.push(c),n.set(c,l);return}e.push({elementList:s,sourceStepIndexes:[c]}),n.set(c,e.length-1)}),{mountedStepStates:e,currentMountedStateIndex:u>=0?n.get(u)??-1:-1}},[u,Je]),dt=t.useMemo(()=>String(u),[u]),S=t.useMemo(()=>x?p.findIndex(e=>(e.audioKey??"")===x):-1,[p,x]),Fe=t.useMemo(()=>S>=0?p[S]:void 0,[p,S]),Yt=Fe?.element?.subtitle_cues??[],Se=t.useMemo(()=>h[0]??"none",[h]),Be=t.useMemo(()=>({currentElement:Rt.resolvePlayerCustomActionElement({currentAudioIndex:S,currentAudioSequenceIndexes:fe,audioList:p,currentInteractionElement:o,currentStepElement:ne}),currentIndex:u,currentStepElement:ne,isActive:Me,setActive:at,toggleActive:ct}),[o,p,S,fe,u,ne,Me,at,ct]),Ne=t.useMemo(()=>Rt.getPlayerCustomActionCount(O,Be),[Be,O]),Xt=t.useMemo(()=>({"--slide-player-custom-action-count":String(Ne),"--slide-player-mobile-control-count":String(Ne+4)}),[Ne]),ft=h.length>0,mt=t.useMemo(()=>a?`${a.sequence_number??"none"}:${String(a.content??"")}`:"none",[a]),ue=t.useMemo(()=>[dt,mt].join("|"),[mt,dt]),Jt=t.useMemo(()=>[ue,Fe?.audioKey??"none",String(S)].join("|"),[S,Fe?.audioKey,ue]),pt=!!t.useMemo(()=>!Se||Se==="none"?"":p.find(n=>n.audioKey===Se)?.audioUrl?.trim()??"",[p,Se]),N=J&&!!O&&Me,le=t.useMemo(()=>wn.shouldUseAutoAdvanceToggle({canGoNext:f,currentAudioIndex:S,currentStepHasSpeakableElement:E,hasInteraction:!!a}),[f,S,a,E]),q=t.useCallback(()=>{Q.current!==null&&(window.clearTimeout(Q.current),Q.current=null)},[]),F=t.useCallback(()=>{ee.current!==null&&(window.clearTimeout(ee.current),ee.current=null)},[]),k=t.useCallback(()=>{te.current!==null&&(window.clearTimeout(te.current),te.current=null)},[]),W=t.useCallback(()=>{Z.current!==null&&(window.clearTimeout(Z.current),Z.current=null)},[]),H=t.useCallback(()=>{W(),F(),k(),V(null),K.reset(),b(!1),Ce(Oe),tt(!1),_e(!1),Te(void 0),xe(!1),oe(0)},[W,F,k,K]),G=t.useCallback(()=>{const e=h[0];return e?(V(e),!0):!1},[h]),ve=t.useCallback(()=>{F(),k(),xe(!1),oe(0),!G()&&f&&C()},[f,F,k,C,G]),ht=t.useCallback(e=>{if(k(),!e)return;const n=()=>{te.current=null,oe(Mn),xe(!0),D.current=null};te.current=window.setTimeout(n,_n)},[k]),y=t.useCallback((e=pe)=>{A&&(me(!0),q(),!(m||!e||Re<=0)&&(Q.current=window.setTimeout(()=>{me(!1),Q.current=null},Re)))},[q,pe,m,Re,A]),z=!!(a?.readonly||a?.user_input?.trim()),Y=!!a&&!z;t.useEffect(()=>{et(!0),J&&ke(!1)},[u,J]),t.useEffect(()=>()=>{W(),q(),F(),k()},[W,F,k,q]),t.useEffect(()=>(we?.(M),()=>{we?.(!1)}),[we,M]),t.useEffect(()=>{P||be===ie.DEFAULT_MOBILE_VIEW_MODE||(Pe(!1),je(ie.DEFAULT_MOBILE_VIEW_MODE))},[P,be]),t.useEffect(()=>{if(!P){ot(!1);return}const e=()=>{ot(Ee.isLandscapeViewport())};return e(),Ee.subscribeMobileDeviceChange(e)},[P]),t.useEffect(()=>{Ve?.(U)},[U,Ve]),t.useEffect(()=>{Vt.current=U},[U]),t.useEffect(()=>{Ke?.(ne,u)},[u,ne,Ke]),t.useEffect(()=>{const e=Ye.current,n=yn.shouldAutoAdvanceIntoAppendedMarker({previousMarkerCount:e.markerCount,nextMarkerCount:j.length,previousIndex:e.currentIndex,previousCanGoNext:e.canGoNext,nextCanGoNext:f,currentAudioKey:x,hasCompletedCurrentStepAudio:_,hasResolvedCurrentInteraction:z,currentStepHasSpeakableElement:E,currentInteractionElement:a,isAutoAdvanceEnabled:se,shouldUseSilentStepAutoAdvanceToggle:le});Ye.current={markerCount:j.length,currentIndex:u,canGoNext:f},n&&C()},[f,x,u,a,E,C,_,z,se,le,j.length]),t.useEffect(()=>{if(!A){q(),me(!1);return}if(m){q(),me(!0);return}pe||y(!0)},[q,pe,m,A,y]),t.useEffect(()=>{if(typeof window>"u")return;const e=n=>{n.origin===window.location.origin&&pn.isSandboxInteractionMessage(n.data)&&n.data.eventType==="click"&&A&&(re(!0),y(!0))};return window.addEventListener("message",e),()=>{window.removeEventListener("message",e)}},[A,y]),gn.default({sectionRef:ce,enabled:A,onWake:()=>{re(!0),y(!0)}}),t.useEffect(()=>{const{hasPlaybackContextChanged:e,shouldInitializeAudioSequence:n}=An.getPlaybackSequenceTransition({previousResetKey:ze.current,nextResetKey:ue,currentAudioKey:x,hasCompletedCurrentStepAudio:_});ze.current=ue;const s=D.current===u&&!!a,c=En.shouldPresentInteractionOverlay({hasInteraction:!!a,shouldBlockPlaybackForInteraction:Y,shouldOpenInteractionOverlayAfterAudio:s,hasPlaybackContextChanged:e,hasResolvedCurrentInteraction:z,currentStepHasSpeakableElement:E});if(e&&H(),!(T.length===0&&!a)){if(N){R("custom-action-paused");return}if(a&&Te(a),c){R("interaction-blocked",{interactionResolved:z,afterAudio:s}),ht(a);return}if(k(),D.current=null,!!n&&!G()){if(E){if(I){b(!1);return}R("waiting-for-audio",{audioSequenceCount:h.length}),b(!0);return}if(f){if(le&&!se){R("silent-step-auto-advance-disabled");return}return Z.current=window.setTimeout(()=>{Z.current=null,C()},Le),()=>{W()}}}}},[f,W,T.length,a,x,ue,E,Le,C,_,I,se,z,Y,k,H,ht,G,N,le,R,h.length]),t.useEffect(()=>{if(I||N||!E||Y){b(!1);return}if(_){b(!1);return}if(ft){b(!1);return}R("waiting-for-audio",{audioSequenceCount:h.length}),Ce("waitingForAudio"),b(!0)},[ft,E,_,I,N,Y,R,h.length]),t.useEffect(()=>{x||h.length===0||N||!E||Y||_||G()},[x,h,E,_,N,Y,G]),t.useEffect(()=>{!x||S>=0||V(null)},[S,x]),t.useEffect(()=>{S>=0||K.reset()},[S,K]),t.useEffect(()=>{_e(!1)},[Jt]);const xt=t.useMemo(()=>{if(!o)return{};const e=!!o.user_input?.trim();return At.getInteractionDefaultValues(typeof o.content=="string"?o.content:void 0,o.user_input,e?void 0:ae)},[o,ae]),Qt=t.useMemo(()=>{if(!o)return;const e=!!o.user_input?.trim();return At.getInteractionDefaultSelectedValues(typeof o.content=="string"?o.content:void 0,o.user_input,e?void 0:ae)},[o,ae]),bt=!!o?.user_input?.trim(),St=!!o?.readonly||bt,vt=St||bt,qe=!!o&&he,Zt=t.useCallback(e=>{const s=[...e.selectedValues??[],e.inputText?.trim()??"",e.buttonText?.trim()??""].filter(Boolean).join(", ");Te(c=>!c||!s?c:{...c,user_input:s}),De?.(e,o),ve()},[o,ve,De]);t.useEffect(()=>{const e=()=>{Ot(document.fullscreenElement===ce.current)};return e(),document.addEventListener("fullscreenchange",e),()=>{document.removeEventListener("fullscreenchange",e)}},[]),t.useEffect(()=>{if(!qe){oe(0);return}const e=He.current;if(!e)return;const n=()=>{const c=Math.ceil(e.getBoundingClientRect().height);oe(c+kn)};if(n(),typeof ResizeObserver>"u")return;const s=new ResizeObserver(()=>{n()});return s.observe(e),()=>{s.disconnect()}},[qe]),t.useEffect(()=>{if(F(),!(!he||!vt))return ee.current=window.setTimeout(()=>{ee.current=null,ve()},2e3),()=>{F()}},[F,ve,he,vt]);const en=(e,n={})=>e?e.type==="slot"?r.jsxRuntimeExports.jsx(r.jsxRuntimeExports.Fragment,{children:e.content}):e.type==="html"?r.jsxRuntimeExports.jsx(yt.default,{className:"content-render-iframe",disableLoadingOverlay:I,hideFullScreen:!0,mode:"blackboard",replaceRootScreenHeightWithFull:n.replaceRootScreenHeightWithFull,type:"sandbox",content:e.content,enableScaling:_t}):r.jsxRuntimeExports.jsx(yt.default,{className:"content-render-iframe",disableLoadingOverlay:I,hideFullScreen:!0,mode:"blackboard",type:"markdown",content:e.content}):null,tn=(e=[],n=!1)=>{if(e.length===0)return null;const s=e.filter(l=>l.is_renderable!==!1).length,c=e.reduce((l,i,w)=>i.is_renderable!==!1?w:l,-1);return r.jsxRuntimeExports.jsx("div",{className:"slide-stage__content flex w-full flex-col gap-4",children:e.map((l,i)=>{const w=l.type==="html"&&l.is_renderable===!1;return r.jsxRuntimeExports.jsx("div",{ref:n&&i===c?We:null,"aria-hidden":w||void 0,className:X.cn("w-full shrink-0",s===1&&l.is_renderable!==!1&&"slide-element--single",w?"pointer-events-none fixed left-[-200vw] top-0 -z-10 h-[100dvh] w-[100vw] overflow-hidden opacity-0":l.is_renderable===!1&&"hidden"),children:en(l,{replaceRootScreenHeightWithFull:s===1&&l.type==="html"&&l.is_renderable!==!1})},l.sequence_number??`${l.type}-${i}`)})})},nn=t.useCallback(()=>{const e=ce.current;if(e){if(document.fullscreenElement===e){document.exitFullscreen().catch(()=>{});return}e.requestFullscreen?.().catch(()=>{})}},[]),gt=t.useCallback(()=>{const e=Ie.current;e&&e.scrollTo({top:e.scrollHeight,behavior:"smooth"})},[]),rn=t.useCallback(()=>{de.current=!0,D.current=null,re(!0),b(!1),y(!0),H(),Qe()},[Qe,H,y]),sn=t.useCallback(()=>{de.current=!0,D.current=null,re(!0),b(!1),y(!0),H(),C()},[C,H,y]),on=t.useCallback(({loading:e,reason:n})=>{if(I){b(!1);return}if(!E||_){b(!1);return}e&&n&&(Ce(n),n==="waitingForMoreAudio"&&R("waiting-for-more-audio",{hasNextStep:f})),b(jn(n,e))},[R,f,E,_,I]);t.useEffect(()=>{I&&b(!1)},[I]);const un=t.useCallback(e=>{const n=p[e]?.audioKey;if(!n||!x||n!==x)return;const s=h.findIndex(i=>i===n);if(s<0){V(null);return}const c=s+1,l=h[c];if(l){V(l);return}if(V(null),tt(!0),b(!1),f){const i=u+1,w=j[i];pt&&w?.type==="interaction"&&(D.current=i),C();return}R("audio-ended-without-next-step",{canGoNext:f,nextIndex:u+1})},[R,p,f,u,x,h,C,pt,j]),ln=t.useCallback(()=>{o&&xe(e=>!e)},[o]),Et=t.useCallback(e=>{e.stopPropagation(),M&&y(!0)},[Ze,y]),an=t.useCallback(e=>{Ue?.(e)},[Ue]),cn=t.useCallback(()=>{re(!0),y(!0)},[y]),ge=t.useMemo(()=>T.map((e,n)=>`${e.sequence_number??`${e.type}-${n}`}:${String(e.is_new??"")}`),[T]);return t.useEffect(()=>{const e=Ge.current,c=(e.length>0&&e.length<ge.length&&e.every((i,w)=>i===ge[w])?T.slice(e.length):[]).some(i=>i.is_new===!1);if(Ge.current=ge,!c)return;const l=window.requestAnimationFrame(()=>{const i=Ie.current,w=We.current;if(!i||!w)return;const dn=i.getBoundingClientRect(),fn=w.getBoundingClientRect(),mn=i.scrollTop+(fn.top-dn.top);i.scrollTo({top:Math.max(mn,0),behavior:"smooth"})});return()=>{window.cancelAnimationFrame(l)}},[T,ge]),t.useEffect(()=>{if(!de.current||(de.current=!1,T.length===0))return;const e=window.requestAnimationFrame(()=>{gt()});return()=>{window.cancelAnimationFrame(e)}},[T,gt]),r.jsxRuntimeExports.jsxs("section",{ref:ce,className:X.cn("relative h-full w-full",P&&"slide--mobile-device",lt&&"slide--browser-fullscreen",$&&"slide--mobile-landscape",ut&&"slide--mobile-landscape-native",Mt),onClick:cn,onPointerDown:an,...kt,children:[$t?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:$e,className:X.cn("slide__viewport relative h-full min-h-0 w-full",$&&"slide__viewport--mobile-landscape",$&&!Dt&&"slide__viewport--mobile-landscape-native"),children:[Kt?r.jsxRuntimeExports.jsxs("div",{className:"slide-landscape-header",children:[r.jsxRuntimeExports.jsx("button",{"aria-label":g?.backAriaLabel??"Back",className:"slide-landscape-header__back",onClick:Ht,type:"button",children:r.jsxRuntimeExports.jsx(In.default,{className:"slide-landscape-header__icon h-6 w-6",strokeWidth:2.25})}),g?.content?r.jsxRuntimeExports.jsx("div",{className:"min-w-0 flex-1 overflow-hidden",children:g.content}):null]}):null,r.jsxRuntimeExports.jsx("div",{className:X.cn("h-full min-h-0 w-full",Ut&&"slide__viewport-content--with-header",jt?"slide-content--single":"grid gap-4"),children:T.length>0?r.jsxRuntimeExports.jsx("div",{className:"slide-stage",children:r.jsxRuntimeExports.jsx("div",{ref:Ie,className:"slide-stage__layer w-full",children:Gt.map((e,n)=>{const s=n===zt;return r.jsxRuntimeExports.jsx("div",{"aria-hidden":!s||void 0,className:"w-full h-full",style:{display:s?void 0:"none"},children:tn(e.elementList,s)},e.sourceStepIndexes[0]??n)})})}):null}),Pt?r.jsxRuntimeExports.jsx(hn.default,{message:Tn(ye,Ft),className:"absolute left-1/2 top-1/2 z-[3] -translate-x-1/2 -translate-y-1/2"}):null,r.jsxRuntimeExports.jsx(Sn.default,{extraBottomOffset:qt,hasPlayerGap:M,isEnabled:nt&&Bt,isPlayerHidden:A&&!M,playbackTimeStore:K,subtitleCues:Yt}),qe?r.jsxRuntimeExports.jsx("div",{ref:He,className:X.cn("slide-interaction-overlay",M&&A?"slide-interaction-overlay--with-player":"slide-interaction-overlay--standalone"),onClick:Et,onPointerDown:Et,style:Xt,children:r.jsxRuntimeExports.jsx(It,{content:String(o?.content??""),defaultButtonText:xt.buttonText??"",defaultInputText:xt.inputText??"",defaultSelectedValues:Qt,confirmButtonText:L?.confirmButtonText,copyButtonText:L?.copyButtonText,copiedButtonText:L?.copiedButtonText,onSend:Zt,readonly:St,title:L?.title??Ae??"Submit the content below to continue."})}):null,A?r.jsxRuntimeExports.jsx(bn.default,{audioList:p,className:X.cn("absolute left-1/2 z-[2] -translate-x-1/2",lt?"bottom-3":"-bottom-3",B,!M&&"pointer-events-none opacity-0"),currentAudioIndex:S,defaultPlaying:!0,isPlaybackPaused:N,isAutoAdvanceEnabled:se,hasInteraction:!!o,isInteractionOpen:he,isSubtitleEnabled:nt,onAutoAdvanceToggle:et,onLoadingChange:on,onPlaybackStarted:()=>{_e(!0)},onPlaybackTimeChange:K.setTime,onSubtitleToggle:()=>{Nt(e=>!e)},nextDisabled:!f,onEnded:un,onFullscreen:nn,isFullscreen:rt,mobileViewMode:U,settingsPortalContainer:$e.current,onMobileViewModeChange:Wt,onInteractionToggle:ln,onNext:sn,onPrev:rn,prevDisabled:!Tt,showControls:M,texts:Ct,customActionContext:Be,customActions:O,useAutoAdvanceToggle:le}):null]})]})};exports.default=Bn;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const r=require("../../_virtual/jsx-runtime.cjs.js"),e=require("react"),xn=require("../../lib/sandboxInteraction.cjs.js"),$=require("../../lib/utils.cjs.js"),bn=require("../ui/loading-overlay-card.cjs.js"),vn=require("../ContentRender/ContentRender.cjs.js"),At=require("../ContentRender/IframeSandbox.cjs.js");require("../ui/inputGroup/input-group.cjs.js");const Rt=require("../../lib/interaction-defaults.cjs.js"),ye=require("../../lib/mobileDevice.cjs.js"),Sn=require("./Player.cjs.js"),En=require("./SubtitleOverlay.cjs.js"),yn=require("./useSlide.cjs.js"),gn=require("./useWakePlayerFromIframe.cjs.js"),ie=require("./utils/mobileScreenMode.cjs.js"),An=require("./utils/interactionPlayback.cjs.js"),Rn=require("./utils/appendedMarkerAdvance.cjs.js"),It=require("./utils/playbackSequence.cjs.js"),wt=require("./utils/playerCustomActions.cjs.js"),In=require("./utils/playbackTimeStore.cjs.js"),wn=require("./utils/playerToggleMode.cjs.js");;/* empty css */const Cn=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"),_n=2e3,Mn=300,kn=160,Tn=16,Le="waitingForAudio",Ct={waitingForAudio:"Waiting for current slide audio...",loadingAudio:"Loading current slide audio...",waitingForMoreAudio:"Waiting for more current slide audio..."},Pn=(h,S)=>typeof h=="string"?h:h[S]??h[Le]??Ct[S],jn=(h,S)=>S?h!=="loadingAudio":!1,_t=e.memo(({content:h,title:S,defaultButtonText:E,defaultInputText:Y,defaultSelectedValues:y,confirmButtonText:q,copyButtonText:X,copiedButtonText:ge,onSend:Ae,readonly:O=!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:S})}),r.jsxRuntimeExports.jsx("div",{className:"slide-player__interaction-body",children:r.jsxRuntimeExports.jsx(vn.default,{content:h,defaultButtonText:E,defaultInputText:Y,defaultSelectedValues:y,confirmButtonText:q,copyButtonText:X,copiedButtonText:ge,onSend:Ae,readonly:O,enableTypewriter:!1,sandboxMode:"content"})})]}));_t.displayName="InteractionOverlayCard";const Fn=(h,S)=>h.length===S.length&&h.every((E,Y)=>{const y=S[Y];return E.sequence_number===y?.sequence_number&&E.type===y?.type&&E.content===y?.content}),Bn=({elementList:h=[],showPlayer:S=!0,playerAlwaysVisible:E=!1,playerClassName:Y,fullscreenHeader:y,playerCustomActions:q,playerCustomActionPauseOnActive:X=!0,bufferingText:ge=Ct,interactionTitle:Ae,interactionTexts:O,playerTexts:Mt,playerAutoHideDelay:Re=3e3,markerAutoAdvanceDelay:Ke=_n,interactionDefaultValueOptions:ce,onSend:Ve,onPlayerVisibilityChange:Ie,onMobileViewModeChange:De,onStepChange:Ue,enableIframeScaling:kt=!0,disableLoadingOverlay:R=!1,className:Tt,onPointerDown:We,...Pt})=>{const ae=e.useRef(null),Ge=e.useRef(null),we=e.useRef(null),He=e.useRef(null),J=e.useRef(null),Q=e.useRef(null),Z=e.useRef(null),ee=e.useRef(null),ze=e.useRef(null),$e=e.useRef([]),de=e.useRef(!1),L=e.useRef(null),Ye=e.useRef(null),Xe=e.useRef({markerCount:0,currentIndex:-1,canGoNext:!1}),{currentElementList:_,stepElementLists:Je,slideElementList:M,currentIndex:c,audioList:d,currentAudioSequenceIndexes:fe,currentStepHasSpeakableElement:x,currentInteractionElement:i,canGoPrev:jt,canGoNext:v,handlePrev:Qe,handleNext:I}=yn.default(h),te=e.useMemo(()=>{if(!(c<0))return M[c]},[c,M]),Ft=M.filter(t=>t.is_renderable!==!1).length===1,g=S&&(M.length>0||d.length>0||!!i),P=e.useMemo(()=>fe.map(t=>d[t]?.audioKey).filter(t=>!!t),[d,fe]),[Ze,me]=e.useState(!0),[pe,ne]=e.useState(!1),[re,et]=e.useState(!0),[f,K]=e.useState(null),[Bt,m]=e.useState(!1),[Nt,Ce]=e.useState(Le),[j,_e]=e.useState(!1),[tt,nt]=e.useState(null),[qt,Me]=e.useState(!1),[rt,Ot]=e.useState(!0),[ke,Te]=e.useState(!1),[s,Pe]=e.useState(),[he,xe]=e.useState(!1),[Lt,se]=e.useState(0),[st,Kt]=e.useState(!1),k=e.useMemo(()=>ye.isMobileDevice(),[]),[be,je]=e.useState(ie.DEFAULT_MOBILE_VIEW_MODE),[ot,Fe]=e.useState(!1),[Vt,ut]=e.useState(()=>k?ye.isLandscapeViewport():!1),V=e.useMemo(()=>In.createPlaybackTimeStore(),[]),{effectiveMobileViewMode:D,isImmersiveMobileFullscreen:U,isNativeMobileFullscreen:lt,shouldRotateFullscreenViewport:Dt}=e.useMemo(()=>ie.resolveMobileViewModeState({hasManualMobileViewMode:ot,isMobileDevice:k,mobileViewMode:be}),[ot,k,Vt,be]),Ut=e.useRef(D),w=g&&(E||Ze),Wt=U&&w,Gt=U&&w,Ht=U||lt,it=st&&!k,zt=e.useCallback(t=>{Fe(!0),je(t)},[]),ct=e.useCallback(()=>{Fe(!1),je(ie.DEFAULT_MOBILE_VIEW_MODE)},[]),$t=e.useCallback(()=>{ct(),y?.onBack?.()},[y,ct]),at=e.useCallback(t=>{Te(t)},[]),dt=e.useCallback(()=>{Te(t=>!t)},[]),{mountedStepStates:Yt,currentMountedStateIndex:Xt}=e.useMemo(()=>{const t=[],n=new Map;return Je.forEach((u,a)=>{const o=t.findIndex(l=>Fn(l.elementList,u));if(o>=0){t[o]?.sourceStepIndexes.push(a),n.set(a,o);return}t.push({elementList:u,sourceStepIndexes:[a]}),n.set(a,t.length-1)}),{mountedStepStates:t,currentMountedStateIndex:c>=0?n.get(c)??-1:-1}},[c,Je]),ft=e.useMemo(()=>String(c),[c]),p=e.useMemo(()=>f?d.findIndex(t=>(t.audioKey??"")===f):-1,[d,f]),Be=e.useMemo(()=>p>=0?d[p]:void 0,[d,p]),Jt=Be?.element?.subtitle_cues??[],ve=e.useMemo(()=>P[0]??"none",[P]),F=e.useMemo(()=>It.resolveNextPendingAudioKey({audioSequenceKeys:P,lastCompletedAudioKey:tt}),[P,tt]),Ne=e.useMemo(()=>({currentElement:wt.resolvePlayerCustomActionElement({currentAudioIndex:p,currentAudioSequenceIndexes:fe,audioList:d,currentInteractionElement:s,currentStepElement:te}),currentIndex:c,currentStepElement:te,isActive:ke,setActive:at,toggleActive:dt}),[s,d,p,fe,c,te,ke,at,dt]),qe=e.useMemo(()=>wt.getPlayerCustomActionCount(q,Ne),[Ne,q]),Qt=e.useMemo(()=>({"--slide-player-custom-action-count":String(qe),"--slide-player-mobile-control-count":String(qe+4)}),[qe]),mt=P.length>0,pt=e.useMemo(()=>i?`${i.sequence_number??"none"}:${String(i.content??"")}`:"none",[i]),oe=e.useMemo(()=>[ft,pt].join("|"),[pt,ft]),Zt=e.useMemo(()=>[oe,Be?.audioKey??"none",String(p)].join("|"),[p,Be?.audioKey,oe]),ht=!!e.useMemo(()=>!ve||ve==="none"?"":d.find(n=>n.audioKey===ve)?.audioUrl?.trim()??"",[d,ve]),B=X&&!!q&&ke,ue=e.useMemo(()=>wn.shouldUseAutoAdvanceToggle({canGoNext:v,currentAudioIndex:p,currentStepHasSpeakableElement:x,hasInteraction:!!i}),[v,p,i,x]),N=e.useCallback(()=>{J.current!==null&&(window.clearTimeout(J.current),J.current=null)},[]),T=e.useCallback(()=>{Z.current!==null&&(window.clearTimeout(Z.current),Z.current=null)},[]),C=e.useCallback(()=>{ee.current!==null&&(window.clearTimeout(ee.current),ee.current=null)},[]),W=e.useCallback(()=>{Q.current!==null&&(window.clearTimeout(Q.current),Q.current=null)},[]),G=e.useCallback(()=>{W(),T(),C(),K(null),V.reset(),m(!1),Ce(Le),_e(!1),nt(null),Me(!1),Pe(void 0),xe(!1),se(0)},[W,T,C,V]),H=e.useCallback(()=>F?(_e(!1),K(F),!0):!1,[F]),Se=e.useCallback(()=>{T(),C(),xe(!1),se(0),!H()&&v&&I()},[v,T,C,I,H]),xt=e.useCallback(t=>{if(C(),!t)return;const n=()=>{ee.current=null,se(kn),xe(!0),L.current=null};ee.current=window.setTimeout(n,Mn)},[C]),b=e.useCallback((t=pe)=>{g&&(me(!0),N(),!(E||!t||Re<=0)&&(J.current=window.setTimeout(()=>{me(!1),J.current=null},Re)))},[N,pe,E,Re,g]),le=!!(i?.readonly||i?.user_input?.trim()),z=!!i&&!le;e.useEffect(()=>{et(!0),X&&Te(!1)},[c,X]),e.useEffect(()=>()=>{W(),N(),T(),C()},[W,T,C,N]),e.useEffect(()=>(Ie?.(w),()=>{Ie?.(!1)}),[Ie,w]),e.useEffect(()=>{k||be===ie.DEFAULT_MOBILE_VIEW_MODE||(Fe(!1),je(ie.DEFAULT_MOBILE_VIEW_MODE))},[k,be]),e.useEffect(()=>{if(!k){ut(!1);return}const t=()=>{ut(ye.isLandscapeViewport())};return t(),ye.subscribeMobileDeviceChange(t)},[k]),e.useEffect(()=>{De?.(D)},[D,De]),e.useEffect(()=>{Ut.current=D},[D]),e.useEffect(()=>{Ue?.(te,c)},[c,te,Ue]),e.useEffect(()=>{const t=Xe.current,n=Rn.shouldAutoAdvanceIntoAppendedMarker({previousMarkerCount:t.markerCount,nextMarkerCount:M.length,previousIndex:t.currentIndex,previousCanGoNext:t.canGoNext,nextCanGoNext:v,currentAudioKey:f,hasCompletedCurrentStepAudio:j,hasResolvedCurrentInteraction:le,currentStepHasSpeakableElement:x,currentInteractionElement:i,isAutoAdvanceEnabled:re,shouldUseSilentStepAutoAdvanceToggle:ue});Xe.current={markerCount:M.length,currentIndex:c,canGoNext:v},n&&I()},[v,f,c,i,x,I,j,le,re,ue,M.length]),e.useEffect(()=>{if(!g){N(),me(!1);return}if(E){N(),me(!0);return}pe||b(!0)},[N,pe,E,g,b]),e.useEffect(()=>{if(typeof window>"u")return;const t=n=>{n.origin===window.location.origin&&xn.isSandboxInteractionMessage(n.data)&&n.data.eventType==="click"&&g&&(ne(!0),b(!0))};return window.addEventListener("message",t),()=>{window.removeEventListener("message",t)}},[g,b]),gn.default({sectionRef:ae,enabled:g,onWake:()=>{ne(!0),b(!0)}}),e.useEffect(()=>{const{hasPlaybackContextChanged:t,shouldInitializeAudioSequence:n}=It.getPlaybackSequenceTransition({previousResetKey:Ye.current,nextResetKey:oe,currentAudioKey:f,hasCompletedCurrentStepAudio:j});Ye.current=oe;const u=L.current===c&&!!i,a=An.shouldPresentInteractionOverlay({hasInteraction:!!i,shouldBlockPlaybackForInteraction:z,shouldOpenInteractionOverlayAfterAudio:u,hasPlaybackContextChanged:t,hasResolvedCurrentInteraction:le,currentStepHasSpeakableElement:x});if(t&&G(),!(_.length===0&&!i)&&!B){if(i&&Pe(i),a){xt(i);return}if(C(),L.current=null,!!n&&!H()){if(x){if(R){m(!1);return}m(!0);return}if(v&&!(ue&&!re))return Q.current=window.setTimeout(()=>{Q.current=null,I()},Ke),()=>{W()}}}},[v,W,_.length,i,f,oe,x,Ke,I,j,R,re,le,z,C,G,xt,H,B,ue]),e.useEffect(()=>{if(R||B||!x||z){m(!1);return}if(j&&!F){m(!1);return}if(mt){m(!1);return}Ce("waitingForAudio"),m(!0)},[mt,x,j,F,R,B,z]),e.useEffect(()=>{f||!F||B||!x||z||H()},[f,F,x,B,z,H]),e.useEffect(()=>{!f||p>=0||K(null)},[p,f]),e.useEffect(()=>{p>=0||V.reset()},[p,V]),e.useEffect(()=>{Me(!1)},[Zt]);const bt=e.useMemo(()=>{if(!s)return{};const t=!!s.user_input?.trim();return Rt.getInteractionDefaultValues(typeof s.content=="string"?s.content:void 0,s.user_input,t?void 0:ce)},[s,ce]),en=e.useMemo(()=>{if(!s)return;const t=!!s.user_input?.trim();return Rt.getInteractionDefaultSelectedValues(typeof s.content=="string"?s.content:void 0,s.user_input,t?void 0:ce)},[s,ce]),vt=!!s?.user_input?.trim(),St=!!s?.readonly||vt,Et=St||vt,Oe=!!s&&he,tn=e.useCallback(t=>{const u=[...t.selectedValues??[],t.inputText?.trim()??"",t.buttonText?.trim()??""].filter(Boolean).join(", ");Pe(a=>!a||!u?a:{...a,user_input:u}),Ve?.(t,s),Se()},[s,Se,Ve]);e.useEffect(()=>{const t=()=>{Kt(document.fullscreenElement===ae.current)};return t(),document.addEventListener("fullscreenchange",t),()=>{document.removeEventListener("fullscreenchange",t)}},[]),e.useEffect(()=>{if(!Oe){se(0);return}const t=ze.current;if(!t)return;const n=()=>{const a=Math.ceil(t.getBoundingClientRect().height);se(a+Tn)};if(n(),typeof ResizeObserver>"u")return;const u=new ResizeObserver(()=>{n()});return u.observe(t),()=>{u.disconnect()}},[Oe]),e.useEffect(()=>{if(T(),!(!he||!Et))return Z.current=window.setTimeout(()=>{Z.current=null,Se()},2e3),()=>{T()}},[T,Se,he,Et]);const nn=(t,n={})=>t?t.type==="slot"?r.jsxRuntimeExports.jsx(r.jsxRuntimeExports.Fragment,{children:t.content}):t.type==="html"?r.jsxRuntimeExports.jsx(At.default,{className:"content-render-iframe",disableLoadingOverlay:R,hideFullScreen:!0,mode:"blackboard",replaceRootScreenHeightWithFull:n.replaceRootScreenHeightWithFull,type:"sandbox",content:t.content,enableScaling:kt}):r.jsxRuntimeExports.jsx(At.default,{className:"content-render-iframe",disableLoadingOverlay:R,hideFullScreen:!0,mode:"blackboard",type:"markdown",content:t.content}):null,rn=(t=[],n=!1)=>{if(t.length===0)return null;const u=t.filter(o=>o.is_renderable!==!1).length,a=t.reduce((o,l,A)=>l.is_renderable!==!1?A:o,-1);return r.jsxRuntimeExports.jsx("div",{className:"slide-stage__content flex w-full flex-col gap-4",children:t.map((o,l)=>{const A=o.type==="html"&&o.is_renderable===!1;return r.jsxRuntimeExports.jsx("div",{ref:n&&l===a?He:null,"aria-hidden":A||void 0,className:$.cn("w-full shrink-0",u===1&&o.is_renderable!==!1&&"slide-element--single",A?"pointer-events-none fixed left-[-200vw] top-0 -z-10 h-[100dvh] w-[100vw] overflow-hidden opacity-0":o.is_renderable===!1&&"hidden"),children:nn(o,{replaceRootScreenHeightWithFull:u===1&&o.type==="html"&&o.is_renderable!==!1})},o.sequence_number??`${o.type}-${l}`)})})},sn=e.useCallback(()=>{const t=ae.current;if(t){if(document.fullscreenElement===t){document.exitFullscreen().catch(()=>{});return}t.requestFullscreen?.().catch(()=>{})}},[]),yt=e.useCallback(()=>{const t=we.current;t&&t.scrollTo({top:t.scrollHeight,behavior:"smooth"})},[]),on=e.useCallback(()=>{de.current=!0,L.current=null,ne(!0),m(!1),b(!0),G(),Qe()},[Qe,G,b]),un=e.useCallback(()=>{de.current=!0,L.current=null,ne(!0),m(!1),b(!0),G(),I()},[I,G,b]),ln=e.useCallback(({loading:t,reason:n})=>{if(R){m(!1);return}if(!x||j){m(!1);return}t&&n&&Ce(n),m(jn(n,t))},[x,j,R]);e.useEffect(()=>{R&&m(!1)},[R]);const cn=e.useCallback(t=>{const n=d[t]?.audioKey;if(!n||!f||n!==f)return;const u=P.findIndex(l=>l===n);if(u<0){K(null);return}const a=u+1,o=P[a];if(o){K(o);return}if(K(null),nt(n),_e(!0),m(!1),v){const l=c+1,A=M[l];ht&&A?.type==="interaction"&&(L.current=l),I();return}},[d,v,c,f,P,I,ht,M]),an=e.useCallback(()=>{s&&xe(t=>!t)},[s]),gt=e.useCallback(t=>{t.stopPropagation(),w&&b(!0)},[Ze,b]),dn=e.useCallback(t=>{We?.(t)},[We]),fn=e.useCallback(()=>{ne(!0),b(!0)},[b]),Ee=e.useMemo(()=>_.map((t,n)=>`${t.sequence_number??`${t.type}-${n}`}:${String(t.is_new??"")}`),[_]);return e.useEffect(()=>{const t=$e.current,a=(t.length>0&&t.length<Ee.length&&t.every((l,A)=>l===Ee[A])?_.slice(t.length):[]).some(l=>l.is_new===!1);if($e.current=Ee,!a)return;const o=window.requestAnimationFrame(()=>{const l=we.current,A=He.current;if(!l||!A)return;const mn=l.getBoundingClientRect(),pn=A.getBoundingClientRect(),hn=l.scrollTop+(pn.top-mn.top);l.scrollTo({top:Math.max(hn,0),behavior:"smooth"})});return()=>{window.cancelAnimationFrame(o)}},[_,Ee]),e.useEffect(()=>{if(!de.current||(de.current=!1,_.length===0))return;const t=window.requestAnimationFrame(()=>{yt()});return()=>{window.cancelAnimationFrame(t)}},[_,yt]),r.jsxRuntimeExports.jsxs("section",{ref:ae,className:$.cn("relative h-full w-full",k&&"slide--mobile-device",it&&"slide--browser-fullscreen",U&&"slide--mobile-landscape",lt&&"slide--mobile-landscape-native",Tt),onClick:fn,onPointerDown:dn,...Pt,children:[Ht?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:Ge,className:$.cn("slide__viewport relative h-full min-h-0 w-full",U&&"slide__viewport--mobile-landscape",U&&!Dt&&"slide__viewport--mobile-landscape-native"),children:[Wt?r.jsxRuntimeExports.jsxs("div",{className:"slide-landscape-header",children:[r.jsxRuntimeExports.jsx("button",{"aria-label":y?.backAriaLabel??"Back",className:"slide-landscape-header__back",onClick:$t,type:"button",children:r.jsxRuntimeExports.jsx(Cn.default,{className:"slide-landscape-header__icon h-6 w-6",strokeWidth:2.25})}),y?.content?r.jsxRuntimeExports.jsx("div",{className:"min-w-0 flex-1 overflow-hidden",children:y.content}):null]}):null,r.jsxRuntimeExports.jsx("div",{className:$.cn("h-full min-h-0 w-full",Gt&&"slide__viewport-content--with-header",Ft?"slide-content--single":"grid gap-4"),children:_.length>0?r.jsxRuntimeExports.jsx("div",{className:"slide-stage",children:r.jsxRuntimeExports.jsx("div",{ref:we,className:"slide-stage__layer w-full",children:Yt.map((t,n)=>{const u=n===Xt;return r.jsxRuntimeExports.jsx("div",{"aria-hidden":!u||void 0,className:"w-full h-full",style:{display:u?void 0:"none"},children:rn(t.elementList,u)},t.sourceStepIndexes[0]??n)})})}):null}),Bt?r.jsxRuntimeExports.jsx(bn.default,{message:Pn(ge,Nt),className:"absolute left-1/2 top-1/2 z-[3] -translate-x-1/2 -translate-y-1/2"}):null,r.jsxRuntimeExports.jsx(En.default,{extraBottomOffset:Lt,hasPlayerGap:w,isEnabled:rt&&qt,isPlayerHidden:g&&!w,playbackTimeStore:V,subtitleCues:Jt}),Oe?r.jsxRuntimeExports.jsx("div",{ref:ze,className:$.cn("slide-interaction-overlay",w&&g?"slide-interaction-overlay--with-player":"slide-interaction-overlay--standalone"),onClick:gt,onPointerDown:gt,style:Qt,children:r.jsxRuntimeExports.jsx(_t,{content:String(s?.content??""),defaultButtonText:bt.buttonText??"",defaultInputText:bt.inputText??"",defaultSelectedValues:en,confirmButtonText:O?.confirmButtonText,copyButtonText:O?.copyButtonText,copiedButtonText:O?.copiedButtonText,onSend:tn,readonly:St,title:O?.title??Ae??"Submit the content below to continue."})}):null,g?r.jsxRuntimeExports.jsx(Sn.default,{audioList:d,className:$.cn("absolute left-1/2 z-[2] -translate-x-1/2",it?"bottom-3":"-bottom-3",Y,!w&&"pointer-events-none opacity-0"),currentAudioIndex:p,defaultPlaying:!0,isPlaybackPaused:B,isAutoAdvanceEnabled:re,hasInteraction:!!s,isInteractionOpen:he,isSubtitleEnabled:rt,onAutoAdvanceToggle:et,onLoadingChange:ln,onPlaybackStarted:()=>{Me(!0)},onPlaybackTimeChange:V.setTime,onSubtitleToggle:()=>{Ot(t=>!t)},nextDisabled:!v,onEnded:cn,onFullscreen:sn,isFullscreen:st,mobileViewMode:D,settingsPortalContainer:Ge.current,onMobileViewModeChange:zt,onInteractionToggle:an,onNext:un,onPrev:on,prevDisabled:!jt,showControls:w,texts:Mt,customActionContext:Ne,customActions:q,useAutoAdvanceToggle:ue}):null]})]})};exports.default=Bn;
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 type { SlidePlayerLoadingReason } from \"./Player\";\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;\nconst DEFAULT_BUFFERING_REASON = \"waitingForAudio\";\n\nexport type SlideBufferingReason =\n | \"waitingForAudio\"\n | SlidePlayerLoadingReason;\n\nexport type SlideBufferingTextConfig =\n | string\n | Partial<Record<SlideBufferingReason, string>>;\n\nconst DEFAULT_SLIDE_BUFFERING_TEXTS: Record<SlideBufferingReason, string> = {\n waitingForAudio: \"Waiting for current slide audio...\",\n loadingAudio: \"Loading current slide audio...\",\n waitingForMoreAudio: \"Waiting for more current slide audio...\",\n};\n\nconst resolveBufferingTextByReason = (\n bufferingText: SlideBufferingTextConfig,\n reason: SlideBufferingReason\n) => {\n if (typeof bufferingText === \"string\") {\n return bufferingText;\n }\n\n return (\n bufferingText[reason] ??\n bufferingText[DEFAULT_BUFFERING_REASON] ??\n DEFAULT_SLIDE_BUFFERING_TEXTS[reason]\n );\n};\n\nconst shouldShowBufferingOverlay = (\n reason: SlideBufferingReason | null,\n loading: boolean\n) => {\n if (!loading) {\n return false;\n }\n\n // Keep the silent preload/loading phase invisible until audio is actually playable.\n return reason !== \"loadingAudio\";\n};\n\nconst formatSlideDebugAlert = (\n reason: string,\n details: Record<string, string | number | boolean | null | undefined> = {}\n) => {\n const detailText = Object.entries(details)\n .map(([key, value]) => `${key}=${String(value)}`)\n .join(\", \");\n\n return detailText\n ? `[slide-debug] ${reason} | ${detailText}`\n : `[slide-debug] ${reason}`;\n};\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 extends Pick<\n ContentRenderProps,\n \"confirmButtonText\" | \"copyButtonText\" | \"copiedButtonText\"\n> {\n title?: string;\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\nexport interface SlideProps extends React.ComponentProps<\"section\"> {\n elementList?: Element[];\n showPlayer?: boolean;\n playerAlwaysVisible?: boolean;\n playerClassName?: string;\n fullscreenHeader?: SlideFullscreenHeader;\n playerCustomActions?: PlayerProps[\"customActions\"];\n playerCustomActionPauseOnActive?: boolean;\n bufferingText?: SlideBufferingTextConfig;\n interactionTitle?: string;\n interactionTexts?: SlideInteractionTexts;\n playerTexts?: SlidePlayerTexts;\n playerAutoHideDelay?: number;\n markerAutoAdvanceDelay?: number;\n interactionDefaultValueOptions?: InteractionDefaultValueOptions;\n onSend?: (content: OnSendContentParams, element?: Element) => void;\n onPlayerVisibilityChange?: (visible: boolean) => void;\n onMobileViewModeChange?: (viewMode: MobileViewMode) => void;\n onStepChange?: (element: Element | undefined, index: number) => void;\n enableIframeScaling?: boolean;\n disableLoadingOverlay?: boolean;\n}\n\nconst Slide: React.FC<SlideProps> = ({\n elementList = [],\n showPlayer = true,\n playerAlwaysVisible = false,\n playerClassName,\n fullscreenHeader,\n playerCustomActions,\n playerCustomActionPauseOnActive = true,\n bufferingText = DEFAULT_SLIDE_BUFFERING_TEXTS,\n interactionTitle,\n interactionTexts,\n playerTexts,\n playerAutoHideDelay = 3000,\n markerAutoAdvanceDelay = DEFAULT_MARKER_AUTO_ADVANCE_DELAY_MS,\n interactionDefaultValueOptions,\n onSend,\n onPlayerVisibilityChange,\n onMobileViewModeChange,\n onStepChange,\n enableIframeScaling = true,\n disableLoadingOverlay = false,\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 interactionOverlayRef = useRef<HTMLDivElement | null>(null);\n const prevRenderElementKeysRef = useRef<string[]>([]);\n const shouldScrollToBottomRef = 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 slideDebugAlertHistoryRef = useRef<Set<string>>(new Set());\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 alertDebug = useCallback(\n (\n reason: string,\n details: Record<string, string | number | boolean | null | undefined> = {}\n ) => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const alertKey = `${currentIndex}:${reason}`;\n if (slideDebugAlertHistoryRef.current.has(alertKey)) {\n return;\n }\n\n slideDebugAlertHistoryRef.current.add(alertKey);\n window.alert(\n formatSlideDebugAlert(reason, {\n step: currentIndex,\n ...details,\n })\n );\n },\n [currentIndex]\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 [audioLoadingReason, setAudioLoadingReason] =\n useState<SlideBufferingReason>(DEFAULT_BUFFERING_REASON);\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 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 isDesktopBrowserFullscreen = isBrowserFullscreen && !isMobileDevice;\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 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 resetAudioSequence = useCallback(() => {\n clearAutoAdvanceTimer();\n clearInteractionAutoCloseTimer();\n clearInteractionOverlayOpenTimer();\n setCurrentAudioKey(null);\n playbackTimeStore.reset();\n setIsAudioLoadingVisible(false);\n setAudioLoadingReason(DEFAULT_BUFFERING_REASON);\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 };\n }, [\n clearAutoAdvanceTimer,\n clearInteractionAutoCloseTimer,\n clearInteractionOverlayOpenTimer,\n clearPlayerHideTimer,\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 previousEffectiveMobileViewModeRef.current = effectiveMobileViewMode;\n }, [effectiveMobileViewMode]);\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 alertDebug(\"custom-action-paused\");\n return;\n }\n\n if (currentInteractionElement) {\n setActiveInteractionElement(currentInteractionElement);\n }\n\n if (shouldPresentOverlay) {\n alertDebug(\"interaction-blocked\", {\n interactionResolved: hasResolvedCurrentInteraction,\n afterAudio: shouldOpenInteractionOverlayAfterAudio,\n });\n\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 (disableLoadingOverlay) {\n setIsAudioLoadingVisible(false);\n return;\n }\n\n alertDebug(\"waiting-for-audio\", {\n audioSequenceCount: currentAudioSequenceKeys.length,\n });\n setIsAudioLoadingVisible(true);\n return;\n }\n\n if (!canGoNext) {\n return;\n }\n\n if (shouldUseSilentStepAutoAdvanceToggle && !isAutoAdvanceEnabled) {\n alertDebug(\"silent-step-auto-advance-disabled\");\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 disableLoadingOverlay,\n isAutoAdvanceEnabled,\n hasResolvedCurrentInteraction,\n shouldBlockPlaybackForInteraction,\n clearInteractionOverlayOpenTimer,\n resetAudioSequence,\n scheduleInteractionOverlayOpen,\n startCurrentAudioSequence,\n shouldPausePlaybackForCustomAction,\n shouldUseSilentStepAutoAdvanceToggle,\n alertDebug,\n currentAudioSequenceKeys.length,\n ]);\n\n useEffect(() => {\n if (\n disableLoadingOverlay ||\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 alertDebug(\"waiting-for-audio\", {\n audioSequenceCount: currentAudioSequenceKeys.length,\n });\n setAudioLoadingReason(\"waitingForAudio\");\n setIsAudioLoadingVisible(true);\n }, [\n hasAvailableStepAudio,\n currentStepHasSpeakableElement,\n hasCompletedCurrentStepAudio,\n disableLoadingOverlay,\n shouldPausePlaybackForCustomAction,\n shouldBlockPlaybackForInteraction,\n alertDebug,\n currentAudioSequenceKeys.length,\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 disableLoadingOverlay={disableLoadingOverlay}\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 disableLoadingOverlay={disableLoadingOverlay}\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 ({\n loading,\n reason,\n }: {\n loading: boolean;\n reason: SlidePlayerLoadingReason | null;\n }) => {\n if (disableLoadingOverlay) {\n setIsAudioLoadingVisible(false);\n return;\n }\n\n if (!currentStepHasSpeakableElement || hasCompletedCurrentStepAudio) {\n setIsAudioLoadingVisible(false);\n return;\n }\n\n if (loading && reason) {\n setAudioLoadingReason(reason);\n if (reason === \"waitingForMoreAudio\") {\n alertDebug(\"waiting-for-more-audio\", {\n hasNextStep: canGoNext,\n });\n }\n }\n setIsAudioLoadingVisible(shouldShowBufferingOverlay(reason, loading));\n },\n [\n alertDebug,\n canGoNext,\n currentStepHasSpeakableElement,\n hasCompletedCurrentStepAudio,\n disableLoadingOverlay,\n ]\n );\n\n useEffect(() => {\n if (!disableLoadingOverlay) {\n return;\n }\n\n setIsAudioLoadingVisible(false);\n }, [disableLoadingOverlay]);\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 return;\n }\n\n alertDebug(\"audio-ended-without-next-step\", {\n canGoNext,\n nextIndex: currentIndex + 1,\n });\n },\n [\n alertDebug,\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 isDesktopBrowserFullscreen && \"slide--browser-fullscreen\",\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\n className=\"slide-landscape-header__icon h-6 w-6\"\n strokeWidth={2.25}\n />\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={resolveBufferingTextByReason(\n bufferingText,\n audioLoadingReason\n )}\n className=\"absolute left-1/2 top-1/2 z-[3] -translate-x-1/2 -translate-y-1/2\"\n />\n ) : null}\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 z-[2] -translate-x-1/2\",\n isDesktopBrowserFullscreen ? \"bottom-3\" : \"-bottom-3\",\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","DEFAULT_BUFFERING_REASON","DEFAULT_SLIDE_BUFFERING_TEXTS","resolveBufferingTextByReason","bufferingText","reason","shouldShowBufferingOverlay","loading","formatSlideDebugAlert","details","detailText","key","value","InteractionOverlayCard","memo","content","title","defaultButtonText","defaultInputText","defaultSelectedValues","confirmButtonText","copyButtonText","copiedButtonText","onSend","readonly","jsxs","jsx","ContentRender","areStepElementListsEqual","prevElementList","nextElementList","element","index","nextElement","Slide","elementList","showPlayer","playerAlwaysVisible","playerClassName","fullscreenHeader","playerCustomActions","playerCustomActionPauseOnActive","interactionTitle","interactionTexts","playerTexts","playerAutoHideDelay","markerAutoAdvanceDelay","interactionDefaultValueOptions","onPlayerVisibilityChange","onMobileViewModeChange","onStepChange","enableIframeScaling","disableLoadingOverlay","className","onPointerDown","props","sectionRef","useRef","viewportRef","stageLayerRef","lastElementRef","playerHideTimerRef","autoAdvanceTimerRef","interactionAutoCloseTimerRef","interactionOverlayOpenTimerRef","interactionOverlayRef","prevRenderElementKeysRef","shouldScrollToBottomRef","pendingInteractionOverlayStepIndexRef","playbackResetKeyRef","appendedMarkerAdvanceStateRef","slideDebugAlertHistoryRef","currentElementList","stepElementLists","slideElementList","currentIndex","audioList","currentAudioSequenceIndexes","currentStepHasSpeakableElement","currentInteractionElement","canGoPrev","canGoNext","goPrev","goNext","useSlide","currentStepElement","useMemo","isSingleSlide","shouldRenderPlayer","currentAudioSequenceKeys","audioIndex","audioKey","alertDebug","useCallback","alertKey","isPlayerVisible","setIsPlayerVisible","useState","hasPlayerInteracted","setHasPlayerInteracted","isAutoAdvanceEnabled","setIsAutoAdvanceEnabled","currentAudioKey","setCurrentAudioKey","isAudioLoadingVisible","setIsAudioLoadingVisible","audioLoadingReason","setAudioLoadingReason","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","playbackTimeStore","createPlaybackTimeStore","effectiveMobileViewMode","isImmersiveMobileFullscreen","isNativeMobileFullscreen","shouldRotateFullscreenViewport","resolveMobileViewModeState","previousEffectiveMobileViewModeRef","playerVisible","shouldShowFullscreenHeader","shouldApplyFullscreenViewportPadding","shouldShowMobileFullscreenMask","isDesktopBrowserFullscreen","handleMobileViewModeSelect","nextViewMode","handleMobileViewModeReset","handleFullscreenHeaderBack","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","resetAudioSequence","startCurrentAudioSequence","nextAudioKey","continueAfterInteraction","scheduleInteractionOverlayOpen","interactionElement","openOverlay","showPlayerControls","enableAutoHide","hasResolvedCurrentInteraction","shouldBlockPlaybackForInteraction","useEffect","syncViewportFullscreenPreference","subscribeMobileDeviceChange","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","handlePlayerEnded","endedAudioKey","activeSequencePosition","audioSequenceKey","nextSequencePosition","nextStepIndex","nextStepElement","handleInteractionToggle","prevOpen","stopOverlayPropagation","handleSurfacePointerDown","handleSurfaceClick","currentRenderElementKeys","prevKeys","shouldAutoScrollToAppend","animationFrameId","targetElement","stageLayerRect","targetRect","nextScrollTop","ChevronLeft","mountedStepStateIndex","LoadingOverlayCard","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 type { SlidePlayerLoadingReason } from \"./Player\";\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 {\n getPlaybackSequenceTransition,\n resolveNextPendingAudioKey,\n} 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;\nconst DEFAULT_BUFFERING_REASON = \"waitingForAudio\";\n\nexport type SlideBufferingReason = \"waitingForAudio\" | SlidePlayerLoadingReason;\n\nexport type SlideBufferingTextConfig =\n | string\n | Partial<Record<SlideBufferingReason, string>>;\n\nconst DEFAULT_SLIDE_BUFFERING_TEXTS: Record<SlideBufferingReason, string> = {\n waitingForAudio: \"Waiting for current slide audio...\",\n loadingAudio: \"Loading current slide audio...\",\n waitingForMoreAudio: \"Waiting for more current slide audio...\",\n};\n\nconst resolveBufferingTextByReason = (\n bufferingText: SlideBufferingTextConfig,\n reason: SlideBufferingReason\n) => {\n if (typeof bufferingText === \"string\") {\n return bufferingText;\n }\n\n return (\n bufferingText[reason] ??\n bufferingText[DEFAULT_BUFFERING_REASON] ??\n DEFAULT_SLIDE_BUFFERING_TEXTS[reason]\n );\n};\n\nconst shouldShowBufferingOverlay = (\n reason: SlideBufferingReason | null,\n loading: boolean\n) => {\n if (!loading) {\n return false;\n }\n\n // Keep the silent preload/loading phase invisible until audio is actually playable.\n return reason !== \"loadingAudio\";\n};\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 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\nexport interface SlideProps extends React.ComponentProps<\"section\"> {\n elementList?: Element[];\n showPlayer?: boolean;\n playerAlwaysVisible?: boolean;\n playerClassName?: string;\n fullscreenHeader?: SlideFullscreenHeader;\n playerCustomActions?: PlayerProps[\"customActions\"];\n playerCustomActionPauseOnActive?: boolean;\n bufferingText?: SlideBufferingTextConfig;\n interactionTitle?: string;\n interactionTexts?: SlideInteractionTexts;\n playerTexts?: SlidePlayerTexts;\n playerAutoHideDelay?: number;\n markerAutoAdvanceDelay?: number;\n interactionDefaultValueOptions?: InteractionDefaultValueOptions;\n onSend?: (content: OnSendContentParams, element?: Element) => void;\n onPlayerVisibilityChange?: (visible: boolean) => void;\n onMobileViewModeChange?: (viewMode: MobileViewMode) => void;\n onStepChange?: (element: Element | undefined, index: number) => void;\n enableIframeScaling?: boolean;\n disableLoadingOverlay?: boolean;\n}\n\nconst Slide: React.FC<SlideProps> = ({\n elementList = [],\n showPlayer = true,\n playerAlwaysVisible = false,\n playerClassName,\n fullscreenHeader,\n playerCustomActions,\n playerCustomActionPauseOnActive = true,\n bufferingText = DEFAULT_SLIDE_BUFFERING_TEXTS,\n interactionTitle,\n interactionTexts,\n playerTexts,\n playerAutoHideDelay = 3000,\n markerAutoAdvanceDelay = DEFAULT_MARKER_AUTO_ADVANCE_DELAY_MS,\n interactionDefaultValueOptions,\n onSend,\n onPlayerVisibilityChange,\n onMobileViewModeChange,\n onStepChange,\n enableIframeScaling = true,\n disableLoadingOverlay = false,\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 interactionOverlayRef = useRef<HTMLDivElement | null>(null);\n const prevRenderElementKeysRef = useRef<string[]>([]);\n const shouldScrollToBottomRef = 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 [audioLoadingReason, setAudioLoadingReason] =\n useState<SlideBufferingReason>(DEFAULT_BUFFERING_REASON);\n const [hasCompletedCurrentStepAudio, setHasCompletedCurrentStepAudio] =\n useState(false);\n const [lastCompletedStepAudioKey, setLastCompletedStepAudioKey] = useState<\n string | null\n >(null);\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 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 isDesktopBrowserFullscreen = isBrowserFullscreen && !isMobileDevice;\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 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 nextPendingAudioKey = useMemo(\n () =>\n resolveNextPendingAudioKey({\n audioSequenceKeys: currentAudioSequenceKeys,\n lastCompletedAudioKey: lastCompletedStepAudioKey,\n }),\n [currentAudioSequenceKeys, lastCompletedStepAudioKey]\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 resetAudioSequence = useCallback(() => {\n clearAutoAdvanceTimer();\n clearInteractionAutoCloseTimer();\n clearInteractionOverlayOpenTimer();\n setCurrentAudioKey(null);\n playbackTimeStore.reset();\n setIsAudioLoadingVisible(false);\n setAudioLoadingReason(DEFAULT_BUFFERING_REASON);\n setHasCompletedCurrentStepAudio(false);\n setLastCompletedStepAudioKey(null);\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 if (!nextPendingAudioKey) {\n return false;\n }\n\n // Resume from the next unplayed audio item when streaming appends more\n // speakable content to the current marker after earlier audio finished.\n setHasCompletedCurrentStepAudio(false);\n setCurrentAudioKey(nextPendingAudioKey);\n return true;\n }, [nextPendingAudioKey]);\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 };\n }, [\n clearAutoAdvanceTimer,\n clearInteractionAutoCloseTimer,\n clearInteractionOverlayOpenTimer,\n clearPlayerHideTimer,\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 previousEffectiveMobileViewModeRef.current = effectiveMobileViewMode;\n }, [effectiveMobileViewMode]);\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 (disableLoadingOverlay) {\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 disableLoadingOverlay,\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 disableLoadingOverlay ||\n shouldPausePlaybackForCustomAction ||\n !currentStepHasSpeakableElement ||\n shouldBlockPlaybackForInteraction\n ) {\n setIsAudioLoadingVisible(false);\n return;\n }\n\n if (hasCompletedCurrentStepAudio && !nextPendingAudioKey) {\n setIsAudioLoadingVisible(false);\n return;\n }\n\n if (hasAvailableStepAudio) {\n setIsAudioLoadingVisible(false);\n return;\n }\n\n setAudioLoadingReason(\"waitingForAudio\");\n setIsAudioLoadingVisible(true);\n }, [\n hasAvailableStepAudio,\n currentStepHasSpeakableElement,\n hasCompletedCurrentStepAudio,\n nextPendingAudioKey,\n disableLoadingOverlay,\n shouldPausePlaybackForCustomAction,\n shouldBlockPlaybackForInteraction,\n ]);\n\n useEffect(() => {\n if (currentAudioKey || !nextPendingAudioKey) {\n return;\n }\n\n if (\n shouldPausePlaybackForCustomAction ||\n !currentStepHasSpeakableElement ||\n shouldBlockPlaybackForInteraction\n ) {\n return;\n }\n\n startCurrentAudioSequence();\n }, [\n currentAudioKey,\n nextPendingAudioKey,\n currentStepHasSpeakableElement,\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 disableLoadingOverlay={disableLoadingOverlay}\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 disableLoadingOverlay={disableLoadingOverlay}\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 ({\n loading,\n reason,\n }: {\n loading: boolean;\n reason: SlidePlayerLoadingReason | null;\n }) => {\n if (disableLoadingOverlay) {\n setIsAudioLoadingVisible(false);\n return;\n }\n\n if (!currentStepHasSpeakableElement || hasCompletedCurrentStepAudio) {\n setIsAudioLoadingVisible(false);\n return;\n }\n\n if (loading && reason) {\n setAudioLoadingReason(reason);\n }\n setIsAudioLoadingVisible(shouldShowBufferingOverlay(reason, loading));\n },\n [\n currentStepHasSpeakableElement,\n hasCompletedCurrentStepAudio,\n disableLoadingOverlay,\n ]\n );\n\n useEffect(() => {\n if (!disableLoadingOverlay) {\n return;\n }\n\n setIsAudioLoadingVisible(false);\n }, [disableLoadingOverlay]);\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 setLastCompletedStepAudioKey(endedAudioKey);\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 return;\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 isDesktopBrowserFullscreen && \"slide--browser-fullscreen\",\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\n className=\"slide-landscape-header__icon h-6 w-6\"\n strokeWidth={2.25}\n />\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={resolveBufferingTextByReason(\n bufferingText,\n audioLoadingReason\n )}\n className=\"absolute left-1/2 top-1/2 z-[3] -translate-x-1/2 -translate-y-1/2\"\n />\n ) : null}\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 z-[2] -translate-x-1/2\",\n isDesktopBrowserFullscreen ? \"bottom-3\" : \"-bottom-3\",\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","DEFAULT_BUFFERING_REASON","DEFAULT_SLIDE_BUFFERING_TEXTS","resolveBufferingTextByReason","bufferingText","reason","shouldShowBufferingOverlay","loading","InteractionOverlayCard","memo","content","title","defaultButtonText","defaultInputText","defaultSelectedValues","confirmButtonText","copyButtonText","copiedButtonText","onSend","readonly","jsxs","jsx","ContentRender","areStepElementListsEqual","prevElementList","nextElementList","element","index","nextElement","Slide","elementList","showPlayer","playerAlwaysVisible","playerClassName","fullscreenHeader","playerCustomActions","playerCustomActionPauseOnActive","interactionTitle","interactionTexts","playerTexts","playerAutoHideDelay","markerAutoAdvanceDelay","interactionDefaultValueOptions","onPlayerVisibilityChange","onMobileViewModeChange","onStepChange","enableIframeScaling","disableLoadingOverlay","className","onPointerDown","props","sectionRef","useRef","viewportRef","stageLayerRef","lastElementRef","playerHideTimerRef","autoAdvanceTimerRef","interactionAutoCloseTimerRef","interactionOverlayOpenTimerRef","interactionOverlayRef","prevRenderElementKeysRef","shouldScrollToBottomRef","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","audioLoadingReason","setAudioLoadingReason","hasCompletedCurrentStepAudio","setHasCompletedCurrentStepAudio","lastCompletedStepAudioKey","setLastCompletedStepAudioKey","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","playbackTimeStore","createPlaybackTimeStore","effectiveMobileViewMode","isImmersiveMobileFullscreen","isNativeMobileFullscreen","shouldRotateFullscreenViewport","resolveMobileViewModeState","previousEffectiveMobileViewModeRef","playerVisible","shouldShowFullscreenHeader","shouldApplyFullscreenViewportPadding","shouldShowMobileFullscreenMask","isDesktopBrowserFullscreen","handleMobileViewModeSelect","useCallback","nextViewMode","handleMobileViewModeReset","handleFullscreenHeaderBack","setPlayerCustomActionActive","active","togglePlayerCustomActionActive","previous","mountedStepStates","currentMountedStateIndex","nextMountedStepStates","mountedStateIndexByStep","stepElementList","stepIndex","existingMountedStateIndex","mountedStepState","currentStepKey","currentAudioIndex","audioItem","currentAudioItem","currentSubtitleCues","currentAudioSequenceStartKey","nextPendingAudioKey","resolveNextPendingAudioKey","playerCustomActionContext","resolvePlayerCustomActionElement","playerCustomActionCount","getPlayerCustomActionCount","interactionOverlayStyle","hasAvailableStepAudio","currentInteractionResetKey","currentPlaybackResetKey","currentPlaybackStartedResetKey","hasCurrentStepAudioUrl","shouldPausePlaybackForCustomAction","shouldUseSilentStepAutoAdvanceToggle","shouldUseAutoAdvanceToggle","clearPlayerHideTimer","clearInteractionAutoCloseTimer","clearInteractionOverlayOpenTimer","clearAutoAdvanceTimer","resetAudioSequence","startCurrentAudioSequence","continueAfterInteraction","scheduleInteractionOverlayOpen","interactionElement","openOverlay","showPlayerControls","enableAutoHide","hasResolvedCurrentInteraction","shouldBlockPlaybackForInteraction","useEffect","syncViewportFullscreenPreference","subscribeMobileDeviceChange","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","handlePlayerEnded","endedAudioKey","activeSequencePosition","audioSequenceKey","nextSequencePosition","nextAudioKey","nextStepIndex","nextStepElement","handleInteractionToggle","prevOpen","stopOverlayPropagation","handleSurfacePointerDown","handleSurfaceClick","currentRenderElementKeys","prevKeys","shouldAutoScrollToAppend","key","animationFrameId","targetElement","stageLayerRect","targetRect","nextScrollTop","ChevronLeft","mountedStepStateIndex","LoadingOverlayCard","SubtitleOverlay","Player","previousEnabled"],"mappings":"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"}