@videojs/react 0.1.0-preview.9 → 10.0.0-alpha.4
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/README.md +1 -1
- package/dist/default/_virtual/_rolldown/runtime.js +36 -0
- package/dist/default/icons/dist/react/default/captions-off.js +66 -0
- package/dist/default/icons/dist/react/default/captions-off.js.map +1 -0
- package/dist/default/icons/dist/react/default/captions-on.js +19 -0
- package/dist/default/icons/dist/react/default/captions-on.js.map +1 -0
- package/dist/default/icons/dist/react/default/fullscreen-enter.js +19 -0
- package/dist/default/icons/dist/react/default/fullscreen-enter.js.map +1 -0
- package/dist/default/icons/dist/react/default/fullscreen-exit.js +19 -0
- package/dist/default/icons/dist/react/default/fullscreen-exit.js.map +1 -0
- package/dist/default/icons/dist/react/default/pause.js +30 -0
- package/dist/default/icons/dist/react/default/pause.js.map +1 -0
- package/dist/default/icons/dist/react/default/pip.js +26 -0
- package/dist/default/icons/dist/react/default/pip.js.map +1 -0
- package/dist/default/icons/dist/react/default/play.js +19 -0
- package/dist/default/icons/dist/react/default/play.js.map +1 -0
- package/dist/default/icons/dist/react/default/restart.js +22 -0
- package/dist/default/icons/dist/react/default/restart.js.map +1 -0
- package/dist/default/icons/dist/react/default/seek.js +19 -0
- package/dist/default/icons/dist/react/default/seek.js.map +1 -0
- package/dist/default/icons/dist/react/default/spinner.js +149 -0
- package/dist/default/icons/dist/react/default/spinner.js.map +1 -0
- package/dist/default/icons/dist/react/default/volume-high.js +22 -0
- package/dist/default/icons/dist/react/default/volume-high.js.map +1 -0
- package/dist/default/icons/dist/react/default/volume-low.js +19 -0
- package/dist/default/icons/dist/react/default/volume-low.js.map +1 -0
- package/dist/default/icons/dist/react/default/volume-off.js +19 -0
- package/dist/default/icons/dist/react/default/volume-off.js.map +1 -0
- package/dist/default/icons/dist/react/minimal/captions-off.js +66 -0
- package/dist/default/icons/dist/react/minimal/captions-off.js.map +1 -0
- package/dist/default/icons/dist/react/minimal/captions-on.js +19 -0
- package/dist/default/icons/dist/react/minimal/captions-on.js.map +1 -0
- package/dist/default/icons/dist/react/minimal/fullscreen-enter.js +29 -0
- package/dist/default/icons/dist/react/minimal/fullscreen-enter.js.map +1 -0
- package/dist/default/icons/dist/react/minimal/fullscreen-exit.js +29 -0
- package/dist/default/icons/dist/react/minimal/fullscreen-exit.js.map +1 -0
- package/dist/default/icons/dist/react/minimal/pause.js +30 -0
- package/dist/default/icons/dist/react/minimal/pause.js.map +1 -0
- package/dist/default/icons/dist/react/minimal/pip.js +26 -0
- package/dist/default/icons/dist/react/minimal/pip.js.map +1 -0
- package/dist/default/icons/dist/react/minimal/play.js +19 -0
- package/dist/default/icons/dist/react/minimal/play.js.map +1 -0
- package/dist/default/icons/dist/react/minimal/restart.js +22 -0
- package/dist/default/icons/dist/react/minimal/restart.js.map +1 -0
- package/dist/default/icons/dist/react/minimal/seek.js +19 -0
- package/dist/default/icons/dist/react/minimal/seek.js.map +1 -0
- package/dist/default/icons/dist/react/minimal/spinner.js +149 -0
- package/dist/default/icons/dist/react/minimal/spinner.js.map +1 -0
- package/dist/default/icons/dist/react/minimal/volume-high.js +22 -0
- package/dist/default/icons/dist/react/minimal/volume-high.js.map +1 -0
- package/dist/default/icons/dist/react/minimal/volume-low.js +19 -0
- package/dist/default/icons/dist/react/minimal/volume-low.js.map +1 -0
- package/dist/default/icons/dist/react/minimal/volume-off.js +19 -0
- package/dist/default/icons/dist/react/minimal/volume-off.js.map +1 -0
- package/dist/default/index.js +53 -0
- package/dist/default/index.js.map +1 -0
- package/dist/default/media/audio.js +22 -0
- package/dist/default/media/audio.js.map +1 -0
- package/dist/default/media/background-video/index.js +28 -0
- package/dist/default/media/background-video/index.js.map +1 -0
- package/dist/default/media/hls-video/index.js +25 -0
- package/dist/default/media/hls-video/index.js.map +1 -0
- package/dist/default/media/video.js +22 -0
- package/dist/default/media/video.js.map +1 -0
- package/dist/default/player/context.js +55 -0
- package/dist/default/player/context.js.map +1 -0
- package/dist/default/player/create-player.js +38 -0
- package/dist/default/player/create-player.js.map +1 -0
- package/dist/default/presets/audio/index.js +12 -0
- package/dist/default/presets/audio/index.js.map +1 -0
- package/dist/default/presets/audio/minimal-skin.css +3 -0
- package/dist/default/presets/audio/minimal-skin.js +11 -0
- package/dist/default/presets/audio/minimal-skin.js.map +1 -0
- package/dist/default/presets/audio/skin.css +3 -0
- package/dist/default/presets/audio/skin.js +11 -0
- package/dist/default/presets/audio/skin.js.map +1 -0
- package/dist/default/presets/background/index.js +11 -0
- package/dist/default/presets/background/index.js.map +1 -0
- package/dist/default/presets/background/skin.css +21 -0
- package/dist/default/presets/background/skin.js +16 -0
- package/dist/default/presets/background/skin.js.map +1 -0
- package/dist/default/presets/video/index.js +14 -0
- package/dist/default/presets/video/index.js.map +1 -0
- package/dist/default/presets/video/minimal-skin.css +637 -0
- package/dist/default/presets/video/minimal-skin.js +246 -0
- package/dist/default/presets/video/minimal-skin.js.map +1 -0
- package/dist/default/presets/video/minimal-skin.tailwind.js +243 -0
- package/dist/default/presets/video/minimal-skin.tailwind.js.map +1 -0
- package/dist/default/presets/video/skin.css +638 -0
- package/dist/default/presets/video/skin.js +235 -0
- package/dist/default/presets/video/skin.js.map +1 -0
- package/dist/default/presets/video/skin.tailwind.js +234 -0
- package/dist/default/presets/video/skin.tailwind.js.map +1 -0
- package/dist/default/ui/buffering-indicator/buffering-indicator.js +50 -0
- package/dist/default/ui/buffering-indicator/buffering-indicator.js.map +1 -0
- package/dist/default/ui/buffering-indicator/index.js +3 -0
- package/dist/default/ui/captions-button/captions-button.js +51 -0
- package/dist/default/ui/captions-button/captions-button.js.map +1 -0
- package/dist/default/ui/captions-button/index.js +3 -0
- package/dist/default/ui/controls/controls-group.js +27 -0
- package/dist/default/ui/controls/controls-group.js.map +1 -0
- package/dist/default/ui/controls/controls-root.js +31 -0
- package/dist/default/ui/controls/controls-root.js.map +1 -0
- package/dist/default/ui/controls/index.js +3 -0
- package/dist/default/ui/controls/index.parts.js +13 -0
- package/dist/default/ui/controls/index.parts.js.map +1 -0
- package/dist/default/ui/error-dialog/error-dialog.js +54 -0
- package/dist/default/ui/error-dialog/error-dialog.js.map +1 -0
- package/dist/default/ui/error-dialog/index.js +3 -0
- package/dist/default/ui/fullscreen-button/fullscreen-button.js +44 -0
- package/dist/default/ui/fullscreen-button/fullscreen-button.js.map +1 -0
- package/dist/default/ui/fullscreen-button/index.js +3 -0
- package/dist/default/ui/hooks/use-button.js +44 -0
- package/dist/default/ui/hooks/use-button.js.map +1 -0
- package/dist/default/ui/mute-button/index.js +3 -0
- package/dist/default/ui/mute-button/mute-button.js +47 -0
- package/dist/default/ui/mute-button/mute-button.js.map +1 -0
- package/dist/default/ui/pip-button/index.js +3 -0
- package/dist/default/ui/pip-button/pip-button.js +44 -0
- package/dist/default/ui/pip-button/pip-button.js.map +1 -0
- package/dist/default/ui/play-button/index.js +3 -0
- package/dist/default/ui/play-button/play-button.js +60 -0
- package/dist/default/ui/play-button/play-button.js.map +1 -0
- package/dist/default/ui/poster/index.js +3 -0
- package/dist/default/ui/poster/poster.js +43 -0
- package/dist/default/ui/poster/poster.js.map +1 -0
- package/dist/default/ui/seek-button/index.js +3 -0
- package/dist/default/ui/seek-button/seek-button.js +62 -0
- package/dist/default/ui/seek-button/seek-button.js.map +1 -0
- package/dist/default/ui/time/index.js +3 -0
- package/dist/default/ui/time/index.parts.js +15 -0
- package/dist/default/ui/time/index.parts.js.map +1 -0
- package/dist/default/ui/time/time-group.js +34 -0
- package/dist/default/ui/time/time-group.js.map +1 -0
- package/dist/default/ui/time/time-separator.js +34 -0
- package/dist/default/ui/time/time-separator.js.map +1 -0
- package/dist/default/ui/time/time-value.js +54 -0
- package/dist/default/ui/time/time-value.js.map +1 -0
- package/dist/default/utils/attach-media-element.js +12 -0
- package/dist/default/utils/attach-media-element.js.map +1 -0
- package/dist/default/utils/media-props.js +11 -0
- package/dist/default/utils/media-props.js.map +1 -0
- package/dist/default/utils/merge-props.js +85 -0
- package/dist/default/utils/merge-props.js.map +1 -0
- package/dist/default/utils/use-composed-refs.js +57 -0
- package/dist/default/utils/use-composed-refs.js.map +1 -0
- package/dist/default/utils/use-render.js +71 -0
- package/dist/default/utils/use-render.js.map +1 -0
- package/dist/dev/_virtual/_rolldown/runtime.js +36 -0
- package/dist/dev/icons/dist/react/default/captions-off.js +66 -0
- package/dist/dev/icons/dist/react/default/captions-off.js.map +1 -0
- package/dist/dev/icons/dist/react/default/captions-on.js +19 -0
- package/dist/dev/icons/dist/react/default/captions-on.js.map +1 -0
- package/dist/dev/icons/dist/react/default/fullscreen-enter.js +19 -0
- package/dist/dev/icons/dist/react/default/fullscreen-enter.js.map +1 -0
- package/dist/dev/icons/dist/react/default/fullscreen-exit.js +19 -0
- package/dist/dev/icons/dist/react/default/fullscreen-exit.js.map +1 -0
- package/dist/dev/icons/dist/react/default/pause.js +30 -0
- package/dist/dev/icons/dist/react/default/pause.js.map +1 -0
- package/dist/dev/icons/dist/react/default/pip.js +26 -0
- package/dist/dev/icons/dist/react/default/pip.js.map +1 -0
- package/dist/dev/icons/dist/react/default/play.js +19 -0
- package/dist/dev/icons/dist/react/default/play.js.map +1 -0
- package/dist/dev/icons/dist/react/default/restart.js +22 -0
- package/dist/dev/icons/dist/react/default/restart.js.map +1 -0
- package/dist/dev/icons/dist/react/default/seek.js +19 -0
- package/dist/dev/icons/dist/react/default/seek.js.map +1 -0
- package/dist/dev/icons/dist/react/default/spinner.js +149 -0
- package/dist/dev/icons/dist/react/default/spinner.js.map +1 -0
- package/dist/dev/icons/dist/react/default/volume-high.js +22 -0
- package/dist/dev/icons/dist/react/default/volume-high.js.map +1 -0
- package/dist/dev/icons/dist/react/default/volume-low.js +19 -0
- package/dist/dev/icons/dist/react/default/volume-low.js.map +1 -0
- package/dist/dev/icons/dist/react/default/volume-off.js +19 -0
- package/dist/dev/icons/dist/react/default/volume-off.js.map +1 -0
- package/dist/dev/icons/dist/react/minimal/captions-off.js +66 -0
- package/dist/dev/icons/dist/react/minimal/captions-off.js.map +1 -0
- package/dist/dev/icons/dist/react/minimal/captions-on.js +19 -0
- package/dist/dev/icons/dist/react/minimal/captions-on.js.map +1 -0
- package/dist/dev/icons/dist/react/minimal/fullscreen-enter.js +29 -0
- package/dist/dev/icons/dist/react/minimal/fullscreen-enter.js.map +1 -0
- package/dist/dev/icons/dist/react/minimal/fullscreen-exit.js +29 -0
- package/dist/dev/icons/dist/react/minimal/fullscreen-exit.js.map +1 -0
- package/dist/dev/icons/dist/react/minimal/pause.js +30 -0
- package/dist/dev/icons/dist/react/minimal/pause.js.map +1 -0
- package/dist/dev/icons/dist/react/minimal/pip.js +26 -0
- package/dist/dev/icons/dist/react/minimal/pip.js.map +1 -0
- package/dist/dev/icons/dist/react/minimal/play.js +19 -0
- package/dist/dev/icons/dist/react/minimal/play.js.map +1 -0
- package/dist/dev/icons/dist/react/minimal/restart.js +22 -0
- package/dist/dev/icons/dist/react/minimal/restart.js.map +1 -0
- package/dist/dev/icons/dist/react/minimal/seek.js +19 -0
- package/dist/dev/icons/dist/react/minimal/seek.js.map +1 -0
- package/dist/dev/icons/dist/react/minimal/spinner.js +149 -0
- package/dist/dev/icons/dist/react/minimal/spinner.js.map +1 -0
- package/dist/dev/icons/dist/react/minimal/volume-high.js +22 -0
- package/dist/dev/icons/dist/react/minimal/volume-high.js.map +1 -0
- package/dist/dev/icons/dist/react/minimal/volume-low.js +19 -0
- package/dist/dev/icons/dist/react/minimal/volume-low.js.map +1 -0
- package/dist/dev/icons/dist/react/minimal/volume-off.js +19 -0
- package/dist/dev/icons/dist/react/minimal/volume-off.js.map +1 -0
- package/dist/dev/index.d.ts +23 -0
- package/dist/dev/index.js +53 -0
- package/dist/dev/index.js.map +1 -0
- package/dist/dev/media/audio.d.ts +12 -0
- package/dist/dev/media/audio.d.ts.map +1 -0
- package/dist/dev/media/audio.js +22 -0
- package/dist/dev/media/audio.js.map +1 -0
- package/dist/dev/media/background-video/index.d.ts +12 -0
- package/dist/dev/media/background-video/index.d.ts.map +1 -0
- package/dist/dev/media/background-video/index.js +28 -0
- package/dist/dev/media/background-video/index.js.map +1 -0
- package/dist/dev/media/hls-video/index.d.ts +11 -0
- package/dist/dev/media/hls-video/index.d.ts.map +1 -0
- package/dist/dev/media/hls-video/index.js +25 -0
- package/dist/dev/media/hls-video/index.js.map +1 -0
- package/dist/dev/media/video.d.ts +12 -0
- package/dist/dev/media/video.d.ts.map +1 -0
- package/dist/dev/media/video.js +22 -0
- package/dist/dev/media/video.js.map +1 -0
- package/dist/dev/player/context.d.ts +40 -0
- package/dist/dev/player/context.d.ts.map +1 -0
- package/dist/dev/player/context.js +55 -0
- package/dist/dev/player/context.js.map +1 -0
- package/dist/dev/player/create-player.d.ts +47 -0
- package/dist/dev/player/create-player.d.ts.map +1 -0
- package/dist/dev/player/create-player.js +39 -0
- package/dist/dev/player/create-player.js.map +1 -0
- package/dist/dev/presets/audio/index.d.ts +12 -0
- package/dist/dev/presets/audio/index.d.ts.map +1 -0
- package/dist/dev/presets/audio/index.js +12 -0
- package/dist/dev/presets/audio/index.js.map +1 -0
- package/dist/dev/presets/audio/minimal-skin.css +3 -0
- package/dist/dev/presets/audio/minimal-skin.d.ts +9 -0
- package/dist/dev/presets/audio/minimal-skin.d.ts.map +1 -0
- package/dist/dev/presets/audio/minimal-skin.js +11 -0
- package/dist/dev/presets/audio/minimal-skin.js.map +1 -0
- package/dist/dev/presets/audio/skin.css +3 -0
- package/dist/dev/presets/audio/skin.d.ts +9 -0
- package/dist/dev/presets/audio/skin.d.ts.map +1 -0
- package/dist/dev/presets/audio/skin.js +11 -0
- package/dist/dev/presets/audio/skin.js.map +1 -0
- package/dist/dev/presets/background/index.d.ts +11 -0
- package/dist/dev/presets/background/index.d.ts.map +1 -0
- package/dist/dev/presets/background/index.js +11 -0
- package/dist/dev/presets/background/index.js.map +1 -0
- package/dist/dev/presets/background/skin.css +21 -0
- package/dist/dev/presets/background/skin.d.ts +9 -0
- package/dist/dev/presets/background/skin.d.ts.map +1 -0
- package/dist/dev/presets/background/skin.js +16 -0
- package/dist/dev/presets/background/skin.js.map +1 -0
- package/dist/dev/presets/types.d.ts +10 -0
- package/dist/dev/presets/types.d.ts.map +1 -0
- package/dist/dev/presets/video/index.d.ts +14 -0
- package/dist/dev/presets/video/index.d.ts.map +1 -0
- package/dist/dev/presets/video/index.js +14 -0
- package/dist/dev/presets/video/index.js.map +1 -0
- package/dist/dev/presets/video/minimal-skin.css +637 -0
- package/dist/dev/presets/video/minimal-skin.d.ts +9 -0
- package/dist/dev/presets/video/minimal-skin.d.ts.map +1 -0
- package/dist/dev/presets/video/minimal-skin.js +246 -0
- package/dist/dev/presets/video/minimal-skin.js.map +1 -0
- package/dist/dev/presets/video/minimal-skin.tailwind.d.ts +8 -0
- package/dist/dev/presets/video/minimal-skin.tailwind.d.ts.map +1 -0
- package/dist/dev/presets/video/minimal-skin.tailwind.js +243 -0
- package/dist/dev/presets/video/minimal-skin.tailwind.js.map +1 -0
- package/dist/dev/presets/video/skin.css +638 -0
- package/dist/dev/presets/video/skin.d.ts +9 -0
- package/dist/dev/presets/video/skin.d.ts.map +1 -0
- package/dist/dev/presets/video/skin.js +235 -0
- package/dist/dev/presets/video/skin.js.map +1 -0
- package/dist/dev/presets/video/skin.tailwind.d.ts +8 -0
- package/dist/dev/presets/video/skin.tailwind.d.ts.map +1 -0
- package/dist/dev/presets/video/skin.tailwind.js +234 -0
- package/dist/dev/presets/video/skin.tailwind.js.map +1 -0
- package/dist/dev/ui/buffering-indicator/buffering-indicator.d.ts +32 -0
- package/dist/dev/ui/buffering-indicator/buffering-indicator.d.ts.map +1 -0
- package/dist/dev/ui/buffering-indicator/buffering-indicator.js +53 -0
- package/dist/dev/ui/buffering-indicator/buffering-indicator.js.map +1 -0
- package/dist/dev/ui/buffering-indicator/index.d.ts +2 -0
- package/dist/dev/ui/buffering-indicator/index.js +3 -0
- package/dist/dev/ui/captions-button/captions-button.d.ts +36 -0
- package/dist/dev/ui/captions-button/captions-button.d.ts.map +1 -0
- package/dist/dev/ui/captions-button/captions-button.js +51 -0
- package/dist/dev/ui/captions-button/captions-button.js.map +1 -0
- package/dist/dev/ui/captions-button/index.d.ts +2 -0
- package/dist/dev/ui/captions-button/index.js +3 -0
- package/dist/dev/ui/controls/controls-group.d.ts +17 -0
- package/dist/dev/ui/controls/controls-group.d.ts.map +1 -0
- package/dist/dev/ui/controls/controls-group.js +27 -0
- package/dist/dev/ui/controls/controls-group.js.map +1 -0
- package/dist/dev/ui/controls/controls-root.d.ts +18 -0
- package/dist/dev/ui/controls/controls-root.d.ts.map +1 -0
- package/dist/dev/ui/controls/controls-root.js +34 -0
- package/dist/dev/ui/controls/controls-root.js.map +1 -0
- package/dist/dev/ui/controls/index.d.ts +2 -0
- package/dist/dev/ui/controls/index.js +3 -0
- package/dist/dev/ui/controls/index.parts.d.ts +10 -0
- package/dist/dev/ui/controls/index.parts.d.ts.map +1 -0
- package/dist/dev/ui/controls/index.parts.js +13 -0
- package/dist/dev/ui/controls/index.parts.js.map +1 -0
- package/dist/dev/ui/error-dialog/error-dialog.d.ts +35 -0
- package/dist/dev/ui/error-dialog/error-dialog.d.ts.map +1 -0
- package/dist/dev/ui/error-dialog/error-dialog.js +54 -0
- package/dist/dev/ui/error-dialog/error-dialog.js.map +1 -0
- package/dist/dev/ui/error-dialog/index.d.ts +2 -0
- package/dist/dev/ui/error-dialog/index.js +3 -0
- package/dist/dev/ui/fullscreen-button/fullscreen-button.d.ts +14 -0
- package/dist/dev/ui/fullscreen-button/fullscreen-button.d.ts.map +1 -0
- package/dist/dev/ui/fullscreen-button/fullscreen-button.js +47 -0
- package/dist/dev/ui/fullscreen-button/fullscreen-button.js.map +1 -0
- package/dist/dev/ui/fullscreen-button/index.d.ts +2 -0
- package/dist/dev/ui/fullscreen-button/index.js +3 -0
- package/dist/dev/ui/hooks/use-button.d.ts +40 -0
- package/dist/dev/ui/hooks/use-button.d.ts.map +1 -0
- package/dist/dev/ui/hooks/use-button.js +46 -0
- package/dist/dev/ui/hooks/use-button.js.map +1 -0
- package/dist/dev/ui/mute-button/index.d.ts +2 -0
- package/dist/dev/ui/mute-button/index.js +3 -0
- package/dist/dev/ui/mute-button/mute-button.d.ts +17 -0
- package/dist/dev/ui/mute-button/mute-button.d.ts.map +1 -0
- package/dist/dev/ui/mute-button/mute-button.js +50 -0
- package/dist/dev/ui/mute-button/mute-button.js.map +1 -0
- package/dist/dev/ui/pip-button/index.d.ts +2 -0
- package/dist/dev/ui/pip-button/index.js +3 -0
- package/dist/dev/ui/pip-button/pip-button.d.ts +14 -0
- package/dist/dev/ui/pip-button/pip-button.d.ts.map +1 -0
- package/dist/dev/ui/pip-button/pip-button.js +47 -0
- package/dist/dev/ui/pip-button/pip-button.js.map +1 -0
- package/dist/dev/ui/play-button/index.d.ts +2 -0
- package/dist/dev/ui/play-button/index.js +3 -0
- package/dist/dev/ui/play-button/play-button.d.ts +30 -0
- package/dist/dev/ui/play-button/play-button.d.ts.map +1 -0
- package/dist/dev/ui/play-button/play-button.js +63 -0
- package/dist/dev/ui/play-button/play-button.js.map +1 -0
- package/dist/dev/ui/poster/index.d.ts +2 -0
- package/dist/dev/ui/poster/index.js +3 -0
- package/dist/dev/ui/poster/poster.d.ts +28 -0
- package/dist/dev/ui/poster/poster.d.ts.map +1 -0
- package/dist/dev/ui/poster/poster.js +46 -0
- package/dist/dev/ui/poster/poster.js.map +1 -0
- package/dist/dev/ui/seek-button/index.d.ts +2 -0
- package/dist/dev/ui/seek-button/index.js +3 -0
- package/dist/dev/ui/seek-button/seek-button.d.ts +31 -0
- package/dist/dev/ui/seek-button/seek-button.d.ts.map +1 -0
- package/dist/dev/ui/seek-button/seek-button.js +65 -0
- package/dist/dev/ui/seek-button/seek-button.js.map +1 -0
- package/dist/dev/ui/time/index.d.ts +2 -0
- package/dist/dev/ui/time/index.js +3 -0
- package/dist/dev/ui/time/index.parts.d.ts +11 -0
- package/dist/dev/ui/time/index.parts.d.ts.map +1 -0
- package/dist/dev/ui/time/index.parts.js +15 -0
- package/dist/dev/ui/time/index.parts.js.map +1 -0
- package/dist/dev/ui/time/time-group.d.ts +29 -0
- package/dist/dev/ui/time/time-group.d.ts.map +1 -0
- package/dist/dev/ui/time/time-group.js +34 -0
- package/dist/dev/ui/time/time-group.js.map +1 -0
- package/dist/dev/ui/time/time-separator.d.ts +26 -0
- package/dist/dev/ui/time/time-separator.d.ts.map +1 -0
- package/dist/dev/ui/time/time-separator.js +34 -0
- package/dist/dev/ui/time/time-separator.js.map +1 -0
- package/dist/dev/ui/time/time-value.d.ts +24 -0
- package/dist/dev/ui/time/time-value.d.ts.map +1 -0
- package/dist/dev/ui/time/time-value.js +57 -0
- package/dist/dev/ui/time/time-value.js.map +1 -0
- package/dist/dev/utils/attach-media-element.js +12 -0
- package/dist/dev/utils/attach-media-element.js.map +1 -0
- package/dist/dev/utils/media-props.js +11 -0
- package/dist/dev/utils/media-props.js.map +1 -0
- package/dist/dev/utils/merge-props.d.ts +26 -0
- package/dist/dev/utils/merge-props.d.ts.map +1 -0
- package/dist/dev/utils/merge-props.js +85 -0
- package/dist/dev/utils/merge-props.js.map +1 -0
- package/dist/dev/utils/types.d.ts +27 -0
- package/dist/dev/utils/types.d.ts.map +1 -0
- package/dist/dev/utils/use-composed-refs.js +57 -0
- package/dist/dev/utils/use-composed-refs.js.map +1 -0
- package/dist/dev/utils/use-render.d.ts +45 -0
- package/dist/dev/utils/use-render.d.ts.map +1 -0
- package/dist/dev/utils/use-render.js +71 -0
- package/dist/dev/utils/use-render.js.map +1 -0
- package/package.json +50 -55
- package/dist/FrostedSkin-t8edr5LV.d.ts +0 -13
- package/dist/FrostedSkin-t8edr5LV.d.ts.map +0 -1
- package/dist/MinimalSkin-DzHkJgW-.d.ts +0 -13
- package/dist/MinimalSkin-DzHkJgW-.d.ts.map +0 -1
- package/dist/VolumeSlider-DBvAU2X3.js +0 -1025
- package/dist/VolumeSlider-DBvAU2X3.js.map +0 -1
- package/dist/frosted-D2OXDJRV.js +0 -156
- package/dist/frosted-D2OXDJRV.js.map +0 -1
- package/dist/icons-BqfV81R8.js +0 -316
- package/dist/icons-BqfV81R8.js.map +0 -1
- package/dist/icons.d.ts +0 -71
- package/dist/icons.d.ts.map +0 -1
- package/dist/icons.js +0 -3
- package/dist/index-CM70WSkA.d.ts +0 -36
- package/dist/index-CM70WSkA.d.ts.map +0 -1
- package/dist/index.d.ts +0 -331
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -89
- package/dist/index.js.map +0 -1
- package/dist/minimal-CDaU4avz.js +0 -162
- package/dist/minimal-CDaU4avz.js.map +0 -1
- package/dist/skins/frosted.css +0 -4
- package/dist/skins/frosted.d.ts +0 -2
- package/dist/skins/frosted.js +0 -9
- package/dist/skins/minimal.css +0 -4
- package/dist/skins/minimal.d.ts +0 -2
- package/dist/skins/minimal.js +0 -9
- package/dist/store-hGO5HE2A.js +0 -124
- package/dist/store-hGO5HE2A.js.map +0 -1
- package/dist/store.d.ts +0 -2
- package/dist/store.js +0 -6
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { renderElement } from "../../utils/use-render.js";
|
|
4
|
+
import { forwardRef } from "react";
|
|
5
|
+
|
|
6
|
+
//#region src/ui/time/time-separator.tsx
|
|
7
|
+
/**
|
|
8
|
+
* Divider between time values. Hidden from screen readers.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```tsx
|
|
12
|
+
* <Time.Separator />
|
|
13
|
+
* <Time.Separator> of </Time.Separator>
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
const Separator = forwardRef(function Separator(componentProps, forwardedRef) {
|
|
17
|
+
const { render, className, style, children = "/", ...elementProps } = componentProps;
|
|
18
|
+
return renderElement("span", {
|
|
19
|
+
render,
|
|
20
|
+
className,
|
|
21
|
+
style
|
|
22
|
+
}, {
|
|
23
|
+
state: {},
|
|
24
|
+
ref: [forwardedRef],
|
|
25
|
+
props: [{
|
|
26
|
+
"aria-hidden": "true",
|
|
27
|
+
children
|
|
28
|
+
}, elementProps]
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
//#endregion
|
|
33
|
+
export { Separator };
|
|
34
|
+
//# sourceMappingURL=time-separator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time-separator.js","names":[],"sources":["../../../../src/ui/time/time-separator.tsx"],"sourcesContent":["'use client';\n\nimport type { ForwardedRef, ReactNode } from 'react';\nimport { forwardRef } from 'react';\n\nimport type { UIComponentProps } from '../../utils/types';\nimport { renderElement } from '../../utils/use-render';\n\n// Empty state for Separator (no dynamic state)\ntype SeparatorState = Record<string, never>;\n\nexport interface SeparatorProps extends UIComponentProps<'span', SeparatorState> {\n /** Separator content. Defaults to \"/\". */\n children?: ReactNode | undefined;\n}\n\n/**\n * Divider between time values. Hidden from screen readers.\n *\n * @example\n * ```tsx\n * <Time.Separator />\n * <Time.Separator> of </Time.Separator>\n * ```\n */\nexport const Separator = forwardRef(function Separator(\n componentProps: SeparatorProps,\n forwardedRef: ForwardedRef<HTMLSpanElement>\n) {\n const { render, className, style, children = '/', ...elementProps } = componentProps;\n\n const state: SeparatorState = {};\n\n return renderElement(\n 'span',\n { render, className, style },\n {\n state,\n ref: [forwardedRef],\n props: [{ 'aria-hidden': 'true', children }, elementProps],\n }\n );\n});\n\nexport namespace Separator {\n export type Props = SeparatorProps;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAyBA,MAAa,YAAY,WAAW,SAAS,UAC3C,gBACA,cACA;CACA,MAAM,EAAE,QAAQ,WAAW,OAAO,WAAW,KAAK,GAAG,iBAAiB;AAItE,QAAO,cACL,QACA;EAAE;EAAQ;EAAW;EAAO,EAC5B;EACE,OAN0B,EAAE;EAO5B,KAAK,CAAC,aAAa;EACnB,OAAO,CAAC;GAAE,eAAe;GAAQ;GAAU,EAAE,aAAa;EAC3D,CACF;EACD"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { UIComponentProps } from "../../utils/types.js";
|
|
2
|
+
import * as react from "react";
|
|
3
|
+
import { TimeCore } from "@videojs/core";
|
|
4
|
+
|
|
5
|
+
//#region src/ui/time/time-value.d.ts
|
|
6
|
+
interface ValueProps extends Omit<UIComponentProps<'time', TimeCore.State>, 'children'>, TimeCore.Props {}
|
|
7
|
+
/**
|
|
8
|
+
* Displays a formatted time value (current, duration, or remaining).
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```tsx
|
|
12
|
+
* <Time.Value />
|
|
13
|
+
* <Time.Value type="duration" />
|
|
14
|
+
* <Time.Value type="remaining" negativeSign="−" />
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
declare const Value: react.ForwardRefExoticComponent<Omit<ValueProps, "ref"> & react.RefAttributes<HTMLTimeElement>>;
|
|
18
|
+
declare namespace Value {
|
|
19
|
+
type Props = ValueProps;
|
|
20
|
+
type State = TimeCore.State;
|
|
21
|
+
}
|
|
22
|
+
//#endregion
|
|
23
|
+
export { Value, ValueProps };
|
|
24
|
+
//# sourceMappingURL=time-value.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time-value.d.ts","names":[],"sources":["../../../../src/ui/time/time-value.tsx"],"mappings":";;;;;UAWiB,UAAA,SAAmB,IAAA,CAAK,gBAAA,SAAyB,QAAA,CAAS,KAAA,gBAAqB,QAAA,CAAS,KAAA;;AAAzG;;;;;;;;;cAYa,KAAA,EAAK,KAAA,CAAA,yBAAA,CAAA,IAAA,CAAA,UAAA,WAAA,KAAA,CAAA,aAAA,CAAA,eAAA;AAAA,kBA8CD,KAAA;EAAA,KACH,KAAA,GAAQ,UAAA;EAAA,KACR,KAAA,GAAQ,QAAA,CAAS,KAAA;AAAA"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { usePlayer } from "../../player/context.js";
|
|
4
|
+
import { renderElement } from "../../utils/use-render.js";
|
|
5
|
+
import { logMissingFeature, selectTime } from "@videojs/core/dom";
|
|
6
|
+
import { forwardRef, useState } from "react";
|
|
7
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
8
|
+
import { TimeCore, TimeDataAttrs } from "@videojs/core";
|
|
9
|
+
|
|
10
|
+
//#region src/ui/time/time-value.tsx
|
|
11
|
+
/**
|
|
12
|
+
* Displays a formatted time value (current, duration, or remaining).
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* <Time.Value />
|
|
17
|
+
* <Time.Value type="duration" />
|
|
18
|
+
* <Time.Value type="remaining" negativeSign="−" />
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
const Value = forwardRef(function Value(componentProps, forwardedRef) {
|
|
22
|
+
const { render, className, style, type, negativeSign, label, ...elementProps } = componentProps;
|
|
23
|
+
const time = usePlayer(selectTime);
|
|
24
|
+
const [core] = useState(() => new TimeCore());
|
|
25
|
+
core.setProps({
|
|
26
|
+
type,
|
|
27
|
+
negativeSign,
|
|
28
|
+
label
|
|
29
|
+
});
|
|
30
|
+
if (!time) {
|
|
31
|
+
logMissingFeature("Time.Value", "time");
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
const state = core.getState(time);
|
|
35
|
+
const content = state.negative ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", {
|
|
36
|
+
"aria-hidden": "true",
|
|
37
|
+
children: negativeSign ?? TimeCore.defaultProps.negativeSign
|
|
38
|
+
}), state.text] }) : state.text;
|
|
39
|
+
return renderElement("time", {
|
|
40
|
+
render,
|
|
41
|
+
className,
|
|
42
|
+
style
|
|
43
|
+
}, {
|
|
44
|
+
state,
|
|
45
|
+
stateAttrMap: TimeDataAttrs,
|
|
46
|
+
ref: [forwardedRef],
|
|
47
|
+
props: [{
|
|
48
|
+
dateTime: state.datetime,
|
|
49
|
+
children: content,
|
|
50
|
+
...core.getAttrs(state)
|
|
51
|
+
}, elementProps]
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
//#endregion
|
|
56
|
+
export { Value };
|
|
57
|
+
//# sourceMappingURL=time-value.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time-value.js","names":[],"sources":["../../../../src/ui/time/time-value.tsx"],"sourcesContent":["'use client';\n\nimport { TimeCore, TimeDataAttrs } from '@videojs/core';\nimport { logMissingFeature, selectTime } 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 ValueProps extends Omit<UIComponentProps<'time', TimeCore.State>, 'children'>, TimeCore.Props {}\n\n/**\n * Displays a formatted time value (current, duration, or remaining).\n *\n * @example\n * ```tsx\n * <Time.Value />\n * <Time.Value type=\"duration\" />\n * <Time.Value type=\"remaining\" negativeSign=\"−\" />\n * ```\n */\nexport const Value = forwardRef(function Value(\n componentProps: ValueProps,\n forwardedRef: ForwardedRef<HTMLTimeElement>\n) {\n const { render, className, style, type, negativeSign, label, ...elementProps } = componentProps;\n\n const time = usePlayer(selectTime);\n\n const [core] = useState(() => new TimeCore());\n core.setProps({ type, negativeSign, label });\n\n if (!time) {\n if (__DEV__) logMissingFeature('Time.Value', 'time');\n return null;\n }\n\n const state = core.getState(time);\n\n const content = state.negative ? (\n <>\n <span aria-hidden=\"true\">{negativeSign ?? TimeCore.defaultProps.negativeSign}</span>\n {state.text}\n </>\n ) : (\n state.text\n );\n\n return renderElement(\n 'time',\n { render, className, style },\n {\n state,\n stateAttrMap: TimeDataAttrs,\n ref: [forwardedRef],\n props: [\n {\n dateTime: state.datetime,\n children: content,\n ...core.getAttrs(state),\n },\n elementProps,\n ],\n }\n );\n});\n\nexport namespace Value {\n export type Props = ValueProps;\n export type State = TimeCore.State;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAuBA,MAAa,QAAQ,WAAW,SAAS,MACvC,gBACA,cACA;CACA,MAAM,EAAE,QAAQ,WAAW,OAAO,MAAM,cAAc,OAAO,GAAG,iBAAiB;CAEjF,MAAM,OAAO,UAAU,WAAW;CAElC,MAAM,CAAC,QAAQ,eAAe,IAAI,UAAU,CAAC;AAC7C,MAAK,SAAS;EAAE;EAAM;EAAc;EAAO,CAAC;AAE5C,KAAI,CAAC,MAAM;AACI,oBAAkB,cAAc,OAAO;AACpD,SAAO;;CAGT,MAAM,QAAQ,KAAK,SAAS,KAAK;CAEjC,MAAM,UAAU,MAAM,WACpB,4CACE,oBAAC;EAAK,eAAY;YAAQ,gBAAgB,SAAS,aAAa;GAAoB,EACnF,MAAM,QACN,GAEH,MAAM;AAGR,QAAO,cACL,QACA;EAAE;EAAQ;EAAW;EAAO,EAC5B;EACE;EACA,cAAc;EACd,KAAK,CAAC,aAAa;EACnB,OAAO,CACL;GACE,UAAU,MAAM;GAChB,UAAU;GACV,GAAG,KAAK,SAAS,MAAM;GACxB,EACD,aACD;EACF,CACF;EACD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
//#region src/utils/attach-media-element.ts
|
|
2
|
+
function attachMediaElement(media) {
|
|
3
|
+
return (element) => {
|
|
4
|
+
if (element) media.attach(element);
|
|
5
|
+
else media.detach();
|
|
6
|
+
return () => media.detach();
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
//#endregion
|
|
11
|
+
export { attachMediaElement };
|
|
12
|
+
//# sourceMappingURL=attach-media-element.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attach-media-element.js","names":[],"sources":["../../../src/utils/attach-media-element.ts"],"sourcesContent":["interface Attachable {\n attach(target: EventTarget): void;\n detach(): void;\n}\n\nexport function attachMediaElement<T extends HTMLVideoElement>(media: Attachable): (element: T | null) => void {\n return (element: T | null) => {\n if (element) {\n media.attach(element);\n } else {\n media.detach();\n }\n // React 19+ accepts a cleanup function as the return value\n return () => media.detach();\n };\n}\n"],"mappings":";AAKA,SAAgB,mBAA+C,OAAgD;AAC7G,SAAQ,YAAsB;AAC5B,MAAI,QACF,OAAM,OAAO,QAAQ;MAErB,OAAM,QAAQ;AAGhB,eAAa,MAAM,QAAQ"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//#region src/utils/media-props.ts
|
|
2
|
+
function mediaProps(media, props) {
|
|
3
|
+
const { src, ...remainingProps } = props;
|
|
4
|
+
if (props.preload && media.preload !== props.preload) media.preload = props.preload;
|
|
5
|
+
if (media.src !== src) media.src = src ?? "";
|
|
6
|
+
return remainingProps;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
//#endregion
|
|
10
|
+
export { mediaProps };
|
|
11
|
+
//# sourceMappingURL=media-props.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-props.js","names":[],"sources":["../../../src/utils/media-props.ts"],"sourcesContent":["import type { MediaApi } from '@videojs/core/dom';\nimport type { VideoHTMLAttributes } from 'react';\n\ninterface VideoProps extends VideoHTMLAttributes<HTMLVideoElement> {}\n\nexport function mediaProps(media: MediaApi, props: VideoProps) {\n const { src, ...remainingProps } = props;\n\n // Preload can still be passed as a prop to the native media element\n if (props.preload && media.preload !== props.preload) {\n media.preload = props.preload as '' | 'none' | 'metadata' | 'auto';\n }\n\n if (media.src !== src) {\n media.src = src ?? '';\n }\n\n // The remaining props are passed to the native media element\n return remainingProps;\n}\n"],"mappings":";AAKA,SAAgB,WAAW,OAAiB,OAAmB;CAC7D,MAAM,EAAE,KAAK,GAAG,mBAAmB;AAGnC,KAAI,MAAM,WAAW,MAAM,YAAY,MAAM,QAC3C,OAAM,UAAU,MAAM;AAGxB,KAAI,MAAM,QAAQ,IAChB,OAAM,MAAM,OAAO;AAIrB,QAAO"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { ComponentPropsWithRef, ElementType } from "react";
|
|
2
|
+
|
|
3
|
+
//#region src/utils/merge-props.d.ts
|
|
4
|
+
type Props<T extends ElementType = ElementType> = ComponentPropsWithRef<T>;
|
|
5
|
+
/**
|
|
6
|
+
* Merge multiple props objects.
|
|
7
|
+
*
|
|
8
|
+
* - Event handlers (on*): chained - external first, ours second
|
|
9
|
+
* - className: concatenated
|
|
10
|
+
* - style: merged objects (external wins conflicts)
|
|
11
|
+
* - other: last one wins
|
|
12
|
+
*
|
|
13
|
+
* @public
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* const merged = mergeProps(
|
|
17
|
+
* { onClick: ourHandler, className: 'base' },
|
|
18
|
+
* { onClick: theirHandler, className: 'custom' }
|
|
19
|
+
* );
|
|
20
|
+
* // { onClick: chainedHandler, className: 'custom base' }
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
declare function mergeProps<T extends ElementType>(...propSets: (Props<T> | undefined)[]): Props<T>;
|
|
24
|
+
//#endregion
|
|
25
|
+
export { mergeProps };
|
|
26
|
+
//# sourceMappingURL=merge-props.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-props.d.ts","names":[],"sources":["../../../src/utils/merge-props.ts"],"mappings":";;;KAIK,KAAA,WAAgB,WAAA,GAAc,WAAA,IAAe,qBAAA,CAAsB,CAAA;;AAFuB;;;;;;;;;;;;;;;;AAuG/F;iBAAgB,UAAA,WAAqB,WAAA,CAAA,CAAA,GAAgB,QAAA,GAAW,KAAA,CAAM,CAAA,mBAAoB,KAAA,CAAM,CAAA"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
//#region src/utils/merge-props.ts
|
|
4
|
+
/**
|
|
5
|
+
* Check if a key is an event handler key (on* with capital letter).
|
|
6
|
+
*/
|
|
7
|
+
function isEventHandlerKey(key) {
|
|
8
|
+
return key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && key.charCodeAt(2) >= 65 && key.charCodeAt(2) <= 90;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Check if a key/value pair is an event handler (includes undefined values).
|
|
12
|
+
*/
|
|
13
|
+
function isEventHandler(key, value) {
|
|
14
|
+
return isEventHandlerKey(key) && (typeof value === "function" || typeof value === "undefined");
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Merge two event handlers - external runs first, ours runs second.
|
|
18
|
+
*/
|
|
19
|
+
function mergeEventHandlers(ours, theirs) {
|
|
20
|
+
if (!theirs) return ours;
|
|
21
|
+
if (!ours) return theirs;
|
|
22
|
+
return (event) => {
|
|
23
|
+
theirs(event);
|
|
24
|
+
ours(event);
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Merge two className values - concatenate strings.
|
|
29
|
+
*/
|
|
30
|
+
function mergeClassNames(ours, theirs) {
|
|
31
|
+
if (theirs && ours) return `${theirs} ${ours}`;
|
|
32
|
+
return theirs || ours;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Merge two style objects - theirs overwrites conflicts.
|
|
36
|
+
*/
|
|
37
|
+
function mergeStyles(ours, theirs) {
|
|
38
|
+
if (!theirs) return ours;
|
|
39
|
+
if (!ours) return theirs;
|
|
40
|
+
return {
|
|
41
|
+
...ours,
|
|
42
|
+
...theirs
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Merge a single props object into accumulated result.
|
|
47
|
+
*/
|
|
48
|
+
function mergeOne(merged, props) {
|
|
49
|
+
if (!props) return merged;
|
|
50
|
+
for (const key in props) {
|
|
51
|
+
const value = props[key];
|
|
52
|
+
if (key === "className") merged.className = mergeClassNames(merged.className, value);
|
|
53
|
+
else if (key === "style") merged.style = mergeStyles(merged.style, value);
|
|
54
|
+
else if (isEventHandler(key, value)) merged[key] = mergeEventHandlers(merged[key], value);
|
|
55
|
+
else merged[key] = value;
|
|
56
|
+
}
|
|
57
|
+
return merged;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Merge multiple props objects.
|
|
61
|
+
*
|
|
62
|
+
* - Event handlers (on*): chained - external first, ours second
|
|
63
|
+
* - className: concatenated
|
|
64
|
+
* - style: merged objects (external wins conflicts)
|
|
65
|
+
* - other: last one wins
|
|
66
|
+
*
|
|
67
|
+
* @public
|
|
68
|
+
* @example
|
|
69
|
+
* ```ts
|
|
70
|
+
* const merged = mergeProps(
|
|
71
|
+
* { onClick: ourHandler, className: 'base' },
|
|
72
|
+
* { onClick: theirHandler, className: 'custom' }
|
|
73
|
+
* );
|
|
74
|
+
* // { onClick: chainedHandler, className: 'custom base' }
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
function mergeProps(...propSets) {
|
|
78
|
+
let merged = {};
|
|
79
|
+
for (const props of propSets) merged = mergeOne(merged, props);
|
|
80
|
+
return merged;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
//#endregion
|
|
84
|
+
export { mergeProps };
|
|
85
|
+
//# sourceMappingURL=merge-props.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-props.js","names":[],"sources":["../../../src/utils/merge-props.ts"],"sourcesContent":["'use client';\n\nimport type { ComponentPropsWithRef, CSSProperties, ElementType, SyntheticEvent } from 'react';\n\ntype Props<T extends ElementType = ElementType> = ComponentPropsWithRef<T>;\n\n/**\n * Check if a key is an event handler key (on* with capital letter).\n */\nfunction isEventHandlerKey(key: string): boolean {\n return (\n key.charCodeAt(0) === 111 /* o */ &&\n key.charCodeAt(1) === 110 /* n */ &&\n key.charCodeAt(2) >= 65 /* A */ &&\n key.charCodeAt(2) <= 90 /* Z */\n );\n}\n\n/**\n * Check if a key/value pair is an event handler (includes undefined values).\n */\nfunction isEventHandler(key: string, value: unknown): boolean {\n return isEventHandlerKey(key) && (typeof value === 'function' || typeof value === 'undefined');\n}\n\n/**\n * Merge two event handlers - external runs first, ours runs second.\n */\nfunction mergeEventHandlers(\n ours: ((event: SyntheticEvent) => void) | undefined,\n theirs: ((event: SyntheticEvent) => void) | undefined\n): ((event: SyntheticEvent) => void) | undefined {\n if (!theirs) return ours;\n if (!ours) return theirs;\n\n return (event: SyntheticEvent) => {\n theirs(event);\n ours(event);\n };\n}\n\n/**\n * Merge two className values - concatenate strings.\n */\nfunction mergeClassNames(ours: string | undefined, theirs: string | undefined): string | undefined {\n if (theirs && ours) return `${theirs} ${ours}`;\n return theirs || ours;\n}\n\n/**\n * Merge two style objects - theirs overwrites conflicts.\n */\nfunction mergeStyles(ours: CSSProperties | undefined, theirs: CSSProperties | undefined): CSSProperties | undefined {\n if (!theirs) return ours;\n if (!ours) return theirs;\n return { ...ours, ...theirs };\n}\n\n/**\n * Merge a single props object into accumulated result.\n */\nfunction mergeOne<T extends ElementType>(\n merged: Record<string, unknown>,\n props: Props<T> | undefined\n): Record<string, unknown> {\n if (!props) return merged;\n\n for (const key in props) {\n const value = props[key as keyof typeof props];\n\n if (key === 'className') {\n merged.className = mergeClassNames(merged.className as string | undefined, value as string);\n } else if (key === 'style') {\n merged.style = mergeStyles(merged.style as CSSProperties | undefined, value as CSSProperties);\n } else if (isEventHandler(key, value)) {\n merged[key] = mergeEventHandlers(\n merged[key] as ((event: SyntheticEvent) => void) | undefined,\n value as (event: SyntheticEvent) => void\n );\n } else {\n merged[key] = value;\n }\n }\n\n return merged;\n}\n\n/**\n * Merge multiple props objects.\n *\n * - Event handlers (on*): chained - external first, ours second\n * - className: concatenated\n * - style: merged objects (external wins conflicts)\n * - other: last one wins\n *\n * @public\n * @example\n * ```ts\n * const merged = mergeProps(\n * { onClick: ourHandler, className: 'base' },\n * { onClick: theirHandler, className: 'custom' }\n * );\n * // { onClick: chainedHandler, className: 'custom base' }\n * ```\n */\nexport function mergeProps<T extends ElementType>(...propSets: (Props<T> | undefined)[]): Props<T> {\n let merged: Record<string, unknown> = {};\n\n for (const props of propSets) {\n merged = mergeOne(merged, props);\n }\n\n return merged as Props<T>;\n}\n"],"mappings":";;;;;;AASA,SAAS,kBAAkB,KAAsB;AAC/C,QACE,IAAI,WAAW,EAAE,KAAK,OACtB,IAAI,WAAW,EAAE,KAAK,OACtB,IAAI,WAAW,EAAE,IAAI,MACrB,IAAI,WAAW,EAAE,IAAI;;;;;AAOzB,SAAS,eAAe,KAAa,OAAyB;AAC5D,QAAO,kBAAkB,IAAI,KAAK,OAAO,UAAU,cAAc,OAAO,UAAU;;;;;AAMpF,SAAS,mBACP,MACA,QAC+C;AAC/C,KAAI,CAAC,OAAQ,QAAO;AACpB,KAAI,CAAC,KAAM,QAAO;AAElB,SAAQ,UAA0B;AAChC,SAAO,MAAM;AACb,OAAK,MAAM;;;;;;AAOf,SAAS,gBAAgB,MAA0B,QAAgD;AACjG,KAAI,UAAU,KAAM,QAAO,GAAG,OAAO,GAAG;AACxC,QAAO,UAAU;;;;;AAMnB,SAAS,YAAY,MAAiC,QAA8D;AAClH,KAAI,CAAC,OAAQ,QAAO;AACpB,KAAI,CAAC,KAAM,QAAO;AAClB,QAAO;EAAE,GAAG;EAAM,GAAG;EAAQ;;;;;AAM/B,SAAS,SACP,QACA,OACyB;AACzB,KAAI,CAAC,MAAO,QAAO;AAEnB,MAAK,MAAM,OAAO,OAAO;EACvB,MAAM,QAAQ,MAAM;AAEpB,MAAI,QAAQ,YACV,QAAO,YAAY,gBAAgB,OAAO,WAAiC,MAAgB;WAClF,QAAQ,QACjB,QAAO,QAAQ,YAAY,OAAO,OAAoC,MAAuB;WACpF,eAAe,KAAK,MAAM,CACnC,QAAO,OAAO,mBACZ,OAAO,MACP,MACD;MAED,QAAO,OAAO;;AAIlB,QAAO;;;;;;;;;;;;;;;;;;;;AAqBT,SAAgB,WAAkC,GAAG,UAA8C;CACjG,IAAI,SAAkC,EAAE;AAExC,MAAK,MAAM,SAAS,SAClB,UAAS,SAAS,QAAQ,MAAM;AAGlC,QAAO"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { CSSProperties, ComponentPropsWithRef, ElementType, ReactElement } from "react";
|
|
2
|
+
|
|
3
|
+
//#region src/utils/types.d.ts
|
|
4
|
+
/** Props that can be spread on any HTML element. */
|
|
5
|
+
type HTMLProps<T = any> = React.HTMLAttributes<T> & {
|
|
6
|
+
ref?: React.Ref<T> | undefined;
|
|
7
|
+
};
|
|
8
|
+
/** Render function signature - receives props and state, returns element. */
|
|
9
|
+
type RenderFunction<Props, State> = (props: Props, state: State) => ReactElement | null;
|
|
10
|
+
/** Render prop - either a React element or a render function. */
|
|
11
|
+
type RenderProp<State> = ReactElement | RenderFunction<HTMLProps, State>;
|
|
12
|
+
/**
|
|
13
|
+
* Standard props for UI components.
|
|
14
|
+
*
|
|
15
|
+
* Provides consistent API across all UI components:
|
|
16
|
+
* - `className` as string or function of state
|
|
17
|
+
* - `style` as object or function of state
|
|
18
|
+
* - `render` prop for element customization
|
|
19
|
+
*/
|
|
20
|
+
type UIComponentProps<TagName extends keyof React.JSX.IntrinsicElements, State> = Omit<React.JSX.IntrinsicElements[TagName], 'className' | 'style'> & {
|
|
21
|
+
/** Class name or function returning class name from state. */className?: string | ((state: State) => string | undefined) | undefined; /** Style or function returning style from state. */
|
|
22
|
+
style?: CSSProperties | ((state: State) => CSSProperties | undefined) | undefined; /** Render prop for custom element. */
|
|
23
|
+
render?: RenderProp<State> | undefined;
|
|
24
|
+
};
|
|
25
|
+
//#endregion
|
|
26
|
+
export { HTMLProps, RenderFunction, RenderProp, UIComponentProps };
|
|
27
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","names":[],"sources":["../../../src/utils/types.ts"],"mappings":";;;;KAGY,SAAA,YAAqB,KAAA,CAAM,cAAA,CAAe,CAAA;EACpD,GAAA,GAAM,KAAA,CAAM,GAAA,CAAI,CAAA;AAAA;;KAIN,cAAA,kBAAgC,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,KAAA,KAAU,YAAA;;KAG/D,UAAA,UAAoB,YAAA,GAAe,cAAA,CAAe,SAAA,EAAW,KAAA;;;;;;;;;KAU7D,gBAAA,uBAAuC,KAAA,CAAM,GAAA,CAAI,iBAAA,WAA4B,IAAA,CACvF,KAAA,CAAM,GAAA,CAAI,iBAAA,CAAkB,OAAA;EAlBhB,8DAsBZ,SAAA,cAAuB,KAAA,EAAO,KAAA,sCAtBb;EAwBjB,KAAA,GAAQ,aAAA,KAAkB,KAAA,EAAO,KAAA,KAAU,aAAA,2BApBjC;EAsBV,MAAA,GAAS,UAAA,CAAW,KAAA;AAAA"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { useCallback } from "react";
|
|
4
|
+
import { isFunction } from "@videojs/utils/predicate";
|
|
5
|
+
|
|
6
|
+
//#region src/utils/use-composed-refs.ts
|
|
7
|
+
/**
|
|
8
|
+
* Set a given ref to a given value.
|
|
9
|
+
*
|
|
10
|
+
* Handles both callback refs and RefObject(s).
|
|
11
|
+
*
|
|
12
|
+
* @returns Cleanup function if the ref callback returned one (React 19+)
|
|
13
|
+
*/
|
|
14
|
+
function setRef(ref, value) {
|
|
15
|
+
if (isFunction(ref)) return ref(value);
|
|
16
|
+
else if (ref !== null && ref !== void 0) ref.current = value;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Compose multiple refs into a single callback ref.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```tsx
|
|
23
|
+
* const composedRef = composeRefs(ref1, ref2, ref3);
|
|
24
|
+
* return <div ref={composedRef} />;
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
function composeRefs(...refs) {
|
|
28
|
+
const flatRefs = refs.flat();
|
|
29
|
+
return (node) => {
|
|
30
|
+
const cleanups = flatRefs.map((ref) => setRef(ref, node));
|
|
31
|
+
if (cleanups.some(isFunction)) return () => {
|
|
32
|
+
for (let i = 0; i < cleanups.length; i++) {
|
|
33
|
+
const cleanup = cleanups[i];
|
|
34
|
+
if (isFunction(cleanup)) cleanup();
|
|
35
|
+
else setRef(flatRefs[i], null);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Hook that composes multiple refs into a single callback ref.
|
|
42
|
+
*
|
|
43
|
+
* Memoized for stable reference.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```tsx
|
|
47
|
+
* const composedRef = useComposedRefs(forwardedRef, localRef);
|
|
48
|
+
* return <div ref={composedRef} />;
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
function useComposedRefs(...refs) {
|
|
52
|
+
return useCallback(composeRefs(...refs), [...refs]);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
//#endregion
|
|
56
|
+
export { composeRefs, useComposedRefs };
|
|
57
|
+
//# sourceMappingURL=use-composed-refs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-composed-refs.js","names":[],"sources":["../../../src/utils/use-composed-refs.ts"],"sourcesContent":["'use client';\n\nimport { isFunction } from '@videojs/utils/predicate';\nimport type { Ref, RefCallback } from 'react';\n\nimport { useCallback } from 'react';\n\ntype OptionalRef<T> = Ref<T> | undefined;\n\n/**\n * Set a given ref to a given value.\n *\n * Handles both callback refs and RefObject(s).\n *\n * @returns Cleanup function if the ref callback returned one (React 19+)\n */\nfunction setRef<T>(ref: OptionalRef<T>, value: T): (() => void) | void | undefined {\n if (isFunction(ref)) {\n return ref(value);\n } else if (ref !== null && ref !== undefined) {\n ref.current = value;\n }\n}\n\n/**\n * Compose multiple refs into a single callback ref.\n *\n * @example\n * ```tsx\n * const composedRef = composeRefs(ref1, ref2, ref3);\n * return <div ref={composedRef} />;\n * ```\n */\nexport function composeRefs<T>(...refs: (OptionalRef<T> | OptionalRef<T>[])[]): RefCallback<T> {\n const flatRefs = refs.flat();\n\n return (node): (() => void) | void => {\n const cleanups = flatRefs.map((ref) => setRef(ref, node));\n\n // Only return cleanup if any refs returned one (React 19+).\n // React 18 handles cleanup by calling the ref callback with null.\n if (cleanups.some(isFunction)) {\n return () => {\n for (let i = 0; i < cleanups.length; i++) {\n const cleanup = cleanups[i];\n if (isFunction(cleanup)) {\n cleanup();\n } else {\n setRef(flatRefs[i], null);\n }\n }\n };\n }\n };\n}\n\n/**\n * Hook that composes multiple refs into a single callback ref.\n *\n * Memoized for stable reference.\n *\n * @example\n * ```tsx\n * const composedRef = useComposedRefs(forwardedRef, localRef);\n * return <div ref={composedRef} />;\n * ```\n */\nexport function useComposedRefs<T>(...refs: OptionalRef<T>[]): RefCallback<T> {\n return useCallback(composeRefs(...refs), [...refs]);\n}\n"],"mappings":";;;;;;;;;;;;;AAgBA,SAAS,OAAU,KAAqB,OAA2C;AACjF,KAAI,WAAW,IAAI,CACjB,QAAO,IAAI,MAAM;UACR,QAAQ,QAAQ,QAAQ,OACjC,KAAI,UAAU;;;;;;;;;;;AAalB,SAAgB,YAAe,GAAG,MAA6D;CAC7F,MAAM,WAAW,KAAK,MAAM;AAE5B,SAAQ,SAA8B;EACpC,MAAM,WAAW,SAAS,KAAK,QAAQ,OAAO,KAAK,KAAK,CAAC;AAIzD,MAAI,SAAS,KAAK,WAAW,CAC3B,cAAa;AACX,QAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;IACxC,MAAM,UAAU,SAAS;AACzB,QAAI,WAAW,QAAQ,CACrB,UAAS;QAET,QAAO,SAAS,IAAI,KAAK;;;;;;;;;;;;;;;;AAmBrC,SAAgB,gBAAmB,GAAG,MAAwC;AAC5E,QAAO,YAAY,YAAY,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { RenderProp } from "./types.js";
|
|
2
|
+
import { StateAttrMap } from "@videojs/core/dom";
|
|
3
|
+
import { CSSProperties, ReactElement, Ref } from "react";
|
|
4
|
+
|
|
5
|
+
//#region src/utils/use-render.d.ts
|
|
6
|
+
type IntrinsicTagName = keyof React.JSX.IntrinsicElements;
|
|
7
|
+
interface UseRenderComponentProps<State> {
|
|
8
|
+
className?: string | ((state: State) => string | undefined) | undefined;
|
|
9
|
+
style?: CSSProperties | ((state: State) => CSSProperties | undefined) | undefined;
|
|
10
|
+
render?: RenderProp<State> | undefined;
|
|
11
|
+
}
|
|
12
|
+
interface UseRenderParameters<State, RenderedElementType extends Element> {
|
|
13
|
+
state: State;
|
|
14
|
+
ref?: Ref<RenderedElementType> | Ref<RenderedElementType>[] | undefined;
|
|
15
|
+
props?: object | object[] | undefined;
|
|
16
|
+
stateAttrMap?: StateAttrMap<State> | undefined;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Render a UI component element.
|
|
20
|
+
*
|
|
21
|
+
* Handles:
|
|
22
|
+
* - Default tag rendering
|
|
23
|
+
* - Render prop (element or function)
|
|
24
|
+
* - Props merging (event handlers chained, className concatenated, style merged)
|
|
25
|
+
* - Ref composition
|
|
26
|
+
* - className/style as functions of state
|
|
27
|
+
*
|
|
28
|
+
* @public
|
|
29
|
+
* @example
|
|
30
|
+
* ```tsx
|
|
31
|
+
* return renderElement('button', componentProps, {
|
|
32
|
+
* state,
|
|
33
|
+
* ref: [forwardedRef, buttonRef],
|
|
34
|
+
* props: [{ type: 'button' }, elementProps, getButtonProps],
|
|
35
|
+
* });
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
declare function renderElement<State extends object, RenderedElementType extends Element, TagName extends IntrinsicTagName>(element: TagName, componentProps: UseRenderComponentProps<State>, params: UseRenderParameters<State, RenderedElementType>): ReactElement | null;
|
|
39
|
+
declare namespace renderElement {
|
|
40
|
+
type ComponentProps<State> = UseRenderComponentProps<State>;
|
|
41
|
+
type Parameters<State, RenderedElementType extends Element> = UseRenderParameters<State, RenderedElementType>;
|
|
42
|
+
}
|
|
43
|
+
//#endregion
|
|
44
|
+
export { renderElement };
|
|
45
|
+
//# sourceMappingURL=use-render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-render.d.ts","names":[],"sources":["../../../src/utils/use-render.tsx"],"mappings":";;;;;KAUK,gBAAA,SAAyB,KAAA,CAAM,GAAA,CAAI,iBAAA;AAAA,UAEvB,uBAAA;EACf,SAAA,cAAuB,KAAA,EAAO,KAAA;EAC9B,KAAA,GAAQ,aAAA,KAAkB,KAAA,EAAO,KAAA,KAAU,aAAA;EAC3C,MAAA,GAAS,UAAA,CAAW,KAAA;AAAA;AAAA,UAGL,mBAAA,oCAAuD,OAAA;EACtE,KAAA,EAAO,KAAA;EACP,GAAA,GAAM,GAAA,CAAI,mBAAA,IAAuB,GAAA,CAAI,mBAAA;EACrC,KAAA;EACA,YAAA,GAAe,YAAA,CAAa,KAAA;AAAA;;;;;;;;;;;;;;;;;;;;;iBA4Cd,aAAA,mDAEc,OAAA,kBACZ,gBAAA,CAAA,CAEhB,OAAA,EAAS,OAAA,EACT,cAAA,EAAgB,uBAAA,CAAwB,KAAA,GACxC,MAAA,EAAQ,mBAAA,CAAoB,KAAA,EAAO,mBAAA,IAClC,YAAA;AAAA,kBAgDc,aAAA;EAAA,KACH,cAAA,UAAwB,uBAAA,CAAwB,KAAA;EAAA,KAChD,UAAA,oCAA8C,OAAA,IAAW,mBAAA,CAAoB,KAAA,EAAO,mBAAA;AAAA"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { composeRefs } from "./use-composed-refs.js";
|
|
4
|
+
import { mergeProps } from "./merge-props.js";
|
|
5
|
+
import { getStateDataAttrs } from "@videojs/core/dom";
|
|
6
|
+
import { cloneElement, createElement, isValidElement } from "react";
|
|
7
|
+
import { isFunction } from "@videojs/utils/predicate";
|
|
8
|
+
|
|
9
|
+
//#region src/utils/use-render.tsx
|
|
10
|
+
function resolveClassName(className, state) {
|
|
11
|
+
return isFunction(className) ? className(state) : className;
|
|
12
|
+
}
|
|
13
|
+
function resolveStyle(style, state) {
|
|
14
|
+
return isFunction(style) ? style(state) : style;
|
|
15
|
+
}
|
|
16
|
+
function getElementRef(element) {
|
|
17
|
+
const elementAny = element;
|
|
18
|
+
return elementAny.ref ?? elementAny.props?.ref;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Render a UI component element.
|
|
22
|
+
*
|
|
23
|
+
* Handles:
|
|
24
|
+
* - Default tag rendering
|
|
25
|
+
* - Render prop (element or function)
|
|
26
|
+
* - Props merging (event handlers chained, className concatenated, style merged)
|
|
27
|
+
* - Ref composition
|
|
28
|
+
* - className/style as functions of state
|
|
29
|
+
*
|
|
30
|
+
* @public
|
|
31
|
+
* @example
|
|
32
|
+
* ```tsx
|
|
33
|
+
* return renderElement('button', componentProps, {
|
|
34
|
+
* state,
|
|
35
|
+
* ref: [forwardedRef, buttonRef],
|
|
36
|
+
* props: [{ type: 'button' }, elementProps, getButtonProps],
|
|
37
|
+
* });
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
function renderElement(element, componentProps, params) {
|
|
41
|
+
const { className: classNameProp, style: styleProp, render } = componentProps;
|
|
42
|
+
const { state, ref, props, stateAttrMap } = params;
|
|
43
|
+
const className = resolveClassName(classNameProp, state);
|
|
44
|
+
const style = resolveStyle(styleProp, state);
|
|
45
|
+
const mergedProps = mergeProps(getStateDataAttrs(state, stateAttrMap), ...Array.isArray(props) ? props : props ? [props] : []);
|
|
46
|
+
if (className !== void 0) mergedProps.className = mergedProps.className ? `${mergedProps.className} ${className}` : className;
|
|
47
|
+
if (style !== void 0) mergedProps.style = mergedProps.style ? {
|
|
48
|
+
...mergedProps.style,
|
|
49
|
+
...style
|
|
50
|
+
} : style;
|
|
51
|
+
if (isFunction(render)) {
|
|
52
|
+
const mergedRef = composeRefs(ref, mergedProps.ref);
|
|
53
|
+
return render({
|
|
54
|
+
...mergedProps,
|
|
55
|
+
ref: mergedRef
|
|
56
|
+
}, state);
|
|
57
|
+
}
|
|
58
|
+
if (isValidElement(render)) {
|
|
59
|
+
const elementRef = getElementRef(render);
|
|
60
|
+
const mergedRef = composeRefs(ref, mergedProps.ref, elementRef);
|
|
61
|
+
const elementProps = mergeProps(mergedProps, render.props);
|
|
62
|
+
elementProps.ref = mergedRef;
|
|
63
|
+
return cloneElement(render, elementProps);
|
|
64
|
+
}
|
|
65
|
+
mergedProps.ref = composeRefs(ref, mergedProps.ref);
|
|
66
|
+
return createElement(element, mergedProps);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
//#endregion
|
|
70
|
+
export { renderElement };
|
|
71
|
+
//# sourceMappingURL=use-render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-render.js","names":[],"sources":["../../../src/utils/use-render.tsx"],"sourcesContent":["'use client';\n\nimport { getStateDataAttrs, type StateAttrMap } from '@videojs/core/dom';\nimport { isFunction } from '@videojs/utils/predicate';\nimport type { CSSProperties, ReactElement, Ref } from 'react';\nimport { cloneElement, createElement, isValidElement } from 'react';\nimport { mergeProps } from './merge-props';\nimport type { HTMLProps, RenderProp } from './types';\nimport { composeRefs } from './use-composed-refs';\n\ntype IntrinsicTagName = keyof React.JSX.IntrinsicElements;\n\nexport interface UseRenderComponentProps<State> {\n className?: string | ((state: State) => string | undefined) | undefined;\n style?: CSSProperties | ((state: State) => CSSProperties | undefined) | undefined;\n render?: RenderProp<State> | undefined;\n}\n\nexport interface UseRenderParameters<State, RenderedElementType extends Element> {\n state: State;\n ref?: Ref<RenderedElementType> | Ref<RenderedElementType>[] | undefined;\n props?: object | object[] | undefined;\n stateAttrMap?: StateAttrMap<State> | undefined;\n}\n\nfunction resolveClassName<State>(\n className: string | ((state: State) => string | undefined) | undefined,\n state: State\n): string | undefined {\n return isFunction(className) ? className(state) : className;\n}\n\nfunction resolveStyle<State>(\n style: CSSProperties | ((state: State) => CSSProperties | undefined) | undefined,\n state: State\n): CSSProperties | undefined {\n return isFunction(style) ? style(state) : style;\n}\n\nfunction getElementRef(element: ReactElement): Ref<unknown> | undefined {\n // React 19+ uses element.props.ref, older versions use element.ref\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const elementAny = element as any;\n return elementAny.ref ?? elementAny.props?.ref;\n}\n\n/**\n * Render a UI component element.\n *\n * Handles:\n * - Default tag rendering\n * - Render prop (element or function)\n * - Props merging (event handlers chained, className concatenated, style merged)\n * - Ref composition\n * - className/style as functions of state\n *\n * @public\n * @example\n * ```tsx\n * return renderElement('button', componentProps, {\n * state,\n * ref: [forwardedRef, buttonRef],\n * props: [{ type: 'button' }, elementProps, getButtonProps],\n * });\n * ```\n */\nexport function renderElement<\n State extends object,\n RenderedElementType extends Element,\n TagName extends IntrinsicTagName,\n>(\n element: TagName,\n componentProps: UseRenderComponentProps<State>,\n params: UseRenderParameters<State, RenderedElementType>\n): ReactElement | null {\n const { className: classNameProp, style: styleProp, render } = componentProps;\n const { state, ref, props, stateAttrMap } = params;\n\n // Resolve className and style if they're functions\n const className = resolveClassName(classNameProp, state);\n const style = resolveStyle(styleProp, state);\n\n // Generate data attributes from state\n const stateDataAttrs = getStateDataAttrs(state, stateAttrMap);\n\n // Merge: state data attrs first, then props (so props can override)\n const propsArray = Array.isArray(props) ? props : props ? [props] : [];\n const mergedProps = mergeProps(stateDataAttrs, ...(propsArray as Record<string, unknown>[]));\n\n if (className !== undefined) {\n // Add resolved className and style\n mergedProps.className = mergedProps.className ? `${mergedProps.className} ${className}` : className;\n }\n\n if (style !== undefined) {\n mergedProps.style = mergedProps.style ? { ...(mergedProps.style as CSSProperties), ...style } : style;\n }\n\n if (isFunction(render)) {\n // Render function: call with props and state\n const mergedRef = composeRefs(ref, mergedProps.ref);\n return render({ ...mergedProps, ref: mergedRef } as HTMLProps, state);\n }\n\n if (isValidElement(render)) {\n const elementRef = getElementRef(render);\n\n const mergedRef = composeRefs(ref, mergedProps.ref, elementRef);\n\n const elementProps = mergeProps(mergedProps, render.props as Record<string, unknown>);\n elementProps.ref = mergedRef;\n\n return cloneElement(render, elementProps);\n }\n\n // Default tag\n const mergedRef = composeRefs(ref, mergedProps.ref);\n mergedProps.ref = mergedRef;\n\n return createElement(element, mergedProps);\n}\n\nexport namespace renderElement {\n export type ComponentProps<State> = UseRenderComponentProps<State>;\n export type Parameters<State, RenderedElementType extends Element> = UseRenderParameters<State, RenderedElementType>;\n}\n"],"mappings":";;;;;;;;;AAyBA,SAAS,iBACP,WACA,OACoB;AACpB,QAAO,WAAW,UAAU,GAAG,UAAU,MAAM,GAAG;;AAGpD,SAAS,aACP,OACA,OAC2B;AAC3B,QAAO,WAAW,MAAM,GAAG,MAAM,MAAM,GAAG;;AAG5C,SAAS,cAAc,SAAiD;CAGtE,MAAM,aAAa;AACnB,QAAO,WAAW,OAAO,WAAW,OAAO;;;;;;;;;;;;;;;;;;;;;;AAuB7C,SAAgB,cAKd,SACA,gBACA,QACqB;CACrB,MAAM,EAAE,WAAW,eAAe,OAAO,WAAW,WAAW;CAC/D,MAAM,EAAE,OAAO,KAAK,OAAO,iBAAiB;CAG5C,MAAM,YAAY,iBAAiB,eAAe,MAAM;CACxD,MAAM,QAAQ,aAAa,WAAW,MAAM;CAO5C,MAAM,cAAc,WAJG,kBAAkB,OAAO,aAAa,EAId,GAD5B,MAAM,QAAQ,MAAM,GAAG,QAAQ,QAAQ,CAAC,MAAM,GAAG,EAAE,CACsB;AAE5F,KAAI,cAAc,OAEhB,aAAY,YAAY,YAAY,YAAY,GAAG,YAAY,UAAU,GAAG,cAAc;AAG5F,KAAI,UAAU,OACZ,aAAY,QAAQ,YAAY,QAAQ;EAAE,GAAI,YAAY;EAAyB,GAAG;EAAO,GAAG;AAGlG,KAAI,WAAW,OAAO,EAAE;EAEtB,MAAM,YAAY,YAAY,KAAK,YAAY,IAAI;AACnD,SAAO,OAAO;GAAE,GAAG;GAAa,KAAK;GAAW,EAAe,MAAM;;AAGvE,KAAI,eAAe,OAAO,EAAE;EAC1B,MAAM,aAAa,cAAc,OAAO;EAExC,MAAM,YAAY,YAAY,KAAK,YAAY,KAAK,WAAW;EAE/D,MAAM,eAAe,WAAW,aAAa,OAAO,MAAiC;AACrF,eAAa,MAAM;AAEnB,SAAO,aAAa,QAAQ,aAAa;;AAK3C,aAAY,MADM,YAAY,KAAK,YAAY,IAAI;AAGnD,QAAO,cAAc,SAAS,YAAY"}
|