markdown-flow-ui 0.1.115 → 0.1.116-beta.0

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 (48) hide show
  1. package/dist/_virtual/index.cjs10.js +1 -1
  2. package/dist/_virtual/index.cjs8.js +1 -1
  3. package/dist/_virtual/index.cjs9.js +1 -1
  4. package/dist/_virtual/index.es10.js +2 -2
  5. package/dist/_virtual/index.es8.js +2 -3
  6. package/dist/_virtual/index.es8.js.map +1 -1
  7. package/dist/_virtual/index.es9.js +3 -2
  8. package/dist/_virtual/index.es9.js.map +1 -1
  9. package/dist/components/Slide/Player.cjs.js +1 -1
  10. package/dist/components/Slide/Player.cjs.js.map +1 -1
  11. package/dist/components/Slide/Player.d.ts +5 -1
  12. package/dist/components/Slide/Player.es.js +383 -355
  13. package/dist/components/Slide/Player.es.js.map +1 -1
  14. package/dist/components/Slide/Slide.cjs.js +1 -1
  15. package/dist/components/Slide/Slide.cjs.js.map +1 -1
  16. package/dist/components/Slide/Slide.d.ts +4 -2
  17. package/dist/components/Slide/Slide.es.js +448 -437
  18. package/dist/components/Slide/Slide.es.js.map +1 -1
  19. package/dist/components/Slide/Slide.stories.d.ts +1 -0
  20. package/dist/components/Slide/utils/audioCompletion.cjs.js +2 -0
  21. package/dist/components/Slide/utils/audioCompletion.cjs.js.map +1 -0
  22. package/dist/components/Slide/utils/audioCompletion.d.ts +7 -0
  23. package/dist/components/Slide/utils/audioCompletion.es.js +9 -0
  24. package/dist/components/Slide/utils/audioCompletion.es.js.map +1 -0
  25. package/dist/components/Slide/utils/audioCompletion.test.d.ts +1 -0
  26. package/dist/components/Slide/utils/playbackSource.cjs.js +2 -0
  27. package/dist/components/Slide/utils/playbackSource.cjs.js.map +1 -0
  28. package/dist/components/Slide/utils/playbackSource.d.ts +9 -0
  29. package/dist/components/Slide/utils/playbackSource.es.js +14 -0
  30. package/dist/components/Slide/utils/playbackSource.es.js.map +1 -0
  31. package/dist/components/Slide/utils/playbackSource.test.d.ts +1 -0
  32. package/dist/markdown-flow-ui/node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.cjs.js +1 -1
  33. package/dist/markdown-flow-ui/node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.cjs.js.map +1 -1
  34. package/dist/markdown-flow-ui/node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.es.js +1 -1
  35. package/dist/markdown-flow-ui/node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/index.cjs.js +1 -1
  36. package/dist/markdown-flow-ui/node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/index.es.js +1 -1
  37. package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/c4Diagram-YG6GDRKO.cjs.js +1 -1
  38. package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/c4Diagram-YG6GDRKO.es.js +1 -1
  39. package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-S3R3BYOJ.cjs.js +1 -1
  40. package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-S3R3BYOJ.es.js +1 -1
  41. package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-TZMSLE5B.cjs.js +1 -1
  42. package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-TZMSLE5B.es.js +1 -1
  43. package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/ganttDiagram-LVOFAZNH.cjs.js +1 -1
  44. package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/ganttDiagram-LVOFAZNH.es.js +1 -1
  45. package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/sequenceDiagram-WL72ISMW.cjs.js +1 -1
  46. package/dist/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/sequenceDiagram-WL72ISMW.es.js +1 -1
  47. package/dist/markdown-flow-ui-lib.css +1 -1
  48. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Player.es.js","sources":["../../../src/components/Slide/Player.tsx"],"sourcesContent":["import React, {\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n Captions,\n CaptionsOff,\n EllipsisVertical,\n FilePenLine,\n Maximize,\n RotateCcw,\n RotateCw,\n ScanLine,\n Volume2,\n} from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\nimport MobilePlayerSettingsSheet from \"./MobilePlayerSettingsSheet\";\nimport { DEFAULT_SLIDE_PLAYER_TEXTS } from \"./constants\";\nimport type { SlideAudioItem } from \"./useSlide\";\nimport type {\n SlidePlayerCustomActionContext,\n SlidePlayerCustomActions,\n} from \"./types\";\nimport {\n DEFAULT_MOBILE_VIEW_MODE,\n type MobileViewMode,\n} from \"./utils/mobileScreenMode\";\nimport { toPlayerCustomActionList } from \"./utils/playerCustomActions\";\nimport \"./player.css\";\n\nconst audioPreloadElementCache = new Map<string, HTMLAudioElement>();\n\nexport interface SlidePlayerTexts {\n settingsTitle?: string;\n subtitleLabel?: string;\n subtitleToggleAriaLabel?: string;\n screenLabel?: string;\n nonFullscreenLabel?: string;\n fullscreenLabel?: string;\n fullscreenHintText?: string;\n}\n\nconst preloadAudioUrl = (url?: string) => {\n if (typeof window === \"undefined\" || !url) {\n return;\n }\n\n if (audioPreloadElementCache.has(url)) {\n return;\n }\n\n // Use a detached audio element so warm-up follows the same media loading\n // path as the visible player instead of relying on link preload hints.\n const audio = window.document.createElement(\"audio\");\n audio.preload = \"auto\";\n audio.setAttribute(\"playsinline\", \"true\");\n audio.src = url;\n audio.load();\n\n audioPreloadElementCache.set(url, audio);\n};\n\nexport type PlayerProps = Omit<React.ComponentProps<\"div\">, \"onEnded\"> & {\n audioList?: SlideAudioItem[];\n currentAudioIndex?: number;\n defaultPlaying?: boolean;\n isPlaybackPaused?: boolean;\n isAutoAdvanceEnabled?: boolean;\n useAutoAdvanceToggle?: boolean;\n onLoadingChange?: (loading: boolean) => void;\n onPlaybackStarted?: () => void;\n onPlaybackTimeChange?: (timeMs: number) => void;\n onSubtitleToggle?: () => void;\n onPrev?: () => void;\n onNext?: () => void;\n onFullscreen?: () => void;\n isFullscreen?: boolean;\n mobileViewMode?: MobileViewMode;\n settingsPortalContainer?: HTMLElement | null;\n onMobileViewModeChange?: (viewMode: MobileViewMode) => void;\n onEnded?: (audioIndex: number) => void;\n onAutoAdvanceToggle?: (enabled: boolean) => void;\n onInteractionToggle?: () => void;\n hasInteraction?: boolean;\n isInteractionOpen?: boolean;\n isSubtitleEnabled?: boolean;\n prevDisabled?: boolean;\n nextDisabled?: boolean;\n showControls?: boolean;\n customActions?: SlidePlayerCustomActions;\n customActionContext?: SlidePlayerCustomActionContext;\n texts?: SlidePlayerTexts;\n};\n\nconst PauseIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"34\"\n height=\"34\"\n viewBox=\"0 0 34 34\"\n fill=\"none\"\n >\n <path\n d=\"M16.6667 33.3333C25.8714 33.3333 33.3333 25.8714 33.3333 16.6667C33.3333 7.46192 25.8714 0 16.6667 0C7.46192 0 0 7.46192 0 16.6667C0 25.8714 7.46192 33.3333 16.6667 33.3333Z\"\n fill=\"#0A0A0A\"\n />\n <path d=\"M12 10H16V24H12V10ZM18 10H22V24H18V10Z\" fill=\"white\" />\n </svg>\n);\n\nconst PlayIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"34\"\n height=\"34\"\n viewBox=\"0 0 34 34\"\n fill=\"none\"\n >\n <path\n d=\"M16.6667 33.3333C25.8714 33.3333 33.3333 25.8714 33.3333 16.6667C33.3333 7.46192 25.8714 0 16.6667 0C7.46192 0 0 7.46192 0 16.6667C0 25.8714 7.46192 33.3333 16.6667 33.3333Z\"\n fill=\"#0A0A0A\"\n />\n <path d=\"M13.3333 10L23.3333 16.6667L13.3333 23.3333V10Z\" fill=\"white\" />\n </svg>\n);\n\nconst Player = ({\n audioList = [],\n className,\n currentAudioIndex = -1,\n defaultPlaying = true,\n isPlaybackPaused = false,\n isAutoAdvanceEnabled = true,\n useAutoAdvanceToggle = false,\n onLoadingChange,\n onPlaybackStarted,\n onPlaybackTimeChange,\n onSubtitleToggle,\n onPrev,\n onNext,\n onFullscreen,\n isFullscreen = false,\n mobileViewMode = DEFAULT_MOBILE_VIEW_MODE,\n settingsPortalContainer,\n onMobileViewModeChange,\n onEnded,\n onAutoAdvanceToggle,\n onInteractionToggle,\n hasInteraction = false,\n isInteractionOpen = false,\n isSubtitleEnabled = true,\n prevDisabled = false,\n nextDisabled = false,\n showControls = true,\n customActions,\n customActionContext,\n texts,\n ...props\n}: PlayerProps) => {\n const audioRef = useRef<HTMLAudioElement | null>(null);\n const previousInteractionOpenRef = useRef(isInteractionOpen);\n const audioSrcRef = useRef<string | null>(null);\n const currentAudioKeyRef = useRef<string | null>(null);\n const currentSegmentIndexRef = useRef(0);\n const waitingSegmentIndexRef = useRef<number | null>(null);\n const currentAudioRef = useRef<SlideAudioItem | undefined>(undefined);\n const currentAudioSegmentsRef = useRef<\n NonNullable<SlideAudioItem[\"audioSegments\"]>\n >([]);\n const wasPlayingBeforeExternalPauseRef = useRef(false);\n const isLoadingRef = useRef(false);\n const isPausedByUserRef = useRef(false);\n const activeSourceTypeRef = useRef<\"url\" | \"segment\" | null>(null);\n const isWaitingForSegmentRef = useRef(false);\n const pendingAutoPlayRef = useRef(false);\n const pendingSeekTimeRef = useRef<number | null>(null);\n const isSwitchingSegmentRef = useRef(false);\n const playbackAnimationFrameRef = useRef<number | null>(null);\n const playbackTimeMsRef = useRef(0);\n const playbackAccessModeRef = useRef<\n \"unknown\" | \"auto\" | \"manual\" | \"blocked\"\n >(\"unknown\");\n const [isPlaying, setIsPlaying] = useState(defaultPlaying);\n const [isMobileMoreOpen, setIsMobileMoreOpen] = useState(false);\n const currentAudio =\n currentAudioIndex >= 0 ? audioList[currentAudioIndex] : undefined;\n const currentAudioUrl = currentAudio?.audioUrl;\n const currentAudioSegments = useMemo(\n () =>\n [...(currentAudio?.audioSegments ?? [])].sort(\n (prevSegment, nextSegment) =>\n prevSegment.segment_index - nextSegment.segment_index\n ),\n [currentAudio?.audioSegments]\n );\n const customActionList = useMemo(\n () => toPlayerCustomActionList(customActions, customActionContext),\n [customActionContext, customActions]\n );\n const mobileVisibleActionCount = customActionList.length + 5;\n const controlsStyle = useMemo(\n () =>\n ({\n \"--slide-player-mobile-control-count\": String(mobileVisibleActionCount),\n }) as React.CSSProperties,\n [mobileVisibleActionCount]\n );\n const playerTexts = useMemo(\n () => ({\n ...DEFAULT_SLIDE_PLAYER_TEXTS,\n ...texts,\n }),\n [texts]\n );\n const currentAudioKey = useMemo(() => {\n if (!currentAudio) {\n return \"none\";\n }\n\n return (\n currentAudio.audioKey ??\n `${String(currentAudio.sequenceNumber ?? \"none\")}:${String(currentAudio.audioUrl ?? \"\")}`\n );\n }, [currentAudio]);\n const isTogglePlaying = useAutoAdvanceToggle\n ? isAutoAdvanceEnabled\n : isPlaying;\n const toggleAriaLabel = useAutoAdvanceToggle\n ? isAutoAdvanceEnabled\n ? \"Pause autoplay\"\n : \"Play autoplay\"\n : isPlaying\n ? \"Pause\"\n : \"Play\";\n\n useEffect(() => {\n currentAudioRef.current = currentAudio;\n }, [currentAudio]);\n\n useEffect(() => {\n if (showControls) {\n return;\n }\n\n setIsMobileMoreOpen(false);\n }, [showControls]);\n\n useEffect(() => {\n if (!previousInteractionOpenRef.current && isInteractionOpen) {\n setIsMobileMoreOpen(false);\n }\n\n previousInteractionOpenRef.current = isInteractionOpen;\n }, [isInteractionOpen]);\n\n useEffect(() => {\n currentAudioSegmentsRef.current = currentAudioSegments;\n }, [currentAudioSegments]);\n\n useEffect(() => {\n const currentUrl = currentAudio?.audioUrl;\n const nextUrl =\n currentAudioIndex >= 0\n ? audioList[currentAudioIndex + 1]?.audioUrl\n : undefined;\n\n preloadAudioUrl(currentUrl);\n preloadAudioUrl(nextUrl);\n }, [audioList, currentAudio?.audioUrl, currentAudioIndex]);\n\n const updateLoading = useCallback(\n (loading: boolean) => {\n if (isLoadingRef.current === loading) {\n return;\n }\n\n isLoadingRef.current = loading;\n onLoadingChange?.(loading);\n },\n [onLoadingChange]\n );\n\n const isAutoplayBlockedError = useCallback((error: unknown) => {\n if (!(error instanceof DOMException)) {\n return false;\n }\n\n return error.name === \"NotAllowedError\" || error.name === \"SecurityError\";\n }, []);\n\n const canStartPlaybackAutomatically = useCallback(() => {\n return (\n defaultPlaying &&\n !isPlaybackPaused &&\n !isPausedByUserRef.current &&\n playbackAccessModeRef.current !== \"blocked\"\n );\n }, [defaultPlaying, isPlaybackPaused]);\n\n const getSegmentSrc = useCallback((audioData: string) => {\n if (!audioData) {\n return \"\";\n }\n\n if (audioData.startsWith(\"data:\")) {\n return audioData;\n }\n\n return `data:audio/mpeg;base64,${audioData}`;\n }, []);\n\n const getWaitingSegmentSeekTime = useCallback(() => {\n const waitingSegmentIndex = waitingSegmentIndexRef.current;\n\n if (waitingSegmentIndex == null || waitingSegmentIndex <= 0) {\n return 0;\n }\n\n return (\n currentAudioSegmentsRef.current\n .slice(0, waitingSegmentIndex)\n .reduce(\n (totalDurationMs, segment) =>\n totalDurationMs + Math.max(Number(segment.duration_ms ?? 0), 0),\n 0\n ) / 1000\n );\n }, []);\n\n const getSegmentStartTimeMs = useCallback((segmentIndex: number) => {\n if (segmentIndex <= 0) {\n return 0;\n }\n\n return currentAudioSegmentsRef.current\n .slice(0, segmentIndex)\n .reduce(\n (totalDurationMs, segment) =>\n totalDurationMs + Math.max(Number(segment.duration_ms ?? 0), 0),\n 0\n );\n }, []);\n\n const getCurrentPlaybackTimeMs = useCallback(() => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return waitingSegmentIndexRef.current != null\n ? getSegmentStartTimeMs(waitingSegmentIndexRef.current)\n : 0;\n }\n\n if (activeSourceTypeRef.current === \"segment\") {\n return (\n getSegmentStartTimeMs(currentSegmentIndexRef.current) +\n Math.max(audioElement.currentTime, 0) * 1000\n );\n }\n\n if (pendingSeekTimeRef.current !== null && audioElement.readyState === 0) {\n return pendingSeekTimeRef.current * 1000;\n }\n\n return Math.max(audioElement.currentTime, 0) * 1000;\n }, [getSegmentStartTimeMs]);\n\n const publishPlaybackTime = useCallback(\n (timeMs: number) => {\n const nextPlaybackTimeMs = Math.max(timeMs, 0);\n\n if (playbackTimeMsRef.current === nextPlaybackTimeMs) {\n return;\n }\n\n playbackTimeMsRef.current = nextPlaybackTimeMs;\n onPlaybackTimeChange?.(nextPlaybackTimeMs);\n },\n [onPlaybackTimeChange]\n );\n\n const syncPlaybackTime = useCallback(() => {\n publishPlaybackTime(getCurrentPlaybackTimeMs());\n }, [getCurrentPlaybackTimeMs, publishPlaybackTime]);\n\n const stopPlaybackTimeLoop = useCallback(() => {\n if (\n typeof window === \"undefined\" ||\n playbackAnimationFrameRef.current === null\n ) {\n return;\n }\n\n window.cancelAnimationFrame(playbackAnimationFrameRef.current);\n playbackAnimationFrameRef.current = null;\n }, []);\n\n const startPlaybackTimeLoop = useCallback(() => {\n if (\n typeof window === \"undefined\" ||\n playbackAnimationFrameRef.current !== null\n ) {\n return;\n }\n\n const updateFrame = () => {\n syncPlaybackTime();\n\n const audioElement = audioRef.current;\n\n if (!audioElement || audioElement.paused || audioElement.ended) {\n playbackAnimationFrameRef.current = null;\n return;\n }\n\n playbackAnimationFrameRef.current =\n window.requestAnimationFrame(updateFrame);\n };\n\n playbackAnimationFrameRef.current =\n window.requestAnimationFrame(updateFrame);\n }, [syncPlaybackTime]);\n\n const resetAudio = useCallback(() => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return;\n }\n\n stopPlaybackTimeLoop();\n pendingAutoPlayRef.current = false;\n isPausedByUserRef.current = false;\n wasPlayingBeforeExternalPauseRef.current = false;\n activeSourceTypeRef.current = null;\n pendingSeekTimeRef.current = null;\n isWaitingForSegmentRef.current = false;\n isSwitchingSegmentRef.current = false;\n audioElement.pause();\n audioElement.removeAttribute(\"src\");\n audioElement.load();\n audioSrcRef.current = null;\n currentSegmentIndexRef.current = 0;\n waitingSegmentIndexRef.current = null;\n publishPlaybackTime(0);\n setIsPlaying(false);\n updateLoading(false);\n }, [publishPlaybackTime, stopPlaybackTimeLoop, updateLoading]);\n\n const tryPlayCurrentAudio = useCallback(\n (_reason: string) => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return false;\n }\n\n const playPromise = audioElement.play();\n\n if (playPromise && typeof playPromise.then === \"function\") {\n void playPromise\n .then(() => {\n if (playbackAccessModeRef.current === \"unknown\") {\n playbackAccessModeRef.current = \"auto\";\n }\n\n pendingAutoPlayRef.current = false;\n isSwitchingSegmentRef.current = false;\n })\n .catch((error: unknown) => {\n if (\n playbackAccessModeRef.current === \"unknown\" &&\n isAutoplayBlockedError(error)\n ) {\n // Lock autoplay after the first browser rejection.\n playbackAccessModeRef.current = \"blocked\";\n pendingAutoPlayRef.current = false;\n updateLoading(false);\n }\n\n isSwitchingSegmentRef.current = false;\n setIsPlaying(false);\n });\n }\n\n return true;\n },\n [isAutoplayBlockedError, updateLoading]\n );\n\n const startSegmentPlayback = useCallback(\n (segmentIndex: number, _reason: string) => {\n const audioElement = audioRef.current;\n const segment = currentAudioSegmentsRef.current[segmentIndex];\n\n if (!audioElement || !segment) {\n return false;\n }\n\n const nextAudioSrc = getSegmentSrc(segment.audio_data);\n\n currentSegmentIndexRef.current = segmentIndex;\n waitingSegmentIndexRef.current = null;\n isWaitingForSegmentRef.current = false;\n isSwitchingSegmentRef.current = true;\n publishPlaybackTime(getSegmentStartTimeMs(segmentIndex));\n const shouldAutoResume = canStartPlaybackAutomatically();\n\n pendingAutoPlayRef.current = shouldAutoResume;\n updateLoading(false);\n\n const hasNewSrc = audioSrcRef.current !== nextAudioSrc;\n\n activeSourceTypeRef.current = \"segment\";\n\n if (hasNewSrc) {\n audioElement.pause();\n audioElement.removeAttribute(\"src\");\n audioElement.load();\n audioSrcRef.current = nextAudioSrc;\n audioElement.src = nextAudioSrc;\n audioElement.load();\n }\n\n pendingSeekTimeRef.current = 0;\n\n if (audioElement.readyState > 0) {\n audioElement.currentTime = 0;\n pendingSeekTimeRef.current = null;\n }\n\n if (!shouldAutoResume) {\n pendingAutoPlayRef.current = false;\n isSwitchingSegmentRef.current = false;\n audioElement.pause();\n setIsPlaying(false);\n return true;\n }\n\n return tryPlayCurrentAudio(`start-segment:${_reason}`);\n },\n [\n canStartPlaybackAutomatically,\n getSegmentSrc,\n getSegmentStartTimeMs,\n publishPlaybackTime,\n tryPlayCurrentAudio,\n updateLoading,\n ]\n );\n\n const finishAudioItem = useCallback(\n (_reason?: string) => {\n stopPlaybackTimeLoop();\n pendingAutoPlayRef.current = false;\n isWaitingForSegmentRef.current = false;\n isSwitchingSegmentRef.current = false;\n syncPlaybackTime();\n setIsPlaying(false);\n updateLoading(false);\n\n if (currentAudioIndex >= 0) {\n onEnded?.(currentAudioIndex);\n }\n },\n [\n currentAudioIndex,\n onEnded,\n stopPlaybackTimeLoop,\n syncPlaybackTime,\n updateLoading,\n ]\n );\n\n const handleSegmentEnded = useCallback(() => {\n const nextSegmentIndex = currentSegmentIndexRef.current + 1;\n const segments = currentAudioSegmentsRef.current;\n const nextSegment = segments[nextSegmentIndex];\n const activeAudio = currentAudioRef.current;\n const hasFinal = segments.some((segment) => segment.is_final);\n\n if (nextSegment) {\n startSegmentPlayback(nextSegmentIndex, \"ended\");\n return;\n }\n\n if (activeAudio?.isAudioStreaming || !hasFinal) {\n currentSegmentIndexRef.current = nextSegmentIndex;\n waitingSegmentIndexRef.current = nextSegmentIndex;\n isWaitingForSegmentRef.current = true;\n pendingAutoPlayRef.current = defaultPlaying;\n publishPlaybackTime(getSegmentStartTimeMs(nextSegmentIndex));\n setIsPlaying(false);\n updateLoading(true);\n\n return;\n }\n\n finishAudioItem(\"segments-completed\");\n }, [\n defaultPlaying,\n finishAudioItem,\n getSegmentStartTimeMs,\n publishPlaybackTime,\n startSegmentPlayback,\n updateLoading,\n ]);\n\n useEffect(() => {\n if (currentAudioKeyRef.current === currentAudioKey) {\n return;\n }\n\n currentAudioKeyRef.current = currentAudioKey;\n currentSegmentIndexRef.current = 0;\n waitingSegmentIndexRef.current = null;\n isWaitingForSegmentRef.current = false;\n isPausedByUserRef.current = false;\n wasPlayingBeforeExternalPauseRef.current = false;\n pendingAutoPlayRef.current = false;\n isSwitchingSegmentRef.current = false;\n activeSourceTypeRef.current = null;\n audioSrcRef.current = null;\n stopPlaybackTimeLoop();\n publishPlaybackTime(0);\n updateLoading(false);\n\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return;\n }\n\n audioElement.pause();\n audioElement.removeAttribute(\"src\");\n audioElement.load();\n setIsPlaying(false);\n }, [\n currentAudioIndex,\n currentAudioKey,\n currentAudioSegments.length,\n currentAudioUrl,\n publishPlaybackTime,\n stopPlaybackTimeLoop,\n updateLoading,\n ]);\n\n useEffect(() => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return;\n }\n\n if (isPlaybackPaused) {\n wasPlayingBeforeExternalPauseRef.current = Boolean(\n currentAudioRef.current &&\n !isPausedByUserRef.current &&\n (!audioElement.paused ||\n pendingAutoPlayRef.current ||\n waitingSegmentIndexRef.current !== null)\n );\n\n pendingAutoPlayRef.current = false;\n updateLoading(false);\n audioElement.pause();\n setIsPlaying(false);\n return;\n }\n\n if (\n !wasPlayingBeforeExternalPauseRef.current ||\n !currentAudioRef.current ||\n isPausedByUserRef.current\n ) {\n return;\n }\n\n wasPlayingBeforeExternalPauseRef.current = false;\n\n if (waitingSegmentIndexRef.current !== null) {\n if (\n waitingSegmentIndexRef.current < currentAudioSegmentsRef.current.length\n ) {\n startSegmentPlayback(waitingSegmentIndexRef.current, \"external-resume\");\n return;\n }\n\n pendingAutoPlayRef.current = true;\n updateLoading(true);\n return;\n }\n\n if (!audioSrcRef.current && currentAudioSegmentsRef.current.length > 0) {\n startSegmentPlayback(\n Math.min(\n currentSegmentIndexRef.current,\n currentAudioSegmentsRef.current.length - 1\n ),\n \"external-resume-init\"\n );\n return;\n }\n\n if (!audioElement.paused) {\n return;\n }\n\n pendingAutoPlayRef.current = true;\n tryPlayCurrentAudio(\"external-resume\");\n }, [\n isPlaybackPaused,\n startSegmentPlayback,\n tryPlayCurrentAudio,\n updateLoading,\n ]);\n\n useEffect(() => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return;\n }\n\n if (!currentAudio) {\n resetAudio();\n return;\n }\n\n if (isPlaybackPaused) {\n pendingAutoPlayRef.current = false;\n updateLoading(false);\n audioElement.pause();\n setIsPlaying(false);\n return;\n }\n\n if (currentAudioUrl) {\n const hasNewSrc = audioSrcRef.current !== currentAudioUrl;\n const shouldAutoResume = canStartPlaybackAutomatically();\n const shouldKeepSegmentSource =\n activeSourceTypeRef.current === \"segment\" &&\n Boolean(audioSrcRef.current) &&\n waitingSegmentIndexRef.current === null;\n\n if (shouldKeepSegmentSource) {\n if (!shouldAutoResume) {\n pendingAutoPlayRef.current = false;\n audioElement.pause();\n setIsPlaying(false);\n return;\n }\n\n if (audioElement.paused) {\n pendingAutoPlayRef.current = true;\n tryPlayCurrentAudio(\"keep-segment-source\");\n }\n\n return;\n }\n\n if (hasNewSrc) {\n const nextSeekTime =\n waitingSegmentIndexRef.current !== null\n ? getWaitingSegmentSeekTime()\n : 0;\n\n audioElement.pause();\n audioElement.removeAttribute(\"src\");\n audioElement.load();\n audioSrcRef.current = currentAudioUrl;\n activeSourceTypeRef.current = \"url\";\n audioElement.src = currentAudioUrl;\n audioElement.load();\n pendingSeekTimeRef.current = nextSeekTime;\n publishPlaybackTime(nextSeekTime * 1000);\n\n if (audioElement.readyState > 0) {\n audioElement.currentTime = nextSeekTime;\n pendingSeekTimeRef.current = null;\n }\n }\n\n pendingAutoPlayRef.current = shouldAutoResume;\n isWaitingForSegmentRef.current = false;\n isSwitchingSegmentRef.current = false;\n updateLoading(false);\n\n if (!shouldAutoResume) {\n pendingAutoPlayRef.current = false;\n audioElement.pause();\n setIsPlaying(false);\n return;\n }\n\n tryPlayCurrentAudio(hasNewSrc ? \"sync-url-init\" : \"sync-url\");\n return;\n }\n\n if (waitingSegmentIndexRef.current !== null) {\n if (waitingSegmentIndexRef.current < currentAudioSegments.length) {\n if (isPausedByUserRef.current) {\n setIsPlaying(false);\n updateLoading(false);\n return;\n }\n\n startSegmentPlayback(waitingSegmentIndexRef.current, \"wait-resume\");\n return;\n }\n\n isWaitingForSegmentRef.current = true;\n pendingAutoPlayRef.current = canStartPlaybackAutomatically();\n setIsPlaying(false);\n updateLoading(canStartPlaybackAutomatically());\n return;\n }\n\n if (!currentAudioSegments.length) {\n if (currentAudio.isAudioStreaming) {\n waitingSegmentIndexRef.current = currentSegmentIndexRef.current;\n isWaitingForSegmentRef.current = true;\n pendingAutoPlayRef.current = canStartPlaybackAutomatically();\n setIsPlaying(false);\n updateLoading(canStartPlaybackAutomatically());\n return;\n }\n\n resetAudio();\n return;\n }\n\n if (!audioSrcRef.current) {\n startSegmentPlayback(\n Math.min(\n currentSegmentIndexRef.current,\n currentAudioSegments.length - 1\n ),\n \"effect-init\"\n );\n return;\n }\n\n if (!defaultPlaying || isPausedByUserRef.current) {\n pendingAutoPlayRef.current = false;\n audioElement.pause();\n setIsPlaying(false);\n return;\n }\n\n if (audioElement.paused) {\n pendingAutoPlayRef.current = true;\n tryPlayCurrentAudio(\"sync-paused-retry\");\n }\n }, [\n currentAudio,\n currentAudioIndex,\n currentAudioSegments,\n currentAudioUrl,\n defaultPlaying,\n isPlaybackPaused,\n canStartPlaybackAutomatically,\n publishPlaybackTime,\n resetAudio,\n startSegmentPlayback,\n tryPlayCurrentAudio,\n getWaitingSegmentSeekTime,\n updateLoading,\n ]);\n\n useEffect(() => resetAudio, [resetAudio]);\n\n useEffect(() => stopPlaybackTimeLoop, [stopPlaybackTimeLoop]);\n\n const handleAudioPlay = useCallback(() => {\n syncPlaybackTime();\n startPlaybackTimeLoop();\n setIsPlaying(true);\n updateLoading(false);\n onPlaybackStarted?.();\n }, [\n onPlaybackStarted,\n startPlaybackTimeLoop,\n syncPlaybackTime,\n updateLoading,\n ]);\n\n const handleAudioPause = useCallback(() => {\n if (isWaitingForSegmentRef.current || isSwitchingSegmentRef.current) {\n return;\n }\n\n stopPlaybackTimeLoop();\n syncPlaybackTime();\n setIsPlaying(false);\n }, [currentAudioIndex, stopPlaybackTimeLoop, syncPlaybackTime]);\n\n const handleAudioCanPlay = useCallback(() => {\n const audioElement = audioRef.current;\n\n if (audioElement && pendingSeekTimeRef.current !== null) {\n audioElement.currentTime = pendingSeekTimeRef.current;\n pendingSeekTimeRef.current = null;\n }\n\n syncPlaybackTime();\n\n if (!pendingAutoPlayRef.current || !defaultPlaying) {\n return;\n }\n\n tryPlayCurrentAudio(\"canplay\");\n }, [\n currentAudioIndex,\n defaultPlaying,\n syncPlaybackTime,\n tryPlayCurrentAudio,\n ]);\n\n const handleLoadedMetadata = useCallback(() => {\n const audioElement = audioRef.current;\n\n if (audioElement && pendingSeekTimeRef.current !== null) {\n audioElement.currentTime = pendingSeekTimeRef.current;\n pendingSeekTimeRef.current = null;\n }\n\n syncPlaybackTime();\n }, [currentAudioIndex, syncPlaybackTime]);\n\n const handleAudioTimeUpdate = useCallback(() => {\n syncPlaybackTime();\n }, [syncPlaybackTime]);\n\n const handleAudioSeeking = useCallback(() => {\n syncPlaybackTime();\n }, [syncPlaybackTime]);\n\n const handleAudioEnded = useCallback(() => {\n const shouldFinishAsUrl =\n activeSourceTypeRef.current === \"url\" ||\n currentAudioSegmentsRef.current.length === 0;\n\n stopPlaybackTimeLoop();\n isSwitchingSegmentRef.current = false;\n\n if (shouldFinishAsUrl) {\n finishAudioItem(\"url-ended\");\n return;\n }\n\n handleSegmentEnded();\n }, [finishAudioItem, handleSegmentEnded, stopPlaybackTimeLoop]);\n\n const handleAudioError = useCallback(() => {\n stopPlaybackTimeLoop();\n syncPlaybackTime();\n setIsPlaying(false);\n updateLoading(false);\n }, [stopPlaybackTimeLoop, syncPlaybackTime, updateLoading]);\n const handleMobileViewModeChange = useCallback(\n (nextViewMode: MobileViewMode) => {\n onMobileViewModeChange?.(nextViewMode);\n setIsMobileMoreOpen(false);\n },\n [onMobileViewModeChange]\n );\n\n useEffect(() => {\n onPlaybackTimeChange?.(playbackTimeMsRef.current);\n }, [onPlaybackTimeChange]);\n\n return (\n <div className={cn(\"slide-player\", className)} {...props}>\n <audio\n ref={audioRef}\n preload=\"auto\"\n playsInline\n onLoadedMetadata={handleLoadedMetadata}\n onCanPlay={handleAudioCanPlay}\n onPlay={handleAudioPlay}\n onPause={handleAudioPause}\n onSeeking={handleAudioSeeking}\n onSeeked={handleAudioSeeking}\n onTimeUpdate={handleAudioTimeUpdate}\n onEnded={handleAudioEnded}\n onError={handleAudioError}\n />\n\n {showControls ? (\n <>\n <MobilePlayerSettingsSheet\n container={settingsPortalContainer}\n labels={{\n fullscreen: playerTexts.fullscreenLabel,\n nonFullscreen: playerTexts.nonFullscreenLabel,\n screen: playerTexts.screenLabel,\n subtitle: playerTexts.subtitleLabel,\n subtitleToggle: playerTexts.subtitleToggleAriaLabel,\n title: playerTexts.settingsTitle,\n }}\n isSubtitleEnabled={isSubtitleEnabled}\n onClose={() => setIsMobileMoreOpen(false)}\n onOpenChange={setIsMobileMoreOpen}\n onSubtitleToggle={onSubtitleToggle ?? (() => {})}\n onViewModeChange={handleMobileViewModeChange}\n open={isMobileMoreOpen}\n viewMode={mobileViewMode}\n />\n\n <div className=\"slide-player__controls\" style={controlsStyle}>\n <div className=\"slide-player__group\">\n <button\n aria-expanded={isMobileMoreOpen}\n aria-haspopup=\"dialog\"\n aria-label=\"More options\"\n className=\"slide-player__action slide-player__action--mobile-more\"\n onClick={() => {\n setIsMobileMoreOpen((prevOpen) => !prevOpen);\n }}\n type=\"button\"\n >\n <EllipsisVertical\n className=\"slide-player__icon\"\n strokeWidth={2.25}\n />\n </button>\n <button aria-label=\"Volume\" className=\"hidden\" type=\"button\">\n <Volume2 className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n <button\n aria-label={playerTexts.subtitleToggleAriaLabel}\n aria-pressed={isSubtitleEnabled}\n className=\"slide-player__action slide-player__action--subtitle\"\n onClick={onSubtitleToggle}\n type=\"button\"\n >\n {isSubtitleEnabled ? (\n <Captions className=\"slide-player__icon\" strokeWidth={2.25} />\n ) : (\n <CaptionsOff\n className=\"slide-player__icon\"\n strokeWidth={2.25}\n />\n )}\n </button>\n <button\n aria-label=\"Rewind\"\n className=\"slide-player__action slide-player__action--prev\"\n disabled={prevDisabled}\n onClick={onPrev}\n type=\"button\"\n >\n <RotateCcw className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n <button\n aria-label={toggleAriaLabel}\n className=\"slide-player__toggle slide-player__toggle--playback\"\n onClick={() => {\n if (useAutoAdvanceToggle) {\n onAutoAdvanceToggle?.(!isAutoAdvanceEnabled);\n return;\n }\n\n const audioElement = audioRef.current;\n\n if (isPlaybackPaused || !audioElement || !currentAudio) {\n return;\n }\n\n if (waitingSegmentIndexRef.current !== null) {\n if (isPlaying) {\n pendingAutoPlayRef.current = false;\n isPausedByUserRef.current = true;\n waitingSegmentIndexRef.current = null;\n isWaitingForSegmentRef.current = false;\n setIsPlaying(false);\n updateLoading(false);\n audioElement.pause();\n return;\n }\n\n playbackAccessModeRef.current = \"manual\";\n isPausedByUserRef.current = false;\n pendingAutoPlayRef.current = true;\n updateLoading(true);\n return;\n }\n\n if (!audioElement.src && currentAudioSegments.length > 0) {\n playbackAccessModeRef.current = \"manual\";\n isPausedByUserRef.current = false;\n startSegmentPlayback(\n Math.min(\n currentSegmentIndexRef.current,\n currentAudioSegments.length - 1\n ),\n \"toggle\"\n );\n return;\n }\n\n if (audioElement.paused) {\n playbackAccessModeRef.current = \"manual\";\n isPausedByUserRef.current = false;\n pendingAutoPlayRef.current = true;\n tryPlayCurrentAudio(\"toggle-resume\");\n return;\n }\n\n pendingAutoPlayRef.current = false;\n isPausedByUserRef.current = true;\n audioElement.pause();\n }}\n type=\"button\"\n >\n {isTogglePlaying ? <PauseIcon /> : <PlayIcon />}\n </button>\n <button\n aria-label=\"Forward\"\n className=\"slide-player__action slide-player__action--next\"\n disabled={nextDisabled}\n onClick={onNext}\n type=\"button\"\n >\n <RotateCw className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n {onFullscreen ? (\n <button\n aria-label={\n isFullscreen ? \"Exit fullscreen\" : \"Enter fullscreen\"\n }\n className=\"slide-player__action slide-player__action--fullscreen\"\n onClick={onFullscreen}\n type=\"button\"\n >\n {isFullscreen ? (\n <ScanLine\n className=\"slide-player__icon\"\n strokeWidth={2.25}\n />\n ) : (\n <Maximize\n className=\"slide-player__icon\"\n strokeWidth={2.25}\n />\n )}\n </button>\n ) : null}\n </div>\n\n <div className=\"slide-player__separator\" />\n\n <div className=\"slide-player__group\">\n {customActionList.map((customAction, customActionIndex) => (\n <React.Fragment key={`custom-action-${customActionIndex}`}>\n {customAction}\n </React.Fragment>\n ))}\n <button\n aria-label=\"Notes\"\n className={cn(\n \"slide-player__action slide-player__action--notes\",\n isInteractionOpen && \"slide-player__action--active\"\n )}\n disabled={!hasInteraction}\n onClick={onInteractionToggle}\n type=\"button\"\n >\n <FilePenLine\n className=\"slide-player__icon\"\n strokeWidth={2.25}\n />\n </button>\n </div>\n </div>\n </>\n ) : null}\n </div>\n );\n};\n\nconst MemoizedPlayer = memo(Player);\n\nMemoizedPlayer.displayName = \"Player\";\n\nexport default MemoizedPlayer;\n"],"names":["audioPreloadElementCache","preloadAudioUrl","url","audio","PauseIcon","jsxs","jsx","PlayIcon","Player","audioList","className","currentAudioIndex","defaultPlaying","isPlaybackPaused","isAutoAdvanceEnabled","useAutoAdvanceToggle","onLoadingChange","onPlaybackStarted","onPlaybackTimeChange","onSubtitleToggle","onPrev","onNext","onFullscreen","isFullscreen","mobileViewMode","DEFAULT_MOBILE_VIEW_MODE","settingsPortalContainer","onMobileViewModeChange","onEnded","onAutoAdvanceToggle","onInteractionToggle","hasInteraction","isInteractionOpen","isSubtitleEnabled","prevDisabled","nextDisabled","showControls","customActions","customActionContext","texts","props","audioRef","useRef","previousInteractionOpenRef","audioSrcRef","currentAudioKeyRef","currentSegmentIndexRef","waitingSegmentIndexRef","currentAudioRef","currentAudioSegmentsRef","wasPlayingBeforeExternalPauseRef","isLoadingRef","isPausedByUserRef","activeSourceTypeRef","isWaitingForSegmentRef","pendingAutoPlayRef","pendingSeekTimeRef","isSwitchingSegmentRef","playbackAnimationFrameRef","playbackTimeMsRef","playbackAccessModeRef","isPlaying","setIsPlaying","useState","isMobileMoreOpen","setIsMobileMoreOpen","currentAudio","currentAudioUrl","currentAudioSegments","useMemo","prevSegment","nextSegment","customActionList","toPlayerCustomActionList","mobileVisibleActionCount","controlsStyle","playerTexts","DEFAULT_SLIDE_PLAYER_TEXTS","currentAudioKey","isTogglePlaying","toggleAriaLabel","useEffect","currentUrl","nextUrl","updateLoading","useCallback","loading","isAutoplayBlockedError","error","canStartPlaybackAutomatically","getSegmentSrc","audioData","getWaitingSegmentSeekTime","waitingSegmentIndex","totalDurationMs","segment","getSegmentStartTimeMs","segmentIndex","getCurrentPlaybackTimeMs","audioElement","publishPlaybackTime","timeMs","nextPlaybackTimeMs","syncPlaybackTime","stopPlaybackTimeLoop","startPlaybackTimeLoop","updateFrame","resetAudio","tryPlayCurrentAudio","_reason","playPromise","startSegmentPlayback","nextAudioSrc","shouldAutoResume","hasNewSrc","finishAudioItem","handleSegmentEnded","nextSegmentIndex","segments","activeAudio","hasFinal","nextSeekTime","handleAudioPlay","handleAudioPause","handleAudioCanPlay","handleLoadedMetadata","handleAudioTimeUpdate","handleAudioSeeking","handleAudioEnded","shouldFinishAsUrl","handleAudioError","handleMobileViewModeChange","nextViewMode","cn","Fragment","MobilePlayerSettingsSheet","prevOpen","EllipsisVertical","Volume2","Captions","CaptionsOff","RotateCcw","RotateCw","ScanLine","Maximize","customAction","customActionIndex","React","FilePenLine","MemoizedPlayer","memo"],"mappings":"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"}
1
+ {"version":3,"file":"Player.es.js","sources":["../../../src/components/Slide/Player.tsx"],"sourcesContent":["import React, {\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n Captions,\n CaptionsOff,\n EllipsisVertical,\n FilePenLine,\n Maximize,\n RotateCcw,\n RotateCw,\n ScanLine,\n Volume2,\n} from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\nimport MobilePlayerSettingsSheet from \"./MobilePlayerSettingsSheet\";\nimport { DEFAULT_SLIDE_PLAYER_TEXTS } from \"./constants\";\nimport type { SlideAudioItem } from \"./useSlide\";\nimport type {\n SlidePlayerCustomActionContext,\n SlidePlayerCustomActions,\n} from \"./types\";\nimport {\n DEFAULT_MOBILE_VIEW_MODE,\n type MobileViewMode,\n} from \"./utils/mobileScreenMode\";\nimport { hasReachedAudioEnd } from \"./utils/audioCompletion\";\nimport {\n resolveAudioPlaybackSourceType,\n type AudioPlaybackSourceType,\n} from \"./utils/playbackSource\";\nimport { toPlayerCustomActionList } from \"./utils/playerCustomActions\";\nimport \"./player.css\";\n\nconst audioPreloadElementCache = new Map<string, HTMLAudioElement>();\n\nexport interface SlidePlayerTexts {\n settingsTitle?: string;\n subtitleLabel?: string;\n subtitleToggleAriaLabel?: string;\n screenLabel?: string;\n nonFullscreenLabel?: string;\n fullscreenLabel?: string;\n fullscreenHintText?: string;\n}\n\nexport type SlidePlayerLoadingReason = \"loadingAudio\" | \"waitingForMoreAudio\";\n\nconst preloadAudioUrl = (url?: string) => {\n if (typeof window === \"undefined\" || !url) {\n return;\n }\n\n if (audioPreloadElementCache.has(url)) {\n return;\n }\n\n // Use a detached audio element so warm-up follows the same media loading\n // path as the visible player instead of relying on link preload hints.\n const audio = window.document.createElement(\"audio\");\n audio.preload = \"auto\";\n audio.setAttribute(\"playsinline\", \"true\");\n audio.src = url;\n audio.load();\n\n audioPreloadElementCache.set(url, audio);\n};\n\nexport type PlayerProps = Omit<React.ComponentProps<\"div\">, \"onEnded\"> & {\n audioList?: SlideAudioItem[];\n currentAudioIndex?: number;\n defaultPlaying?: boolean;\n isPlaybackPaused?: boolean;\n isAutoAdvanceEnabled?: boolean;\n useAutoAdvanceToggle?: boolean;\n onLoadingChange?: (state: {\n loading: boolean;\n reason: SlidePlayerLoadingReason | null;\n }) => void;\n onPlaybackStarted?: () => void;\n onPlaybackTimeChange?: (timeMs: number) => void;\n onSubtitleToggle?: () => void;\n onPrev?: () => void;\n onNext?: () => void;\n onFullscreen?: () => void;\n isFullscreen?: boolean;\n mobileViewMode?: MobileViewMode;\n settingsPortalContainer?: HTMLElement | null;\n onMobileViewModeChange?: (viewMode: MobileViewMode) => void;\n onEnded?: (audioIndex: number) => void;\n onAutoAdvanceToggle?: (enabled: boolean) => void;\n onInteractionToggle?: () => void;\n hasInteraction?: boolean;\n isInteractionOpen?: boolean;\n isSubtitleEnabled?: boolean;\n prevDisabled?: boolean;\n nextDisabled?: boolean;\n showControls?: boolean;\n customActions?: SlidePlayerCustomActions;\n customActionContext?: SlidePlayerCustomActionContext;\n texts?: SlidePlayerTexts;\n};\n\nconst PauseIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"34\"\n height=\"34\"\n viewBox=\"0 0 34 34\"\n fill=\"none\"\n >\n <path\n d=\"M16.6667 33.3333C25.8714 33.3333 33.3333 25.8714 33.3333 16.6667C33.3333 7.46192 25.8714 0 16.6667 0C7.46192 0 0 7.46192 0 16.6667C0 25.8714 7.46192 33.3333 16.6667 33.3333Z\"\n fill=\"#0A0A0A\"\n />\n <path d=\"M12 10H16V24H12V10ZM18 10H22V24H18V10Z\" fill=\"white\" />\n </svg>\n);\n\nconst PlayIcon = () => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"34\"\n height=\"34\"\n viewBox=\"0 0 34 34\"\n fill=\"none\"\n >\n <path\n d=\"M16.6667 33.3333C25.8714 33.3333 33.3333 25.8714 33.3333 16.6667C33.3333 7.46192 25.8714 0 16.6667 0C7.46192 0 0 7.46192 0 16.6667C0 25.8714 7.46192 33.3333 16.6667 33.3333Z\"\n fill=\"#0A0A0A\"\n />\n <path d=\"M13.3333 10L23.3333 16.6667L13.3333 23.3333V10Z\" fill=\"white\" />\n </svg>\n);\n\nconst Player = ({\n audioList = [],\n className,\n currentAudioIndex = -1,\n defaultPlaying = true,\n isPlaybackPaused = false,\n isAutoAdvanceEnabled = true,\n useAutoAdvanceToggle = false,\n onLoadingChange,\n onPlaybackStarted,\n onPlaybackTimeChange,\n onSubtitleToggle,\n onPrev,\n onNext,\n onFullscreen,\n isFullscreen = false,\n mobileViewMode = DEFAULT_MOBILE_VIEW_MODE,\n settingsPortalContainer,\n onMobileViewModeChange,\n onEnded,\n onAutoAdvanceToggle,\n onInteractionToggle,\n hasInteraction = false,\n isInteractionOpen = false,\n isSubtitleEnabled = true,\n prevDisabled = false,\n nextDisabled = false,\n showControls = true,\n customActions,\n customActionContext,\n texts,\n ...props\n}: PlayerProps) => {\n const audioRef = useRef<HTMLAudioElement | null>(null);\n const previousInteractionOpenRef = useRef(isInteractionOpen);\n const audioSrcRef = useRef<string | null>(null);\n const currentAudioKeyRef = useRef<string | null>(null);\n const currentSegmentIndexRef = useRef(0);\n const waitingSegmentIndexRef = useRef<number | null>(null);\n const currentAudioRef = useRef<SlideAudioItem | undefined>(undefined);\n const currentAudioSegmentsRef = useRef<\n NonNullable<SlideAudioItem[\"audioSegments\"]>\n >([]);\n const wasPlayingBeforeExternalPauseRef = useRef(false);\n const isLoadingRef = useRef(false);\n const isPausedByUserRef = useRef(false);\n const activeSourceTypeRef = useRef<\"url\" | \"segment\" | null>(null);\n const preferredSourceTypeRef = useRef<AudioPlaybackSourceType | null>(null);\n const isWaitingForSegmentRef = useRef(false);\n const pendingAutoPlayRef = useRef(false);\n const pendingSeekTimeRef = useRef<number | null>(null);\n const isSwitchingSegmentRef = useRef(false);\n const playbackAnimationFrameRef = useRef<number | null>(null);\n const playbackTimeMsRef = useRef(0);\n const playbackAccessModeRef = useRef<\n \"unknown\" | \"auto\" | \"manual\" | \"blocked\"\n >(\"unknown\");\n const [isPlaying, setIsPlaying] = useState(defaultPlaying);\n const [isMobileMoreOpen, setIsMobileMoreOpen] = useState(false);\n const currentAudio =\n currentAudioIndex >= 0 ? audioList[currentAudioIndex] : undefined;\n const currentAudioUrl = currentAudio?.audioUrl;\n const currentAudioSegments = useMemo(\n () =>\n [...(currentAudio?.audioSegments ?? [])].sort(\n (prevSegment, nextSegment) =>\n prevSegment.segment_index - nextSegment.segment_index\n ),\n [currentAudio?.audioSegments]\n );\n const customActionList = useMemo(\n () => toPlayerCustomActionList(customActions, customActionContext),\n [customActionContext, customActions]\n );\n const mobileVisibleActionCount = customActionList.length + 5;\n const controlsStyle = useMemo(\n () =>\n ({\n \"--slide-player-mobile-control-count\": String(mobileVisibleActionCount),\n }) as React.CSSProperties,\n [mobileVisibleActionCount]\n );\n const playerTexts = useMemo(\n () => ({\n ...DEFAULT_SLIDE_PLAYER_TEXTS,\n ...texts,\n }),\n [texts]\n );\n const currentAudioKey = useMemo(() => {\n if (!currentAudio) {\n return \"none\";\n }\n\n return (\n currentAudio.audioKey ??\n `${String(currentAudio.sequenceNumber ?? \"none\")}:${String(currentAudio.audioUrl ?? \"\")}`\n );\n }, [currentAudio]);\n const isTogglePlaying = useAutoAdvanceToggle\n ? isAutoAdvanceEnabled\n : isPlaying;\n const toggleAriaLabel = useAutoAdvanceToggle\n ? isAutoAdvanceEnabled\n ? \"Pause autoplay\"\n : \"Play autoplay\"\n : isPlaying\n ? \"Pause\"\n : \"Play\";\n\n useEffect(() => {\n currentAudioRef.current = currentAudio;\n }, [currentAudio]);\n\n useEffect(() => {\n if (showControls) {\n return;\n }\n\n setIsMobileMoreOpen(false);\n }, [showControls]);\n\n useEffect(() => {\n if (!previousInteractionOpenRef.current && isInteractionOpen) {\n setIsMobileMoreOpen(false);\n }\n\n previousInteractionOpenRef.current = isInteractionOpen;\n }, [isInteractionOpen]);\n\n useEffect(() => {\n currentAudioSegmentsRef.current = currentAudioSegments;\n }, [currentAudioSegments]);\n\n useEffect(() => {\n const currentUrl = currentAudio?.audioUrl;\n const nextUrl =\n currentAudioIndex >= 0\n ? audioList[currentAudioIndex + 1]?.audioUrl\n : undefined;\n\n preloadAudioUrl(currentUrl);\n preloadAudioUrl(nextUrl);\n }, [audioList, currentAudio?.audioUrl, currentAudioIndex]);\n\n const updateLoading = useCallback(\n (loading: boolean, reason: SlidePlayerLoadingReason | null = null) => {\n if (isLoadingRef.current === loading && (!loading || reason === null)) {\n return;\n }\n\n isLoadingRef.current = loading;\n onLoadingChange?.({\n loading,\n reason: loading ? reason : null,\n });\n },\n [onLoadingChange]\n );\n\n const isAutoplayBlockedError = useCallback((error: unknown) => {\n if (!(error instanceof DOMException)) {\n return false;\n }\n\n return error.name === \"NotAllowedError\" || error.name === \"SecurityError\";\n }, []);\n\n const canStartPlaybackAutomatically = useCallback(() => {\n return (\n defaultPlaying &&\n !isPlaybackPaused &&\n !isPausedByUserRef.current &&\n playbackAccessModeRef.current !== \"blocked\"\n );\n }, [defaultPlaying, isPlaybackPaused]);\n\n const getSegmentSrc = useCallback((audioData: string) => {\n if (!audioData) {\n return \"\";\n }\n\n if (audioData.startsWith(\"data:\")) {\n return audioData;\n }\n\n return `data:audio/mpeg;base64,${audioData}`;\n }, []);\n\n const getWaitingSegmentSeekTime = useCallback(() => {\n const waitingSegmentIndex = waitingSegmentIndexRef.current;\n\n if (waitingSegmentIndex == null || waitingSegmentIndex <= 0) {\n return 0;\n }\n\n return (\n currentAudioSegmentsRef.current\n .slice(0, waitingSegmentIndex)\n .reduce(\n (totalDurationMs, segment) =>\n totalDurationMs + Math.max(Number(segment.duration_ms ?? 0), 0),\n 0\n ) / 1000\n );\n }, []);\n\n const getSegmentStartTimeMs = useCallback((segmentIndex: number) => {\n if (segmentIndex <= 0) {\n return 0;\n }\n\n return currentAudioSegmentsRef.current\n .slice(0, segmentIndex)\n .reduce(\n (totalDurationMs, segment) =>\n totalDurationMs + Math.max(Number(segment.duration_ms ?? 0), 0),\n 0\n );\n }, []);\n\n const getCurrentPlaybackTimeMs = useCallback(() => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return waitingSegmentIndexRef.current != null\n ? getSegmentStartTimeMs(waitingSegmentIndexRef.current)\n : 0;\n }\n\n if (activeSourceTypeRef.current === \"segment\") {\n return (\n getSegmentStartTimeMs(currentSegmentIndexRef.current) +\n Math.max(audioElement.currentTime, 0) * 1000\n );\n }\n\n if (pendingSeekTimeRef.current !== null && audioElement.readyState === 0) {\n return pendingSeekTimeRef.current * 1000;\n }\n\n return Math.max(audioElement.currentTime, 0) * 1000;\n }, [getSegmentStartTimeMs]);\n\n const publishPlaybackTime = useCallback(\n (timeMs: number) => {\n const nextPlaybackTimeMs = Math.max(timeMs, 0);\n\n if (playbackTimeMsRef.current === nextPlaybackTimeMs) {\n return;\n }\n\n playbackTimeMsRef.current = nextPlaybackTimeMs;\n onPlaybackTimeChange?.(nextPlaybackTimeMs);\n },\n [onPlaybackTimeChange]\n );\n\n const syncPlaybackTime = useCallback(() => {\n publishPlaybackTime(getCurrentPlaybackTimeMs());\n }, [getCurrentPlaybackTimeMs, publishPlaybackTime]);\n\n const stopPlaybackTimeLoop = useCallback(() => {\n if (\n typeof window === \"undefined\" ||\n playbackAnimationFrameRef.current === null\n ) {\n return;\n }\n\n window.cancelAnimationFrame(playbackAnimationFrameRef.current);\n playbackAnimationFrameRef.current = null;\n }, []);\n\n const startPlaybackTimeLoop = useCallback(() => {\n if (\n typeof window === \"undefined\" ||\n playbackAnimationFrameRef.current !== null\n ) {\n return;\n }\n\n const updateFrame = () => {\n syncPlaybackTime();\n\n const audioElement = audioRef.current;\n\n if (!audioElement || audioElement.paused || audioElement.ended) {\n playbackAnimationFrameRef.current = null;\n return;\n }\n\n playbackAnimationFrameRef.current =\n window.requestAnimationFrame(updateFrame);\n };\n\n playbackAnimationFrameRef.current =\n window.requestAnimationFrame(updateFrame);\n }, [syncPlaybackTime]);\n\n const resetAudio = useCallback(() => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return;\n }\n\n stopPlaybackTimeLoop();\n pendingAutoPlayRef.current = false;\n isPausedByUserRef.current = false;\n wasPlayingBeforeExternalPauseRef.current = false;\n activeSourceTypeRef.current = null;\n pendingSeekTimeRef.current = null;\n isWaitingForSegmentRef.current = false;\n isSwitchingSegmentRef.current = false;\n preferredSourceTypeRef.current = null;\n audioElement.pause();\n audioElement.removeAttribute(\"src\");\n audioElement.load();\n audioSrcRef.current = null;\n currentSegmentIndexRef.current = 0;\n waitingSegmentIndexRef.current = null;\n publishPlaybackTime(0);\n setIsPlaying(false);\n updateLoading(false);\n }, [publishPlaybackTime, stopPlaybackTimeLoop, updateLoading]);\n\n const tryPlayCurrentAudio = useCallback(\n (_reason: string) => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return false;\n }\n\n const playPromise = audioElement.play();\n\n if (playPromise && typeof playPromise.then === \"function\") {\n void playPromise\n .then(() => {\n if (playbackAccessModeRef.current === \"unknown\") {\n playbackAccessModeRef.current = \"auto\";\n }\n\n pendingAutoPlayRef.current = false;\n isSwitchingSegmentRef.current = false;\n })\n .catch((error: unknown) => {\n if (\n playbackAccessModeRef.current === \"unknown\" &&\n isAutoplayBlockedError(error)\n ) {\n // Lock autoplay after the first browser rejection.\n playbackAccessModeRef.current = \"blocked\";\n pendingAutoPlayRef.current = false;\n updateLoading(false);\n }\n\n isSwitchingSegmentRef.current = false;\n setIsPlaying(false);\n });\n }\n\n return true;\n },\n [isAutoplayBlockedError, updateLoading]\n );\n\n const startSegmentPlayback = useCallback(\n (segmentIndex: number, _reason: string) => {\n const audioElement = audioRef.current;\n const segment = currentAudioSegmentsRef.current[segmentIndex];\n\n if (!audioElement || !segment) {\n return false;\n }\n\n const nextAudioSrc = getSegmentSrc(segment.audio_data);\n\n currentSegmentIndexRef.current = segmentIndex;\n waitingSegmentIndexRef.current = null;\n isWaitingForSegmentRef.current = false;\n isSwitchingSegmentRef.current = true;\n preferredSourceTypeRef.current = \"segment\";\n publishPlaybackTime(getSegmentStartTimeMs(segmentIndex));\n const shouldAutoResume = canStartPlaybackAutomatically();\n\n pendingAutoPlayRef.current = shouldAutoResume;\n updateLoading(false);\n\n const hasNewSrc = audioSrcRef.current !== nextAudioSrc;\n\n activeSourceTypeRef.current = \"segment\";\n\n if (hasNewSrc) {\n audioElement.pause();\n audioElement.removeAttribute(\"src\");\n audioElement.load();\n audioSrcRef.current = nextAudioSrc;\n audioElement.src = nextAudioSrc;\n audioElement.load();\n }\n\n pendingSeekTimeRef.current = 0;\n\n if (audioElement.readyState > 0) {\n audioElement.currentTime = 0;\n pendingSeekTimeRef.current = null;\n }\n\n if (!shouldAutoResume) {\n pendingAutoPlayRef.current = false;\n isSwitchingSegmentRef.current = false;\n audioElement.pause();\n setIsPlaying(false);\n return true;\n }\n\n return tryPlayCurrentAudio(`start-segment:${_reason}`);\n },\n [\n canStartPlaybackAutomatically,\n getSegmentSrc,\n getSegmentStartTimeMs,\n publishPlaybackTime,\n tryPlayCurrentAudio,\n updateLoading,\n ]\n );\n\n const finishAudioItem = useCallback(\n (_reason?: string) => {\n stopPlaybackTimeLoop();\n pendingAutoPlayRef.current = false;\n isWaitingForSegmentRef.current = false;\n isSwitchingSegmentRef.current = false;\n syncPlaybackTime();\n setIsPlaying(false);\n updateLoading(false);\n\n if (currentAudioIndex >= 0) {\n onEnded?.(currentAudioIndex);\n }\n },\n [\n currentAudioIndex,\n onEnded,\n stopPlaybackTimeLoop,\n syncPlaybackTime,\n updateLoading,\n ]\n );\n\n const finishUrlAudioIfSeekedToEnd = useCallback(\n (_reason: string) => {\n const audioElement = audioRef.current;\n\n if (!audioElement || activeSourceTypeRef.current !== \"url\") {\n return false;\n }\n\n if (\n !hasReachedAudioEnd({\n currentTimeSeconds: Math.max(audioElement.currentTime, 0),\n durationSeconds: audioElement.duration,\n })\n ) {\n return false;\n }\n\n pendingAutoPlayRef.current = false;\n audioElement.pause();\n finishAudioItem(_reason);\n return true;\n },\n [finishAudioItem]\n );\n\n const handleSegmentEnded = useCallback(() => {\n const nextSegmentIndex = currentSegmentIndexRef.current + 1;\n const segments = currentAudioSegmentsRef.current;\n const nextSegment = segments[nextSegmentIndex];\n const activeAudio = currentAudioRef.current;\n const hasFinal = segments.some((segment) => segment.is_final);\n\n if (nextSegment) {\n startSegmentPlayback(nextSegmentIndex, \"ended\");\n return;\n }\n\n if (activeAudio?.isAudioStreaming || !hasFinal) {\n currentSegmentIndexRef.current = nextSegmentIndex;\n waitingSegmentIndexRef.current = nextSegmentIndex;\n isWaitingForSegmentRef.current = true;\n pendingAutoPlayRef.current = defaultPlaying;\n publishPlaybackTime(getSegmentStartTimeMs(nextSegmentIndex));\n setIsPlaying(false);\n updateLoading(true, \"waitingForMoreAudio\");\n\n return;\n }\n\n finishAudioItem(\"segments-completed\");\n }, [\n defaultPlaying,\n finishAudioItem,\n getSegmentStartTimeMs,\n publishPlaybackTime,\n startSegmentPlayback,\n updateLoading,\n ]);\n\n useEffect(() => {\n if (currentAudioKeyRef.current === currentAudioKey) {\n return;\n }\n\n currentAudioKeyRef.current = currentAudioKey;\n currentSegmentIndexRef.current = 0;\n waitingSegmentIndexRef.current = null;\n isWaitingForSegmentRef.current = false;\n isPausedByUserRef.current = false;\n wasPlayingBeforeExternalPauseRef.current = false;\n pendingAutoPlayRef.current = false;\n isSwitchingSegmentRef.current = false;\n activeSourceTypeRef.current = null;\n preferredSourceTypeRef.current = null;\n audioSrcRef.current = null;\n stopPlaybackTimeLoop();\n publishPlaybackTime(0);\n updateLoading(false);\n\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return;\n }\n\n audioElement.pause();\n audioElement.removeAttribute(\"src\");\n audioElement.load();\n setIsPlaying(false);\n }, [\n currentAudioIndex,\n currentAudioKey,\n currentAudioSegments.length,\n currentAudioUrl,\n publishPlaybackTime,\n stopPlaybackTimeLoop,\n updateLoading,\n ]);\n\n useEffect(() => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return;\n }\n\n if (isPlaybackPaused) {\n wasPlayingBeforeExternalPauseRef.current = Boolean(\n currentAudioRef.current &&\n !isPausedByUserRef.current &&\n (!audioElement.paused ||\n pendingAutoPlayRef.current ||\n waitingSegmentIndexRef.current !== null)\n );\n\n pendingAutoPlayRef.current = false;\n updateLoading(false);\n audioElement.pause();\n setIsPlaying(false);\n return;\n }\n\n if (\n !wasPlayingBeforeExternalPauseRef.current ||\n !currentAudioRef.current ||\n isPausedByUserRef.current\n ) {\n return;\n }\n\n wasPlayingBeforeExternalPauseRef.current = false;\n\n if (waitingSegmentIndexRef.current !== null) {\n if (\n waitingSegmentIndexRef.current < currentAudioSegmentsRef.current.length\n ) {\n startSegmentPlayback(waitingSegmentIndexRef.current, \"external-resume\");\n return;\n }\n\n pendingAutoPlayRef.current = true;\n updateLoading(true, \"waitingForMoreAudio\");\n return;\n }\n\n if (!audioSrcRef.current && currentAudioSegmentsRef.current.length > 0) {\n startSegmentPlayback(\n Math.min(\n currentSegmentIndexRef.current,\n currentAudioSegmentsRef.current.length - 1\n ),\n \"external-resume-init\"\n );\n return;\n }\n\n if (!audioElement.paused) {\n return;\n }\n\n pendingAutoPlayRef.current = true;\n tryPlayCurrentAudio(\"external-resume\");\n }, [\n isPlaybackPaused,\n startSegmentPlayback,\n tryPlayCurrentAudio,\n updateLoading,\n ]);\n\n useEffect(() => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return;\n }\n\n if (!currentAudio) {\n resetAudio();\n return;\n }\n\n if (isPlaybackPaused) {\n pendingAutoPlayRef.current = false;\n updateLoading(false);\n audioElement.pause();\n setIsPlaying(false);\n return;\n }\n\n const resolvedSourceType = resolveAudioPlaybackSourceType({\n activeSourceType: activeSourceTypeRef.current,\n hasAudioUrl: Boolean(currentAudioUrl),\n segmentCount: currentAudioSegments.length,\n preferredSourceType: preferredSourceTypeRef.current,\n waitingSegmentIndex: waitingSegmentIndexRef.current,\n });\n\n if (\n resolvedSourceType &&\n preferredSourceTypeRef.current !== resolvedSourceType\n ) {\n preferredSourceTypeRef.current = resolvedSourceType;\n }\n\n if (resolvedSourceType === \"url\" && currentAudioUrl) {\n const hasNewSrc = audioSrcRef.current !== currentAudioUrl;\n const shouldAutoResume = canStartPlaybackAutomatically();\n\n if (hasNewSrc) {\n const nextSeekTime =\n waitingSegmentIndexRef.current !== null\n ? getWaitingSegmentSeekTime()\n : 0;\n\n audioElement.pause();\n audioElement.removeAttribute(\"src\");\n audioElement.load();\n audioSrcRef.current = currentAudioUrl;\n activeSourceTypeRef.current = \"url\";\n audioElement.src = currentAudioUrl;\n audioElement.load();\n pendingSeekTimeRef.current = nextSeekTime;\n publishPlaybackTime(nextSeekTime * 1000);\n\n if (audioElement.readyState > 0) {\n audioElement.currentTime = nextSeekTime;\n pendingSeekTimeRef.current = null;\n }\n }\n\n pendingAutoPlayRef.current = shouldAutoResume;\n isWaitingForSegmentRef.current = false;\n isSwitchingSegmentRef.current = false;\n updateLoading(false);\n\n if (!shouldAutoResume) {\n pendingAutoPlayRef.current = false;\n audioElement.pause();\n setIsPlaying(false);\n return;\n }\n\n tryPlayCurrentAudio(hasNewSrc ? \"sync-url-init\" : \"sync-url\");\n return;\n }\n\n if (\n resolvedSourceType === \"segment\" &&\n waitingSegmentIndexRef.current !== null\n ) {\n if (waitingSegmentIndexRef.current < currentAudioSegments.length) {\n if (isPausedByUserRef.current) {\n setIsPlaying(false);\n updateLoading(false);\n return;\n }\n\n startSegmentPlayback(waitingSegmentIndexRef.current, \"wait-resume\");\n return;\n }\n\n isWaitingForSegmentRef.current = true;\n pendingAutoPlayRef.current = canStartPlaybackAutomatically();\n setIsPlaying(false);\n updateLoading(canStartPlaybackAutomatically());\n return;\n }\n\n if (resolvedSourceType === \"segment\" && !currentAudioSegments.length) {\n if (currentAudio.isAudioStreaming) {\n waitingSegmentIndexRef.current = currentSegmentIndexRef.current;\n isWaitingForSegmentRef.current = true;\n pendingAutoPlayRef.current = canStartPlaybackAutomatically();\n setIsPlaying(false);\n updateLoading(canStartPlaybackAutomatically());\n return;\n }\n\n resetAudio();\n return;\n }\n\n if (resolvedSourceType === \"segment\" && !audioSrcRef.current) {\n startSegmentPlayback(\n Math.min(\n currentSegmentIndexRef.current,\n currentAudioSegments.length - 1\n ),\n \"effect-init\"\n );\n return;\n }\n\n if (resolvedSourceType !== \"segment\") {\n resetAudio();\n return;\n }\n\n if (!defaultPlaying || isPausedByUserRef.current) {\n pendingAutoPlayRef.current = false;\n audioElement.pause();\n setIsPlaying(false);\n return;\n }\n\n if (audioElement.paused) {\n pendingAutoPlayRef.current = true;\n tryPlayCurrentAudio(\"sync-paused-retry\");\n }\n }, [\n currentAudio,\n currentAudioIndex,\n currentAudioSegments,\n currentAudioUrl,\n defaultPlaying,\n isPlaybackPaused,\n canStartPlaybackAutomatically,\n publishPlaybackTime,\n resetAudio,\n startSegmentPlayback,\n tryPlayCurrentAudio,\n getWaitingSegmentSeekTime,\n updateLoading,\n ]);\n\n useEffect(() => resetAudio, [resetAudio]);\n\n useEffect(() => stopPlaybackTimeLoop, [stopPlaybackTimeLoop]);\n\n const handleAudioPlay = useCallback(() => {\n syncPlaybackTime();\n startPlaybackTimeLoop();\n setIsPlaying(true);\n updateLoading(false);\n onPlaybackStarted?.();\n }, [\n onPlaybackStarted,\n startPlaybackTimeLoop,\n syncPlaybackTime,\n updateLoading,\n ]);\n\n const handleAudioPause = useCallback(() => {\n if (isWaitingForSegmentRef.current || isSwitchingSegmentRef.current) {\n return;\n }\n\n stopPlaybackTimeLoop();\n syncPlaybackTime();\n setIsPlaying(false);\n }, [currentAudioIndex, stopPlaybackTimeLoop, syncPlaybackTime]);\n\n const handleAudioCanPlay = useCallback(() => {\n const audioElement = audioRef.current;\n\n if (audioElement && pendingSeekTimeRef.current !== null) {\n audioElement.currentTime = pendingSeekTimeRef.current;\n pendingSeekTimeRef.current = null;\n }\n\n syncPlaybackTime();\n\n if (finishUrlAudioIfSeekedToEnd(\"canplay-seek-finished\")) {\n return;\n }\n\n if (!pendingAutoPlayRef.current || !defaultPlaying) {\n return;\n }\n\n tryPlayCurrentAudio(\"canplay\");\n }, [\n currentAudioIndex,\n defaultPlaying,\n finishUrlAudioIfSeekedToEnd,\n syncPlaybackTime,\n tryPlayCurrentAudio,\n ]);\n\n const handleLoadedMetadata = useCallback(() => {\n const audioElement = audioRef.current;\n\n if (audioElement && pendingSeekTimeRef.current !== null) {\n audioElement.currentTime = pendingSeekTimeRef.current;\n pendingSeekTimeRef.current = null;\n }\n\n syncPlaybackTime();\n\n finishUrlAudioIfSeekedToEnd(\"metadata-seek-finished\");\n }, [currentAudioIndex, finishUrlAudioIfSeekedToEnd, syncPlaybackTime]);\n\n const handleAudioTimeUpdate = useCallback(() => {\n syncPlaybackTime();\n }, [syncPlaybackTime]);\n\n const handleAudioLoadStart = useCallback(() => {\n if (isWaitingForSegmentRef.current) {\n return;\n }\n\n updateLoading(true, \"loadingAudio\");\n }, [updateLoading]);\n\n const handleAudioWaiting = useCallback(() => {\n if (isWaitingForSegmentRef.current) {\n updateLoading(true, \"waitingForMoreAudio\");\n return;\n }\n\n updateLoading(true, \"loadingAudio\");\n }, [updateLoading]);\n\n const handleAudioSeeking = useCallback(() => {\n syncPlaybackTime();\n }, [syncPlaybackTime]);\n\n const handleAudioEnded = useCallback(() => {\n const shouldFinishAsUrl =\n activeSourceTypeRef.current === \"url\" ||\n currentAudioSegmentsRef.current.length === 0;\n\n stopPlaybackTimeLoop();\n isSwitchingSegmentRef.current = false;\n\n if (shouldFinishAsUrl) {\n finishAudioItem(\"url-ended\");\n return;\n }\n\n handleSegmentEnded();\n }, [finishAudioItem, handleSegmentEnded, stopPlaybackTimeLoop]);\n\n const handleAudioError = useCallback(() => {\n stopPlaybackTimeLoop();\n syncPlaybackTime();\n setIsPlaying(false);\n updateLoading(false);\n }, [stopPlaybackTimeLoop, syncPlaybackTime, updateLoading]);\n const handleMobileViewModeChange = useCallback(\n (nextViewMode: MobileViewMode) => {\n onMobileViewModeChange?.(nextViewMode);\n setIsMobileMoreOpen(false);\n },\n [onMobileViewModeChange]\n );\n\n useEffect(() => {\n onPlaybackTimeChange?.(playbackTimeMsRef.current);\n }, [onPlaybackTimeChange]);\n\n return (\n <div className={cn(\"slide-player\", className)} {...props}>\n <audio\n ref={audioRef}\n preload=\"auto\"\n playsInline\n onLoadStart={handleAudioLoadStart}\n onLoadedMetadata={handleLoadedMetadata}\n onCanPlay={handleAudioCanPlay}\n onPlay={handleAudioPlay}\n onPause={handleAudioPause}\n onWaiting={handleAudioWaiting}\n onSeeking={handleAudioSeeking}\n onSeeked={handleAudioSeeking}\n onTimeUpdate={handleAudioTimeUpdate}\n onEnded={handleAudioEnded}\n onError={handleAudioError}\n />\n\n {showControls ? (\n <>\n <MobilePlayerSettingsSheet\n container={settingsPortalContainer}\n labels={{\n fullscreen: playerTexts.fullscreenLabel,\n nonFullscreen: playerTexts.nonFullscreenLabel,\n screen: playerTexts.screenLabel,\n subtitle: playerTexts.subtitleLabel,\n subtitleToggle: playerTexts.subtitleToggleAriaLabel,\n title: playerTexts.settingsTitle,\n }}\n isSubtitleEnabled={isSubtitleEnabled}\n onClose={() => setIsMobileMoreOpen(false)}\n onOpenChange={setIsMobileMoreOpen}\n onSubtitleToggle={onSubtitleToggle ?? (() => {})}\n onViewModeChange={handleMobileViewModeChange}\n open={isMobileMoreOpen}\n viewMode={mobileViewMode}\n />\n\n <div className=\"slide-player__controls\" style={controlsStyle}>\n <div className=\"slide-player__group\">\n <button\n aria-expanded={isMobileMoreOpen}\n aria-haspopup=\"dialog\"\n aria-label=\"More options\"\n className=\"slide-player__action slide-player__action--mobile-more\"\n onClick={() => {\n setIsMobileMoreOpen((prevOpen) => !prevOpen);\n }}\n type=\"button\"\n >\n <EllipsisVertical\n className=\"slide-player__icon\"\n strokeWidth={2.25}\n />\n </button>\n <button aria-label=\"Volume\" className=\"hidden\" type=\"button\">\n <Volume2 className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n <button\n aria-label={playerTexts.subtitleToggleAriaLabel}\n aria-pressed={isSubtitleEnabled}\n className=\"slide-player__action slide-player__action--subtitle\"\n onClick={onSubtitleToggle}\n type=\"button\"\n >\n {isSubtitleEnabled ? (\n <Captions className=\"slide-player__icon\" strokeWidth={2.25} />\n ) : (\n <CaptionsOff\n className=\"slide-player__icon\"\n strokeWidth={2.25}\n />\n )}\n </button>\n <button\n aria-label=\"Rewind\"\n className=\"slide-player__action slide-player__action--prev\"\n disabled={prevDisabled}\n onClick={onPrev}\n type=\"button\"\n >\n <RotateCcw className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n <button\n aria-label={toggleAriaLabel}\n className=\"slide-player__toggle slide-player__toggle--playback\"\n onClick={() => {\n if (useAutoAdvanceToggle) {\n onAutoAdvanceToggle?.(!isAutoAdvanceEnabled);\n return;\n }\n\n const audioElement = audioRef.current;\n\n if (isPlaybackPaused || !audioElement || !currentAudio) {\n return;\n }\n\n if (waitingSegmentIndexRef.current !== null) {\n if (isPlaying) {\n pendingAutoPlayRef.current = false;\n isPausedByUserRef.current = true;\n waitingSegmentIndexRef.current = null;\n isWaitingForSegmentRef.current = false;\n setIsPlaying(false);\n updateLoading(false);\n audioElement.pause();\n return;\n }\n\n playbackAccessModeRef.current = \"manual\";\n isPausedByUserRef.current = false;\n pendingAutoPlayRef.current = true;\n updateLoading(true, \"waitingForMoreAudio\");\n return;\n }\n\n if (!audioElement.src && currentAudioSegments.length > 0) {\n playbackAccessModeRef.current = \"manual\";\n isPausedByUserRef.current = false;\n startSegmentPlayback(\n Math.min(\n currentSegmentIndexRef.current,\n currentAudioSegments.length - 1\n ),\n \"toggle\"\n );\n return;\n }\n\n if (audioElement.paused) {\n playbackAccessModeRef.current = \"manual\";\n isPausedByUserRef.current = false;\n pendingAutoPlayRef.current = true;\n tryPlayCurrentAudio(\"toggle-resume\");\n return;\n }\n\n pendingAutoPlayRef.current = false;\n isPausedByUserRef.current = true;\n audioElement.pause();\n }}\n type=\"button\"\n >\n {isTogglePlaying ? <PauseIcon /> : <PlayIcon />}\n </button>\n <button\n aria-label=\"Forward\"\n className=\"slide-player__action slide-player__action--next\"\n disabled={nextDisabled}\n onClick={onNext}\n type=\"button\"\n >\n <RotateCw className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n {onFullscreen ? (\n <button\n aria-label={\n isFullscreen ? \"Exit fullscreen\" : \"Enter fullscreen\"\n }\n className=\"slide-player__action slide-player__action--fullscreen\"\n onClick={onFullscreen}\n type=\"button\"\n >\n {isFullscreen ? (\n <ScanLine\n className=\"slide-player__icon\"\n strokeWidth={2.25}\n />\n ) : (\n <Maximize\n className=\"slide-player__icon\"\n strokeWidth={2.25}\n />\n )}\n </button>\n ) : null}\n </div>\n\n <div className=\"slide-player__separator\" />\n\n <div className=\"slide-player__group\">\n {customActionList.map((customAction, customActionIndex) => (\n <React.Fragment key={`custom-action-${customActionIndex}`}>\n {customAction}\n </React.Fragment>\n ))}\n <button\n aria-label=\"Notes\"\n className={cn(\n \"slide-player__action slide-player__action--notes\",\n isInteractionOpen && \"slide-player__action--active\"\n )}\n disabled={!hasInteraction}\n onClick={onInteractionToggle}\n type=\"button\"\n >\n <FilePenLine\n className=\"slide-player__icon\"\n strokeWidth={2.25}\n />\n </button>\n </div>\n </div>\n </>\n ) : null}\n </div>\n );\n};\n\nconst MemoizedPlayer = memo(Player);\n\nMemoizedPlayer.displayName = \"Player\";\n\nexport default MemoizedPlayer;\n"],"names":["audioPreloadElementCache","preloadAudioUrl","url","audio","PauseIcon","jsxs","jsx","PlayIcon","Player","audioList","className","currentAudioIndex","defaultPlaying","isPlaybackPaused","isAutoAdvanceEnabled","useAutoAdvanceToggle","onLoadingChange","onPlaybackStarted","onPlaybackTimeChange","onSubtitleToggle","onPrev","onNext","onFullscreen","isFullscreen","mobileViewMode","DEFAULT_MOBILE_VIEW_MODE","settingsPortalContainer","onMobileViewModeChange","onEnded","onAutoAdvanceToggle","onInteractionToggle","hasInteraction","isInteractionOpen","isSubtitleEnabled","prevDisabled","nextDisabled","showControls","customActions","customActionContext","texts","props","audioRef","useRef","previousInteractionOpenRef","audioSrcRef","currentAudioKeyRef","currentSegmentIndexRef","waitingSegmentIndexRef","currentAudioRef","currentAudioSegmentsRef","wasPlayingBeforeExternalPauseRef","isLoadingRef","isPausedByUserRef","activeSourceTypeRef","preferredSourceTypeRef","isWaitingForSegmentRef","pendingAutoPlayRef","pendingSeekTimeRef","isSwitchingSegmentRef","playbackAnimationFrameRef","playbackTimeMsRef","playbackAccessModeRef","isPlaying","setIsPlaying","useState","isMobileMoreOpen","setIsMobileMoreOpen","currentAudio","currentAudioUrl","currentAudioSegments","useMemo","prevSegment","nextSegment","customActionList","toPlayerCustomActionList","mobileVisibleActionCount","controlsStyle","playerTexts","DEFAULT_SLIDE_PLAYER_TEXTS","currentAudioKey","isTogglePlaying","toggleAriaLabel","useEffect","currentUrl","nextUrl","updateLoading","useCallback","loading","reason","isAutoplayBlockedError","error","canStartPlaybackAutomatically","getSegmentSrc","audioData","getWaitingSegmentSeekTime","waitingSegmentIndex","totalDurationMs","segment","getSegmentStartTimeMs","segmentIndex","getCurrentPlaybackTimeMs","audioElement","publishPlaybackTime","timeMs","nextPlaybackTimeMs","syncPlaybackTime","stopPlaybackTimeLoop","startPlaybackTimeLoop","updateFrame","resetAudio","tryPlayCurrentAudio","_reason","playPromise","startSegmentPlayback","nextAudioSrc","shouldAutoResume","hasNewSrc","finishAudioItem","finishUrlAudioIfSeekedToEnd","hasReachedAudioEnd","handleSegmentEnded","nextSegmentIndex","segments","activeAudio","hasFinal","resolvedSourceType","resolveAudioPlaybackSourceType","nextSeekTime","handleAudioPlay","handleAudioPause","handleAudioCanPlay","handleLoadedMetadata","handleAudioTimeUpdate","handleAudioLoadStart","handleAudioWaiting","handleAudioSeeking","handleAudioEnded","shouldFinishAsUrl","handleAudioError","handleMobileViewModeChange","nextViewMode","cn","Fragment","MobilePlayerSettingsSheet","prevOpen","EllipsisVertical","Volume2","Captions","CaptionsOff","RotateCcw","RotateCw","ScanLine","Maximize","customAction","customActionIndex","React","FilePenLine","MemoizedPlayer","memo"],"mappings":"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"}
@@ -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"),un=require("../../lib/sandboxInteraction.cjs.js"),G=require("../../lib/utils.cjs.js"),cn=require("../ui/loading-overlay-card.cjs.js"),an=require("../ContentRender/ContentRender.cjs.js"),vt=require("../ContentRender/IframeSandbox.cjs.js");require("../ui/inputGroup/input-group.cjs.js");const St=require("../../lib/interaction-defaults.cjs.js"),Ee=require("../../lib/mobileDevice.cjs.js"),dn=require("./Player.cjs.js"),fn=require("./SubtitleOverlay.cjs.js"),mn=require("./useSlide.cjs.js"),pn=require("./useWakePlayerFromIframe.cjs.js"),ue=require("./utils/mobileScreenMode.cjs.js"),hn=require("./utils/interactionPlayback.cjs.js"),xn=require("./utils/appendedMarkerAdvance.cjs.js"),bn=require("./utils/playbackSequence.cjs.js"),Et=require("./utils/playerCustomActions.cjs.js"),vn=require("./utils/playbackTimeStore.cjs.js"),Sn=require("./utils/playerToggleMode.cjs.js");;/* empty css */const En=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"),yn=2e3,gn=300,Rn=160,In=16,yt=t.memo(({content:F,title:B,defaultButtonText:v,defaultInputText:$,defaultSelectedValues:S,confirmButtonText:q,copyButtonText:Y,copiedButtonText:ye,onSend:ge,readonly:N=!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:B})}),r.jsxRuntimeExports.jsx("div",{className:"slide-player__interaction-body",children:r.jsxRuntimeExports.jsx(an.default,{content:F,defaultButtonText:v,defaultInputText:$,defaultSelectedValues:S,confirmButtonText:q,copyButtonText:Y,copiedButtonText:ye,onSend:ge,readonly:N,enableTypewriter:!1,sandboxMode:"content"})})]}));yt.displayName="InteractionOverlayCard";const An=(F,B)=>F.length===B.length&&F.every((v,$)=>{const S=B[$];return v.sequence_number===S?.sequence_number&&v.type===S?.type&&v.content===S?.content}),wn=({elementList:F=[],showPlayer:B=!0,playerAlwaysVisible:v=!1,playerClassName:$,fullscreenHeader:S,playerCustomActions:q,playerCustomActionPauseOnActive:Y=!0,bufferingText:ye="Buffering...",interactionTitle:ge,interactionTexts:N,playerTexts:gt,playerAutoHideDelay:Re=3e3,markerAutoAdvanceDelay:qe=yn,interactionDefaultValueOptions:ie,onSend:Ne,onPlayerVisibilityChange:Ie,onMobileViewModeChange:Oe,onStepChange:Le,enableIframeScaling:Rt=!0,disableLoadingOverlay:g=!1,className:It,onPointerDown:Ve,...At})=>{const ce=t.useRef(null),Ke=t.useRef(null),Ae=t.useRef(null),De=t.useRef(null),X=t.useRef(null),J=t.useRef(null),Q=t.useRef(null),Z=t.useRef(null),Ue=t.useRef(null),He=t.useRef([]),ae=t.useRef(!1),O=t.useRef(null),We=t.useRef(null),ze=t.useRef({markerCount:0,currentIndex:-1,canGoNext:!1}),{currentElementList:M,stepElementLists:Ge,slideElementList:_,currentIndex:c,audioList:d,currentAudioSequenceIndexes:de,currentStepHasSpeakableElement:h,currentInteractionElement:i,canGoPrev:wt,canGoNext:b,handlePrev:$e,handleNext:R}=mn.default(F),ee=t.useMemo(()=>{if(!(c<0))return _[c]},[c,_]),Ct=_.filter(e=>e.is_renderable!==!1).length===1,E=B&&(_.length>0||d.length>0||!!i),I=t.useMemo(()=>de.map(e=>d[e]?.audioKey).filter(e=>!!e),[d,de]),[Ye,fe]=t.useState(!0),[me,te]=t.useState(!1),[ne,Xe]=t.useState(!0),[f,L]=t.useState(null),[Mt,m]=t.useState(!1),[A,Je]=t.useState(!1),[_t,we]=t.useState(!1),[Qe,kt]=t.useState(!0),[Ce,Me]=t.useState(!1),[s,_e]=t.useState(),[pe,he]=t.useState(!1),[Tt,re]=t.useState(0),[Ze,Pt]=t.useState(!1),k=t.useMemo(()=>Ee.isMobileDevice(),[]),[xe,ke]=t.useState(ue.DEFAULT_MOBILE_VIEW_MODE),[et,Te]=t.useState(!1),[jt,tt]=t.useState(()=>k?Ee.isLandscapeViewport():!1),V=t.useMemo(()=>vn.createPlaybackTimeStore(),[]),{effectiveMobileViewMode:K,isImmersiveMobileFullscreen:D,isNativeMobileFullscreen:nt,shouldRotateFullscreenViewport:Ft}=t.useMemo(()=>ue.resolveMobileViewModeState({hasManualMobileViewMode:et,isMobileDevice:k,mobileViewMode:xe}),[et,k,jt,xe]),Bt=t.useRef(K),w=E&&(v||Ye),qt=D&&w,Nt=D&&w,Ot=D||nt,rt=Ze&&!k,Lt=t.useCallback(e=>{Te(!0),ke(e)},[]),st=t.useCallback(()=>{Te(!1),ke(ue.DEFAULT_MOBILE_VIEW_MODE)},[]),Vt=t.useCallback(()=>{st(),S?.onBack?.()},[S,st]),ot=t.useCallback(e=>{Me(e)},[]),lt=t.useCallback(()=>{Me(e=>!e)},[]),{mountedStepStates:Kt,currentMountedStateIndex:Dt}=t.useMemo(()=>{const e=[],n=new Map;return Ge.forEach((l,a)=>{const o=e.findIndex(u=>An(u.elementList,l));if(o>=0){e[o]?.sourceStepIndexes.push(a),n.set(a,o);return}e.push({elementList:l,sourceStepIndexes:[a]}),n.set(a,e.length-1)}),{mountedStepStates:e,currentMountedStateIndex:c>=0?n.get(c)??-1:-1}},[c,Ge]),ut=t.useMemo(()=>String(c),[c]),p=t.useMemo(()=>f?d.findIndex(e=>(e.audioKey??"")===f):-1,[d,f]),Pe=t.useMemo(()=>p>=0?d[p]:void 0,[d,p]),Ut=Pe?.element?.subtitle_cues??[],be=t.useMemo(()=>I[0]??"none",[I]),je=t.useMemo(()=>({currentElement:Et.resolvePlayerCustomActionElement({currentAudioIndex:p,currentAudioSequenceIndexes:de,audioList:d,currentInteractionElement:s,currentStepElement:ee}),currentIndex:c,currentStepElement:ee,isActive:Ce,setActive:ot,toggleActive:lt}),[s,d,p,de,c,ee,Ce,ot,lt]),Fe=t.useMemo(()=>Et.getPlayerCustomActionCount(q,je),[je,q]),Ht=t.useMemo(()=>({"--slide-player-custom-action-count":String(Fe),"--slide-player-mobile-control-count":String(Fe+4)}),[Fe]),it=I.length>0,ct=t.useMemo(()=>i?`${i.sequence_number??"none"}:${String(i.content??"")}`:"none",[i]),se=t.useMemo(()=>[ut,ct].join("|"),[ct,ut]),Wt=t.useMemo(()=>[se,Pe?.audioKey??"none",String(p)].join("|"),[p,Pe?.audioKey,se]),at=!!t.useMemo(()=>!be||be==="none"?"":d.find(n=>n.audioKey===be)?.audioUrl?.trim()??"",[d,be]),P=Y&&!!q&&Ce,oe=t.useMemo(()=>Sn.shouldUseAutoAdvanceToggle({canGoNext:b,currentAudioIndex:p,currentStepHasSpeakableElement:h,hasInteraction:!!i}),[b,p,i,h]),j=t.useCallback(()=>{X.current!==null&&(window.clearTimeout(X.current),X.current=null)},[]),T=t.useCallback(()=>{Q.current!==null&&(window.clearTimeout(Q.current),Q.current=null)},[]),C=t.useCallback(()=>{Z.current!==null&&(window.clearTimeout(Z.current),Z.current=null)},[]),U=t.useCallback(()=>{J.current!==null&&(window.clearTimeout(J.current),J.current=null)},[]),H=t.useCallback(()=>{U(),T(),C(),L(null),V.reset(),m(!1),Je(!1),we(!1),_e(void 0),he(!1),re(0)},[U,T,C,V]),W=t.useCallback(()=>{const e=I[0];return e?(L(e),!0):!1},[I]),ve=t.useCallback(()=>{T(),C(),he(!1),re(0),!W()&&b&&R()},[b,T,C,R,W]),dt=t.useCallback(e=>{if(C(),!e)return;const n=()=>{Z.current=null,re(Rn),he(!0),O.current=null};Z.current=window.setTimeout(n,gn)},[C]),x=t.useCallback((e=me)=>{E&&(fe(!0),j(),!(v||!e||Re<=0)&&(X.current=window.setTimeout(()=>{fe(!1),X.current=null},Re)))},[j,me,v,Re,E]),le=!!(i?.readonly||i?.user_input?.trim()),z=!!i&&!le;t.useEffect(()=>{Xe(!0),Y&&Me(!1)},[c,Y]),t.useEffect(()=>()=>{U(),j(),T(),C()},[U,T,C,j]),t.useEffect(()=>(Ie?.(w),()=>{Ie?.(!1)}),[Ie,w]),t.useEffect(()=>{k||xe===ue.DEFAULT_MOBILE_VIEW_MODE||(Te(!1),ke(ue.DEFAULT_MOBILE_VIEW_MODE))},[k,xe]),t.useEffect(()=>{if(!k){tt(!1);return}const e=()=>{tt(Ee.isLandscapeViewport())};return e(),Ee.subscribeMobileDeviceChange(e)},[k]),t.useEffect(()=>{Oe?.(K)},[K,Oe]),t.useEffect(()=>{Bt.current=K},[K]),t.useEffect(()=>{Le?.(ee,c)},[c,ee,Le]),t.useEffect(()=>{const e=ze.current,n=xn.shouldAutoAdvanceIntoAppendedMarker({previousMarkerCount:e.markerCount,nextMarkerCount:_.length,previousIndex:e.currentIndex,previousCanGoNext:e.canGoNext,nextCanGoNext:b,currentAudioKey:f,hasCompletedCurrentStepAudio:A,hasResolvedCurrentInteraction:le,currentStepHasSpeakableElement:h,currentInteractionElement:i,isAutoAdvanceEnabled:ne,shouldUseSilentStepAutoAdvanceToggle:oe});ze.current={markerCount:_.length,currentIndex:c,canGoNext:b},n&&R()},[b,f,c,i,h,R,A,le,ne,oe,_.length]),t.useEffect(()=>{if(!E){j(),fe(!1);return}if(v){j(),fe(!0);return}me||x(!0)},[j,me,v,E,x]),t.useEffect(()=>{if(typeof window>"u")return;const e=n=>{n.origin===window.location.origin&&un.isSandboxInteractionMessage(n.data)&&n.data.eventType==="click"&&E&&(te(!0),x(!0))};return window.addEventListener("message",e),()=>{window.removeEventListener("message",e)}},[E,x]),pn.default({sectionRef:ce,enabled:E,onWake:()=>{te(!0),x(!0)}}),t.useEffect(()=>{const{hasPlaybackContextChanged:e,shouldInitializeAudioSequence:n}=bn.getPlaybackSequenceTransition({previousResetKey:We.current,nextResetKey:se,currentAudioKey:f,hasCompletedCurrentStepAudio:A});We.current=se;const l=O.current===c&&!!i,a=hn.shouldPresentInteractionOverlay({hasInteraction:!!i,shouldBlockPlaybackForInteraction:z,shouldOpenInteractionOverlayAfterAudio:l,hasPlaybackContextChanged:e,hasResolvedCurrentInteraction:le,currentStepHasSpeakableElement:h});if(e&&H(),!(M.length===0&&!i)&&!P){if(i&&_e(i),a){dt(i);return}if(C(),O.current=null,!!n&&!W()){if(h){if(g){m(!1);return}m(!0);return}if(b&&!(oe&&!ne))return J.current=window.setTimeout(()=>{J.current=null,R()},qe),()=>{U()}}}},[b,U,M.length,i,f,se,h,qe,R,A,g,ne,le,z,C,H,dt,W,P,oe]),t.useEffect(()=>{if(g||P||!h||z){m(!1);return}if(A){m(!1);return}if(it){m(!1);return}m(!0)},[it,h,A,g,P,z]),t.useEffect(()=>{f||I.length===0||P||!h||z||A||W()},[f,I,h,A,P,z,W]),t.useEffect(()=>{!f||p>=0||L(null)},[p,f]),t.useEffect(()=>{p>=0||V.reset()},[p,V]),t.useEffect(()=>{we(!1)},[Wt]);const ft=t.useMemo(()=>{if(!s)return{};const e=!!s.user_input?.trim();return St.getInteractionDefaultValues(typeof s.content=="string"?s.content:void 0,s.user_input,e?void 0:ie)},[s,ie]),zt=t.useMemo(()=>{if(!s)return;const e=!!s.user_input?.trim();return St.getInteractionDefaultSelectedValues(typeof s.content=="string"?s.content:void 0,s.user_input,e?void 0:ie)},[s,ie]),mt=!!s?.user_input?.trim(),pt=!!s?.readonly||mt,ht=pt||mt,Be=!!s&&pe,Gt=t.useCallback(e=>{const l=[...e.selectedValues??[],e.inputText?.trim()??"",e.buttonText?.trim()??""].filter(Boolean).join(", ");_e(a=>!a||!l?a:{...a,user_input:l}),Ne?.(e,s),ve()},[s,ve,Ne]);t.useEffect(()=>{const e=()=>{Pt(document.fullscreenElement===ce.current)};return e(),document.addEventListener("fullscreenchange",e),()=>{document.removeEventListener("fullscreenchange",e)}},[]),t.useEffect(()=>{if(!Be){re(0);return}const e=Ue.current;if(!e)return;const n=()=>{const a=Math.ceil(e.getBoundingClientRect().height);re(a+In)};if(n(),typeof ResizeObserver>"u")return;const l=new ResizeObserver(()=>{n()});return l.observe(e),()=>{l.disconnect()}},[Be]),t.useEffect(()=>{if(T(),!(!pe||!ht))return Q.current=window.setTimeout(()=>{Q.current=null,ve()},2e3),()=>{T()}},[T,ve,pe,ht]);const $t=(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",disableLoadingOverlay:g,hideFullScreen:!0,mode:"blackboard",replaceRootScreenHeightWithFull:n.replaceRootScreenHeightWithFull,type:"sandbox",content:e.content,enableScaling:Rt}):r.jsxRuntimeExports.jsx(vt.default,{className:"content-render-iframe",disableLoadingOverlay:g,hideFullScreen:!0,mode:"blackboard",type:"markdown",content:e.content}):null,Yt=(e=[],n=!1)=>{if(e.length===0)return null;const l=e.filter(o=>o.is_renderable!==!1).length,a=e.reduce((o,u,y)=>u.is_renderable!==!1?y:o,-1);return r.jsxRuntimeExports.jsx("div",{className:"slide-stage__content flex w-full flex-col gap-4",children:e.map((o,u)=>{const y=o.type==="html"&&o.is_renderable===!1;return r.jsxRuntimeExports.jsx("div",{ref:n&&u===a?De:null,"aria-hidden":y||void 0,className:G.cn("w-full shrink-0",l===1&&o.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":o.is_renderable===!1&&"hidden"),children:$t(o,{replaceRootScreenHeightWithFull:l===1&&o.type==="html"&&o.is_renderable!==!1})},o.sequence_number??`${o.type}-${u}`)})})},Xt=t.useCallback(()=>{const e=ce.current;if(e){if(document.fullscreenElement===e){document.exitFullscreen().catch(()=>{});return}e.requestFullscreen?.().catch(()=>{})}},[]),xt=t.useCallback(()=>{const e=Ae.current;e&&e.scrollTo({top:e.scrollHeight,behavior:"smooth"})},[]),Jt=t.useCallback(()=>{ae.current=!0,O.current=null,te(!0),m(!1),x(!0),H(),$e()},[$e,H,x]),Qt=t.useCallback(()=>{ae.current=!0,O.current=null,te(!0),m(!1),x(!0),H(),R()},[R,H,x]),Zt=t.useCallback(e=>{if(g){m(!1);return}if(!h||A){m(!1);return}m(e)},[h,A,g]);t.useEffect(()=>{g&&m(!1)},[g]);const en=t.useCallback(e=>{const n=d[e]?.audioKey;if(!n||!f||n!==f)return;const l=I.findIndex(u=>u===n);if(l<0){L(null);return}const a=l+1,o=I[a];if(o){L(o);return}if(L(null),Je(!0),m(!1),b){const u=c+1,y=_[u];at&&y?.type==="interaction"&&(O.current=u),R()}},[d,b,c,f,I,R,at,_]),tn=t.useCallback(()=>{s&&he(e=>!e)},[s]),bt=t.useCallback(e=>{e.stopPropagation(),w&&x(!0)},[Ye,x]),nn=t.useCallback(e=>{Ve?.(e)},[Ve]),rn=t.useCallback(()=>{te(!0),x(!0)},[x]),Se=t.useMemo(()=>M.map((e,n)=>`${e.sequence_number??`${e.type}-${n}`}:${String(e.is_new??"")}`),[M]);return t.useEffect(()=>{const e=He.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(He.current=Se,!a)return;const o=window.requestAnimationFrame(()=>{const u=Ae.current,y=De.current;if(!u||!y)return;const sn=u.getBoundingClientRect(),on=y.getBoundingClientRect(),ln=u.scrollTop+(on.top-sn.top);u.scrollTo({top:Math.max(ln,0),behavior:"smooth"})});return()=>{window.cancelAnimationFrame(o)}},[M,Se]),t.useEffect(()=>{if(!ae.current||(ae.current=!1,M.length===0))return;const e=window.requestAnimationFrame(()=>{xt()});return()=>{window.cancelAnimationFrame(e)}},[M,xt]),r.jsxRuntimeExports.jsxs("section",{ref:ce,className:G.cn("relative h-full w-full",k&&"slide--mobile-device",rt&&"slide--browser-fullscreen",D&&"slide--mobile-landscape",nt&&"slide--mobile-landscape-native",It),onClick:rn,onPointerDown:nn,...At,children:[Ot?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:Ke,className:G.cn("slide__viewport relative h-full min-h-0 w-full",D&&"slide__viewport--mobile-landscape",D&&!Ft&&"slide__viewport--mobile-landscape-native"),children:[qt?r.jsxRuntimeExports.jsxs("div",{className:"slide-landscape-header",children:[r.jsxRuntimeExports.jsx("button",{"aria-label":S?.backAriaLabel??"Back",className:"slide-landscape-header__back",onClick:Vt,type:"button",children:r.jsxRuntimeExports.jsx(En.default,{className:"slide-landscape-header__icon h-6 w-6",strokeWidth:2.25})}),S?.content?r.jsxRuntimeExports.jsx("div",{className:"min-w-0 flex-1 overflow-hidden",children:S.content}):null]}):null,r.jsxRuntimeExports.jsx("div",{className:G.cn("h-full min-h-0 w-full",Nt&&"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:Kt.map((e,n)=>{const l=n===Dt;return r.jsxRuntimeExports.jsx("div",{"aria-hidden":!l||void 0,className:"w-full h-full",style:{display:l?void 0:"none"},children:Yt(e.elementList,l)},e.sourceStepIndexes[0]??n)})})}):null}),Mt?r.jsxRuntimeExports.jsx(cn.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(fn.default,{extraBottomOffset:Tt,hasPlayerGap:w,isEnabled:Qe&&_t,isPlayerHidden:E&&!w,playbackTimeStore:V,subtitleCues:Ut}),Be?r.jsxRuntimeExports.jsx("div",{ref:Ue,className:G.cn("slide-interaction-overlay",w&&E?"slide-interaction-overlay--with-player":"slide-interaction-overlay--standalone"),onClick:bt,onPointerDown:bt,style:Ht,children:r.jsxRuntimeExports.jsx(yt,{content:String(s?.content??""),defaultButtonText:ft.buttonText??"",defaultInputText:ft.inputText??"",defaultSelectedValues:zt,confirmButtonText:N?.confirmButtonText,copyButtonText:N?.copyButtonText,copiedButtonText:N?.copiedButtonText,onSend:Gt,readonly:pt,title:N?.title??ge??"Submit the content below to continue."})}):null,E?r.jsxRuntimeExports.jsx(dn.default,{audioList:d,className:G.cn("absolute left-1/2 z-[2] -translate-x-1/2",rt?"bottom-3":"-bottom-3",$,!w&&"pointer-events-none opacity-0"),currentAudioIndex:p,defaultPlaying:!0,isPlaybackPaused:P,isAutoAdvanceEnabled:ne,hasInteraction:!!s,isInteractionOpen:pe,isSubtitleEnabled:Qe,onAutoAdvanceToggle:Xe,onLoadingChange:Zt,onPlaybackStarted:()=>{we(!0)},onPlaybackTimeChange:V.setTime,onSubtitleToggle:()=>{kt(e=>!e)},nextDisabled:!b,onEnded:en,onFullscreen:Xt,isFullscreen:Ze,mobileViewMode:K,settingsPortalContainer:Ke.current,onMobileViewModeChange:Lt,onInteractionToggle:tn,onNext:Qt,onPrev:Jt,prevDisabled:!wt,showControls:w,texts:gt,customActionContext:je,customActions:q,useAutoAdvanceToggle:oe}):null]})]})};exports.default=wn;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const r=require("../../_virtual/jsx-runtime.cjs.js"),t=require("react"),fn=require("../../lib/sandboxInteraction.cjs.js"),z=require("../../lib/utils.cjs.js"),mn=require("../ui/loading-overlay-card.cjs.js"),pn=require("../ContentRender/ContentRender.cjs.js"),St=require("../ContentRender/IframeSandbox.cjs.js");require("../ui/inputGroup/input-group.cjs.js");const yt=require("../../lib/interaction-defaults.cjs.js"),Se=require("../../lib/mobileDevice.cjs.js"),hn=require("./Player.cjs.js"),xn=require("./SubtitleOverlay.cjs.js"),bn=require("./useSlide.cjs.js"),vn=require("./useWakePlayerFromIframe.cjs.js"),le=require("./utils/mobileScreenMode.cjs.js"),En=require("./utils/interactionPlayback.cjs.js"),Sn=require("./utils/appendedMarkerAdvance.cjs.js"),yn=require("./utils/playbackSequence.cjs.js"),gt=require("./utils/playerCustomActions.cjs.js"),gn=require("./utils/playbackTimeStore.cjs.js"),An=require("./utils/playerToggleMode.cjs.js");;/* empty css */const Rn=require("../../markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/chevron-left.cjs.js"),In=2e3,wn=300,_n=160,Cn=16,qe="waitingForAudio",At={waitingForAudio:"Waiting for current slide audio...",loadingAudio:"Loading current slide audio...",waitingForMoreAudio:"Waiting for more current slide audio..."},Mn=(h,E)=>typeof h=="string"?h:h[E]??h[qe]??At[E],kn=(h,E)=>E?h!=="loadingAudio":!1,Rt=t.memo(({content:h,title:E,defaultButtonText:S,defaultInputText:$,defaultSelectedValues:y,confirmButtonText:N,copyButtonText:Y,copiedButtonText:ye,onSend:ge,readonly:q=!1})=>r.jsxRuntimeExports.jsxs("div",{className:"slide-player__interaction-card",children:[r.jsxRuntimeExports.jsx("div",{className:"slide-player__interaction-header",children:r.jsxRuntimeExports.jsx("p",{className:"slide-player__interaction-title",children:E})}),r.jsxRuntimeExports.jsx("div",{className:"slide-player__interaction-body",children:r.jsxRuntimeExports.jsx(pn.default,{content:h,defaultButtonText:S,defaultInputText:$,defaultSelectedValues:y,confirmButtonText:N,copyButtonText:Y,copiedButtonText:ye,onSend:ge,readonly:q,enableTypewriter:!1,sandboxMode:"content"})})]}));Rt.displayName="InteractionOverlayCard";const Tn=(h,E)=>h.length===E.length&&h.every((S,$)=>{const y=E[$];return S.sequence_number===y?.sequence_number&&S.type===y?.type&&S.content===y?.content}),Pn=({elementList:h=[],showPlayer:E=!0,playerAlwaysVisible:S=!1,playerClassName:$,fullscreenHeader:y,playerCustomActions:N,playerCustomActionPauseOnActive:Y=!0,bufferingText:ye=At,interactionTitle:ge,interactionTexts:q,playerTexts:It,playerAutoHideDelay:Ae=3e3,markerAutoAdvanceDelay:Oe=In,interactionDefaultValueOptions:ie,onSend:Le,onPlayerVisibilityChange:Re,onMobileViewModeChange:Ve,onStepChange:De,enableIframeScaling:wt=!0,disableLoadingOverlay:R=!1,className:_t,onPointerDown:Ke,...Ct})=>{const ce=t.useRef(null),Ue=t.useRef(null),Ie=t.useRef(null),We=t.useRef(null),X=t.useRef(null),J=t.useRef(null),Q=t.useRef(null),Z=t.useRef(null),Ge=t.useRef(null),He=t.useRef([]),ae=t.useRef(!1),O=t.useRef(null),ze=t.useRef(null),$e=t.useRef({markerCount:0,currentIndex:-1,canGoNext:!1}),{currentElementList:k,stepElementLists:Ye,slideElementList:T,currentIndex:c,audioList:d,currentAudioSequenceIndexes:de,currentStepHasSpeakableElement:x,currentInteractionElement:i,canGoPrev:Mt,canGoNext:v,handlePrev:Xe,handleNext:I}=bn.default(h),ee=t.useMemo(()=>{if(!(c<0))return T[c]},[c,T]),kt=T.filter(e=>e.is_renderable!==!1).length===1,g=E&&(T.length>0||d.length>0||!!i),w=t.useMemo(()=>de.map(e=>d[e]?.audioKey).filter(e=>!!e),[d,de]),[Je,fe]=t.useState(!0),[me,te]=t.useState(!1),[ne,Qe]=t.useState(!0),[f,L]=t.useState(null),[Tt,m]=t.useState(!1),[Pt,we]=t.useState(qe),[_,Ze]=t.useState(!1),[jt,_e]=t.useState(!1),[et,Ft]=t.useState(!0),[Ce,Me]=t.useState(!1),[s,ke]=t.useState(),[pe,he]=t.useState(!1),[Bt,re]=t.useState(0),[tt,Nt]=t.useState(!1),P=t.useMemo(()=>Se.isMobileDevice(),[]),[xe,Te]=t.useState(le.DEFAULT_MOBILE_VIEW_MODE),[nt,Pe]=t.useState(!1),[qt,rt]=t.useState(()=>P?Se.isLandscapeViewport():!1),V=t.useMemo(()=>gn.createPlaybackTimeStore(),[]),{effectiveMobileViewMode:D,isImmersiveMobileFullscreen:K,isNativeMobileFullscreen:st,shouldRotateFullscreenViewport:Ot}=t.useMemo(()=>le.resolveMobileViewModeState({hasManualMobileViewMode:nt,isMobileDevice:P,mobileViewMode:xe}),[nt,P,qt,xe]),Lt=t.useRef(D),C=g&&(S||Je),Vt=K&&C,Dt=K&&C,Kt=K||st,ot=tt&&!P,Ut=t.useCallback(e=>{Pe(!0),Te(e)},[]),ut=t.useCallback(()=>{Pe(!1),Te(le.DEFAULT_MOBILE_VIEW_MODE)},[]),Wt=t.useCallback(()=>{ut(),y?.onBack?.()},[y,ut]),lt=t.useCallback(e=>{Me(e)},[]),it=t.useCallback(()=>{Me(e=>!e)},[]),{mountedStepStates:Gt,currentMountedStateIndex:Ht}=t.useMemo(()=>{const e=[],n=new Map;return Ye.forEach((u,a)=>{const o=e.findIndex(l=>Tn(l.elementList,u));if(o>=0){e[o]?.sourceStepIndexes.push(a),n.set(a,o);return}e.push({elementList:u,sourceStepIndexes:[a]}),n.set(a,e.length-1)}),{mountedStepStates:e,currentMountedStateIndex:c>=0?n.get(c)??-1:-1}},[c,Ye]),ct=t.useMemo(()=>String(c),[c]),p=t.useMemo(()=>f?d.findIndex(e=>(e.audioKey??"")===f):-1,[d,f]),je=t.useMemo(()=>p>=0?d[p]:void 0,[d,p]),zt=je?.element?.subtitle_cues??[],be=t.useMemo(()=>w[0]??"none",[w]),Fe=t.useMemo(()=>({currentElement:gt.resolvePlayerCustomActionElement({currentAudioIndex:p,currentAudioSequenceIndexes:de,audioList:d,currentInteractionElement:s,currentStepElement:ee}),currentIndex:c,currentStepElement:ee,isActive:Ce,setActive:lt,toggleActive:it}),[s,d,p,de,c,ee,Ce,lt,it]),Be=t.useMemo(()=>gt.getPlayerCustomActionCount(N,Fe),[Fe,N]),$t=t.useMemo(()=>({"--slide-player-custom-action-count":String(Be),"--slide-player-mobile-control-count":String(Be+4)}),[Be]),at=w.length>0,dt=t.useMemo(()=>i?`${i.sequence_number??"none"}:${String(i.content??"")}`:"none",[i]),se=t.useMemo(()=>[ct,dt].join("|"),[dt,ct]),Yt=t.useMemo(()=>[se,je?.audioKey??"none",String(p)].join("|"),[p,je?.audioKey,se]),ft=!!t.useMemo(()=>!be||be==="none"?"":d.find(n=>n.audioKey===be)?.audioUrl?.trim()??"",[d,be]),F=Y&&!!N&&Ce,oe=t.useMemo(()=>An.shouldUseAutoAdvanceToggle({canGoNext:v,currentAudioIndex:p,currentStepHasSpeakableElement:x,hasInteraction:!!i}),[v,p,i,x]),B=t.useCallback(()=>{X.current!==null&&(window.clearTimeout(X.current),X.current=null)},[]),j=t.useCallback(()=>{Q.current!==null&&(window.clearTimeout(Q.current),Q.current=null)},[]),M=t.useCallback(()=>{Z.current!==null&&(window.clearTimeout(Z.current),Z.current=null)},[]),U=t.useCallback(()=>{J.current!==null&&(window.clearTimeout(J.current),J.current=null)},[]),W=t.useCallback(()=>{U(),j(),M(),L(null),V.reset(),m(!1),we(qe),Ze(!1),_e(!1),ke(void 0),he(!1),re(0)},[U,j,M,V]),G=t.useCallback(()=>{const e=w[0];return e?(L(e),!0):!1},[w]),ve=t.useCallback(()=>{j(),M(),he(!1),re(0),!G()&&v&&I()},[v,j,M,I,G]),mt=t.useCallback(e=>{if(M(),!e)return;const n=()=>{Z.current=null,re(_n),he(!0),O.current=null};Z.current=window.setTimeout(n,wn)},[M]),b=t.useCallback((e=me)=>{g&&(fe(!0),B(),!(S||!e||Ae<=0)&&(X.current=window.setTimeout(()=>{fe(!1),X.current=null},Ae)))},[B,me,S,Ae,g]),ue=!!(i?.readonly||i?.user_input?.trim()),H=!!i&&!ue;t.useEffect(()=>{Qe(!0),Y&&Me(!1)},[c,Y]),t.useEffect(()=>()=>{U(),B(),j(),M()},[U,j,M,B]),t.useEffect(()=>(Re?.(C),()=>{Re?.(!1)}),[Re,C]),t.useEffect(()=>{P||xe===le.DEFAULT_MOBILE_VIEW_MODE||(Pe(!1),Te(le.DEFAULT_MOBILE_VIEW_MODE))},[P,xe]),t.useEffect(()=>{if(!P){rt(!1);return}const e=()=>{rt(Se.isLandscapeViewport())};return e(),Se.subscribeMobileDeviceChange(e)},[P]),t.useEffect(()=>{Ve?.(D)},[D,Ve]),t.useEffect(()=>{Lt.current=D},[D]),t.useEffect(()=>{De?.(ee,c)},[c,ee,De]),t.useEffect(()=>{const e=$e.current,n=Sn.shouldAutoAdvanceIntoAppendedMarker({previousMarkerCount:e.markerCount,nextMarkerCount:T.length,previousIndex:e.currentIndex,previousCanGoNext:e.canGoNext,nextCanGoNext:v,currentAudioKey:f,hasCompletedCurrentStepAudio:_,hasResolvedCurrentInteraction:ue,currentStepHasSpeakableElement:x,currentInteractionElement:i,isAutoAdvanceEnabled:ne,shouldUseSilentStepAutoAdvanceToggle:oe});$e.current={markerCount:T.length,currentIndex:c,canGoNext:v},n&&I()},[v,f,c,i,x,I,_,ue,ne,oe,T.length]),t.useEffect(()=>{if(!g){B(),fe(!1);return}if(S){B(),fe(!0);return}me||b(!0)},[B,me,S,g,b]),t.useEffect(()=>{if(typeof window>"u")return;const e=n=>{n.origin===window.location.origin&&fn.isSandboxInteractionMessage(n.data)&&n.data.eventType==="click"&&g&&(te(!0),b(!0))};return window.addEventListener("message",e),()=>{window.removeEventListener("message",e)}},[g,b]),vn.default({sectionRef:ce,enabled:g,onWake:()=>{te(!0),b(!0)}}),t.useEffect(()=>{const{hasPlaybackContextChanged:e,shouldInitializeAudioSequence:n}=yn.getPlaybackSequenceTransition({previousResetKey:ze.current,nextResetKey:se,currentAudioKey:f,hasCompletedCurrentStepAudio:_});ze.current=se;const u=O.current===c&&!!i,a=En.shouldPresentInteractionOverlay({hasInteraction:!!i,shouldBlockPlaybackForInteraction:H,shouldOpenInteractionOverlayAfterAudio:u,hasPlaybackContextChanged:e,hasResolvedCurrentInteraction:ue,currentStepHasSpeakableElement:x});if(e&&W(),!(k.length===0&&!i)&&!F){if(i&&ke(i),a){mt(i);return}if(M(),O.current=null,!!n&&!G()){if(x){if(R){m(!1);return}m(!0);return}if(v&&!(oe&&!ne))return J.current=window.setTimeout(()=>{J.current=null,I()},Oe),()=>{U()}}}},[v,U,k.length,i,f,se,x,Oe,I,_,R,ne,ue,H,M,W,mt,G,F,oe]),t.useEffect(()=>{if(R||F||!x||H){m(!1);return}if(_){m(!1);return}if(at){m(!1);return}we("waitingForAudio"),m(!0)},[at,x,_,R,F,H]),t.useEffect(()=>{f||w.length===0||F||!x||H||_||G()},[f,w,x,_,F,H,G]),t.useEffect(()=>{!f||p>=0||L(null)},[p,f]),t.useEffect(()=>{p>=0||V.reset()},[p,V]),t.useEffect(()=>{_e(!1)},[Yt]);const pt=t.useMemo(()=>{if(!s)return{};const e=!!s.user_input?.trim();return yt.getInteractionDefaultValues(typeof s.content=="string"?s.content:void 0,s.user_input,e?void 0:ie)},[s,ie]),Xt=t.useMemo(()=>{if(!s)return;const e=!!s.user_input?.trim();return yt.getInteractionDefaultSelectedValues(typeof s.content=="string"?s.content:void 0,s.user_input,e?void 0:ie)},[s,ie]),ht=!!s?.user_input?.trim(),xt=!!s?.readonly||ht,bt=xt||ht,Ne=!!s&&pe,Jt=t.useCallback(e=>{const u=[...e.selectedValues??[],e.inputText?.trim()??"",e.buttonText?.trim()??""].filter(Boolean).join(", ");ke(a=>!a||!u?a:{...a,user_input:u}),Le?.(e,s),ve()},[s,ve,Le]);t.useEffect(()=>{const e=()=>{Nt(document.fullscreenElement===ce.current)};return e(),document.addEventListener("fullscreenchange",e),()=>{document.removeEventListener("fullscreenchange",e)}},[]),t.useEffect(()=>{if(!Ne){re(0);return}const e=Ge.current;if(!e)return;const n=()=>{const a=Math.ceil(e.getBoundingClientRect().height);re(a+Cn)};if(n(),typeof ResizeObserver>"u")return;const u=new ResizeObserver(()=>{n()});return u.observe(e),()=>{u.disconnect()}},[Ne]),t.useEffect(()=>{if(j(),!(!pe||!bt))return Q.current=window.setTimeout(()=>{Q.current=null,ve()},2e3),()=>{j()}},[j,ve,pe,bt]);const Qt=(e,n={})=>e?e.type==="slot"?r.jsxRuntimeExports.jsx(r.jsxRuntimeExports.Fragment,{children:e.content}):e.type==="html"?r.jsxRuntimeExports.jsx(St.default,{className:"content-render-iframe",disableLoadingOverlay:R,hideFullScreen:!0,mode:"blackboard",replaceRootScreenHeightWithFull:n.replaceRootScreenHeightWithFull,type:"sandbox",content:e.content,enableScaling:wt}):r.jsxRuntimeExports.jsx(St.default,{className:"content-render-iframe",disableLoadingOverlay:R,hideFullScreen:!0,mode:"blackboard",type:"markdown",content:e.content}):null,Zt=(e=[],n=!1)=>{if(e.length===0)return null;const u=e.filter(o=>o.is_renderable!==!1).length,a=e.reduce((o,l,A)=>l.is_renderable!==!1?A:o,-1);return r.jsxRuntimeExports.jsx("div",{className:"slide-stage__content flex w-full flex-col gap-4",children:e.map((o,l)=>{const A=o.type==="html"&&o.is_renderable===!1;return r.jsxRuntimeExports.jsx("div",{ref:n&&l===a?We:null,"aria-hidden":A||void 0,className:z.cn("w-full shrink-0",u===1&&o.is_renderable!==!1&&"slide-element--single",A?"pointer-events-none fixed left-[-200vw] top-0 -z-10 h-[100dvh] w-[100vw] overflow-hidden opacity-0":o.is_renderable===!1&&"hidden"),children:Qt(o,{replaceRootScreenHeightWithFull:u===1&&o.type==="html"&&o.is_renderable!==!1})},o.sequence_number??`${o.type}-${l}`)})})},en=t.useCallback(()=>{const e=ce.current;if(e){if(document.fullscreenElement===e){document.exitFullscreen().catch(()=>{});return}e.requestFullscreen?.().catch(()=>{})}},[]),vt=t.useCallback(()=>{const e=Ie.current;e&&e.scrollTo({top:e.scrollHeight,behavior:"smooth"})},[]),tn=t.useCallback(()=>{ae.current=!0,O.current=null,te(!0),m(!1),b(!0),W(),Xe()},[Xe,W,b]),nn=t.useCallback(()=>{ae.current=!0,O.current=null,te(!0),m(!1),b(!0),W(),I()},[I,W,b]),rn=t.useCallback(({loading:e,reason:n})=>{if(R){m(!1);return}if(!x||_){m(!1);return}e&&n&&we(n),m(kn(n,e))},[x,_,R]);t.useEffect(()=>{R&&m(!1)},[R]);const sn=t.useCallback(e=>{const n=d[e]?.audioKey;if(!n||!f||n!==f)return;const u=w.findIndex(l=>l===n);if(u<0){L(null);return}const a=u+1,o=w[a];if(o){L(o);return}if(L(null),Ze(!0),m(!1),v){const l=c+1,A=T[l];ft&&A?.type==="interaction"&&(O.current=l),I();return}},[d,v,c,f,w,I,ft,T]),on=t.useCallback(()=>{s&&he(e=>!e)},[s]),Et=t.useCallback(e=>{e.stopPropagation(),C&&b(!0)},[Je,b]),un=t.useCallback(e=>{Ke?.(e)},[Ke]),ln=t.useCallback(()=>{te(!0),b(!0)},[b]),Ee=t.useMemo(()=>k.map((e,n)=>`${e.sequence_number??`${e.type}-${n}`}:${String(e.is_new??"")}`),[k]);return t.useEffect(()=>{const e=He.current,a=(e.length>0&&e.length<Ee.length&&e.every((l,A)=>l===Ee[A])?k.slice(e.length):[]).some(l=>l.is_new===!1);if(He.current=Ee,!a)return;const o=window.requestAnimationFrame(()=>{const l=Ie.current,A=We.current;if(!l||!A)return;const cn=l.getBoundingClientRect(),an=A.getBoundingClientRect(),dn=l.scrollTop+(an.top-cn.top);l.scrollTo({top:Math.max(dn,0),behavior:"smooth"})});return()=>{window.cancelAnimationFrame(o)}},[k,Ee]),t.useEffect(()=>{if(!ae.current||(ae.current=!1,k.length===0))return;const e=window.requestAnimationFrame(()=>{vt()});return()=>{window.cancelAnimationFrame(e)}},[k,vt]),r.jsxRuntimeExports.jsxs("section",{ref:ce,className:z.cn("relative h-full w-full",P&&"slide--mobile-device",ot&&"slide--browser-fullscreen",K&&"slide--mobile-landscape",st&&"slide--mobile-landscape-native",_t),onClick:ln,onPointerDown:un,...Ct,children:[Kt?r.jsxRuntimeExports.jsx("div",{"aria-hidden":"true",className:"pointer-events-none fixed left-0 top-0 z-[9999] h-[100vh] max-h-[100vh] w-[100vw]"}):null,r.jsxRuntimeExports.jsxs("div",{ref:Ue,className:z.cn("slide__viewport relative h-full min-h-0 w-full",K&&"slide__viewport--mobile-landscape",K&&!Ot&&"slide__viewport--mobile-landscape-native"),children:[Vt?r.jsxRuntimeExports.jsxs("div",{className:"slide-landscape-header",children:[r.jsxRuntimeExports.jsx("button",{"aria-label":y?.backAriaLabel??"Back",className:"slide-landscape-header__back",onClick:Wt,type:"button",children:r.jsxRuntimeExports.jsx(Rn.default,{className:"slide-landscape-header__icon h-6 w-6",strokeWidth:2.25})}),y?.content?r.jsxRuntimeExports.jsx("div",{className:"min-w-0 flex-1 overflow-hidden",children:y.content}):null]}):null,r.jsxRuntimeExports.jsx("div",{className:z.cn("h-full min-h-0 w-full",Dt&&"slide__viewport-content--with-header",kt?"slide-content--single":"grid gap-4"),children:k.length>0?r.jsxRuntimeExports.jsx("div",{className:"slide-stage",children:r.jsxRuntimeExports.jsx("div",{ref:Ie,className:"slide-stage__layer w-full",children:Gt.map((e,n)=>{const u=n===Ht;return r.jsxRuntimeExports.jsx("div",{"aria-hidden":!u||void 0,className:"w-full h-full",style:{display:u?void 0:"none"},children:Zt(e.elementList,u)},e.sourceStepIndexes[0]??n)})})}):null}),Tt?r.jsxRuntimeExports.jsx(mn.default,{message:Mn(ye,Pt),className:"absolute left-1/2 top-1/2 z-[3] -translate-x-1/2 -translate-y-1/2"}):null,r.jsxRuntimeExports.jsx(xn.default,{extraBottomOffset:Bt,hasPlayerGap:C,isEnabled:et&&jt,isPlayerHidden:g&&!C,playbackTimeStore:V,subtitleCues:zt}),Ne?r.jsxRuntimeExports.jsx("div",{ref:Ge,className:z.cn("slide-interaction-overlay",C&&g?"slide-interaction-overlay--with-player":"slide-interaction-overlay--standalone"),onClick:Et,onPointerDown:Et,style:$t,children:r.jsxRuntimeExports.jsx(Rt,{content:String(s?.content??""),defaultButtonText:pt.buttonText??"",defaultInputText:pt.inputText??"",defaultSelectedValues:Xt,confirmButtonText:q?.confirmButtonText,copyButtonText:q?.copyButtonText,copiedButtonText:q?.copiedButtonText,onSend:Jt,readonly:xt,title:q?.title??ge??"Submit the content below to continue."})}):null,g?r.jsxRuntimeExports.jsx(hn.default,{audioList:d,className:z.cn("absolute left-1/2 z-[2] -translate-x-1/2",ot?"bottom-3":"-bottom-3",$,!C&&"pointer-events-none opacity-0"),currentAudioIndex:p,defaultPlaying:!0,isPlaybackPaused:F,isAutoAdvanceEnabled:ne,hasInteraction:!!s,isInteractionOpen:pe,isSubtitleEnabled:et,onAutoAdvanceToggle:Qe,onLoadingChange:rn,onPlaybackStarted:()=>{_e(!0)},onPlaybackTimeChange:V.setTime,onSubtitleToggle:()=>{Ft(e=>!e)},nextDisabled:!v,onEnded:sn,onFullscreen:en,isFullscreen:tt,mobileViewMode:D,settingsPortalContainer:Ue.current,onMobileViewModeChange:Ut,onInteractionToggle:on,onNext:nn,onPrev:tn,prevDisabled:!Mt,showControls:C,texts:It,customActionContext:Fe,customActions:N,useAutoAdvanceToggle:oe}):null]})]})};exports.default=Pn;
2
2
  //# sourceMappingURL=Slide.cjs.js.map