markdown-flow-ui 0.1.115-beta.1 → 0.1.115-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const r=require("../../_virtual/jsx-runtime.cjs.js"),t=require("react"),fn=require("../../lib/sandboxInteraction.cjs.js"),z=require("../../lib/utils.cjs.js"),mn=require("../ui/loading-overlay-card.cjs.js"),pn=require("../ContentRender/ContentRender.cjs.js"),St=require("../ContentRender/IframeSandbox.cjs.js");require("../ui/inputGroup/input-group.cjs.js");const yt=require("../../lib/interaction-defaults.cjs.js"),Se=require("../../lib/mobileDevice.cjs.js"),hn=require("./Player.cjs.js"),xn=require("./SubtitleOverlay.cjs.js"),bn=require("./useSlide.cjs.js"),vn=require("./useWakePlayerFromIframe.cjs.js"),le=require("./utils/mobileScreenMode.cjs.js"),En=require("./utils/interactionPlayback.cjs.js"),Sn=require("./utils/appendedMarkerAdvance.cjs.js"),yn=require("./utils/playbackSequence.cjs.js"),gt=require("./utils/playerCustomActions.cjs.js"),gn=require("./utils/playbackTimeStore.cjs.js"),An=require("./utils/playerToggleMode.cjs.js");;/* empty css */const Rn=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"),In=2e3,wn=300,_n=160,Cn=16,qe="waitingForAudio",At={waitingForAudio:"Waiting for current slide audio...",loadingAudio:"Loading current slide audio...",waitingForMoreAudio:"Waiting for more current slide audio..."},Mn=(v,M)=>typeof v=="string"?v:v[M]??v[qe]??At[M],Rt=t.memo(({content:v,title:M,defaultButtonText:E,defaultInputText:$,defaultSelectedValues:S,confirmButtonText:N,copyButtonText:Y,copiedButtonText:ye,onSend:ge,readonly:q=!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:M})}),r.jsxRuntimeExports.jsx("div",{className:"slide-player__interaction-body",children:r.jsxRuntimeExports.jsx(pn.default,{content:v,defaultButtonText:E,defaultInputText:$,defaultSelectedValues:S,confirmButtonText:N,copyButtonText:Y,copiedButtonText:ye,onSend:ge,readonly:q,enableTypewriter:!1,sandboxMode:"content"})})]}));Rt.displayName="InteractionOverlayCard";const kn=(v,M)=>v.length===M.length&&v.every((E,$)=>{const S=M[$];return E.sequence_number===S?.sequence_number&&E.type===S?.type&&E.content===S?.content}),Tn=({elementList:v=[],showPlayer:M=!0,playerAlwaysVisible:E=!1,playerClassName:$,fullscreenHeader:S,playerCustomActions:N,playerCustomActionPauseOnActive:Y=!0,bufferingText:ye=At,interactionTitle:ge,interactionTexts:q,playerTexts:It,playerAutoHideDelay:Ae=3e3,markerAutoAdvanceDelay:Oe=In,interactionDefaultValueOptions:ie,onSend:Le,onPlayerVisibilityChange:Re,onMobileViewModeChange:Ve,onStepChange:De,enableIframeScaling:wt=!0,disableLoadingOverlay:A=!1,className:_t,onPointerDown:Ke,...Ct})=>{const ce=t.useRef(null),Ue=t.useRef(null),Ie=t.useRef(null),We=t.useRef(null),X=t.useRef(null),J=t.useRef(null),Q=t.useRef(null),Z=t.useRef(null),Ge=t.useRef(null),He=t.useRef([]),ae=t.useRef(!1),O=t.useRef(null),ze=t.useRef(null),$e=t.useRef({markerCount:0,currentIndex:-1,canGoNext:!1}),{currentElementList:k,stepElementLists:Ye,slideElementList:T,currentIndex:c,audioList:d,currentAudioSequenceIndexes:de,currentStepHasSpeakableElement:h,currentInteractionElement:i,canGoPrev:Mt,canGoNext:b,handlePrev:Xe,handleNext:R}=bn.default(v),ee=t.useMemo(()=>{if(!(c<0))return T[c]},[c,T]),kt=T.filter(e=>e.is_renderable!==!1).length===1,y=M&&(T.length>0||d.length>0||!!i),I=t.useMemo(()=>de.map(e=>d[e]?.audioKey).filter(e=>!!e),[d,de]),[Je,fe]=t.useState(!0),[me,te]=t.useState(!1),[ne,Qe]=t.useState(!0),[f,L]=t.useState(null),[Tt,m]=t.useState(!1),[Pt,we]=t.useState(qe),[w,Ze]=t.useState(!1),[jt,_e]=t.useState(!1),[et,Ft]=t.useState(!0),[Ce,Me]=t.useState(!1),[s,ke]=t.useState(),[pe,he]=t.useState(!1),[Bt,re]=t.useState(0),[tt,Nt]=t.useState(!1),P=t.useMemo(()=>Se.isMobileDevice(),[]),[xe,Te]=t.useState(le.DEFAULT_MOBILE_VIEW_MODE),[nt,Pe]=t.useState(!1),[qt,rt]=t.useState(()=>P?Se.isLandscapeViewport():!1),V=t.useMemo(()=>gn.createPlaybackTimeStore(),[]),{effectiveMobileViewMode:D,isImmersiveMobileFullscreen:K,isNativeMobileFullscreen:st,shouldRotateFullscreenViewport:Ot}=t.useMemo(()=>le.resolveMobileViewModeState({hasManualMobileViewMode:nt,isMobileDevice:P,mobileViewMode:xe}),[nt,P,qt,xe]),Lt=t.useRef(D),_=y&&(E||Je),Vt=K&&_,Dt=K&&_,Kt=K||st,ot=tt&&!P,Ut=t.useCallback(e=>{Pe(!0),Te(e)},[]),ut=t.useCallback(()=>{Pe(!1),Te(le.DEFAULT_MOBILE_VIEW_MODE)},[]),Wt=t.useCallback(()=>{ut(),S?.onBack?.()},[S,ut]),lt=t.useCallback(e=>{Me(e)},[]),it=t.useCallback(()=>{Me(e=>!e)},[]),{mountedStepStates:Gt,currentMountedStateIndex:Ht}=t.useMemo(()=>{const e=[],n=new Map;return Ye.forEach((u,a)=>{const o=e.findIndex(l=>kn(l.elementList,u));if(o>=0){e[o]?.sourceStepIndexes.push(a),n.set(a,o);return}e.push({elementList:u,sourceStepIndexes:[a]}),n.set(a,e.length-1)}),{mountedStepStates:e,currentMountedStateIndex:c>=0?n.get(c)??-1:-1}},[c,Ye]),ct=t.useMemo(()=>String(c),[c]),p=t.useMemo(()=>f?d.findIndex(e=>(e.audioKey??"")===f):-1,[d,f]),je=t.useMemo(()=>p>=0?d[p]:void 0,[d,p]),zt=je?.element?.subtitle_cues??[],be=t.useMemo(()=>I[0]??"none",[I]),Fe=t.useMemo(()=>({currentElement:gt.resolvePlayerCustomActionElement({currentAudioIndex:p,currentAudioSequenceIndexes:de,audioList:d,currentInteractionElement:s,currentStepElement:ee}),currentIndex:c,currentStepElement:ee,isActive:Ce,setActive:lt,toggleActive:it}),[s,d,p,de,c,ee,Ce,lt,it]),Be=t.useMemo(()=>gt.getPlayerCustomActionCount(N,Fe),[Fe,N]),$t=t.useMemo(()=>({"--slide-player-custom-action-count":String(Be),"--slide-player-mobile-control-count":String(Be+4)}),[Be]),at=I.length>0,dt=t.useMemo(()=>i?`${i.sequence_number??"none"}:${String(i.content??"")}`:"none",[i]),se=t.useMemo(()=>[ct,dt].join("|"),[dt,ct]),Yt=t.useMemo(()=>[se,je?.audioKey??"none",String(p)].join("|"),[p,je?.audioKey,se]),ft=!!t.useMemo(()=>!be||be==="none"?"":d.find(n=>n.audioKey===be)?.audioUrl?.trim()??"",[d,be]),F=Y&&!!N&&Ce,oe=t.useMemo(()=>An.shouldUseAutoAdvanceToggle({canGoNext:b,currentAudioIndex:p,currentStepHasSpeakableElement:h,hasInteraction:!!i}),[b,p,i,h]),B=t.useCallback(()=>{X.current!==null&&(window.clearTimeout(X.current),X.current=null)},[]),j=t.useCallback(()=>{Q.current!==null&&(window.clearTimeout(Q.current),Q.current=null)},[]),C=t.useCallback(()=>{Z.current!==null&&(window.clearTimeout(Z.current),Z.current=null)},[]),U=t.useCallback(()=>{J.current!==null&&(window.clearTimeout(J.current),J.current=null)},[]),W=t.useCallback(()=>{U(),j(),C(),L(null),V.reset(),m(!1),we(qe),Ze(!1),_e(!1),ke(void 0),he(!1),re(0)},[U,j,C,V]),G=t.useCallback(()=>{const e=I[0];return e?(L(e),!0):!1},[I]),ve=t.useCallback(()=>{j(),C(),he(!1),re(0),!G()&&b&&R()},[b,j,C,R,G]),mt=t.useCallback(e=>{if(C(),!e)return;const n=()=>{Z.current=null,re(_n),he(!0),O.current=null};Z.current=window.setTimeout(n,wn)},[C]),x=t.useCallback((e=me)=>{y&&(fe(!0),B(),!(E||!e||Ae<=0)&&(X.current=window.setTimeout(()=>{fe(!1),X.current=null},Ae)))},[B,me,E,Ae,y]),ue=!!(i?.readonly||i?.user_input?.trim()),H=!!i&&!ue;t.useEffect(()=>{Qe(!0),Y&&Me(!1)},[c,Y]),t.useEffect(()=>()=>{U(),B(),j(),C()},[U,j,C,B]),t.useEffect(()=>(Re?.(_),()=>{Re?.(!1)}),[Re,_]),t.useEffect(()=>{P||xe===le.DEFAULT_MOBILE_VIEW_MODE||(Pe(!1),Te(le.DEFAULT_MOBILE_VIEW_MODE))},[P,xe]),t.useEffect(()=>{if(!P){rt(!1);return}const e=()=>{rt(Se.isLandscapeViewport())};return e(),Se.subscribeMobileDeviceChange(e)},[P]),t.useEffect(()=>{Ve?.(D)},[D,Ve]),t.useEffect(()=>{Lt.current=D},[D]),t.useEffect(()=>{De?.(ee,c)},[c,ee,De]),t.useEffect(()=>{const e=$e.current,n=Sn.shouldAutoAdvanceIntoAppendedMarker({previousMarkerCount:e.markerCount,nextMarkerCount:T.length,previousIndex:e.currentIndex,previousCanGoNext:e.canGoNext,nextCanGoNext:b,currentAudioKey:f,hasCompletedCurrentStepAudio:w,hasResolvedCurrentInteraction:ue,currentStepHasSpeakableElement:h,currentInteractionElement:i,isAutoAdvanceEnabled:ne,shouldUseSilentStepAutoAdvanceToggle:oe});$e.current={markerCount:T.length,currentIndex:c,canGoNext:b},n&&R()},[b,f,c,i,h,R,w,ue,ne,oe,T.length]),t.useEffect(()=>{if(!y){B(),fe(!1);return}if(E){B(),fe(!0);return}me||x(!0)},[B,me,E,y,x]),t.useEffect(()=>{if(typeof window>"u")return;const e=n=>{n.origin===window.location.origin&&fn.isSandboxInteractionMessage(n.data)&&n.data.eventType==="click"&&y&&(te(!0),x(!0))};return window.addEventListener("message",e),()=>{window.removeEventListener("message",e)}},[y,x]),vn.default({sectionRef:ce,enabled:y,onWake:()=>{te(!0),x(!0)}}),t.useEffect(()=>{const{hasPlaybackContextChanged:e,shouldInitializeAudioSequence:n}=yn.getPlaybackSequenceTransition({previousResetKey:ze.current,nextResetKey:se,currentAudioKey:f,hasCompletedCurrentStepAudio:w});ze.current=se;const u=O.current===c&&!!i,a=En.shouldPresentInteractionOverlay({hasInteraction:!!i,shouldBlockPlaybackForInteraction:H,shouldOpenInteractionOverlayAfterAudio:u,hasPlaybackContextChanged:e,hasResolvedCurrentInteraction:ue,currentStepHasSpeakableElement:h});if(e&&W(),!(k.length===0&&!i)&&!F){if(i&&ke(i),a){mt(i);return}if(C(),O.current=null,!!n&&!G()){if(h){if(A){m(!1);return}m(!0);return}if(b&&!(oe&&!ne))return J.current=window.setTimeout(()=>{J.current=null,R()},Oe),()=>{U()}}}},[b,U,k.length,i,f,se,h,Oe,R,w,A,ne,ue,H,C,W,mt,G,F,oe]),t.useEffect(()=>{if(A||F||!h||H){m(!1);return}if(w){m(!1);return}if(at){m(!1);return}we("waitingForAudio"),m(!0)},[at,h,w,A,F,H]),t.useEffect(()=>{f||I.length===0||F||!h||H||w||G()},[f,I,h,w,F,H,G]),t.useEffect(()=>{!f||p>=0||L(null)},[p,f]),t.useEffect(()=>{p>=0||V.reset()},[p,V]),t.useEffect(()=>{_e(!1)},[Yt]);const pt=t.useMemo(()=>{if(!s)return{};const e=!!s.user_input?.trim();return yt.getInteractionDefaultValues(typeof s.content=="string"?s.content:void 0,s.user_input,e?void 0:ie)},[s,ie]),Xt=t.useMemo(()=>{if(!s)return;const e=!!s.user_input?.trim();return yt.getInteractionDefaultSelectedValues(typeof s.content=="string"?s.content:void 0,s.user_input,e?void 0:ie)},[s,ie]),ht=!!s?.user_input?.trim(),xt=!!s?.readonly||ht,bt=xt||ht,Ne=!!s&&pe,Jt=t.useCallback(e=>{const u=[...e.selectedValues??[],e.inputText?.trim()??"",e.buttonText?.trim()??""].filter(Boolean).join(", ");ke(a=>!a||!u?a:{...a,user_input:u}),Le?.(e,s),ve()},[s,ve,Le]);t.useEffect(()=>{const e=()=>{Nt(document.fullscreenElement===ce.current)};return e(),document.addEventListener("fullscreenchange",e),()=>{document.removeEventListener("fullscreenchange",e)}},[]),t.useEffect(()=>{if(!Ne){re(0);return}const e=Ge.current;if(!e)return;const n=()=>{const a=Math.ceil(e.getBoundingClientRect().height);re(a+Cn)};if(n(),typeof ResizeObserver>"u")return;const u=new ResizeObserver(()=>{n()});return u.observe(e),()=>{u.disconnect()}},[Ne]),t.useEffect(()=>{if(j(),!(!pe||!bt))return Q.current=window.setTimeout(()=>{Q.current=null,ve()},2e3),()=>{j()}},[j,ve,pe,bt]);const Qt=(e,n={})=>e?e.type==="slot"?r.jsxRuntimeExports.jsx(r.jsxRuntimeExports.Fragment,{children:e.content}):e.type==="html"?r.jsxRuntimeExports.jsx(St.default,{className:"content-render-iframe",disableLoadingOverlay:A,hideFullScreen:!0,mode:"blackboard",replaceRootScreenHeightWithFull:n.replaceRootScreenHeightWithFull,type:"sandbox",content:e.content,enableScaling:wt}):r.jsxRuntimeExports.jsx(St.default,{className:"content-render-iframe",disableLoadingOverlay:A,hideFullScreen:!0,mode:"blackboard",type:"markdown",content:e.content}):null,Zt=(e=[],n=!1)=>{if(e.length===0)return null;const u=e.filter(o=>o.is_renderable!==!1).length,a=e.reduce((o,l,g)=>l.is_renderable!==!1?g:o,-1);return r.jsxRuntimeExports.jsx("div",{className:"slide-stage__content flex w-full flex-col gap-4",children:e.map((o,l)=>{const g=o.type==="html"&&o.is_renderable===!1;return r.jsxRuntimeExports.jsx("div",{ref:n&&l===a?We:null,"aria-hidden":g||void 0,className:z.cn("w-full shrink-0",u===1&&o.is_renderable!==!1&&"slide-element--single",g?"pointer-events-none fixed left-[-200vw] top-0 -z-10 h-[100dvh] w-[100vw] overflow-hidden opacity-0":o.is_renderable===!1&&"hidden"),children:Qt(o,{replaceRootScreenHeightWithFull:u===1&&o.type==="html"&&o.is_renderable!==!1})},o.sequence_number??`${o.type}-${l}`)})})},en=t.useCallback(()=>{const e=ce.current;if(e){if(document.fullscreenElement===e){document.exitFullscreen().catch(()=>{});return}e.requestFullscreen?.().catch(()=>{})}},[]),vt=t.useCallback(()=>{const e=Ie.current;e&&e.scrollTo({top:e.scrollHeight,behavior:"smooth"})},[]),tn=t.useCallback(()=>{ae.current=!0,O.current=null,te(!0),m(!1),x(!0),W(),Xe()},[Xe,W,x]),nn=t.useCallback(()=>{ae.current=!0,O.current=null,te(!0),m(!1),x(!0),W(),R()},[R,W,x]),rn=t.useCallback(({loading:e,reason:n})=>{if(A){m(!1);return}if(!h||w){m(!1);return}e&&n&&we(n),m(e)},[h,w,A]);t.useEffect(()=>{A&&m(!1)},[A]);const sn=t.useCallback(e=>{const n=d[e]?.audioKey;if(!n||!f||n!==f)return;const u=I.findIndex(l=>l===n);if(u<0){L(null);return}const a=u+1,o=I[a];if(o){L(o);return}if(L(null),Ze(!0),m(!1),b){const l=c+1,g=T[l];ft&&g?.type==="interaction"&&(O.current=l),R()}},[d,b,c,f,I,R,ft,T]),on=t.useCallback(()=>{s&&he(e=>!e)},[s]),Et=t.useCallback(e=>{e.stopPropagation(),_&&x(!0)},[Je,x]),un=t.useCallback(e=>{Ke?.(e)},[Ke]),ln=t.useCallback(()=>{te(!0),x(!0)},[x]),Ee=t.useMemo(()=>k.map((e,n)=>`${e.sequence_number??`${e.type}-${n}`}:${String(e.is_new??"")}`),[k]);return t.useEffect(()=>{const e=He.current,a=(e.length>0&&e.length<Ee.length&&e.every((l,g)=>l===Ee[g])?k.slice(e.length):[]).some(l=>l.is_new===!1);if(He.current=Ee,!a)return;const o=window.requestAnimationFrame(()=>{const l=Ie.current,g=We.current;if(!l||!g)return;const cn=l.getBoundingClientRect(),an=g.getBoundingClientRect(),dn=l.scrollTop+(an.top-cn.top);l.scrollTo({top:Math.max(dn,0),behavior:"smooth"})});return()=>{window.cancelAnimationFrame(o)}},[k,Ee]),t.useEffect(()=>{if(!ae.current||(ae.current=!1,k.length===0))return;const e=window.requestAnimationFrame(()=>{vt()});return()=>{window.cancelAnimationFrame(e)}},[k,vt]),r.jsxRuntimeExports.jsxs("section",{ref:ce,className:z.cn("relative h-full w-full",P&&"slide--mobile-device",ot&&"slide--browser-fullscreen",K&&"slide--mobile-landscape",st&&"slide--mobile-landscape-native",_t),onClick:ln,onPointerDown:un,...Ct,children:[Kt?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:Ue,className:z.cn("slide__viewport relative h-full min-h-0 w-full",K&&"slide__viewport--mobile-landscape",K&&!Ot&&"slide__viewport--mobile-landscape-native"),children:[Vt?r.jsxRuntimeExports.jsxs("div",{className:"slide-landscape-header",children:[r.jsxRuntimeExports.jsx("button",{"aria-label":S?.backAriaLabel??"Back",className:"slide-landscape-header__back",onClick:Wt,type:"button",children:r.jsxRuntimeExports.jsx(Rn.default,{className:"slide-landscape-header__icon h-6 w-6",strokeWidth:2.25})}),S?.content?r.jsxRuntimeExports.jsx("div",{className:"min-w-0 flex-1 overflow-hidden",children:S.content}):null]}):null,r.jsxRuntimeExports.jsx("div",{className:z.cn("h-full min-h-0 w-full",Dt&&"slide__viewport-content--with-header",kt?"slide-content--single":"grid gap-4"),children:k.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 u=n===Ht;return r.jsxRuntimeExports.jsx("div",{"aria-hidden":!u||void 0,className:"w-full h-full",style:{display:u?void 0:"none"},children:Zt(e.elementList,u)},e.sourceStepIndexes[0]??n)})})}):null}),Tt?r.jsxRuntimeExports.jsx(mn.default,{message:Mn(ye,Pt),className:"absolute left-1/2 top-1/2 z-[3] -translate-x-1/2 -translate-y-1/2"}):null,r.jsxRuntimeExports.jsx(xn.default,{extraBottomOffset:Bt,hasPlayerGap:_,isEnabled:et&&jt,isPlayerHidden:y&&!_,playbackTimeStore:V,subtitleCues:zt}),Ne?r.jsxRuntimeExports.jsx("div",{ref:Ge,className:z.cn("slide-interaction-overlay",_&&y?"slide-interaction-overlay--with-player":"slide-interaction-overlay--standalone"),onClick:Et,onPointerDown:Et,style:$t,children:r.jsxRuntimeExports.jsx(Rt,{content:String(s?.content??""),defaultButtonText:pt.buttonText??"",defaultInputText:pt.inputText??"",defaultSelectedValues:Xt,confirmButtonText:q?.confirmButtonText,copyButtonText:q?.copyButtonText,copiedButtonText:q?.copiedButtonText,onSend:Jt,readonly:xt,title:q?.title??ge??"Submit the content below to continue."})}):null,y?r.jsxRuntimeExports.jsx(hn.default,{audioList:d,className:z.cn("absolute left-1/2 z-[2] -translate-x-1/2",ot?"bottom-3":"-bottom-3",$,!_&&"pointer-events-none opacity-0"),currentAudioIndex:p,defaultPlaying:!0,isPlaybackPaused:F,isAutoAdvanceEnabled:ne,hasInteraction:!!s,isInteractionOpen:pe,isSubtitleEnabled:et,onAutoAdvanceToggle:Qe,onLoadingChange:rn,onPlaybackStarted:()=>{_e(!0)},onPlaybackTimeChange:V.setTime,onSubtitleToggle:()=>{Ft(e=>!e)},nextDisabled:!b,onEnded:sn,onFullscreen:en,isFullscreen:tt,mobileViewMode:D,settingsPortalContainer:Ue.current,onMobileViewModeChange:Ut,onInteractionToggle:on,onNext:nn,onPrev:tn,prevDisabled:!Mt,showControls:_,texts:It,customActionContext:Fe,customActions:N,useAutoAdvanceToggle:oe}):null]})]})};exports.default=Tn;
|
|
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;
|
|
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\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 {\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 [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 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) {\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 disableLoadingOverlay,\n shouldPausePlaybackForCustomAction,\n shouldBlockPlaybackForInteraction,\n ]);\n\n useEffect(() => {\n if (currentAudioKey || currentAudioSequenceKeys.length === 0) {\n return;\n }\n\n if (\n shouldPausePlaybackForCustomAction ||\n !currentStepHasSpeakableElement ||\n shouldBlockPlaybackForInteraction\n ) {\n return;\n }\n\n if (hasCompletedCurrentStepAudio) {\n return;\n }\n\n startCurrentAudioSequence();\n }, [\n currentAudioKey,\n currentAudioSequenceKeys,\n currentStepHasSpeakableElement,\n hasCompletedCurrentStepAudio,\n shouldPausePlaybackForCustomAction,\n shouldBlockPlaybackForInteraction,\n startCurrentAudioSequence,\n ]);\n\n useEffect(() => {\n if (!currentAudioKey || currentAudioIndex >= 0) {\n return;\n }\n\n setCurrentAudioKey(null);\n }, [currentAudioIndex, currentAudioKey]);\n\n useEffect(() => {\n if (currentAudioIndex >= 0) {\n return;\n }\n\n playbackTimeStore.reset();\n }, [currentAudioIndex, playbackTimeStore]);\n\n useEffect(() => {\n setHasCurrentAudioPlaybackStarted(false);\n }, [currentPlaybackStartedResetKey]);\n\n const interactionDefaults = useMemo(() => {\n if (!activeInteractionElement) {\n return {};\n }\n\n const shouldPreferResolvedInteractionInput = Boolean(\n activeInteractionElement.user_input?.trim()\n );\n\n return getInteractionDefaultValues(\n typeof activeInteractionElement.content === \"string\"\n ? activeInteractionElement.content\n : undefined,\n activeInteractionElement.user_input,\n shouldPreferResolvedInteractionInput\n ? undefined\n : interactionDefaultValueOptions\n );\n }, [activeInteractionElement, interactionDefaultValueOptions]);\n\n const interactionDefaultSelectedValues = useMemo(() => {\n if (!activeInteractionElement) {\n return undefined;\n }\n\n const shouldPreferResolvedInteractionInput = Boolean(\n activeInteractionElement.user_input?.trim()\n );\n\n return getInteractionDefaultSelectedValues(\n typeof activeInteractionElement.content === \"string\"\n ? activeInteractionElement.content\n : undefined,\n activeInteractionElement.user_input,\n shouldPreferResolvedInteractionInput\n ? undefined\n : interactionDefaultValueOptions\n );\n }, [activeInteractionElement, interactionDefaultValueOptions]);\n\n const hasResolvedInteractionInput = Boolean(\n activeInteractionElement?.user_input?.trim()\n );\n\n const isInteractionReadonly =\n Boolean(activeInteractionElement?.readonly) || hasResolvedInteractionInput;\n const shouldAutoContinueInteraction =\n isInteractionReadonly || hasResolvedInteractionInput;\n const shouldShowInteractionOverlay =\n Boolean(activeInteractionElement) && isInteractionOverlayOpen;\n\n const handleInteractionSend = useCallback(\n (content: OnSendContentParams) => {\n const submittedValues = [\n ...(content.selectedValues ?? []),\n content.inputText?.trim() ?? \"\",\n content.buttonText?.trim() ?? \"\",\n ].filter(Boolean);\n const resolvedUserInput = submittedValues.join(\", \");\n\n setActiveInteractionElement((prevElement) => {\n if (!prevElement || !resolvedUserInput) {\n return prevElement;\n }\n\n return {\n ...prevElement,\n user_input: resolvedUserInput,\n };\n });\n\n onSend?.(content, activeInteractionElement);\n continueAfterInteraction();\n },\n [activeInteractionElement, continueAfterInteraction, onSend]\n );\n\n useEffect(() => {\n // Keep the player icon in sync with the actual fullscreen owner.\n const syncFullscreenState = () => {\n setIsBrowserFullscreen(document.fullscreenElement === sectionRef.current);\n };\n\n syncFullscreenState();\n document.addEventListener(\"fullscreenchange\", syncFullscreenState);\n\n return () => {\n document.removeEventListener(\"fullscreenchange\", syncFullscreenState);\n };\n }, []);\n\n useEffect(() => {\n if (!shouldShowInteractionOverlay) {\n setInteractionOverlaySubtitleOffset(0);\n return;\n }\n\n const interactionOverlayElement = interactionOverlayRef.current;\n\n if (!interactionOverlayElement) {\n return;\n }\n\n const updateSubtitleOffset = () => {\n const overlayHeight = Math.ceil(\n interactionOverlayElement.getBoundingClientRect().height\n );\n\n setInteractionOverlaySubtitleOffset(\n overlayHeight + DEFAULT_INTERACTION_SUBTITLE_GAP_PX\n );\n };\n\n updateSubtitleOffset();\n\n if (typeof ResizeObserver === \"undefined\") {\n return;\n }\n\n const resizeObserver = new ResizeObserver(() => {\n updateSubtitleOffset();\n });\n\n resizeObserver.observe(interactionOverlayElement);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [shouldShowInteractionOverlay]);\n\n useEffect(() => {\n clearInteractionAutoCloseTimer();\n\n if (!isInteractionOverlayOpen || !shouldAutoContinueInteraction) {\n return;\n }\n\n // Auto-close passive interaction markers to keep playback moving.\n interactionAutoCloseTimerRef.current = window.setTimeout(() => {\n interactionAutoCloseTimerRef.current = null;\n\n continueAfterInteraction();\n }, 2000);\n\n return () => {\n clearInteractionAutoCloseTimer();\n };\n }, [\n clearInteractionAutoCloseTimer,\n continueAfterInteraction,\n isInteractionOverlayOpen,\n shouldAutoContinueInteraction,\n ]);\n\n const renderSlideElement = (\n element?: Element,\n options: RenderSlideElementOptions = {}\n ) => {\n if (!element) {\n return null;\n }\n\n if (element.type === \"slot\") {\n return <>{element.content}</>;\n }\n\n if (element.type === \"html\") {\n return (\n <IframeSandbox\n className=\"content-render-iframe\"\n 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(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 setHasCompletedCurrentStepAudio(true);\n setIsAudioLoadingVisible(false);\n\n if (canGoNext) {\n const nextStepIndex = currentIndex + 1;\n const nextStepElement = slideElementList[nextStepIndex];\n\n if (hasCurrentStepAudioUrl && nextStepElement?.type === \"interaction\") {\n pendingInteractionOverlayStepIndexRef.current = nextStepIndex;\n }\n\n goNext();\n }\n },\n [\n audioList,\n canGoNext,\n currentIndex,\n currentAudioKey,\n currentAudioSequenceKeys,\n goNext,\n hasCurrentStepAudioUrl,\n slideElementList,\n ]\n );\n\n const handleInteractionToggle = useCallback(() => {\n if (!activeInteractionElement) {\n return;\n }\n\n setIsInteractionOverlayOpen((prevOpen) => !prevOpen);\n }, [activeInteractionElement]);\n\n const stopOverlayPropagation = useCallback(\n (\n event:\n | React.PointerEvent<HTMLDivElement>\n | React.MouseEvent<HTMLDivElement>\n ) => {\n event.stopPropagation();\n\n // Keep the player visible a bit longer when users interact with the overlay.\n if (playerVisible) {\n showPlayerControls(true);\n }\n },\n [isPlayerVisible, showPlayerControls]\n );\n\n const handleSurfacePointerDown = useCallback(\n (event: React.PointerEvent<HTMLElement>) => {\n onPointerDown?.(event);\n },\n [onPointerDown]\n );\n\n const handleSurfaceClick = useCallback(() => {\n setHasPlayerInteracted(true);\n showPlayerControls(true);\n }, [showPlayerControls]);\n\n const currentRenderElementKeys = useMemo(\n () =>\n currentElementList.map(\n (element, index) =>\n `${element.sequence_number ?? `${element.type}-${index}`}:${String(element.is_new ?? \"\")}`\n ),\n [currentElementList]\n );\n\n useEffect(() => {\n const prevKeys = prevRenderElementKeysRef.current;\n const hasStablePrefix =\n prevKeys.length > 0 &&\n prevKeys.length < currentRenderElementKeys.length &&\n prevKeys.every((key, index) => key === currentRenderElementKeys[index]);\n const appendedElements = hasStablePrefix\n ? currentElementList.slice(prevKeys.length)\n : [];\n const shouldAutoScrollToAppend = appendedElements.some(\n (element) => element.is_new === false\n );\n\n prevRenderElementKeysRef.current = currentRenderElementKeys;\n\n if (!shouldAutoScrollToAppend) {\n return;\n }\n\n const animationFrameId = window.requestAnimationFrame(() => {\n const stageLayerElement = stageLayerRef.current;\n const targetElement = lastElementRef.current;\n\n if (!stageLayerElement || !targetElement) {\n return;\n }\n\n const stageLayerRect = stageLayerElement.getBoundingClientRect();\n const targetRect = targetElement.getBoundingClientRect();\n const nextScrollTop =\n stageLayerElement.scrollTop + (targetRect.top - stageLayerRect.top);\n\n // Keep newly appended content visible when the current slide grows downward.\n stageLayerElement.scrollTo({\n top: Math.max(nextScrollTop, 0),\n behavior: \"smooth\",\n });\n });\n\n return () => {\n window.cancelAnimationFrame(animationFrameId);\n };\n }, [currentElementList, currentRenderElementKeys]);\n\n useEffect(() => {\n if (!shouldScrollToBottomRef.current) {\n return;\n }\n\n shouldScrollToBottomRef.current = false;\n\n if (currentElementList.length === 0) {\n return;\n }\n\n const animationFrameId = window.requestAnimationFrame(() => {\n scrollStageToBottom();\n });\n\n return () => {\n window.cancelAnimationFrame(animationFrameId);\n };\n }, [currentElementList, scrollStageToBottom]);\n\n return (\n <section\n ref={sectionRef}\n className={cn(\n \"relative h-full w-full\",\n isMobileDevice && \"slide--mobile-device\",\n 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","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","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","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","loading","handlePlayerEnded","endedAudioKey","activeSequencePosition","audioSequenceKey","nextSequencePosition","nextStepIndex","nextStepElement","handleInteractionToggle","prevOpen","stopOverlayPropagation","handleSurfacePointerDown","handleSurfaceClick","currentRenderElementKeys","prevKeys","shouldAutoScrollToAppend","key","animationFrameId","targetElement","stageLayerRect","targetRect","nextScrollTop","ChevronLeft","mountedStepStateIndex","LoadingOverlayCard","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 { 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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"}
|