markdown-flow-ui 0.1.100-beta.21 → 0.1.100-beta.23
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.
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/@braintree_sanitize-url@7.1.1/node_modules/@braintree/sanitize-url/dist/index.es.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/index.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/classnames@2.5.1/node_modules/classnames/index.es.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/c4Diagram-YG6GDRKO.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/c4Diagram-YG6GDRKO.es.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-S3R3BYOJ.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-S3R3BYOJ.es.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-TZMSLE5B.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/chunk-TZMSLE5B.es.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/ganttDiagram-LVOFAZNH.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/ganttDiagram-LVOFAZNH.es.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/sequenceDiagram-WL72ISMW.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/mermaid@11.12.1/node_modules/mermaid/dist/chunks/mermaid.core/sequenceDiagram-WL72ISMW.es.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-util@5.44.4_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-util/es/ref.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-util@5.44.4_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-util/es/ref.es.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/style-to-object@1.0.11/node_modules/style-to-object/cjs/index.cjs.js +1 -1
- package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/style-to-object@1.0.11/node_modules/style-to-object/cjs/index.es.js +1 -1
- package/dist/_virtual/index.cjs10.js +1 -1
- package/dist/_virtual/index.cjs11.js +1 -1
- package/dist/_virtual/index.cjs7.js +1 -1
- package/dist/_virtual/index.cjs8.js +1 -1
- package/dist/_virtual/index.cjs9.js +1 -1
- package/dist/_virtual/index.es10.js +2 -3
- package/dist/_virtual/index.es10.js.map +1 -1
- package/dist/_virtual/index.es11.js +3 -2
- package/dist/_virtual/index.es11.js.map +1 -1
- package/dist/_virtual/index.es7.js +2 -2
- package/dist/_virtual/index.es8.js +3 -2
- package/dist/_virtual/index.es8.js.map +1 -1
- package/dist/_virtual/index.es9.js +2 -3
- package/dist/_virtual/index.es9.js.map +1 -1
- package/dist/components/Slide/Player.cjs.js +1 -1
- package/dist/components/Slide/Player.cjs.js.map +1 -1
- package/dist/components/Slide/Player.es.js +86 -86
- package/dist/components/Slide/Player.es.js.map +1 -1
- package/dist/components/Slide/Slide.cjs.js +1 -1
- package/dist/components/Slide/Slide.cjs.js.map +1 -1
- package/dist/components/Slide/Slide.es.js +39 -39
- package/dist/components/Slide/Slide.es.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Player.es.js","sources":["../../../src/components/Slide/Player.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n EllipsisVertical,\n FilePenLine,\n Maximize,\n RotateCcw,\n RotateCw,\n Volume2,\n} from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\nimport type { SlideAudioItem } from \"./useSlide\";\nimport \"./player.css\";\n\nconst audioPreloadLinkCache = new Set<string>();\n\nconst preloadAudioUrl = (url?: string) => {\n if (\n typeof document === \"undefined\" ||\n !url ||\n audioPreloadLinkCache.has(url)\n ) {\n return;\n }\n\n const link = document.createElement(\"link\");\n link.rel = \"preload\";\n link.as = \"audio\";\n link.href = url;\n if (/^https?:/i.test(url)) {\n link.crossOrigin = \"anonymous\";\n }\n document.head.appendChild(link);\n audioPreloadLinkCache.add(url);\n};\n\nexport type PlayerProps = React.ComponentProps<\"div\"> & {\n audioList?: SlideAudioItem[];\n currentAudioIndex?: number;\n defaultPlaying?: boolean;\n onLoadingChange?: (loading: boolean) => void;\n onPrev?: () => void;\n onNext?: () => void;\n onFullscreen?: () => void;\n onEnded?: (audioIndex: number) => void;\n onPlayRequest?: () => void;\n onInteractionToggle?: () => void;\n hasInteraction?: boolean;\n isInteractionOpen?: boolean;\n prevDisabled?: boolean;\n nextDisabled?: boolean;\n showControls?: boolean;\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: React.FC<PlayerProps> = ({\n audioList = [],\n className,\n currentAudioIndex = -1,\n defaultPlaying = true,\n onLoadingChange,\n onPrev,\n onNext,\n onFullscreen,\n onEnded,\n onPlayRequest,\n onInteractionToggle,\n hasInteraction = false,\n isInteractionOpen = false,\n prevDisabled = false,\n nextDisabled = false,\n showControls = true,\n ...props\n}) => {\n const audioRef = useRef<HTMLAudioElement | null>(null);\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 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 [isPlaying, setIsPlaying] = useState(defaultPlaying);\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 currentAudioKey = `${currentAudioIndex}:${currentAudio?.audioKey ?? \"none\"}`;\n\n useEffect(() => {\n currentAudioRef.current = currentAudio;\n }, [currentAudio]);\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 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 resetAudio = useCallback(() => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return;\n }\n\n pendingAutoPlayRef.current = false;\n isPausedByUserRef.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 setIsPlaying(false);\n updateLoading(false);\n }, [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 pendingAutoPlayRef.current = false;\n isSwitchingSegmentRef.current = false;\n })\n .catch((_error: unknown) => {\n setIsPlaying(false);\n });\n }\n\n return true;\n },\n [currentAudioIndex]\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 const shouldAutoResume = defaultPlaying && !isPausedByUserRef.current;\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 if (hasNewSrc) {\n return true;\n }\n\n return tryPlayCurrentAudio(`start-segment:${_reason}`);\n },\n [defaultPlaying, getSegmentSrc, tryPlayCurrentAudio, updateLoading]\n );\n\n const finishAudioItem = useCallback(\n (_reason?: string) => {\n pendingAutoPlayRef.current = false;\n isWaitingForSegmentRef.current = false;\n isSwitchingSegmentRef.current = false;\n setIsPlaying(false);\n updateLoading(false);\n\n if (currentAudioIndex >= 0) {\n onEnded?.(currentAudioIndex);\n }\n },\n [currentAudioIndex, onEnded, updateLoading]\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 setIsPlaying(false);\n updateLoading(true);\n\n return;\n }\n\n finishAudioItem(\"segments-completed\");\n }, [defaultPlaying, finishAudioItem, startSegmentPlayback, updateLoading]);\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 pendingAutoPlayRef.current = false;\n isSwitchingSegmentRef.current = false;\n activeSourceTypeRef.current = null;\n audioSrcRef.current = null;\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 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 (currentAudioUrl) {\n const hasNewSrc = audioSrcRef.current !== currentAudioUrl;\n const shouldAutoResume = defaultPlaying && !isPausedByUserRef.current;\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\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 if (!hasNewSrc) {\n tryPlayCurrentAudio(\"sync-url\");\n }\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 = defaultPlaying && !isPausedByUserRef.current;\n setIsPlaying(false);\n updateLoading(!isPausedByUserRef.current);\n return;\n }\n\n if (!currentAudioSegments.length) {\n if (currentAudio.isAudioStreaming) {\n waitingSegmentIndexRef.current = currentSegmentIndexRef.current;\n isWaitingForSegmentRef.current = true;\n pendingAutoPlayRef.current =\n defaultPlaying && !isPausedByUserRef.current;\n setIsPlaying(false);\n updateLoading(!isPausedByUserRef.current);\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 resetAudio,\n startSegmentPlayback,\n tryPlayCurrentAudio,\n getWaitingSegmentSeekTime,\n updateLoading,\n ]);\n\n useEffect(() => resetAudio, [resetAudio]);\n\n const handleAudioPlay = useCallback(() => {\n setIsPlaying(true);\n updateLoading(false);\n }, [updateLoading]);\n\n const handleAudioPause = useCallback(() => {\n if (isWaitingForSegmentRef.current || isSwitchingSegmentRef.current) {\n return;\n }\n\n setIsPlaying(false);\n }, [currentAudioIndex]);\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 if (!pendingAutoPlayRef.current || !defaultPlaying) {\n return;\n }\n\n tryPlayCurrentAudio(\"canplay\");\n }, [currentAudioIndex, defaultPlaying, tryPlayCurrentAudio]);\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 }, [currentAudioIndex]);\n\n const handleAudioEnded = useCallback(() => {\n const shouldFinishAsUrl =\n activeSourceTypeRef.current === \"url\" ||\n currentAudioSegmentsRef.current.length === 0;\n\n isSwitchingSegmentRef.current = false;\n\n if (shouldFinishAsUrl) {\n finishAudioItem(\"url-ended\");\n return;\n }\n\n handleSegmentEnded();\n }, [finishAudioItem, handleSegmentEnded]);\n\n const handleAudioError = useCallback(() => {\n setIsPlaying(false);\n updateLoading(false);\n }, [updateLoading]);\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 onEnded={handleAudioEnded}\n onError={handleAudioError}\n />\n\n {showControls ? (\n <div className=\"slide-player__controls\">\n <div className=\"slide-player__group\">\n <button aria-label=\"More options\" className=\"hidden\" type=\"button\">\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=\"Rewind\"\n className=\"slide-player__action\"\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={isPlaying ? \"Pause\" : \"Play\"}\n className=\"slide-player__toggle\"\n onClick={() => {\n const audioElement = audioRef.current;\n\n if (!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 onPlayRequest?.();\n isPausedByUserRef.current = false;\n pendingAutoPlayRef.current = true;\n updateLoading(true);\n return;\n }\n\n if (!audioElement.src && currentAudioSegments.length > 0) {\n // Only the player play button can unlock playback when autoplay is unavailable.\n onPlayRequest?.();\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 onPlayRequest?.();\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 {isPlaying ? <PauseIcon /> : <PlayIcon />}\n </button>\n <button\n aria-label=\"Forward\"\n className=\"slide-player__action\"\n disabled={nextDisabled}\n onClick={onNext}\n type=\"button\"\n >\n <RotateCw className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n <button\n aria-label=\"Fullscreen\"\n className=\"hidden\"\n onClick={onFullscreen}\n type=\"button\"\n >\n <Maximize className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n </div>\n\n <div className=\"slide-player__separator\" />\n\n <div className=\"slide-player__group\">\n <button\n aria-label=\"Notes\"\n className={cn(\n \"slide-player__action\",\n isInteractionOpen && \"slide-player__action--active\"\n )}\n disabled={!hasInteraction}\n onClick={onInteractionToggle}\n type=\"button\"\n >\n <FilePenLine className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n </div>\n </div>\n ) : null}\n </div>\n );\n};\n\nexport default Player;\n"],"names":["audioPreloadLinkCache","preloadAudioUrl","url","link","PauseIcon","jsxs","jsx","PlayIcon","Player","audioList","className","currentAudioIndex","defaultPlaying","onLoadingChange","onPrev","onNext","onFullscreen","onEnded","onPlayRequest","onInteractionToggle","hasInteraction","isInteractionOpen","prevDisabled","nextDisabled","showControls","props","audioRef","useRef","audioSrcRef","currentAudioKeyRef","currentSegmentIndexRef","waitingSegmentIndexRef","currentAudioRef","currentAudioSegmentsRef","isLoadingRef","isPausedByUserRef","activeSourceTypeRef","isWaitingForSegmentRef","pendingAutoPlayRef","pendingSeekTimeRef","isSwitchingSegmentRef","isPlaying","setIsPlaying","useState","currentAudio","currentAudioUrl","currentAudioSegments","useMemo","prevSegment","nextSegment","currentAudioKey","useEffect","currentUrl","nextUrl","updateLoading","useCallback","loading","getSegmentSrc","audioData","getWaitingSegmentSeekTime","waitingSegmentIndex","totalDurationMs","segment","resetAudio","audioElement","tryPlayCurrentAudio","_reason","playPromise","_error","startSegmentPlayback","segmentIndex","nextAudioSrc","shouldAutoResume","hasNewSrc","finishAudioItem","handleSegmentEnded","nextSegmentIndex","segments","activeAudio","hasFinal","nextSeekTime","handleAudioPlay","handleAudioPause","handleAudioCanPlay","handleLoadedMetadata","handleAudioEnded","shouldFinishAsUrl","handleAudioError","cn","EllipsisVertical","Volume2","RotateCcw","RotateCw","Maximize","FilePenLine"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Player.es.js","sources":["../../../src/components/Slide/Player.tsx"],"sourcesContent":["import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n EllipsisVertical,\n FilePenLine,\n Maximize,\n RotateCcw,\n RotateCw,\n Volume2,\n} from \"lucide-react\";\n\nimport { cn } from \"../../lib/utils\";\nimport type { SlideAudioItem } from \"./useSlide\";\nimport \"./player.css\";\n\nconst audioPreloadElementCache = new Map<string, HTMLAudioElement>();\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 = React.ComponentProps<\"div\"> & {\n audioList?: SlideAudioItem[];\n currentAudioIndex?: number;\n defaultPlaying?: boolean;\n onLoadingChange?: (loading: boolean) => void;\n onPrev?: () => void;\n onNext?: () => void;\n onFullscreen?: () => void;\n onEnded?: (audioIndex: number) => void;\n onPlayRequest?: () => void;\n onInteractionToggle?: () => void;\n hasInteraction?: boolean;\n isInteractionOpen?: boolean;\n prevDisabled?: boolean;\n nextDisabled?: boolean;\n showControls?: boolean;\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: React.FC<PlayerProps> = ({\n audioList = [],\n className,\n currentAudioIndex = -1,\n defaultPlaying = true,\n onLoadingChange,\n onPrev,\n onNext,\n onFullscreen,\n onEnded,\n onPlayRequest,\n onInteractionToggle,\n hasInteraction = false,\n isInteractionOpen = false,\n prevDisabled = false,\n nextDisabled = false,\n showControls = true,\n ...props\n}) => {\n const audioRef = useRef<HTMLAudioElement | null>(null);\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 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 [isPlaying, setIsPlaying] = useState(defaultPlaying);\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 currentAudioKey = `${currentAudioIndex}:${currentAudio?.audioKey ?? \"none\"}`;\n\n useEffect(() => {\n currentAudioRef.current = currentAudio;\n }, [currentAudio]);\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 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 resetAudio = useCallback(() => {\n const audioElement = audioRef.current;\n\n if (!audioElement) {\n return;\n }\n\n pendingAutoPlayRef.current = false;\n isPausedByUserRef.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 setIsPlaying(false);\n updateLoading(false);\n }, [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 pendingAutoPlayRef.current = false;\n isSwitchingSegmentRef.current = false;\n })\n .catch((_error: unknown) => {\n setIsPlaying(false);\n });\n }\n\n return true;\n },\n [currentAudioIndex]\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 const shouldAutoResume = defaultPlaying && !isPausedByUserRef.current;\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 if (hasNewSrc) {\n return true;\n }\n\n return tryPlayCurrentAudio(`start-segment:${_reason}`);\n },\n [defaultPlaying, getSegmentSrc, tryPlayCurrentAudio, updateLoading]\n );\n\n const finishAudioItem = useCallback(\n (_reason?: string) => {\n pendingAutoPlayRef.current = false;\n isWaitingForSegmentRef.current = false;\n isSwitchingSegmentRef.current = false;\n setIsPlaying(false);\n updateLoading(false);\n\n if (currentAudioIndex >= 0) {\n onEnded?.(currentAudioIndex);\n }\n },\n [currentAudioIndex, onEnded, updateLoading]\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 setIsPlaying(false);\n updateLoading(true);\n\n return;\n }\n\n finishAudioItem(\"segments-completed\");\n }, [defaultPlaying, finishAudioItem, startSegmentPlayback, updateLoading]);\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 pendingAutoPlayRef.current = false;\n isSwitchingSegmentRef.current = false;\n activeSourceTypeRef.current = null;\n audioSrcRef.current = null;\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 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 (currentAudioUrl) {\n const hasNewSrc = audioSrcRef.current !== currentAudioUrl;\n const shouldAutoResume = defaultPlaying && !isPausedByUserRef.current;\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\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 if (!hasNewSrc) {\n tryPlayCurrentAudio(\"sync-url\");\n }\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 = defaultPlaying && !isPausedByUserRef.current;\n setIsPlaying(false);\n updateLoading(!isPausedByUserRef.current);\n return;\n }\n\n if (!currentAudioSegments.length) {\n if (currentAudio.isAudioStreaming) {\n waitingSegmentIndexRef.current = currentSegmentIndexRef.current;\n isWaitingForSegmentRef.current = true;\n pendingAutoPlayRef.current =\n defaultPlaying && !isPausedByUserRef.current;\n setIsPlaying(false);\n updateLoading(!isPausedByUserRef.current);\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 resetAudio,\n startSegmentPlayback,\n tryPlayCurrentAudio,\n getWaitingSegmentSeekTime,\n updateLoading,\n ]);\n\n useEffect(() => resetAudio, [resetAudio]);\n\n const handleAudioPlay = useCallback(() => {\n setIsPlaying(true);\n updateLoading(false);\n }, [updateLoading]);\n\n const handleAudioPause = useCallback(() => {\n if (isWaitingForSegmentRef.current || isSwitchingSegmentRef.current) {\n return;\n }\n\n setIsPlaying(false);\n }, [currentAudioIndex]);\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 if (!pendingAutoPlayRef.current || !defaultPlaying) {\n return;\n }\n\n tryPlayCurrentAudio(\"canplay\");\n }, [currentAudioIndex, defaultPlaying, tryPlayCurrentAudio]);\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 }, [currentAudioIndex]);\n\n const handleAudioEnded = useCallback(() => {\n const shouldFinishAsUrl =\n activeSourceTypeRef.current === \"url\" ||\n currentAudioSegmentsRef.current.length === 0;\n\n isSwitchingSegmentRef.current = false;\n\n if (shouldFinishAsUrl) {\n finishAudioItem(\"url-ended\");\n return;\n }\n\n handleSegmentEnded();\n }, [finishAudioItem, handleSegmentEnded]);\n\n const handleAudioError = useCallback(() => {\n setIsPlaying(false);\n updateLoading(false);\n }, [updateLoading]);\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 onEnded={handleAudioEnded}\n onError={handleAudioError}\n />\n\n {showControls ? (\n <div className=\"slide-player__controls\">\n <div className=\"slide-player__group\">\n <button aria-label=\"More options\" className=\"hidden\" type=\"button\">\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=\"Rewind\"\n className=\"slide-player__action\"\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={isPlaying ? \"Pause\" : \"Play\"}\n className=\"slide-player__toggle\"\n onClick={() => {\n const audioElement = audioRef.current;\n\n if (!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 onPlayRequest?.();\n isPausedByUserRef.current = false;\n pendingAutoPlayRef.current = true;\n updateLoading(true);\n return;\n }\n\n if (!audioElement.src && currentAudioSegments.length > 0) {\n // Only the player play button can unlock playback when autoplay is unavailable.\n onPlayRequest?.();\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 onPlayRequest?.();\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 {isPlaying ? <PauseIcon /> : <PlayIcon />}\n </button>\n <button\n aria-label=\"Forward\"\n className=\"slide-player__action\"\n disabled={nextDisabled}\n onClick={onNext}\n type=\"button\"\n >\n <RotateCw className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n <button\n aria-label=\"Fullscreen\"\n className=\"hidden\"\n onClick={onFullscreen}\n type=\"button\"\n >\n <Maximize className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n </div>\n\n <div className=\"slide-player__separator\" />\n\n <div className=\"slide-player__group\">\n <button\n aria-label=\"Notes\"\n className={cn(\n \"slide-player__action\",\n isInteractionOpen && \"slide-player__action--active\"\n )}\n disabled={!hasInteraction}\n onClick={onInteractionToggle}\n type=\"button\"\n >\n <FilePenLine className=\"slide-player__icon\" strokeWidth={2.25} />\n </button>\n </div>\n </div>\n ) : null}\n </div>\n );\n};\n\nexport default Player;\n"],"names":["audioPreloadElementCache","preloadAudioUrl","url","audio","PauseIcon","jsxs","jsx","PlayIcon","Player","audioList","className","currentAudioIndex","defaultPlaying","onLoadingChange","onPrev","onNext","onFullscreen","onEnded","onPlayRequest","onInteractionToggle","hasInteraction","isInteractionOpen","prevDisabled","nextDisabled","showControls","props","audioRef","useRef","audioSrcRef","currentAudioKeyRef","currentSegmentIndexRef","waitingSegmentIndexRef","currentAudioRef","currentAudioSegmentsRef","isLoadingRef","isPausedByUserRef","activeSourceTypeRef","isWaitingForSegmentRef","pendingAutoPlayRef","pendingSeekTimeRef","isSwitchingSegmentRef","isPlaying","setIsPlaying","useState","currentAudio","currentAudioUrl","currentAudioSegments","useMemo","prevSegment","nextSegment","currentAudioKey","useEffect","currentUrl","nextUrl","updateLoading","useCallback","loading","getSegmentSrc","audioData","getWaitingSegmentSeekTime","waitingSegmentIndex","totalDurationMs","segment","resetAudio","audioElement","tryPlayCurrentAudio","_reason","playPromise","_error","startSegmentPlayback","segmentIndex","nextAudioSrc","shouldAutoResume","hasNewSrc","finishAudioItem","handleSegmentEnded","nextSegmentIndex","segments","activeAudio","hasFinal","nextSeekTime","handleAudioPlay","handleAudioPause","handleAudioCanPlay","handleLoadedMetadata","handleAudioEnded","shouldFinishAsUrl","handleAudioError","cn","EllipsisVertical","Volume2","RotateCcw","RotateCw","Maximize","FilePenLine"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const n=require("../../_virtual/jsx-runtime.cjs.js"),t=require("react"),tt=require("../../lib/browserUserActivation.cjs.js"),nt=require("../../lib/sandboxInteraction.cjs.js"),L=require("../../lib/utils.cjs.js"),rt=require("../ContentRender/ContentRender.cjs.js"),je=require("../ContentRender/IframeSandbox.cjs.js");require("../ui/inputGroup/input-group.cjs.js");const we=require("../../lib/interaction-defaults.cjs.js"),st=require("./Player.cjs.js"),ot=require("./useSlide.cjs.js"),ut=require("./useWakePlayerFromIframe.cjs.js");;/* empty css */const lt=require("../../Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/loader-circle.cjs.js"),at=1e3,Ce=t.memo(({content:R,title:I,defaultButtonText:d,defaultInputText:T,defaultSelectedValues:y,confirmButtonText:ee,copyButtonText:j,copiedButtonText:A,onSend:w,readonly:H=!1})=>n.jsxRuntimeExports.jsxs("div",{className:"slide-player__interaction-card",children:[n.jsxRuntimeExports.jsx("div",{className:"slide-player__interaction-header",children:n.jsxRuntimeExports.jsx("p",{className:"slide-player__interaction-title",children:I})}),n.jsxRuntimeExports.jsx("div",{className:"slide-player__interaction-body",children:n.jsxRuntimeExports.jsx(rt.default,{content:R,defaultButtonText:d,defaultInputText:T,defaultSelectedValues:y,confirmButtonText:ee,copyButtonText:j,copiedButtonText:A,onSend:w,readonly:H,enableTypewriter:!1,sandboxMode:"content"})}),n.jsxRuntimeExports.jsx("div",{className:"slide-player__interaction-arrow"})]}));Ce.displayName="InteractionOverlayCard";const it=(R,I)=>R.length===I.length&&R.every((d,T)=>{const y=I[T];return d.sequence_number===y?.sequence_number&&d.type===y?.type&&d.content===y?.content}),ct=({elementList:R=[],showPlayer:I=!0,playerAlwaysVisible:d=!1,playerClassName:T,bufferingText:y="Buffering...",interactionTitle:ee,interactionTexts:j,playerAutoHideDelay:A=3e3,interactionDefaultValueOptions:w,onSend:H,onPlayerVisibilityChange:te,onStepChange:oe,className:_e,onPointerDown:ue,...ke})=>{const ne=t.useRef(null),re=t.useRef(null),le=t.useRef(null),q=t.useRef(null),N=t.useRef(null),B=t.useRef(null),ae=t.useRef([]),O=t.useRef(!1),{currentElementList:p,stepElementLists:ie,slideElementList:$,currentIndex:f,audioList:ce,currentAudioSequenceIndexes:h,currentStepHasSpeakableElement:C,currentInteractionElement:a,canGoPrev:Pe,canGoNext:v,handlePrev:de,handleNext:S}=ot.default(R),fe=t.useMemo(()=>{if(!(f<0))return $[f]},[f,$]),Te=$.filter(e=>e.is_renderable!==!1).length===1,m=I&&($.length>0||ce.length>0||!!a),[me,K]=t.useState(!0),[D,M]=t.useState(!1),[Ae,se]=t.useState(!1),[qe]=t.useState(()=>tt.hasBrowserUserActivation()),Ne=qe||Ae,[Be,z]=t.useState(-1),[V,W]=t.useState(-1),[xe,x]=t.useState(!1),[U,pe]=t.useState(!1),[s,G]=t.useState(),[Y,F]=t.useState(!1),_=m&&(d||me||xe),{mountedStepStates:Me,currentMountedStateIndex:Fe}=t.useMemo(()=>{const e=[],r=new Map;return ie.forEach((u,c)=>{const o=e.findIndex(l=>it(l.elementList,u));if(o>=0){e[o]?.sourceStepIndexes.push(c),r.set(c,o);return}e.push({elementList:u,sourceStepIndexes:[c]}),r.set(c,e.length-1)}),{mountedStepStates:e,currentMountedStateIndex:f>=0?r.get(f)??-1:-1}},[f,ie]),he=t.useMemo(()=>String(f),[f]),ge=t.useMemo(()=>String(h[0]??"none"),[h]),be=t.useMemo(()=>a?`${a.sequence_number??"none"}:${String(a.content??"")}`:"none",[a]),Le=t.useMemo(()=>[he,be,ge].join("|"),[ge,be,he]),E=t.useCallback(()=>{q.current!==null&&(window.clearTimeout(q.current),q.current=null)},[]),g=t.useCallback(()=>{B.current!==null&&(window.clearTimeout(B.current),B.current=null)},[]),k=t.useCallback(()=>{N.current!==null&&(window.clearTimeout(N.current),N.current=null)},[]),P=t.useCallback(()=>{k(),g(),z(-1),W(-1),x(!1),pe(!1),G(void 0),F(!1)},[k,g]),J=t.useCallback(()=>{const e=h[0];return typeof e!="number"?!1:(W(0),z(e),!0)},[h]),Q=t.useCallback(()=>{g(),F(!1),!J()&&v&&S()},[v,g,S,J]),i=t.useCallback((e=D)=>{m&&(K(!0),E(),!(d||!e||A<=0)&&(q.current=window.setTimeout(()=>{K(!1),q.current=null},A)))},[E,D,d,A,m]),He=!!(a?.readonly||a?.user_input?.trim()),X=!!a&&!He;t.useEffect(()=>()=>{k(),E(),g()},[k,g,E]),t.useEffect(()=>(te?.(_),()=>{te?.(!1)}),[te,_]),t.useEffect(()=>{oe?.(fe,f)},[f,fe,oe]),t.useEffect(()=>{if(!m){E(),K(!1);return}if(d){E(),K(!0);return}D||i(!0)},[E,D,d,m,i]),t.useEffect(()=>{if(typeof window>"u")return;const e=r=>{r.origin===window.location.origin&&nt.isSandboxInteractionMessage(r.data)&&m&&(M(!0),i(!0))};return window.addEventListener("message",e),()=>{window.removeEventListener("message",e)}},[m,i]),ut.default({sectionRef:ne,enabled:m,onWake:()=>{M(!0),i(!0)}}),t.useEffect(()=>{if(P(),!(p.length===0&&!a)){if(X){G(a),F(!0);return}if(a&&(G(a),F(!1)),!J()){if(C){x(!0);return}if(v)return N.current=window.setTimeout(()=>{N.current=null,S()},at),()=>{k()}}}},[v,k,p.length,a,Le,C,S,X,P,J]),t.useEffect(()=>{if(!C||X){x(!1);return}if(U){x(!1);return}h.length===0&&x(!0)},[h.length,C,U,X]);const Se=t.useMemo(()=>s?we.getInteractionDefaultValues(typeof s.content=="string"?s.content:void 0,s.user_input,w):{},[s,w]),Oe=t.useMemo(()=>{if(s)return we.getInteractionDefaultSelectedValues(typeof s.content=="string"?s.content:void 0,s.user_input,w)},[s,w]),ye=!!s?.user_input?.trim(),ve=!!s?.readonly||ye,Ee=ve||ye,$e=t.useCallback(e=>{const u=[...e.selectedValues??[],e.inputText?.trim()??"",e.buttonText?.trim()??""].filter(Boolean).join(", ");G(c=>!c||!u?c:{...c,user_input:u}),H?.(e,s),Q()},[s,Q,H]);t.useEffect(()=>{if(g(),!(!Y||!Ee))return B.current=window.setTimeout(()=>{B.current=null,Q()},2e3),()=>{g()}},[g,Q,Y,Ee]);const Ke=(e,r={})=>e?e.type==="slot"?n.jsxRuntimeExports.jsx(n.jsxRuntimeExports.Fragment,{children:e.content}):e.type==="html"?n.jsxRuntimeExports.jsx(je.default,{className:"content-render-iframe",hideFullScreen:!0,mode:"blackboard",replaceRootScreenHeightWithFull:r.replaceRootScreenHeightWithFull,type:"sandbox",content:e.content}):n.jsxRuntimeExports.jsx(je.default,{className:"content-render-iframe",hideFullScreen:!0,mode:"blackboard",type:"markdown",content:e.content}):null,De=(e=[],r=!1)=>{if(e.length===0)return null;const u=e.filter(o=>o.is_renderable!==!1).length,c=e.reduce((o,l,b)=>l.is_renderable!==!1?b:o,-1);return n.jsxRuntimeExports.jsx("div",{className:"slide-stage__content flex w-full flex-col gap-4",children:e.map((o,l)=>{const b=o.type==="html"&&o.is_renderable===!1;return n.jsxRuntimeExports.jsx("div",{ref:r&&l===c?le:null,"aria-hidden":b||void 0,className:L.cn("w-full shrink-0",u===1&&o.is_renderable!==!1&&"slide-element--single",b?"pointer-events-none fixed left-[-200vw] top-0 -z-10 h-[100dvh] w-[100vw] overflow-hidden opacity-0":o.is_renderable===!1&&"hidden"),children:Ke(o,{replaceRootScreenHeightWithFull:u===1&&o.type==="html"&&o.is_renderable!==!1})},o.sequence_number??`${o.type}-${l}`)})})},ze=()=>{const e=ne.current;if(e){if(document.fullscreenElement){document.exitFullscreen().catch(()=>{});return}e.requestFullscreen?.().catch(()=>{})}},Re=t.useCallback(()=>{const e=re.current;e&&e.scrollTo({top:e.scrollHeight,behavior:"smooth"})},[]),Ve=t.useCallback(()=>{O.current=!0,M(!0),se(!0),x(!1),i(!0),P(),de()},[de,P,i]),We=t.useCallback(()=>{O.current=!0,M(!0),se(!0),x(!1),i(!0),P(),S()},[S,P,i]),Ue=t.useCallback(e=>{if(!C||U){x(!1);return}x(e)},[C,U]),Ge=t.useCallback(e=>{if(V<0||h[V]!==e)return;const r=V+1,u=h[r];if(typeof u=="number"){W(r),z(u);return}z(-1),W(-1),pe(!0),x(!1),v&&S()},[v,h,V,S]),Ye=t.useCallback(()=>{s&&F(e=>!e)},[s]),Ie=t.useCallback(e=>{e.stopPropagation(),_&&i(!0)},[me,i]),Je=t.useCallback(e=>{ue?.(e),M(!0),i(!0)},[ue,i]),Qe=!!s&&Y,Z=t.useMemo(()=>p.map((e,r)=>`${e.sequence_number??`${e.type}-${r}`}:${String(e.is_new??"")}`),[p]);return t.useEffect(()=>{const e=ae.current,c=(e.length>0&&e.length<Z.length&&e.every((l,b)=>l===Z[b])?p.slice(e.length):[]).some(l=>l.is_new===!1);if(ae.current=Z,!c)return;const o=window.requestAnimationFrame(()=>{const l=re.current,b=le.current;if(!l||!b)return;const Xe=l.getBoundingClientRect(),Ze=b.getBoundingClientRect(),et=l.scrollTop+(Ze.top-Xe.top);l.scrollTo({top:Math.max(et,0),behavior:"smooth"})});return()=>{window.cancelAnimationFrame(o)}},[p,Z]),t.useEffect(()=>{if(!O.current||(O.current=!1,p.length===0))return;const e=window.requestAnimationFrame(()=>{Re()});return()=>{window.cancelAnimationFrame(e)}},[p,Re]),n.jsxRuntimeExports.jsxs("section",{ref:ne,className:L.cn("relative h-full w-full",_e),onPointerDown:Je,...ke,children:[n.jsxRuntimeExports.jsx("div",{className:L.cn("h-full min-h-0 w-full",Te?"slide-content--single":"grid gap-4"),children:p.length>0?n.jsxRuntimeExports.jsx("div",{className:"slide-stage",children:n.jsxRuntimeExports.jsx("div",{ref:re,className:"slide-stage__layer w-full",children:Me.map((e,r)=>{const u=r===Fe;return n.jsxRuntimeExports.jsx("div",{"aria-hidden":!u||void 0,className:"w-full h-full",style:{display:u?void 0:"none"},children:De(e.elementList,u)},e.sourceStepIndexes[0]??r)})})}):null}),xe?n.jsxRuntimeExports.jsxs("div",{className:"pointer-events-none absolute left-1/2 top-1/2 z-[3] flex size-28 -translate-x-1/2 -translate-y-1/2 flex-col items-center justify-center gap-2 rounded-2xl bg-foreground/65 px-3 py-4 text-center text-xs leading-4 font-medium text-background shadow-lg backdrop-blur-sm",children:[n.jsxRuntimeExports.jsx(lt.default,{className:"size-5 animate-spin text-background"}),n.jsxRuntimeExports.jsx("span",{children:y})]}):null,Qe?n.jsxRuntimeExports.jsx("div",{className:L.cn("slide-interaction-overlay",_&&m?"slide-interaction-overlay--with-player":"slide-interaction-overlay--standalone"),onClick:Ie,onPointerDown:Ie,children:n.jsxRuntimeExports.jsx(Ce,{content:String(s?.content??""),defaultButtonText:Se.buttonText??"",defaultInputText:Se.inputText??"",defaultSelectedValues:Oe,confirmButtonText:j?.confirmButtonText,copyButtonText:j?.copyButtonText,copiedButtonText:j?.copiedButtonText,onSend:$e,readonly:ve,title:j?.title??ee??"Submit the content below to continue."})}):null,m?n.jsxRuntimeExports.jsx(st.default,{audioList:ce,className:L.cn("absolute left-1/2 bottom-6 z-[2] -translate-x-1/2",T,!_&&"pointer-events-none opacity-0"),currentAudioIndex:Be,defaultPlaying:Ne,hasInteraction:!!s,isInteractionOpen:Y,onLoadingChange:Ue,nextDisabled:!v,onEnded:Ge,onFullscreen:ze,onInteractionToggle:Ye,onPlayRequest:()=>se(!0),onNext:We,onPrev:Ve,prevDisabled:!Pe,showControls:_}):null]})};exports.default=ct;
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const n=require("../../_virtual/jsx-runtime.cjs.js"),t=require("react"),tt=require("../../lib/browserUserActivation.cjs.js"),nt=require("../../lib/sandboxInteraction.cjs.js"),L=require("../../lib/utils.cjs.js"),rt=require("../ContentRender/ContentRender.cjs.js"),Ie=require("../ContentRender/IframeSandbox.cjs.js");require("../ui/inputGroup/input-group.cjs.js");const je=require("../../lib/interaction-defaults.cjs.js"),st=require("./Player.cjs.js"),ot=require("./useSlide.cjs.js"),ut=require("./useWakePlayerFromIframe.cjs.js");;/* empty css */const lt=require("../../Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/lucide-react@0.525.0_react@19.0.1/node_modules/lucide-react/dist/esm/icons/loader-circle.cjs.js"),at=1e3,we=t.memo(({content:R,title:I,defaultButtonText:d,defaultInputText:T,defaultSelectedValues:y,confirmButtonText:ee,copyButtonText:j,copiedButtonText:A,onSend:w,readonly:H=!1})=>n.jsxRuntimeExports.jsxs("div",{className:"slide-player__interaction-card",children:[n.jsxRuntimeExports.jsx("div",{className:"slide-player__interaction-header",children:n.jsxRuntimeExports.jsx("p",{className:"slide-player__interaction-title",children:I})}),n.jsxRuntimeExports.jsx("div",{className:"slide-player__interaction-body",children:n.jsxRuntimeExports.jsx(rt.default,{content:R,defaultButtonText:d,defaultInputText:T,defaultSelectedValues:y,confirmButtonText:ee,copyButtonText:j,copiedButtonText:A,onSend:w,readonly:H,enableTypewriter:!1,sandboxMode:"content"})}),n.jsxRuntimeExports.jsx("div",{className:"slide-player__interaction-arrow"})]}));we.displayName="InteractionOverlayCard";const it=(R,I)=>R.length===I.length&&R.every((d,T)=>{const y=I[T];return d.sequence_number===y?.sequence_number&&d.type===y?.type&&d.content===y?.content}),ct=({elementList:R=[],showPlayer:I=!0,playerAlwaysVisible:d=!1,playerClassName:T,bufferingText:y="Buffering...",interactionTitle:ee,interactionTexts:j,playerAutoHideDelay:A=3e3,interactionDefaultValueOptions:w,onSend:H,onPlayerVisibilityChange:te,onStepChange:oe,className:Ce,onPointerDown:ue,..._e})=>{const ne=t.useRef(null),re=t.useRef(null),le=t.useRef(null),q=t.useRef(null),N=t.useRef(null),B=t.useRef(null),ae=t.useRef([]),O=t.useRef(!1),{currentElementList:p,stepElementLists:ie,slideElementList:$,currentIndex:f,audioList:ce,currentAudioSequenceIndexes:h,currentStepHasSpeakableElement:C,currentInteractionElement:a,canGoPrev:ke,canGoNext:v,handlePrev:de,handleNext:S}=ot.default(R),fe=t.useMemo(()=>{if(!(f<0))return $[f]},[f,$]),Pe=$.filter(e=>e.is_renderable!==!1).length===1,m=I&&($.length>0||ce.length>0||!!a),[me,K]=t.useState(!0),[D,M]=t.useState(!1),[Te,se]=t.useState(!1),[Ae]=t.useState(()=>tt.hasBrowserUserActivation()),qe=Ae||Te,[Ne,z]=t.useState(-1),[V,W]=t.useState(-1),[Be,x]=t.useState(!1),[U,xe]=t.useState(!1),[s,G]=t.useState(),[Y,F]=t.useState(!1),_=m&&(d||me),{mountedStepStates:Me,currentMountedStateIndex:Fe}=t.useMemo(()=>{const e=[],r=new Map;return ie.forEach((u,c)=>{const o=e.findIndex(l=>it(l.elementList,u));if(o>=0){e[o]?.sourceStepIndexes.push(c),r.set(c,o);return}e.push({elementList:u,sourceStepIndexes:[c]}),r.set(c,e.length-1)}),{mountedStepStates:e,currentMountedStateIndex:f>=0?r.get(f)??-1:-1}},[f,ie]),pe=t.useMemo(()=>String(f),[f]),he=t.useMemo(()=>String(h[0]??"none"),[h]),ge=t.useMemo(()=>a?`${a.sequence_number??"none"}:${String(a.content??"")}`:"none",[a]),Le=t.useMemo(()=>[pe,ge,he].join("|"),[he,ge,pe]),E=t.useCallback(()=>{q.current!==null&&(window.clearTimeout(q.current),q.current=null)},[]),g=t.useCallback(()=>{B.current!==null&&(window.clearTimeout(B.current),B.current=null)},[]),k=t.useCallback(()=>{N.current!==null&&(window.clearTimeout(N.current),N.current=null)},[]),P=t.useCallback(()=>{k(),g(),z(-1),W(-1),x(!1),xe(!1),G(void 0),F(!1)},[k,g]),J=t.useCallback(()=>{const e=h[0];return typeof e!="number"?!1:(W(0),z(e),!0)},[h]),Q=t.useCallback(()=>{g(),F(!1),!J()&&v&&S()},[v,g,S,J]),i=t.useCallback((e=D)=>{m&&(K(!0),E(),!(d||!e||A<=0)&&(q.current=window.setTimeout(()=>{K(!1),q.current=null},A)))},[E,D,d,A,m]),He=!!(a?.readonly||a?.user_input?.trim()),X=!!a&&!He;t.useEffect(()=>()=>{k(),E(),g()},[k,g,E]),t.useEffect(()=>(te?.(_),()=>{te?.(!1)}),[te,_]),t.useEffect(()=>{oe?.(fe,f)},[f,fe,oe]),t.useEffect(()=>{if(!m){E(),K(!1);return}if(d){E(),K(!0);return}D||i(!0)},[E,D,d,m,i]),t.useEffect(()=>{if(typeof window>"u")return;const e=r=>{r.origin===window.location.origin&&nt.isSandboxInteractionMessage(r.data)&&m&&(M(!0),i(!0))};return window.addEventListener("message",e),()=>{window.removeEventListener("message",e)}},[m,i]),ut.default({sectionRef:ne,enabled:m,onWake:()=>{M(!0),i(!0)}}),t.useEffect(()=>{if(P(),!(p.length===0&&!a)){if(X){G(a),F(!0);return}if(a&&(G(a),F(!1)),!J()){if(C){x(!0);return}if(v)return N.current=window.setTimeout(()=>{N.current=null,S()},at),()=>{k()}}}},[v,k,p.length,a,Le,C,S,X,P,J]),t.useEffect(()=>{if(!C||X){x(!1);return}if(U){x(!1);return}h.length===0&&x(!0)},[h.length,C,U,X]);const be=t.useMemo(()=>s?je.getInteractionDefaultValues(typeof s.content=="string"?s.content:void 0,s.user_input,w):{},[s,w]),Oe=t.useMemo(()=>{if(s)return je.getInteractionDefaultSelectedValues(typeof s.content=="string"?s.content:void 0,s.user_input,w)},[s,w]),Se=!!s?.user_input?.trim(),ye=!!s?.readonly||Se,ve=ye||Se,$e=t.useCallback(e=>{const u=[...e.selectedValues??[],e.inputText?.trim()??"",e.buttonText?.trim()??""].filter(Boolean).join(", ");G(c=>!c||!u?c:{...c,user_input:u}),H?.(e,s),Q()},[s,Q,H]);t.useEffect(()=>{if(g(),!(!Y||!ve))return B.current=window.setTimeout(()=>{B.current=null,Q()},2e3),()=>{g()}},[g,Q,Y,ve]);const Ke=(e,r={})=>e?e.type==="slot"?n.jsxRuntimeExports.jsx(n.jsxRuntimeExports.Fragment,{children:e.content}):e.type==="html"?n.jsxRuntimeExports.jsx(Ie.default,{className:"content-render-iframe",hideFullScreen:!0,mode:"blackboard",replaceRootScreenHeightWithFull:r.replaceRootScreenHeightWithFull,type:"sandbox",content:e.content}):n.jsxRuntimeExports.jsx(Ie.default,{className:"content-render-iframe",hideFullScreen:!0,mode:"blackboard",type:"markdown",content:e.content}):null,De=(e=[],r=!1)=>{if(e.length===0)return null;const u=e.filter(o=>o.is_renderable!==!1).length,c=e.reduce((o,l,b)=>l.is_renderable!==!1?b:o,-1);return n.jsxRuntimeExports.jsx("div",{className:"slide-stage__content flex w-full flex-col gap-4",children:e.map((o,l)=>{const b=o.type==="html"&&o.is_renderable===!1;return n.jsxRuntimeExports.jsx("div",{ref:r&&l===c?le:null,"aria-hidden":b||void 0,className:L.cn("w-full shrink-0",u===1&&o.is_renderable!==!1&&"slide-element--single",b?"pointer-events-none fixed left-[-200vw] top-0 -z-10 h-[100dvh] w-[100vw] overflow-hidden opacity-0":o.is_renderable===!1&&"hidden"),children:Ke(o,{replaceRootScreenHeightWithFull:u===1&&o.type==="html"&&o.is_renderable!==!1})},o.sequence_number??`${o.type}-${l}`)})})},ze=()=>{const e=ne.current;if(e){if(document.fullscreenElement){document.exitFullscreen().catch(()=>{});return}e.requestFullscreen?.().catch(()=>{})}},Ee=t.useCallback(()=>{const e=re.current;e&&e.scrollTo({top:e.scrollHeight,behavior:"smooth"})},[]),Ve=t.useCallback(()=>{O.current=!0,M(!0),se(!0),x(!1),i(!0),P(),de()},[de,P,i]),We=t.useCallback(()=>{O.current=!0,M(!0),se(!0),x(!1),i(!0),P(),S()},[S,P,i]),Ue=t.useCallback(e=>{if(!C||U){x(!1);return}x(e)},[C,U]),Ge=t.useCallback(e=>{if(V<0||h[V]!==e)return;const r=V+1,u=h[r];if(typeof u=="number"){W(r),z(u);return}z(-1),W(-1),xe(!0),x(!1),v&&S()},[v,h,V,S]),Ye=t.useCallback(()=>{s&&F(e=>!e)},[s]),Re=t.useCallback(e=>{e.stopPropagation(),_&&i(!0)},[me,i]),Je=t.useCallback(e=>{ue?.(e),M(!0),i(!0)},[ue,i]),Qe=!!s&&Y,Z=t.useMemo(()=>p.map((e,r)=>`${e.sequence_number??`${e.type}-${r}`}:${String(e.is_new??"")}`),[p]);return t.useEffect(()=>{const e=ae.current,c=(e.length>0&&e.length<Z.length&&e.every((l,b)=>l===Z[b])?p.slice(e.length):[]).some(l=>l.is_new===!1);if(ae.current=Z,!c)return;const o=window.requestAnimationFrame(()=>{const l=re.current,b=le.current;if(!l||!b)return;const Xe=l.getBoundingClientRect(),Ze=b.getBoundingClientRect(),et=l.scrollTop+(Ze.top-Xe.top);l.scrollTo({top:Math.max(et,0),behavior:"smooth"})});return()=>{window.cancelAnimationFrame(o)}},[p,Z]),t.useEffect(()=>{if(!O.current||(O.current=!1,p.length===0))return;const e=window.requestAnimationFrame(()=>{Ee()});return()=>{window.cancelAnimationFrame(e)}},[p,Ee]),n.jsxRuntimeExports.jsxs("section",{ref:ne,className:L.cn("relative h-full w-full",Ce),onPointerDown:Je,..._e,children:[n.jsxRuntimeExports.jsx("div",{className:L.cn("h-full min-h-0 w-full",Pe?"slide-content--single":"grid gap-4"),children:p.length>0?n.jsxRuntimeExports.jsx("div",{className:"slide-stage",children:n.jsxRuntimeExports.jsx("div",{ref:re,className:"slide-stage__layer w-full",children:Me.map((e,r)=>{const u=r===Fe;return n.jsxRuntimeExports.jsx("div",{"aria-hidden":!u||void 0,className:"w-full h-full",style:{display:u?void 0:"none"},children:De(e.elementList,u)},e.sourceStepIndexes[0]??r)})})}):null}),Be?n.jsxRuntimeExports.jsxs("div",{className:"pointer-events-none absolute left-1/2 top-1/2 z-[3] flex size-28 -translate-x-1/2 -translate-y-1/2 flex-col items-center justify-center gap-2 rounded-2xl bg-foreground/65 px-3 py-4 text-center text-xs leading-4 font-medium text-background shadow-lg backdrop-blur-sm",children:[n.jsxRuntimeExports.jsx(lt.default,{className:"size-5 animate-spin text-background"}),n.jsxRuntimeExports.jsx("span",{children:y})]}):null,Qe?n.jsxRuntimeExports.jsx("div",{className:L.cn("slide-interaction-overlay",_&&m?"slide-interaction-overlay--with-player":"slide-interaction-overlay--standalone"),onClick:Re,onPointerDown:Re,children:n.jsxRuntimeExports.jsx(we,{content:String(s?.content??""),defaultButtonText:be.buttonText??"",defaultInputText:be.inputText??"",defaultSelectedValues:Oe,confirmButtonText:j?.confirmButtonText,copyButtonText:j?.copyButtonText,copiedButtonText:j?.copiedButtonText,onSend:$e,readonly:ye,title:j?.title??ee??"Submit the content below to continue."})}):null,m?n.jsxRuntimeExports.jsx(st.default,{audioList:ce,className:L.cn("absolute left-1/2 bottom-6 z-[2] -translate-x-1/2",T,!_&&"pointer-events-none opacity-0"),currentAudioIndex:Ne,defaultPlaying:qe,hasInteraction:!!s,isInteractionOpen:Y,onLoadingChange:Ue,nextDisabled:!v,onEnded:Ge,onFullscreen:ze,onInteractionToggle:Ye,onPlayRequest:()=>se(!0),onNext:We,onPrev:Ve,prevDisabled:!ke,showControls:_}):null]})};exports.default=ct;
|
|
2
2
|
//# sourceMappingURL=Slide.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Slide.cjs.js","sources":["../../../src/components/Slide/Slide.tsx"],"sourcesContent":["import React, {\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { LoaderCircle } from \"lucide-react\";\n\nimport { hasBrowserUserActivation } from \"../../lib/browserUserActivation\";\nimport { isSandboxInteractionMessage } from \"../../lib/sandboxInteraction\";\nimport { cn } from \"../../lib/utils\";\nimport ContentRender from \"../ContentRender\";\nimport type { ContentRenderProps } from \"../ContentRender/ContentRender\";\nimport IframeSandbox from \"../ContentRender/IframeSandbox\";\nimport type { OnSendContentParams } from \"../types\";\nimport {\n getInteractionDefaultSelectedValues,\n getInteractionDefaultValues,\n type InteractionDefaultValueOptions,\n} from \"../../lib/interaction-defaults\";\nimport Player from \"./Player\";\nimport type { Element } from \"./types\";\nimport useSlide from \"./useSlide\";\nimport useWakePlayerFromIframe from \"./useWakePlayerFromIframe\";\nimport \"./slide.css\";\nexport type { Element, ElementAudioSegment } from \"./types\";\n\nconst CHECKPOINT_AUTO_ADVANCE_DELAY_MS = 1000;\n\ntype RenderSlideElementOptions = {\n replaceRootScreenHeightWithFull?: boolean;\n};\n\ninterface InteractionOverlayCardProps {\n content: string;\n title: string;\n defaultButtonText?: string;\n defaultInputText?: string;\n defaultSelectedValues?: string[];\n confirmButtonText?: string;\n copyButtonText?: string;\n copiedButtonText?: string;\n onSend?: (content: OnSendContentParams) => void;\n readonly?: boolean;\n}\n\nexport interface SlideInteractionTexts\n extends Pick<\n ContentRenderProps,\n \"confirmButtonText\" | \"copyButtonText\" | \"copiedButtonText\"\n > {\n title?: string;\n}\n\nconst InteractionOverlayCard = memo(\n ({\n content,\n title,\n defaultButtonText,\n defaultInputText,\n defaultSelectedValues,\n confirmButtonText,\n copyButtonText,\n copiedButtonText,\n onSend,\n readonly = false,\n }: InteractionOverlayCardProps) => (\n <div className=\"slide-player__interaction-card\">\n <div className=\"slide-player__interaction-header\">\n <p className=\"slide-player__interaction-title\">{title}</p>\n </div>\n <div className=\"slide-player__interaction-body\">\n <ContentRender\n content={content}\n defaultButtonText={defaultButtonText}\n defaultInputText={defaultInputText}\n defaultSelectedValues={defaultSelectedValues}\n confirmButtonText={confirmButtonText}\n copyButtonText={copyButtonText}\n copiedButtonText={copiedButtonText}\n onSend={onSend}\n readonly={readonly}\n enableTypewriter={false}\n sandboxMode=\"content\"\n />\n </div>\n <div className=\"slide-player__interaction-arrow\" />\n </div>\n )\n);\n\nInteractionOverlayCard.displayName = \"InteractionOverlayCard\";\n\nconst areStepElementListsEqual = (\n prevElementList: Element[],\n nextElementList: Element[]\n) =>\n prevElementList.length === nextElementList.length &&\n prevElementList.every((element, index) => {\n const nextElement = nextElementList[index];\n\n return (\n element.sequence_number === nextElement?.sequence_number &&\n element.type === nextElement?.type &&\n element.content === nextElement?.content\n );\n });\n\nexport interface SlideProps extends React.ComponentProps<\"section\"> {\n elementList?: Element[];\n showPlayer?: boolean;\n playerAlwaysVisible?: boolean;\n playerClassName?: string;\n bufferingText?: string;\n interactionTitle?: string;\n interactionTexts?: SlideInteractionTexts;\n playerAutoHideDelay?: number;\n interactionDefaultValueOptions?: InteractionDefaultValueOptions;\n onSend?: (content: OnSendContentParams, element?: Element) => void;\n onPlayerVisibilityChange?: (visible: boolean) => void;\n onStepChange?: (element: Element | undefined, index: number) => void;\n}\n\nconst Slide: React.FC<SlideProps> = ({\n elementList = [],\n showPlayer = true,\n playerAlwaysVisible = false,\n playerClassName,\n bufferingText = \"Buffering...\",\n interactionTitle,\n interactionTexts,\n playerAutoHideDelay = 3000,\n interactionDefaultValueOptions,\n onSend,\n onPlayerVisibilityChange,\n onStepChange,\n className,\n onPointerDown,\n ...props\n}) => {\n const sectionRef = useRef<HTMLElement | null>(null);\n const stageLayerRef = useRef<HTMLDivElement | null>(null);\n const lastElementRef = useRef<HTMLDivElement | null>(null);\n const playerHideTimerRef = useRef<number | null>(null);\n const autoAdvanceTimerRef = useRef<number | null>(null);\n const interactionAutoCloseTimerRef = useRef<number | null>(null);\n const prevRenderElementKeysRef = useRef<string[]>([]);\n const shouldScrollToBottomRef = useRef(false);\n const {\n currentElementList,\n stepElementLists,\n slideElementList,\n currentIndex,\n audioList,\n currentAudioSequenceIndexes,\n currentStepHasSpeakableElement,\n currentInteractionElement,\n canGoPrev,\n canGoNext,\n handlePrev: goPrev,\n handleNext: goNext,\n } = useSlide(elementList);\n const currentStepElement = useMemo(() => {\n if (currentIndex < 0) {\n return undefined;\n }\n\n return slideElementList[currentIndex];\n }, [currentIndex, slideElementList]);\n const visibleMarkerCount = slideElementList.filter(\n (element) => element.is_renderable !== false\n ).length;\n const isSingleSlide = visibleMarkerCount === 1;\n const shouldRenderPlayer =\n showPlayer &&\n (slideElementList.length > 0 ||\n audioList.length > 0 ||\n Boolean(currentInteractionElement));\n const [isPlayerVisible, setIsPlayerVisible] = useState(true);\n const [hasPlayerInteracted, setHasPlayerInteracted] = useState(false);\n const [hasPlaybackInteracted, setHasPlaybackInteracted] = useState(false);\n const [shouldAutoPlay] = useState(() => hasBrowserUserActivation());\n const canAutoPlayAudio = shouldAutoPlay || hasPlaybackInteracted;\n const [currentAudioIndex, setCurrentAudioIndex] = useState(-1);\n const [currentAudioSequencePosition, setCurrentAudioSequencePosition] =\n useState(-1);\n const [isAudioLoadingVisible, setIsAudioLoadingVisible] = useState(false);\n const [hasCompletedCurrentStepAudio, setHasCompletedCurrentStepAudio] =\n useState(false);\n const [activeInteractionElement, setActiveInteractionElement] = useState<\n Element | undefined\n >();\n const [isInteractionOverlayOpen, setIsInteractionOverlayOpen] =\n useState(false);\n const playerVisible =\n shouldRenderPlayer &&\n (playerAlwaysVisible || isPlayerVisible || isAudioLoadingVisible);\n const { mountedStepStates, currentMountedStateIndex } = useMemo(() => {\n const nextMountedStepStates: Array<{\n elementList: Element[];\n sourceStepIndexes: number[];\n }> = [];\n const mountedStateIndexByStep = new Map<number, number>();\n\n stepElementLists.forEach((stepElementList, stepIndex) => {\n const existingMountedStateIndex = nextMountedStepStates.findIndex(\n (mountedStepState) =>\n areStepElementListsEqual(\n mountedStepState.elementList,\n stepElementList\n )\n );\n\n if (existingMountedStateIndex >= 0) {\n nextMountedStepStates[\n existingMountedStateIndex\n ]?.sourceStepIndexes.push(stepIndex);\n mountedStateIndexByStep.set(stepIndex, existingMountedStateIndex);\n return;\n }\n\n nextMountedStepStates.push({\n elementList: stepElementList,\n sourceStepIndexes: [stepIndex],\n });\n mountedStateIndexByStep.set(stepIndex, nextMountedStepStates.length - 1);\n });\n\n return {\n mountedStepStates: nextMountedStepStates,\n currentMountedStateIndex:\n currentIndex >= 0\n ? (mountedStateIndexByStep.get(currentIndex) ?? -1)\n : -1,\n };\n }, [currentIndex, stepElementLists]);\n const currentStepKey = useMemo(() => String(currentIndex), [currentIndex]);\n const currentAudioSequenceStartKey = useMemo(\n () => String(currentAudioSequenceIndexes[0] ?? \"none\"),\n [currentAudioSequenceIndexes]\n );\n const currentInteractionResetKey = useMemo(() => {\n if (!currentInteractionElement) {\n return \"none\";\n }\n\n return `${currentInteractionElement.sequence_number ?? \"none\"}:${String(\n currentInteractionElement.content ?? \"\"\n )}`;\n }, [currentInteractionElement]);\n const currentPlaybackResetKey = useMemo(\n () =>\n [\n currentStepKey,\n currentInteractionResetKey,\n currentAudioSequenceStartKey,\n ].join(\"|\"),\n [currentAudioSequenceStartKey, currentInteractionResetKey, currentStepKey]\n );\n\n const clearPlayerHideTimer = useCallback(() => {\n if (playerHideTimerRef.current === null) {\n return;\n }\n\n window.clearTimeout(playerHideTimerRef.current);\n playerHideTimerRef.current = null;\n }, []);\n\n const clearInteractionAutoCloseTimer = useCallback(() => {\n if (interactionAutoCloseTimerRef.current === null) {\n return;\n }\n\n window.clearTimeout(interactionAutoCloseTimerRef.current);\n interactionAutoCloseTimerRef.current = null;\n }, []);\n\n const clearAutoAdvanceTimer = useCallback(() => {\n if (autoAdvanceTimerRef.current === null) {\n return;\n }\n\n window.clearTimeout(autoAdvanceTimerRef.current);\n autoAdvanceTimerRef.current = null;\n }, []);\n\n const resetAudioSequence = useCallback(() => {\n clearAutoAdvanceTimer();\n clearInteractionAutoCloseTimer();\n setCurrentAudioIndex(-1);\n setCurrentAudioSequencePosition(-1);\n setIsAudioLoadingVisible(false);\n setHasCompletedCurrentStepAudio(false);\n setActiveInteractionElement(undefined);\n setIsInteractionOverlayOpen(false);\n }, [clearAutoAdvanceTimer, clearInteractionAutoCloseTimer]);\n\n const startCurrentAudioSequence = useCallback(() => {\n const nextAudioIndex = currentAudioSequenceIndexes[0];\n\n if (typeof nextAudioIndex !== \"number\") {\n return false;\n }\n\n // Start the first audio segment for the current step immediately.\n setCurrentAudioSequencePosition(0);\n setCurrentAudioIndex(nextAudioIndex);\n return true;\n }, [currentAudioSequenceIndexes]);\n\n const continueAfterInteraction = useCallback(() => {\n clearInteractionAutoCloseTimer();\n setIsInteractionOverlayOpen(false);\n\n if (startCurrentAudioSequence()) {\n return;\n }\n\n if (canGoNext) {\n goNext();\n }\n }, [\n canGoNext,\n clearInteractionAutoCloseTimer,\n goNext,\n startCurrentAudioSequence,\n ]);\n\n const showPlayerControls = useCallback(\n (enableAutoHide = hasPlayerInteracted) => {\n if (!shouldRenderPlayer) {\n return;\n }\n\n setIsPlayerVisible(true);\n clearPlayerHideTimer();\n\n if (playerAlwaysVisible || !enableAutoHide || playerAutoHideDelay <= 0) {\n return;\n }\n\n playerHideTimerRef.current = window.setTimeout(() => {\n setIsPlayerVisible(false);\n playerHideTimerRef.current = null;\n }, playerAutoHideDelay);\n },\n [\n clearPlayerHideTimer,\n hasPlayerInteracted,\n playerAlwaysVisible,\n playerAutoHideDelay,\n shouldRenderPlayer,\n ]\n );\n\n const hasResolvedCurrentInteraction = Boolean(\n currentInteractionElement?.readonly ||\n currentInteractionElement?.user_input?.trim()\n );\n\n const shouldBlockPlaybackForInteraction =\n Boolean(currentInteractionElement) && !hasResolvedCurrentInteraction;\n\n useEffect(() => {\n return () => {\n clearAutoAdvanceTimer();\n clearPlayerHideTimer();\n clearInteractionAutoCloseTimer();\n };\n }, [\n clearAutoAdvanceTimer,\n clearInteractionAutoCloseTimer,\n clearPlayerHideTimer,\n ]);\n\n useEffect(() => {\n onPlayerVisibilityChange?.(playerVisible);\n\n return () => {\n onPlayerVisibilityChange?.(false);\n };\n }, [onPlayerVisibilityChange, playerVisible]);\n\n useEffect(() => {\n onStepChange?.(currentStepElement, currentIndex);\n }, [currentIndex, currentStepElement, onStepChange]);\n\n useEffect(() => {\n if (!shouldRenderPlayer) {\n clearPlayerHideTimer();\n setIsPlayerVisible(false);\n return;\n }\n\n if (playerAlwaysVisible) {\n clearPlayerHideTimer();\n setIsPlayerVisible(true);\n return;\n }\n\n if (!hasPlayerInteracted) {\n // Keep the initial player visible briefly, then hide it automatically.\n showPlayerControls(true);\n }\n }, [\n clearPlayerHideTimer,\n hasPlayerInteracted,\n playerAlwaysVisible,\n shouldRenderPlayer,\n showPlayerControls,\n ]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const handleSandboxInteraction = (event: MessageEvent) => {\n if (event.origin !== window.location.origin) {\n return;\n }\n\n if (!isSandboxInteractionMessage(event.data)) {\n return;\n }\n\n if (!shouldRenderPlayer) {\n return;\n }\n\n // Restore player controls without blocking native iframe scrolling.\n setHasPlayerInteracted(true);\n showPlayerControls(true);\n };\n\n window.addEventListener(\"message\", handleSandboxInteraction);\n\n return () => {\n window.removeEventListener(\"message\", handleSandboxInteraction);\n };\n }, [shouldRenderPlayer, showPlayerControls]);\n\n useWakePlayerFromIframe({\n sectionRef,\n enabled: shouldRenderPlayer,\n onWake: () => {\n setHasPlayerInteracted(true);\n showPlayerControls(true);\n },\n });\n\n useEffect(() => {\n resetAudioSequence();\n\n if (currentElementList.length === 0 && !currentInteractionElement) {\n return;\n }\n\n if (shouldBlockPlaybackForInteraction) {\n // Show the interaction gate before playing any follow-up audio.\n setActiveInteractionElement(currentInteractionElement);\n setIsInteractionOverlayOpen(true);\n return;\n }\n\n if (currentInteractionElement) {\n setActiveInteractionElement(currentInteractionElement);\n setIsInteractionOverlayOpen(false);\n }\n\n if (startCurrentAudioSequence()) {\n return;\n }\n\n if (currentStepHasSpeakableElement) {\n setIsAudioLoadingVisible(true);\n return;\n }\n\n if (!canGoNext) {\n return;\n }\n\n // Auto-advance silent marker-only steps so playback flow does not stall.\n autoAdvanceTimerRef.current = window.setTimeout(() => {\n autoAdvanceTimerRef.current = null;\n goNext();\n }, CHECKPOINT_AUTO_ADVANCE_DELAY_MS);\n\n return () => {\n clearAutoAdvanceTimer();\n };\n }, [\n canGoNext,\n clearAutoAdvanceTimer,\n currentElementList.length,\n currentInteractionElement,\n currentPlaybackResetKey,\n currentStepHasSpeakableElement,\n goNext,\n shouldBlockPlaybackForInteraction,\n resetAudioSequence,\n startCurrentAudioSequence,\n ]);\n\n useEffect(() => {\n if (!currentStepHasSpeakableElement || shouldBlockPlaybackForInteraction) {\n setIsAudioLoadingVisible(false);\n return;\n }\n\n if (hasCompletedCurrentStepAudio) {\n setIsAudioLoadingVisible(false);\n return;\n }\n\n if (currentAudioSequenceIndexes.length === 0) {\n setIsAudioLoadingVisible(true);\n }\n }, [\n currentAudioSequenceIndexes.length,\n currentStepHasSpeakableElement,\n hasCompletedCurrentStepAudio,\n shouldBlockPlaybackForInteraction,\n ]);\n\n const interactionDefaults = useMemo(() => {\n if (!activeInteractionElement) {\n return {};\n }\n\n return getInteractionDefaultValues(\n typeof activeInteractionElement.content === \"string\"\n ? activeInteractionElement.content\n : undefined,\n activeInteractionElement.user_input,\n interactionDefaultValueOptions\n );\n }, [activeInteractionElement, interactionDefaultValueOptions]);\n\n const interactionDefaultSelectedValues = useMemo(() => {\n if (!activeInteractionElement) {\n return undefined;\n }\n\n return getInteractionDefaultSelectedValues(\n typeof activeInteractionElement.content === \"string\"\n ? activeInteractionElement.content\n : undefined,\n activeInteractionElement.user_input,\n interactionDefaultValueOptions\n );\n }, [activeInteractionElement, interactionDefaultValueOptions]);\n\n const hasResolvedInteractionInput = Boolean(\n activeInteractionElement?.user_input?.trim()\n );\n\n const isInteractionReadonly =\n Boolean(activeInteractionElement?.readonly) || hasResolvedInteractionInput;\n const shouldAutoContinueInteraction =\n isInteractionReadonly || hasResolvedInteractionInput;\n\n const handleInteractionSend = useCallback(\n (content: OnSendContentParams) => {\n const submittedValues = [\n ...(content.selectedValues ?? []),\n content.inputText?.trim() ?? \"\",\n content.buttonText?.trim() ?? \"\",\n ].filter(Boolean);\n const resolvedUserInput = submittedValues.join(\", \");\n\n setActiveInteractionElement((prevElement) => {\n if (!prevElement || !resolvedUserInput) {\n return prevElement;\n }\n\n return {\n ...prevElement,\n user_input: resolvedUserInput,\n };\n });\n\n onSend?.(content, activeInteractionElement);\n continueAfterInteraction();\n },\n [activeInteractionElement, continueAfterInteraction, onSend]\n );\n\n useEffect(() => {\n clearInteractionAutoCloseTimer();\n\n if (!isInteractionOverlayOpen || !shouldAutoContinueInteraction) {\n return;\n }\n\n // Auto-close passive interaction checkpoints to keep playback moving.\n interactionAutoCloseTimerRef.current = window.setTimeout(() => {\n interactionAutoCloseTimerRef.current = null;\n\n continueAfterInteraction();\n }, 2000);\n\n return () => {\n clearInteractionAutoCloseTimer();\n };\n }, [\n clearInteractionAutoCloseTimer,\n continueAfterInteraction,\n isInteractionOverlayOpen,\n shouldAutoContinueInteraction,\n ]);\n\n const renderSlideElement = (\n element?: Element,\n options: RenderSlideElementOptions = {}\n ) => {\n if (!element) {\n return null;\n }\n\n if (element.type === \"slot\") {\n return <>{element.content}</>;\n }\n\n if (element.type === \"html\") {\n return (\n <IframeSandbox\n className=\"content-render-iframe\"\n hideFullScreen\n mode=\"blackboard\"\n replaceRootScreenHeightWithFull={\n options.replaceRootScreenHeightWithFull\n }\n type=\"sandbox\"\n content={element.content as string}\n />\n );\n }\n\n return (\n <IframeSandbox\n className=\"content-render-iframe\"\n hideFullScreen\n mode=\"blackboard\"\n type=\"markdown\"\n content={element.content as string}\n />\n );\n };\n\n const renderSlideElementList = (\n elementList: Element[] = [],\n isActiveStep = false\n ) => {\n if (elementList.length === 0) {\n return null;\n }\n\n const visibleElementCount = elementList.filter(\n (element) => element.is_renderable !== false\n ).length;\n const lastVisibleElementIndex = elementList.reduce(\n (lastVisibleIndex, element, index) =>\n element.is_renderable !== false ? index : lastVisibleIndex,\n -1\n );\n\n return (\n <div className=\"slide-stage__content flex w-full flex-col gap-4\">\n {elementList.map((element, index) => {\n const isPreRenderedHtml =\n element.type === \"html\" && element.is_renderable === false;\n\n return (\n <div\n key={element.sequence_number ?? `${element.type}-${index}`}\n ref={\n isActiveStep && index === lastVisibleElementIndex\n ? lastElementRef\n : null\n }\n aria-hidden={isPreRenderedHtml || undefined}\n className={cn(\n \"w-full shrink-0\",\n visibleElementCount === 1 &&\n element.is_renderable !== false &&\n \"slide-element--single\",\n isPreRenderedHtml\n ? \"pointer-events-none fixed left-[-200vw] top-0 -z-10 h-[100dvh] w-[100vw] overflow-hidden opacity-0\"\n : element.is_renderable === false && \"hidden\"\n )}\n >\n {renderSlideElement(element, {\n replaceRootScreenHeightWithFull:\n visibleElementCount === 1 &&\n element.type === \"html\" &&\n element.is_renderable !== false,\n })}\n </div>\n );\n })}\n </div>\n );\n };\n\n const handleFullscreen = () => {\n const target = sectionRef.current;\n if (!target) return;\n\n if (document.fullscreenElement) {\n document.exitFullscreen().catch(() => {});\n return;\n }\n\n target.requestFullscreen?.().catch(() => {});\n };\n\n const scrollStageToBottom = useCallback(() => {\n const stageLayerElement = stageLayerRef.current;\n\n if (!stageLayerElement) {\n return;\n }\n\n // Keep the latest content visible after manual player navigation.\n stageLayerElement.scrollTo({\n top: stageLayerElement.scrollHeight,\n behavior: \"smooth\",\n });\n }, []);\n\n const handlePrev = useCallback(() => {\n shouldScrollToBottomRef.current = true;\n setHasPlayerInteracted(true);\n setHasPlaybackInteracted(true);\n setIsAudioLoadingVisible(false);\n showPlayerControls(true);\n resetAudioSequence();\n goPrev();\n }, [goPrev, resetAudioSequence, showPlayerControls]);\n\n const handleNext = useCallback(() => {\n shouldScrollToBottomRef.current = true;\n setHasPlayerInteracted(true);\n setHasPlaybackInteracted(true);\n setIsAudioLoadingVisible(false);\n showPlayerControls(true);\n resetAudioSequence();\n goNext();\n }, [goNext, resetAudioSequence, showPlayerControls]);\n\n const handlePlayerLoadingChange = useCallback(\n (loading: boolean) => {\n if (!currentStepHasSpeakableElement || hasCompletedCurrentStepAudio) {\n setIsAudioLoadingVisible(false);\n return;\n }\n\n setIsAudioLoadingVisible(loading);\n },\n [currentStepHasSpeakableElement, hasCompletedCurrentStepAudio]\n );\n\n const handlePlayerEnded = useCallback(\n (audioIndex: number) => {\n if (currentAudioSequencePosition < 0) {\n return;\n }\n\n if (\n currentAudioSequenceIndexes[currentAudioSequencePosition] !== audioIndex\n ) {\n return;\n }\n\n const nextSequencePosition = currentAudioSequencePosition + 1;\n const nextAudioIndex = currentAudioSequenceIndexes[nextSequencePosition];\n\n if (typeof nextAudioIndex === \"number\") {\n setCurrentAudioSequencePosition(nextSequencePosition);\n setCurrentAudioIndex(nextAudioIndex);\n return;\n }\n\n setCurrentAudioIndex(-1);\n setCurrentAudioSequencePosition(-1);\n setHasCompletedCurrentStepAudio(true);\n setIsAudioLoadingVisible(false);\n\n if (canGoNext) {\n goNext();\n }\n },\n [\n canGoNext,\n currentAudioSequenceIndexes,\n currentAudioSequencePosition,\n goNext,\n ]\n );\n\n const handleInteractionToggle = useCallback(() => {\n if (!activeInteractionElement) {\n return;\n }\n\n setIsInteractionOverlayOpen((prevOpen) => !prevOpen);\n }, [activeInteractionElement]);\n\n const stopOverlayPropagation = useCallback(\n (\n event:\n | React.PointerEvent<HTMLDivElement>\n | React.MouseEvent<HTMLDivElement>\n ) => {\n event.stopPropagation();\n\n // Keep the player visible a bit longer when users interact with the overlay.\n if (playerVisible) {\n showPlayerControls(true);\n }\n },\n [isPlayerVisible, showPlayerControls]\n );\n\n const handleSurfacePointerDown = useCallback(\n (event: React.PointerEvent<HTMLElement>) => {\n onPointerDown?.(event);\n setHasPlayerInteracted(true);\n showPlayerControls(true);\n },\n [onPointerDown, showPlayerControls]\n );\n\n const shouldShowInteractionOverlay =\n Boolean(activeInteractionElement) && isInteractionOverlayOpen;\n const currentRenderElementKeys = useMemo(\n () =>\n currentElementList.map(\n (element, index) =>\n `${element.sequence_number ?? `${element.type}-${index}`}:${String(element.is_new ?? \"\")}`\n ),\n [currentElementList]\n );\n\n useEffect(() => {\n const prevKeys = prevRenderElementKeysRef.current;\n const hasStablePrefix =\n prevKeys.length > 0 &&\n prevKeys.length < currentRenderElementKeys.length &&\n prevKeys.every((key, index) => key === currentRenderElementKeys[index]);\n const appendedElements = hasStablePrefix\n ? currentElementList.slice(prevKeys.length)\n : [];\n const shouldAutoScrollToAppend = appendedElements.some(\n (element) => element.is_new === false\n );\n\n prevRenderElementKeysRef.current = currentRenderElementKeys;\n\n if (!shouldAutoScrollToAppend) {\n return;\n }\n\n const animationFrameId = window.requestAnimationFrame(() => {\n const stageLayerElement = stageLayerRef.current;\n const targetElement = lastElementRef.current;\n\n if (!stageLayerElement || !targetElement) {\n return;\n }\n\n const stageLayerRect = stageLayerElement.getBoundingClientRect();\n const targetRect = targetElement.getBoundingClientRect();\n const nextScrollTop =\n stageLayerElement.scrollTop + (targetRect.top - stageLayerRect.top);\n\n // Keep newly appended content visible when the current slide grows downward.\n stageLayerElement.scrollTo({\n top: Math.max(nextScrollTop, 0),\n behavior: \"smooth\",\n });\n });\n\n return () => {\n window.cancelAnimationFrame(animationFrameId);\n };\n }, [currentElementList, currentRenderElementKeys]);\n\n useEffect(() => {\n if (!shouldScrollToBottomRef.current) {\n return;\n }\n\n shouldScrollToBottomRef.current = false;\n\n if (currentElementList.length === 0) {\n return;\n }\n\n const animationFrameId = window.requestAnimationFrame(() => {\n scrollStageToBottom();\n });\n\n return () => {\n window.cancelAnimationFrame(animationFrameId);\n };\n }, [currentElementList, scrollStageToBottom]);\n\n return (\n <section\n ref={sectionRef}\n className={cn(\"relative h-full w-full\", className)}\n onPointerDown={handleSurfacePointerDown}\n {...props}\n >\n <div\n className={cn(\n \"h-full min-h-0 w-full\",\n isSingleSlide ? \"slide-content--single\" : \"grid gap-4\"\n )}\n >\n {currentElementList.length > 0 ? (\n <div className=\"slide-stage\">\n <div ref={stageLayerRef} className=\"slide-stage__layer w-full\">\n {mountedStepStates.map(\n (mountedStepState, mountedStepStateIndex) => {\n const isActiveStep =\n mountedStepStateIndex === currentMountedStateIndex;\n\n return (\n <div\n key={\n mountedStepState.sourceStepIndexes[0] ??\n mountedStepStateIndex\n }\n aria-hidden={!isActiveStep || undefined}\n className=\"w-full h-full\"\n style={{ display: isActiveStep ? undefined : \"none\" }}\n >\n {renderSlideElementList(\n mountedStepState.elementList,\n isActiveStep\n )}\n </div>\n );\n }\n )}\n </div>\n </div>\n ) : null}\n </div>\n\n {isAudioLoadingVisible ? (\n <div className=\"pointer-events-none absolute left-1/2 top-1/2 z-[3] flex size-28 -translate-x-1/2 -translate-y-1/2 flex-col items-center justify-center gap-2 rounded-2xl bg-foreground/65 px-3 py-4 text-center text-xs leading-4 font-medium text-background shadow-lg backdrop-blur-sm\">\n <LoaderCircle className=\"size-5 animate-spin text-background\" />\n <span>{bufferingText}</span>\n </div>\n ) : null}\n\n {shouldShowInteractionOverlay ? (\n <div\n className={cn(\n \"slide-interaction-overlay\",\n playerVisible && shouldRenderPlayer\n ? \"slide-interaction-overlay--with-player\"\n : \"slide-interaction-overlay--standalone\"\n )}\n onClick={stopOverlayPropagation}\n onPointerDown={stopOverlayPropagation}\n >\n <InteractionOverlayCard\n content={String(activeInteractionElement?.content ?? \"\")}\n defaultButtonText={interactionDefaults.buttonText ?? \"\"}\n defaultInputText={interactionDefaults.inputText ?? \"\"}\n defaultSelectedValues={interactionDefaultSelectedValues}\n confirmButtonText={interactionTexts?.confirmButtonText}\n copyButtonText={interactionTexts?.copyButtonText}\n copiedButtonText={interactionTexts?.copiedButtonText}\n onSend={handleInteractionSend}\n readonly={isInteractionReadonly}\n title={\n interactionTexts?.title ??\n interactionTitle ??\n \"Submit the content below to continue.\"\n }\n />\n </div>\n ) : null}\n\n {shouldRenderPlayer ? (\n <Player\n audioList={audioList}\n className={cn(\n \"absolute left-1/2 bottom-6 z-[2] -translate-x-1/2\",\n playerClassName,\n !playerVisible && \"pointer-events-none opacity-0\"\n )}\n currentAudioIndex={currentAudioIndex}\n defaultPlaying={canAutoPlayAudio}\n hasInteraction={Boolean(activeInteractionElement)}\n isInteractionOpen={isInteractionOverlayOpen}\n onLoadingChange={handlePlayerLoadingChange}\n nextDisabled={!canGoNext}\n onEnded={handlePlayerEnded}\n onFullscreen={handleFullscreen}\n onInteractionToggle={handleInteractionToggle}\n onPlayRequest={() => setHasPlaybackInteracted(true)}\n onNext={handleNext}\n onPrev={handlePrev}\n prevDisabled={!canGoPrev}\n showControls={playerVisible}\n />\n ) : null}\n </section>\n );\n};\n\nexport default Slide;\n"],"names":["CHECKPOINT_AUTO_ADVANCE_DELAY_MS","InteractionOverlayCard","memo","content","title","defaultButtonText","defaultInputText","defaultSelectedValues","confirmButtonText","copyButtonText","copiedButtonText","onSend","readonly","jsxs","jsx","ContentRender","areStepElementListsEqual","prevElementList","nextElementList","element","index","nextElement","Slide","elementList","showPlayer","playerAlwaysVisible","playerClassName","bufferingText","interactionTitle","interactionTexts","playerAutoHideDelay","interactionDefaultValueOptions","onPlayerVisibilityChange","onStepChange","className","onPointerDown","props","sectionRef","useRef","stageLayerRef","lastElementRef","playerHideTimerRef","autoAdvanceTimerRef","interactionAutoCloseTimerRef","prevRenderElementKeysRef","shouldScrollToBottomRef","currentElementList","stepElementLists","slideElementList","currentIndex","audioList","currentAudioSequenceIndexes","currentStepHasSpeakableElement","currentInteractionElement","canGoPrev","canGoNext","goPrev","goNext","useSlide","currentStepElement","useMemo","isSingleSlide","shouldRenderPlayer","isPlayerVisible","setIsPlayerVisible","useState","hasPlayerInteracted","setHasPlayerInteracted","hasPlaybackInteracted","setHasPlaybackInteracted","shouldAutoPlay","hasBrowserUserActivation","canAutoPlayAudio","currentAudioIndex","setCurrentAudioIndex","currentAudioSequencePosition","setCurrentAudioSequencePosition","isAudioLoadingVisible","setIsAudioLoadingVisible","hasCompletedCurrentStepAudio","setHasCompletedCurrentStepAudio","activeInteractionElement","setActiveInteractionElement","isInteractionOverlayOpen","setIsInteractionOverlayOpen","playerVisible","mountedStepStates","currentMountedStateIndex","nextMountedStepStates","mountedStateIndexByStep","stepElementList","stepIndex","existingMountedStateIndex","mountedStepState","currentStepKey","currentAudioSequenceStartKey","currentInteractionResetKey","currentPlaybackResetKey","clearPlayerHideTimer","useCallback","clearInteractionAutoCloseTimer","clearAutoAdvanceTimer","resetAudioSequence","startCurrentAudioSequence","nextAudioIndex","continueAfterInteraction","showPlayerControls","enableAutoHide","hasResolvedCurrentInteraction","shouldBlockPlaybackForInteraction","useEffect","handleSandboxInteraction","event","isSandboxInteractionMessage","useWakePlayerFromIframe","interactionDefaults","getInteractionDefaultValues","interactionDefaultSelectedValues","getInteractionDefaultSelectedValues","hasResolvedInteractionInput","isInteractionReadonly","shouldAutoContinueInteraction","handleInteractionSend","resolvedUserInput","prevElement","renderSlideElement","options","Fragment","IframeSandbox","renderSlideElementList","isActiveStep","visibleElementCount","lastVisibleElementIndex","lastVisibleIndex","isPreRenderedHtml","cn","handleFullscreen","target","scrollStageToBottom","stageLayerElement","handlePrev","handleNext","handlePlayerLoadingChange","loading","handlePlayerEnded","audioIndex","nextSequencePosition","handleInteractionToggle","prevOpen","stopOverlayPropagation","handleSurfacePointerDown","shouldShowInteractionOverlay","currentRenderElementKeys","prevKeys","shouldAutoScrollToAppend","key","animationFrameId","targetElement","stageLayerRect","targetRect","nextScrollTop","mountedStepStateIndex","LoaderCircle","Player"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Slide.cjs.js","sources":["../../../src/components/Slide/Slide.tsx"],"sourcesContent":["import React, {\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { LoaderCircle } from \"lucide-react\";\n\nimport { hasBrowserUserActivation } from \"../../lib/browserUserActivation\";\nimport { isSandboxInteractionMessage } from \"../../lib/sandboxInteraction\";\nimport { cn } from \"../../lib/utils\";\nimport ContentRender from \"../ContentRender\";\nimport type { ContentRenderProps } from \"../ContentRender/ContentRender\";\nimport IframeSandbox from \"../ContentRender/IframeSandbox\";\nimport type { OnSendContentParams } from \"../types\";\nimport {\n getInteractionDefaultSelectedValues,\n getInteractionDefaultValues,\n type InteractionDefaultValueOptions,\n} from \"../../lib/interaction-defaults\";\nimport Player from \"./Player\";\nimport type { Element } from \"./types\";\nimport useSlide from \"./useSlide\";\nimport useWakePlayerFromIframe from \"./useWakePlayerFromIframe\";\nimport \"./slide.css\";\nexport type { Element, ElementAudioSegment } from \"./types\";\n\nconst CHECKPOINT_AUTO_ADVANCE_DELAY_MS = 1000;\n\ntype RenderSlideElementOptions = {\n replaceRootScreenHeightWithFull?: boolean;\n};\n\ninterface InteractionOverlayCardProps {\n content: string;\n title: string;\n defaultButtonText?: string;\n defaultInputText?: string;\n defaultSelectedValues?: string[];\n confirmButtonText?: string;\n copyButtonText?: string;\n copiedButtonText?: string;\n onSend?: (content: OnSendContentParams) => void;\n readonly?: boolean;\n}\n\nexport interface SlideInteractionTexts\n extends Pick<\n ContentRenderProps,\n \"confirmButtonText\" | \"copyButtonText\" | \"copiedButtonText\"\n > {\n title?: string;\n}\n\nconst InteractionOverlayCard = memo(\n ({\n content,\n title,\n defaultButtonText,\n defaultInputText,\n defaultSelectedValues,\n confirmButtonText,\n copyButtonText,\n copiedButtonText,\n onSend,\n readonly = false,\n }: InteractionOverlayCardProps) => (\n <div className=\"slide-player__interaction-card\">\n <div className=\"slide-player__interaction-header\">\n <p className=\"slide-player__interaction-title\">{title}</p>\n </div>\n <div className=\"slide-player__interaction-body\">\n <ContentRender\n content={content}\n defaultButtonText={defaultButtonText}\n defaultInputText={defaultInputText}\n defaultSelectedValues={defaultSelectedValues}\n confirmButtonText={confirmButtonText}\n copyButtonText={copyButtonText}\n copiedButtonText={copiedButtonText}\n onSend={onSend}\n readonly={readonly}\n enableTypewriter={false}\n sandboxMode=\"content\"\n />\n </div>\n <div className=\"slide-player__interaction-arrow\" />\n </div>\n )\n);\n\nInteractionOverlayCard.displayName = \"InteractionOverlayCard\";\n\nconst areStepElementListsEqual = (\n prevElementList: Element[],\n nextElementList: Element[]\n) =>\n prevElementList.length === nextElementList.length &&\n prevElementList.every((element, index) => {\n const nextElement = nextElementList[index];\n\n return (\n element.sequence_number === nextElement?.sequence_number &&\n element.type === nextElement?.type &&\n element.content === nextElement?.content\n );\n });\n\nexport interface SlideProps extends React.ComponentProps<\"section\"> {\n elementList?: Element[];\n showPlayer?: boolean;\n playerAlwaysVisible?: boolean;\n playerClassName?: string;\n bufferingText?: string;\n interactionTitle?: string;\n interactionTexts?: SlideInteractionTexts;\n playerAutoHideDelay?: number;\n interactionDefaultValueOptions?: InteractionDefaultValueOptions;\n onSend?: (content: OnSendContentParams, element?: Element) => void;\n onPlayerVisibilityChange?: (visible: boolean) => void;\n onStepChange?: (element: Element | undefined, index: number) => void;\n}\n\nconst Slide: React.FC<SlideProps> = ({\n elementList = [],\n showPlayer = true,\n playerAlwaysVisible = false,\n playerClassName,\n bufferingText = \"Buffering...\",\n interactionTitle,\n interactionTexts,\n playerAutoHideDelay = 3000,\n interactionDefaultValueOptions,\n onSend,\n onPlayerVisibilityChange,\n onStepChange,\n className,\n onPointerDown,\n ...props\n}) => {\n const sectionRef = useRef<HTMLElement | null>(null);\n const stageLayerRef = useRef<HTMLDivElement | null>(null);\n const lastElementRef = useRef<HTMLDivElement | null>(null);\n const playerHideTimerRef = useRef<number | null>(null);\n const autoAdvanceTimerRef = useRef<number | null>(null);\n const interactionAutoCloseTimerRef = useRef<number | null>(null);\n const prevRenderElementKeysRef = useRef<string[]>([]);\n const shouldScrollToBottomRef = useRef(false);\n const {\n currentElementList,\n stepElementLists,\n slideElementList,\n currentIndex,\n audioList,\n currentAudioSequenceIndexes,\n currentStepHasSpeakableElement,\n currentInteractionElement,\n canGoPrev,\n canGoNext,\n handlePrev: goPrev,\n handleNext: goNext,\n } = useSlide(elementList);\n const currentStepElement = useMemo(() => {\n if (currentIndex < 0) {\n return undefined;\n }\n\n return slideElementList[currentIndex];\n }, [currentIndex, slideElementList]);\n const visibleMarkerCount = slideElementList.filter(\n (element) => element.is_renderable !== false\n ).length;\n const isSingleSlide = visibleMarkerCount === 1;\n const shouldRenderPlayer =\n showPlayer &&\n (slideElementList.length > 0 ||\n audioList.length > 0 ||\n Boolean(currentInteractionElement));\n const [isPlayerVisible, setIsPlayerVisible] = useState(true);\n const [hasPlayerInteracted, setHasPlayerInteracted] = useState(false);\n const [hasPlaybackInteracted, setHasPlaybackInteracted] = useState(false);\n const [shouldAutoPlay] = useState(() => hasBrowserUserActivation());\n const canAutoPlayAudio = shouldAutoPlay || hasPlaybackInteracted;\n const [currentAudioIndex, setCurrentAudioIndex] = useState(-1);\n const [currentAudioSequencePosition, setCurrentAudioSequencePosition] =\n useState(-1);\n const [isAudioLoadingVisible, setIsAudioLoadingVisible] = useState(false);\n const [hasCompletedCurrentStepAudio, setHasCompletedCurrentStepAudio] =\n useState(false);\n const [activeInteractionElement, setActiveInteractionElement] = useState<\n Element | undefined\n >();\n const [isInteractionOverlayOpen, setIsInteractionOverlayOpen] =\n useState(false);\n const playerVisible =\n shouldRenderPlayer && (playerAlwaysVisible || isPlayerVisible);\n const { mountedStepStates, currentMountedStateIndex } = useMemo(() => {\n const nextMountedStepStates: Array<{\n elementList: Element[];\n sourceStepIndexes: number[];\n }> = [];\n const mountedStateIndexByStep = new Map<number, number>();\n\n stepElementLists.forEach((stepElementList, stepIndex) => {\n const existingMountedStateIndex = nextMountedStepStates.findIndex(\n (mountedStepState) =>\n areStepElementListsEqual(\n mountedStepState.elementList,\n stepElementList\n )\n );\n\n if (existingMountedStateIndex >= 0) {\n nextMountedStepStates[\n existingMountedStateIndex\n ]?.sourceStepIndexes.push(stepIndex);\n mountedStateIndexByStep.set(stepIndex, existingMountedStateIndex);\n return;\n }\n\n nextMountedStepStates.push({\n elementList: stepElementList,\n sourceStepIndexes: [stepIndex],\n });\n mountedStateIndexByStep.set(stepIndex, nextMountedStepStates.length - 1);\n });\n\n return {\n mountedStepStates: nextMountedStepStates,\n currentMountedStateIndex:\n currentIndex >= 0\n ? (mountedStateIndexByStep.get(currentIndex) ?? -1)\n : -1,\n };\n }, [currentIndex, stepElementLists]);\n const currentStepKey = useMemo(() => String(currentIndex), [currentIndex]);\n const currentAudioSequenceStartKey = useMemo(\n () => String(currentAudioSequenceIndexes[0] ?? \"none\"),\n [currentAudioSequenceIndexes]\n );\n const currentInteractionResetKey = useMemo(() => {\n if (!currentInteractionElement) {\n return \"none\";\n }\n\n return `${currentInteractionElement.sequence_number ?? \"none\"}:${String(\n currentInteractionElement.content ?? \"\"\n )}`;\n }, [currentInteractionElement]);\n const currentPlaybackResetKey = useMemo(\n () =>\n [\n currentStepKey,\n currentInteractionResetKey,\n currentAudioSequenceStartKey,\n ].join(\"|\"),\n [currentAudioSequenceStartKey, currentInteractionResetKey, currentStepKey]\n );\n\n const clearPlayerHideTimer = useCallback(() => {\n if (playerHideTimerRef.current === null) {\n return;\n }\n\n window.clearTimeout(playerHideTimerRef.current);\n playerHideTimerRef.current = null;\n }, []);\n\n const clearInteractionAutoCloseTimer = useCallback(() => {\n if (interactionAutoCloseTimerRef.current === null) {\n return;\n }\n\n window.clearTimeout(interactionAutoCloseTimerRef.current);\n interactionAutoCloseTimerRef.current = null;\n }, []);\n\n const clearAutoAdvanceTimer = useCallback(() => {\n if (autoAdvanceTimerRef.current === null) {\n return;\n }\n\n window.clearTimeout(autoAdvanceTimerRef.current);\n autoAdvanceTimerRef.current = null;\n }, []);\n\n const resetAudioSequence = useCallback(() => {\n clearAutoAdvanceTimer();\n clearInteractionAutoCloseTimer();\n setCurrentAudioIndex(-1);\n setCurrentAudioSequencePosition(-1);\n setIsAudioLoadingVisible(false);\n setHasCompletedCurrentStepAudio(false);\n setActiveInteractionElement(undefined);\n setIsInteractionOverlayOpen(false);\n }, [clearAutoAdvanceTimer, clearInteractionAutoCloseTimer]);\n\n const startCurrentAudioSequence = useCallback(() => {\n const nextAudioIndex = currentAudioSequenceIndexes[0];\n\n if (typeof nextAudioIndex !== \"number\") {\n return false;\n }\n\n // Start the first audio segment for the current step immediately.\n setCurrentAudioSequencePosition(0);\n setCurrentAudioIndex(nextAudioIndex);\n return true;\n }, [currentAudioSequenceIndexes]);\n\n const continueAfterInteraction = useCallback(() => {\n clearInteractionAutoCloseTimer();\n setIsInteractionOverlayOpen(false);\n\n if (startCurrentAudioSequence()) {\n return;\n }\n\n if (canGoNext) {\n goNext();\n }\n }, [\n canGoNext,\n clearInteractionAutoCloseTimer,\n goNext,\n startCurrentAudioSequence,\n ]);\n\n const showPlayerControls = useCallback(\n (enableAutoHide = hasPlayerInteracted) => {\n if (!shouldRenderPlayer) {\n return;\n }\n\n setIsPlayerVisible(true);\n clearPlayerHideTimer();\n\n if (playerAlwaysVisible || !enableAutoHide || playerAutoHideDelay <= 0) {\n return;\n }\n\n playerHideTimerRef.current = window.setTimeout(() => {\n setIsPlayerVisible(false);\n playerHideTimerRef.current = null;\n }, playerAutoHideDelay);\n },\n [\n clearPlayerHideTimer,\n hasPlayerInteracted,\n playerAlwaysVisible,\n playerAutoHideDelay,\n shouldRenderPlayer,\n ]\n );\n\n const hasResolvedCurrentInteraction = Boolean(\n currentInteractionElement?.readonly ||\n currentInteractionElement?.user_input?.trim()\n );\n\n const shouldBlockPlaybackForInteraction =\n Boolean(currentInteractionElement) && !hasResolvedCurrentInteraction;\n\n useEffect(() => {\n return () => {\n clearAutoAdvanceTimer();\n clearPlayerHideTimer();\n clearInteractionAutoCloseTimer();\n };\n }, [\n clearAutoAdvanceTimer,\n clearInteractionAutoCloseTimer,\n clearPlayerHideTimer,\n ]);\n\n useEffect(() => {\n onPlayerVisibilityChange?.(playerVisible);\n\n return () => {\n onPlayerVisibilityChange?.(false);\n };\n }, [onPlayerVisibilityChange, playerVisible]);\n\n useEffect(() => {\n onStepChange?.(currentStepElement, currentIndex);\n }, [currentIndex, currentStepElement, onStepChange]);\n\n useEffect(() => {\n if (!shouldRenderPlayer) {\n clearPlayerHideTimer();\n setIsPlayerVisible(false);\n return;\n }\n\n if (playerAlwaysVisible) {\n clearPlayerHideTimer();\n setIsPlayerVisible(true);\n return;\n }\n\n if (!hasPlayerInteracted) {\n // Keep the initial player visible briefly, then hide it automatically.\n showPlayerControls(true);\n }\n }, [\n clearPlayerHideTimer,\n hasPlayerInteracted,\n playerAlwaysVisible,\n shouldRenderPlayer,\n showPlayerControls,\n ]);\n\n useEffect(() => {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const handleSandboxInteraction = (event: MessageEvent) => {\n if (event.origin !== window.location.origin) {\n return;\n }\n\n if (!isSandboxInteractionMessage(event.data)) {\n return;\n }\n\n if (!shouldRenderPlayer) {\n return;\n }\n\n // Restore player controls without blocking native iframe scrolling.\n setHasPlayerInteracted(true);\n showPlayerControls(true);\n };\n\n window.addEventListener(\"message\", handleSandboxInteraction);\n\n return () => {\n window.removeEventListener(\"message\", handleSandboxInteraction);\n };\n }, [shouldRenderPlayer, showPlayerControls]);\n\n useWakePlayerFromIframe({\n sectionRef,\n enabled: shouldRenderPlayer,\n onWake: () => {\n setHasPlayerInteracted(true);\n showPlayerControls(true);\n },\n });\n\n useEffect(() => {\n resetAudioSequence();\n\n if (currentElementList.length === 0 && !currentInteractionElement) {\n return;\n }\n\n if (shouldBlockPlaybackForInteraction) {\n // Show the interaction gate before playing any follow-up audio.\n setActiveInteractionElement(currentInteractionElement);\n setIsInteractionOverlayOpen(true);\n return;\n }\n\n if (currentInteractionElement) {\n setActiveInteractionElement(currentInteractionElement);\n setIsInteractionOverlayOpen(false);\n }\n\n if (startCurrentAudioSequence()) {\n return;\n }\n\n if (currentStepHasSpeakableElement) {\n setIsAudioLoadingVisible(true);\n return;\n }\n\n if (!canGoNext) {\n return;\n }\n\n // Auto-advance silent marker-only steps so playback flow does not stall.\n autoAdvanceTimerRef.current = window.setTimeout(() => {\n autoAdvanceTimerRef.current = null;\n goNext();\n }, CHECKPOINT_AUTO_ADVANCE_DELAY_MS);\n\n return () => {\n clearAutoAdvanceTimer();\n };\n }, [\n canGoNext,\n clearAutoAdvanceTimer,\n currentElementList.length,\n currentInteractionElement,\n currentPlaybackResetKey,\n currentStepHasSpeakableElement,\n goNext,\n shouldBlockPlaybackForInteraction,\n resetAudioSequence,\n startCurrentAudioSequence,\n ]);\n\n useEffect(() => {\n if (!currentStepHasSpeakableElement || shouldBlockPlaybackForInteraction) {\n setIsAudioLoadingVisible(false);\n return;\n }\n\n if (hasCompletedCurrentStepAudio) {\n setIsAudioLoadingVisible(false);\n return;\n }\n\n if (currentAudioSequenceIndexes.length === 0) {\n setIsAudioLoadingVisible(true);\n }\n }, [\n currentAudioSequenceIndexes.length,\n currentStepHasSpeakableElement,\n hasCompletedCurrentStepAudio,\n shouldBlockPlaybackForInteraction,\n ]);\n\n const interactionDefaults = useMemo(() => {\n if (!activeInteractionElement) {\n return {};\n }\n\n return getInteractionDefaultValues(\n typeof activeInteractionElement.content === \"string\"\n ? activeInteractionElement.content\n : undefined,\n activeInteractionElement.user_input,\n interactionDefaultValueOptions\n );\n }, [activeInteractionElement, interactionDefaultValueOptions]);\n\n const interactionDefaultSelectedValues = useMemo(() => {\n if (!activeInteractionElement) {\n return undefined;\n }\n\n return getInteractionDefaultSelectedValues(\n typeof activeInteractionElement.content === \"string\"\n ? activeInteractionElement.content\n : undefined,\n activeInteractionElement.user_input,\n interactionDefaultValueOptions\n );\n }, [activeInteractionElement, interactionDefaultValueOptions]);\n\n const hasResolvedInteractionInput = Boolean(\n activeInteractionElement?.user_input?.trim()\n );\n\n const isInteractionReadonly =\n Boolean(activeInteractionElement?.readonly) || hasResolvedInteractionInput;\n const shouldAutoContinueInteraction =\n isInteractionReadonly || hasResolvedInteractionInput;\n\n const handleInteractionSend = useCallback(\n (content: OnSendContentParams) => {\n const submittedValues = [\n ...(content.selectedValues ?? []),\n content.inputText?.trim() ?? \"\",\n content.buttonText?.trim() ?? \"\",\n ].filter(Boolean);\n const resolvedUserInput = submittedValues.join(\", \");\n\n setActiveInteractionElement((prevElement) => {\n if (!prevElement || !resolvedUserInput) {\n return prevElement;\n }\n\n return {\n ...prevElement,\n user_input: resolvedUserInput,\n };\n });\n\n onSend?.(content, activeInteractionElement);\n continueAfterInteraction();\n },\n [activeInteractionElement, continueAfterInteraction, onSend]\n );\n\n useEffect(() => {\n clearInteractionAutoCloseTimer();\n\n if (!isInteractionOverlayOpen || !shouldAutoContinueInteraction) {\n return;\n }\n\n // Auto-close passive interaction checkpoints to keep playback moving.\n interactionAutoCloseTimerRef.current = window.setTimeout(() => {\n interactionAutoCloseTimerRef.current = null;\n\n continueAfterInteraction();\n }, 2000);\n\n return () => {\n clearInteractionAutoCloseTimer();\n };\n }, [\n clearInteractionAutoCloseTimer,\n continueAfterInteraction,\n isInteractionOverlayOpen,\n shouldAutoContinueInteraction,\n ]);\n\n const renderSlideElement = (\n element?: Element,\n options: RenderSlideElementOptions = {}\n ) => {\n if (!element) {\n return null;\n }\n\n if (element.type === \"slot\") {\n return <>{element.content}</>;\n }\n\n if (element.type === \"html\") {\n return (\n <IframeSandbox\n className=\"content-render-iframe\"\n hideFullScreen\n mode=\"blackboard\"\n replaceRootScreenHeightWithFull={\n options.replaceRootScreenHeightWithFull\n }\n type=\"sandbox\"\n content={element.content as string}\n />\n );\n }\n\n return (\n <IframeSandbox\n className=\"content-render-iframe\"\n hideFullScreen\n mode=\"blackboard\"\n type=\"markdown\"\n content={element.content as string}\n />\n );\n };\n\n const renderSlideElementList = (\n elementList: Element[] = [],\n isActiveStep = false\n ) => {\n if (elementList.length === 0) {\n return null;\n }\n\n const visibleElementCount = elementList.filter(\n (element) => element.is_renderable !== false\n ).length;\n const lastVisibleElementIndex = elementList.reduce(\n (lastVisibleIndex, element, index) =>\n element.is_renderable !== false ? index : lastVisibleIndex,\n -1\n );\n\n return (\n <div className=\"slide-stage__content flex w-full flex-col gap-4\">\n {elementList.map((element, index) => {\n const isPreRenderedHtml =\n element.type === \"html\" && element.is_renderable === false;\n\n return (\n <div\n key={element.sequence_number ?? `${element.type}-${index}`}\n ref={\n isActiveStep && index === lastVisibleElementIndex\n ? lastElementRef\n : null\n }\n aria-hidden={isPreRenderedHtml || undefined}\n className={cn(\n \"w-full shrink-0\",\n visibleElementCount === 1 &&\n element.is_renderable !== false &&\n \"slide-element--single\",\n isPreRenderedHtml\n ? \"pointer-events-none fixed left-[-200vw] top-0 -z-10 h-[100dvh] w-[100vw] overflow-hidden opacity-0\"\n : element.is_renderable === false && \"hidden\"\n )}\n >\n {renderSlideElement(element, {\n replaceRootScreenHeightWithFull:\n visibleElementCount === 1 &&\n element.type === \"html\" &&\n element.is_renderable !== false,\n })}\n </div>\n );\n })}\n </div>\n );\n };\n\n const handleFullscreen = () => {\n const target = sectionRef.current;\n if (!target) return;\n\n if (document.fullscreenElement) {\n document.exitFullscreen().catch(() => {});\n return;\n }\n\n target.requestFullscreen?.().catch(() => {});\n };\n\n const scrollStageToBottom = useCallback(() => {\n const stageLayerElement = stageLayerRef.current;\n\n if (!stageLayerElement) {\n return;\n }\n\n // Keep the latest content visible after manual player navigation.\n stageLayerElement.scrollTo({\n top: stageLayerElement.scrollHeight,\n behavior: \"smooth\",\n });\n }, []);\n\n const handlePrev = useCallback(() => {\n shouldScrollToBottomRef.current = true;\n setHasPlayerInteracted(true);\n setHasPlaybackInteracted(true);\n setIsAudioLoadingVisible(false);\n showPlayerControls(true);\n resetAudioSequence();\n goPrev();\n }, [goPrev, resetAudioSequence, showPlayerControls]);\n\n const handleNext = useCallback(() => {\n shouldScrollToBottomRef.current = true;\n setHasPlayerInteracted(true);\n setHasPlaybackInteracted(true);\n setIsAudioLoadingVisible(false);\n showPlayerControls(true);\n resetAudioSequence();\n goNext();\n }, [goNext, resetAudioSequence, showPlayerControls]);\n\n const handlePlayerLoadingChange = useCallback(\n (loading: boolean) => {\n if (!currentStepHasSpeakableElement || hasCompletedCurrentStepAudio) {\n setIsAudioLoadingVisible(false);\n return;\n }\n\n setIsAudioLoadingVisible(loading);\n },\n [currentStepHasSpeakableElement, hasCompletedCurrentStepAudio]\n );\n\n const handlePlayerEnded = useCallback(\n (audioIndex: number) => {\n if (currentAudioSequencePosition < 0) {\n return;\n }\n\n if (\n currentAudioSequenceIndexes[currentAudioSequencePosition] !== audioIndex\n ) {\n return;\n }\n\n const nextSequencePosition = currentAudioSequencePosition + 1;\n const nextAudioIndex = currentAudioSequenceIndexes[nextSequencePosition];\n\n if (typeof nextAudioIndex === \"number\") {\n setCurrentAudioSequencePosition(nextSequencePosition);\n setCurrentAudioIndex(nextAudioIndex);\n return;\n }\n\n setCurrentAudioIndex(-1);\n setCurrentAudioSequencePosition(-1);\n setHasCompletedCurrentStepAudio(true);\n setIsAudioLoadingVisible(false);\n\n if (canGoNext) {\n goNext();\n }\n },\n [\n canGoNext,\n currentAudioSequenceIndexes,\n currentAudioSequencePosition,\n goNext,\n ]\n );\n\n const handleInteractionToggle = useCallback(() => {\n if (!activeInteractionElement) {\n return;\n }\n\n setIsInteractionOverlayOpen((prevOpen) => !prevOpen);\n }, [activeInteractionElement]);\n\n const stopOverlayPropagation = useCallback(\n (\n event:\n | React.PointerEvent<HTMLDivElement>\n | React.MouseEvent<HTMLDivElement>\n ) => {\n event.stopPropagation();\n\n // Keep the player visible a bit longer when users interact with the overlay.\n if (playerVisible) {\n showPlayerControls(true);\n }\n },\n [isPlayerVisible, showPlayerControls]\n );\n\n const handleSurfacePointerDown = useCallback(\n (event: React.PointerEvent<HTMLElement>) => {\n onPointerDown?.(event);\n setHasPlayerInteracted(true);\n showPlayerControls(true);\n },\n [onPointerDown, showPlayerControls]\n );\n\n const shouldShowInteractionOverlay =\n Boolean(activeInteractionElement) && isInteractionOverlayOpen;\n const currentRenderElementKeys = useMemo(\n () =>\n currentElementList.map(\n (element, index) =>\n `${element.sequence_number ?? `${element.type}-${index}`}:${String(element.is_new ?? \"\")}`\n ),\n [currentElementList]\n );\n\n useEffect(() => {\n const prevKeys = prevRenderElementKeysRef.current;\n const hasStablePrefix =\n prevKeys.length > 0 &&\n prevKeys.length < currentRenderElementKeys.length &&\n prevKeys.every((key, index) => key === currentRenderElementKeys[index]);\n const appendedElements = hasStablePrefix\n ? currentElementList.slice(prevKeys.length)\n : [];\n const shouldAutoScrollToAppend = appendedElements.some(\n (element) => element.is_new === false\n );\n\n prevRenderElementKeysRef.current = currentRenderElementKeys;\n\n if (!shouldAutoScrollToAppend) {\n return;\n }\n\n const animationFrameId = window.requestAnimationFrame(() => {\n const stageLayerElement = stageLayerRef.current;\n const targetElement = lastElementRef.current;\n\n if (!stageLayerElement || !targetElement) {\n return;\n }\n\n const stageLayerRect = stageLayerElement.getBoundingClientRect();\n const targetRect = targetElement.getBoundingClientRect();\n const nextScrollTop =\n stageLayerElement.scrollTop + (targetRect.top - stageLayerRect.top);\n\n // Keep newly appended content visible when the current slide grows downward.\n stageLayerElement.scrollTo({\n top: Math.max(nextScrollTop, 0),\n behavior: \"smooth\",\n });\n });\n\n return () => {\n window.cancelAnimationFrame(animationFrameId);\n };\n }, [currentElementList, currentRenderElementKeys]);\n\n useEffect(() => {\n if (!shouldScrollToBottomRef.current) {\n return;\n }\n\n shouldScrollToBottomRef.current = false;\n\n if (currentElementList.length === 0) {\n return;\n }\n\n const animationFrameId = window.requestAnimationFrame(() => {\n scrollStageToBottom();\n });\n\n return () => {\n window.cancelAnimationFrame(animationFrameId);\n };\n }, [currentElementList, scrollStageToBottom]);\n\n return (\n <section\n ref={sectionRef}\n className={cn(\"relative h-full w-full\", className)}\n onPointerDown={handleSurfacePointerDown}\n {...props}\n >\n <div\n className={cn(\n \"h-full min-h-0 w-full\",\n isSingleSlide ? \"slide-content--single\" : \"grid gap-4\"\n )}\n >\n {currentElementList.length > 0 ? (\n <div className=\"slide-stage\">\n <div ref={stageLayerRef} className=\"slide-stage__layer w-full\">\n {mountedStepStates.map(\n (mountedStepState, mountedStepStateIndex) => {\n const isActiveStep =\n mountedStepStateIndex === currentMountedStateIndex;\n\n return (\n <div\n key={\n mountedStepState.sourceStepIndexes[0] ??\n mountedStepStateIndex\n }\n aria-hidden={!isActiveStep || undefined}\n className=\"w-full h-full\"\n style={{ display: isActiveStep ? undefined : \"none\" }}\n >\n {renderSlideElementList(\n mountedStepState.elementList,\n isActiveStep\n )}\n </div>\n );\n }\n )}\n </div>\n </div>\n ) : null}\n </div>\n\n {isAudioLoadingVisible ? (\n <div className=\"pointer-events-none absolute left-1/2 top-1/2 z-[3] flex size-28 -translate-x-1/2 -translate-y-1/2 flex-col items-center justify-center gap-2 rounded-2xl bg-foreground/65 px-3 py-4 text-center text-xs leading-4 font-medium text-background shadow-lg backdrop-blur-sm\">\n <LoaderCircle className=\"size-5 animate-spin text-background\" />\n <span>{bufferingText}</span>\n </div>\n ) : null}\n\n {shouldShowInteractionOverlay ? (\n <div\n className={cn(\n \"slide-interaction-overlay\",\n playerVisible && shouldRenderPlayer\n ? \"slide-interaction-overlay--with-player\"\n : \"slide-interaction-overlay--standalone\"\n )}\n onClick={stopOverlayPropagation}\n onPointerDown={stopOverlayPropagation}\n >\n <InteractionOverlayCard\n content={String(activeInteractionElement?.content ?? \"\")}\n defaultButtonText={interactionDefaults.buttonText ?? \"\"}\n defaultInputText={interactionDefaults.inputText ?? \"\"}\n defaultSelectedValues={interactionDefaultSelectedValues}\n confirmButtonText={interactionTexts?.confirmButtonText}\n copyButtonText={interactionTexts?.copyButtonText}\n copiedButtonText={interactionTexts?.copiedButtonText}\n onSend={handleInteractionSend}\n readonly={isInteractionReadonly}\n title={\n interactionTexts?.title ??\n interactionTitle ??\n \"Submit the content below to continue.\"\n }\n />\n </div>\n ) : null}\n\n {shouldRenderPlayer ? (\n <Player\n audioList={audioList}\n className={cn(\n \"absolute left-1/2 bottom-6 z-[2] -translate-x-1/2\",\n playerClassName,\n !playerVisible && \"pointer-events-none opacity-0\"\n )}\n currentAudioIndex={currentAudioIndex}\n defaultPlaying={canAutoPlayAudio}\n hasInteraction={Boolean(activeInteractionElement)}\n isInteractionOpen={isInteractionOverlayOpen}\n onLoadingChange={handlePlayerLoadingChange}\n nextDisabled={!canGoNext}\n onEnded={handlePlayerEnded}\n onFullscreen={handleFullscreen}\n onInteractionToggle={handleInteractionToggle}\n onPlayRequest={() => setHasPlaybackInteracted(true)}\n onNext={handleNext}\n onPrev={handlePrev}\n prevDisabled={!canGoPrev}\n showControls={playerVisible}\n />\n ) : null}\n </section>\n );\n};\n\nexport default Slide;\n"],"names":["CHECKPOINT_AUTO_ADVANCE_DELAY_MS","InteractionOverlayCard","memo","content","title","defaultButtonText","defaultInputText","defaultSelectedValues","confirmButtonText","copyButtonText","copiedButtonText","onSend","readonly","jsxs","jsx","ContentRender","areStepElementListsEqual","prevElementList","nextElementList","element","index","nextElement","Slide","elementList","showPlayer","playerAlwaysVisible","playerClassName","bufferingText","interactionTitle","interactionTexts","playerAutoHideDelay","interactionDefaultValueOptions","onPlayerVisibilityChange","onStepChange","className","onPointerDown","props","sectionRef","useRef","stageLayerRef","lastElementRef","playerHideTimerRef","autoAdvanceTimerRef","interactionAutoCloseTimerRef","prevRenderElementKeysRef","shouldScrollToBottomRef","currentElementList","stepElementLists","slideElementList","currentIndex","audioList","currentAudioSequenceIndexes","currentStepHasSpeakableElement","currentInteractionElement","canGoPrev","canGoNext","goPrev","goNext","useSlide","currentStepElement","useMemo","isSingleSlide","shouldRenderPlayer","isPlayerVisible","setIsPlayerVisible","useState","hasPlayerInteracted","setHasPlayerInteracted","hasPlaybackInteracted","setHasPlaybackInteracted","shouldAutoPlay","hasBrowserUserActivation","canAutoPlayAudio","currentAudioIndex","setCurrentAudioIndex","currentAudioSequencePosition","setCurrentAudioSequencePosition","isAudioLoadingVisible","setIsAudioLoadingVisible","hasCompletedCurrentStepAudio","setHasCompletedCurrentStepAudio","activeInteractionElement","setActiveInteractionElement","isInteractionOverlayOpen","setIsInteractionOverlayOpen","playerVisible","mountedStepStates","currentMountedStateIndex","nextMountedStepStates","mountedStateIndexByStep","stepElementList","stepIndex","existingMountedStateIndex","mountedStepState","currentStepKey","currentAudioSequenceStartKey","currentInteractionResetKey","currentPlaybackResetKey","clearPlayerHideTimer","useCallback","clearInteractionAutoCloseTimer","clearAutoAdvanceTimer","resetAudioSequence","startCurrentAudioSequence","nextAudioIndex","continueAfterInteraction","showPlayerControls","enableAutoHide","hasResolvedCurrentInteraction","shouldBlockPlaybackForInteraction","useEffect","handleSandboxInteraction","event","isSandboxInteractionMessage","useWakePlayerFromIframe","interactionDefaults","getInteractionDefaultValues","interactionDefaultSelectedValues","getInteractionDefaultSelectedValues","hasResolvedInteractionInput","isInteractionReadonly","shouldAutoContinueInteraction","handleInteractionSend","resolvedUserInput","prevElement","renderSlideElement","options","Fragment","IframeSandbox","renderSlideElementList","isActiveStep","visibleElementCount","lastVisibleElementIndex","lastVisibleIndex","isPreRenderedHtml","cn","handleFullscreen","target","scrollStageToBottom","stageLayerElement","handlePrev","handleNext","handlePlayerLoadingChange","loading","handlePlayerEnded","audioIndex","nextSequencePosition","handleInteractionToggle","prevOpen","stopOverlayPropagation","handleSurfacePointerDown","shouldShowInteractionOverlay","currentRenderElementKeys","prevKeys","shouldAutoScrollToAppend","key","animationFrameId","targetElement","stageLayerRect","targetRect","nextScrollTop","mountedStepStateIndex","LoaderCircle","Player"],"mappings":"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"}
|