@videojs/react 10.0.0-alpha.4 → 10.0.0-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/default/_virtual/_rolldown/runtime.js +1 -19
- package/dist/default/index.js +10 -33
- package/dist/default/player/context.js +11 -1
- package/dist/default/player/context.js.map +1 -1
- package/dist/default/presets/audio/index.js +2 -8
- package/dist/default/presets/audio/skin.css +1 -0
- package/dist/default/presets/background/index.js +2 -8
- package/dist/default/presets/background/skin.css +1 -0
- package/dist/default/presets/video/index.js +2 -8
- package/dist/default/presets/video/minimal-skin.css +178 -53
- package/dist/default/presets/video/minimal-skin.js +63 -90
- package/dist/default/presets/video/minimal-skin.js.map +1 -1
- package/dist/default/presets/video/minimal-skin.tailwind.js +126 -107
- package/dist/default/presets/video/minimal-skin.tailwind.js.map +1 -1
- package/dist/default/presets/video/skin.css +179 -54
- package/dist/default/presets/video/skin.js +61 -88
- package/dist/default/presets/video/skin.js.map +1 -1
- package/dist/default/presets/video/skin.tailwind.js +121 -104
- package/dist/default/presets/video/skin.tailwind.js.map +1 -1
- package/dist/default/skins/dist/default/video/default.tailwind.js +90 -0
- package/dist/default/skins/dist/default/video/default.tailwind.js.map +1 -0
- package/dist/default/skins/dist/default/video/minimal.tailwind.js +86 -0
- package/dist/default/skins/dist/default/video/minimal.tailwind.js.map +1 -0
- package/dist/default/ui/captions-button/captions-button.js +1 -16
- package/dist/default/ui/captions-button/captions-button.js.map +1 -1
- package/dist/default/ui/controls/context.js +16 -0
- package/dist/default/ui/controls/context.js.map +1 -0
- package/dist/default/ui/controls/controls-group.js +4 -1
- package/dist/default/ui/controls/controls-group.js.map +1 -1
- package/dist/default/ui/controls/controls-root.js +19 -10
- package/dist/default/ui/controls/controls-root.js.map +1 -1
- package/dist/default/ui/create-context-part.js +29 -0
- package/dist/default/ui/create-context-part.js.map +1 -0
- package/dist/default/ui/create-media-button.js +52 -0
- package/dist/default/ui/create-media-button.js.map +1 -0
- package/dist/default/ui/fullscreen-button/fullscreen-button.js +8 -33
- package/dist/default/ui/fullscreen-button/fullscreen-button.js.map +1 -1
- package/dist/default/ui/hooks/use-slider.js +75 -0
- package/dist/default/ui/hooks/use-slider.js.map +1 -0
- package/dist/default/ui/mute-button/mute-button.js +8 -36
- package/dist/default/ui/mute-button/mute-button.js.map +1 -1
- package/dist/default/ui/pip-button/pip-button.js +8 -33
- package/dist/default/ui/pip-button/pip-button.js.map +1 -1
- package/dist/default/ui/play-button/play-button.js +7 -33
- package/dist/default/ui/play-button/play-button.js.map +1 -1
- package/dist/default/ui/playback-rate-button/index.js +3 -0
- package/dist/default/ui/playback-rate-button/playback-rate-button.js +34 -0
- package/dist/default/ui/playback-rate-button/playback-rate-button.js.map +1 -0
- package/dist/default/ui/popover/context.js +16 -0
- package/dist/default/ui/popover/context.js.map +1 -0
- package/dist/default/ui/popover/index.js +4 -0
- package/dist/default/ui/popover/index.parts.js +17 -0
- package/dist/default/ui/popover/index.parts.js.map +1 -0
- package/dist/default/ui/popover/popover-arrow.js +17 -0
- package/dist/default/ui/popover/popover-arrow.js.map +1 -0
- package/dist/default/ui/popover/popover-popup.js +94 -0
- package/dist/default/ui/popover/popover-popup.js.map +1 -0
- package/dist/default/ui/popover/popover-root.js +69 -0
- package/dist/default/ui/popover/popover-root.js.map +1 -0
- package/dist/default/ui/popover/popover-trigger.js +43 -0
- package/dist/default/ui/popover/popover-trigger.js.map +1 -0
- package/dist/default/ui/poster/poster.js +2 -1
- package/dist/default/ui/poster/poster.js.map +1 -1
- package/dist/default/ui/seek-button/seek-button.js +7 -34
- package/dist/default/ui/seek-button/seek-button.js.map +1 -1
- package/dist/default/ui/slider/context.js +22 -0
- package/dist/default/ui/slider/context.js.map +1 -0
- package/dist/default/ui/slider/index.js +3 -0
- package/dist/default/ui/slider/index.parts.js +21 -0
- package/dist/default/ui/slider/index.parts.js.map +1 -0
- package/dist/default/ui/slider/slider-buffer.js +16 -0
- package/dist/default/ui/slider/slider-buffer.js.map +1 -0
- package/dist/default/ui/slider/slider-fill.js +16 -0
- package/dist/default/ui/slider/slider-fill.js.map +1 -0
- package/dist/default/ui/slider/slider-root.js +71 -0
- package/dist/default/ui/slider/slider-root.js.map +1 -0
- package/dist/default/ui/slider/slider-thumb.js +32 -0
- package/dist/default/ui/slider/slider-thumb.js.map +1 -0
- package/dist/default/ui/slider/slider-track.js +16 -0
- package/dist/default/ui/slider/slider-track.js.map +1 -0
- package/dist/default/ui/slider/slider-value.js +32 -0
- package/dist/default/ui/slider/slider-value.js.map +1 -0
- package/dist/default/ui/thumbnail/thumbnail.js +87 -0
- package/dist/default/ui/thumbnail/thumbnail.js.map +1 -0
- package/dist/default/ui/time/time-value.js +2 -1
- package/dist/default/ui/time/time-value.js.map +1 -1
- package/dist/default/ui/time-slider/index.js +3 -0
- package/dist/default/ui/time-slider/index.parts.js +21 -0
- package/dist/default/ui/time-slider/index.parts.js.map +1 -0
- package/dist/default/ui/time-slider/time-slider-root.js +96 -0
- package/dist/default/ui/time-slider/time-slider-root.js.map +1 -0
- package/dist/default/ui/volume-slider/index.js +3 -0
- package/dist/default/ui/volume-slider/index.parts.js +19 -0
- package/dist/default/ui/volume-slider/index.parts.js.map +1 -0
- package/dist/default/ui/volume-slider/volume-slider-root.js +86 -0
- package/dist/default/ui/volume-slider/volume-slider-root.js.map +1 -0
- package/dist/default/utils/use-force-render.js +13 -0
- package/dist/default/utils/use-force-render.js.map +1 -0
- package/dist/default/utils/use-latest-ref.js +20 -0
- package/dist/default/utils/use-latest-ref.js.map +1 -0
- package/dist/default/utils/use-safe-id.js +22 -0
- package/dist/default/utils/use-safe-id.js.map +1 -0
- package/dist/dev/_virtual/_rolldown/runtime.js +1 -19
- package/dist/dev/index.d.ts +20 -2
- package/dist/dev/index.js +10 -33
- package/dist/dev/player/context.d.ts.map +1 -1
- package/dist/dev/player/context.js +11 -1
- package/dist/dev/player/context.js.map +1 -1
- package/dist/dev/presets/audio/index.d.ts +2 -9
- package/dist/dev/presets/audio/index.js +2 -8
- package/dist/dev/presets/audio/skin.css +1 -0
- package/dist/dev/presets/background/index.d.ts +2 -9
- package/dist/dev/presets/background/index.js +2 -8
- package/dist/dev/presets/background/skin.css +1 -0
- package/dist/dev/presets/video/index.d.ts +2 -9
- package/dist/dev/presets/video/index.js +2 -8
- package/dist/dev/presets/video/minimal-skin.css +178 -53
- package/dist/dev/presets/video/minimal-skin.d.ts.map +1 -1
- package/dist/dev/presets/video/minimal-skin.js +61 -88
- package/dist/dev/presets/video/minimal-skin.js.map +1 -1
- package/dist/dev/presets/video/minimal-skin.tailwind.d.ts.map +1 -1
- package/dist/dev/presets/video/minimal-skin.tailwind.js +124 -105
- package/dist/dev/presets/video/minimal-skin.tailwind.js.map +1 -1
- package/dist/dev/presets/video/skin.css +179 -54
- package/dist/dev/presets/video/skin.d.ts.map +1 -1
- package/dist/dev/presets/video/skin.js +61 -88
- package/dist/dev/presets/video/skin.js.map +1 -1
- package/dist/dev/presets/video/skin.tailwind.d.ts.map +1 -1
- package/dist/dev/presets/video/skin.tailwind.js +121 -104
- package/dist/dev/presets/video/skin.tailwind.js.map +1 -1
- package/dist/dev/skins/dist/default/video/default.tailwind.js +90 -0
- package/dist/dev/skins/dist/default/video/default.tailwind.js.map +1 -0
- package/dist/dev/skins/dist/default/video/minimal.tailwind.js +86 -0
- package/dist/dev/skins/dist/default/video/minimal.tailwind.js.map +1 -0
- package/dist/dev/ui/captions-button/captions-button.d.ts.map +1 -1
- package/dist/dev/ui/captions-button/captions-button.js +1 -16
- package/dist/dev/ui/captions-button/captions-button.js.map +1 -1
- package/dist/dev/ui/controls/context.js +16 -0
- package/dist/dev/ui/controls/context.js.map +1 -0
- package/dist/dev/ui/controls/controls-group.d.ts +2 -2
- package/dist/dev/ui/controls/controls-group.d.ts.map +1 -1
- package/dist/dev/ui/controls/controls-group.js +4 -1
- package/dist/dev/ui/controls/controls-group.js.map +1 -1
- package/dist/dev/ui/controls/controls-root.d.ts.map +1 -1
- package/dist/dev/ui/controls/controls-root.js +19 -10
- package/dist/dev/ui/controls/controls-root.js.map +1 -1
- package/dist/dev/ui/create-context-part.js +29 -0
- package/dist/dev/ui/create-context-part.js.map +1 -0
- package/dist/dev/ui/create-media-button.js +55 -0
- package/dist/dev/ui/create-media-button.js.map +1 -0
- package/dist/dev/ui/fullscreen-button/fullscreen-button.d.ts +2 -1
- package/dist/dev/ui/fullscreen-button/fullscreen-button.d.ts.map +1 -1
- package/dist/dev/ui/fullscreen-button/fullscreen-button.js +9 -37
- package/dist/dev/ui/fullscreen-button/fullscreen-button.js.map +1 -1
- package/dist/dev/ui/hooks/use-slider.d.ts +36 -0
- package/dist/dev/ui/hooks/use-slider.d.ts.map +1 -0
- package/dist/dev/ui/hooks/use-slider.js +75 -0
- package/dist/dev/ui/hooks/use-slider.js.map +1 -0
- package/dist/dev/ui/mute-button/mute-button.d.ts +2 -4
- package/dist/dev/ui/mute-button/mute-button.d.ts.map +1 -1
- package/dist/dev/ui/mute-button/mute-button.js +9 -40
- package/dist/dev/ui/mute-button/mute-button.js.map +1 -1
- package/dist/dev/ui/pip-button/pip-button.d.ts +2 -1
- package/dist/dev/ui/pip-button/pip-button.d.ts.map +1 -1
- package/dist/dev/ui/pip-button/pip-button.js +9 -37
- package/dist/dev/ui/pip-button/pip-button.js.map +1 -1
- package/dist/dev/ui/play-button/play-button.d.ts +1 -1
- package/dist/dev/ui/play-button/play-button.d.ts.map +1 -1
- package/dist/dev/ui/play-button/play-button.js +8 -37
- package/dist/dev/ui/play-button/play-button.js.map +1 -1
- package/dist/dev/ui/playback-rate-button/index.d.ts +2 -0
- package/dist/dev/ui/playback-rate-button/index.js +3 -0
- package/dist/dev/ui/playback-rate-button/playback-rate-button.d.ts +30 -0
- package/dist/dev/ui/playback-rate-button/playback-rate-button.d.ts.map +1 -0
- package/dist/dev/ui/playback-rate-button/playback-rate-button.js +34 -0
- package/dist/dev/ui/playback-rate-button/playback-rate-button.js.map +1 -0
- package/dist/dev/ui/popover/context.d.ts +17 -0
- package/dist/dev/ui/popover/context.d.ts.map +1 -0
- package/dist/dev/ui/popover/context.js +16 -0
- package/dist/dev/ui/popover/context.js.map +1 -0
- package/dist/dev/ui/popover/index.d.ts +3 -0
- package/dist/dev/ui/popover/index.js +4 -0
- package/dist/dev/ui/popover/index.parts.d.ts +12 -0
- package/dist/dev/ui/popover/index.parts.d.ts.map +1 -0
- package/dist/dev/ui/popover/index.parts.js +17 -0
- package/dist/dev/ui/popover/index.parts.js.map +1 -0
- package/dist/dev/ui/popover/popover-arrow.d.ts +15 -0
- package/dist/dev/ui/popover/popover-arrow.d.ts.map +1 -0
- package/dist/dev/ui/popover/popover-arrow.js +17 -0
- package/dist/dev/ui/popover/popover-arrow.js.map +1 -0
- package/dist/dev/ui/popover/popover-popup.d.ts +15 -0
- package/dist/dev/ui/popover/popover-popup.d.ts.map +1 -0
- package/dist/dev/ui/popover/popover-popup.js +94 -0
- package/dist/dev/ui/popover/popover-popup.js.map +1 -0
- package/dist/dev/ui/popover/popover-root.d.ts +29 -0
- package/dist/dev/ui/popover/popover-root.d.ts.map +1 -0
- package/dist/dev/ui/popover/popover-root.js +69 -0
- package/dist/dev/ui/popover/popover-root.js.map +1 -0
- package/dist/dev/ui/popover/popover-trigger.d.ts +15 -0
- package/dist/dev/ui/popover/popover-trigger.d.ts.map +1 -0
- package/dist/dev/ui/popover/popover-trigger.js +43 -0
- package/dist/dev/ui/popover/popover-trigger.js.map +1 -0
- package/dist/dev/ui/poster/poster.d.ts.map +1 -1
- package/dist/dev/ui/poster/poster.js +2 -1
- package/dist/dev/ui/poster/poster.js.map +1 -1
- package/dist/dev/ui/seek-button/seek-button.d.ts +1 -1
- package/dist/dev/ui/seek-button/seek-button.d.ts.map +1 -1
- package/dist/dev/ui/seek-button/seek-button.js +8 -38
- package/dist/dev/ui/seek-button/seek-button.js.map +1 -1
- package/dist/dev/ui/slider/context.js +22 -0
- package/dist/dev/ui/slider/context.js.map +1 -0
- package/dist/dev/ui/slider/index.d.ts +2 -0
- package/dist/dev/ui/slider/index.js +3 -0
- package/dist/dev/ui/slider/index.parts.d.ts +14 -0
- package/dist/dev/ui/slider/index.parts.d.ts.map +1 -0
- package/dist/dev/ui/slider/index.parts.js +21 -0
- package/dist/dev/ui/slider/index.parts.js.map +1 -0
- package/dist/dev/ui/slider/slider-buffer.d.ts +14 -0
- package/dist/dev/ui/slider/slider-buffer.d.ts.map +1 -0
- package/dist/dev/ui/slider/slider-buffer.js +16 -0
- package/dist/dev/ui/slider/slider-buffer.js.map +1 -0
- package/dist/dev/ui/slider/slider-fill.d.ts +14 -0
- package/dist/dev/ui/slider/slider-fill.d.ts.map +1 -0
- package/dist/dev/ui/slider/slider-fill.js +16 -0
- package/dist/dev/ui/slider/slider-fill.js.map +1 -0
- package/dist/dev/ui/slider/slider-root.d.ts +19 -0
- package/dist/dev/ui/slider/slider-root.d.ts.map +1 -0
- package/dist/dev/ui/slider/slider-root.js +71 -0
- package/dist/dev/ui/slider/slider-root.js.map +1 -0
- package/dist/dev/ui/slider/slider-thumb.d.ts +14 -0
- package/dist/dev/ui/slider/slider-thumb.d.ts.map +1 -0
- package/dist/dev/ui/slider/slider-thumb.js +32 -0
- package/dist/dev/ui/slider/slider-thumb.js.map +1 -0
- package/dist/dev/ui/slider/slider-track.d.ts +14 -0
- package/dist/dev/ui/slider/slider-track.d.ts.map +1 -0
- package/dist/dev/ui/slider/slider-track.js +16 -0
- package/dist/dev/ui/slider/slider-track.js.map +1 -0
- package/dist/dev/ui/slider/slider-value.d.ts +19 -0
- package/dist/dev/ui/slider/slider-value.d.ts.map +1 -0
- package/dist/dev/ui/slider/slider-value.js +32 -0
- package/dist/dev/ui/slider/slider-value.js.map +1 -0
- package/dist/dev/ui/thumbnail/thumbnail.d.ts +17 -0
- package/dist/dev/ui/thumbnail/thumbnail.d.ts.map +1 -0
- package/dist/dev/ui/thumbnail/thumbnail.js +87 -0
- package/dist/dev/ui/thumbnail/thumbnail.js.map +1 -0
- package/dist/dev/ui/time/time-value.d.ts.map +1 -1
- package/dist/dev/ui/time/time-value.js +2 -1
- package/dist/dev/ui/time/time-value.js.map +1 -1
- package/dist/dev/ui/time-slider/index.d.ts +2 -0
- package/dist/dev/ui/time-slider/index.js +3 -0
- package/dist/dev/ui/time-slider/index.parts.d.ts +15 -0
- package/dist/dev/ui/time-slider/index.parts.d.ts.map +1 -0
- package/dist/dev/ui/time-slider/index.parts.js +21 -0
- package/dist/dev/ui/time-slider/index.parts.js.map +1 -0
- package/dist/dev/ui/time-slider/time-slider-root.d.ts +17 -0
- package/dist/dev/ui/time-slider/time-slider-root.d.ts.map +1 -0
- package/dist/dev/ui/time-slider/time-slider-root.js +99 -0
- package/dist/dev/ui/time-slider/time-slider-root.js.map +1 -0
- package/dist/dev/ui/volume-slider/index.d.ts +2 -0
- package/dist/dev/ui/volume-slider/index.js +3 -0
- package/dist/dev/ui/volume-slider/index.parts.d.ts +14 -0
- package/dist/dev/ui/volume-slider/index.parts.d.ts.map +1 -0
- package/dist/dev/ui/volume-slider/index.parts.js +19 -0
- package/dist/dev/ui/volume-slider/index.parts.js.map +1 -0
- package/dist/dev/ui/volume-slider/volume-slider-root.d.ts +17 -0
- package/dist/dev/ui/volume-slider/volume-slider-root.d.ts.map +1 -0
- package/dist/dev/ui/volume-slider/volume-slider-root.js +89 -0
- package/dist/dev/ui/volume-slider/volume-slider-root.js.map +1 -0
- package/dist/dev/utils/use-force-render.js +13 -0
- package/dist/dev/utils/use-force-render.js.map +1 -0
- package/dist/dev/utils/use-latest-ref.js +20 -0
- package/dist/dev/utils/use-latest-ref.js.map +1 -0
- package/dist/dev/utils/use-safe-id.js +22 -0
- package/dist/dev/utils/use-safe-id.js.map +1 -0
- package/package.json +6 -5
- package/dist/default/index.js.map +0 -1
- package/dist/default/presets/audio/index.js.map +0 -1
- package/dist/default/presets/background/index.js.map +0 -1
- package/dist/default/presets/video/index.js.map +0 -1
- package/dist/dev/index.js.map +0 -1
- package/dist/dev/presets/audio/index.d.ts.map +0 -1
- package/dist/dev/presets/audio/index.js.map +0 -1
- package/dist/dev/presets/background/index.d.ts.map +0 -1
- package/dist/dev/presets/background/index.js.map +0 -1
- package/dist/dev/presets/video/index.d.ts.map +0 -1
- package/dist/dev/presets/video/index.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"popover-popup.js","names":[],"sources":["../../../../src/ui/popover/popover-popup.tsx"],"sourcesContent":["'use client';\n\nimport type { PopoverState } from '@videojs/core';\nimport { getAnchorPositionStyle, resolveOffsets } from '@videojs/core/dom';\nimport { supportsAnchorPositioning } from '@videojs/utils/dom';\nimport type { CSSProperties } from 'react';\nimport { forwardRef, useCallback, useLayoutEffect, useMemo, useRef, useState } from 'react';\n\nimport type { UIComponentProps } from '../../utils/types';\nimport { useComposedRefs } from '../../utils/use-composed-refs';\nimport { renderElement } from '../../utils/use-render';\nimport { usePopoverContext } from './context';\n\nexport interface PopoverPopupProps extends UIComponentProps<'div', PopoverState> {}\n\nconst POPOVER_RESET: CSSProperties = { position: 'fixed', inset: 'auto', margin: 0 };\n\n/** Container for the popover content. Positioned relative to the trigger using CSS anchor positioning with a JavaScript fallback. */\nexport const PopoverPopup = forwardRef<HTMLDivElement, PopoverPopupProps>(function PopoverPopup(\n { render, className, style, ...elementProps },\n forwardedRef\n) {\n const { core, popover, state, stateAttrMap, anchorName, popupId } = usePopoverContext();\n const internalRef = useRef<HTMLDivElement>(null);\n\n const popupRef = useCallback(\n (el: HTMLDivElement | null) => {\n popover.setPopupElement(el);\n },\n [popover]\n );\n\n const composedRef = useComposedRefs(forwardedRef, popupRef, internalRef);\n\n // --- Positioning ---\n\n const posOpts = useMemo(() => ({ side: state.side, align: state.align }), [state.side, state.align]);\n\n // CSS Anchor Positioning — computed from state, no measurement needed.\n // getAnchorPositionStyle returns camelCase keys, directly compatible\n // with React's style prop.\n const anchorStyle = useMemo(() => {\n if (!supportsAnchorPositioning()) return null;\n return getAnchorPositionStyle(anchorName, posOpts) as CSSProperties;\n }, [anchorName, posOpts]);\n\n // Manual fallback — measure rects after layout, before paint.\n const [manualStyle, setManualStyle] = useState<CSSProperties | null>(null);\n\n useLayoutEffect(() => {\n if (supportsAnchorPositioning()) return;\n if (!state.open) {\n setManualStyle(null);\n return;\n }\n\n function measure(): void {\n const triggerEl = popover.triggerElement;\n const popupEl = internalRef.current;\n if (!triggerEl || !popupEl) return;\n\n const triggerRect = triggerEl.getBoundingClientRect();\n const popupRect = popupEl.getBoundingClientRect();\n const boundaryRect = document.documentElement.getBoundingClientRect();\n const offsets = resolveOffsets(popupEl);\n\n setManualStyle(\n getAnchorPositionStyle(anchorName, posOpts, triggerRect, popupRect, boundaryRect, offsets) as CSSProperties\n );\n }\n\n measure();\n\n // Recompute on scroll/resize so the popover tracks its trigger.\n let rafId = 0;\n function reposition(): void {\n cancelAnimationFrame(rafId);\n rafId = requestAnimationFrame(measure);\n }\n\n window.addEventListener('scroll', reposition, { capture: true, passive: true });\n window.addEventListener('resize', reposition);\n\n return () => {\n cancelAnimationFrame(rafId);\n window.removeEventListener('scroll', reposition, true);\n window.removeEventListener('resize', reposition);\n };\n }, [state.open, anchorName, posOpts, popover]);\n\n // Anchor path uses computed styles; manual path uses measured styles;\n // fallback resets UA [popover] defaults until positioning is computed.\n const positioningStyle = anchorStyle ?? manualStyle ?? POPOVER_RESET;\n\n // --- Visibility ---\n\n if (!state.open) {\n return null;\n }\n\n // Remap DOM focus events to React synthetic event names.\n const { onFocusOut, ...restPopupProps } = popover.popupProps;\n\n return renderElement(\n 'div',\n { render, className, style },\n {\n state,\n stateAttrMap,\n ref: composedRef,\n props: [\n {\n id: popupId,\n style: positioningStyle,\n ...core.getPopupAttrs(state),\n },\n { ...restPopupProps, onBlur: onFocusOut },\n elementProps,\n ],\n }\n );\n});\n\nexport namespace PopoverPopup {\n export type Props = PopoverPopupProps;\n export type State = PopoverState;\n}\n"],"mappings":";;;;;;;;;;AAeA,MAAM,gBAA+B;CAAE,UAAU;CAAS,OAAO;CAAQ,QAAQ;CAAG;;AAGpF,MAAa,eAAe,WAA8C,SAAS,aACjF,EAAE,QAAQ,WAAW,OAAO,GAAG,gBAC/B,cACA;CACA,MAAM,EAAE,MAAM,SAAS,OAAO,cAAc,YAAY,YAAY,mBAAmB;CACvF,MAAM,cAAc,OAAuB,KAAK;CAShD,MAAM,cAAc,gBAAgB,cAPnB,aACd,OAA8B;AAC7B,UAAQ,gBAAgB,GAAG;IAE7B,CAAC,QAAQ,CACV,EAE2D,YAAY;CAIxE,MAAM,UAAU,eAAe;EAAE,MAAM,MAAM;EAAM,OAAO,MAAM;EAAO,GAAG,CAAC,MAAM,MAAM,MAAM,MAAM,CAAC;CAKpG,MAAM,cAAc,cAAc;AAChC,MAAI,CAAC,2BAA2B,CAAE,QAAO;AACzC,SAAO,uBAAuB,YAAY,QAAQ;IACjD,CAAC,YAAY,QAAQ,CAAC;CAGzB,MAAM,CAAC,aAAa,kBAAkB,SAA+B,KAAK;AAE1E,uBAAsB;AACpB,MAAI,2BAA2B,CAAE;AACjC,MAAI,CAAC,MAAM,MAAM;AACf,kBAAe,KAAK;AACpB;;EAGF,SAAS,UAAgB;GACvB,MAAM,YAAY,QAAQ;GAC1B,MAAM,UAAU,YAAY;AAC5B,OAAI,CAAC,aAAa,CAAC,QAAS;AAO5B,kBACE,uBAAuB,YAAY,SANjB,UAAU,uBAAuB,EACnC,QAAQ,uBAAuB,EAC5B,SAAS,gBAAgB,uBAAuB,EACrD,eAAe,QAAQ,CAGqD,CAC3F;;AAGH,WAAS;EAGT,IAAI,QAAQ;EACZ,SAAS,aAAmB;AAC1B,wBAAqB,MAAM;AAC3B,WAAQ,sBAAsB,QAAQ;;AAGxC,SAAO,iBAAiB,UAAU,YAAY;GAAE,SAAS;GAAM,SAAS;GAAM,CAAC;AAC/E,SAAO,iBAAiB,UAAU,WAAW;AAE7C,eAAa;AACX,wBAAqB,MAAM;AAC3B,UAAO,oBAAoB,UAAU,YAAY,KAAK;AACtD,UAAO,oBAAoB,UAAU,WAAW;;IAEjD;EAAC,MAAM;EAAM;EAAY;EAAS;EAAQ,CAAC;CAI9C,MAAM,mBAAmB,eAAe,eAAe;AAIvD,KAAI,CAAC,MAAM,KACT,QAAO;CAIT,MAAM,EAAE,YAAY,GAAG,mBAAmB,QAAQ;AAElD,QAAO,cACL,OACA;EAAE;EAAQ;EAAW;EAAO,EAC5B;EACE;EACA;EACA,KAAK;EACL,OAAO;GACL;IACE,IAAI;IACJ,OAAO;IACP,GAAG,KAAK,cAAc,MAAM;IAC7B;GACD;IAAE,GAAG;IAAgB,QAAQ;IAAY;GACzC;GACD;EACF,CACF;EACD"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useLatestRef } from "../../utils/use-latest-ref.js";
|
|
4
|
+
import { PopoverContextProvider } from "./context.js";
|
|
5
|
+
import { useSafeId } from "../../utils/use-safe-id.js";
|
|
6
|
+
import { createPopover, createTransition } from "@videojs/core/dom";
|
|
7
|
+
import { useSnapshot } from "@videojs/store/react";
|
|
8
|
+
import { useEffect, useState } from "react";
|
|
9
|
+
import { jsx } from "react/jsx-runtime";
|
|
10
|
+
import { PopoverCore, PopoverDataAttrs } from "@videojs/core";
|
|
11
|
+
|
|
12
|
+
//#region src/ui/popover/popover-root.tsx
|
|
13
|
+
function PopoverRoot({ open: controlledOpen, defaultOpen = PopoverCore.defaultProps.defaultOpen, onOpenChange: onOpenChangeProp, onOpenChangeComplete: onOpenChangeCompleteProp, openOnHover = PopoverCore.defaultProps.openOnHover, delay = PopoverCore.defaultProps.delay, closeDelay = PopoverCore.defaultProps.closeDelay, children, ...coreProps }) {
|
|
14
|
+
const [core] = useState(() => new PopoverCore(coreProps));
|
|
15
|
+
core.setProps(coreProps);
|
|
16
|
+
const isControlled = controlledOpen !== void 0;
|
|
17
|
+
const onOpenChangeRef = useLatestRef(onOpenChangeProp);
|
|
18
|
+
const onOpenChangeCompleteRef = useLatestRef(onOpenChangeCompleteProp);
|
|
19
|
+
const closeOnEscapeRef = useLatestRef(coreProps.closeOnEscape);
|
|
20
|
+
const closeOnOutsideClickRef = useLatestRef(coreProps.closeOnOutsideClick);
|
|
21
|
+
const openOnHoverRef = useLatestRef(openOnHover);
|
|
22
|
+
const delayRef = useLatestRef(delay);
|
|
23
|
+
const closeDelayRef = useLatestRef(closeDelay);
|
|
24
|
+
const [popover] = useState(() => {
|
|
25
|
+
const instance = createPopover({
|
|
26
|
+
transition: createTransition(),
|
|
27
|
+
onOpenChange: (nextOpen, details) => {
|
|
28
|
+
onOpenChangeRef.current?.(nextOpen, details);
|
|
29
|
+
},
|
|
30
|
+
onOpenChangeComplete: (nextOpen) => {
|
|
31
|
+
onOpenChangeCompleteRef.current?.(nextOpen);
|
|
32
|
+
},
|
|
33
|
+
closeOnEscape: () => closeOnEscapeRef.current ?? PopoverCore.defaultProps.closeOnEscape,
|
|
34
|
+
closeOnOutsideClick: () => closeOnOutsideClickRef.current ?? PopoverCore.defaultProps.closeOnOutsideClick,
|
|
35
|
+
openOnHover: () => openOnHoverRef.current,
|
|
36
|
+
delay: () => delayRef.current,
|
|
37
|
+
closeDelay: () => closeDelayRef.current
|
|
38
|
+
});
|
|
39
|
+
if (!isControlled && defaultOpen) instance.open("click");
|
|
40
|
+
return instance;
|
|
41
|
+
});
|
|
42
|
+
const anchorName = useSafeId();
|
|
43
|
+
const popupId = useSafeId("popup-");
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
if (controlledOpen === void 0) return;
|
|
46
|
+
const { active: inputOpen } = popover.input.current;
|
|
47
|
+
if (controlledOpen === inputOpen) return;
|
|
48
|
+
if (controlledOpen) popover.open("click");
|
|
49
|
+
else popover.close("click");
|
|
50
|
+
}, [controlledOpen, popover]);
|
|
51
|
+
useEffect(() => () => popover.destroy(), [popover]);
|
|
52
|
+
const input = useSnapshot(popover.input);
|
|
53
|
+
core.setInput(input);
|
|
54
|
+
return /* @__PURE__ */ jsx(PopoverContextProvider, {
|
|
55
|
+
value: {
|
|
56
|
+
core,
|
|
57
|
+
popover,
|
|
58
|
+
state: core.getState(),
|
|
59
|
+
stateAttrMap: PopoverDataAttrs,
|
|
60
|
+
anchorName,
|
|
61
|
+
popupId
|
|
62
|
+
},
|
|
63
|
+
children
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
//#endregion
|
|
68
|
+
export { PopoverRoot };
|
|
69
|
+
//# sourceMappingURL=popover-root.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"popover-root.js","names":[],"sources":["../../../../src/ui/popover/popover-root.tsx"],"sourcesContent":["'use client';\n\nimport { type PopoverProps as CorePopoverProps, PopoverCore, PopoverDataAttrs } from '@videojs/core';\nimport { createPopover, createTransition, type PopoverChangeDetails } from '@videojs/core/dom';\nimport { useSnapshot } from '@videojs/store/react';\nimport type { ReactNode } from 'react';\nimport { useEffect, useState } from 'react';\n\nimport { useLatestRef } from '../../utils/use-latest-ref';\nimport { useSafeId } from '../../utils/use-safe-id';\nimport { PopoverContextProvider } from './context';\n\nexport interface PopoverRootProps extends CorePopoverProps {\n /** Called when the popover open state changes (fires immediately, before animations). */\n onOpenChange?: (open: boolean, details: PopoverChangeDetails) => void;\n /** Called after open/close animations complete. */\n onOpenChangeComplete?: (open: boolean) => void;\n children?: ReactNode;\n}\n\nexport function PopoverRoot({\n open: controlledOpen,\n defaultOpen = PopoverCore.defaultProps.defaultOpen,\n onOpenChange: onOpenChangeProp,\n onOpenChangeComplete: onOpenChangeCompleteProp,\n openOnHover = PopoverCore.defaultProps.openOnHover,\n delay = PopoverCore.defaultProps.delay,\n closeDelay = PopoverCore.defaultProps.closeDelay,\n children,\n ...coreProps\n}: PopoverRootProps): ReactNode {\n const [core] = useState(() => new PopoverCore(coreProps));\n core.setProps(coreProps);\n\n const isControlled = controlledOpen !== undefined;\n\n // Keep refs that always point to the latest values so the\n // createPopover closure never reads stale props.\n const onOpenChangeRef = useLatestRef(onOpenChangeProp);\n const onOpenChangeCompleteRef = useLatestRef(onOpenChangeCompleteProp);\n const closeOnEscapeRef = useLatestRef(coreProps.closeOnEscape);\n const closeOnOutsideClickRef = useLatestRef(coreProps.closeOnOutsideClick);\n const openOnHoverRef = useLatestRef(openOnHover);\n const delayRef = useLatestRef(delay);\n const closeDelayRef = useLatestRef(closeDelay);\n\n const [popover] = useState(() => {\n const instance = createPopover({\n transition: createTransition(),\n onOpenChange: (nextOpen: boolean, details: PopoverChangeDetails) => {\n onOpenChangeRef.current?.(nextOpen, details);\n },\n onOpenChangeComplete: (nextOpen: boolean) => {\n onOpenChangeCompleteRef.current?.(nextOpen);\n },\n closeOnEscape: () => closeOnEscapeRef.current ?? PopoverCore.defaultProps.closeOnEscape,\n closeOnOutsideClick: () => closeOnOutsideClickRef.current ?? PopoverCore.defaultProps.closeOnOutsideClick,\n openOnHover: () => openOnHoverRef.current,\n delay: () => delayRef.current,\n closeDelay: () => closeDelayRef.current,\n });\n\n // Apply defaultOpen on creation (uncontrolled only)\n if (!isControlled && defaultOpen) {\n instance.open('click');\n }\n\n return instance;\n });\n\n const anchorName = useSafeId();\n const popupId = useSafeId('popup-');\n\n // Sync controlled open prop -> internal input state.\n useEffect(() => {\n if (controlledOpen === undefined) return;\n\n const { active: inputOpen } = popover.input.current;\n if (controlledOpen === inputOpen) return;\n\n if (controlledOpen) {\n popover.open('click');\n } else {\n popover.close('click');\n }\n }, [controlledOpen, popover]);\n\n // Cleanup on unmount\n useEffect(() => () => popover.destroy(), [popover]);\n\n const input = useSnapshot(popover.input);\n core.setInput(input);\n const state = core.getState();\n\n return (\n <PopoverContextProvider value={{ core, popover, state, stateAttrMap: PopoverDataAttrs, anchorName, popupId }}>\n {children}\n </PopoverContextProvider>\n );\n}\n\nexport namespace PopoverRoot {\n export type Props = PopoverRootProps;\n}\n"],"mappings":";;;;;;;;;;;;AAoBA,SAAgB,YAAY,EAC1B,MAAM,gBACN,cAAc,YAAY,aAAa,aACvC,cAAc,kBACd,sBAAsB,0BACtB,cAAc,YAAY,aAAa,aACvC,QAAQ,YAAY,aAAa,OACjC,aAAa,YAAY,aAAa,YACtC,UACA,GAAG,aAC2B;CAC9B,MAAM,CAAC,QAAQ,eAAe,IAAI,YAAY,UAAU,CAAC;AACzD,MAAK,SAAS,UAAU;CAExB,MAAM,eAAe,mBAAmB;CAIxC,MAAM,kBAAkB,aAAa,iBAAiB;CACtD,MAAM,0BAA0B,aAAa,yBAAyB;CACtE,MAAM,mBAAmB,aAAa,UAAU,cAAc;CAC9D,MAAM,yBAAyB,aAAa,UAAU,oBAAoB;CAC1E,MAAM,iBAAiB,aAAa,YAAY;CAChD,MAAM,WAAW,aAAa,MAAM;CACpC,MAAM,gBAAgB,aAAa,WAAW;CAE9C,MAAM,CAAC,WAAW,eAAe;EAC/B,MAAM,WAAW,cAAc;GAC7B,YAAY,kBAAkB;GAC9B,eAAe,UAAmB,YAAkC;AAClE,oBAAgB,UAAU,UAAU,QAAQ;;GAE9C,uBAAuB,aAAsB;AAC3C,4BAAwB,UAAU,SAAS;;GAE7C,qBAAqB,iBAAiB,WAAW,YAAY,aAAa;GAC1E,2BAA2B,uBAAuB,WAAW,YAAY,aAAa;GACtF,mBAAmB,eAAe;GAClC,aAAa,SAAS;GACtB,kBAAkB,cAAc;GACjC,CAAC;AAGF,MAAI,CAAC,gBAAgB,YACnB,UAAS,KAAK,QAAQ;AAGxB,SAAO;GACP;CAEF,MAAM,aAAa,WAAW;CAC9B,MAAM,UAAU,UAAU,SAAS;AAGnC,iBAAgB;AACd,MAAI,mBAAmB,OAAW;EAElC,MAAM,EAAE,QAAQ,cAAc,QAAQ,MAAM;AAC5C,MAAI,mBAAmB,UAAW;AAElC,MAAI,eACF,SAAQ,KAAK,QAAQ;MAErB,SAAQ,MAAM,QAAQ;IAEvB,CAAC,gBAAgB,QAAQ,CAAC;AAG7B,uBAAsB,QAAQ,SAAS,EAAE,CAAC,QAAQ,CAAC;CAEnD,MAAM,QAAQ,YAAY,QAAQ,MAAM;AACxC,MAAK,SAAS,MAAM;AAGpB,QACE,oBAAC;EAAuB,OAAO;GAAE;GAAM;GAAS,OAHpC,KAAK,UAAU;GAG4B,cAAc;GAAkB;GAAY;GAAS;EACzG;GACsB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { renderElement } from "../../utils/use-render.js";
|
|
4
|
+
import { usePopoverContext } from "./context.js";
|
|
5
|
+
import { getAnchorNameStyle } from "@videojs/core/dom";
|
|
6
|
+
import { forwardRef, useCallback, useMemo } from "react";
|
|
7
|
+
|
|
8
|
+
//#region src/ui/popover/popover-trigger.tsx
|
|
9
|
+
/** Button that toggles the popover visibility. Renders a `<button>` element. */
|
|
10
|
+
const PopoverTrigger = forwardRef(function PopoverTrigger({ render, className, style, ...elementProps }, forwardedRef) {
|
|
11
|
+
const { core, popover, state, stateAttrMap, anchorName, popupId } = usePopoverContext();
|
|
12
|
+
const triggerRef = useCallback((el) => {
|
|
13
|
+
popover.setTriggerElement(el);
|
|
14
|
+
}, [popover]);
|
|
15
|
+
const anchorStyle = useMemo(() => getAnchorNameStyle(anchorName), [anchorName]);
|
|
16
|
+
const { onFocusIn, onFocusOut, ...restTriggerProps } = popover.triggerProps;
|
|
17
|
+
return renderElement("button", {
|
|
18
|
+
render,
|
|
19
|
+
className,
|
|
20
|
+
style
|
|
21
|
+
}, {
|
|
22
|
+
state,
|
|
23
|
+
stateAttrMap,
|
|
24
|
+
ref: [forwardedRef, triggerRef],
|
|
25
|
+
props: [
|
|
26
|
+
{
|
|
27
|
+
type: "button",
|
|
28
|
+
style: anchorStyle,
|
|
29
|
+
...core.getTriggerAttrs(state, popupId)
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
...restTriggerProps,
|
|
33
|
+
onFocus: onFocusIn,
|
|
34
|
+
onBlur: onFocusOut
|
|
35
|
+
},
|
|
36
|
+
elementProps
|
|
37
|
+
]
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
//#endregion
|
|
42
|
+
export { PopoverTrigger };
|
|
43
|
+
//# sourceMappingURL=popover-trigger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"popover-trigger.js","names":[],"sources":["../../../../src/ui/popover/popover-trigger.tsx"],"sourcesContent":["'use client';\n\nimport type { PopoverState } from '@videojs/core';\nimport { getAnchorNameStyle } from '@videojs/core/dom';\nimport { forwardRef, useCallback, useMemo } from 'react';\n\nimport type { UIComponentProps } from '../../utils/types';\nimport { renderElement } from '../../utils/use-render';\nimport { usePopoverContext } from './context';\n\nexport interface PopoverTriggerProps extends UIComponentProps<'button', PopoverState> {}\n\n/** Button that toggles the popover visibility. Renders a `<button>` element. */\nexport const PopoverTrigger = forwardRef<HTMLButtonElement, PopoverTriggerProps>(function PopoverTrigger(\n { render, className, style, ...elementProps },\n forwardedRef\n) {\n const { core, popover, state, stateAttrMap, anchorName, popupId } = usePopoverContext();\n\n const triggerRef = useCallback(\n (el: HTMLButtonElement | null) => {\n popover.setTriggerElement(el);\n },\n [popover]\n );\n\n const anchorStyle = useMemo(() => getAnchorNameStyle(anchorName), [anchorName]);\n\n // Remap DOM focus events to React synthetic event names.\n // createPopover() uses onFocusIn/onFocusOut (matching DOM focusin/focusout),\n // but React maps those to onFocus/onBlur.\n const { onFocusIn, onFocusOut, ...restTriggerProps } = popover.triggerProps;\n\n return renderElement(\n 'button',\n { render, className, style },\n {\n state,\n stateAttrMap,\n ref: [forwardedRef, triggerRef],\n props: [\n {\n type: 'button' as const,\n style: anchorStyle,\n ...core.getTriggerAttrs(state, popupId),\n },\n { ...restTriggerProps, onFocus: onFocusIn, onBlur: onFocusOut },\n elementProps,\n ],\n }\n );\n});\n\nexport namespace PopoverTrigger {\n export type Props = PopoverTriggerProps;\n export type State = PopoverState;\n}\n"],"mappings":";;;;;;;;;AAaA,MAAa,iBAAiB,WAAmD,SAAS,eACxF,EAAE,QAAQ,WAAW,OAAO,GAAG,gBAC/B,cACA;CACA,MAAM,EAAE,MAAM,SAAS,OAAO,cAAc,YAAY,YAAY,mBAAmB;CAEvF,MAAM,aAAa,aAChB,OAAiC;AAChC,UAAQ,kBAAkB,GAAG;IAE/B,CAAC,QAAQ,CACV;CAED,MAAM,cAAc,cAAc,mBAAmB,WAAW,EAAE,CAAC,WAAW,CAAC;CAK/E,MAAM,EAAE,WAAW,YAAY,GAAG,qBAAqB,QAAQ;AAE/D,QAAO,cACL,UACA;EAAE;EAAQ;EAAW;EAAO,EAC5B;EACE;EACA;EACA,KAAK,CAAC,cAAc,WAAW;EAC/B,OAAO;GACL;IACE,MAAM;IACN,OAAO;IACP,GAAG,KAAK,gBAAgB,OAAO,QAAQ;IACxC;GACD;IAAE,GAAG;IAAkB,SAAS;IAAW,QAAQ;IAAY;GAC/D;GACD;EACF,CACF;EACD"}
|
|
@@ -26,12 +26,13 @@ const Poster = forwardRef(function Poster(componentProps, forwardedRef) {
|
|
|
26
26
|
const playback = usePlayer(selectPlayback);
|
|
27
27
|
const [core] = useState(() => new PosterCore());
|
|
28
28
|
if (!playback) return null;
|
|
29
|
+
core.setMedia(playback);
|
|
29
30
|
return renderElement("img", {
|
|
30
31
|
render,
|
|
31
32
|
className,
|
|
32
33
|
style
|
|
33
34
|
}, {
|
|
34
|
-
state: core.getState(
|
|
35
|
+
state: core.getState(),
|
|
35
36
|
stateAttrMap: PosterDataAttrs,
|
|
36
37
|
ref: [forwardedRef],
|
|
37
38
|
props: [elementProps]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poster.js","names":[],"sources":["../../../../src/ui/poster/poster.tsx"],"sourcesContent":["'use client';\n\nimport { PosterCore, PosterDataAttrs } from '@videojs/core';\nimport { logMissingFeature, selectPlayback } from '@videojs/core/dom';\nimport type { ForwardedRef } from 'react';\nimport { forwardRef, useState } from 'react';\n\nimport { usePlayer } from '../../player/context';\nimport type { UIComponentProps } from '../../utils/types';\nimport { renderElement } from '../../utils/use-render';\n\nexport interface PosterProps extends UIComponentProps<'img', PosterCore.State> {}\n\n/**\n * Displays the video poster image. Shows before playback starts, hides after.\n *\n * @example\n * ```tsx\n * <Poster src=\"poster.jpg\" alt=\"Video description\" />\n *\n * <Poster\n * src=\"poster.jpg\"\n * alt=\"Video description\"\n * className={(state) => state.visible ? 'visible' : 'hidden'}\n * />\n * ```\n */\nexport const Poster = forwardRef(function Poster(\n componentProps: PosterProps,\n forwardedRef: ForwardedRef<HTMLImageElement>\n) {\n const { render, className, style, ...elementProps } = componentProps;\n\n const playback = usePlayer(selectPlayback);\n\n const [core] = useState(() => new PosterCore());\n\n if (!playback) {\n if (__DEV__) logMissingFeature('Poster', 'playback');\n return null;\n }\n\n return renderElement(\n 'img',\n { render, className, style },\n {\n state: core.getState(
|
|
1
|
+
{"version":3,"file":"poster.js","names":[],"sources":["../../../../src/ui/poster/poster.tsx"],"sourcesContent":["'use client';\n\nimport { PosterCore, PosterDataAttrs } from '@videojs/core';\nimport { logMissingFeature, selectPlayback } from '@videojs/core/dom';\nimport type { ForwardedRef } from 'react';\nimport { forwardRef, useState } from 'react';\n\nimport { usePlayer } from '../../player/context';\nimport type { UIComponentProps } from '../../utils/types';\nimport { renderElement } from '../../utils/use-render';\n\nexport interface PosterProps extends UIComponentProps<'img', PosterCore.State> {}\n\n/**\n * Displays the video poster image. Shows before playback starts, hides after.\n *\n * @example\n * ```tsx\n * <Poster src=\"poster.jpg\" alt=\"Video description\" />\n *\n * <Poster\n * src=\"poster.jpg\"\n * alt=\"Video description\"\n * className={(state) => state.visible ? 'visible' : 'hidden'}\n * />\n * ```\n */\nexport const Poster = forwardRef(function Poster(\n componentProps: PosterProps,\n forwardedRef: ForwardedRef<HTMLImageElement>\n) {\n const { render, className, style, ...elementProps } = componentProps;\n\n const playback = usePlayer(selectPlayback);\n\n const [core] = useState(() => new PosterCore());\n\n if (!playback) {\n if (__DEV__) logMissingFeature('Poster', 'playback');\n return null;\n }\n\n core.setMedia(playback);\n\n return renderElement(\n 'img',\n { render, className, style },\n {\n state: core.getState(),\n stateAttrMap: PosterDataAttrs,\n ref: [forwardedRef],\n props: [elementProps],\n }\n );\n});\n\nexport namespace Poster {\n export type Props = PosterProps;\n export type State = PosterCore.State;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AA2BA,MAAa,SAAS,WAAW,SAAS,OACxC,gBACA,cACA;CACA,MAAM,EAAE,QAAQ,WAAW,OAAO,GAAG,iBAAiB;CAEtD,MAAM,WAAW,UAAU,eAAe;CAE1C,MAAM,CAAC,QAAQ,eAAe,IAAI,YAAY,CAAC;AAE/C,KAAI,CAAC,SAEH,QAAO;AAGT,MAAK,SAAS,SAAS;AAEvB,QAAO,cACL,OACA;EAAE;EAAQ;EAAW;EAAO,EAC5B;EACE,OAAO,KAAK,UAAU;EACtB,cAAc;EACd,KAAK,CAAC,aAAa;EACnB,OAAO,CAAC,aAAa;EACtB,CACF;EACD"}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
|
|
3
|
-
import {
|
|
4
|
-
import { renderElement } from "../../utils/use-render.js";
|
|
5
|
-
import { useButton } from "../hooks/use-button.js";
|
|
3
|
+
import { createMediaButton } from "../create-media-button.js";
|
|
6
4
|
import { selectTime } from "@videojs/core/dom";
|
|
7
|
-
import { forwardRef, useState } from "react";
|
|
8
5
|
import { SeekButtonCore, SeekButtonDataAttrs } from "@videojs/core";
|
|
9
6
|
|
|
10
7
|
//#region src/ui/seek-button/seek-button.tsx
|
|
@@ -25,36 +22,12 @@ import { SeekButtonCore, SeekButtonDataAttrs } from "@videojs/core";
|
|
|
25
22
|
* />
|
|
26
23
|
* ```
|
|
27
24
|
*/
|
|
28
|
-
const SeekButton =
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
label,
|
|
35
|
-
disabled
|
|
36
|
-
});
|
|
37
|
-
const { getButtonProps, buttonRef } = useButton({
|
|
38
|
-
displayName: "SeekButton",
|
|
39
|
-
onActivate: () => core.seek(time),
|
|
40
|
-
isDisabled: () => disabled || !time
|
|
41
|
-
});
|
|
42
|
-
if (!time) return null;
|
|
43
|
-
const state = core.getState(time);
|
|
44
|
-
return renderElement("button", {
|
|
45
|
-
render,
|
|
46
|
-
className,
|
|
47
|
-
style
|
|
48
|
-
}, {
|
|
49
|
-
state,
|
|
50
|
-
stateAttrMap: SeekButtonDataAttrs,
|
|
51
|
-
ref: [forwardedRef, buttonRef],
|
|
52
|
-
props: [
|
|
53
|
-
core.getAttrs(state),
|
|
54
|
-
elementProps,
|
|
55
|
-
getButtonProps()
|
|
56
|
-
]
|
|
57
|
-
});
|
|
25
|
+
const SeekButton = createMediaButton({
|
|
26
|
+
displayName: "SeekButton",
|
|
27
|
+
core: SeekButtonCore,
|
|
28
|
+
stateAttrMap: SeekButtonDataAttrs,
|
|
29
|
+
selector: selectTime,
|
|
30
|
+
action: (core, state) => core.seek(state)
|
|
58
31
|
});
|
|
59
32
|
|
|
60
33
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"seek-button.js","names":[],"sources":["../../../../src/ui/seek-button/seek-button.tsx"],"sourcesContent":["'use client';\n\nimport { SeekButtonCore, SeekButtonDataAttrs } from '@videojs/core';\nimport {
|
|
1
|
+
{"version":3,"file":"seek-button.js","names":[],"sources":["../../../../src/ui/seek-button/seek-button.tsx"],"sourcesContent":["'use client';\n\nimport { SeekButtonCore, SeekButtonDataAttrs } from '@videojs/core';\nimport { selectTime } from '@videojs/core/dom';\n\nimport type { UIComponentProps } from '../../utils/types';\nimport { createMediaButton } from '../create-media-button';\n\nexport interface SeekButtonProps extends UIComponentProps<'button', SeekButtonCore.State>, SeekButtonCore.Props {}\n\n/**\n * A button that seeks forward or backward by a configurable number of seconds.\n *\n * @example\n * ```tsx\n * <SeekButton seconds={-10} />\n *\n * <SeekButton\n * seconds={30}\n * render={(props, state) => (\n * <button {...props}>\n * {state.direction === 'backward' ? <RewindIcon /> : <FastForwardIcon />}\n * </button>\n * )}\n * />\n * ```\n */\nexport const SeekButton = createMediaButton<SeekButtonCore, SeekButtonProps>({\n displayName: 'SeekButton',\n core: SeekButtonCore,\n stateAttrMap: SeekButtonDataAttrs,\n selector: selectTime,\n action: (core, state) => core.seek(state),\n});\n\nexport namespace SeekButton {\n export type Props = SeekButtonProps;\n export type State = SeekButtonCore.State;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA2BA,MAAa,aAAa,kBAAmD;CAC3E,aAAa;CACb,MAAM;CACN,cAAc;CACd,UAAU;CACV,SAAS,MAAM,UAAU,KAAK,KAAK,MAAM;CAC1C,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { createContext, useContext } from "react";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
|
|
6
|
+
//#region src/ui/slider/context.tsx
|
|
7
|
+
const SliderContext = createContext(null);
|
|
8
|
+
function SliderProvider({ value, children }) {
|
|
9
|
+
return /* @__PURE__ */ jsx(SliderContext.Provider, {
|
|
10
|
+
value,
|
|
11
|
+
children
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
function useSliderContext() {
|
|
15
|
+
const ctx = useContext(SliderContext);
|
|
16
|
+
if (!ctx) throw new Error("Slider compound components must be used within a Slider.Root");
|
|
17
|
+
return ctx;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
//#endregion
|
|
21
|
+
export { SliderProvider, useSliderContext };
|
|
22
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","names":[],"sources":["../../../../src/ui/slider/context.tsx"],"sourcesContent":["'use client';\n\nimport type { SliderState, StateAttrMap } from '@videojs/core';\nimport type { SliderThumbProps } from '@videojs/core/dom';\nimport type { RefCallback } from 'react';\nimport { createContext, useContext } from 'react';\n\nexport interface SliderContextValue {\n state: SliderState;\n /** Pointer position converted to the value domain (not 0–100 percent). */\n pointerValue: number;\n thumbRef: RefCallback<HTMLElement>;\n thumbProps: SliderThumbProps;\n stateAttrMap: StateAttrMap<SliderState>;\n getAttrs: (state: SliderState) => object;\n formatValue?: ((value: number, type: 'current' | 'pointer') => string) | undefined;\n}\n\nconst SliderContext = createContext<SliderContextValue | null>(null);\n\nexport function SliderProvider({ value, children }: { value: SliderContextValue; children: React.ReactNode }) {\n return <SliderContext.Provider value={value}>{children}</SliderContext.Provider>;\n}\n\nexport function useSliderContext(): SliderContextValue {\n const ctx = useContext(SliderContext);\n if (!ctx) throw new Error('Slider compound components must be used within a Slider.Root');\n return ctx;\n}\n"],"mappings":";;;;;;AAkBA,MAAM,gBAAgB,cAAyC,KAAK;AAEpE,SAAgB,eAAe,EAAE,OAAO,YAAsE;AAC5G,QAAO,oBAAC,cAAc;EAAgB;EAAQ;GAAkC;;AAGlF,SAAgB,mBAAuC;CACrD,MAAM,MAAM,WAAW,cAAc;AACrC,KAAI,CAAC,IAAK,OAAM,IAAI,MAAM,+DAA+D;AACzF,QAAO"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { __exportAll } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { SliderBuffer } from "./slider-buffer.js";
|
|
3
|
+
import { SliderFill } from "./slider-fill.js";
|
|
4
|
+
import { SliderRoot } from "./slider-root.js";
|
|
5
|
+
import { SliderThumb } from "./slider-thumb.js";
|
|
6
|
+
import { SliderTrack } from "./slider-track.js";
|
|
7
|
+
import { SliderValue } from "./slider-value.js";
|
|
8
|
+
|
|
9
|
+
//#region src/ui/slider/index.parts.ts
|
|
10
|
+
var index_parts_exports = /* @__PURE__ */ __exportAll({
|
|
11
|
+
Buffer: () => SliderBuffer,
|
|
12
|
+
Fill: () => SliderFill,
|
|
13
|
+
Root: () => SliderRoot,
|
|
14
|
+
Thumb: () => SliderThumb,
|
|
15
|
+
Track: () => SliderTrack,
|
|
16
|
+
Value: () => SliderValue
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
//#endregion
|
|
20
|
+
export { index_parts_exports };
|
|
21
|
+
//# sourceMappingURL=index.parts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.parts.js","names":[],"sources":["../../../../src/ui/slider/index.parts.ts"],"sourcesContent":["export { SliderBuffer as Buffer, type SliderBufferProps as BufferProps } from './slider-buffer';\nexport { SliderFill as Fill, type SliderFillProps as FillProps } from './slider-fill';\nexport { SliderRoot as Root, type SliderRootProps as RootProps } from './slider-root';\nexport { SliderThumb as Thumb, type SliderThumbProps as ThumbProps } from './slider-thumb';\nexport { SliderTrack as Track, type SliderTrackProps as TrackProps } from './slider-track';\nexport { SliderValue as Value, type SliderValueProps as ValueProps } from './slider-value';\n"],"mappings":""}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { createContextPart } from "../create-context-part.js";
|
|
4
|
+
import { useSliderContext } from "./context.js";
|
|
5
|
+
|
|
6
|
+
//#region src/ui/slider/slider-buffer.tsx
|
|
7
|
+
/** Displays the buffered range on the slider track. */
|
|
8
|
+
const SliderBuffer = createContextPart({
|
|
9
|
+
displayName: "SliderBuffer",
|
|
10
|
+
tag: "div",
|
|
11
|
+
useContext: useSliderContext
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
//#endregion
|
|
15
|
+
export { SliderBuffer };
|
|
16
|
+
//# sourceMappingURL=slider-buffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slider-buffer.js","names":[],"sources":["../../../../src/ui/slider/slider-buffer.tsx"],"sourcesContent":["'use client';\n\nimport type { SliderState } from '@videojs/core';\n\nimport type { UIComponentProps } from '../../utils/types';\nimport { createContextPart } from '../create-context-part';\nimport { useSliderContext } from './context';\n\nexport interface SliderBufferProps extends UIComponentProps<'div', SliderState> {}\n\n/** Displays the buffered range on the slider track. */\nexport const SliderBuffer = createContextPart<SliderBufferProps, SliderState>({\n displayName: 'SliderBuffer',\n tag: 'div',\n useContext: useSliderContext,\n});\n\nexport namespace SliderBuffer {\n export type Props = SliderBufferProps;\n}\n"],"mappings":";;;;;;;AAWA,MAAa,eAAe,kBAAkD;CAC5E,aAAa;CACb,KAAK;CACL,YAAY;CACb,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { createContextPart } from "../create-context-part.js";
|
|
4
|
+
import { useSliderContext } from "./context.js";
|
|
5
|
+
|
|
6
|
+
//#region src/ui/slider/slider-fill.tsx
|
|
7
|
+
/** Displays the filled portion from start to the current value. */
|
|
8
|
+
const SliderFill = createContextPart({
|
|
9
|
+
displayName: "SliderFill",
|
|
10
|
+
tag: "div",
|
|
11
|
+
useContext: useSliderContext
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
//#endregion
|
|
15
|
+
export { SliderFill };
|
|
16
|
+
//# sourceMappingURL=slider-fill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slider-fill.js","names":[],"sources":["../../../../src/ui/slider/slider-fill.tsx"],"sourcesContent":["'use client';\n\nimport type { SliderState } from '@videojs/core';\n\nimport type { UIComponentProps } from '../../utils/types';\nimport { createContextPart } from '../create-context-part';\nimport { useSliderContext } from './context';\n\nexport interface SliderFillProps extends UIComponentProps<'div', SliderState> {}\n\n/** Displays the filled portion from start to the current value. */\nexport const SliderFill = createContextPart<SliderFillProps, SliderState>({\n displayName: 'SliderFill',\n tag: 'div',\n useContext: useSliderContext,\n});\n\nexport namespace SliderFill {\n export type Props = SliderFillProps;\n}\n"],"mappings":";;;;;;;AAWA,MAAa,aAAa,kBAAgD;CACxE,aAAa;CACb,KAAK;CACL,YAAY;CACb,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { renderElement } from "../../utils/use-render.js";
|
|
4
|
+
import { useSlider } from "../hooks/use-slider.js";
|
|
5
|
+
import { SliderProvider } from "./context.js";
|
|
6
|
+
import { getSliderCSSVars } from "@videojs/core/dom";
|
|
7
|
+
import { forwardRef, useState } from "react";
|
|
8
|
+
import { jsx } from "react/jsx-runtime";
|
|
9
|
+
import { SliderCore, SliderDataAttrs } from "@videojs/core";
|
|
10
|
+
|
|
11
|
+
//#region src/ui/slider/slider-root.tsx
|
|
12
|
+
const SliderRoot = forwardRef(function SliderRoot(componentProps, forwardedRef) {
|
|
13
|
+
const { render, className, style, label, min, max, step, largeStep, orientation, disabled, thumbAlignment, value = 0, onValueChange, onValueCommit, onDragStart, onDragEnd, ...elementProps } = componentProps;
|
|
14
|
+
const [core] = useState(() => new SliderCore());
|
|
15
|
+
core.setProps({
|
|
16
|
+
label,
|
|
17
|
+
min,
|
|
18
|
+
max,
|
|
19
|
+
step,
|
|
20
|
+
largeStep,
|
|
21
|
+
orientation,
|
|
22
|
+
disabled,
|
|
23
|
+
thumbAlignment
|
|
24
|
+
});
|
|
25
|
+
const { state, cssVars, rootRef, thumbRef: sliderThumbRef, rootProps, thumbProps } = useSlider({
|
|
26
|
+
computeState: (input) => {
|
|
27
|
+
core.setInput(input);
|
|
28
|
+
return core.getSliderState(value);
|
|
29
|
+
},
|
|
30
|
+
getPercent: () => core.percentFromValue(value),
|
|
31
|
+
getStepPercent: () => core.getStepPercent(),
|
|
32
|
+
getLargeStepPercent: () => core.getLargeStepPercent(),
|
|
33
|
+
orientation,
|
|
34
|
+
disabled,
|
|
35
|
+
adjustPercent: (rawPercent, thumbSize, trackSize) => core.adjustPercentForAlignment(rawPercent, thumbSize, trackSize),
|
|
36
|
+
getCSSVars: getSliderCSSVars,
|
|
37
|
+
onValueChange: (percent) => onValueChange?.(core.valueFromPercent(percent)),
|
|
38
|
+
onValueCommit: (percent) => onValueCommit?.(core.valueFromPercent(percent)),
|
|
39
|
+
onDragStart,
|
|
40
|
+
onDragEnd
|
|
41
|
+
});
|
|
42
|
+
return /* @__PURE__ */ jsx(SliderProvider, {
|
|
43
|
+
value: {
|
|
44
|
+
state,
|
|
45
|
+
pointerValue: core.valueFromPercent(state.pointerPercent),
|
|
46
|
+
thumbRef: sliderThumbRef,
|
|
47
|
+
thumbProps,
|
|
48
|
+
stateAttrMap: SliderDataAttrs,
|
|
49
|
+
getAttrs: (sliderState) => core.getAttrs(sliderState),
|
|
50
|
+
formatValue: void 0
|
|
51
|
+
},
|
|
52
|
+
children: renderElement("div", {
|
|
53
|
+
render,
|
|
54
|
+
className,
|
|
55
|
+
style
|
|
56
|
+
}, {
|
|
57
|
+
state,
|
|
58
|
+
stateAttrMap: SliderDataAttrs,
|
|
59
|
+
ref: [forwardedRef, rootRef],
|
|
60
|
+
props: [
|
|
61
|
+
{ style: cssVars },
|
|
62
|
+
rootProps,
|
|
63
|
+
elementProps
|
|
64
|
+
]
|
|
65
|
+
})
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
//#endregion
|
|
70
|
+
export { SliderRoot };
|
|
71
|
+
//# sourceMappingURL=slider-root.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slider-root.js","names":[],"sources":["../../../../src/ui/slider/slider-root.tsx"],"sourcesContent":["'use client';\n\nimport { SliderCore, SliderDataAttrs } from '@videojs/core';\nimport { getSliderCSSVars } from '@videojs/core/dom';\nimport type { ForwardedRef } from 'react';\nimport { forwardRef, useState } from 'react';\n\nimport type { UIComponentProps } from '../../utils/types';\nimport { renderElement } from '../../utils/use-render';\nimport { useSlider } from '../hooks/use-slider';\nimport { SliderProvider } from './context';\n\nexport interface SliderRootProps extends UIComponentProps<'div', SliderCore.State>, SliderCore.Props {\n onValueChange?: ((value: number) => void) | undefined;\n onValueCommit?: ((value: number) => void) | undefined;\n onDragStart?: (() => void) | undefined;\n onDragEnd?: (() => void) | undefined;\n}\n\nexport const SliderRoot = forwardRef(function SliderRoot(\n componentProps: SliderRootProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n const {\n render,\n className,\n style,\n label,\n min,\n max,\n step,\n largeStep,\n orientation,\n disabled,\n thumbAlignment,\n value = 0,\n onValueChange,\n onValueCommit,\n onDragStart,\n onDragEnd,\n ...elementProps\n } = componentProps;\n\n const [core] = useState(() => new SliderCore());\n core.setProps({ label, min, max, step, largeStep, orientation, disabled, thumbAlignment });\n\n const {\n state,\n cssVars,\n rootRef,\n thumbRef: sliderThumbRef,\n rootProps,\n thumbProps,\n } = useSlider({\n computeState: (input) => {\n core.setInput(input);\n return core.getSliderState(value);\n },\n getPercent: () => core.percentFromValue(value),\n getStepPercent: () => core.getStepPercent(),\n getLargeStepPercent: () => core.getLargeStepPercent(),\n orientation,\n disabled,\n adjustPercent: (rawPercent, thumbSize, trackSize) =>\n core.adjustPercentForAlignment(rawPercent, thumbSize, trackSize),\n getCSSVars: getSliderCSSVars,\n onValueChange: (percent) => onValueChange?.(core.valueFromPercent(percent)),\n onValueCommit: (percent) => onValueCommit?.(core.valueFromPercent(percent)),\n onDragStart,\n onDragEnd,\n });\n\n return (\n <SliderProvider\n value={{\n state,\n pointerValue: core.valueFromPercent(state.pointerPercent),\n thumbRef: sliderThumbRef,\n thumbProps,\n stateAttrMap: SliderDataAttrs,\n getAttrs: (sliderState) => core.getAttrs(sliderState),\n formatValue: undefined,\n }}\n >\n {renderElement(\n 'div',\n { render, className, style },\n {\n state,\n stateAttrMap: SliderDataAttrs,\n ref: [forwardedRef, rootRef],\n props: [{ style: cssVars }, rootProps, elementProps],\n }\n )}\n </SliderProvider>\n );\n});\n\nexport namespace SliderRoot {\n export type Props = SliderRootProps;\n export type State = SliderCore.State;\n}\n"],"mappings":";;;;;;;;;;;AAmBA,MAAa,aAAa,WAAW,SAAS,WAC5C,gBACA,cACA;CACA,MAAM,EACJ,QACA,WACA,OACA,OACA,KACA,KACA,MACA,WACA,aACA,UACA,gBACA,QAAQ,GACR,eACA,eACA,aACA,WACA,GAAG,iBACD;CAEJ,MAAM,CAAC,QAAQ,eAAe,IAAI,YAAY,CAAC;AAC/C,MAAK,SAAS;EAAE;EAAO;EAAK;EAAK;EAAM;EAAW;EAAa;EAAU;EAAgB,CAAC;CAE1F,MAAM,EACJ,OACA,SACA,SACA,UAAU,gBACV,WACA,eACE,UAAU;EACZ,eAAe,UAAU;AACvB,QAAK,SAAS,MAAM;AACpB,UAAO,KAAK,eAAe,MAAM;;EAEnC,kBAAkB,KAAK,iBAAiB,MAAM;EAC9C,sBAAsB,KAAK,gBAAgB;EAC3C,2BAA2B,KAAK,qBAAqB;EACrD;EACA;EACA,gBAAgB,YAAY,WAAW,cACrC,KAAK,0BAA0B,YAAY,WAAW,UAAU;EAClE,YAAY;EACZ,gBAAgB,YAAY,gBAAgB,KAAK,iBAAiB,QAAQ,CAAC;EAC3E,gBAAgB,YAAY,gBAAgB,KAAK,iBAAiB,QAAQ,CAAC;EAC3E;EACA;EACD,CAAC;AAEF,QACE,oBAAC;EACC,OAAO;GACL;GACA,cAAc,KAAK,iBAAiB,MAAM,eAAe;GACzD,UAAU;GACV;GACA,cAAc;GACd,WAAW,gBAAgB,KAAK,SAAS,YAAY;GACrD,aAAa;GACd;YAEA,cACC,OACA;GAAE;GAAQ;GAAW;GAAO,EAC5B;GACE;GACA,cAAc;GACd,KAAK,CAAC,cAAc,QAAQ;GAC5B,OAAO;IAAC,EAAE,OAAO,SAAS;IAAE;IAAW;IAAa;GACrD,CACF;GACc;EAEnB"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { renderElement } from "../../utils/use-render.js";
|
|
4
|
+
import { useSliderContext } from "./context.js";
|
|
5
|
+
import { forwardRef } from "react";
|
|
6
|
+
|
|
7
|
+
//#region src/ui/slider/slider-thumb.tsx
|
|
8
|
+
/** Draggable handle for setting the slider value. Receives focus and handles keyboard interaction. */
|
|
9
|
+
const SliderThumb = forwardRef(function SliderThumb(componentProps, forwardedRef) {
|
|
10
|
+
const { render, className, style, ...elementProps } = componentProps;
|
|
11
|
+
const context = useSliderContext();
|
|
12
|
+
const { state, thumbRef, thumbProps, getAttrs } = context;
|
|
13
|
+
const attrs = getAttrs(state);
|
|
14
|
+
return renderElement("div", {
|
|
15
|
+
render,
|
|
16
|
+
className,
|
|
17
|
+
style
|
|
18
|
+
}, {
|
|
19
|
+
state,
|
|
20
|
+
stateAttrMap: context.stateAttrMap,
|
|
21
|
+
ref: [forwardedRef, thumbRef],
|
|
22
|
+
props: [
|
|
23
|
+
attrs,
|
|
24
|
+
thumbProps,
|
|
25
|
+
elementProps
|
|
26
|
+
]
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
//#endregion
|
|
31
|
+
export { SliderThumb };
|
|
32
|
+
//# sourceMappingURL=slider-thumb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slider-thumb.js","names":[],"sources":["../../../../src/ui/slider/slider-thumb.tsx"],"sourcesContent":["'use client';\n\nimport type { SliderState } from '@videojs/core';\nimport type { ForwardedRef } from 'react';\nimport { forwardRef } from 'react';\n\nimport type { UIComponentProps } from '../../utils/types';\nimport { renderElement } from '../../utils/use-render';\nimport { useSliderContext } from './context';\n\nexport interface SliderThumbProps extends UIComponentProps<'div', SliderState> {}\n\n/** Draggable handle for setting the slider value. Receives focus and handles keyboard interaction. */\nexport const SliderThumb = forwardRef(function SliderThumb(\n componentProps: SliderThumbProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n const { render, className, style, ...elementProps } = componentProps;\n\n const context = useSliderContext();\n const { state, thumbRef, thumbProps, getAttrs } = context;\n const attrs = getAttrs(state);\n\n return renderElement(\n 'div',\n { render, className, style },\n {\n state,\n stateAttrMap: context.stateAttrMap,\n ref: [forwardedRef, thumbRef],\n props: [attrs, thumbProps, elementProps],\n }\n );\n});\n\nexport namespace SliderThumb {\n export type Props = SliderThumbProps;\n}\n"],"mappings":";;;;;;;;AAaA,MAAa,cAAc,WAAW,SAAS,YAC7C,gBACA,cACA;CACA,MAAM,EAAE,QAAQ,WAAW,OAAO,GAAG,iBAAiB;CAEtD,MAAM,UAAU,kBAAkB;CAClC,MAAM,EAAE,OAAO,UAAU,YAAY,aAAa;CAClD,MAAM,QAAQ,SAAS,MAAM;AAE7B,QAAO,cACL,OACA;EAAE;EAAQ;EAAW;EAAO,EAC5B;EACE;EACA,cAAc,QAAQ;EACtB,KAAK,CAAC,cAAc,SAAS;EAC7B,OAAO;GAAC;GAAO;GAAY;GAAa;EACzC,CACF;EACD"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { createContextPart } from "../create-context-part.js";
|
|
4
|
+
import { useSliderContext } from "./context.js";
|
|
5
|
+
|
|
6
|
+
//#region src/ui/slider/slider-track.tsx
|
|
7
|
+
/** Contains the slider's visual track and interactive hit zone. */
|
|
8
|
+
const SliderTrack = createContextPart({
|
|
9
|
+
displayName: "SliderTrack",
|
|
10
|
+
tag: "div",
|
|
11
|
+
useContext: useSliderContext
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
//#endregion
|
|
15
|
+
export { SliderTrack };
|
|
16
|
+
//# sourceMappingURL=slider-track.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slider-track.js","names":[],"sources":["../../../../src/ui/slider/slider-track.tsx"],"sourcesContent":["'use client';\n\nimport type { SliderState } from '@videojs/core';\n\nimport type { UIComponentProps } from '../../utils/types';\nimport { createContextPart } from '../create-context-part';\nimport { useSliderContext } from './context';\n\nexport interface SliderTrackProps extends UIComponentProps<'div', SliderState> {}\n\n/** Contains the slider's visual track and interactive hit zone. */\nexport const SliderTrack = createContextPart<SliderTrackProps, SliderState>({\n displayName: 'SliderTrack',\n tag: 'div',\n useContext: useSliderContext,\n});\n\nexport namespace SliderTrack {\n export type Props = SliderTrackProps;\n}\n"],"mappings":";;;;;;;AAWA,MAAa,cAAc,kBAAiD;CAC1E,aAAa;CACb,KAAK;CACL,YAAY;CACb,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { renderElement } from "../../utils/use-render.js";
|
|
4
|
+
import { useSliderContext } from "./context.js";
|
|
5
|
+
import { forwardRef } from "react";
|
|
6
|
+
|
|
7
|
+
//#region src/ui/slider/slider-value.tsx
|
|
8
|
+
/** Displays a formatted text representation of the slider value. Renders an `<output>` element. */
|
|
9
|
+
const SliderValue = forwardRef(function SliderValue(componentProps, forwardedRef) {
|
|
10
|
+
const { render, className, style, type = "current", format, ...elementProps } = componentProps;
|
|
11
|
+
const context = useSliderContext();
|
|
12
|
+
const { state, pointerValue, formatValue } = context;
|
|
13
|
+
const rawValue = type === "pointer" ? pointerValue : state.value;
|
|
14
|
+
const text = format ? format(rawValue) : formatValue ? formatValue(rawValue, type) : String(Math.round(rawValue));
|
|
15
|
+
return renderElement("output", {
|
|
16
|
+
render,
|
|
17
|
+
className,
|
|
18
|
+
style
|
|
19
|
+
}, {
|
|
20
|
+
state,
|
|
21
|
+
stateAttrMap: context.stateAttrMap,
|
|
22
|
+
ref: forwardedRef,
|
|
23
|
+
props: [{
|
|
24
|
+
"aria-live": "off",
|
|
25
|
+
children: text
|
|
26
|
+
}, elementProps]
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
//#endregion
|
|
31
|
+
export { SliderValue };
|
|
32
|
+
//# sourceMappingURL=slider-value.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slider-value.js","names":[],"sources":["../../../../src/ui/slider/slider-value.tsx"],"sourcesContent":["'use client';\n\nimport type { SliderState } from '@videojs/core';\nimport type { ForwardedRef } from 'react';\nimport { forwardRef } from 'react';\n\nimport type { UIComponentProps } from '../../utils/types';\nimport { renderElement } from '../../utils/use-render';\nimport { useSliderContext } from './context';\n\nexport interface SliderValueProps extends UIComponentProps<'output', SliderState> {\n /** Which slider value to display: the current position or the pointer position. */\n type?: 'current' | 'pointer' | undefined;\n /** Custom formatter for the displayed value. Overrides the root's `formatValue`. */\n format?: ((value: number) => string) | undefined;\n}\n\n/** Displays a formatted text representation of the slider value. Renders an `<output>` element. */\nexport const SliderValue = forwardRef(function SliderValue(\n componentProps: SliderValueProps,\n forwardedRef: ForwardedRef<HTMLOutputElement>\n) {\n const { render, className, style, type = 'current', format, ...elementProps } = componentProps;\n\n const context = useSliderContext();\n const { state, pointerValue, formatValue } = context;\n\n const rawValue = type === 'pointer' ? pointerValue : state.value;\n\n const text = format ? format(rawValue) : formatValue ? formatValue(rawValue, type) : String(Math.round(rawValue));\n\n return renderElement(\n 'output',\n { render, className, style },\n {\n state,\n stateAttrMap: context.stateAttrMap,\n ref: forwardedRef,\n props: [{ 'aria-live': 'off', children: text }, elementProps],\n }\n );\n});\n\nexport namespace SliderValue {\n export type Props = SliderValueProps;\n}\n"],"mappings":";;;;;;;;AAkBA,MAAa,cAAc,WAAW,SAAS,YAC7C,gBACA,cACA;CACA,MAAM,EAAE,QAAQ,WAAW,OAAO,OAAO,WAAW,QAAQ,GAAG,iBAAiB;CAEhF,MAAM,UAAU,kBAAkB;CAClC,MAAM,EAAE,OAAO,cAAc,gBAAgB;CAE7C,MAAM,WAAW,SAAS,YAAY,eAAe,MAAM;CAE3D,MAAM,OAAO,SAAS,OAAO,SAAS,GAAG,cAAc,YAAY,UAAU,KAAK,GAAG,OAAO,KAAK,MAAM,SAAS,CAAC;AAEjH,QAAO,cACL,UACA;EAAE;EAAQ;EAAW;EAAO,EAC5B;EACE;EACA,cAAc,QAAQ;EACtB,KAAK;EACL,OAAO,CAAC;GAAE,aAAa;GAAO,UAAU;GAAM,EAAE,aAAa;EAC9D,CACF;EACD"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useOptionalPlayer } from "../../player/context.js";
|
|
4
|
+
import { renderElement } from "../../utils/use-render.js";
|
|
5
|
+
import { createThumbnail, selectTextTrack } from "@videojs/core/dom";
|
|
6
|
+
import { forwardRef, useEffect, useMemo, useRef, useState } from "react";
|
|
7
|
+
import { jsx } from "react/jsx-runtime";
|
|
8
|
+
import { ThumbnailCore, ThumbnailDataAttrs, mapCuesToThumbnails } from "@videojs/core";
|
|
9
|
+
|
|
10
|
+
//#region src/ui/thumbnail/thumbnail.tsx
|
|
11
|
+
const Thumbnail = forwardRef(function Thumbnail(componentProps, forwardedRef) {
|
|
12
|
+
const { render, className, style, time = 0, thumbnails: externalThumbnails, crossOrigin, loading, fetchPriority, ...elementProps } = componentProps;
|
|
13
|
+
const [core] = useState(() => new ThumbnailCore());
|
|
14
|
+
const divRef = useRef(null);
|
|
15
|
+
const imgRef = useRef(null);
|
|
16
|
+
const textTrack = useOptionalPlayer(selectTextTrack);
|
|
17
|
+
const [, setRenderToken] = useState(0);
|
|
18
|
+
const [handle] = useState(() => createThumbnail({
|
|
19
|
+
getContainer: () => divRef.current,
|
|
20
|
+
getImg: () => imgRef.current,
|
|
21
|
+
onStateChange: () => setRenderToken((n) => n + 1)
|
|
22
|
+
}));
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
handle.connect();
|
|
25
|
+
return () => handle.destroy();
|
|
26
|
+
}, [handle]);
|
|
27
|
+
const thumbnails = useMemo(() => {
|
|
28
|
+
if (externalThumbnails && externalThumbnails.length > 0) return externalThumbnails;
|
|
29
|
+
if (!textTrack?.thumbnailCues.length) return [];
|
|
30
|
+
return mapCuesToThumbnails(textTrack.thumbnailCues, textTrack.thumbnailTrackSrc ?? void 0);
|
|
31
|
+
}, [externalThumbnails, textTrack]);
|
|
32
|
+
const thumbnail = useMemo(() => core.findActiveThumbnail(thumbnails, time), [
|
|
33
|
+
core,
|
|
34
|
+
thumbnails,
|
|
35
|
+
time
|
|
36
|
+
]);
|
|
37
|
+
handle.updateSrc(thumbnail?.url);
|
|
38
|
+
const state = core.getState(handle.loading, handle.error, thumbnail);
|
|
39
|
+
let containerStyle = { overflow: "hidden" };
|
|
40
|
+
let imgStyle;
|
|
41
|
+
if (thumbnail && handle.naturalWidth && handle.naturalHeight) {
|
|
42
|
+
const constraints = handle.readConstraints();
|
|
43
|
+
const result = core.resize(thumbnail, handle.naturalWidth, handle.naturalHeight, constraints);
|
|
44
|
+
if (result) {
|
|
45
|
+
containerStyle = {
|
|
46
|
+
overflow: "hidden",
|
|
47
|
+
width: result.containerWidth,
|
|
48
|
+
height: result.containerHeight
|
|
49
|
+
};
|
|
50
|
+
imgStyle = {
|
|
51
|
+
width: result.imageWidth,
|
|
52
|
+
height: result.imageHeight,
|
|
53
|
+
maxWidth: "none",
|
|
54
|
+
transform: result.offsetX || result.offsetY ? `translate(-${result.offsetX}px, -${result.offsetY}px)` : void 0
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return renderElement("div", {
|
|
59
|
+
render,
|
|
60
|
+
className,
|
|
61
|
+
style
|
|
62
|
+
}, {
|
|
63
|
+
state,
|
|
64
|
+
stateAttrMap: ThumbnailDataAttrs,
|
|
65
|
+
ref: [forwardedRef, divRef],
|
|
66
|
+
props: [
|
|
67
|
+
core.getAttrs(state),
|
|
68
|
+
{ style: containerStyle },
|
|
69
|
+
elementProps,
|
|
70
|
+
{ children: /* @__PURE__ */ jsx("img", {
|
|
71
|
+
ref: imgRef,
|
|
72
|
+
alt: "",
|
|
73
|
+
"aria-hidden": "true",
|
|
74
|
+
decoding: "async",
|
|
75
|
+
src: thumbnail?.url,
|
|
76
|
+
crossOrigin: crossOrigin === "" || crossOrigin === null ? void 0 : crossOrigin,
|
|
77
|
+
loading,
|
|
78
|
+
style: imgStyle,
|
|
79
|
+
fetchPriority
|
|
80
|
+
}) }
|
|
81
|
+
]
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
//#endregion
|
|
86
|
+
export { Thumbnail };
|
|
87
|
+
//# sourceMappingURL=thumbnail.js.map
|