markdown-flow-ui 0.1.100-beta.13 → 0.1.100-beta.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/hast-util-to-jsx-runtime@2.3.6/node_modules/hast-util-to-jsx-runtime/lib/index.cjs.js +1 -1
  2. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/hast-util-to-jsx-runtime@2.3.6/node_modules/hast-util-to-jsx-runtime/lib/index.es.js +1 -1
  3. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-input@1.8.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-input/es/BaseInput.cjs.js +1 -1
  4. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-input@1.8.0_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-input/es/BaseInput.es.js +1 -1
  5. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/ResizableTextArea.cjs.js +1 -1
  6. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/ResizableTextArea.es.js +1 -1
  7. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/TextArea.cjs.js +1 -1
  8. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/TextArea.es.js +1 -1
  9. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/index.cjs.js +1 -1
  10. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/rc-textarea@1.10.2_react-dom@19.0.1_react@19.0.1__react@19.0.1/node_modules/rc-textarea/es/index.es.js +1 -1
  11. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/unified@11.0.5/node_modules/unified/lib/index.cjs.js +1 -1
  12. package/dist/Documents/ai-shifu/markdown-flow-ui/node_modules/.pnpm/unified@11.0.5/node_modules/unified/lib/index.es.js +1 -1
  13. package/dist/_virtual/index.cjs4.js +1 -1
  14. package/dist/_virtual/index.cjs5.js +1 -1
  15. package/dist/_virtual/index.cjs6.js +1 -1
  16. package/dist/_virtual/index.es4.js +4 -4
  17. package/dist/_virtual/index.es5.js +4 -4
  18. package/dist/_virtual/index.es6.js +5 -5
  19. package/dist/assets/markdown-flow-ui.css +1 -1
  20. package/dist/components/ContentRender/IframeSandbox.cjs.js +4 -4
  21. package/dist/components/ContentRender/IframeSandbox.cjs.js.map +1 -1
  22. package/dist/components/ContentRender/IframeSandbox.d.ts +1 -0
  23. package/dist/components/ContentRender/IframeSandbox.es.js +237 -199
  24. package/dist/components/ContentRender/IframeSandbox.es.js.map +1 -1
  25. package/dist/components/ContentRender/SandboxApp.cjs.js +2 -2
  26. package/dist/components/ContentRender/SandboxApp.cjs.js.map +1 -1
  27. package/dist/components/ContentRender/SandboxApp.d.ts +1 -0
  28. package/dist/components/ContentRender/SandboxApp.es.js +70 -66
  29. package/dist/components/ContentRender/SandboxApp.es.js.map +1 -1
  30. package/dist/components/Slide/Player.cjs.js +1 -1
  31. package/dist/components/Slide/Player.cjs.js.map +1 -1
  32. package/dist/components/Slide/Player.d.ts +1 -0
  33. package/dist/components/Slide/Player.es.js +157 -151
  34. package/dist/components/Slide/Player.es.js.map +1 -1
  35. package/dist/components/Slide/Slide.cjs.js +1 -1
  36. package/dist/components/Slide/Slide.cjs.js.map +1 -1
  37. package/dist/components/Slide/Slide.d.ts +1 -0
  38. package/dist/components/Slide/Slide.es.js +325 -266
  39. package/dist/components/Slide/Slide.es.js.map +1 -1
  40. package/dist/components/Slide/Slide.stories.d.ts +2 -0
  41. package/dist/components/Slide/useSlide.cjs.js +1 -1
  42. package/dist/components/Slide/useSlide.cjs.js.map +1 -1
  43. package/dist/components/Slide/useSlide.d.ts +1 -0
  44. package/dist/components/Slide/useSlide.es.js +109 -87
  45. package/dist/components/Slide/useSlide.es.js.map +1 -1
  46. package/dist/components/ui/inputGroup/textarea.cjs.js +1 -1
  47. package/dist/components/ui/inputGroup/textarea.es.js +1 -1
  48. package/dist/markdown-flow-ui-lib.css +1 -1
  49. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Slide.es.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\";\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\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 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 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 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 [activeInteractionElement, setActiveInteractionElement] = useState<\n Element | undefined\n >();\n const [isInteractionOverlayOpen, setIsInteractionOverlayOpen] =\n useState(false);\n const playerVisible =\n shouldRenderPlayer && (playerAlwaysVisible || isPlayerVisible);\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 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 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 (currentInteractionElement) {\n // Show the interaction gate before playing any follow-up audio.\n setActiveInteractionElement(currentInteractionElement);\n setIsInteractionOverlayOpen(true);\n return;\n }\n\n if (startCurrentAudioSequence()) {\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,\n currentInteractionElement,\n goNext,\n resetAudioSequence,\n startCurrentAudioSequence,\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 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 = (element?: Element) => {\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 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 </div>\n );\n })}\n </div>\n );\n };\n\n const { mountedStepStates, currentMountedStateIndex } = useMemo(() => {\n const nextMountedStepStates: Array<{\n elementList: Element[];\n sourceStepIndexes: number[];\n }> = [];\n const mountedStateIndexByStep = new Map<number, number>();\n\n stepElementLists.forEach((stepElementList, stepIndex) => {\n const existingMountedStateIndex = nextMountedStepStates.findIndex(\n (mountedStepState) =>\n areStepElementListsEqual(\n mountedStepState.elementList,\n stepElementList\n )\n );\n\n if (existingMountedStateIndex >= 0) {\n nextMountedStepStates[\n existingMountedStateIndex\n ]?.sourceStepIndexes.push(stepIndex);\n mountedStateIndexByStep.set(stepIndex, existingMountedStateIndex);\n return;\n }\n\n nextMountedStepStates.push({\n elementList: stepElementList,\n sourceStepIndexes: [stepIndex],\n });\n mountedStateIndexByStep.set(stepIndex, nextMountedStepStates.length - 1);\n });\n\n return {\n mountedStepStates: nextMountedStepStates,\n currentMountedStateIndex:\n currentIndex >= 0\n ? (mountedStateIndexByStep.get(currentIndex) ?? -1)\n : -1,\n };\n }, [currentIndex, stepElementLists]);\n\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 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 showPlayerControls(true);\n resetAudioSequence();\n goNext();\n }, [goNext, resetAudioSequence, showPlayerControls]);\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\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\"\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 {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 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","interactionTitle","interactionTexts","playerAutoHideDelay","interactionDefaultValueOptions","onPlayerVisibilityChange","onStepChange","className","onPointerDown","props","sectionRef","useRef","stageLayerRef","lastElementRef","playerHideTimerRef","autoAdvanceTimerRef","interactionAutoCloseTimerRef","prevRenderElementKeysRef","shouldScrollToBottomRef","currentElementList","stepElementLists","slideElementList","currentIndex","audioList","currentAudioSequenceIndexes","currentInteractionElement","canGoPrev","canGoNext","goPrev","goNext","useSlide","currentStepElement","useMemo","isSingleSlide","shouldRenderPlayer","isPlayerVisible","setIsPlayerVisible","useState","hasPlayerInteracted","setHasPlayerInteracted","hasPlaybackInteracted","setHasPlaybackInteracted","shouldAutoPlay","hasBrowserUserActivation","canAutoPlayAudio","currentAudioIndex","setCurrentAudioIndex","currentAudioSequencePosition","setCurrentAudioSequencePosition","activeInteractionElement","setActiveInteractionElement","isInteractionOverlayOpen","setIsInteractionOverlayOpen","playerVisible","clearPlayerHideTimer","useCallback","clearInteractionAutoCloseTimer","clearAutoAdvanceTimer","resetAudioSequence","startCurrentAudioSequence","nextAudioIndex","continueAfterInteraction","showPlayerControls","enableAutoHide","useEffect","handleSandboxInteraction","event","isSandboxInteractionMessage","useWakePlayerFromIframe","interactionDefaults","getInteractionDefaultValues","interactionDefaultSelectedValues","getInteractionDefaultSelectedValues","hasResolvedInteractionInput","isInteractionReadonly","shouldAutoContinueInteraction","handleInteractionSend","resolvedUserInput","prevElement","renderSlideElement","Fragment","IframeSandbox","renderSlideElementList","isActiveStep","visibleElementCount","lastVisibleElementIndex","lastVisibleIndex","isPreRenderedHtml","cn","mountedStepStates","currentMountedStateIndex","nextMountedStepStates","mountedStateIndexByStep","stepElementList","stepIndex","existingMountedStateIndex","mountedStepState","handleFullscreen","target","scrollStageToBottom","stageLayerElement","handlePrev","handleNext","handlePlayerEnded","audioIndex","nextSequencePosition","handleInteractionToggle","prevOpen","stopOverlayPropagation","handleSurfacePointerDown","shouldShowInteractionOverlay","currentRenderElementKeys","prevKeys","shouldAutoScrollToAppend","key","animationFrameId","targetElement","stageLayerRect","targetRect","nextScrollTop","mountedStepStateIndex","Player"],"mappings":"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"}
1
+ {"version":3,"file":"Slide.es.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 currentAudioSequenceKey = useMemo(\n () => currentAudioSequenceIndexes.join(\",\"),\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 currentMountedStateIndex,\n currentInteractionResetKey,\n currentAudioSequenceKey,\n ].join(\"|\"),\n [\n currentAudioSequenceKey,\n currentInteractionResetKey,\n currentMountedStateIndex,\n ]\n );\n\n const clearPlayerHideTimer = useCallback(() => {\n if (playerHideTimerRef.current === null) {\n return;\n }\n\n window.clearTimeout(playerHideTimerRef.current);\n playerHideTimerRef.current = null;\n }, []);\n\n const clearInteractionAutoCloseTimer = useCallback(() => {\n if (interactionAutoCloseTimerRef.current === null) {\n return;\n }\n\n window.clearTimeout(interactionAutoCloseTimerRef.current);\n interactionAutoCloseTimerRef.current = null;\n }, []);\n\n const 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 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 (currentInteractionElement) {\n // Show the interaction gate before playing any follow-up audio.\n setActiveInteractionElement(currentInteractionElement);\n setIsInteractionOverlayOpen(true);\n return;\n }\n\n if (startCurrentAudioSequence()) {\n return;\n }\n\n if (currentStepHasSpeakableElement) {\n setIsAudioLoadingVisible(true);\n return;\n }\n\n if (!canGoNext) {\n return;\n }\n\n // 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 resetAudioSequence,\n startCurrentAudioSequence,\n ]);\n\n useEffect(() => {\n if (!currentStepHasSpeakableElement || currentInteractionElement) {\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 currentInteractionElement,\n currentStepHasSpeakableElement,\n hasCompletedCurrentStepAudio,\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 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","currentAudioSequenceKey","currentInteractionResetKey","currentPlaybackResetKey","clearPlayerHideTimer","useCallback","clearInteractionAutoCloseTimer","clearAutoAdvanceTimer","resetAudioSequence","startCurrentAudioSequence","nextAudioIndex","continueAfterInteraction","showPlayerControls","enableAutoHide","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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"}
@@ -60,4 +60,6 @@ export declare const FullViewportSlides: Story;
60
60
  export declare const FullViewportSingleSlide: Story;
61
61
  export declare const HiddenMountedHtmlSlides: Story;
62
62
  export declare const StreamingSingleIframeSlide: Story;
63
+ export declare const StreamingSpeakableLoadingOnlySlide: Story;
63
64
  export declare const FullViewportSingleSlideWithSSE: Story;
65
+ export declare const StreamingSpeakableDelayedAudioSlide: Story;
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const u=require("react"),A=require("./diff-utils.cjs.js"),q=t=>t.filter(n=>n.is_marker),y=t=>t.reduce((n,e,r)=>(e.is_marker&&n.push(r),n),[]),m=t=>!!(t?.is_speakable&&(t.audio_url||(t.audio_segments?.length??0)>0)),C=(t=[])=>t.length>0&&!t.some(n=>n.is_final),P=t=>t.reduce((n,e)=>(m(e)&&n.push({sequenceNumber:e.sequence_number,audioUrl:e.audio_url,audioSegments:e.audio_segments,isAudioStreaming:C(e.audio_segments)}),n),[]),R=t=>{const n=new Map;let e=0;return t.forEach((r,i)=>{m(r)&&(n.set(i,e),e+=1)}),n},v=(t,n,e)=>n.reduce((r,i,c)=>{const d=n[c+1]??t.length,a=[];for(let s=i;s<d;s+=1){const l=t[s];if(!m(l))continue;const f=e.get(s);f!=null&&a.push(f)}return r.set(c,a),r},new Map),M=t=>{const n=t.findIndex(e=>e.is_renderable===!0);return n>=0?n:t.findIndex(e=>e.is_renderable!==!1)},h=t=>({...t,is_renderable:!0}),_=(t,n)=>n<0?[]:t.slice(0,n+1).reduce((e,r)=>{if(r.type==="interaction")return e;const i=h(r);return i.type==="diff"?A.applyDiffElement(e,i)??[...e,i]:r.is_new?[i]:e.length===0?[i]:[...e,i]},[]),w=t=>t.map((n,e)=>_(t,e)),N=(t,n)=>t.length===n.length&&t.every((e,r)=>e===n[r]),G=(t=[])=>{const n=u.useRef(t),e=u.useMemo(()=>N(n.current,t)?n.current:(n.current=t,t),[t]),r=u.useMemo(()=>q(e),[e]),i=u.useMemo(()=>y(e),[e]),c=u.useMemo(()=>P(e),[e]),d=u.useMemo(()=>R(e),[e]),a=u.useMemo(()=>v(e,i,d),[d,i,e]),[s,l]=u.useState(()=>M(r));u.useEffect(()=>{l(o=>r.length===0?-1:o>=0&&o<r.length?o:M(r))},[r]);const f=u.useCallback(()=>{l(o=>o<=0?Math.max(o,0):Math.max(o-1,0))},[]),b=u.useCallback(()=>{l(o=>o<0?o:Math.min(o+1,r.length-1))},[r.length]),S=s>0,p=s>=0&&s<r.length-1,g=u.useMemo(()=>{if(s<0)return;const o=r[s];if(o)return h(o)},[s,r]),x=u.useMemo(()=>_(r,s),[s,r]),E=u.useMemo(()=>w(r),[r]),I=u.useMemo(()=>a.get(s)??[],[s,a]),k=u.useMemo(()=>g?.type==="interaction"?g:void 0,[g]);return{currentElementList:x,stepElementLists:E,slideElementList:r,currentIndex:s,audioList:c,currentAudioSequenceIndexes:I,currentInteractionElement:k,canGoPrev:S,canGoNext:p,handlePrev:f,handleNext:b}};exports.default=G;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const o=require("react"),y=require("./diff-utils.cjs.js"),R=e=>e.filter(n=>n.is_marker),C=e=>e.reduce((n,t,r)=>(t.is_marker&&n.push(r),n),[]),m=e=>!!(e?.is_speakable&&(e.audio_url||(e.audio_segments?.length??0)>0)),N=(e=[])=>e.length>0&&!e.some(n=>n.is_final),P=e=>e.reduce((n,t)=>(m(t)&&n.push({sequenceNumber:t.sequence_number,audioUrl:t.audio_url,audioSegments:t.audio_segments,isAudioStreaming:N(t.audio_segments)}),n),[]),v=e=>{const n=new Map;let t=0;return e.forEach((r,s)=>{m(r)&&(n.set(s,t),t+=1)}),n},w=(e,n,t)=>n.reduce((r,s,a)=>{const f=n[a+1]??e.length,d=[];for(let c=s;c<f;c+=1){const i=e[c];if(!m(i))continue;const l=t.get(c);l!=null&&d.push(l)}return r.set(a,d),r},new Map),M=e=>{const n=e.findIndex(t=>t.is_renderable===!0);return n>=0?n:e.findIndex(t=>t.is_renderable!==!1)},h=e=>({...e,is_renderable:!0}),b=(e,n)=>n<0?[]:e.slice(0,n+1).reduce((t,r)=>{if(r.type==="interaction")return t;const s=h(r);return s.type==="diff"?y.applyDiffElement(t,s)??[...t,s]:r.is_new?[s]:t.length===0?[s]:[...t,s]},[]),G=e=>e.map((n,t)=>b(e,t)),H=(e,n,t)=>{if(t<0)return!1;const r=n[t];if(typeof r!="number")return!1;const s=n[t+1]??e.length;for(let a=r;a<s;a+=1)if(e[a]?.is_speakable)return!0;return!1},U=(e,n)=>e.length===n.length&&e.every((t,r)=>t===n[r]),j=(e,n)=>e.length===n.length&&e.every((t,r)=>t===n[r]),B=(e=[])=>{const n=o.useRef(e),t=o.useRef([]),r=o.useMemo(()=>U(n.current,e)?n.current:(n.current=e,e),[e]),s=o.useMemo(()=>R(r),[r]),a=o.useMemo(()=>C(r),[r]),f=o.useMemo(()=>P(r),[r]),d=o.useMemo(()=>v(r),[r]),c=o.useMemo(()=>w(r,a,d),[d,a,r]),[i,l]=o.useState(()=>M(s));o.useEffect(()=>{l(u=>s.length===0?-1:u>=0&&u<s.length?u:M(s))},[s]);const S=o.useCallback(()=>{l(u=>u<=0?Math.max(u,0):Math.max(u-1,0))},[]),p=o.useCallback(()=>{l(u=>u<0?u:Math.min(u+1,s.length-1))},[s.length]),_=i>0,x=i>=0&&i<s.length-1,g=o.useMemo(()=>{if(i<0)return;const u=s[i];if(u)return h(u)},[i,s]),E=o.useMemo(()=>b(s,i),[i,s]),k=o.useMemo(()=>G(s),[s]),A=o.useMemo(()=>{const u=c.get(i)??[];return j(t.current,u)?t.current:(t.current=u,u)},[i,c]),I=o.useMemo(()=>H(r,a,i),[i,a,r]),q=o.useMemo(()=>g?.type==="interaction"?g:void 0,[g]);return{currentElementList:E,stepElementLists:k,slideElementList:s,currentIndex:i,audioList:f,currentAudioSequenceIndexes:A,currentStepHasSpeakableElement:I,currentInteractionElement:q,canGoPrev:_,canGoNext:x,handlePrev:S,handleNext:p}};exports.default=B;
2
2
  //# sourceMappingURL=useSlide.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSlide.cjs.js","sources":["../../../src/components/Slide/useSlide.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { applyDiffElement } from \"./diff-utils\";\nimport type { Element, ElementAudioSegment } from \"./types\";\n\nexport interface SlideAudioItem {\n sequenceNumber?: number;\n audioUrl?: string;\n audioSegments?: ElementAudioSegment[];\n isAudioStreaming?: boolean;\n}\n\nexport interface UseSlideResult {\n currentElementList: Element[];\n stepElementLists: Element[][];\n slideElementList: Element[];\n currentIndex: number;\n audioList: SlideAudioItem[];\n currentAudioSequenceIndexes: number[];\n currentInteractionElement?: Element;\n canGoPrev: boolean;\n canGoNext: boolean;\n handlePrev: () => void;\n handleNext: () => void;\n}\n\nconst getMarkerElementList = (elementList: Element[]) =>\n elementList.filter((element) => element.is_marker);\n\nconst getMarkerElementIndexes = (elementList: Element[]) =>\n elementList.reduce<number[]>((indexes, element, index) => {\n if (element.is_marker) {\n indexes.push(index);\n }\n\n return indexes;\n }, []);\n\nconst hasPlayableAudio = (element?: Element) =>\n Boolean(\n element?.is_speakable &&\n (element.audio_url || (element.audio_segments?.length ?? 0) > 0)\n );\n\nconst isStreamingAudio = (segments: ElementAudioSegment[] = []) =>\n segments.length > 0 && !segments.some((segment) => segment.is_final);\n\nconst getAudioList = (elementList: Element[]) =>\n elementList.reduce<SlideAudioItem[]>((list, element) => {\n if (hasPlayableAudio(element)) {\n list.push({\n sequenceNumber: element.sequence_number,\n audioUrl: element.audio_url,\n audioSegments: element.audio_segments,\n isAudioStreaming: isStreamingAudio(element.audio_segments),\n });\n }\n\n return list;\n }, []);\n\nconst getAudioIndexMap = (elementList: Element[]) => {\n const audioIndexMap = new Map<number, number>();\n let audioIndex = 0;\n\n elementList.forEach((element, index) => {\n if (hasPlayableAudio(element)) {\n audioIndexMap.set(index, audioIndex);\n audioIndex += 1;\n }\n });\n\n return audioIndexMap;\n};\n\nconst getSlideAudioSequenceMap = (\n elementList: Element[],\n markerElementIndexes: number[],\n audioIndexMap: Map<number, number>\n) =>\n markerElementIndexes.reduce<Map<number, number[]>>(\n (sequenceMap, startIndex, slideIndex) => {\n const nextMarkerIndex =\n markerElementIndexes[slideIndex + 1] ?? elementList.length;\n const sequenceIndexes: number[] = [];\n\n for (let index = startIndex; index < nextMarkerIndex; index += 1) {\n const element = elementList[index];\n\n if (!hasPlayableAudio(element)) {\n continue;\n }\n\n const audioIndex = audioIndexMap.get(index);\n\n if (audioIndex == null) {\n continue;\n }\n\n sequenceIndexes.push(audioIndex);\n }\n\n sequenceMap.set(slideIndex, sequenceIndexes);\n return sequenceMap;\n },\n new Map<number, number[]>()\n );\n\nconst getInitialSlideIndex = (slideElementList: Element[]) => {\n const visibleIndex = slideElementList.findIndex(\n (element) => element.is_renderable === true\n );\n\n if (visibleIndex >= 0) {\n return visibleIndex;\n }\n\n return slideElementList.findIndex(\n (element) => element.is_renderable !== false\n );\n};\n\nconst getVisibleElement = (element: Element): Element => ({\n ...element,\n is_renderable: true,\n});\n\nconst getCurrentElementList = (\n slideElementList: Element[],\n currentIndex: number\n) => {\n if (currentIndex < 0) {\n return [];\n }\n\n return slideElementList\n .slice(0, currentIndex + 1)\n .reduce<Element[]>((currentList, element) => {\n if (element.type === \"interaction\") {\n return currentList;\n }\n\n const visibleElement = getVisibleElement(element);\n\n if (visibleElement.type === \"diff\") {\n const nextList = applyDiffElement(currentList, visibleElement);\n\n return nextList ?? [...currentList, visibleElement];\n }\n\n if (element.is_new) {\n return [visibleElement];\n }\n\n if (currentList.length === 0) {\n return [visibleElement];\n }\n\n return [...currentList, visibleElement];\n }, []);\n};\n\nconst getStepElementLists = (slideElementList: Element[]) =>\n slideElementList.map((_, index) =>\n getCurrentElementList(slideElementList, index)\n );\n\nconst hasSameElementReferences = (\n prevElementList: Element[],\n nextElementList: Element[]\n) =>\n prevElementList.length === nextElementList.length &&\n prevElementList.every((element, index) => element === nextElementList[index]);\n\nconst useSlide = (elementList: Element[] = []): UseSlideResult => {\n const stableElementListRef = useRef(elementList);\n const stableElementList = useMemo(() => {\n if (hasSameElementReferences(stableElementListRef.current, elementList)) {\n return stableElementListRef.current;\n }\n\n // Reuse the previous wrapper array when the element references are unchanged.\n stableElementListRef.current = elementList;\n return elementList;\n }, [elementList]);\n const slideElementList = useMemo(\n () => getMarkerElementList(stableElementList),\n [stableElementList]\n );\n const markerElementIndexes = useMemo(\n () => getMarkerElementIndexes(stableElementList),\n [stableElementList]\n );\n const audioList = useMemo(\n () => getAudioList(stableElementList),\n [stableElementList]\n );\n const audioIndexMap = useMemo(\n () => getAudioIndexMap(stableElementList),\n [stableElementList]\n );\n const slideAudioSequenceMap = useMemo(\n () =>\n getSlideAudioSequenceMap(\n stableElementList,\n markerElementIndexes,\n audioIndexMap\n ),\n [audioIndexMap, markerElementIndexes, stableElementList]\n );\n const [currentIndex, setCurrentIndex] = useState(() =>\n getInitialSlideIndex(slideElementList)\n );\n\n useEffect(() => {\n setCurrentIndex((prevIndex) => {\n if (slideElementList.length === 0) {\n return -1;\n }\n\n if (prevIndex >= 0 && prevIndex < slideElementList.length) {\n return prevIndex;\n }\n\n return getInitialSlideIndex(slideElementList);\n });\n }, [slideElementList]);\n\n const handlePrev = useCallback(() => {\n setCurrentIndex((prevIndex) => {\n if (prevIndex <= 0) {\n return Math.max(prevIndex, 0);\n }\n\n return Math.max(prevIndex - 1, 0);\n });\n }, []);\n\n const handleNext = useCallback(() => {\n setCurrentIndex((prevIndex) => {\n if (prevIndex < 0) {\n return prevIndex;\n }\n\n return Math.min(prevIndex + 1, slideElementList.length - 1);\n });\n }, [slideElementList.length]);\n\n const canGoPrev = currentIndex > 0;\n const canGoNext =\n currentIndex >= 0 && currentIndex < slideElementList.length - 1;\n const currentStepElement = useMemo(() => {\n if (currentIndex < 0) {\n return undefined;\n }\n\n const element = slideElementList[currentIndex];\n\n if (!element) {\n return undefined;\n }\n\n return getVisibleElement(element);\n }, [currentIndex, slideElementList]);\n const currentElementList = useMemo(\n () => getCurrentElementList(slideElementList, currentIndex),\n [currentIndex, slideElementList]\n );\n const stepElementLists = useMemo(\n () => getStepElementLists(slideElementList),\n [slideElementList]\n );\n const currentAudioSequenceIndexes = useMemo(\n () => slideAudioSequenceMap.get(currentIndex) ?? [],\n [currentIndex, slideAudioSequenceMap]\n );\n const currentInteractionElement = useMemo(\n () =>\n currentStepElement?.type === \"interaction\"\n ? currentStepElement\n : undefined,\n [currentStepElement]\n );\n\n return {\n currentElementList,\n stepElementLists,\n slideElementList,\n currentIndex,\n audioList,\n currentAudioSequenceIndexes,\n currentInteractionElement,\n canGoPrev,\n canGoNext,\n handlePrev,\n handleNext,\n };\n};\n\nexport default useSlide;\n"],"names":["getMarkerElementList","elementList","element","getMarkerElementIndexes","indexes","index","hasPlayableAudio","isStreamingAudio","segments","segment","getAudioList","list","getAudioIndexMap","audioIndexMap","audioIndex","getSlideAudioSequenceMap","markerElementIndexes","sequenceMap","startIndex","slideIndex","nextMarkerIndex","sequenceIndexes","getInitialSlideIndex","slideElementList","visibleIndex","getVisibleElement","getCurrentElementList","currentIndex","currentList","visibleElement","applyDiffElement","getStepElementLists","_","hasSameElementReferences","prevElementList","nextElementList","useSlide","stableElementListRef","useRef","stableElementList","useMemo","audioList","slideAudioSequenceMap","setCurrentIndex","useState","useEffect","prevIndex","handlePrev","useCallback","handleNext","canGoPrev","canGoNext","currentStepElement","currentElementList","stepElementLists","currentAudioSequenceIndexes","currentInteractionElement"],"mappings":"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"}
1
+ {"version":3,"file":"useSlide.cjs.js","sources":["../../../src/components/Slide/useSlide.ts"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { applyDiffElement } from \"./diff-utils\";\nimport type { Element, ElementAudioSegment } from \"./types\";\n\nexport interface SlideAudioItem {\n sequenceNumber?: number;\n audioUrl?: string;\n audioSegments?: ElementAudioSegment[];\n isAudioStreaming?: boolean;\n}\n\nexport interface UseSlideResult {\n currentElementList: Element[];\n stepElementLists: Element[][];\n slideElementList: Element[];\n currentIndex: number;\n audioList: SlideAudioItem[];\n currentAudioSequenceIndexes: number[];\n currentStepHasSpeakableElement: boolean;\n currentInteractionElement?: Element;\n canGoPrev: boolean;\n canGoNext: boolean;\n handlePrev: () => void;\n handleNext: () => void;\n}\n\nconst getMarkerElementList = (elementList: Element[]) =>\n elementList.filter((element) => element.is_marker);\n\nconst getMarkerElementIndexes = (elementList: Element[]) =>\n elementList.reduce<number[]>((indexes, element, index) => {\n if (element.is_marker) {\n indexes.push(index);\n }\n\n return indexes;\n }, []);\n\nconst hasPlayableAudio = (element?: Element) =>\n Boolean(\n element?.is_speakable &&\n (element.audio_url || (element.audio_segments?.length ?? 0) > 0)\n );\n\nconst isStreamingAudio = (segments: ElementAudioSegment[] = []) =>\n segments.length > 0 && !segments.some((segment) => segment.is_final);\n\nconst getAudioList = (elementList: Element[]) =>\n elementList.reduce<SlideAudioItem[]>((list, element) => {\n if (hasPlayableAudio(element)) {\n list.push({\n sequenceNumber: element.sequence_number,\n audioUrl: element.audio_url,\n audioSegments: element.audio_segments,\n isAudioStreaming: isStreamingAudio(element.audio_segments),\n });\n }\n\n return list;\n }, []);\n\nconst getAudioIndexMap = (elementList: Element[]) => {\n const audioIndexMap = new Map<number, number>();\n let audioIndex = 0;\n\n elementList.forEach((element, index) => {\n if (hasPlayableAudio(element)) {\n audioIndexMap.set(index, audioIndex);\n audioIndex += 1;\n }\n });\n\n return audioIndexMap;\n};\n\nconst getSlideAudioSequenceMap = (\n elementList: Element[],\n markerElementIndexes: number[],\n audioIndexMap: Map<number, number>\n) =>\n markerElementIndexes.reduce<Map<number, number[]>>(\n (sequenceMap, startIndex, slideIndex) => {\n const nextMarkerIndex =\n markerElementIndexes[slideIndex + 1] ?? elementList.length;\n const sequenceIndexes: number[] = [];\n\n for (let index = startIndex; index < nextMarkerIndex; index += 1) {\n const element = elementList[index];\n\n if (!hasPlayableAudio(element)) {\n continue;\n }\n\n const audioIndex = audioIndexMap.get(index);\n\n if (audioIndex == null) {\n continue;\n }\n\n sequenceIndexes.push(audioIndex);\n }\n\n sequenceMap.set(slideIndex, sequenceIndexes);\n return sequenceMap;\n },\n new Map<number, number[]>()\n );\n\nconst getInitialSlideIndex = (slideElementList: Element[]) => {\n const visibleIndex = slideElementList.findIndex(\n (element) => element.is_renderable === true\n );\n\n if (visibleIndex >= 0) {\n return visibleIndex;\n }\n\n return slideElementList.findIndex(\n (element) => element.is_renderable !== false\n );\n};\n\nconst getVisibleElement = (element: Element): Element => ({\n ...element,\n is_renderable: true,\n});\n\nconst getCurrentElementList = (\n slideElementList: Element[],\n currentIndex: number\n) => {\n if (currentIndex < 0) {\n return [];\n }\n\n return slideElementList\n .slice(0, currentIndex + 1)\n .reduce<Element[]>((currentList, element) => {\n if (element.type === \"interaction\") {\n return currentList;\n }\n\n const visibleElement = getVisibleElement(element);\n\n if (visibleElement.type === \"diff\") {\n const nextList = applyDiffElement(currentList, visibleElement);\n\n return nextList ?? [...currentList, visibleElement];\n }\n\n if (element.is_new) {\n return [visibleElement];\n }\n\n if (currentList.length === 0) {\n return [visibleElement];\n }\n\n return [...currentList, visibleElement];\n }, []);\n};\n\nconst getStepElementLists = (slideElementList: Element[]) =>\n slideElementList.map((_, index) =>\n getCurrentElementList(slideElementList, index)\n );\n\nconst getStepHasSpeakableElement = (\n elementList: Element[],\n markerElementIndexes: number[],\n currentIndex: number\n) => {\n if (currentIndex < 0) {\n return false;\n }\n\n const startIndex = markerElementIndexes[currentIndex];\n\n if (typeof startIndex !== \"number\") {\n return false;\n }\n\n const nextMarkerIndex =\n markerElementIndexes[currentIndex + 1] ?? elementList.length;\n\n for (let index = startIndex; index < nextMarkerIndex; index += 1) {\n if (elementList[index]?.is_speakable) {\n return true;\n }\n }\n\n return false;\n};\n\nconst hasSameElementReferences = (\n prevElementList: Element[],\n nextElementList: Element[]\n) =>\n prevElementList.length === nextElementList.length &&\n prevElementList.every((element, index) => element === nextElementList[index]);\n\nconst hasSameNumberValues = (prevValues: number[], nextValues: number[]) =>\n prevValues.length === nextValues.length &&\n prevValues.every((value, index) => value === nextValues[index]);\n\nconst useSlide = (elementList: Element[] = []): UseSlideResult => {\n const stableElementListRef = useRef(elementList);\n const stableCurrentAudioSequenceIndexesRef = useRef<number[]>([]);\n const stableElementList = useMemo(() => {\n if (hasSameElementReferences(stableElementListRef.current, elementList)) {\n return stableElementListRef.current;\n }\n\n // Reuse the previous wrapper array when the element references are unchanged.\n stableElementListRef.current = elementList;\n return elementList;\n }, [elementList]);\n const slideElementList = useMemo(\n () => getMarkerElementList(stableElementList),\n [stableElementList]\n );\n const markerElementIndexes = useMemo(\n () => getMarkerElementIndexes(stableElementList),\n [stableElementList]\n );\n const audioList = useMemo(\n () => getAudioList(stableElementList),\n [stableElementList]\n );\n const audioIndexMap = useMemo(\n () => getAudioIndexMap(stableElementList),\n [stableElementList]\n );\n const slideAudioSequenceMap = useMemo(\n () =>\n getSlideAudioSequenceMap(\n stableElementList,\n markerElementIndexes,\n audioIndexMap\n ),\n [audioIndexMap, markerElementIndexes, stableElementList]\n );\n const [currentIndex, setCurrentIndex] = useState(() =>\n getInitialSlideIndex(slideElementList)\n );\n\n useEffect(() => {\n setCurrentIndex((prevIndex) => {\n if (slideElementList.length === 0) {\n return -1;\n }\n\n if (prevIndex >= 0 && prevIndex < slideElementList.length) {\n return prevIndex;\n }\n\n return getInitialSlideIndex(slideElementList);\n });\n }, [slideElementList]);\n\n const handlePrev = useCallback(() => {\n setCurrentIndex((prevIndex) => {\n if (prevIndex <= 0) {\n return Math.max(prevIndex, 0);\n }\n\n return Math.max(prevIndex - 1, 0);\n });\n }, []);\n\n const handleNext = useCallback(() => {\n setCurrentIndex((prevIndex) => {\n if (prevIndex < 0) {\n return prevIndex;\n }\n\n return Math.min(prevIndex + 1, slideElementList.length - 1);\n });\n }, [slideElementList.length]);\n\n const canGoPrev = currentIndex > 0;\n const canGoNext =\n currentIndex >= 0 && currentIndex < slideElementList.length - 1;\n const currentStepElement = useMemo(() => {\n if (currentIndex < 0) {\n return undefined;\n }\n\n const element = slideElementList[currentIndex];\n\n if (!element) {\n return undefined;\n }\n\n return getVisibleElement(element);\n }, [currentIndex, slideElementList]);\n const currentElementList = useMemo(\n () => getCurrentElementList(slideElementList, currentIndex),\n [currentIndex, slideElementList]\n );\n const stepElementLists = useMemo(\n () => getStepElementLists(slideElementList),\n [slideElementList]\n );\n const currentAudioSequenceIndexes = useMemo(() => {\n const nextAudioSequenceIndexes =\n slideAudioSequenceMap.get(currentIndex) ?? [];\n\n if (\n hasSameNumberValues(\n stableCurrentAudioSequenceIndexesRef.current,\n nextAudioSequenceIndexes\n )\n ) {\n return stableCurrentAudioSequenceIndexesRef.current;\n }\n\n stableCurrentAudioSequenceIndexesRef.current = nextAudioSequenceIndexes;\n\n return nextAudioSequenceIndexes;\n }, [currentIndex, slideAudioSequenceMap]);\n const currentStepHasSpeakableElement = useMemo(\n () =>\n getStepHasSpeakableElement(\n stableElementList,\n markerElementIndexes,\n currentIndex\n ),\n [currentIndex, markerElementIndexes, stableElementList]\n );\n const currentInteractionElement = useMemo(\n () =>\n currentStepElement?.type === \"interaction\"\n ? currentStepElement\n : undefined,\n [currentStepElement]\n );\n\n return {\n currentElementList,\n stepElementLists,\n slideElementList,\n currentIndex,\n audioList,\n currentAudioSequenceIndexes,\n currentStepHasSpeakableElement,\n currentInteractionElement,\n canGoPrev,\n canGoNext,\n handlePrev,\n handleNext,\n };\n};\n\nexport default useSlide;\n"],"names":["getMarkerElementList","elementList","element","getMarkerElementIndexes","indexes","index","hasPlayableAudio","isStreamingAudio","segments","segment","getAudioList","list","getAudioIndexMap","audioIndexMap","audioIndex","getSlideAudioSequenceMap","markerElementIndexes","sequenceMap","startIndex","slideIndex","nextMarkerIndex","sequenceIndexes","getInitialSlideIndex","slideElementList","visibleIndex","getVisibleElement","getCurrentElementList","currentIndex","currentList","visibleElement","applyDiffElement","getStepElementLists","_","getStepHasSpeakableElement","hasSameElementReferences","prevElementList","nextElementList","hasSameNumberValues","prevValues","nextValues","value","useSlide","stableElementListRef","useRef","stableCurrentAudioSequenceIndexesRef","stableElementList","useMemo","audioList","slideAudioSequenceMap","setCurrentIndex","useState","useEffect","prevIndex","handlePrev","useCallback","handleNext","canGoPrev","canGoNext","currentStepElement","currentElementList","stepElementLists","currentAudioSequenceIndexes","nextAudioSequenceIndexes","currentStepHasSpeakableElement","currentInteractionElement"],"mappings":"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"}
@@ -12,6 +12,7 @@ export interface UseSlideResult {
12
12
  currentIndex: number;
13
13
  audioList: SlideAudioItem[];
14
14
  currentAudioSequenceIndexes: number[];
15
+ currentStepHasSpeakableElement: boolean;
15
16
  currentInteractionElement?: Element;
16
17
  canGoPrev: boolean;
17
18
  canGoNext: boolean;
@@ -1,110 +1,132 @@
1
- import { useRef as y, useMemo as i, useState as q, useEffect as w, useCallback as m } from "react";
2
- import { applyDiffElement as C } from "./diff-utils.es.js";
3
- const N = (t) => t.filter((n) => n.is_marker), P = (t) => t.reduce((n, e, r) => (e.is_marker && n.push(r), n), []), h = (t) => !!(t?.is_speakable && (t.audio_url || (t.audio_segments?.length ?? 0) > 0)), R = (t = []) => t.length > 0 && !t.some((n) => n.is_final), G = (t) => t.reduce((n, e) => (h(e) && n.push({
4
- sequenceNumber: e.sequence_number,
5
- audioUrl: e.audio_url,
6
- audioSegments: e.audio_segments,
7
- isAudioStreaming: R(e.audio_segments)
8
- }), n), []), v = (t) => {
1
+ import { useRef as m, useMemo as a, useState as N, useEffect as R, useCallback as p } from "react";
2
+ import { applyDiffElement as w } from "./diff-utils.es.js";
3
+ const P = (e) => e.filter((n) => n.is_marker), G = (e) => e.reduce((n, t, r) => (t.is_marker && n.push(r), n), []), h = (e) => !!(e?.is_speakable && (e.audio_url || (e.audio_segments?.length ?? 0) > 0)), H = (e = []) => e.length > 0 && !e.some((n) => n.is_final), v = (e) => e.reduce((n, t) => (h(t) && n.push({
4
+ sequenceNumber: t.sequence_number,
5
+ audioUrl: t.audio_url,
6
+ audioSegments: t.audio_segments,
7
+ isAudioStreaming: H(t.audio_segments)
8
+ }), n), []), B = (e) => {
9
9
  const n = /* @__PURE__ */ new Map();
10
- let e = 0;
11
- return t.forEach((r, u) => {
12
- h(r) && (n.set(u, e), e += 1);
10
+ let t = 0;
11
+ return e.forEach((r, s) => {
12
+ h(r) && (n.set(s, t), t += 1);
13
13
  }), n;
14
- }, B = (t, n, e) => n.reduce(
15
- (r, u, c) => {
16
- const l = n[c + 1] ?? t.length, a = [];
17
- for (let s = u; s < l; s += 1) {
18
- const d = t[s];
19
- if (!h(d))
14
+ }, D = (e, n, t) => n.reduce(
15
+ (r, s, i) => {
16
+ const f = n[i + 1] ?? e.length, d = [];
17
+ for (let c = s; c < f; c += 1) {
18
+ const o = e[c];
19
+ if (!h(o))
20
20
  continue;
21
- const f = e.get(s);
22
- f != null && a.push(f);
21
+ const l = t.get(c);
22
+ l != null && d.push(l);
23
23
  }
24
- return r.set(c, a), r;
24
+ return r.set(i, d), r;
25
25
  },
26
26
  /* @__PURE__ */ new Map()
27
- ), p = (t) => {
28
- const n = t.findIndex(
29
- (e) => e.is_renderable === !0
27
+ ), S = (e) => {
28
+ const n = e.findIndex(
29
+ (t) => t.is_renderable === !0
30
30
  );
31
- return n >= 0 ? n : t.findIndex(
32
- (e) => e.is_renderable !== !1
31
+ return n >= 0 ? n : e.findIndex(
32
+ (t) => t.is_renderable !== !1
33
33
  );
34
- }, _ = (t) => ({
35
- ...t,
34
+ }, b = (e) => ({
35
+ ...e,
36
36
  is_renderable: !0
37
- }), x = (t, n) => n < 0 ? [] : t.slice(0, n + 1).reduce((e, r) => {
37
+ }), x = (e, n) => n < 0 ? [] : e.slice(0, n + 1).reduce((t, r) => {
38
38
  if (r.type === "interaction")
39
- return e;
40
- const u = _(r);
41
- return u.type === "diff" ? C(e, u) ?? [...e, u] : r.is_new ? [u] : e.length === 0 ? [u] : [...e, u];
42
- }, []), D = (t) => t.map(
43
- (n, e) => x(t, e)
44
- ), U = (t, n) => t.length === n.length && t.every((e, r) => e === n[r]), z = (t = []) => {
45
- const n = y(t), e = i(() => U(n.current, t) ? n.current : (n.current = t, t), [t]), r = i(
46
- () => N(e),
47
- [e]
48
- ), u = i(
49
- () => P(e),
50
- [e]
51
- ), c = i(
52
- () => G(e),
53
- [e]
54
- ), l = i(
55
- () => v(e),
56
- [e]
57
- ), a = i(
58
- () => B(
59
- e,
60
- u,
61
- l
39
+ return t;
40
+ const s = b(r);
41
+ return s.type === "diff" ? w(t, s) ?? [...t, s] : r.is_new ? [s] : t.length === 0 ? [s] : [...t, s];
42
+ }, []), U = (e) => e.map(
43
+ (n, t) => x(e, t)
44
+ ), j = (e, n, t) => {
45
+ if (t < 0)
46
+ return !1;
47
+ const r = n[t];
48
+ if (typeof r != "number")
49
+ return !1;
50
+ const s = n[t + 1] ?? e.length;
51
+ for (let i = r; i < s; i += 1)
52
+ if (e[i]?.is_speakable)
53
+ return !0;
54
+ return !1;
55
+ }, z = (e, n) => e.length === n.length && e.every((t, r) => t === n[r]), F = (e, n) => e.length === n.length && e.every((t, r) => t === n[r]), O = (e = []) => {
56
+ const n = m(e), t = m([]), r = a(() => z(n.current, e) ? n.current : (n.current = e, e), [e]), s = a(
57
+ () => P(r),
58
+ [r]
59
+ ), i = a(
60
+ () => G(r),
61
+ [r]
62
+ ), f = a(
63
+ () => v(r),
64
+ [r]
65
+ ), d = a(
66
+ () => B(r),
67
+ [r]
68
+ ), c = a(
69
+ () => D(
70
+ r,
71
+ i,
72
+ d
62
73
  ),
63
- [l, u, e]
64
- ), [s, d] = q(
65
- () => p(r)
74
+ [d, i, r]
75
+ ), [o, l] = N(
76
+ () => S(s)
66
77
  );
67
- w(() => {
68
- d((o) => r.length === 0 ? -1 : o >= 0 && o < r.length ? o : p(r));
69
- }, [r]);
70
- const f = m(() => {
71
- d((o) => o <= 0 ? Math.max(o, 0) : Math.max(o - 1, 0));
72
- }, []), b = m(() => {
73
- d((o) => o < 0 ? o : Math.min(o + 1, r.length - 1));
74
- }, [r.length]), E = s > 0, M = s >= 0 && s < r.length - 1, g = i(() => {
75
- if (s < 0)
78
+ R(() => {
79
+ l((u) => s.length === 0 ? -1 : u >= 0 && u < s.length ? u : S(s));
80
+ }, [s]);
81
+ const _ = p(() => {
82
+ l((u) => u <= 0 ? Math.max(u, 0) : Math.max(u - 1, 0));
83
+ }, []), E = p(() => {
84
+ l((u) => u < 0 ? u : Math.min(u + 1, s.length - 1));
85
+ }, [s.length]), M = o > 0, k = o >= 0 && o < s.length - 1, g = a(() => {
86
+ if (o < 0)
76
87
  return;
77
- const o = r[s];
78
- if (o)
79
- return _(o);
80
- }, [s, r]), S = i(
81
- () => x(r, s),
82
- [s, r]
83
- ), I = i(
84
- () => D(r),
85
- [r]
86
- ), A = i(
87
- () => a.get(s) ?? [],
88
- [s, a]
89
- ), k = i(
88
+ const u = s[o];
89
+ if (u)
90
+ return b(u);
91
+ }, [o, s]), A = a(
92
+ () => x(s, o),
93
+ [o, s]
94
+ ), I = a(
95
+ () => U(s),
96
+ [s]
97
+ ), y = a(() => {
98
+ const u = c.get(o) ?? [];
99
+ return F(
100
+ t.current,
101
+ u
102
+ ) ? t.current : (t.current = u, u);
103
+ }, [o, c]), q = a(
104
+ () => j(
105
+ r,
106
+ i,
107
+ o
108
+ ),
109
+ [o, i, r]
110
+ ), C = a(
90
111
  () => g?.type === "interaction" ? g : void 0,
91
112
  [g]
92
113
  );
93
114
  return {
94
- currentElementList: S,
115
+ currentElementList: A,
95
116
  stepElementLists: I,
96
- slideElementList: r,
97
- currentIndex: s,
98
- audioList: c,
99
- currentAudioSequenceIndexes: A,
100
- currentInteractionElement: k,
101
- canGoPrev: E,
102
- canGoNext: M,
103
- handlePrev: f,
104
- handleNext: b
117
+ slideElementList: s,
118
+ currentIndex: o,
119
+ audioList: f,
120
+ currentAudioSequenceIndexes: y,
121
+ currentStepHasSpeakableElement: q,
122
+ currentInteractionElement: C,
123
+ canGoPrev: M,
124
+ canGoNext: k,
125
+ handlePrev: _,
126
+ handleNext: E
105
127
  };
106
128
  };
107
129
  export {
108
- z as default
130
+ O as default
109
131
  };
110
132
  //# sourceMappingURL=useSlide.es.js.map