{"version":3,"file":"static/chunks/8174-fe299bffe51e8a13.js","mappings":"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","sources":["webpack://_N_E/../../libs/osc/video-player/src/lib/hooks/use-autoplay.ts","webpack://_N_E/../../libs/osc/video-player/src/lib/util/add-track.ts","webpack://_N_E/../../libs/osc/video-player/src/lib/hooks/use-track-query.ts","webpack://_N_E/../../libs/osc/video-player/src/lib/hooks/use-fade-controls.ts","webpack://_N_E/../../libs/osc/video-player/src/lib/util/matchers.ts","webpack://_N_E/../../libs/osc/video-player/src/lib/util/metrics.ts","webpack://_N_E/../../libs/osc/video-player/src/lib/util/classes.ts","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.volume-slider.tsx","webpack://_N_E/../../libs/osc/video-player/src/lib/hooks/use-control-menu.ts","webpack://_N_E/../../libs/osc/video-player/src/lib/util/cue.ts","webpack://_N_E/../../libs/osc/video-player/src/lib/util/event-emitter.ts","webpack://_N_E/../../libs/osc/video-player/src/lib/hooks/use-video-player.tsx","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.player.tsx","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.control-button.tsx","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.control-icon.tsx","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.control-menu.tsx","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.control-list.tsx","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.control-item.tsx","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.settings-menu.tsx","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.controls.tsx","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.captions.tsx","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.transcripts.tsx","webpack://_N_E/../../libs/osc/video-player/src/lib/hooks/use-video-player-classnames.ts","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.markup.tsx","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.tsx","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.mapper.ts","webpack://_N_E/../../libs/osc/video-player/src/lib/index.ts","webpack://_N_E/../../libs/osc/video-player/src/index.ts","webpack://_N_E/../../libs/osc/brand-buttons/src/lib/brand-icon.tsx","webpack://_N_E/../../libs/osc/brand-buttons/src/lib/util/button.ts","webpack://_N_E/../../libs/osc/brand-buttons/src/lib/brand-link.tsx","webpack://_N_E/../../libs/osc/brand-buttons/src/lib/brand-button.tsx","webpack://_N_E/../../libs/osc/brand-buttons/src/lib/index.ts","webpack://_N_E/../../libs/osc/brand-buttons/src/index.ts","webpack://_N_E/../../libs/osc/slider/src/lib/use-inline-gradient.tsx","webpack://_N_E/../../libs/osc/slider/src/lib/use-resize-observer.tsx","webpack://_N_E/../../libs/osc/slider/src/lib/thumb-labels.tsx","webpack://_N_E/../../libs/osc/slider/src/lib/slider.tsx","webpack://_N_E/../../libs/osc/slider/src/lib/index.ts","webpack://_N_E/../../libs/osc/slider/src/index.ts","webpack://_N_E/../../libs/osc/caption/src/lib/caption.tsx","webpack://_N_E/../../libs/osc/caption/src/lib/index.ts","webpack://_N_E/../../libs/osc/caption/src/index.ts","webpack://_N_E/../../libs/osc/video-player/src/lib/video-player.css"],"sourcesContent":["import { useIsClient } from 'usehooks-ts';\nimport { getIsReducedMotion } from '@dx-ui/utilities-accessibility';\n\ntype UseAutoPlayOptions = { isAutoPlay: boolean };\n\nexport function useAutoPlay({ isAutoPlay = true }: UseAutoPlayOptions = { isAutoPlay: true }) {\n const isClient = useIsClient();\n const isReducedMotion = getIsReducedMotion();\n return isClient && isAutoPlay && !isReducedMotion;\n}\n","import { logWarning } from '@dx-ui/framework-logger';\nimport type { Track } from '../video-player.controls';\n\n/**\n * Asynchronously adds a track element to a video element for closed captions.\n *\n * - This is done imperatively vs declaratively so the cues are available when the VTT is loaded.\n * - The track element is hidden by default so the native captions do not display.\n */\nexport async function addTrackAsync(\n videoElement: HTMLVideoElement,\n track: Track\n): Promise<HTMLTrackElement | null> {\n const trackElement = document.createElement('track');\n trackElement.id = getTrackId(track);\n trackElement.label = track.label;\n trackElement.srclang = track.language;\n trackElement.kind = 'metadata';\n trackElement.track.mode = 'hidden';\n trackElement.dataset.type = track.type;\n videoElement.append(trackElement);\n\n return new Promise((resolve) => {\n trackElement.onload = () => {\n resolve(trackElement);\n };\n trackElement.onerror = () => {\n logWarning(\n 'OSCVideoPlayer',\n new Error('track onerror'),\n `Failed to fetch track ${track.url}`\n );\n videoElement.removeChild(trackElement);\n resolve(null);\n };\n trackElement.src = track.url;\n });\n}\n\nfunction getTrackId(track: Track) {\n return [track.language, track.label, track.url].filter(Boolean).join('-').toLowerCase();\n}\n","import { useId, useMemo } from 'react';\nimport { useQuery } from '@tanstack/react-query';\nimport { addTrackAsync } from '../util/add-track';\nimport { logWarning } from '@dx-ui/framework-logger';\n\nimport type { VideoPlayerProps } from './use-video-player';\nimport type { VideoTrack } from '../video-player.controls';\n\ntype UseTrackQueryOptions = VideoPlayerProps & {\n videoElement: React.RefObject<HTMLVideoElement>;\n};\n\n/**\n * Hook that asynchronously fetches and adds tracks to the video element.\n *\n * @see addTrackAsync\n */\nexport function useTrackQuery(options: UseTrackQueryOptions) {\n const id = useId();\n const videoElement = options.videoElement.current;\n const hasCaptions = Boolean(options.captionTracks?.length);\n const hasTranscripts = Boolean(options.transcriptTracks?.length);\n const hasAudioTracks = Boolean(options.audioTracks?.length);\n const hasTracks = hasCaptions || hasTranscripts || hasAudioTracks;\n const { defaultVideoTrack, baseVideoTrack } = useBaseTracks(options);\n const allTracks = useMemo(() => getFetchableTracks(options), [options]);\n\n const { data: videoTracks = [defaultVideoTrack] } = useQuery({\n enabled: Boolean(hasTracks && videoElement),\n queryKey: [`video:${id}`],\n queryFn: async () => {\n return Promise.all(\n allTracks.map((track) => addTrackAsync(videoElement as HTMLVideoElement, track))\n )\n .then((htmlTracks) => {\n return [baseVideoTrack, ...(options?.audioTracks || [])].map((videoTrack) => ({\n ...videoTrack,\n captionTracks: matchTracks({\n htmlTracks,\n videoTrack,\n type: 'captionTracks',\n }),\n transcriptTracks: matchTracks({\n htmlTracks,\n videoTrack,\n type: 'transcriptTracks',\n }),\n }));\n })\n .catch((error) => {\n logWarning('OSCVideoPlayer', error, 'Failed to fetch video tracks');\n return [defaultVideoTrack];\n });\n },\n });\n\n return videoTracks;\n}\n\nfunction getFetchableTracks(options: UseTrackQueryOptions) {\n const baseTracks = [...(options?.captionTracks || []), ...(options?.transcriptTracks || [])];\n const additionalTracks =\n options?.audioTracks?.flatMap((videoTrack) => [\n ...(videoTrack.captionTracks || []),\n ...(videoTrack.transcriptTracks || []),\n ]) || [];\n const tracksMap = new Map(\n [...baseTracks, ...additionalTracks].map((item) => [Object.values(item).join('-'), item])\n );\n return Array.from(tracksMap.values());\n}\n\nfunction matchTracks({\n htmlTracks,\n videoTrack,\n type,\n}: {\n htmlTracks: Awaited<ReturnType<typeof addTrackAsync>>[];\n videoTrack: NonNullable<VideoPlayerProps['audioTracks']>[number];\n type: keyof Pick<VideoTrack, 'captionTracks' | 'transcriptTracks'>;\n}) {\n return htmlTracks.filter((htmlTrack): htmlTrack is HTMLTrackElement =>\n (videoTrack[type] ?? []).some(\n (track) =>\n track.type === htmlTrack?.dataset.type &&\n track.label === htmlTrack.label &&\n track.url === htmlTrack.src\n )\n );\n}\n\nfunction useBaseTracks(options: UseTrackQueryOptions) {\n const baseVideoTrack = {\n videoUrl: options.videoUrl,\n videoGroup: options.videoGroup,\n videoLabel: options.videoLabel,\n captionTracks: options.captionTracks,\n transcriptTracks: options.transcriptTracks,\n };\n const defaultVideoTrack = {\n ...baseVideoTrack,\n captionTracks: [],\n transcriptTracks: [],\n };\n return {\n baseVideoTrack,\n defaultVideoTrack,\n };\n}\n","import { useCallback, useEffect, useRef } from 'react';\nimport { useBoolean, useEventListener } from 'usehooks-ts';\nimport type { VideoPlayerProps, PlayerState, useVideoPlayer } from './use-video-player';\n\ntype UseFadeControlsOptions = VideoPlayerProps &\n PlayerState & {\n videoElement: ReturnType<typeof useVideoPlayer>['videoProps']['videoElement'];\n };\n\nconst FADE_TIMEOUT_IN_MS = 3000;\n\n/**\n * Hook to manage the visibility of video controls.\n */\nexport function useFadeControls(props: UseFadeControlsOptions) {\n const { isPlaying, wrapperElement, videoElement, shouldControlsRemainVisible } = props;\n const elementRef = (wrapperElement || videoElement) as React.RefObject<HTMLElement>;\n const { value: isVisible, setTrue: setVisible, setFalse: setHidden } = useBoolean(true);\n const timeout = useRef(0);\n\n const hideControls = useCallback(() => {\n if (!shouldControlsRemainVisible) {\n if (isPlaying) {\n setHidden();\n }\n window.clearTimeout(timeout.current);\n }\n }, [setHidden, isPlaying, shouldControlsRemainVisible]);\n\n const showControls = useCallback(() => {\n setVisible();\n window.clearTimeout(timeout.current);\n }, [setVisible]);\n\n const fadeControls = useCallback(() => {\n if (isPlaying && !shouldControlsRemainVisible) {\n timeout.current = window.setTimeout(hideControls, FADE_TIMEOUT_IN_MS);\n }\n }, [hideControls, isPlaying, shouldControlsRemainVisible]);\n\n const handleKeyup = useCallback(\n (event: KeyboardEvent) => {\n if (!shouldControlsRemainVisible) {\n const isInteracting = elementRef.current?.contains(event.target as HTMLElement);\n isInteracting ? showControls() : hideControls();\n }\n },\n [elementRef, hideControls, showControls, shouldControlsRemainVisible]\n );\n\n useEffect(() => {\n isVisible || shouldControlsRemainVisible ? showControls() : fadeControls();\n }, [fadeControls, isVisible, showControls, shouldControlsRemainVisible]);\n\n useEventListener('mousemove', showControls, elementRef);\n useEventListener('mouseleave', hideControls, elementRef);\n useEventListener('keyup', handleKeyup);\n\n return { isVisible };\n}\n","import type { TrackOption, VideoTrack } from '../video-player.controls';\n\ntype FindArgs = {\n activeTrack: TrackOption;\n selectedVideoTrack: VideoTrack;\n};\n\n/**\n * @see findTrack\n */\nexport function findCaption({ selectedVideoTrack, activeTrack }: FindArgs) {\n return findTrack(selectedVideoTrack?.captionTracks, activeTrack);\n}\n\n/**\n * @see findTrack\n */\nexport function findTranscript({ selectedVideoTrack, activeTrack }: FindArgs) {\n return findTrack(selectedVideoTrack?.transcriptTracks, activeTrack);\n}\n\n/**\n * Attempts to find the related track based on the active track.\n */\nfunction findTrack(tracks: TrackOption[], activeTrack: TrackOption) {\n return tracks.find((track) => track.srclang === activeTrack.srclang) || tracks[0] || null;\n}\n","import set from 'lodash/set';\n\nexport function getMetricsTrackName(htmlTrack: HTMLTrackElement | null) {\n return htmlTrack ? formatName(htmlTrack.label) : 'off';\n}\n\nexport function getMetricsVideoName(videoName: string) {\n return formatName(videoName);\n}\n\nexport type Events =\n | 'user_play'\n | 'autoplay'\n | 'sound'\n | 'cc'\n | `sub_${string}`\n | `audiotrack_${string}`\n | `transcript_${string}`;\n\nexport function trackEvent(eventName: Events, videoName: string) {\n if (window._satellite && window.digitalData) {\n set(window.digitalData, 'click.clickID', `video_${eventName}`);\n set(window.digitalData, 'page.attributes.videoName', videoName);\n window._satellite.track?.('global_click');\n }\n}\n\nfunction formatName(name: string) {\n return name\n .replace(/[^a-zA-Z0-9 ]/g, '')\n .replace(/\\s/g, '_')\n .toLowerCase();\n}\n","import classnames from 'classnames';\n\ntype Args = {\n brandComponentTheme?: CmsBrandComponentTheme;\n};\n\nexport const getTextColorClasses = ({ brandComponentTheme }: Args) => {\n const isLight = brandComponentTheme === 'light';\n const isDark = brandComponentTheme === 'dark';\n return classnames({\n 'text-primary brand-ht:text-text-inverse': isLight,\n 'text-text-inverse brand-es:!text-primary brand-gu:!text-primary brand-hi-refresh:!text-primary brand-nd:!text-primary':\n isDark,\n });\n};\n\nexport const getBackgroundColorClasses = ({ brandComponentTheme }: Args) => {\n const isDark = brandComponentTheme === 'dark';\n const isLight = brandComponentTheme === 'light';\n return classnames({\n 'bg-bg brand-ey:bg-bg-light brand-ou:bg-secondary': !isDark && !isLight,\n 'bg-bg-dark brand-es:bg-bg brand-gu:bg-bg brand-hi-refresh:bg-bg brand-nd:bg-bg': isDark,\n 'bg-bg-light brand-es:bg-bg brand-ey:bg-bg brand-gu:bg-bg brand-hi-refresh:bg-bg brand-nd:bg-bg':\n isLight,\n });\n};\n\nexport const getClasses = ({ brandComponentTheme }: Args) => {\n return classnames(\n getTextColorClasses({ brandComponentTheme }),\n getBackgroundColorClasses({ brandComponentTheme })\n );\n};\n","import { useIsClient } from 'usehooks-ts';\nimport { Slider } from '@dx-ui/osc-slider';\nimport classnames from 'classnames';\nimport { useTranslation } from 'next-i18next';\nimport { getClasses } from './util/classes';\nimport type { VideoControlsProps } from './video-player.controls';\nimport type { PlayerState, useVideoPlayer } from './hooks/use-video-player';\n\ntype VolumeSliderProps = Pick<VideoControlsProps, 'brandComponentTheme'> &\n Pick<ReturnType<typeof useVideoPlayer>['videoControlsProps'], 'updateVolume' | 'playerState'>;\n\nconst volumeConfig = {\n min: 0,\n max: 100,\n step: 5,\n};\n\nexport const lowestVolume: PlayerState['volume'] = [volumeConfig.step];\n\nexport const initialVolume: PlayerState['volume'] = [\n Math.max(volumeConfig.step, Math.floor(volumeConfig.max / 2)),\n];\n\nexport function VolumeSlider({\n brandComponentTheme,\n playerState,\n updateVolume,\n}: VolumeSliderProps) {\n const isClient = useIsClient();\n const { t, i18n } = useTranslation('osc-video-player');\n const isDark = brandComponentTheme === 'dark';\n const volume = playerState.isMuted ? 0 : playerState.volume[0];\n\n if (!isClient) {\n return null;\n }\n\n return (\n <form\n className={classnames(\n 'sr-only !absolute bottom-12 shadow group-has-[:focus]:not-sr-only',\n 'group-has-[:focus]:!h-32 group-has-[:focus]:!w-full group-has-[:focus]:lg:!h-40',\n 'group-hover:not-sr-only group-hover:!h-32 group-hover:!w-full group-hover:lg:!h-40',\n getClasses({ brandComponentTheme })\n )}\n >\n <Slider\n title={t('volume.label')}\n hiddenLegend={true}\n inputLabels={[t('volume.button')]}\n thumbLabelFn={() => t('volume.ariaLabel', { volume })}\n values={[volume]}\n onChange={updateVolume}\n language={i18n.language}\n min={volumeConfig.min}\n max={volumeConfig.max}\n step={volumeConfig.step}\n fillIndex={1}\n orientation=\"vertical\"\n onColor={isDark ? 'color-bg' : 'color-primary'}\n variant=\"primary\"\n brandComponentTheme={brandComponentTheme}\n />\n </form>\n );\n}\n","import { useEventListener, useOnClickOutside, useToggle } from 'usehooks-ts';\nimport { useId, useRef } from 'react';\nimport { getKeyDownNavigation } from '@dx-ui/utilities-accessibility';\n\n/**\n * Hook to manage the state of a popup menu.\n */\nexport function useMenu() {\n const menuId = useId();\n const popupButtonRef = useRef<React.ElementRef<'button'>>(null);\n const popupMenuRef = useRef<React.ElementRef<'div'>>(null);\n const [isOpen, toggleMenu, setIsOpen] = useToggle();\n const closeMenu = () => setIsOpen(false);\n\n return {\n menuId,\n isOpen,\n toggleMenu,\n closeMenu,\n popupButtonRef,\n popupMenuRef,\n };\n}\n\ntype UseEventListenersOptions = Pick<\n ReturnType<typeof useMenu>,\n 'popupButtonRef' | 'popupMenuRef'\n> & {\n resetMenu: VoidFunction;\n};\n\n/**\n * Hook to manage event listeners for a popup menu.\n */\nexport function useEventListeners(options: UseEventListenersOptions) {\n const { popupButtonRef, popupMenuRef, resetMenu } = options;\n const focusButton = () => popupButtonRef.current?.focus();\n\n useOnClickOutside(popupMenuRef, (event) => {\n if (!popupButtonRef.current?.contains(event.target as HTMLElement)) {\n resetMenu();\n }\n });\n\n useEventListener(\n 'keydown',\n (event) => {\n event.stopPropagation();\n switch (event.key) {\n case 'Tab':\n window.requestAnimationFrame(() => {\n if (!popupMenuRef.current?.contains(document.activeElement)) {\n resetMenu();\n focusButton();\n }\n });\n break;\n case 'Escape':\n resetMenu();\n focusButton();\n break;\n case 'ArrowUp':\n case 'ArrowDown':\n {\n const activeList = popupMenuRef.current?.querySelector('ul');\n const elements = Array.from(activeList?.querySelectorAll('button') || []);\n const onKeyDownNavigation = getKeyDownNavigation({ elements });\n onKeyDownNavigation(event);\n }\n break;\n default:\n break;\n }\n },\n popupMenuRef\n );\n}\n","/**\n * Ensures the cue has text content.\n */\nexport function isValidCue(cue: VTTCue) {\n return cue.text.trim().length > 0;\n}\n\n/**\n * Generates a unique cue id.\n */\nexport function getCueId(cue: VTTCue) {\n return ['cue', cue.id, crypto.randomUUID()].filter(Boolean).join('-');\n}\n\n/**\n * Parses the VTTCue text and returns the text content.\n */\nexport function getCueText(cue: VTTCue) {\n try {\n const fragment = cue.getCueAsHTML();\n const text = fragment.textContent || '';\n const html = new XMLSerializer().serializeToString(fragment);\n return { text, html };\n } catch {\n return { text: cue.text, html: cue.text };\n }\n}\n\n/**\n * The smallest buffer to add to the cue startTime when adjusting the\n * video currentTime due to precision mismatch related to activeCues.\n * https://stackoverflow.com/questions/55777551/how-do-i-avoid-floating-point-rounding-errors-in-webvtt\n */\nexport const CUE_BUFFER = 0.00001;\n","import type { useId } from 'react';\n\nexport type EventType = ValuesOf<typeof VIDEO_EVENTS>;\n\nexport type VideoEventDetail = {\n type: EventType;\n id: ReturnType<typeof useId>;\n};\n\nexport const VIDEO_EVENTS = {\n PAUSE_OTHERS: 'pause-others',\n PAUSE_SELF: 'pause-self',\n} as const;\n\nexport const VIDEO_UPDATE_EVENT = 'video-player-update';\n\nexport const dispatchVideoEvent = (detail: VideoEventDetail) => {\n window.dispatchEvent(new CustomEvent<VideoEventDetail>(VIDEO_UPDATE_EVENT, { detail }));\n};\n","import { useRef, useState, useEffect, useCallback, useId } from 'react';\nimport { useEventListener } from 'usehooks-ts';\nimport { useAutoPlay } from './use-autoplay';\nimport { useTrackQuery } from '../hooks/use-track-query';\nimport { useFadeControls } from './use-fade-controls';\nimport { findCaption, findTranscript } from '../util/matchers';\nimport { getMetricsTrackName, getMetricsVideoName, trackEvent } from '../util/metrics';\n\nimport type { VideoTrack, TrackOption, BaseVideoTrack } from '../video-player.controls';\nimport { initialVolume, lowestVolume } from '../video-player.volume-slider';\nimport { useMenu } from './use-control-menu';\nimport { CUE_BUFFER } from '../util/cue';\nimport type { VideoEventDetail } from '../util/event-emitter';\nimport { dispatchVideoEvent, VIDEO_EVENTS, VIDEO_UPDATE_EVENT } from '../util/event-emitter';\nimport type { VideoProps } from '../video-player.player';\n\nexport type VideoPlayerProps = BaseVideoTrack &\n Pick<VideoProps, 'isAutoPlay' | 'captionData'> &\n Partial<{\n hasAudio: boolean;\n playerId: ReturnType<typeof useId>;\n audioTracks: BaseVideoTrack[];\n wrapperElement: React.RefObject<HTMLDivElement>;\n shouldControlsRemainVisible?: boolean;\n }>;\n\nexport type PlayerState = {\n isMuted: boolean;\n isPlaying: boolean;\n showCaptions: boolean;\n activeCaptionTrack: TrackOption | null;\n activeTranscript: TrackOption | null;\n activeVideoTrack: VideoTrack | null;\n volume: Tuple<1, number>;\n};\n\nconst defaultPlayerState: PlayerState = {\n isMuted: true,\n isPlaying: true,\n showCaptions: false,\n activeCaptionTrack: null,\n activeTranscript: null,\n activeVideoTrack: null,\n volume: initialVolume,\n};\n\n/**\n * Hook to manage the state and behavior of the video player.\n */\nexport function useVideoPlayer(props: VideoPlayerProps) {\n const videoElement = useRef<HTMLVideoElement>(null);\n const internalPlayerId = useId();\n const playerId = props.playerId ?? internalPlayerId;\n const hasAudio = props.hasAudio ?? true;\n const hookProps = { ...props, videoElement };\n const [playerState, setPlayerState] = useState<PlayerState>(() => {\n try {\n const videoPlayerSettings: Partial<PlayerState> = JSON.parse(\n localStorage.getItem('videoPlayerSettings') || '{}'\n );\n return { ...defaultPlayerState, ...videoPlayerSettings };\n } catch {\n return defaultPlayerState;\n }\n });\n const optionsState = useTrackQuery(hookProps);\n const controlsState = useFadeControls({ ...hookProps, ...playerState });\n const settingsMenu = useMenu();\n const activeVideo = playerState.activeVideoTrack || optionsState[0];\n const videoName = getMetricsVideoName(props.videoName ?? '');\n\n const playVideo = useCallback(() => {\n void videoElement.current?.play()?.catch(() => null);\n }, []);\n\n const pauseVideo = useCallback(() => videoElement.current?.pause(), []);\n\n const muteVideo = useCallback(() => {\n if (videoElement.current) {\n videoElement.current.muted = true;\n videoElement.current.volume = 0;\n }\n }, []);\n\n const unmuteVideo = useCallback(([volume]: PlayerState['volume']) => {\n if (videoElement.current) {\n videoElement.current.muted = false;\n videoElement.current.volume = volume / 100;\n }\n }, []);\n\n function togglePlayButton() {\n setPlayerState((playerState) => {\n const isPlaying = !playerState.isPlaying;\n if (isPlaying) {\n playVideo();\n if (hasAudio) {\n dispatchVideoEvent({ type: VIDEO_EVENTS.PAUSE_OTHERS, id: playerId });\n }\n trackEvent('user_play', videoName);\n } else {\n pauseVideo();\n }\n return { ...playerState, isPlaying };\n });\n }\n\n function persistSettings(state: Partial<PlayerState>) {\n localStorage.setItem('videoPlayerSettings', JSON.stringify(state));\n }\n\n function performAudioActions({ isMuted, isPlaying, volume }: PlayerState) {\n if (isMuted) {\n muteVideo();\n } else {\n unmuteVideo(volume);\n if (isPlaying) {\n dispatchVideoEvent({ type: VIDEO_EVENTS.PAUSE_OTHERS, id: playerId });\n }\n }\n persistSettings({ volume });\n }\n\n function updateVolume(volume: PlayerState['volume']) {\n setPlayerState((playerState) => {\n const isMuted = volume[0] <= 0;\n const state = { ...playerState, isMuted, volume };\n performAudioActions(state);\n return state;\n });\n }\n\n function toggleMuteButton() {\n setPlayerState((playerState) => {\n const isMuted = !playerState.isMuted;\n const volume = playerState.volume[0] <= 0 ? lowestVolume : playerState.volume;\n const state = { ...playerState, isMuted, volume };\n trackEvent('sound', videoName);\n performAudioActions(state);\n return state;\n });\n }\n\n function toggleCaptions() {\n setPlayerState((playerState) => {\n trackEvent('cc', videoName);\n const showCaptions = !playerState.showCaptions;\n return { ...playerState, showCaptions };\n });\n }\n\n function updateCaption(selectedCaption: PlayerState['activeCaptionTrack']) {\n setPlayerState((playerState) => {\n const isSingleCaption = (activeVideo?.captionTracks?.length ?? 1) === 1;\n const trackName = getMetricsTrackName(selectedCaption);\n const eventName = isSingleCaption ? 'cc' : (`sub_${trackName}` as const);\n trackEvent(eventName, videoName);\n return {\n ...playerState,\n showCaptions: Boolean(selectedCaption),\n activeCaptionTrack: selectedCaption || playerState.activeCaptionTrack,\n };\n });\n }\n\n function updateTranscript(selectedTranscript: PlayerState['activeTranscript']) {\n setPlayerState((playerState) => {\n const trackName = getMetricsTrackName(selectedTranscript);\n const eventName = `transcript_${trackName}` as const;\n trackEvent(eventName, videoName);\n return { ...playerState, activeTranscript: selectedTranscript };\n });\n }\n\n function updateAudioTrack(selectedVideoTrack: NonNullable<PlayerState['activeVideoTrack']>) {\n setPlayerState((playerState) => {\n if (playerState.activeVideoTrack?.videoUrl === selectedVideoTrack.videoUrl) {\n return playerState;\n }\n\n const activeCaptionTrack = playerState.activeCaptionTrack\n ? findCaption({ selectedVideoTrack, activeTrack: playerState.activeCaptionTrack })\n : null;\n\n const activeTranscript = playerState.activeTranscript\n ? findTranscript({ selectedVideoTrack, activeTrack: playerState.activeTranscript })\n : null;\n\n if (videoElement.current) {\n const isGroupMatch = activeVideo?.videoGroup === selectedVideoTrack.videoGroup;\n const currentTime = isGroupMatch ? videoElement.current.currentTime : 0;\n videoElement.current.src = selectedVideoTrack.videoUrl;\n videoElement.current.currentTime = currentTime;\n }\n\n const videoLabel = getMetricsVideoName(selectedVideoTrack.videoLabel || '');\n const eventName = `audiotrack_${videoLabel}` as const;\n trackEvent(eventName, videoName);\n playerState.isPlaying ? playVideo() : pauseVideo();\n\n return {\n ...playerState,\n activeTranscript,\n activeCaptionTrack,\n activeVideoTrack: selectedVideoTrack,\n };\n });\n }\n\n function closeTranscript() {\n updateTranscript(null);\n settingsMenu.popupButtonRef.current?.focus();\n }\n\n function onCueSelect(cue: VTTCue) {\n if (videoElement.current) {\n const adjustedTime = cue.startTime + CUE_BUFFER;\n videoElement.current.currentTime = adjustedTime;\n }\n }\n\n const isAutoPlay = useAutoPlay({\n isAutoPlay: props.isAutoPlay ?? defaultPlayerState.isPlaying,\n });\n\n useEffect(() => {\n setPlayerState((playerState) => {\n if (isAutoPlay) {\n muteVideo();\n playVideo();\n } else {\n unmuteVideo(playerState.volume);\n pauseVideo();\n }\n return {\n ...playerState,\n isMuted: isAutoPlay,\n isPlaying: isAutoPlay,\n };\n });\n }, [isAutoPlay, muteVideo, pauseVideo, playVideo, unmuteVideo]);\n\n useEffect(() => {\n if (playerState.showCaptions) {\n const inActiveCaptionTracks = (activeVideo?.captionTracks ?? []).filter(\n (option): option is HTMLTrackElement => option.src !== playerState.activeCaptionTrack?.src\n );\n\n if (inActiveCaptionTracks.length) {\n inActiveCaptionTracks.forEach((track) => {\n track.track.oncuechange = null;\n });\n }\n\n if (playerState.activeCaptionTrack) {\n playerState.activeCaptionTrack.track.oncuechange = () => {\n setPlayerState((playerState) => ({\n ...playerState,\n activeCaptionTrack: playerState.activeCaptionTrack,\n }));\n };\n }\n } else {\n if (playerState.activeCaptionTrack) {\n playerState.activeCaptionTrack.track.oncuechange = null;\n }\n }\n }, [activeVideo?.captionTracks, playerState.activeCaptionTrack, playerState.showCaptions]);\n\n useEventListener('metrics-ready', () => {\n if (isAutoPlay && videoName) {\n trackEvent('autoplay', videoName);\n }\n });\n\n useEventListener(VIDEO_UPDATE_EVENT, (event: CustomEvent<VideoEventDetail>) => {\n const isPauseOthersEvent = event.detail.type === VIDEO_EVENTS.PAUSE_OTHERS;\n const isPauseSelfEvent = event.detail.type === VIDEO_EVENTS.PAUSE_SELF;\n const isPauseEvent = isPauseOthersEvent || isPauseSelfEvent;\n\n if (hasAudio && playerState.isPlaying && isPauseEvent) {\n const isOtherVideo = event.detail.id !== playerId;\n const isSameVideo = event.detail.id === playerId;\n const shouldPauseAll = isPauseOthersEvent && isOtherVideo;\n const shouldPauseSelf = isPauseSelfEvent && isSameVideo;\n if (shouldPauseAll || shouldPauseSelf) {\n togglePlayButton();\n }\n }\n });\n\n return {\n videoProps: {\n videoElement,\n },\n videoCaptionProps: {\n showCaptions: playerState.showCaptions,\n activeCaptionTrack: playerState.activeCaptionTrack,\n },\n videoTranscriptProps: {\n activeTranscript: playerState.activeTranscript,\n closeTranscript,\n onCueSelect,\n },\n videoControlsProps: {\n controlsState,\n activeVideo,\n playerState,\n optionsState,\n togglePlayButton,\n toggleMuteButton,\n toggleCaptions,\n settingsMenu,\n updateCaption,\n updateTranscript,\n updateAudioTrack,\n updateVolume,\n videoElement,\n hasAudio,\n },\n };\n}\n","import classnames from 'classnames';\nimport { Caption } from '@dx-ui/osc-caption';\nimport type { CaptionProps } from '@dx-ui/osc-caption';\nimport { logWarning } from '@dx-ui/framework-logger';\nimport { useAutoPlay } from './hooks/use-autoplay';\n\ntype VideoElement = React.ComponentProps<'video'>;\n\nexport type VideoProps = Omit<VideoElement, 'src' | 'autoPlay' | 'id' | 'poster'> & {\n /**\n * The location (URL) of the video file\n */\n videoUrl: NonNullable<VideoElement['src']>;\n /**\n * Ref that gets added to the video element.\n */\n videoElement: React.RefObject<HTMLVideoElement>;\n /**\n * The poster for the video\n */\n posterImageUrl?: VideoElement['poster'];\n videoId?: VideoElement['id'];\n /**\n * When present, the video will automatically start playing.\n */\n isAutoPlay?: VideoElement['autoPlay'];\n /**\n * Caption link and text\n */\n captionData?: CaptionProps;\n /**\n * Classname for the Video tag\n */\n videoClassName?: React.ComponentProps<'div'>['className'];\n /**\n * Classname for the Figure tag\n */\n figureClassName?: React.ComponentProps<'div'>['className'];\n};\n\n/**\n * Provides the ability to play videos on a continuous loop with optional caption.\n */\nexport function Video({\n videoUrl,\n posterImageUrl,\n videoElement,\n videoId,\n captionData,\n isAutoPlay = true,\n muted = isAutoPlay,\n figureClassName,\n videoClassName,\n ...rest\n}: VideoProps) {\n const preventPreload = posterImageUrl && !isAutoPlay;\n const autoPlay = useAutoPlay({ isAutoPlay });\n\n return (\n <figure className={figureClassName}>\n {videoUrl ? (\n <div className={classnames('relative w-full overflow-hidden', rest.className)}>\n <video\n id={videoId}\n data-testid=\"video-player\"\n loop\n playsInline\n {...rest}\n className={classnames('w-full bg-bg-alt object-cover', videoClassName)}\n src={videoUrl}\n poster={posterImageUrl}\n autoPlay={autoPlay}\n muted={muted}\n ref={videoElement}\n crossOrigin=\"anonymous\"\n preload={preventPreload ? 'none' : undefined}\n onError={(e) => {\n logWarning(\n 'OSCVideoPlayer',\n new Error('video onError'),\n `Failed to load ${videoUrl}`\n );\n rest.onError?.(e);\n }}\n />\n </div>\n ) : null}\n\n {captionData ? <Caption {...captionData} /> : null}\n </figure>\n );\n}\n","import classnames from 'classnames';\nimport { forwardRef } from 'react';\nimport type { VideoControlsProps } from './video-player.controls';\nimport { getClasses } from './util/classes';\n\ntype ControlButtonProps = Omit<React.ComponentProps<'button'>, 'type'> &\n Pick<VideoControlsProps, 'brandComponentTheme'> & {\n iconContent: React.ReactNode;\n wrapperClassName?: React.ComponentProps<'li'>['className'];\n };\n\nconst ControlButton = forwardRef<HTMLButtonElement, ControlButtonProps>(function ControlButton(\n props,\n ref\n) {\n const { brandComponentTheme, children, iconContent, wrapperClassName, ...buttonProps } = props;\n return (\n <li className={wrapperClassName}>\n <button\n {...buttonProps}\n ref={ref}\n type=\"button\"\n className={classnames(\n 'relative z-1 inline-flex size-12 items-center justify-center bg-bg focus:z-2',\n getClasses({ brandComponentTheme }),\n buttonProps.className\n )}\n >\n {iconContent}\n </button>\n {children}\n </li>\n );\n});\n\nexport { ControlButton };\n","import { Icon } from '@dx-ui/osc-icon';\nimport classnames from 'classnames';\nimport type { VideoControlsProps } from './video-player.controls';\n\nexport function ControlIcon({\n brandComponentTheme,\n ...iconProps\n}: React.ComponentProps<typeof Icon> & Pick<VideoControlsProps, 'brandComponentTheme'>) {\n const isDark = brandComponentTheme === 'dark';\n const isLight = brandComponentTheme === 'light';\n return (\n <Icon\n {...iconProps}\n className={classnames(\n 'fill-primary',\n {\n 'fill-text-inverse brand-es:fill-primary brand-gu:fill-primary brand-hi-refresh:fill-primary brand-nd:fill-primary':\n isDark,\n 'brand-ht:fill-text-inverse': isLight,\n },\n iconProps.className\n )}\n />\n );\n}\n","import { useEffect, useState } from 'react';\nimport classnames from 'classnames';\nimport type { useMenu } from './hooks/use-control-menu';\nimport type { VideoControlsProps } from './video-player.controls';\nimport { getClasses } from './util/classes';\n\nexport function ControlMenu(\n props: ReturnType<typeof useMenu> &\n Pick<VideoControlsProps, 'brandComponentTheme'> &\n Pick<React.ComponentProps<'div'>, 'children' | 'className'> & {\n wrapperRef: React.RefObject<HTMLElement>;\n }\n) {\n const { brandComponentTheme, menuId, popupMenuRef, isOpen, children, className } = props;\n const isDark = brandComponentTheme === 'dark';\n const maxHeight = useSafeMaxHeight(props);\n\n return (\n <div\n id={menuId}\n ref={popupMenuRef}\n style={maxHeight ? { maxHeight: `${maxHeight}px` } : {}}\n className={classnames(\n 'absolute bottom-full start-0 w-full border-y border-border shadow-md md:min-w-60',\n getClasses({ brandComponentTheme }),\n {\n 'overflow-y-auto overscroll-contain': Boolean(maxHeight),\n 'border-bg-dark': isDark,\n 'motion-safe:animate-fadein': isOpen,\n 'motion-safe:animate-fadeout': !isOpen,\n hidden: !isOpen,\n },\n className\n )}\n >\n {children}\n </div>\n );\n}\n\nfunction useSafeMaxHeight(props: React.ComponentProps<typeof ControlMenu>) {\n const [maxHeight, setMaxHeight] = useState<number | null>(null);\n const { isOpen, wrapperRef, popupMenuRef, popupButtonRef } = props;\n\n useEffect(() => {\n const wrapperRect = wrapperRef.current?.getBoundingClientRect();\n const menuRect = popupMenuRef.current?.getBoundingClientRect();\n const buttonRect = popupButtonRef.current?.getBoundingClientRect();\n\n setMaxHeight(() => {\n if (isOpen && menuRect && wrapperRect && buttonRect) {\n const offset = wrapperRect.bottom - menuRect.bottom;\n const buttonOffset = buttonRect.height / 2;\n return wrapperRect.height - offset - buttonOffset;\n }\n return null;\n });\n }, [isOpen, popupButtonRef, popupMenuRef, wrapperRef]);\n\n return maxHeight;\n}\n","import classnames from 'classnames';\nimport type { VideoControlsProps } from './video-player.controls';\nimport { getClasses } from './util/classes';\n\nexport function ControlList(\n props: Omit<React.ComponentProps<'ul'>, 'role'> & Pick<VideoControlsProps, 'brandComponentTheme'>\n) {\n const { children, brandComponentTheme, ...listProps } = props;\n\n return (\n <ul\n {...listProps}\n role=\"menu\"\n className={classnames(\n 'flex w-full flex-col divide-y divide-border motion-safe:animate-fadein',\n getClasses({ brandComponentTheme }),\n listProps.className\n )}\n >\n {children}\n </ul>\n );\n}\n","import classnames from 'classnames';\nimport type { VideoControlsProps } from './video-player.controls';\nimport { getTextColorClasses } from './util/classes';\n\nexport function ControlItem({\n brandComponentTheme,\n beforeSection,\n afterSection,\n children,\n wrapperClassName,\n ...buttonProps\n}: {\n beforeSection?: React.ReactNode;\n afterSection?: React.ReactNode;\n} & Omit<React.ComponentProps<'button'>, 'type'> &\n Pick<VideoControlsProps, 'brandComponentTheme'> & {\n wrapperClassName?: React.ComponentProps<'li'>['className'];\n }) {\n return (\n <li className={classnames('p-1.5', wrapperClassName)}>\n <button\n {...buttonProps}\n type=\"button\"\n className={classnames(\n 'relative flex w-full items-center gap-1 p-1 text-start focus:z-2',\n buttonProps.className\n )}\n >\n {beforeSection}\n <span\n className={classnames(\n 'text-primary underline',\n getTextColorClasses({ brandComponentTheme })\n )}\n >\n {children}\n </span>\n {afterSection}\n </button>\n </li>\n );\n}\n","import classnames from 'classnames';\nimport { useState } from 'react';\nimport { useTranslation } from 'next-i18next';\nimport type { useMenu } from './hooks/use-control-menu';\nimport { useEventListeners } from './hooks/use-control-menu';\nimport { ControlIcon } from './video-player.control-icon';\nimport { ControlButton } from './video-player.control-button';\nimport { ControlMenu } from './video-player.control-menu';\nimport { ControlList } from './video-player.control-list';\nimport { ControlItem } from './video-player.control-item';\nimport { getClasses } from './util/classes';\nimport type { Track, TrackOption, VideoControlsProps } from './video-player.controls';\nimport type { useVideoPlayer } from './hooks/use-video-player';\n\ntype SettingsMenuProps = Pick<VideoControlsProps, 'brandComponentTheme'> &\n Pick<\n ReturnType<typeof useVideoPlayer>['videoControlsProps'],\n | 'activeVideo'\n | 'updateAudioTrack'\n | 'updateCaption'\n | 'updateTranscript'\n | 'optionsState'\n | 'playerState'\n | 'videoElement'\n > & {\n menuProps: ReturnType<typeof useMenu>;\n };\n\nexport function SettingsMenu(props: SettingsMenuProps) {\n const { brandComponentTheme } = props;\n const { t } = useTranslation('osc-video-player');\n const menuOptions = useMenuOptions(props);\n const { isOpen, toggleMenu, menuId, popupButtonRef, popupMenuRef } = menuOptions;\n\n return (\n <ControlButton\n aria-label={t('settings')}\n aria-controls={menuId}\n aria-haspopup\n aria-expanded={isOpen}\n ref={popupButtonRef}\n onClick={toggleMenu}\n brandComponentTheme={brandComponentTheme}\n iconContent={\n <>\n <ControlIcon\n name=\"settings\"\n brandComponentTheme={brandComponentTheme}\n className={classnames({ hidden: isOpen })}\n />\n <ControlIcon\n name=\"settings\"\n variant=\"solid\"\n brandComponentTheme={brandComponentTheme}\n className={classnames({ hidden: !isOpen })}\n />\n </>\n }\n >\n <ControlMenu {...menuOptions} wrapperRef={props.videoElement}>\n {isOpen ? (\n <Menu\n {...props}\n {...menuOptions}\n popupButtonRef={popupButtonRef}\n popupMenuRef={popupMenuRef}\n />\n ) : null}\n </ControlMenu>\n </ControlButton>\n );\n}\n\ntype MenuProps = ReturnType<typeof useMenuOptions>;\ntype ControlMenuProps = SettingsMenuProps & MenuProps;\n\nfunction Menu({\n menuOptions,\n brandComponentTheme,\n closeMenu,\n popupButtonRef,\n popupMenuRef,\n goToMainMenu,\n}: ControlMenuProps) {\n function resetMenu() {\n closeMenu();\n goToMainMenu();\n }\n\n useEventListeners({\n popupMenuRef,\n popupButtonRef,\n resetMenu,\n });\n\n const selectedOption = menuOptions.find((option) => option.isSelected);\n const isDark = brandComponentTheme === 'dark';\n const isLight = brandComponentTheme === 'light';\n\n if (selectedOption) {\n return (\n <ControlList key={selectedOption.type} brandComponentTheme={brandComponentTheme}>\n {selectedOption.options.map((subOption) => (\n <ControlItem\n key={subOption.label}\n brandComponentTheme={brandComponentTheme}\n onClick={() => {\n selectedOption.onSelection(subOption.track);\n resetMenu();\n popupButtonRef.current?.focus();\n }}\n role=\"menuitemradio\"\n aria-checked={subOption.isSelected}\n autoFocus={subOption.isSelected}\n beforeSection={\n <ControlIcon\n size=\"sm\"\n name=\"check\"\n brandComponentTheme={brandComponentTheme}\n className={classnames({ '!fill-transparent': !subOption.isSelected })}\n />\n }\n >\n {subOption.label}\n </ControlItem>\n ))}\n <ControlItem\n key={selectedOption.type}\n brandComponentTheme={brandComponentTheme}\n wrapperClassName={classnames(\n { 'bg-bg-alt': !isLight && !isDark },\n getClasses({ brandComponentTheme })\n )}\n onClick={goToMainMenu}\n beforeSection={\n <ControlIcon\n size=\"sm\"\n name=\"arrowhead-left\"\n brandComponentTheme={brandComponentTheme}\n className=\"rtl:rotate-180\"\n />\n }\n autoFocus={!selectedOption.options.some((subOption) => subOption.isSelected)}\n aria-expanded={true}\n >\n {selectedOption.label}\n </ControlItem>\n </ControlList>\n );\n }\n\n return (\n <ControlList brandComponentTheme={brandComponentTheme}>\n {menuOptions.map((option, index) => (\n <ControlItem\n key={option.type}\n brandComponentTheme={brandComponentTheme}\n onClick={option.onMenuOptionClick}\n className=\"justify-between\"\n autoFocus={index === 0}\n aria-expanded={false}\n afterSection={\n <ControlIcon\n size=\"sm\"\n name=\"arrowhead-left\"\n brandComponentTheme={brandComponentTheme}\n className=\"rotate-180 rtl:rotate-0\"\n />\n }\n >\n {option.label}\n </ControlItem>\n ))}\n </ControlList>\n );\n}\n\ntype Option = {\n isSelected: boolean;\n label: TrackOption['label'];\n track: TrackOption | null;\n};\n\ntype SelectOption = Pick<Option, 'isSelected'> & {\n label: React.ReactNode;\n type: Track['type'];\n options: Option[];\n onSelection: (option: TrackOption | null) => void;\n onMenuOptionClick: () => void;\n};\n\nfunction useMenuOptions(options: SettingsMenuProps) {\n const { t } = useTranslation('osc-video-player');\n const [selectedOption, setSelectedOption] = useState<Track['type'] | 'mainMenu'>('mainMenu');\n const captionOptions = options.activeVideo?.captionTracks || [];\n const hasCaptions = captionOptions.length > 1;\n const hasAudioTracks = options.optionsState.length > 1;\n const transcriptOptions = options.activeVideo?.transcriptTracks || [];\n const hasTranscripts = transcriptOptions.length > 0;\n const goToMainMenu = () => setSelectedOption('mainMenu');\n\n const menuOptions = [\n hasCaptions && {\n type: 'captionTrack',\n label: (\n <>\n {t('subtitles')}/<abbr title={t('captions')}>{t('cc')}</abbr>\n </>\n ),\n isSelected: selectedOption === 'captionTrack',\n onSelection: options.updateCaption,\n onMenuOptionClick: () => setSelectedOption('captionTrack'),\n options: [\n {\n isSelected: !options.playerState.showCaptions,\n label: t('off'),\n track: null,\n },\n ...captionOptions.map((track) => ({\n isSelected:\n options.playerState.showCaptions &&\n options.playerState.activeCaptionTrack?.src === track.src,\n label: track.label,\n track,\n })),\n ],\n },\n hasAudioTracks && {\n type: 'audioTrack',\n label: t('audioTrack'),\n isSelected: selectedOption === 'audioTrack',\n onSelection: options.updateAudioTrack,\n onMenuOptionClick: () => setSelectedOption('audioTrack'),\n options: options.optionsState.map((track) => ({\n isSelected: options.activeVideo?.videoUrl === track.videoUrl,\n label: track.videoLabel,\n track,\n })),\n },\n hasTranscripts && {\n type: 'transcriptTrack',\n label: t('transcript'),\n isSelected: selectedOption === 'transcriptTrack',\n onSelection: options.updateTranscript,\n onMenuOptionClick: () => setSelectedOption('transcriptTrack'),\n options: [\n {\n isSelected: !options.playerState.activeTranscript,\n label: t('off'),\n track: null,\n },\n ...transcriptOptions.map((track) => ({\n isSelected: options.playerState.activeTranscript?.src === track.src,\n label: track.label,\n track,\n })),\n ],\n },\n ].filter(Boolean) as SelectOption[];\n\n return {\n ...options.menuProps,\n goToMainMenu,\n menuOptions,\n };\n}\n","import { useRef } from 'react';\nimport { useTranslation } from 'next-i18next';\nimport { useEventListener } from 'usehooks-ts';\nimport classnames from 'classnames';\nimport { ControlButton } from './video-player.control-button';\nimport { ControlIcon } from './video-player.control-icon';\nimport { SettingsMenu } from './video-player.settings-menu';\nimport { VolumeSlider } from './video-player.volume-slider';\nimport type { useVideoPlayer } from './hooks/use-video-player';\nimport { getKeyDownNavigation } from '@dx-ui/utilities-accessibility';\nimport { getClasses } from './util/classes';\n\nexport type Track = {\n type: StringWithAutocompleteOptions<'captionTrack' | 'transcriptTrack' | 'audioTrack'>;\n url: string;\n label: string;\n language: string;\n};\n\nexport type BaseVideoTrack = {\n videoGroup?: 'standard' | 'extended';\n videoLabel?: string;\n videoName?: string;\n videoUrl: string;\n isMuted?: boolean;\n altText?: string;\n captionTracks?: Track[];\n transcriptTracks?: Track[];\n};\n\nexport type TrackOption = HTMLTrackElement;\n\nexport type VideoTrack = Omit<BaseVideoTrack, 'captionTracks' | 'transcriptTracks'> & {\n captionTracks: TrackOption[];\n transcriptTracks: TrackOption[];\n};\n\nexport type VideoControlsProps = {\n /** Used to help with positioning of the controls */\n className?: string;\n /** For color theming */\n brandComponentTheme?: CmsBrandComponentTheme;\n videoVariant?: 'cinemagraph';\n};\n\n/**\n * A set of video controls for internal video sources that includes pause/play, mute/unmute, and closed captions.\n *\n * This should generally be used with the `useVideoPlayer` hook from `@dx-ui/osc-video-player`.\n * The hook provides the necessary state and functions to control the video player.\n * Consumers can spread the props from the videoControlsProps returned from the hook.\n *\n * Accepts className to add your own placement and styles to the component.\n */\nexport function VideoControls(\n props: ReturnType<typeof useVideoPlayer>['videoControlsProps'] & VideoControlsProps\n) {\n const {\n className,\n brandComponentTheme,\n controlsState,\n playerState,\n activeVideo,\n optionsState,\n toggleCaptions,\n toggleMuteButton,\n togglePlayButton,\n settingsMenu,\n updateCaption,\n updateTranscript,\n updateAudioTrack,\n updateVolume,\n videoVariant,\n hasAudio,\n videoElement,\n } = props;\n const { t } = useTranslation('osc-video-player');\n const listRef = useRef<React.ElementRef<'ul'>>(null);\n const hasCaptions = (activeVideo?.captionTracks || []).length > 0;\n const hasMultipleCaptions = (activeVideo?.captionTracks || []).length > 1;\n const hasTranscripts = (activeVideo?.transcriptTracks || []).length > 0;\n const hasAudioDescriptions = optionsState.length > 1;\n const hasSettings = hasMultipleCaptions || hasTranscripts || hasAudioDescriptions;\n const isSettingsMenuOpen = settingsMenu?.isOpen;\n const isCinemagraph = videoVariant === 'cinemagraph';\n\n useEventListener(\n 'keydown',\n (event) => {\n const target = event.target as HTMLButtonElement;\n if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\n if (!target?.id?.includes('slider-thumb')) {\n event.preventDefault();\n const elements = Array.from(listRef.current?.querySelectorAll('button') || []);\n const onKeyDownNavigation = getKeyDownNavigation({ elements });\n onKeyDownNavigation(event);\n }\n }\n },\n listRef\n );\n\n const pauseButtonLabel = isCinemagraph ? t('pauseAnimation') : t('pause');\n const playButtonLabel = isCinemagraph ? t('playAnimation') : t('play');\n return (\n <div className={className} data-testid=\"video-controls\">\n <ul\n className={classnames(\n 'relative z-10 inline-flex divide-x divide-border bg-bg shadow-md motion-safe:transition-opacity rtl:divide-x-reverse',\n getClasses({ brandComponentTheme }),\n {\n 'opacity-100': controlsState.isVisible,\n 'opacity-0': !controlsState.isVisible,\n }\n )}\n data-testid=\"testBackgroundCss\"\n ref={listRef}\n >\n <ControlButton\n aria-label={playerState.isPlaying ? pauseButtonLabel : playButtonLabel}\n brandComponentTheme={brandComponentTheme}\n onClick={togglePlayButton}\n iconContent={\n <>\n <ControlIcon\n brandComponentTheme={brandComponentTheme}\n className={classnames({ hidden: !playerState.isPlaying })}\n name=\"pause\"\n />\n <ControlIcon\n brandComponentTheme={brandComponentTheme}\n className={classnames({ hidden: playerState.isPlaying })}\n name=\"play\"\n />\n </>\n }\n />\n {hasAudio ? (\n <ControlButton\n aria-label={playerState.isMuted ? t('unmute') : t('mute')}\n brandComponentTheme={brandComponentTheme}\n onClick={toggleMuteButton}\n wrapperClassName=\"group relative\"\n iconContent={\n <>\n <ControlIcon\n brandComponentTheme={brandComponentTheme}\n className={classnames({ hidden: !playerState.isMuted })}\n name=\"sound-off\"\n />\n <ControlIcon\n brandComponentTheme={brandComponentTheme}\n className={classnames({ hidden: playerState.isMuted })}\n name=\"sound-on\"\n />\n </>\n }\n >\n {!isSettingsMenuOpen ? (\n <VolumeSlider\n brandComponentTheme={brandComponentTheme}\n playerState={playerState}\n updateVolume={updateVolume}\n />\n ) : null}\n </ControlButton>\n ) : null}\n {hasCaptions ? (\n <ControlButton\n aria-label={t('captions')}\n aria-pressed={Boolean(playerState.activeCaptionTrack)}\n brandComponentTheme={brandComponentTheme}\n onClick={() => {\n const currentTrack = playerState.activeCaptionTrack;\n const firstTrack = activeVideo?.captionTracks?.[0] as HTMLTrackElement;\n currentTrack ? toggleCaptions() : updateCaption(firstTrack);\n }}\n iconContent={\n <>\n <ControlIcon\n brandComponentTheme={brandComponentTheme}\n className={classnames({ hidden: !playerState.showCaptions })}\n variant=\"solid\"\n name=\"closed-captions\"\n />\n <ControlIcon\n brandComponentTheme={brandComponentTheme}\n className={classnames({ hidden: playerState.showCaptions })}\n name=\"closed-captions\"\n />\n </>\n }\n />\n ) : null}\n {hasSettings ? (\n <SettingsMenu\n brandComponentTheme={brandComponentTheme}\n activeVideo={activeVideo}\n optionsState={optionsState}\n playerState={playerState}\n updateAudioTrack={updateAudioTrack}\n updateTranscript={updateTranscript}\n updateCaption={updateCaption}\n menuProps={settingsMenu}\n videoElement={videoElement}\n />\n ) : null}\n </ul>\n </div>\n );\n}\n","import classnames from 'classnames';\nimport type { VideoControlsProps } from './video-player.controls';\nimport type { useVideoPlayer } from './hooks/use-video-player';\nimport { isValidCue, getCueText } from './util/cue';\n\ntype VideoCaptionsProps = ReturnType<typeof useVideoPlayer>['videoCaptionProps'] &\n Pick<VideoControlsProps, 'brandComponentTheme'> &\n React.ComponentProps<'div'>;\n\nexport function VideoCaptions({\n showCaptions,\n activeCaptionTrack,\n brandComponentTheme: _brandComponentTheme,\n ...elementProps\n}: VideoCaptionsProps) {\n const activeCues = showCaptions\n ? (Array.from(activeCaptionTrack?.track.activeCues ?? []) as VTTCue[]).filter(isValidCue)\n : [];\n\n if (activeCues.length) {\n return (\n <div\n {...elementProps}\n className={classnames(\n 'flex flex-col items-center justify-center overflow-auto bg-text/75 p-2 text-text-inverse lg:text-lg',\n elementProps.className\n )}\n >\n {activeCues.map((cue) => (\n <div\n key={cue.text}\n dangerouslySetInnerHTML={{\n __html: getCueText(cue).html,\n }}\n />\n ))}\n </div>\n );\n }\n\n return null;\n}\n","import type { VideoControlsProps } from './video-player.controls';\nimport type { useVideoPlayer } from './hooks/use-video-player';\nimport { useTranslation } from 'next-i18next';\nimport { Icon } from '@dx-ui/osc-icon';\nimport classnames from 'classnames';\nimport { useState, useMemo, useRef, useEffect, useCallback } from 'react';\nimport { useEventListener, useBoolean } from 'usehooks-ts';\nimport { getKeyDownNavigation } from '@dx-ui/utilities-accessibility';\nimport { BrandButton } from '@dx-ui/osc-brand-buttons';\nimport { isValidCue, getCueText, getCueId } from './util/cue';\nimport './video-player.css';\n\ntype PlayerTranscriptProps = ReturnType<typeof useVideoPlayer>['videoTranscriptProps'];\n\ntype VideoTranscriptProps = PlayerTranscriptProps &\n Pick<VideoControlsProps, 'brandComponentTheme'> &\n React.ComponentProps<'div'>;\n\ntype TranscriptProps = VideoTranscriptProps & {\n activeTranscript: NonNullable<VideoTranscriptProps['activeTranscript']>;\n};\n\nexport function VideoTranscript(props: VideoTranscriptProps) {\n return props.activeTranscript ? (\n <Transcript {...props} activeTranscript={props.activeTranscript} />\n ) : null;\n}\n\nfunction Transcript({\n activeTranscript,\n closeTranscript,\n onCueSelect,\n brandComponentTheme,\n ...elementProps\n}: TranscriptProps) {\n const { t } = useTranslation('osc-video-player');\n\n return (\n <div {...elementProps} className={classnames('relative bg-bg p-4', elementProps.className)}>\n <div className=\"flex w-full items-center justify-between p-1\">\n <h3 className=\"flex items-center pb-2 font-semibold\">\n <Icon className=\"me-2\" name=\"transcripts\" />\n {t('transcript')}\n </h3>\n <button aria-label={t('close')} type=\"button\" onClick={closeTranscript} autoFocus>\n <Icon name=\"close\" />\n </button>\n </div>\n <TranscriptList\n key={activeTranscript.track.id}\n activeTranscript={activeTranscript}\n brandComponentTheme={brandComponentTheme}\n closeTranscript={closeTranscript}\n onCueSelect={onCueSelect}\n />\n </div>\n );\n}\n\nfunction useCues(activeTranscript: TranscriptProps['activeTranscript']) {\n const allCues = useMemo(() => getCues(activeTranscript), [activeTranscript]);\n const [{ activeCues, lastActiveCue }, setActiveCues] = useState<{\n activeCues: VTTCue[];\n lastActiveCue: VTTCue;\n }>(() => {\n const activeCues = getActiveCues(activeTranscript);\n const lastActiveCue = activeCues[activeCues.length - 1] || (allCues[0] as VTTCue);\n return { activeCues, lastActiveCue };\n });\n\n function updateCues() {\n setActiveCues((cueState) => {\n const activeCues = getActiveCues(activeTranscript);\n const activeCue = activeCues[activeCues.length - 1];\n const lastActiveCue = activeCue || cueState.lastActiveCue;\n return { activeCues, lastActiveCue };\n });\n }\n\n return {\n allCues,\n activeCues,\n lastActiveCue,\n updateCues,\n };\n}\n\nfunction TranscriptList({\n activeTranscript,\n closeTranscript,\n onCueSelect,\n brandComponentTheme,\n}: Pick<\n TranscriptProps,\n 'activeTranscript' | 'closeTranscript' | 'onCueSelect' | 'brandComponentTheme'\n>) {\n const { t } = useTranslation('osc-video-player');\n const listRef = useRef<React.ElementRef<'ol'>>(null);\n const { value: isSyncing, setTrue: startSync, setFalse: stopSync } = useBoolean(true);\n const [focusedButton, setFocusedButton] = useState<HTMLButtonElement | null>(null);\n const activeTranscriptRef = useRef(activeTranscript);\n const { allCues, activeCues, lastActiveCue, updateCues } = useCues(activeTranscript);\n const isAutoScrolling = useRef(activeCues.length > 0);\n\n const onKeyDownNavigation = getKeyDownNavigation({\n elements: getAllButtons(listRef),\n onNextFocus: setFocusedButton,\n onPreviousFocus: setFocusedButton,\n });\n\n const onScroll = () => {\n if (!isAutoScrolling.current) {\n stopSync();\n }\n };\n\n const onScrollEnd = () => {\n isAutoScrolling.current = false;\n };\n\n const scrollToActiveCue = useCallback(() => {\n const firstActiveCue = activeCues[0];\n if (listRef.current && firstActiveCue && isSyncing) {\n const activeButton = getActiveButton(listRef, firstActiveCue);\n if (activeButton && activeButton.parentElement) {\n const { offsetTop, offsetHeight } = activeButton.parentElement;\n const { marginTop, marginBottom } = window.getComputedStyle(activeButton.parentElement);\n const itemMargins = parseInt(marginTop, 10) + parseInt(marginBottom, 10);\n const itemOffset = offsetTop - offsetHeight - itemMargins;\n const top = itemOffset - listRef.current.offsetTop;\n isAutoScrolling.current = true;\n listRef.current.scrollTo({ top });\n }\n }\n }, [isSyncing, activeCues]);\n\n const onKeyDown = (event: KeyboardEvent) => {\n event.stopPropagation();\n switch (event.key) {\n case 'Escape':\n closeTranscript();\n break;\n case 'ArrowUp':\n case 'ArrowDown':\n onKeyDownNavigation(event);\n break;\n default:\n break;\n }\n };\n\n useEffect(scrollToActiveCue, [scrollToActiveCue]);\n useEventListener('cuechange', updateCues, activeTranscriptRef);\n useEventListener('scroll', onScroll, listRef);\n useEventListener('scrollend', onScrollEnd, listRef);\n useEventListener('keydown', onKeyDown, listRef);\n\n return (\n <>\n <ol\n className={classnames(\n 'max-h-64 space-y-1 overflow-y-auto overscroll-contain motion-safe:scroll-smooth sm:max-h-80',\n {\n 'pb-10': !isSyncing,\n }\n )}\n ref={listRef}\n data-testid=\"video-player-transcript-list\"\n >\n {allCues.map((cue) => {\n const isActive = activeCues.includes(cue);\n const isFocusable = focusedButton\n ? focusedButton.dataset.id === cue.id\n : lastActiveCue === cue;\n return (\n <TranscriptLine\n isActive={isActive}\n isFocusable={isFocusable}\n cue={cue}\n key={cue.id}\n onCueSelect={onCueSelect}\n />\n );\n })}\n </ol>\n {!isSyncing ? (\n <BrandButton\n className=\"absolute bottom-2 start-1/2 -translate-x-1/2 text-sm rtl:translate-x-1/2\"\n onClick={() => {\n isAutoScrolling.current = true;\n startSync();\n setFocusedButton(null);\n getActiveButton(listRef, lastActiveCue)?.focus();\n }}\n label={t('sync')}\n brandComponentTheme={brandComponentTheme}\n variant=\"solid\"\n />\n ) : null}\n </>\n );\n}\n\nfunction TranscriptLine({\n cue,\n onCueSelect,\n isActive,\n isFocusable,\n}: Pick<TranscriptProps, 'onCueSelect'> & {\n cue: VTTCue;\n isActive: boolean;\n isFocusable: boolean;\n}) {\n const { t } = useTranslation('osc-video-player');\n const { text, html } = getCueText(cue);\n return (\n <li className=\"p-1\">\n <button\n type=\"button\"\n className={classnames('flex items-baseline gap-3 rounded-sm p-1 hover:bg-bg-alt', {\n 'bg-bg-alt': isActive,\n })}\n onClick={() => onCueSelect(cue)}\n tabIndex={isFocusable ? 0 : -1}\n data-id={cue.id}\n aria-current={isActive ? 'time' : false}\n aria-label={t('time', {\n minutes: t('minute', { count: floorMinutes(cue.startTime) }),\n seconds: t('second', { count: floorSeconds(cue.startTime) }),\n text,\n })}\n >\n <span className=\"font-semibold tabular-nums text-primary underline\">\n {formatTime(cue.startTime)}\n </span>\n <span className=\"text-start\" dangerouslySetInnerHTML={{ __html: html }} />\n </button>\n </li>\n );\n}\n\nfunction getActiveCues(activeTranscript: TranscriptProps['activeTranscript']) {\n return (Array.from(activeTranscript.track.activeCues || []) as VTTCue[]).filter(isValidCue);\n}\n\nfunction getCues(activeTranscript: TranscriptProps['activeTranscript']) {\n return (Array.from(activeTranscript.track.cues || []) as VTTCue[])\n .filter(isValidCue)\n .map((cue) => {\n cue.id = cue.id || getCueId(cue);\n return cue;\n });\n}\n\nfunction formatTime(time: number) {\n const minFmt = padTime(floorMinutes(time));\n const secFmt = padTime(floorSeconds(time));\n return `${minFmt}:${secFmt}`;\n}\n\nconst floorMinutes = (time: number) => Math.floor(time / 60);\nconst floorSeconds = (time: number) => Math.floor(time % 60);\nconst padTime = (time: number) => time.toString().padStart(2, '0');\n\nfunction getActiveButton(\n listRef: React.RefObject<HTMLUListElement>,\n cue: VTTCue\n): HTMLButtonElement | null {\n return (listRef.current?.querySelector(`[data-id=\"${cue.id}\"]`) as HTMLButtonElement) || null;\n}\n\nfunction getAllButtons(listRef: React.RefObject<HTMLUListElement>): HTMLButtonElement[] {\n return Array.from(listRef.current?.querySelectorAll('li > button') || []);\n}\n","import classnames from 'classnames';\nimport { useMemo } from 'react';\n\ntype UseVideoPlayerClassesProps = Partial<{ isLandscape: boolean }>;\n\nexport function useVideoPlayerClasses({ isLandscape = true }: UseVideoPlayerClassesProps) {\n const baseControlsClasses = 'absolute -bottom-6 start-1/2 z-10 -translate-x-1/2';\n\n return useMemo(\n () => ({\n captionClassNames: classnames(\n 'absolute inset-x-0 bottom-8 mx-auto w-[calc(100%-2rem)] sm:max-w-fit',\n {\n 'sm:bottom-16 sm:mb-2': isLandscape,\n }\n ),\n controlsClassNames: {\n default: classnames(baseControlsClasses, 'rtl:translate-x-1/2', {\n 'sm:bottom-4 sm:start-4 sm:translate-x-0 sm:rtl:translate-x-0': isLandscape,\n }),\n center: classnames(baseControlsClasses, 'lg:bottom-4 rtl:translate-x-1/2'),\n left: classnames(baseControlsClasses, 'lg:bottom-4 lg:start-4 lg:translate-x-0'),\n right: classnames(\n baseControlsClasses,\n 'lg:bottom-4 lg:end-4 lg:start-auto lg:translate-x-0'\n ),\n },\n transcriptClassNames: 'container p-4 pt-8 sm:pt-4',\n wrapperClassNames: 'relative',\n }),\n [isLandscape]\n );\n}\n","import Head from 'next/head';\n\ntype Schema = {\n name: string;\n logo: string;\n description: string;\n thumbnailUrl: string;\n uploadDate: string;\n duration: string;\n embedUrl: string;\n};\n\nexport type VideoPlayerMarkupProps = {\n markupSchemas?: Schema[] | null;\n};\n\nexport const VideoPlayerMarkup: React.FC<VideoPlayerMarkupProps> = ({ markupSchemas }) => {\n return markupSchemas?.map(\n ({ name, logo, description, thumbnailUrl, uploadDate, duration, embedUrl }) => (\n <Head key={name}>\n <script\n data-testid=\"video-markup-schema\"\n type=\"application/ld+json\"\n dangerouslySetInnerHTML={{\n __html: JSON.stringify({\n '@context': 'http://schema.org',\n '@type': 'VideoObject',\n name,\n logo,\n description,\n thumbnailUrl,\n uploadDate,\n duration,\n embedUrl,\n }),\n }}\n />\n </Head>\n )\n );\n};\n","import { useRef } from 'react';\nimport classnames from 'classnames';\nimport { useVideoPlayer } from './hooks/use-video-player';\nimport { Video } from './video-player.player';\nimport { VideoControls } from './video-player.controls';\nimport { VideoCaptions } from './video-player.captions';\nimport { VideoTranscript } from './video-player.transcripts';\nimport { useVideoPlayerClasses } from './hooks/use-video-player-classnames';\nimport { VideoPlayerMarkup } from './video-player.markup';\n\ntype HookProps = Parameters<typeof useVideoPlayer>[0];\ntype VideoProps = Omit<React.ComponentProps<typeof Video>, 'videoElement' | 'isAutoPlay'>;\ntype CaptionProps = Pick<React.ComponentProps<typeof VideoCaptions>, 'className'>;\ntype TranscriptProps = Pick<React.ComponentProps<typeof VideoTranscript>, 'className'>;\ntype ControlsProps = Pick<React.ComponentProps<typeof VideoControls>, 'className' | 'videoVariant'>;\ntype Orientation = 'portrait' | 'landscape';\n\ntype VideoPlayerProps = HookProps &\n VideoProps &\n Partial<{\n brandComponentTheme: CmsBrandComponentTheme;\n videoCaptionsProps: CaptionProps;\n videoControlsProps: ControlsProps;\n videoTranscriptProps: TranscriptProps;\n wrapperClassName: React.ComponentProps<'div'>['className'];\n orientation: Orientation;\n altText: string | undefined;\n }> & {\n markupSchemas?: React.ComponentProps<typeof VideoPlayerMarkup>['markupSchemas'];\n };\n\n/**\n * Native video player that composes a number of components to render a video with\n * support for closed captions, audio descriptions, and transcripts.\n *\n * @note Does not support ABS (Adaptive bitrate streaming).\n */\nexport function VideoPlayer({\n videoCaptionsProps,\n videoControlsProps,\n videoTranscriptProps,\n audioTracks,\n captionTracks,\n transcriptTracks,\n brandComponentTheme,\n videoGroup = 'standard',\n videoLabel,\n videoName,\n wrapperClassName,\n orientation = 'landscape',\n markupSchemas,\n hasAudio,\n ...videoProps\n}: VideoPlayerProps) {\n const wrapperElement = useRef<React.ElementRef<'div'>>(null);\n const isLandscape = orientation === 'landscape';\n const playerClasses = useVideoPlayerClasses({ isLandscape });\n const playerProps = useVideoPlayer({\n ...videoProps,\n hasAudio,\n videoGroup,\n videoLabel,\n videoName,\n wrapperElement,\n audioTracks,\n captionTracks,\n transcriptTracks,\n });\n\n return (\n <>\n <div\n className={classnames(playerClasses.wrapperClassNames, wrapperClassName)}\n ref={wrapperElement}\n >\n <Video {...videoProps} {...playerProps.videoProps} />\n <VideoCaptions\n {...videoCaptionsProps}\n {...playerProps.videoCaptionProps}\n brandComponentTheme={brandComponentTheme}\n className={classnames(playerClasses.captionClassNames, videoCaptionsProps?.className)}\n />\n <VideoControls\n {...videoControlsProps}\n {...playerProps.videoControlsProps}\n brandComponentTheme={brandComponentTheme}\n className={classnames(\n playerClasses.controlsClassNames['default'],\n videoControlsProps?.className\n )}\n />\n </div>\n <VideoTranscript\n {...playerProps.videoTranscriptProps}\n brandComponentTheme={brandComponentTheme}\n className={classnames(playerClasses.transcriptClassNames, videoTranscriptProps?.className)}\n />\n <VideoPlayerMarkup markupSchemas={markupSchemas} />\n </>\n );\n}\n","import type { Multimedia as AwardMultimedia } from 'dx-shared-schema/dist/types/couchbase/award';\nimport type { Multimedia as BrandMultimedia } from 'dx-shared-schema/dist/types/couchbase/brand';\nimport type { Multimedia as EventMultimedia } from 'dx-shared-schema/dist/types/couchbase/event';\nimport type { Multimedia as PartnerMultimedia } from 'dx-shared-schema/dist/types/couchbase/partner';\nimport type { Multimedia as LocationMultimedia } from 'dx-shared-schema/dist/types/couchbase/location';\nimport type { Multimedia as PlaceMultimedia } from 'dx-shared-schema/dist/types/couchbase/place';\nimport type { Multimedia as StoryMultimedia } from 'dx-shared-schema/dist/types/couchbase/story';\nimport type { VideoPlayer } from './video-player';\nimport type { VideoPlayerMarkup } from './video-player.markup';\nimport type { VideoPlayerProps } from './hooks/use-video-player';\nimport { env } from '@dx-ui/framework-env';\nimport groupBy from 'lodash/groupBy';\n\ntype AllMultimedia =\n | AwardMultimedia\n | BrandMultimedia\n | EventMultimedia\n | PartnerMultimedia\n | LocationMultimedia\n | PlaceMultimedia\n | StoryMultimedia;\n\ntype Metadata = AllMultimedia['multimediaMetadata'][number];\n\n// NOTE: Re-construct these types to resolve the incompatible types between dx-shared-schema and Core+ types\nexport type Multimedia = Omit<AllMultimedia, 'multimediaMetadata' | 'orientation'> & {\n multimediaMetadata: MultimediaMetadatum[];\n orientation: AllMultimedia['orientation'];\n};\n\nexport type MultimediaMetadatum = Omit<Metadata, 'language' | 'type'> & {\n language: string;\n type: Metadata['type'];\n};\n\ntype MappedPage = { brandCode?: string; pathname?: string };\n\nexport function mapMultimediaListToVideoProps({\n multimedia,\n mappedPage,\n groupIdentifier = multimedia[0]?.groupIdentifier || null,\n}: {\n multimedia: Multimedia[];\n mappedPage: MappedPage;\n groupIdentifier?: string | null;\n}): React.ComponentProps<typeof VideoPlayer> {\n const [firstVideo, ...additionalVideos] = groupMultimedia(multimedia, groupIdentifier);\n const videoTrack = mapMultimediaToVideoTrack(firstVideo);\n\n const markupSchemas: Required<React.ComponentProps<typeof VideoPlayerMarkup>['markupSchemas']> =\n multimedia\n .filter((multimedia) => multimedia.description)\n .map((multimedia) =>\n mapVideoMarkup(multimedia as ValidatedVideoMarkupMultimedia, mappedPage)\n );\n\n return {\n ...videoTrack,\n audioTracks: additionalVideos.map(mapMultimediaToVideoTrack),\n isAutoPlay: firstVideo.videoAutoPlay,\n isMuted: firstVideo.noAudio,\n altText: firstVideo.altText ?? '',\n orientation: firstVideo.orientation,\n posterImageUrl: firstVideo.posterImageUrl,\n markupSchemas,\n };\n}\n\nfunction mapMultimediaToVideoTrack(multimedia: Multimedia): Omit<VideoPlayerProps, 'audioTracks'> {\n return {\n videoName: multimedia.videoName,\n videoUrl: multimedia.videoUrl,\n videoGroup: getVideoGroup(multimedia),\n videoLabel: multimedia.audioTrackLabel || multimedia.alternativeVideoLabel,\n //description field is an interim measure. Here is long term solution https://jira.hilton.com/browse/NHCBP-5914\n ...(multimedia.description && { altText: multimedia.description }),\n captionTracks: filterByTrackType(multimedia.multimediaMetadata, 'captionTrack'),\n captionData: mapCaptionData(multimedia.captionLink),\n transcriptTracks: filterByTrackType(multimedia.multimediaMetadata, 'transcriptTrack'),\n };\n}\n\nfunction filterByTrackType(\n multimediaMetadata: MultimediaMetadatum[],\n type: MultimediaMetadatum['type']\n) {\n return multimediaMetadata.filter((metadata) => metadata.type === type);\n}\n\nfunction groupMultimedia(multimediaList: Multimedia[], groupIdentifier: string | null) {\n return (\n groupBy(multimediaList, (multimedia) => multimedia.groupIdentifier || null)[\n String(groupIdentifier)\n ] || []\n ).toSorted((a, b) => Number(b.primaryVideo ?? 0) - Number(a.primaryVideo ?? 0)) as [\n Multimedia,\n ...Multimedia[]\n ];\n}\n\nfunction getVideoGroup(multimedia: Multimedia): NonNullable<VideoPlayerProps['videoGroup']> {\n const isExtended = Boolean(multimedia.extended || multimedia.extendedAudioDescription);\n return isExtended ? 'extended' : 'standard';\n}\n\ntype NoUndefinedField<T> = { [P in keyof T]: Exclude<T[P], null | undefined> };\n\ntype ValidatedVideoMarkupMultimedia = NoUndefinedField<\n Required<\n Pick<\n Multimedia,\n 'videoName' | 'description' | 'posterImageUrl' | 'uploadDatetime' | 'videoDuration'\n >\n >\n>;\n\nfunction mapVideoMarkup(multimedia: ValidatedVideoMarkupMultimedia, mappedPage: MappedPage) {\n const { brandCode = 'WW', pathname = '' } = mappedPage;\n const baseUrl = env('OHW_BASE_URL', 'https://www.hilton.com');\n return {\n name: multimedia.videoName,\n logo: new URL(`/modules/assets/svgs/logos/${brandCode}.svg`, baseUrl).toString(),\n description: multimedia.description,\n thumbnailUrl: multimedia.posterImageUrl,\n uploadDate: multimedia.uploadDatetime.toString(),\n duration: multimedia.videoDuration,\n embedUrl: new URL(pathname, baseUrl).toString(),\n };\n}\n\nfunction mapCaptionData(\n captionLink: AllMultimedia['captionLink']\n): VideoPlayerProps['captionData'] {\n if (captionLink) {\n return {\n caption: captionLink.linkLabel,\n captionLink: captionLink.linkUrl,\n captionLinkTarget: captionLink.isNewWindow ? '_blank' : undefined,\n };\n }\n return undefined;\n}\n","export * from './video-player';\nexport * from './video-player.player';\nexport * from './video-player.captions';\nexport * from './video-player.controls';\nexport * from './video-player.transcripts';\nexport * from './hooks/use-video-player';\nexport * from './hooks/use-video-player-classnames';\nexport * from './video-player.markup';\nexport * from './video-player.mapper';\nexport * from './util/event-emitter';\n","export * from './lib';\n","import classnames from 'classnames';\nimport { Icon } from '@dx-ui/osc-icon';\nimport type { IconProps } from '@dx-ui/osc-icon';\n\nexport function BrandIcon(props: IconProps) {\n return (\n <span className=\"inline-block self-center\">\n <Icon {...props} className={classnames(props.className)} />\n </span>\n );\n}\n","import classnames from 'classnames';\n\nexport type Variant = 'solid' | 'outline';\n\nexport type ClassNamesArgs = Partial<{\n brandComponentTheme: CmsBrandComponentTheme;\n variant: Variant;\n}>;\n\nexport function getClassnames({ brandComponentTheme: theme, variant }: ClassNamesArgs) {\n const isDark = theme === 'dark';\n const isLight = theme === 'light';\n const isSolid = variant === 'solid';\n const isOutline = variant === 'outline';\n return classnames('btn-brand motion-safe:transition', {\n 'btn-brand-solid': isSolid && !isLight && !isDark,\n 'btn-brand-outline': isOutline && !isLight && !isDark,\n 'btn-brand-dark': isDark && !isSolid && !isOutline,\n 'btn-brand-dark-outline': isDark && isOutline,\n 'btn-brand-dark-solid': isDark && isSolid,\n 'btn-brand-light': isLight && !isSolid && !isOutline,\n 'btn-brand-light-outline': isLight && isOutline,\n 'btn-brand-light-solid': isLight && isSolid,\n });\n}\n","import type { Icon } from '@dx-ui/osc-icon';\nimport { Link } from '@dx-ui/osc-link';\nimport cx from 'classnames';\nimport type { MouseEvent } from 'react';\nimport { forwardRef } from 'react';\nimport { BrandIcon } from './brand-icon';\nimport type { Variant } from './util/button';\nimport { getClassnames } from './util/button';\n\nexport interface BrandLinkProps extends Omit<Link, 'label'> {\n label: React.ReactNode;\n /** Add Icon props to buttons with Icons */\n iconProps?: React.ComponentProps<typeof Icon>;\n /** Brand color themes, \"light\" | \"dark\" */\n brandComponentTheme?: CmsBrandComponentTheme;\n /** Button variant */\n variant?: Variant;\n /** OnClick callback */\n onClick?: (e: MouseEvent<HTMLAnchorElement>) => void;\n metricsOnClick?: () => void;\n /** Icon alignment, \"before\" | \"after\" */\n iconAlign?: 'before' | 'after';\n}\n\nexport const BrandLink = forwardRef<HTMLAnchorElement, BrandLinkProps>(\n (\n {\n label,\n iconProps,\n brandComponentTheme,\n variant,\n onClick,\n metricsOnClick,\n iconAlign = 'before',\n ...linkProps\n },\n ref\n ) => (\n <Link\n {...linkProps}\n ref={ref}\n anchorClassName={cx(\n linkProps.anchorClassName,\n getClassnames({ brandComponentTheme, variant })\n )}\n className={cx('gap-2', linkProps.className)}\n isNewWindow={linkProps.isNewWindow || false}\n url={linkProps.url}\n showNewWindowIcon={(linkProps.showNewWindowIcon && linkProps.isNewWindow) || false}\n underline={false}\n data-testid=\"CTALinkE2ETest\"\n onClick={(e) => {\n onClick?.(e);\n metricsOnClick?.();\n }}\n >\n {iconAlign === 'before' && iconProps ? <BrandIcon {...iconProps} /> : null}\n {label}\n {iconAlign === 'after' && iconProps ? <BrandIcon {...iconProps} /> : null}\n </Link>\n )\n);\n\nBrandLink.displayName = 'BrandLink';\n\nexport default BrandLink;\n","import type { Icon } from '@dx-ui/osc-icon';\nimport cx from 'classnames';\nimport { forwardRef } from 'react';\nimport { BrandIcon } from './brand-icon';\nimport type { Variant } from './util/button';\nimport { getClassnames } from './util/button';\n\nexport interface BrandButtonProps extends Omit<React.ComponentPropsWithoutRef<'button'>, 'type'> {\n /** Button label */\n label?: React.ReactNode;\n /** Add Icon props to buttons with Icons */\n iconProps?: React.ComponentProps<typeof Icon>;\n /** Brand color themes, \"light\" | \"dark\" */\n brandComponentTheme?: CmsBrandComponentTheme;\n /** Button variant */\n variant?: Variant;\n /** Icon alignment, \"before\" | \"after\" */\n iconAlign?: 'before' | 'after';\n}\n\n/** This is a one stop shop for all brand button needs, to add style exceptions so all buttons stay up to day. Check out some of the exceptions on Curio and Waldorf. */\nexport const BrandButton = forwardRef<HTMLButtonElement, BrandButtonProps>(\n (\n { label, variant, iconProps, brandComponentTheme, iconAlign = 'before', ...buttonProps },\n ref\n ) => (\n <button\n type=\"button\"\n {...buttonProps}\n ref={ref}\n className={cx(buttonProps.className, getClassnames({ brandComponentTheme, variant }))}\n data-testid=\"CTAButtonE2ETest\"\n >\n <span className=\"flex gap-2\" data-testid=\"buttonContentParent\">\n {iconAlign === 'before' && iconProps ? <BrandIcon {...iconProps} /> : null}\n {label}\n {iconAlign === 'after' && iconProps ? <BrandIcon {...iconProps} /> : null}\n </span>\n </button>\n )\n);\n\nBrandButton.displayName = 'BrandButton';\n\nexport default BrandButton;\n","export * from './brand-link';\nexport * from './brand-button';\n","export * from './lib';\nexport type { Variant } from './lib/util/button';\n","import type { CSSProperties } from 'react';\nimport type { PossibleThumbs, TSlider } from './slider.types';\n\ntype UseInlineGradient = Pick<\n TSlider<PossibleThumbs, PossibleThumbs>,\n 'disabled' | 'offColor' | 'onColor' | 'orientation' | 'brandComponentTheme' | 'variant'\n> & {\n /**\n * Array of 3-tuples. First value determines \"on\" or \"off\", 0 or 1, respectively.\n * The remainder specify the `on` percentages in the gradient [0,10], [40,50].\n */\n values: Tuple<3, number>[];\n /** Whether the language displayed on the page is right to left */\n isRtlLanguage?: boolean;\n};\n\nexport const defaultColorVariables = {\n offColor: 'color-border-form',\n onColor: 'color-primary',\n disabledColor: 'color-bg-disabled',\n} as const;\n\nexport const primaryColorVariables = {\n offColor: 'color-primary',\n onColor: 'color-primary',\n} as const;\n\nconst customColorVariables = {\n offColor: 'slider-gradient-off-color',\n onColor: 'slider-gradient-on-color',\n};\n\n/**\n * This hook is used specifically to return css for the horizontal gradient in the `Slider` component\n * using the colors from the [style guide](/?path=/docs/library-styles-colors--colors)\n *\n * > Ideally this inline styling could eventually be replaced with css vars via TW plugin.\n */\nexport const useInlineGradient = ({\n values,\n disabled = false,\n offColor = defaultColorVariables.offColor,\n onColor = defaultColorVariables.onColor,\n isRtlLanguage = false,\n orientation = 'horizontal',\n variant = 'default',\n brandComponentTheme,\n}: UseInlineGradient): CSSProperties => {\n const direction = getDirection({ isRtlLanguage, orientation });\n const { on: gradientOnColor, off: gradientOffColor } = getGradientColors({\n brandComponentTheme,\n variant,\n offColor,\n onColor,\n });\n const gradientDisabledColor = `var(--${defaultColorVariables.disabledColor})`;\n const on = `rgb(${disabled ? gradientDisabledColor : gradientOnColor})`;\n const off = `rgb(${disabled ? gradientDisabledColor : gradientOffColor})`;\n const collect = values.reduce((prev, val) => {\n /** first value determines if section is filled or not */\n const filled = Boolean(val[0]);\n return `${prev}, ${filled ? on : off} ${val[1]}%, ${filled ? on : off} ${val[2]}%`;\n }, ``);\n const background = `linear-gradient(to ${direction}${collect})`;\n return { background };\n};\n\nfunction getDirection({\n orientation,\n isRtlLanguage,\n}: Pick<UseInlineGradient, 'orientation' | 'isRtlLanguage'>) {\n if (orientation === 'vertical') {\n return 'top';\n }\n if (isRtlLanguage) {\n return 'left';\n }\n return 'right';\n}\n\nfunction getGradientColors({\n brandComponentTheme,\n variant,\n onColor,\n offColor,\n}: Pick<UseInlineGradient, 'brandComponentTheme' | 'variant' | 'offColor' | 'onColor'>) {\n const themeSuffix = brandComponentTheme ? `-${brandComponentTheme}` : '';\n const presetVariables = variant === 'primary' ? primaryColorVariables : { onColor, offColor };\n return {\n off: `var(--${customColorVariables.offColor}${themeSuffix}, var(--${presetVariables.offColor}))`,\n on: `var(--${customColorVariables.onColor}${themeSuffix}, var(--${presetVariables.onColor}))`,\n };\n}\n\nexport default useInlineGradient;\n","import { useIsomorphicLayoutEffect } from 'usehooks-ts';\nimport { useState, useCallback } from 'react';\n\nconst emptyRect = {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n width: 0,\n height: 0,\n} as DOMRect;\n\n/**\n * This custom useResizeObserver hook fixes an issue with label alignment for the slider in Safari.\n * @param initialRect partial DOMRect to be used before measure. defaults to empty rect\n * @todo add debounce or raf throttle\n */\nexport const useResizeObserver = (initialRect: Partial<DOMRect> = emptyRect) => {\n const [element, setElement] = useState<HTMLElement | null>();\n const [rect, setRect] = useState<DOMRect>(initialRect as Readonly<DOMRect>);\n\n const ref = useCallback((e: HTMLElement | null) => {\n setElement(e);\n }, []);\n\n useIsomorphicLayoutEffect(() => {\n const ro = new ResizeObserver((entries) => {\n setRect(entries[0] ? entries[0].contentRect : (initialRect as Readonly<DOMRect>));\n });\n if (element) {\n ro.observe(element);\n }\n return () => {\n element && ro.unobserve(element);\n setRect(emptyRect);\n };\n }, [element, initialRect]);\n\n return [ref, rect] as const;\n};\n","import { forwardRef, useRef, useState } from 'react';\nimport type { ReactNode } from 'react';\nimport { useIsomorphicLayoutEffect } from 'usehooks-ts';\n// Using a custom useResizeObserver hook due to a label alignment issue with the slider in Safari when the useResizeObserver hook from usehooks-ts is used.\n// This is likely happening because of how on initial mount the bounding box size is not recorded.\nimport { useResizeObserver } from './use-resize-observer';\nimport cx from 'classnames';\nimport type { PossibleThumbs } from './slider.types';\n\ntype TThumbLabelProps<T extends PossibleThumbs, U extends T> = {\n /** Whether the language is written right to left */\n isRtlLanguage: boolean;\n /** A tuple of labels corresponding to each input value, they are screen reader only labels and add additional context to the visible labels shown */\n inputLabels: Tuple<U, string>;\n /** array of labels */\n labels: string[] | ReactNode[];\n /** Whether the thumb label is displayed as text or a tooltip */\n labelType: 'text' | 'tooltip';\n /** array of normalized positions of label thumbs along the track */\n valueRatios: number[];\n};\n\n// the thumb diameter\nexport const THUMB_W = 28;\n// the distance at which labels are joined with a LabelJoin\nexport const LABEL_JOIN_DISTANCE = 20;\nexport const JOIN_LABEL_LENGTH = 6;\n\nconst LABEL_JOIN_CENTER = LABEL_JOIN_DISTANCE / 2 + JOIN_LABEL_LENGTH / 2;\n\nconst tooltipClasses =\n 'relative h-max bg-bg text-text-alt text-left text-xs font-normal px-4 py-2.5 w-max border border-border';\n\nconst textClasses =\n 'absolute inline-block w-20 max-w-max -translate-x-2/4 whitespace-nowrap text-center font-bold';\n\nconst calculateLabelPositions = (\n trackRect: DOMRect,\n valueRatios: number[],\n labelRefs: HTMLElement[],\n isRtlLanguage: boolean\n) => {\n const labelRects = labelRefs?.map((label) => label.getBoundingClientRect());\n const xCoordinates = labelRects?.map((rect, i) => {\n let x =\n (trackRect?.width - THUMB_W) * (valueRatios[i] as number) + THUMB_W / 2 - rect?.width / 2;\n if (x < trackRect?.left) {\n x = 0;\n } else if (x + rect?.width > trackRect?.right) {\n x = trackRect?.right - rect?.width;\n }\n return isRtlLanguage ? -x : x;\n });\n\n if (isRtlLanguage) {\n xCoordinates.reverse();\n }\n\n return { xCoordinates, labelRects };\n};\n\nconst adjustLabelOverlaps = (\n xCoordinates: number[],\n labelRects: DOMRect[],\n trackRect: DOMRect,\n isRtlLanguage: boolean\n) => {\n const joinLabelXCoordinates = Array<number | null>(xCoordinates?.length).fill(null);\n\n for (let i = 0; i < xCoordinates.length - 1; i++) {\n const overlap =\n (xCoordinates[i] as number) +\n LABEL_JOIN_DISTANCE +\n (labelRects[i] as DOMRect)?.width -\n (xCoordinates[i + 1] as number);\n if (overlap > 0) {\n const limits = isRtlLanguage\n ? {\n left: -(trackRect.right - (labelRects[i] as DOMRect)?.width),\n right: 0,\n track: trackRect?.left,\n }\n : {\n left: 0,\n right: trackRect.right - (labelRects[i + 1] as DOMRect)?.width,\n track: trackRect.right,\n };\n\n if ((xCoordinates[i] as number) - overlap / 2 < limits?.left) {\n xCoordinates[i] = limits?.left;\n xCoordinates[i + 1] =\n (xCoordinates[i] as number) + (labelRects[i] as DOMRect)?.width + LABEL_JOIN_DISTANCE;\n } else if (\n (xCoordinates[i + 1] as number) + (labelRects[i + 1] as DOMRect)?.width + overlap / 2 >\n limits.track\n ) {\n xCoordinates[i + 1] = limits.right;\n xCoordinates[i] =\n (xCoordinates[i + 1] as number) - (labelRects[i] as DOMRect)?.width - LABEL_JOIN_DISTANCE;\n } else {\n (xCoordinates[i] as number) -= overlap / 2;\n (xCoordinates[i + 1] as number) += overlap / 2;\n }\n joinLabelXCoordinates[i] = isRtlLanguage\n ? (xCoordinates[i] as number) + LABEL_JOIN_CENTER\n : (xCoordinates[i + 1] as number) - LABEL_JOIN_CENTER;\n }\n }\n\n for (let i = xCoordinates?.length - 1; i > 0; i--) {\n const overlap =\n (xCoordinates[i - 1] as number) +\n (labelRects[i - 1] as DOMRect)?.width +\n LABEL_JOIN_DISTANCE -\n (xCoordinates[i] as number);\n if (overlap > 0) {\n (xCoordinates[i - 1] as number) -= overlap;\n joinLabelXCoordinates[i - 1] = isRtlLanguage\n ? (xCoordinates[i - 1] as number) + LABEL_JOIN_DISTANCE - JOIN_LABEL_LENGTH\n : (xCoordinates[i] as number) - LABEL_JOIN_DISTANCE + JOIN_LABEL_LENGTH;\n }\n }\n\n if (isRtlLanguage) {\n const overlap = xCoordinates[0] as number;\n const limit = -trackRect.right + (labelRects[labelRects?.length - 1] as DOMRect)?.width;\n if (overlap < limit) {\n xCoordinates[0] = limit;\n for (let i = 0; i < xCoordinates?.length - 1; i++) {\n if (joinLabelXCoordinates[i] !== null) {\n joinLabelXCoordinates[i] =\n (xCoordinates[i] as number) + LABEL_JOIN_DISTANCE - JOIN_LABEL_LENGTH;\n xCoordinates[i + 1] =\n (xCoordinates[i] as number) + (labelRects[i] as DOMRect)?.width + LABEL_JOIN_DISTANCE;\n } else break;\n }\n }\n } else {\n const overlap = -(xCoordinates[0] as number);\n if (overlap > 0) {\n (xCoordinates[0] as number) += overlap;\n for (let i = 0; i < xCoordinates?.length - 1; i++) {\n if (joinLabelXCoordinates[i] !== null) {\n joinLabelXCoordinates[i] = (joinLabelXCoordinates[i] as number) + overlap;\n (xCoordinates[i + 1] as number) += overlap;\n } else break;\n }\n }\n }\n\n return joinLabelXCoordinates;\n};\n\ntype LabelProps = {\n /** Screenreader only label to give additional context to the visible labels */\n additionalLabel?: string;\n id: string;\n /** Label content */\n label: string | ReactNode;\n /** The horizontal position for the label center correctly over the thumb */\n labelPosition?: number;\n /** Whether the label is shown as text or in a tooltip */\n labelType: string;\n};\n\nfunction getTooltipTopOffset({ tooltipRect }: { tooltipRect?: DOMRect }) {\n return tooltipRect ? tooltipRect?.height + 2 : 0;\n}\n\nconst Label = forwardRef<HTMLSpanElement, LabelProps>(\n ({ additionalLabel, id, label, labelPosition, labelType }, forwardedRef) => {\n return (\n <span\n id={id}\n key={id}\n ref={forwardedRef}\n className={labelType === 'tooltip' ? tooltipClasses : textClasses}\n style={{ transform: `translateX(${labelPosition}px` }}\n >\n <span aria-hidden=\"true\">{label}</span>\n <span className=\"sr-only\">{additionalLabel}</span>\n </span>\n );\n }\n);\n\nLabel.displayName = 'Label';\n\n/**\n * smart positioned text labels that position themselves as close to centered over their corresponding thumb positions\n * as possible. valueRatios[] are normalized thumb positions from 0 to 1. A layout effect and resize observer hook is used to prevent overlaps\n * @todo the layout effect is O(n) and could possibly be improved, and definitely cleaned up a bit\n */\nconst ThumbLabels = <T extends PossibleThumbs, U extends T>({\n inputLabels,\n isRtlLanguage,\n labels,\n labelType = 'text',\n valueRatios,\n}: TThumbLabelProps<T, U>) => {\n const [trackRef, trackRect] = useResizeObserver();\n const [labelsX, setLabelsX] = useState<number[]>([]);\n const labelRefs = useRef<HTMLElement[]>([]).current;\n const [labelElementRects, setLabelRects] = useState<DOMRect[]>([]);\n const [joinLabelXCoordinates, setJoinLabelXCoordinates] = useState<Array<number | null>>([]);\n const [topOffsetState, setTopOffset] = useState<number>(0);\n\n useIsomorphicLayoutEffect(() => {\n const { xCoordinates, labelRects } = calculateLabelPositions(\n trackRect,\n valueRatios,\n labelRefs,\n isRtlLanguage\n );\n setLabelRects(labelRects);\n const topOffset = getTooltipTopOffset({\n tooltipRect: labelElementRects[0],\n });\n setTopOffset(topOffset);\n const joinLabelXCoordinates = adjustLabelOverlaps(\n xCoordinates,\n labelRects,\n trackRect,\n isRtlLanguage\n );\n setJoinLabelXCoordinates(joinLabelXCoordinates);\n setLabelsX(xCoordinates);\n }, [trackRect, valueRatios, isRtlLanguage, topOffsetState, setTopOffset]);\n\n return (\n <span\n ref={trackRef}\n className={cx('absolute flex size-full justify-between', {\n '-top-5': labelType === 'text',\n '-z-1': labelType === 'tooltip',\n })}\n style={labelType === 'tooltip' ? { top: `-${topOffsetState}px` } : {}}\n >\n {labels?.map((label: ReactNode, i: number) => {\n return (\n <Label\n // eslint-disable-next-line react/no-array-index-key\n key={i}\n id={`slider-thumb-label-${i}`}\n label={label}\n ref={(ref) => {\n if (ref) {\n labelRefs[i] = ref;\n }\n }}\n labelPosition={labelsX[i]}\n labelType={labelType}\n additionalLabel={inputLabels[i]}\n />\n );\n })}\n {joinLabelXCoordinates\n .filter((value: number | null) => value !== null)\n .map((value: number | null, i: number) => (\n <span\n className=\"absolute inline-block text-center text-text-alt before:content-['-']\"\n aria-hidden=\"true\"\n // eslint-disable-next-line react/no-array-index-key\n key={i}\n style={{\n transform: `translateX(${value}px)`,\n }}\n />\n ))}\n </span>\n );\n};\n\nexport default ThumbLabels;\n","import { useRef } from 'react';\nimport * as SliderPrimitive from '@radix-ui/react-slider';\nimport type { PossibleThumbs, TSlider } from './slider.types';\nimport useInlineGradient, { defaultColorVariables } from './use-inline-gradient';\nimport cx from 'classnames';\nimport ThumbLabels from './thumb-labels';\nimport { isRtl } from '@dx-ui/utilities-get-language-direction';\n\n/**\n * A slider component that can have multiple thumbs. Each thumb can have a label and a value.\n * @see [Radix UI React Slider](https://www.radix-ui.com/primitives/docs/components/slider)\n */\nexport const Slider = <T extends PossibleThumbs, U extends T>({\n disabled = false,\n fillIndex = 0,\n hiddenLegend = false,\n inputLabels,\n labelType = 'text',\n language,\n max = 1,\n maxLabel,\n min = 0,\n minLabel,\n offColor = defaultColorVariables.offColor,\n onChange,\n onColor = defaultColorVariables.onColor,\n step = 1,\n thumbLabelFn,\n title,\n values,\n orientation = 'horizontal',\n variant = 'default',\n brandComponentTheme,\n}: TSlider<T, U>) => {\n const isRtlLanguage = isRtl(language);\n const isDefault = variant === 'default';\n const isPrimary = variant === 'primary';\n const isDark = brandComponentTheme === 'dark';\n const isLight = brandComponentTheme === 'light';\n const isVertical = orientation === 'vertical';\n const isHorizontal = orientation === 'horizontal';\n const thumbRef = useRef<HTMLSpanElement>(null);\n\n const valueRatios = values.map((val) => {\n /** set each input's ratio between min and max. always clamped between 0 and 1 */\n let valueRatio = (val - min) / (max - min);\n if (valueRatio < 0) valueRatio = 0;\n else if (valueRatio > 1) valueRatio = 1;\n return valueRatio;\n });\n\n /** collect fill areas for thumb track. alternates 'on', 'off' */\n const areas = values.map((_, i) => i % 2);\n /** add starting fill index. do we start with 'on' or 'off' */\n const fillAreas: OneLonger<Tuple<U, number>> =\n fillIndex === 1\n ? ([fillIndex, ...areas] as OneLonger<Tuple<U, number>>)\n : ([...areas, fillIndex] as OneLonger<Tuple<U, number>>);\n /** list of gradient values for thu */\n const gradValues = fillAreas.reduce((prev, filled, i) => {\n prev.push([\n filled,\n i === 0 ? 0 : (valueRatios[i - 1] as number) * 100,\n i === fillAreas.length - 1 ? 100 : (valueRatios[i] as number) * 100,\n ]);\n return prev;\n }, [] as Array<Tuple<3, number>>);\n\n const inlineGradProps = useInlineGradient({\n values: gradValues,\n disabled,\n onColor,\n offColor,\n isRtlLanguage,\n orientation,\n brandComponentTheme,\n });\n const defaultLabelFn = (val: number) => `${val}`;\n const thumbLabels = values.map(thumbLabelFn || defaultLabelFn) as Tuple<U, string>;\n const labels = isRtlLanguage ? thumbLabels.reverse() : thumbLabels;\n const WrapperElement = values.length > 1 ? 'fieldset' : 'div';\n const TitleElement = values.length > 1 ? 'legend' : 'p';\n\n return (\n <WrapperElement\n className={cx('px-0.5', {\n 'text-text-disabled': disabled,\n 'h-full py-4': isVertical,\n 'mb-8 pt-8': isHorizontal,\n })}\n >\n <TitleElement\n className={cx('label w-full', {\n 'mb-4': labelType === 'tooltip',\n 'sr-only': hiddenLegend,\n })}\n >\n {title}\n </TitleElement>\n <div\n className={cx({\n 'relative z-10': labelType === 'tooltip',\n 'h-full': isVertical,\n })}\n >\n <SliderPrimitive.Root\n className={cx('relative flex touch-none select-none', {\n 'h-full justify-center': isVertical,\n 'h-10 w-full items-center': isHorizontal,\n })}\n dir={isRtlLanguage ? 'rtl' : 'ltr'}\n disabled={disabled}\n max={max}\n min={min}\n minStepsBetweenThumbs={1}\n name={title}\n step={step}\n onValueChange={onChange}\n value={values}\n orientation={orientation}\n >\n <SliderPrimitive.Track\n className={cx('slider-track', {\n 'slider-track--vertical': isVertical,\n 'slider-track--horizontal': isHorizontal,\n })}\n data-testid=\"slider-track\"\n style={{ ...inlineGradProps }}\n >\n <SliderPrimitive.Range className=\"slider-range\" />\n </SliderPrimitive.Track>\n {values.map((_value, i) => {\n return (\n <SliderPrimitive.Thumb\n // eslint-disable-next-line react/no-array-index-key\n key={i}\n className={cx('group slider-thumb', {\n 'slider-thumb--horizontal': isHorizontal,\n 'slider-thumb--vertical': isVertical,\n 'slider-thumb--disabled': disabled,\n 'slider-thumb--default': isDefault,\n 'slider-thumb--primary': isPrimary,\n 'slider-thumb--dark': isDark,\n 'slider-thumb--light': isLight,\n })}\n // radix applies this name attribute to the generated input field rendered\n name={`slider-input-${i}`}\n // this id is applied to the span radix renders as the thumb\n id={`slider-thumb-${i}`}\n aria-valuetext={labels[i]}\n asChild\n {...(isHorizontal && { 'aria-labelledby': `slider-thumb-label-${i}` })}\n {...(isVertical && { 'aria-label': inputLabels[i] })}\n >\n <span ref={thumbRef} className=\"relative block\">\n {labelType === 'tooltip' ? (\n // Tooltip arrow styles to ensure the arrow follows the tooltip correctly\n <span\n className={cx(\n 'relative block size-full',\n 'after:absolute after:-top-4 after:left-[calc(50%_-_6px)] after:inline-block after:size-3 after:rotate-[-135deg] after:border-l after:border-t after:border-border after:bg-bg group-hover:after:top-[-19px] group-focus:after:top-[-19px]'\n )}\n />\n ) : null}\n </span>\n </SliderPrimitive.Thumb>\n );\n })}\n {isHorizontal ? (\n <ThumbLabels\n labels={labels}\n inputLabels={inputLabels}\n valueRatios={valueRatios}\n labelType={labelType}\n isRtlLanguage={isRtlLanguage}\n />\n ) : null}\n </SliderPrimitive.Root>\n </div>\n {minLabel && maxLabel ? (\n <div className=\"relative flex justify-between\">\n <div aria-hidden=\"true\">{minLabel}</div>\n <div aria-hidden=\"true\">{maxLabel}</div>\n </div>\n ) : null}\n </WrapperElement>\n );\n};\n\nexport default Slider;\n","export * from './slider';\nexport * from './slider.types';\n","export * from './lib';\n","import type * as React from 'react';\nimport cx from 'classnames';\n\nexport type CaptionProps = {\n /**\n * Optional, provides the text content for the caption\n */\n caption?: string;\n /**\n * Optional link url\n */\n captionLink?: string;\n /**\n * Optional link target\n */\n captionLinkTarget?: string;\n /**\n * Optional metrics data\n */\n metricsOnClick?: () => void;\n /*\n * Optional alignment, default is end\n */\n align?: 'start' | 'end';\n};\n\n/**\n * Image caption is an optional prop that is consumed by other components, this cheese does not stand alone. Can be text only or a clickable link.\n */\nexport const Caption: React.FC<CaptionProps> = ({\n caption,\n captionLink,\n captionLinkTarget,\n align = 'end',\n metricsOnClick,\n}) => {\n const captionClasses =\n 'flex absolute top-0 items-center justify-center flex-auto text-xs mx-4 mt-4 mb-0 py-2 px-4 bg-bg-inverse text-text-overlay opacity-80 p-2 no-underline caption-main-text';\n\n if (!caption && !captionLink) {\n return null;\n }\n\n return (\n <figcaption data-testid=\"caption-container\">\n {captionLink ? (\n <a\n data-e2e=\"linkedCaption\"\n data-testid=\"img-caption-link\"\n className={cx(captionClasses, 'cursor-pointer', {\n 'end-0': align === 'end',\n 'start-0': align === 'start',\n })}\n href={captionLink}\n onClick={() => metricsOnClick?.()}\n target={captionLinkTarget}\n >\n {caption}\n </a>\n ) : (\n <div\n data-osc-product=\"osc-caption\"\n className={cx(captionClasses, 'pointer-events-none cursor-default', {\n 'end-0': align === 'end',\n 'start-0': align === 'start',\n })}\n >\n {caption}\n </div>\n )}\n </figcaption>\n );\n};\n","export * from './caption';\n","export * from './lib';\n","// extracted by mini-css-extract-plugin"],"names":["useAutoPlay","isAutoPlay","isClient","useIsClient","isReducedMotion","getIsReducedMotion","addTrackAsync","videoElement","track","trackElement","document","createElement","id","getTrackId","language","label","url","filter","Boolean","join","toLowerCase","srclang","kind","mode","dataset","type","append","Promise","onload","resolve","onerror","logWarning","removeChild","src","matchTracks","htmlTracks","videoTrack","some","htmlTrack","findTrack","tracks","activeTrack","find","getMetricsTrackName","formatName","trackEvent","eventName","videoName","window","_satellite","digitalData","set","name","replace","getTextColorClasses","brandComponentTheme","classnames","isLight","isDark","getBackgroundColorClasses","volumeConfig","min","max","step","lowestVolume","Math","floor","VolumeSlider","playerState","updateVolume","t","i18n","useTranslation","volume","isMuted","form","className","getClasses","Slider","title","hiddenLegend","inputLabels","thumbLabelFn","values","onChange","fillIndex","orientation","onColor","variant","isValidCue","cue","text","trim","length","getCueText","fragment","getCueAsHTML","textContent","html","XMLSerializer","serializeToString","VIDEO_EVENTS","PAUSE_OTHERS","PAUSE_SELF","VIDEO_UPDATE_EVENT","dispatchEvent","CustomEvent","detail","isPlaying","showCaptions","activeCaptionTrack","activeTranscript","activeVideoTrack","initialVolume","useVideoPlayer","props","useRef","internalPlayerId","useId","playerId","hasAudio","hookProps","setPlayerState","useState","videoPlayerSettings","JSON","parse","localStorage","getItem","defaultPlayerState","optionsState","useTrackQuery","options","current","hasCaptions","captionTracks","hasTranscripts","transcriptTracks","hasAudioTracks","audioTracks","defaultVideoTrack","baseVideoTrack","useBaseTracks","videoUrl","videoGroup","videoLabel","allTracks","useMemo","getFetchableTracks","Array","from","Map","flatMap","map","Object","item","data","videoTracks","useQuery","enabled","hasTracks","queryKey","queryFn","all","then","catch","error","controlsState","useFadeControls","wrapperElement","shouldControlsRemainVisible","elementRef","value","isVisible","setTrue","setVisible","setFalse","setHidden","useBoolean","timeout","hideControls","useCallback","clearTimeout","showControls","fadeControls","setTimeout","FADE_TIMEOUT_IN_MS","handleKeyup","contains","event","target","useEffect","useEventListener","settingsMenu","useMenu","menuId","popupButtonRef","popupMenuRef","isOpen","toggleMenu","setIsOpen","useToggle","closeMenu","activeVideo","getMetricsVideoName","playVideo","play","pauseVideo","pause","muteVideo","muted","unmuteVideo","togglePlayButton","dispatchVideoEvent","performAudioActions","setItem","stringify","state","updateTranscript","selectedTranscript","trackName","inActiveCaptionTracks","option","forEach","oncuechange","isPauseOthersEvent","isPauseSelfEvent","isPauseEvent","isOtherVideo","isSameVideo","shouldPauseSelf","videoProps","videoCaptionProps","videoTranscriptProps","closeTranscript","focus","onCueSelect","adjustedTime","startTime","CUE_BUFFER","currentTime","videoControlsProps","toggleMuteButton","toggleCaptions","updateCaption","isSingleCaption","selectedCaption","updateAudioTrack","selectedVideoTrack","findCaption","findTranscript","Video","posterImageUrl","videoId","captionData","figureClassName","videoClassName","rest","preventPreload","autoPlay","figure","div","video","data-testid","loop","playsInline","poster","ref","crossOrigin","preload","undefined","onError","e","Caption","ControlButton","forwardRef","children","iconContent","wrapperClassName","buttonProps","li","button","ControlIcon","iconProps","Icon","ControlMenu","maxHeight","setMaxHeight","wrapperRef","wrapperRect","getBoundingClientRect","menuRect","buttonRect","offset","bottom","buttonOffset","height","style","hidden","ControlList","listProps","ul","role","ControlItem","beforeSection","afterSection","span","SettingsMenu","menuOptions","useMenuOptions","selectedOption","setSelectedOption","captionOptions","transcriptOptions","abbr","isSelected","onSelection","onMenuOptionClick","menuProps","goToMainMenu","aria-label","aria-controls","aria-haspopup","aria-expanded","onClick","Menu","resetMenu","useEventListeners","focusButton","useOnClickOutside","stopPropagation","key","requestAnimationFrame","activeElement","activeList","querySelector","elements","querySelectorAll","getKeyDownNavigation","subOption","aria-checked","autoFocus","size","index","VideoControls","videoVariant","listRef","hasMultipleCaptions","hasAudioDescriptions","isSettingsMenuOpen","isCinemagraph","includes","preventDefault","pauseButtonLabel","playButtonLabel","aria-pressed","currentTrack","firstTrack","hasSettings","VideoCaptions","_brandComponentTheme","elementProps","activeCues","dangerouslySetInnerHTML","__html","VideoTranscript","Transcript","h3","TranscriptList","isSyncing","startSync","stopSync","focusedButton","setFocusedButton","activeTranscriptRef","allCues","lastActiveCue","updateCues","useCues","getCues","cues","getCueId","crypto","randomUUID","setActiveCues","getActiveCues","activeCue","cueState","isAutoScrolling","onKeyDownNavigation","getAllButtons","onNextFocus","onPreviousFocus","scrollToActiveCue","firstActiveCue","activeButton","getActiveButton","parentElement","offsetTop","offsetHeight","marginTop","marginBottom","getComputedStyle","top","parseInt","itemMargins","scrollTo","onScroll","onScrollEnd","onKeyDown","ol","isActive","isFocusable","TranscriptLine","BrandButton","tabIndex","data-id","aria-current","minutes","count","floorMinutes","seconds","floorSeconds","formatTime","minFmt","padTime","time","secFmt","toString","padStart","useVideoPlayerClasses","isLandscape","baseControlsClasses","captionClassNames","controlsClassNames","default","center","left","right","transcriptClassNames","wrapperClassNames","VideoPlayerMarkup","markupSchemas","logo","description","thumbnailUrl","uploadDate","duration","embedUrl","Head","script","VideoPlayer","videoCaptionsProps","playerClasses","playerProps","mapMultimediaListToVideoProps","multimedia","mappedPage","groupIdentifier","multimediaList","firstVideo","additionalVideos","groupMultimedia","groupBy","String","toSorted","a","b","Number","primaryVideo","mapMultimediaToVideoTrack","mapVideoMarkup","brandCode","pathname","baseUrl","env","URL","uploadDatetime","videoDuration","videoAutoPlay","noAudio","altText","isExtended","getVideoGroup","extended","extendedAudioDescription","audioTrackLabel","alternativeVideoLabel","filterByTrackType","multimediaMetadata","mapCaptionData","captionLink","caption","linkLabel","linkUrl","captionLinkTarget","isNewWindow","metadata","BrandIcon","getClassnames","theme","isSolid","isOutline","BrandLink","metricsOnClick","iconAlign","linkProps","Link","anchorClassName","cx","showNewWindowIcon","underline","displayName","defaultColorVariables","offColor","disabledColor","disabled","useInlineGradient","isRtlLanguage","direction","getDirection","on","gradientOnColor","off","gradientOffColor","getGradientColors","themeSuffix","presetVariables","primaryColorVariables","customColorVariables","gradientDisabledColor","collect","reduce","prev","val","filled","background","emptyRect","width","useResizeObserver","initialRect","element","setElement","rect","setRect","useIsomorphicLayoutEffect","ro","ResizeObserver","entries","contentRect","observe","unobserve","trackRect","valueRatios","labelRefs","labelRects","xCoordinates","i","x","THUMB_W","reverse","adjustLabelOverlaps","joinLabelXCoordinates","fill","overlap","LABEL_JOIN_DISTANCE","limits","LABEL_JOIN_CENTER","JOIN_LABEL_LENGTH","limit","Label","additionalLabel","labelPosition","labelType","forwardedRef","textClasses","transform","aria-hidden","ThumbLabels","labels","trackRef","labelsX","setLabelsX","labelElementRects","setLabelRects","setJoinLabelXCoordinates","topOffsetState","setTopOffset","calculateLabelPositions","getTooltipTopOffset","topOffset","tooltipRect","maxLabel","minLabel","isRtl","isDefault","isPrimary","isVertical","isHorizontal","thumbRef","valueRatio","areas","_","fillAreas","inlineGradProps","gradValues","push","thumbLabels","defaultLabelFn","WrapperElement","TitleElement","SliderPrimitive","dir","minStepsBetweenThumbs","onValueChange","_value","aria-valuetext","asChild","align","captionClasses","figcaption","data-e2e","href","data-osc-product"],"sourceRoot":"","ignoreList":[]}