react-media-kit 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +106 -0
- package/dist/index.d.ts +275 -0
- package/dist/index.js +1585 -0
- package/dist/index.js.map +1 -0
- package/dist/rolldown-runtime-w6R9maHv.js +18 -0
- package/package.json +115 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["UPDATE_INTERVAL_MS","defaultStyle","defaultStyle","defaultStyle"],"sources":["../src/utils/time.ts","../src/state/playerReducer.ts","../src/state/seekQueue.ts","../src/constants.ts","../src/utils/volume.ts","../src/utils/buffer.ts","../src/state/store.ts","../src/state/PlayerContext.tsx","../src/hooks/useMergeRefs.ts","../src/utils/attributes.ts","../src/hooks/useMediaAttributes.ts","../src/components/audio/player/AudioPlayer.tsx","../src/components/audio/index.parts.ts","../src/components/controls/root/ControlsRoot.tsx","../src/components/controls/index.parts.ts","../src/utils/handlers.ts","../src/components/fullscreenButton/root/FullscreenButtonRoot.tsx","../src/components/fullscreenButton/index.parts.ts","../src/components/pipButton/root/PipButtonRoot.tsx","../src/components/pipButton/index.parts.ts","../src/components/playbackRateButton/root/PlaybackRateButtonRoot.tsx","../src/components/playbackRateButton/index.parts.ts","../src/components/playButton/root/PlayButtonRoot.tsx","../src/components/playButton/index.parts.ts","../src/components/player/root/PlayerRoot.tsx","../src/components/player/container/PlayerContainer.tsx","../src/components/player/index.parts.ts","../src/hooks/useAnimateOnPlay.ts","../src/utils/math.ts","../src/components/seekbar/root/useSeekbarTime.ts","../src/hooks/useRectPosition.ts","../src/components/seekbar/root/useSeekbarInteractivity.ts","../src/components/common/Slider.tsx","../src/components/seekbar/root/useBufferTimer.ts","../src/components/seekbar/root/SeekbarRoot.tsx","../src/components/common/Track.tsx","../src/components/seekbar/track/SeekbarTrack.tsx","../src/components/common/Progress.tsx","../src/components/seekbar/progress/SeekbarProgress.tsx","../src/components/seekbar/buffer/SeekbarBuffer.tsx","../src/components/common/Thumb.tsx","../src/components/seekbar/thumb/SeekbarThumb.tsx","../src/components/seekbar/index.parts.ts","../src/components/skipButton/root/SkipButtonRoot.tsx","../src/components/skipButton/index.parts.ts","../src/components/timeDisplay/TimeDisplayContext.ts","../src/components/timeDisplay/root/TimeDisplayRoot.tsx","../src/components/timeDisplay/toggle/TimeDisplayToggle.tsx","../src/components/timeDisplay/timer/useTimeDisplayTimer.ts","../src/components/timeDisplay/timer/TimeDisplayTimer.tsx","../src/components/timeDisplay/duration/TimeDisplayDuration.tsx","../src/components/timeDisplay/index.parts.ts","../src/components/video/root/VideoRoot.tsx","../src/components/video/overlay/useOverlayInteractivity.ts","../src/components/video/overlay/VideoOverlay.tsx","../src/components/video/player/VideoPlayer.tsx","../src/components/video/index.parts.ts","../src/state/shallow.ts","../src/components/volume/slider/useVolume.ts","../src/components/volume/slider/VolumeSlider.tsx","../src/components/volume/mute/VolumeMute.tsx","../src/components/volume/track/VolumeTrack.tsx","../src/components/volume/progress/VolumeProgress.tsx","../src/components/volume/thumb/VolumeThumb.tsx","../src/components/volume/index.parts.ts"],"sourcesContent":["export function getTimeParts(duration: number) {\n const timeParts = { hours: 0, minutes: 0, seconds: 0 };\n\n if (!Number.isFinite(duration) || duration < 0) return timeParts;\n\n timeParts.hours = Math.floor(duration / 3600);\n duration %= 3600;\n timeParts.minutes = Math.floor(duration / 60);\n duration %= 60;\n timeParts.seconds = Math.floor(duration);\n\n return timeParts;\n}\n\nconst padZeros = (value: number | string) => String(value).padStart(2, \"0\");\n\nexport function getTimeFormat(time: number) {\n const { hours, minutes, seconds } = getTimeParts(time);\n const value = hours ? [hours, minutes, seconds] : [minutes, seconds];\n return value.map((v, idx) => (idx === 0 ? String(v) : padZeros(v))).join(\":\");\n}\n\nexport function getDurationTimeFormat(time: number) {\n const { hours, minutes, seconds } = getTimeParts(time);\n return `PT${hours}H${minutes}M${seconds}S`;\n}\n\nexport function createTimeLabelFormatter(locale?: string) {\n const createNumberFormatter = (unit: \"hour\" | \"minute\" | \"second\") =>\n new Intl.NumberFormat(locale, { style: \"unit\", unit, unitDisplay: \"long\" });\n\n const numberFormatters = {\n hour: createNumberFormatter(\"hour\"),\n minute: createNumberFormatter(\"minute\"),\n second: createNumberFormatter(\"second\"),\n };\n const listFormatter = new Intl.ListFormat(locale, { style: \"long\", type: \"conjunction\" });\n\n return (time: number) => {\n const { hours, minutes, seconds } = getTimeParts(time);\n const timeValues = [\n hours && numberFormatters[\"hour\"].format(hours),\n minutes && numberFormatters[\"minute\"].format(minutes),\n seconds && numberFormatters[\"second\"].format(seconds),\n ].filter(Boolean) as string[];\n\n if (timeValues.length === 0) return numberFormatters[\"second\"].format(0);\n return listFormatter.format(timeValues);\n };\n}\n\nexport const normalizeTime = (time: number) => (Number.isFinite(time) ? time : 0);\n","import type { PlayerAction, PlayerState } from \"./types\";\nimport { normalizeTime } from \"@/utils/time\";\n\nexport function playerReducer(state: PlayerState, action: PlayerAction): PlayerState {\n switch (action.type) {\n case \"PLAY\":\n return { ...state, isPlaying: true };\n case \"PAUSE\":\n return { ...state, isPlaying: false };\n case \"TOGGLE\":\n return { ...state, isPlaying: !state.isPlaying };\n case \"INIT\": {\n const { durationInSec, volume, playbackRate } = action.payload;\n return {\n ...state,\n durationInSec: normalizeTime(durationInSec),\n volume,\n playbackRate,\n state: \"ready\",\n };\n }\n case \"TIME_UPDATE\": {\n const { time } = action.payload;\n return { ...state, currentTimeInSec: normalizeTime(time), optimisticTimeInSec: null };\n }\n case \"SEEKING\": {\n const { time, bufferedEnd } = action.payload;\n return { ...state, optimisticTimeInSec: normalizeTime(time), bufferedEndInSec: bufferedEnd };\n }\n case \"FULLSCREEN\": {\n const { enabled } = action.payload;\n return { ...state, isFullscreen: enabled };\n }\n case \"PIP\": {\n const { enabled } = action.payload;\n return { ...state, isPictureInPicture: enabled };\n }\n case \"MUTE\": {\n const { muted } = action.payload;\n return { ...state, isMuted: muted };\n }\n case \"VOLUME_CHANGE\": {\n const { volume } = action.payload;\n return { ...state, volume: volume };\n }\n case \"PLAYBACK_RATE_CHANGE\": {\n const { playbackRate } = action.payload;\n return { ...state, playbackRate };\n }\n case \"ERROR\": {\n return { ...state, state: \"error\" };\n }\n case \"LOADING\": {\n return { ...state, state: \"loading\" };\n }\n case \"PROGRESS\": {\n const { bufferedEnd } = action.payload;\n return { ...state, bufferedEndInSec: bufferedEnd };\n }\n case \"BUFFERING\": {\n const { isBuffering } = action.payload;\n return { ...state, isBuffering };\n }\n }\n}\n","type SeekQueue = { isPending: false } | { isPending: true; value: number };\n\nexport function createSeekQueue() {\n let queue: SeekQueue = { isPending: false };\n\n function set(value: number) {\n queue = { isPending: true, value };\n }\n\n function pop() {\n const state = { ...queue };\n queue = { isPending: false };\n return state;\n }\n\n function get() {\n return queue;\n }\n\n return { set, pop, get };\n}\n","export const SKIP_INTERVAL = 5;\nexport const VOLUME_INTERVAL = 0.05;\nexport const PLAYBACK_RATE_INTERVAL = 0.25;\n\nexport const DOUBLE_CLICK_DELTA_MS = 300;\n\nexport const MAX_VOLUME = 1;\nexport const MIN_VOLUME = 0;\n\nexport const MAX_PLAYBACK_RATE = 2;\nexport const MIN_PLAYBACK_RATE = 0.25;\n\nexport const KEY_NAMES = {\n SPACE: \" \",\n ENTER: \"ENTER\",\n ARROW_LEFT: \"ARROWLEFT\",\n ARROW_RIGHT: \"ARROWRIGHT\",\n ARROW_UP: \"ARROWUP\",\n ARROW_DOWN: \"ARROWDOWN\",\n HOME: \"HOME\",\n END: \"END\",\n MUTE: \"M\",\n FULLSCREEN: \"F\",\n} as const;\n\nexport const CSS_VARS = {\n progressPercent: \"--progress-percent\",\n bufferPercent: \"--buffer-percent\",\n} as const;\n\nexport const DATA_ATTRS = {\n mediaPending: \"data-media-pending\",\n mediaLoading: \"data-media-loading\",\n mediaReady: \"data-media-ready\",\n mediaError: \"data-media-error\",\n\n playing: \"data-playing\",\n muted: \"data-muted\",\n fullscreen: \"data-fullscreen\",\n pip: \"data-pip\",\n direction: \"data-direction\",\n dragging: \"data-dragging\",\n active: \"data-active\",\n elapsedMode: \"data-elapsed-mode\",\n} as const;\n","import { MAX_VOLUME, MIN_VOLUME } from \"@/constants\";\n\nexport const clampVolume = (volume: number) => Math.max(Math.min(volume, MAX_VOLUME), MIN_VOLUME);\n","export function getBufferedEnd(buffered: TimeRanges | undefined, time: number) {\n if (!buffered) return time;\n\n for (let i = 1, len = buffered.length; i <= len; i++) {\n const idx = len - i;\n const start = buffered.start(idx);\n const end = buffered.end(idx);\n\n if (time >= start && time <= end) return end;\n }\n return time;\n}\n","import type { PlayerAction, PlayerState, Selector } from \"./types\";\nimport { playerReducer } from \"@/state/playerReducer\";\nimport { createSeekQueue } from \"./seekQueue\";\nimport { clampVolume } from \"@/utils/volume\";\nimport { getBufferedEnd } from \"@/utils/buffer\";\nimport type { OnErrorFunc, PlayerError } from \"@/types\";\n\nexport type PlayerStore = ReturnType<typeof createPlayerStore>;\n\nexport const initialState = Object.freeze({\n state: \"pending\",\n isPlaying: false,\n isMuted: false,\n isFullscreen: false,\n isPictureInPicture: false,\n isBuffering: false,\n durationInSec: 0,\n currentTimeInSec: 0,\n optimisticTimeInSec: null,\n bufferedEndInSec: null,\n volume: 0.5,\n playbackRate: 1,\n});\n\nexport function createPlayerStore() {\n let state: PlayerState = { ...initialState };\n\n const seekQueue = createSeekQueue();\n const listeners = new Set<() => void>();\n const errorListeners = new Set<OnErrorFunc>();\n\n let abortController = new AbortController();\n let media: HTMLMediaElement | null = null;\n let container: HTMLDivElement | null = null;\n\n const dispatch = (action: PlayerAction) => {\n state = playerReducer(state, action);\n listeners.forEach((l) => l());\n };\n\n const handlePlay = () => dispatch({ type: \"PLAY\" });\n\n const handlePause = () => dispatch({ type: \"PAUSE\" });\n\n const play = async () => {\n try {\n await media?.play();\n } catch (error) {\n notifyAboutError({ type: \"play\", error });\n }\n };\n\n const pause = () => media?.pause();\n\n const toggle = () => (state.isPlaying ? pause() : play());\n\n const mute = () => media && (media.muted = true);\n const unmute = () => media && (media.muted = false);\n const toggleMute = () => (state.isMuted ? unmute() : mute());\n\n const stepVolume = (delta: number) => {\n if (!media) return;\n\n const newValue = clampVolume(media.volume + delta);\n media.volume = newValue;\n media.muted = false;\n };\n\n const setVolume = (volume: number) => {\n if (!media) return;\n\n const newValue = clampVolume(volume);\n media.volume = newValue;\n media.muted = false;\n };\n\n const toggleFullscreen = async () => {\n try {\n if (state.isFullscreen) await document.exitFullscreen();\n else await container?.requestFullscreen();\n } catch (error) {\n notifyAboutError({ type: \"fullscreen\", error });\n }\n };\n\n const togglePip = async () => {\n try {\n if (!(media instanceof HTMLVideoElement)) {\n throw new Error(\"Picture-in-picture is only supported for video elements\");\n }\n if (state.isPictureInPicture) await document.exitPictureInPicture();\n else await media.requestPictureInPicture();\n } catch (error) {\n notifyAboutError({ type: \"pip\", error });\n }\n };\n\n const stepPlaybackRate = (delta: number) => {\n if (!media) return;\n media.playbackRate = media.playbackRate + delta;\n };\n\n const setPlaybackRate = (rate: number) => {\n if (!media) return;\n media.playbackRate = rate;\n };\n\n function skip(delta: number) {\n if (!media) return;\n const newValue = Math.max(Math.min(media.currentTime + delta, state.durationInSec), 0);\n seek(newValue);\n }\n\n function handleTimeUpdate(this: HTMLMediaElement) {\n dispatch({ type: \"TIME_UPDATE\", payload: { time: this.currentTime } });\n }\n\n function seek(time: number) {\n if (!media) return;\n\n if (media.seeking) {\n seekQueue.set(time);\n } else {\n media.currentTime = time;\n }\n dispatch({\n type: \"SEEKING\",\n payload: { time, bufferedEnd: getBufferedEnd(media.buffered, time) },\n });\n }\n\n function handleSeeking(this: HTMLMediaElement) {\n if (seekQueue.get().isPending) return;\n dispatch({\n type: \"SEEKING\",\n payload: {\n time: this.currentTime,\n bufferedEnd: getBufferedEnd(this.buffered, this.currentTime),\n },\n });\n }\n\n function handleSeeked() {\n const seekQueueState = seekQueue.pop();\n if (seekQueueState.isPending && media) {\n media.currentTime = seekQueueState.value;\n }\n }\n\n function handleInit(this: HTMLMediaElement) {\n const { duration, volume, playbackRate } = this;\n dispatch({ type: \"INIT\", payload: { durationInSec: duration, volume, playbackRate } });\n }\n\n function handleFullscreen(this: HTMLMediaElement) {\n dispatch({\n type: \"FULLSCREEN\",\n payload: { enabled: document.fullscreenElement === container },\n });\n }\n\n function handlePipEnter() {\n dispatch({ type: \"PIP\", payload: { enabled: true } });\n }\n\n function handlePipLeave() {\n dispatch({ type: \"PIP\", payload: { enabled: false } });\n }\n\n function handleVolumeChange(this: HTMLMediaElement) {\n if (state.isMuted !== this.muted) {\n dispatch({ type: \"MUTE\", payload: { muted: this.muted } });\n }\n if (state.volume !== this.volume) {\n dispatch({ type: \"VOLUME_CHANGE\", payload: { volume: this.volume } });\n }\n }\n\n function handleRateChange(this: HTMLMediaElement) {\n if (state.playbackRate !== this.playbackRate) {\n dispatch({ type: \"PLAYBACK_RATE_CHANGE\", payload: { playbackRate: this.playbackRate } });\n }\n }\n\n function handleError(this: HTMLMediaElement) {\n dispatch({ type: \"ERROR\" });\n notifyAboutError({ type: \"media\", error: this.error! });\n }\n\n function handleLoading() {\n dispatch({ type: \"LOADING\" });\n }\n\n function handleBufferingStart() {\n if (!state.isBuffering) {\n dispatch({ type: \"BUFFERING\", payload: { isBuffering: true } });\n }\n }\n\n function handleBufferingEnd() {\n if (state.isBuffering) {\n dispatch({ type: \"BUFFERING\", payload: { isBuffering: false } });\n }\n }\n\n function handleProgress() {\n const time = state.optimisticTimeInSec ?? state.currentTimeInSec;\n dispatch({ type: \"PROGRESS\", payload: { bufferedEnd: getBufferedEnd(media?.buffered, time) } });\n }\n\n function init(mediaEl: HTMLMediaElement, containerEl: HTMLDivElement) {\n media = mediaEl;\n container = containerEl;\n\n const signalConfig = { signal: abortController.signal };\n\n mediaEl.addEventListener(\"loadedmetadata\", handleInit, signalConfig);\n mediaEl.addEventListener(\"error\", handleError, signalConfig);\n mediaEl.addEventListener(\"loadstart\", handleLoading, signalConfig);\n mediaEl.addEventListener(\"play\", handlePlay, signalConfig);\n mediaEl.addEventListener(\"pause\", handlePause, signalConfig);\n mediaEl.addEventListener(\"ratechange\", handleRateChange, signalConfig);\n mediaEl.addEventListener(\"seeking\", handleSeeking, signalConfig);\n mediaEl.addEventListener(\"seeked\", handleSeeked, signalConfig);\n mediaEl.addEventListener(\"timeupdate\", handleTimeUpdate, signalConfig);\n mediaEl.addEventListener(\"volumechange\", handleVolumeChange, signalConfig);\n mediaEl.addEventListener(\"progress\", handleProgress, signalConfig);\n mediaEl.addEventListener(\"waiting\", handleBufferingStart, signalConfig);\n mediaEl.addEventListener(\"playing\", handleBufferingEnd, signalConfig);\n mediaEl.addEventListener(\"canplay\", handleBufferingEnd, signalConfig);\n\n // Picture-in-picture is a video-only capability\n if (mediaEl instanceof HTMLVideoElement) {\n mediaEl.addEventListener(\"enterpictureinpicture\", handlePipEnter, signalConfig);\n mediaEl.addEventListener(\"leavepictureinpicture\", handlePipLeave, signalConfig);\n }\n\n containerEl.addEventListener(\"fullscreenchange\", handleFullscreen, signalConfig);\n }\n\n function destroy() {\n abortController.abort();\n abortController = new AbortController();\n listeners.clear();\n errorListeners.clear();\n }\n\n function subscribe(listener: () => void) {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n }\n\n const notifyAboutError = (playerError: PlayerError) => {\n errorListeners.forEach((l) => l(playerError));\n };\n\n const subscribeToErrors = (cb: OnErrorFunc) => {\n errorListeners.add(cb);\n return () => {\n errorListeners.delete(cb);\n };\n };\n\n const getSnapshot = () => state;\n\n function subscribeWithSelector<T>(selector: Selector<T>, listener: (slice: T) => void) {\n let prev = selector(getSnapshot());\n return subscribe(() => {\n const next = selector(getSnapshot());\n if (Object.is(next, prev)) return;\n prev = next;\n listener(next);\n });\n }\n\n const controls = {\n play,\n pause,\n toggle,\n seek,\n skip,\n toggleFullscreen,\n togglePip,\n toggleMute,\n mute,\n unmute,\n stepVolume,\n setVolume,\n stepPlaybackRate,\n setPlaybackRate,\n };\n\n return {\n controls,\n subscribe,\n subscribeWithSelector,\n subscribeToErrors,\n init,\n destroy,\n getSnapshot,\n };\n}\n","import { createContext, use, useSyncExternalStore, type RefObject } from \"react\";\nimport { type PlayerStore } from \"@/state/store\";\nimport type { Selector } from \"./types\";\n\ninterface PlayerContextValue extends PlayerStore {\n containerEl: RefObject<HTMLDivElement | null>;\n mediaEl: RefObject<HTMLMediaElement | null>;\n lang?: string;\n}\n\nexport const PlayerContext = createContext<PlayerContextValue | null>(null);\n\nexport const usePlayerSubscription = () => {\n const ctx = use(PlayerContext);\n\n if (!ctx) {\n throw new Error(\"usePlayerSubscription used outside of the PlayerProvider!\");\n }\n\n return ctx;\n};\n\nexport const usePlayerCtx = () => {\n const ctx = use(PlayerContext);\n\n if (!ctx) {\n throw new Error(\"usePlayerCtx used outside of the PlayerProvider!\");\n }\n\n const { lang, mediaEl, containerEl } = ctx;\n return { lang, mediaEl, containerEl };\n};\n\nexport function usePlayer<T>(selector: Selector<T>) {\n const { subscribe, getSnapshot } = usePlayerSubscription();\n return useSyncExternalStore(subscribe, () => selector(getSnapshot()));\n}\n\nexport function usePlayerControls() {\n const { controls } = usePlayerSubscription();\n return controls;\n}\n","import { useCallback, type Ref } from \"react\";\n\nexport function useMergeRefs<T extends HTMLElement>(...refs: (Ref<T> | undefined)[]) {\n const mergeRefs = useCallback(\n (node: T | null) => {\n const cleanups = refs.map((ref) => {\n if (!ref) return null;\n if (typeof ref === \"function\") return ref(node);\n\n ref.current = node;\n return null;\n });\n\n return () => {\n refs.forEach((ref, idx) => {\n if (!ref) return;\n\n if (typeof ref === \"function\") {\n const refCleanup = cleanups[idx];\n // Support for legacy ref callbacks without cleanup functions\n // by calling it with null. Same as native React ref callback\n if (refCleanup == null) ref(null);\n else refCleanup();\n } else {\n ref.current = null;\n }\n });\n };\n },\n // Passing each ref independently for Object.is comparison so that callback re-initializes only on real ref change\n // oxlint-disable-next-line react-hooks/exhaustive-deps\n refs,\n );\n\n return mergeRefs;\n}\n","// Set explicit undefined if condition is false, so that data-* attribute is remove from DOM element\nexport const setDataAttr = (condition: boolean) => condition || undefined;\n","import { usePlayer } from \"@/state/PlayerContext\";\nimport { setDataAttr } from \"@/utils/attributes\";\nimport { DATA_ATTRS } from \"@/constants\";\n\nexport function useMediaAttributes() {\n const state = usePlayer((s) => s.state);\n\n return {\n [DATA_ATTRS.mediaPending]: setDataAttr(state === \"pending\"),\n [DATA_ATTRS.mediaLoading]: setDataAttr(state === \"loading\"),\n [DATA_ATTRS.mediaReady]: setDataAttr(state === \"ready\"),\n [DATA_ATTRS.mediaError]: setDataAttr(state === \"error\"),\n };\n}\n","import { usePlayerCtx } from \"@/state/PlayerContext\";\nimport type { MediaHTMLAttributes, Ref } from \"react\";\nimport { useMergeRefs } from \"@/hooks/useMergeRefs\";\nimport { useMediaAttributes } from \"@/hooks/useMediaAttributes\";\n\ninterface AudioPlayerProps extends MediaHTMLAttributes<HTMLAudioElement> {\n src?: string;\n ref?: Ref<HTMLAudioElement>;\n}\n\nexport function AudioPlayer({ ref, ...props }: AudioPlayerProps) {\n const { mediaEl } = usePlayerCtx();\n const mergedRef = useMergeRefs(mediaEl, ref);\n const mediaDataAttrs = useMediaAttributes();\n\n return <audio ref={mergedRef} {...props} {...mediaDataAttrs} />;\n}\n","export { AudioPlayer as Player } from \"./player/AudioPlayer\";\n","import type { HTMLAttributes, Ref } from \"react\";\nimport { useMediaAttributes } from \"@/hooks/useMediaAttributes\";\n\ninterface ControlsRootProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n}\n\nexport function ControlsRoot(props: ControlsRootProps) {\n const mediaDataAttrs = useMediaAttributes();\n\n return <div {...props} {...mediaDataAttrs} />;\n}\n","export { ControlsRoot as Root } from \"./root/ControlsRoot\";\n","type EventHandler<E> = ((event: E) => void) | undefined;\n\nexport const composeHandlers = <E>(...handlers: EventHandler<E>[]) => {\n return (event: E) => {\n for (const handler of handlers) {\n if ((event as Event).defaultPrevented) return;\n handler?.(event);\n }\n };\n};\n\nexport const normalizeKeyCode = (key: string) => key.toUpperCase();\n","import type { Ref } from \"react\";\nimport { usePlayer, usePlayerControls } from \"@/state/PlayerContext\";\nimport { useMediaAttributes } from \"@/hooks/useMediaAttributes\";\nimport { composeHandlers } from \"@/utils/handlers\";\nimport { setDataAttr } from \"@/utils/attributes\";\nimport { DATA_ATTRS } from \"@/constants\";\nimport type { ButtonAttributes } from \"@/types\";\n\ninterface FullscreenButtonRootProps extends ButtonAttributes {\n ref?: Ref<HTMLButtonElement>;\n}\n\nexport function FullscreenButtonRoot({ onClick, ...props }: FullscreenButtonRootProps) {\n const { toggleFullscreen } = usePlayerControls();\n const mediaDataAttrs = useMediaAttributes();\n const isFullscreen = usePlayer((s) => s.isFullscreen);\n\n return (\n <button\n aria-label={isFullscreen ? \"Exit fullscreen\" : \"Enter fullscreen\"}\n {...props}\n type=\"button\"\n onClick={composeHandlers(onClick, toggleFullscreen)}\n {...{ [DATA_ATTRS.fullscreen]: setDataAttr(isFullscreen) }}\n {...mediaDataAttrs}\n />\n );\n}\n","export { FullscreenButtonRoot as Root } from \"./root/FullscreenButtonRoot\";\n","import type { Ref } from \"react\";\nimport { usePlayer, usePlayerControls } from \"@/state/PlayerContext\";\nimport { useMediaAttributes } from \"@/hooks/useMediaAttributes\";\nimport { composeHandlers } from \"@/utils/handlers\";\nimport { setDataAttr } from \"@/utils/attributes\";\nimport { DATA_ATTRS } from \"@/constants\";\nimport type { ButtonAttributes } from \"@/types\";\n\ninterface PipButtonRootProps extends ButtonAttributes {\n ref?: Ref<HTMLButtonElement>;\n}\n\nexport function PipButtonRoot({ onClick, ...props }: PipButtonRootProps) {\n const { togglePip } = usePlayerControls();\n const mediaDataAttrs = useMediaAttributes();\n const isPictureInPicture = usePlayer((s) => s.isPictureInPicture);\n\n return (\n <button\n aria-label={isPictureInPicture ? \"Exit picture-in-picture\" : \"Enter picture-in-picture\"}\n {...props}\n type=\"button\"\n onClick={composeHandlers(onClick, togglePip)}\n {...{ [DATA_ATTRS.pip]: setDataAttr(isPictureInPicture) }}\n {...mediaDataAttrs}\n />\n );\n}\n","export { PipButtonRoot as Root } from \"./root/PipButtonRoot\";\n","import type { Ref } from \"react\";\nimport { usePlayer, usePlayerControls } from \"@/state/PlayerContext\";\nimport { useMediaAttributes } from \"@/hooks/useMediaAttributes\";\nimport { composeHandlers } from \"@/utils/handlers\";\nimport { setDataAttr } from \"@/utils/attributes\";\nimport { DATA_ATTRS } from \"@/constants\";\nimport type { ButtonAttributes } from \"@/types\";\n\ninterface PlaybackRateButtonRootProps extends ButtonAttributes {\n playbackRate: number;\n ref?: Ref<HTMLButtonElement>;\n}\n\nexport function PlaybackRateButtonRoot({\n playbackRate,\n onClick,\n ...props\n}: PlaybackRateButtonRootProps) {\n const { setPlaybackRate } = usePlayerControls();\n const mediaDataAttrs = useMediaAttributes();\n const activePlaybackRate = usePlayer((s) => s.playbackRate);\n\n const handleClick = () => setPlaybackRate(playbackRate);\n\n return (\n <button\n aria-label={`Playback speed: ${playbackRate}x`}\n {...props}\n type=\"button\"\n onClick={composeHandlers(onClick, handleClick)}\n {...{ [DATA_ATTRS.active]: setDataAttr(activePlaybackRate === playbackRate) }}\n {...mediaDataAttrs}\n />\n );\n}\n","export { PlaybackRateButtonRoot as Root } from \"./root/PlaybackRateButtonRoot\";\n","import type { Ref } from \"react\";\nimport { usePlayer, usePlayerControls } from \"@/state/PlayerContext\";\nimport { useMediaAttributes } from \"@/hooks/useMediaAttributes\";\nimport { composeHandlers } from \"@/utils/handlers\";\nimport { setDataAttr } from \"@/utils/attributes\";\nimport { DATA_ATTRS } from \"@/constants\";\nimport type { ButtonAttributes } from \"@/types\";\n\ninterface PlayButtonRootProps extends ButtonAttributes {\n ref?: Ref<HTMLButtonElement>;\n}\n\nexport function PlayButtonRoot({ onClick, ...props }: PlayButtonRootProps) {\n const { toggle } = usePlayerControls();\n const mediaDataAttrs = useMediaAttributes();\n const isPlaying = usePlayer((s) => s.isPlaying);\n\n return (\n <button\n aria-label={isPlaying ? \"Pause video\" : \"Play video\"}\n {...props}\n type=\"button\"\n onClick={composeHandlers(onClick, toggle)}\n {...{ [DATA_ATTRS.playing]: setDataAttr(isPlaying) }}\n {...mediaDataAttrs}\n />\n );\n}\n","export { PlayButtonRoot as Root } from \"./root/PlayButtonRoot\";\n","import { createPlayerStore, type PlayerStore } from \"@/state/store\";\nimport { PlayerContext } from \"@/state/PlayerContext\";\nimport { useEffect, useEffectEvent, useMemo, useRef, useState, type ReactNode } from \"react\";\nimport type { OnErrorFunc } from \"@/types\";\n\ninterface PlayerRootProps {\n children: ReactNode;\n lang?: string;\n onError?: OnErrorFunc;\n}\n\nexport const PlayerRoot = ({ children, lang, onError }: PlayerRootProps) => {\n const [state] = useState<PlayerStore>(createPlayerStore);\n const mediaRef = useRef<HTMLMediaElement | null>(null);\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (!mediaRef.current || !containerRef.current) return;\n\n state.init(mediaRef.current, containerRef.current);\n return state.destroy;\n }, [state]);\n\n const subscribeErrorsEvent = useEffectEvent((state: PlayerStore) => {\n if (typeof onError !== \"function\") return;\n state.subscribeToErrors(onError);\n });\n\n useEffect(() => {\n const unsubscribe = subscribeErrorsEvent(state);\n return unsubscribe;\n }, [state]);\n\n const value = useMemo(\n () => ({ ...state, mediaEl: mediaRef, containerEl: containerRef, lang }),\n [state, lang],\n );\n\n return <PlayerContext value={value}>{children}</PlayerContext>;\n};\n","import type { HTMLAttributes, KeyboardEvent, Ref } from \"react\";\nimport { usePlayer, usePlayerControls, usePlayerCtx } from \"@/state/PlayerContext\";\nimport { useMediaAttributes } from \"@/hooks/useMediaAttributes\";\nimport { composeHandlers, normalizeKeyCode } from \"@/utils/handlers\";\nimport { setDataAttr } from \"@/utils/attributes\";\nimport { DATA_ATTRS, KEY_NAMES, SKIP_INTERVAL, VOLUME_INTERVAL } from \"@/constants\";\nimport { useMergeRefs } from \"@/hooks/useMergeRefs\";\n\nexport const NATIVE_ACTIVATION_TAGS = new Set([\"BUTTON\", \"INPUT\", \"SELECT\", \"TEXTAREA\", \"A\"]);\n\ninterface PlayerContainerProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n}\n\nexport function PlayerContainer({ onKeyDown, style, ref, ...props }: PlayerContainerProps) {\n const { containerEl } = usePlayerCtx();\n const { toggle, toggleMute, toggleFullscreen, skip, stepVolume } = usePlayerControls();\n const mergedRef = useMergeRefs(containerEl, ref);\n const mediaDataAttrs = useMediaAttributes();\n const isFullscreen = usePlayer((s) => s.isFullscreen);\n const isPictureInPicture = usePlayer((s) => s.isPictureInPicture);\n\n const handleKeyDown = (e: KeyboardEvent<HTMLDivElement>) => {\n if (e.defaultPrevented) return;\n\n const key = normalizeKeyCode(e.key);\n const isActivationKey = key === KEY_NAMES.SPACE || key === KEY_NAMES.ENTER;\n if (isActivationKey && NATIVE_ACTIVATION_TAGS.has((e.target as HTMLElement).tagName)) return;\n\n switch (key) {\n case KEY_NAMES.SPACE:\n case KEY_NAMES.ENTER:\n e.preventDefault();\n return toggle();\n case KEY_NAMES.ARROW_LEFT:\n e.preventDefault();\n return skip(-SKIP_INTERVAL);\n case KEY_NAMES.ARROW_RIGHT:\n e.preventDefault();\n return skip(SKIP_INTERVAL);\n case KEY_NAMES.ARROW_UP:\n e.preventDefault();\n return stepVolume(VOLUME_INTERVAL);\n case KEY_NAMES.ARROW_DOWN:\n e.preventDefault();\n return stepVolume(-VOLUME_INTERVAL);\n case KEY_NAMES.MUTE:\n return toggleMute();\n case KEY_NAMES.FULLSCREEN:\n return toggleFullscreen();\n }\n };\n\n return (\n <div\n ref={mergedRef}\n style={{ ...style, position: \"relative\" }}\n {...props}\n onKeyDown={composeHandlers(onKeyDown, handleKeyDown)}\n {...{\n [DATA_ATTRS.fullscreen]: setDataAttr(isFullscreen),\n [DATA_ATTRS.pip]: setDataAttr(isPictureInPicture),\n }}\n {...mediaDataAttrs}\n />\n );\n}\n","export { PlayerRoot as Root } from \"./root/PlayerRoot\";\nexport { PlayerContainer as Container } from \"./container/PlayerContainer\";\n","import { usePlayerSubscription } from \"@/state/PlayerContext\";\nimport { useEffect, useEffectEvent } from \"react\";\n\ninterface Config {\n draw: () => void;\n intervalMs: number;\n}\n\nexport function useAnimateOnPlay({ draw: onDraw, intervalMs }: Config) {\n const { subscribe, subscribeWithSelector, getSnapshot } = usePlayerSubscription();\n const draw = useEffectEvent(onDraw);\n\n useEffect(() => {\n let animateFrame: number | null = null;\n let prevTime = 0;\n\n const animate = (time: number) => {\n const deltaTime = time - prevTime;\n if (deltaTime >= intervalMs) {\n draw();\n prevTime = time;\n }\n animateFrame = requestAnimationFrame(animate);\n };\n\n const startLoop = () => {\n prevTime = 0;\n animateFrame = requestAnimationFrame(animate);\n };\n\n const stopLoop = () => {\n if (animateFrame === null) return;\n cancelAnimationFrame(animateFrame);\n animateFrame = null;\n };\n\n const unsubscribe = subscribeWithSelector(\n (s) => s.isPlaying,\n (isPlaying) => {\n if (isPlaying) startLoop();\n else {\n stopLoop();\n draw();\n }\n },\n );\n\n // Subscribe to each event as well with draw function so that it fires on seeking as well\n const unsubscribeAny = subscribe(() => !getSnapshot().isPlaying && draw());\n\n if (getSnapshot().isPlaying) startLoop();\n else draw();\n\n return () => {\n unsubscribe();\n unsubscribeAny();\n stopLoop();\n };\n }, [intervalMs, getSnapshot, subscribe, subscribeWithSelector]);\n}\n","export const toPercent = (value: number) => value * 100;\n\nexport const safeDivide = (divident: number, divisor: number) =>\n divisor === 0 ? 0 : divident / divisor;\n","import { CSS_VARS } from \"@/constants\";\nimport { useAnimateOnPlay } from \"@/hooks/useAnimateOnPlay\";\nimport { usePlayerCtx, usePlayerSubscription } from \"@/state/PlayerContext\";\nimport { safeDivide, toPercent } from \"@/utils/math\";\nimport { createTimeLabelFormatter } from \"@/utils/time\";\nimport { useCallback, useLayoutEffect, useMemo, type RefObject } from \"react\";\n\nconst UPDATE_INTERVAL_MS = 25;\n\nexport function useSeekbarTime(sliderEl: RefObject<HTMLDivElement | null>) {\n const { lang, mediaEl } = usePlayerCtx();\n const { getSnapshot } = usePlayerSubscription();\n\n const getTimeLabel = useMemo(() => createTimeLabelFormatter(lang), [lang]);\n\n const draw = useCallback(() => {\n if (!mediaEl.current || !sliderEl.current) return;\n\n const { optimisticTimeInSec, durationInSec } = getSnapshot();\n const { currentTime } = mediaEl.current;\n const time = optimisticTimeInSec ?? currentTime;\n const elapsed = toPercent(safeDivide(time, durationInSec));\n const totalElapsedTimeLabel = `${getTimeLabel(time)} / ${getTimeLabel(durationInSec)}`;\n\n sliderEl.current.style.setProperty(CSS_VARS.progressPercent, elapsed.toFixed(2));\n sliderEl.current.setAttribute(\"aria-valuetext\", totalElapsedTimeLabel);\n sliderEl.current.setAttribute(\"aria-valuenow\", String(Math.floor(time)));\n sliderEl.current.setAttribute(\"aria-valuemax\", String(Math.floor(durationInSec)));\n }, [mediaEl, getTimeLabel, sliderEl, getSnapshot]);\n\n useAnimateOnPlay({ draw, intervalMs: UPDATE_INTERVAL_MS });\n\n useLayoutEffect(() => {\n draw();\n }, [lang, draw]);\n}\n","import { useRef } from \"react\";\n\nexport function useRectPosition() {\n const rectRef = useRef<DOMRect>(null);\n\n const calcRectPositionX = (clickX: number) => {\n if (!rectRef.current) return null;\n\n const { left, width } = rectRef.current;\n const containerPos = (clickX - left) / width;\n\n return containerPos;\n };\n\n const setRect = (value: DOMRect) => {\n rectRef.current = value;\n };\n\n return { setRect, calcRectPositionX };\n}\n","import { useRectPosition } from \"@/hooks/useRectPosition\";\nimport { usePlayer, usePlayerControls } from \"@/state/PlayerContext\";\nimport { DATA_ATTRS, KEY_NAMES } from \"@/constants\";\nimport { type KeyboardEventHandler, type PointerEventHandler, type RefObject } from \"react\";\nimport { normalizeKeyCode } from \"@/utils/handlers\";\n\ninterface Config {\n skipInterval: number;\n}\n\nexport function useSeekbarInteractivity(\n sliderEl: RefObject<HTMLDivElement | null>,\n { skipInterval }: Config,\n) {\n const duration = usePlayer((s) => s.durationInSec);\n const { seek, skip } = usePlayerControls();\n const { setRect: setSliderRect, calcRectPositionX } = useRectPosition();\n\n function updateVideoTime(clickX: number) {\n const calculatedPosition = calcRectPositionX(clickX);\n if (calculatedPosition == null) return;\n\n const containerPos = Math.min(Math.max(calculatedPosition, 0), 1);\n seek(containerPos * duration);\n }\n\n const handlePointerDown: PointerEventHandler<HTMLDivElement> = (e) => {\n if (!sliderEl.current) return;\n\n setSliderRect(sliderEl.current.getBoundingClientRect());\n sliderEl.current.setPointerCapture(e.pointerId);\n sliderEl.current.setAttribute(DATA_ATTRS.dragging, \"true\");\n updateVideoTime(e.clientX);\n };\n\n const handlePointerMove: PointerEventHandler<HTMLDivElement> = (e) => {\n if (!sliderEl.current || !sliderEl.current.hasPointerCapture(e.pointerId)) return;\n\n updateVideoTime(e.clientX);\n };\n\n const handleLostPointerCapture: PointerEventHandler<HTMLDivElement> = () => {\n if (!sliderEl.current) return;\n\n sliderEl.current.toggleAttribute(DATA_ATTRS.dragging, false);\n };\n\n const handleKeyDown: KeyboardEventHandler<HTMLDivElement> = (e) => {\n switch (normalizeKeyCode(e.key)) {\n case KEY_NAMES.ARROW_LEFT:\n case KEY_NAMES.ARROW_DOWN:\n e.preventDefault();\n return skip(-skipInterval);\n case KEY_NAMES.ARROW_RIGHT:\n case KEY_NAMES.ARROW_UP:\n e.preventDefault();\n return skip(skipInterval);\n case KEY_NAMES.HOME:\n e.preventDefault();\n return seek(0);\n case KEY_NAMES.END:\n e.preventDefault();\n return seek(duration);\n }\n };\n\n return { handlePointerDown, handleLostPointerCapture, handlePointerMove, handleKeyDown };\n}\n","import type { CSSProperties, HTMLAttributes, Ref } from \"react\";\n\nexport interface SliderProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n}\n\nexport function Slider({ style, ...props }: SliderProps) {\n return <div style={{ ...style, ...defaultStyle }} {...props} role=\"slider\" tabIndex={0} />;\n}\n\nconst defaultStyle: CSSProperties = {\n touchAction: \"none\",\n position: \"relative\",\n};\n","import { CSS_VARS } from \"@/constants\";\nimport { usePlayerSubscription } from \"@/state/PlayerContext\";\nimport { safeDivide, toPercent } from \"@/utils/math\";\nimport { useEffect, type RefObject } from \"react\";\n\nexport function useBufferTime(sliderEl: RefObject<HTMLDivElement | null>) {\n const { subscribeWithSelector, getSnapshot } = usePlayerSubscription();\n\n useEffect(() => {\n if (!sliderEl.current) return;\n\n const unsubscribe = subscribeWithSelector(\n (s) => s.bufferedEndInSec,\n (bufferedEnd) => {\n if (!sliderEl.current) return;\n\n const { durationInSec } = getSnapshot();\n const buffered = toPercent(safeDivide(bufferedEnd ?? 0, durationInSec));\n\n sliderEl.current.style.setProperty(CSS_VARS.bufferPercent, buffered.toFixed(2));\n },\n );\n\n return unsubscribe;\n }, [sliderEl, subscribeWithSelector, getSnapshot]);\n}\n","import { useRef, type HTMLAttributes, type Ref } from \"react\";\nimport { useMediaAttributes } from \"@/hooks/useMediaAttributes\";\nimport { SKIP_INTERVAL } from \"@/constants\";\nimport { useSeekbarTime } from \"./useSeekbarTime\";\nimport { useSeekbarInteractivity } from \"./useSeekbarInteractivity\";\nimport { composeHandlers } from \"@/utils/handlers\";\nimport { Slider } from \"@/components/common/Slider\";\nimport { useMergeRefs } from \"@/hooks/useMergeRefs\";\nimport { useBufferTime } from \"./useBufferTimer\";\n\nexport interface SeekbarRootProps extends HTMLAttributes<HTMLDivElement> {\n skipInterval?: number;\n ref?: Ref<HTMLDivElement>;\n}\n\nexport function SeekbarRoot({\n skipInterval = SKIP_INTERVAL,\n ref,\n onKeyDown,\n onPointerMove,\n onPointerDown,\n onLostPointerCapture,\n ...props\n}: SeekbarRootProps) {\n const sliderEl = useRef<HTMLDivElement>(null);\n const mediaDataAttrs = useMediaAttributes();\n\n useSeekbarTime(sliderEl);\n useBufferTime(sliderEl);\n\n const mergedRef = useMergeRefs(sliderEl, ref);\n const { handlePointerDown, handleLostPointerCapture, handlePointerMove, handleKeyDown } =\n useSeekbarInteractivity(sliderEl, { skipInterval });\n\n return (\n <Slider\n ref={mergedRef}\n aria-label=\"Video player slider\"\n {...props}\n onPointerDown={composeHandlers(onPointerDown, handlePointerDown)}\n onPointerMove={composeHandlers(onPointerMove, handlePointerMove)}\n onLostPointerCapture={composeHandlers(onLostPointerCapture, handleLostPointerCapture)}\n onKeyDown={composeHandlers(onKeyDown, handleKeyDown)}\n aria-valuemin={0}\n {...mediaDataAttrs}\n />\n );\n}\n","import type { CSSProperties, HTMLAttributes, Ref } from \"react\";\n\nexport interface TrackProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n}\n\nexport function Track({ style, ...props }: TrackProps) {\n return <div style={{ ...style, ...defaultStyle }} {...props} />;\n}\n\nconst defaultStyle: CSSProperties = {\n position: \"relative\",\n isolation: \"isolate\",\n};\n","import { Track } from \"@/components/common/Track\";\nimport type { HTMLAttributes, Ref } from \"react\";\nimport { useMediaAttributes } from \"@/hooks/useMediaAttributes\";\n\nexport interface SeekbarTrackProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n}\n\nexport function SeekbarTrack(props: SeekbarTrackProps) {\n const mediaDataAttrs = useMediaAttributes();\n\n return <Track {...props} {...mediaDataAttrs} />;\n}\n","import type { CSSProperties, HTMLAttributes, Ref } from \"react\";\n\nexport interface ProgressProps extends HTMLAttributes<HTMLDivElement> {\n progressVar?: string;\n ref?: Ref<HTMLDivElement>;\n}\n\nexport function Progress({ progressVar = \"\", style, ...props }: ProgressProps) {\n return (\n <div\n style={{ ...style, ...defaultStyle, transform: `scaleX(calc(var(${progressVar}, 0) / 100))` }}\n {...props}\n />\n );\n}\n\nconst defaultStyle: CSSProperties = {\n width: \"100%\",\n height: \"100%\",\n position: \"absolute\",\n transformOrigin: \"left\",\n willChange: \"transform\",\n};\n","import { Progress } from \"@/components/common/Progress\";\nimport type { HTMLAttributes, Ref } from \"react\";\nimport { CSS_VARS } from \"@/constants\";\nimport { useMediaAttributes } from \"@/hooks/useMediaAttributes\";\n\nexport interface SeekbarProgressProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n}\n\nexport function SeekbarProgress({ style, ...props }: SeekbarProgressProps) {\n const mediaDataAttrs = useMediaAttributes();\n\n return (\n <Progress\n progressVar={CSS_VARS.progressPercent}\n style={{ zIndex: 2, ...style }}\n {...props}\n {...mediaDataAttrs}\n />\n );\n}\n","import { Progress } from \"@/components/common/Progress\";\nimport { type HTMLAttributes, type Ref } from \"react\";\nimport { CSS_VARS } from \"@/constants\";\nimport { useMediaAttributes } from \"@/hooks/useMediaAttributes\";\n\nexport interface SeekbarBufferProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n}\n\nexport function SeekbarBuffer({ style, ...props }: SeekbarBufferProps) {\n const mediaDataAttrs = useMediaAttributes();\n\n return (\n <Progress\n progressVar={CSS_VARS.bufferPercent}\n style={{ zIndex: 1, ...style }}\n {...props}\n {...mediaDataAttrs}\n />\n );\n}\n","import type { CSSProperties, HTMLAttributes, Ref } from \"react\";\nimport { CSS_VARS } from \"@/constants\";\n\nexport interface ThumbProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n}\n\nexport function Thumb({ style, ...props }: ThumbProps) {\n return (\n <div style={defaultContainerStyle}>\n <div style={{ ...defaultStyle, ...style }} {...props} />\n </div>\n );\n}\n\nconst defaultContainerStyle: CSSProperties = {\n width: \"100%\",\n height: \"100%\",\n position: \"absolute\",\n transform: `translateX(calc(var(${CSS_VARS.progressPercent}, 0) * 1%))`,\n willChange: \"transform\",\n pointerEvents: \"none\",\n left: 0,\n zIndex: \"var(--seekbar-thumb-z-index, 9999)\",\n};\n\nconst defaultStyle: CSSProperties = {\n position: \"absolute\",\n top: \"50%\",\n transform: \"translate(-50%, -50%)\",\n};\n","import { Thumb } from \"@/components/common/Thumb\";\nimport type { HTMLAttributes, Ref } from \"react\";\nimport { useMediaAttributes } from \"@/hooks/useMediaAttributes\";\n\nexport interface SeekbarThumbProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n}\n\nexport function SeekbarThumb(props: SeekbarThumbProps) {\n const mediaDataAttrs = useMediaAttributes();\n\n return <Thumb {...props} {...mediaDataAttrs} />;\n}\n","export { SeekbarRoot as Root } from \"./root/SeekbarRoot\";\nexport { SeekbarTrack as Track } from \"./track/SeekbarTrack\";\nexport { SeekbarProgress as Progress } from \"./progress/SeekbarProgress\";\nexport { SeekbarBuffer as Buffer } from \"./buffer/SeekbarBuffer\";\nexport { SeekbarThumb as Thumb } from \"./thumb/SeekbarThumb\";\n","import type { Ref } from \"react\";\nimport { usePlayerControls } from \"@/state/PlayerContext\";\nimport { useMediaAttributes } from \"@/hooks/useMediaAttributes\";\nimport { composeHandlers } from \"@/utils/handlers\";\nimport { DATA_ATTRS, SKIP_INTERVAL } from \"@/constants\";\nimport type { ButtonAttributes } from \"@/types\";\nimport { createTimeLabelFormatter } from \"@/utils/time\";\n\nexport type SkipDirection = \"back\" | \"forward\";\n\ninterface SkipButtonRootProps extends ButtonAttributes {\n direction: SkipDirection;\n skipInterval?: number;\n ref?: Ref<HTMLButtonElement>;\n}\n\nconst getTimeLabel = createTimeLabelFormatter(\"en\");\n\nexport function SkipButtonRoot({\n direction,\n skipInterval = SKIP_INTERVAL,\n onClick,\n ...props\n}: SkipButtonRootProps) {\n const { skip } = usePlayerControls();\n const mediaDataAttrs = useMediaAttributes();\n\n const isForward = direction === \"forward\";\n const handleSkip = () => skip(isForward ? skipInterval : -skipInterval);\n\n return (\n <button\n aria-label={`Skip ${isForward ? \"forward\" : \"back\"} ${getTimeLabel(skipInterval)}`}\n {...props}\n type=\"button\"\n onClick={composeHandlers(onClick, handleSkip)}\n {...{ [DATA_ATTRS.direction]: direction }}\n {...mediaDataAttrs}\n />\n );\n}\n","export { SkipButtonRoot as Root } from \"./root/SkipButtonRoot\";\n","import { createContext, use } from \"react\";\n\nexport type TimerMode = \"elapsed\" | \"remaining\";\n\nexport interface TimeDisplayContextValue {\n isElapsedMode: boolean;\n toggleMode: () => void;\n setMode: (mode: TimerMode) => void;\n}\n\nexport const TimeDisplayContext = createContext<TimeDisplayContextValue | null>(null);\n\nexport const useTimeDisplay = () => {\n const ctx = use(TimeDisplayContext);\n\n if (!ctx) {\n throw new Error(\"useTimeDisplay used outside of the TimeDisplayProvider!\");\n }\n\n return ctx;\n};\n","import { useCallback, useMemo, useState, type HTMLAttributes, type Ref } from \"react\";\nimport {\n TimeDisplayContext,\n type TimeDisplayContextValue,\n type TimerMode,\n} from \"../TimeDisplayContext\";\nimport { useMediaAttributes } from \"@/hooks/useMediaAttributes\";\n\ninterface TimeDisplayRootProps extends HTMLAttributes<HTMLDivElement> {\n initialMode?: \"elapsed\" | \"remaining\";\n ref?: Ref<HTMLDivElement>;\n}\n\nexport function TimeDisplayRoot({ initialMode = \"elapsed\", ...props }: TimeDisplayRootProps) {\n const [isElapsedMode, setIsElapsedMode] = useState(initialMode === \"elapsed\");\n const mediaDataAttrs = useMediaAttributes();\n\n const setMode = useCallback((mode: TimerMode) => setIsElapsedMode(mode === \"elapsed\"), []);\n const toggleMode = useCallback(() => setIsElapsedMode((m) => !m), []);\n\n const value: TimeDisplayContextValue = useMemo(\n () => ({ isElapsedMode, setMode, toggleMode }),\n [isElapsedMode, setMode, toggleMode],\n );\n\n return (\n <TimeDisplayContext value={value}>\n <div {...props} {...mediaDataAttrs} />\n </TimeDisplayContext>\n );\n}\n","import type { Ref } from \"react\";\nimport { useTimeDisplay } from \"../TimeDisplayContext\";\nimport { composeHandlers } from \"@/utils/handlers\";\nimport type { ButtonAttributes } from \"@/types\";\nimport { useMediaAttributes } from \"@/hooks/useMediaAttributes\";\nimport { DATA_ATTRS } from \"@/constants\";\n\ninterface TimeDisplayToggleProps extends ButtonAttributes {\n ref?: Ref<HTMLButtonElement>;\n}\n\nexport function TimeDisplayToggle({ onClick, ...props }: TimeDisplayToggleProps) {\n const { toggleMode, isElapsedMode } = useTimeDisplay();\n const mediaDataAttrs = useMediaAttributes();\n\n return (\n <button\n aria-label={`See ${isElapsedMode ? \"remaining\" : \"elapsed\"} time`}\n {...props}\n type=\"button\"\n onClick={composeHandlers(onClick, toggleMode)}\n {...{ [DATA_ATTRS.elapsedMode]: isElapsedMode }}\n {...mediaDataAttrs}\n />\n );\n}\n","import { usePlayerCtx, usePlayerSubscription } from \"@/state/PlayerContext\";\nimport { getDurationTimeFormat, getTimeFormat } from \"@/utils/time\";\nimport { useCallback, useLayoutEffect, type RefObject } from \"react\";\nimport { useTimeDisplay } from \"../TimeDisplayContext\";\nimport { useAnimateOnPlay } from \"@/hooks/useAnimateOnPlay\";\n\nconst UPDATE_INTERVAL_MS = 250;\n\nexport function useTimeDisplayTimer(timerRef: RefObject<HTMLTimeElement | null>) {\n const { isElapsedMode } = useTimeDisplay();\n const { mediaEl } = usePlayerCtx();\n const { getSnapshot } = usePlayerSubscription();\n\n const draw = useCallback(() => {\n if (!mediaEl.current || !timerRef.current) return;\n\n const { optimisticTimeInSec, durationInSec } = getSnapshot();\n const time = optimisticTimeInSec ?? mediaEl.current.currentTime;\n const remainingTime = durationInSec - time;\n const displayTime = isElapsedMode ? time : remainingTime;\n\n timerRef.current.textContent = `${isElapsedMode ? \"\" : \"-\"}${getTimeFormat(displayTime)}`;\n timerRef.current.dateTime = getDurationTimeFormat(displayTime);\n }, [isElapsedMode, mediaEl, timerRef, getSnapshot]);\n\n useAnimateOnPlay({ draw, intervalMs: UPDATE_INTERVAL_MS });\n\n useLayoutEffect(() => {\n draw();\n }, [isElapsedMode, draw]);\n}\n","import { useRef, type Ref } from \"react\";\nimport { useTimeDisplayTimer } from \"./useTimeDisplayTimer\";\nimport { useMediaAttributes } from \"@/hooks/useMediaAttributes\";\nimport { useMergeRefs } from \"@/hooks/useMergeRefs\";\nimport type { TimeDisplayAttributes } from \"@/types\";\n\ninterface TimeDisplayTimerProps extends TimeDisplayAttributes {\n ref?: Ref<HTMLTimeElement>;\n}\n\nexport function TimeDisplayTimer({ ref, ...props }: TimeDisplayTimerProps) {\n const timerRef = useRef<HTMLTimeElement>(null);\n const mergedRef = useMergeRefs(timerRef, ref);\n const mediaDataAttrs = useMediaAttributes();\n\n useTimeDisplayTimer(timerRef);\n\n return <time {...props} ref={mergedRef} {...mediaDataAttrs} />;\n}\n","import type { Ref } from \"react\";\nimport { usePlayer } from \"@/state/PlayerContext\";\nimport { useMediaAttributes } from \"@/hooks/useMediaAttributes\";\nimport { getDurationTimeFormat, getTimeFormat } from \"@/utils/time\";\nimport type { TimeDisplayAttributes } from \"@/types\";\n\ninterface TimeDisplayDurationProps extends TimeDisplayAttributes {\n ref?: Ref<HTMLTimeElement>;\n}\n\nexport function TimeDisplayDuration(props: TimeDisplayDurationProps) {\n const mediaDataAttrs = useMediaAttributes();\n const duration = usePlayer((s) => s.durationInSec);\n\n return (\n <time {...props} dateTime={getDurationTimeFormat(duration)} {...mediaDataAttrs}>\n {getTimeFormat(duration)}\n </time>\n );\n}\n","export { TimeDisplayRoot as Root } from \"./root/TimeDisplayRoot\";\nexport { TimeDisplayToggle as Toggle } from \"./toggle/TimeDisplayToggle\";\nexport { TimeDisplayTimer as Timer } from \"./timer/TimeDisplayTimer\";\nexport { TimeDisplayDuration as Duration } from \"./duration/TimeDisplayDuration\";\n","import type { HTMLAttributes, Ref } from \"react\";\nimport { useMediaAttributes } from \"@/hooks/useMediaAttributes\";\n\ninterface VideoRootProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n}\n\nexport function VideoRoot({ style, ...props }: VideoRootProps) {\n const mediaDataAttrs = useMediaAttributes();\n\n return <div style={{ ...style, position: \"relative\" }} {...props} {...mediaDataAttrs} />;\n}\n","import { DOUBLE_CLICK_DELTA_MS, KEY_NAMES } from \"@/constants\";\nimport { usePlayerControls, usePlayerCtx } from \"@/state/PlayerContext\";\nimport { normalizeKeyCode } from \"@/utils/handlers\";\nimport {\n useEffect,\n useRef,\n type KeyboardEventHandler,\n type MouseEventHandler,\n type PointerEvent,\n type PointerEventHandler,\n} from \"react\";\n\ntype OnDoubleClick = \"fullscreen\" | PointerEventHandler<HTMLButtonElement>;\n\nexport interface OverlayInteractivityOptions {\n onPointerUp?: MouseEventHandler<HTMLButtonElement>;\n onPointerDown?: MouseEventHandler<HTMLButtonElement>;\n onDoubleClick?: OnDoubleClick;\n onDoubleTouch?: OnDoubleClick;\n doubleClickInterval?: number;\n}\n\nexport function useOverlayInteractivity({\n onPointerUp,\n onPointerDown,\n onDoubleTouch = \"fullscreen\",\n onDoubleClick = \"fullscreen\",\n doubleClickInterval = DOUBLE_CLICK_DELTA_MS,\n}: OverlayInteractivityOptions) {\n const pointedDownEl = useRef<HTMLElement>(null);\n const prevClickTimer = useRef<ReturnType<typeof setTimeout>>(null);\n const prevClick = useRef(0);\n\n const { containerEl } = usePlayerCtx();\n const { toggle, toggleFullscreen } = usePlayerControls();\n\n useEffect(() => {\n return () => {\n if (prevClickTimer.current) {\n clearTimeout(prevClickTimer.current);\n }\n };\n }, []);\n\n const fireDoubleClick = (e: PointerEvent<HTMLButtonElement>, onDoubleClick: OnDoubleClick) => {\n if (prevClickTimer.current) {\n clearTimeout(prevClickTimer.current);\n prevClickTimer.current = null;\n }\n\n if (typeof onDoubleClick === \"function\") return onDoubleClick(e);\n if (onDoubleClick === \"fullscreen\") return toggleFullscreen();\n };\n\n const handlePointerDown: PointerEventHandler<HTMLButtonElement> = (e) => {\n onPointerDown?.(e);\n if (e.defaultPrevented) return;\n\n pointedDownEl.current = e.currentTarget;\n };\n\n const handlePointerUp: PointerEventHandler<HTMLButtonElement> = (e) => {\n onPointerUp?.(e);\n if (e.defaultPrevented || !containerEl.current?.contains(pointedDownEl.current)) return;\n\n const now = performance.now();\n const delta = now - prevClick.current;\n const isSingleClick = delta > doubleClickInterval;\n\n pointedDownEl.current = null;\n prevClick.current = now;\n\n if (isSingleClick) {\n prevClickTimer.current = setTimeout(() => {\n toggle();\n prevClickTimer.current = null;\n }, doubleClickInterval);\n } else {\n fireDoubleClick(e, e.pointerType === \"mouse\" ? onDoubleClick : onDoubleTouch);\n }\n };\n\n const handleKeyDown: KeyboardEventHandler<HTMLButtonElement> = (e) => {\n switch (normalizeKeyCode(e.key)) {\n case KEY_NAMES.ENTER:\n case KEY_NAMES.SPACE:\n e.preventDefault();\n return toggle();\n }\n };\n\n return { handlePointerUp, handlePointerDown, handleKeyDown };\n}\n","import type { CSSProperties, Ref } from \"react\";\nimport {\n useOverlayInteractivity,\n type OverlayInteractivityOptions,\n} from \"./useOverlayInteractivity\";\nimport { composeHandlers } from \"@/utils/handlers\";\nimport { useMediaAttributes } from \"@/hooks/useMediaAttributes\";\nimport type { ButtonAttributes } from \"@/types\";\n\ninterface VideoOverlayRootProps extends Omit<ButtonAttributes, \"onDoubleClick\"> {\n label: string;\n onDoubleClick?: OverlayInteractivityOptions[\"onDoubleClick\"];\n onDoubleTouch?: OverlayInteractivityOptions[\"onDoubleTouch\"];\n doubleClickInterval?: number;\n ref?: Ref<HTMLButtonElement>;\n}\n\nexport function VideoOverlayRoot({\n style,\n label,\n onDoubleClick,\n onDoubleTouch,\n doubleClickInterval,\n onPointerDown,\n onPointerUp,\n onKeyDown,\n ...props\n}: VideoOverlayRootProps) {\n const mediaDataAttrs = useMediaAttributes();\n const { handlePointerDown, handlePointerUp, handleKeyDown } = useOverlayInteractivity({\n onPointerDown,\n onPointerUp,\n onDoubleClick,\n onDoubleTouch,\n doubleClickInterval,\n });\n\n return (\n <button\n type=\"button\"\n aria-label={label}\n style={{ ...style, ...requiredStyle }}\n onPointerDown={handlePointerDown}\n onPointerUp={handlePointerUp}\n onKeyDown={composeHandlers(onKeyDown, handleKeyDown)}\n {...props}\n // double click is handled internally onPointerDown, so onDoubleClick has to be no-op\n onDoubleClick={() => {}}\n {...mediaDataAttrs}\n />\n );\n}\n\nconst requiredStyle: CSSProperties = {\n position: \"absolute\",\n inset: 0,\n touchAction: \"manipulation\",\n};\n","import { usePlayerCtx } from \"@/state/PlayerContext\";\nimport type { Ref, VideoHTMLAttributes } from \"react\";\nimport { useMergeRefs } from \"@/hooks/useMergeRefs\";\nimport { useMediaAttributes } from \"@/hooks/useMediaAttributes\";\n\ninterface VideoPlayerProps extends VideoHTMLAttributes<HTMLVideoElement> {\n src?: string;\n ref?: Ref<HTMLVideoElement>;\n}\n\nexport function VideoPlayer({ ref, ...props }: VideoPlayerProps) {\n const { mediaEl } = usePlayerCtx();\n const mergedRef = useMergeRefs(mediaEl, ref);\n const mediaDataAttrs = useMediaAttributes();\n\n return <video ref={mergedRef} {...props} {...mediaDataAttrs} />;\n}\n","export { VideoRoot as Root } from \"./root/VideoRoot\";\nexport { VideoOverlayRoot as Overlay } from \"./overlay/VideoOverlay\";\nexport { VideoPlayer as Player } from \"./player/VideoPlayer\";\n","import type { PlayerState, Selector } from \"@/state/types\";\n\nexport const isEqual = (a: unknown, b: unknown) => {\n if (Object.is(a, b)) return true;\n if (typeof a !== \"object\" || typeof b !== \"object\" || a === null || b === null) return false;\n\n const entriesA = Object.entries(a);\n const entriesB = Object.entries(b);\n if (entriesA.length !== entriesB.length) return false;\n return entriesA.every(([k, v]) => Object.is(v, (b as Record<string, unknown>)[k]));\n};\n\nexport function shallow<T extends {}>(selector: Selector<T>) {\n let prev: T | null = null;\n return (state: PlayerState) => {\n const next = selector(state);\n if (prev && isEqual(prev, next)) return prev;\n prev = next;\n return next;\n };\n}\n","import { CSS_VARS, DATA_ATTRS, KEY_NAMES, MAX_VOLUME, MIN_VOLUME } from \"@/constants\";\nimport { useRectPosition } from \"@/hooks/useRectPosition\";\nimport { usePlayerControls, usePlayerSubscription } from \"@/state/PlayerContext\";\nimport { shallow } from \"@/state/shallow\";\nimport { toPercent } from \"@/utils/math\";\nimport { normalizeKeyCode } from \"@/utils/handlers\";\nimport { clampVolume } from \"@/utils/volume\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n type KeyboardEventHandler,\n type PointerEventHandler,\n type RefObject,\n} from \"react\";\n\ninterface Config {\n volumeInterval: number;\n computeAriaValueText?: ({ volume, isMuted }: { volume: number; isMuted: boolean }) => string;\n}\n\nexport function useVolume(\n sliderEl: RefObject<HTMLDivElement | null>,\n { volumeInterval, computeAriaValueText }: Config,\n) {\n const computeAriaValueTextStable = useRef(computeAriaValueText);\n\n const { setRect: setSliderRect, calcRectPositionX } = useRectPosition();\n const { subscribeWithSelector, getSnapshot } = usePlayerSubscription();\n const { stepVolume, setVolume } = usePlayerControls();\n\n const updateSliderEl = useCallback(() => {\n if (!sliderEl.current) return;\n\n const { volume, isMuted } = getSnapshot();\n const currentVolume = isMuted ? 0 : volume;\n const currentVolumePercent = toPercent(currentVolume).toFixed(2);\n\n sliderEl.current.style.setProperty(CSS_VARS.progressPercent, String(currentVolumePercent));\n sliderEl.current.setAttribute(\"aria-valuenow\", String(currentVolume.toFixed(2)));\n sliderEl.current.setAttribute(\n \"aria-valuetext\",\n computeAriaValueTextStable.current?.({ volume, isMuted }) ?? `${currentVolumePercent}%`,\n );\n sliderEl.current.toggleAttribute(DATA_ATTRS.muted, isMuted);\n }, [getSnapshot, sliderEl]);\n\n useEffect(() => {\n computeAriaValueTextStable.current = computeAriaValueText;\n }, [computeAriaValueText]);\n\n useLayoutEffect(() => {\n const unsubscribe = subscribeWithSelector(\n shallow((s) => ({ volume: s.volume, isMuted: s.isMuted })),\n updateSliderEl,\n );\n\n updateSliderEl();\n\n return unsubscribe;\n }, [subscribeWithSelector, updateSliderEl, sliderEl]);\n\n function updateVolume(clickX: number) {\n const calculatedPosition = calcRectPositionX(clickX);\n if (calculatedPosition == null) return;\n\n setVolume(clampVolume(calculatedPosition));\n updateSliderEl();\n }\n\n const handlePointerDown: PointerEventHandler<HTMLDivElement> = (e) => {\n if (!sliderEl.current) return;\n\n setSliderRect(sliderEl.current.getBoundingClientRect());\n sliderEl.current.setPointerCapture(e.pointerId);\n sliderEl.current.setAttribute(DATA_ATTRS.dragging, \"true\");\n updateVolume(e.clientX);\n };\n\n const handlePointerMove: PointerEventHandler<HTMLDivElement> = (e) => {\n if (!sliderEl.current || !sliderEl.current.hasPointerCapture(e.pointerId)) return;\n\n updateVolume(e.clientX);\n };\n\n const handleLostPointerCapture: PointerEventHandler<HTMLDivElement> = () => {\n if (!sliderEl.current) return;\n\n sliderEl.current.toggleAttribute(DATA_ATTRS.dragging, false);\n };\n\n const handleKeyDown: KeyboardEventHandler<HTMLDivElement> = (e) => {\n switch (normalizeKeyCode(e.key)) {\n case KEY_NAMES.ARROW_LEFT:\n case KEY_NAMES.ARROW_DOWN:\n e.preventDefault();\n return stepVolume(-volumeInterval);\n case KEY_NAMES.ARROW_RIGHT:\n case KEY_NAMES.ARROW_UP:\n e.preventDefault();\n return stepVolume(volumeInterval);\n case KEY_NAMES.HOME:\n e.preventDefault();\n return setVolume(MIN_VOLUME);\n case KEY_NAMES.END:\n e.preventDefault();\n return setVolume(MAX_VOLUME);\n }\n };\n\n return { handlePointerDown, handlePointerMove, handleLostPointerCapture, handleKeyDown };\n}\n","import { useRef, type HTMLAttributes, type Ref } from \"react\";\nimport { useVolume } from \"./useVolume\";\nimport { composeHandlers } from \"@/utils/handlers\";\nimport { Slider } from \"@/components/common/Slider\";\nimport { MAX_VOLUME, MIN_VOLUME, VOLUME_INTERVAL } from \"@/constants\";\nimport { useMediaAttributes } from \"@/hooks/useMediaAttributes\";\nimport { useMergeRefs } from \"@/hooks/useMergeRefs\";\n\nexport interface VolumeSliderRootProps extends HTMLAttributes<HTMLDivElement> {\n volumeInterval?: number;\n ref?: Ref<HTMLDivElement>;\n computeAriaValueText?: ({ volume, isMuted }: { volume: number; isMuted: boolean }) => string;\n}\n\nexport function VolumeSlider({\n volumeInterval = VOLUME_INTERVAL,\n ref,\n onPointerDown,\n onPointerMove,\n onLostPointerCapture,\n onKeyDown,\n computeAriaValueText,\n ...props\n}: VolumeSliderRootProps) {\n const sliderEl = useRef<HTMLDivElement>(null);\n const mergedRef = useMergeRefs(sliderEl, ref);\n const mediaDataAttrs = useMediaAttributes();\n const { handleKeyDown, handlePointerDown, handlePointerMove, handleLostPointerCapture } =\n useVolume(sliderEl, { volumeInterval, computeAriaValueText });\n\n return (\n <Slider\n ref={mergedRef}\n aria-label=\"Video volume slider\"\n {...props}\n aria-valuemin={MIN_VOLUME}\n aria-valuemax={MAX_VOLUME}\n onPointerMove={composeHandlers(onPointerMove, handlePointerMove)}\n onPointerDown={composeHandlers(onPointerDown, handlePointerDown)}\n onLostPointerCapture={composeHandlers(onLostPointerCapture, handleLostPointerCapture)}\n onKeyDown={composeHandlers(onKeyDown, handleKeyDown)}\n {...mediaDataAttrs}\n />\n );\n}\n","import { usePlayer, usePlayerControls } from \"@/state/PlayerContext\";\nimport { useMediaAttributes } from \"@/hooks/useMediaAttributes\";\nimport { composeHandlers } from \"@/utils/handlers\";\nimport { setDataAttr } from \"@/utils/attributes\";\nimport { DATA_ATTRS } from \"@/constants\";\nimport type { Ref } from \"react\";\nimport type { ButtonAttributes } from \"@/types\";\n\ninterface VolumeMuteProps extends ButtonAttributes {\n ref?: Ref<HTMLButtonElement>;\n}\n\nexport function VolumeMute({ onClick, ...props }: VolumeMuteProps) {\n const { toggleMute } = usePlayerControls();\n const mediaDataAttrs = useMediaAttributes();\n const isMuted = usePlayer((s) => s.isMuted);\n\n return (\n <button\n aria-label={isMuted ? \"Unmute video\" : \"Mute video\"}\n {...props}\n type=\"button\"\n onClick={composeHandlers(onClick, toggleMute)}\n {...{ [DATA_ATTRS.muted]: setDataAttr(isMuted) }}\n {...mediaDataAttrs}\n />\n );\n}\n","import { Track } from \"@/components/common/Track\";\nimport type { HTMLAttributes, Ref } from \"react\";\nimport { useMediaAttributes } from \"@/hooks/useMediaAttributes\";\n\nexport interface VolumeTrackProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n}\n\nexport function VolumeTrack(props: VolumeTrackProps) {\n const mediaDataAttrs = useMediaAttributes();\n\n return <Track {...props} {...mediaDataAttrs} />;\n}\n","import { Progress } from \"@/components/common/Progress\";\nimport type { HTMLAttributes, Ref } from \"react\";\nimport { CSS_VARS } from \"@/constants\";\nimport { useMediaAttributes } from \"@/hooks/useMediaAttributes\";\n\nexport interface VolumeProgressProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n}\n\nexport function VolumeProgress(props: VolumeProgressProps) {\n const mediaDataAttrs = useMediaAttributes();\n\n return <Progress progressVar={CSS_VARS.progressPercent} {...props} {...mediaDataAttrs} />;\n}\n","import { Thumb } from \"@/components/common/Thumb\";\nimport type { HTMLAttributes, Ref } from \"react\";\nimport { useMediaAttributes } from \"@/hooks/useMediaAttributes\";\n\nexport interface VolumeThumbProps extends HTMLAttributes<HTMLDivElement> {\n ref?: Ref<HTMLDivElement>;\n}\n\nexport function VolumeThumb(props: VolumeThumbProps) {\n const mediaDataAttrs = useMediaAttributes();\n\n return <Thumb {...props} {...mediaDataAttrs} />;\n}\n","export { VolumeSlider as Slider } from \"./slider/VolumeSlider\";\nexport { VolumeMute as Mute } from \"./mute/VolumeMute\";\nexport { VolumeTrack as Track } from \"./track/VolumeTrack\";\nexport { VolumeProgress as Progress } from \"./progress/VolumeProgress\";\nexport { VolumeThumb as Thumb } from \"./thumb/VolumeThumb\";\n"],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
//#region \0rolldown/runtime.js
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __exportAll = (all, no_symbols) => {
|
|
4
|
+
let target = {};
|
|
5
|
+
for (var name in all) {
|
|
6
|
+
__defProp(target, name, {
|
|
7
|
+
get: all[name],
|
|
8
|
+
enumerable: true
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
if (!no_symbols) {
|
|
12
|
+
__defProp(target, Symbol.toStringTag, { value: "Module" });
|
|
13
|
+
}
|
|
14
|
+
return target;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
//#endregion
|
|
18
|
+
export { __exportAll as t };
|
package/package.json
ADDED
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "react-media-kit",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Headless, unstyled React video player primitives",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"author": "Marek Miklaszewski",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/Balldoro/react-media-kit.git"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/Balldoro/react-media-kit#readme",
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/Balldoro/react-media-kit/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"react",
|
|
18
|
+
"video",
|
|
19
|
+
"video-player",
|
|
20
|
+
"media",
|
|
21
|
+
"audio",
|
|
22
|
+
"player",
|
|
23
|
+
"headless",
|
|
24
|
+
"UI",
|
|
25
|
+
"typescript"
|
|
26
|
+
],
|
|
27
|
+
"sideEffects": false,
|
|
28
|
+
"main": "./dist/index.js",
|
|
29
|
+
"module": "./dist/index.js",
|
|
30
|
+
"types": "./dist/index.d.ts",
|
|
31
|
+
"exports": {
|
|
32
|
+
".": {
|
|
33
|
+
"types": "./dist/index.d.ts",
|
|
34
|
+
"import": "./dist/index.js"
|
|
35
|
+
},
|
|
36
|
+
"./package.json": "./package.json"
|
|
37
|
+
},
|
|
38
|
+
"files": [
|
|
39
|
+
"dist"
|
|
40
|
+
],
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=18"
|
|
43
|
+
},
|
|
44
|
+
"scripts": {
|
|
45
|
+
"build": "tsdown",
|
|
46
|
+
"dev": "tsdown --watch",
|
|
47
|
+
"lint": "oxlint .",
|
|
48
|
+
"lint:fix": "oxlint . --fix",
|
|
49
|
+
"format": "prettier --write .",
|
|
50
|
+
"format:check": "prettier --check .",
|
|
51
|
+
"typecheck": "tsc --noEmit",
|
|
52
|
+
"test": "vitest run",
|
|
53
|
+
"test:watch": "vitest",
|
|
54
|
+
"size": "size-limit",
|
|
55
|
+
"size:why": "size-limit --why",
|
|
56
|
+
"prepare": "husky",
|
|
57
|
+
"prepublishOnly": "pnpm typecheck && pnpm lint && pnpm format:check && pnpm test && pnpm build",
|
|
58
|
+
"changeset": "changeset",
|
|
59
|
+
"version": "changeset version",
|
|
60
|
+
"release": "changeset publish"
|
|
61
|
+
},
|
|
62
|
+
"size-limit": [
|
|
63
|
+
{
|
|
64
|
+
"name": "Bundle size (gzip)",
|
|
65
|
+
"path": "dist/*.js",
|
|
66
|
+
"gzip": true,
|
|
67
|
+
"disablePlugins": [
|
|
68
|
+
"@size-limit/esbuild"
|
|
69
|
+
],
|
|
70
|
+
"limit": "12 KB"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"name": "Bundle size (gzip, from source)",
|
|
74
|
+
"path": "src/index.ts",
|
|
75
|
+
"gzip": true,
|
|
76
|
+
"ignore": [
|
|
77
|
+
"react",
|
|
78
|
+
"react-dom",
|
|
79
|
+
"react/jsx-runtime"
|
|
80
|
+
],
|
|
81
|
+
"limit": "12 KB"
|
|
82
|
+
}
|
|
83
|
+
],
|
|
84
|
+
"lint-staged": {
|
|
85
|
+
"*.{js,jsx,ts,tsx}": [
|
|
86
|
+
"oxlint --fix",
|
|
87
|
+
"prettier --write"
|
|
88
|
+
]
|
|
89
|
+
},
|
|
90
|
+
"peerDependencies": {
|
|
91
|
+
"react": ">=19",
|
|
92
|
+
"react-dom": ">=19"
|
|
93
|
+
},
|
|
94
|
+
"devDependencies": {
|
|
95
|
+
"@changesets/cli": "^3.0.1",
|
|
96
|
+
"@size-limit/esbuild-why": "^13.0.3",
|
|
97
|
+
"@size-limit/file": "^13.0.3",
|
|
98
|
+
"@size-limit/preset-small-lib": "^13.0.3",
|
|
99
|
+
"@testing-library/react": "^16.3.2",
|
|
100
|
+
"@types/react": "^19.2.18",
|
|
101
|
+
"@types/react-dom": "^19.2.4",
|
|
102
|
+
"husky": "^9.1.7",
|
|
103
|
+
"jsdom": "^30.0.1",
|
|
104
|
+
"lint-staged": "^17.3.0",
|
|
105
|
+
"oxlint": "^1.78.0",
|
|
106
|
+
"prettier": "^3.9.6",
|
|
107
|
+
"react": "^19.2.8",
|
|
108
|
+
"react-dom": "^19.2.8",
|
|
109
|
+
"size-limit": "^13.0.3",
|
|
110
|
+
"tsdown": "^0.22.14",
|
|
111
|
+
"typescript": "^7.0.2",
|
|
112
|
+
"vitest": "^4.1.11"
|
|
113
|
+
},
|
|
114
|
+
"packageManager": "pnpm@11.22.0"
|
|
115
|
+
}
|