markdown-flow-ui 0.1.109 → 0.1.111

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