@hanifhan1f/vidstack-react 1.12.13
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/.templates/sandbox/document.css +27 -0
- package/.templates/sandbox/favicon-32x32.png +0 -0
- package/.templates/sandbox/index.html +21 -0
- package/.templates/sandbox/main.tsx +12 -0
- package/.templates/sandbox/player.css +39 -0
- package/.templates/sandbox/player.tsx +121 -0
- package/.templates/sandbox/tracks.ts +23 -0
- package/LICENSE +21 -0
- package/README.md +23 -0
- package/analyze.config.ts +7 -0
- package/build/build-icons.js +62 -0
- package/npm/analyze.json.d.ts +7 -0
- package/package.json +162 -0
- package/rollup.config.ts +256 -0
- package/src/components/announcer.tsx +47 -0
- package/src/components/layouts/default/audio-layout.tsx +231 -0
- package/src/components/layouts/default/context.ts +28 -0
- package/src/components/layouts/default/hooks.ts +13 -0
- package/src/components/layouts/default/icons.tsx +225 -0
- package/src/components/layouts/default/index.ts +11 -0
- package/src/components/layouts/default/media-layout.tsx +259 -0
- package/src/components/layouts/default/slots.tsx +98 -0
- package/src/components/layouts/default/ui/announcer.tsx +22 -0
- package/src/components/layouts/default/ui/buttons.tsx +301 -0
- package/src/components/layouts/default/ui/captions.tsx +16 -0
- package/src/components/layouts/default/ui/controls.tsx +12 -0
- package/src/components/layouts/default/ui/keyboard-display.tsx +132 -0
- package/src/components/layouts/default/ui/menus/accessibility-menu.tsx +100 -0
- package/src/components/layouts/default/ui/menus/audio-menu.tsx +167 -0
- package/src/components/layouts/default/ui/menus/captions-menu.tsx +61 -0
- package/src/components/layouts/default/ui/menus/chapters-menu.tsx +132 -0
- package/src/components/layouts/default/ui/menus/font-menu.tsx +331 -0
- package/src/components/layouts/default/ui/menus/items/menu-checkbox.tsx +72 -0
- package/src/components/layouts/default/ui/menus/items/menu-items.tsx +135 -0
- package/src/components/layouts/default/ui/menus/items/menu-slider.tsx +92 -0
- package/src/components/layouts/default/ui/menus/playback-menu.tsx +232 -0
- package/src/components/layouts/default/ui/menus/settings-menu.tsx +114 -0
- package/src/components/layouts/default/ui/menus/utils.ts +12 -0
- package/src/components/layouts/default/ui/sliders.tsx +136 -0
- package/src/components/layouts/default/ui/time.tsx +73 -0
- package/src/components/layouts/default/ui/title.tsx +24 -0
- package/src/components/layouts/default/ui/tooltip.tsx +27 -0
- package/src/components/layouts/default/ui.ts +8 -0
- package/src/components/layouts/default/video-layout.tsx +344 -0
- package/src/components/layouts/plyr/context.ts +26 -0
- package/src/components/layouts/plyr/icons/plyr-airplay.js +1 -0
- package/src/components/layouts/plyr/icons/plyr-captions-off.js +1 -0
- package/src/components/layouts/plyr/icons/plyr-captions-on.js +1 -0
- package/src/components/layouts/plyr/icons/plyr-download.js +1 -0
- package/src/components/layouts/plyr/icons/plyr-enter-fullscreen.js +1 -0
- package/src/components/layouts/plyr/icons/plyr-exit-fullscreen.js +1 -0
- package/src/components/layouts/plyr/icons/plyr-fast-forward.js +1 -0
- package/src/components/layouts/plyr/icons/plyr-muted.js +1 -0
- package/src/components/layouts/plyr/icons/plyr-pause.js +1 -0
- package/src/components/layouts/plyr/icons/plyr-pip.js +1 -0
- package/src/components/layouts/plyr/icons/plyr-play.js +1 -0
- package/src/components/layouts/plyr/icons/plyr-restart.js +1 -0
- package/src/components/layouts/plyr/icons/plyr-rewind.js +1 -0
- package/src/components/layouts/plyr/icons/plyr-settings.js +1 -0
- package/src/components/layouts/plyr/icons/plyr-volume.js +1 -0
- package/src/components/layouts/plyr/icons.tsx +71 -0
- package/src/components/layouts/plyr/index.ts +11 -0
- package/src/components/layouts/plyr/layout.tsx +1024 -0
- package/src/components/layouts/plyr/props.ts +104 -0
- package/src/components/layouts/plyr/slots.tsx +52 -0
- package/src/components/layouts/remotion-ui.ts +13 -0
- package/src/components/layouts/utils.ts +17 -0
- package/src/components/player-callbacks.ts +67 -0
- package/src/components/player.tsx +67 -0
- package/src/components/primitives/instances.ts +92 -0
- package/src/components/primitives/nodes.tsx +58 -0
- package/src/components/primitives/slot.tsx +132 -0
- package/src/components/provider.tsx +187 -0
- package/src/components/text-track.tsx +106 -0
- package/src/components/ui/buttons/airplay-button.tsx +53 -0
- package/src/components/ui/buttons/caption-button.tsx +55 -0
- package/src/components/ui/buttons/fullscreen-button.tsx +55 -0
- package/src/components/ui/buttons/google-cast-button.tsx +53 -0
- package/src/components/ui/buttons/live-button.tsx +56 -0
- package/src/components/ui/buttons/mute-button.tsx +60 -0
- package/src/components/ui/buttons/pip-button.tsx +54 -0
- package/src/components/ui/buttons/play-button.tsx +53 -0
- package/src/components/ui/buttons/seek-button.tsx +55 -0
- package/src/components/ui/buttons/toggle-button.tsx +51 -0
- package/src/components/ui/caption.tsx +70 -0
- package/src/components/ui/captions.tsx +41 -0
- package/src/components/ui/chapter-title.tsx +40 -0
- package/src/components/ui/controls.tsx +90 -0
- package/src/components/ui/gesture.tsx +43 -0
- package/src/components/ui/menu.tsx +251 -0
- package/src/components/ui/poster.tsx +101 -0
- package/src/components/ui/radio-group.tsx +88 -0
- package/src/components/ui/sliders/audio-gain-slider.tsx +55 -0
- package/src/components/ui/sliders/quality-slider.tsx +54 -0
- package/src/components/ui/sliders/slider-callbacks.ts +14 -0
- package/src/components/ui/sliders/slider-value.tsx +13 -0
- package/src/components/ui/sliders/slider.tsx +254 -0
- package/src/components/ui/sliders/speed-slider.tsx +54 -0
- package/src/components/ui/sliders/time-slider.tsx +379 -0
- package/src/components/ui/sliders/volume-slider.tsx +55 -0
- package/src/components/ui/spinner.tsx +105 -0
- package/src/components/ui/thumbnail.tsx +82 -0
- package/src/components/ui/time.tsx +77 -0
- package/src/components/ui/title.tsx +32 -0
- package/src/components/ui/tooltip.tsx +135 -0
- package/src/globals.d.ts +3 -0
- package/src/hooks/create-text-track.ts +22 -0
- package/src/hooks/options/use-audio-gain-options.ts +75 -0
- package/src/hooks/options/use-audio-options.ts +71 -0
- package/src/hooks/options/use-caption-options.ts +95 -0
- package/src/hooks/options/use-chapter-options.ts +97 -0
- package/src/hooks/options/use-playback-rate-options.ts +75 -0
- package/src/hooks/options/use-video-quality-options.ts +123 -0
- package/src/hooks/use-active-text-cues.ts +28 -0
- package/src/hooks/use-active-text-track.ts +19 -0
- package/src/hooks/use-chapter-title.ts +12 -0
- package/src/hooks/use-dom.ts +121 -0
- package/src/hooks/use-media-context.ts +6 -0
- package/src/hooks/use-media-player.ts +19 -0
- package/src/hooks/use-media-provider.ts +31 -0
- package/src/hooks/use-media-remote.ts +37 -0
- package/src/hooks/use-media-state.ts +58 -0
- package/src/hooks/use-signals.ts +24 -0
- package/src/hooks/use-slider-preview.ts +126 -0
- package/src/hooks/use-slider-state.ts +63 -0
- package/src/hooks/use-state.ts +47 -0
- package/src/hooks/use-text-cues.ts +33 -0
- package/src/hooks/use-thumbnails.ts +69 -0
- package/src/icon.ts +37 -0
- package/src/icons.ts +754 -0
- package/src/index.ts +181 -0
- package/src/providers/remotion/index.ts +10 -0
- package/src/providers/remotion/layout-engine.ts +123 -0
- package/src/providers/remotion/loader.ts +35 -0
- package/src/providers/remotion/playback-engine.ts +142 -0
- package/src/providers/remotion/provider.tsx +514 -0
- package/src/providers/remotion/type-check.ts +13 -0
- package/src/providers/remotion/types.ts +94 -0
- package/src/providers/remotion/ui/context.tsx +120 -0
- package/src/providers/remotion/ui/error-boundary.tsx +57 -0
- package/src/providers/remotion/ui/poster.tsx +33 -0
- package/src/providers/remotion/ui/slider-thumbnail.tsx +41 -0
- package/src/providers/remotion/ui/thumbnail.tsx +166 -0
- package/src/providers/remotion/validate.ts +220 -0
- package/src/source.ts +5 -0
- package/src/utils.ts +27 -0
- package/tsconfig.build.json +10 -0
- package/tsconfig.json +11 -0
- package/types/react/src/components/announcer.d.ts +16 -0
- package/types/react/src/components/layouts/default/audio-layout.d.ts +27 -0
- package/types/react/src/components/layouts/default/context.d.ts +14 -0
- package/types/react/src/components/layouts/default/hooks.d.ts +2 -0
- package/types/react/src/components/layouts/default/icons.d.ts +95 -0
- package/types/react/src/components/layouts/default/index.d.ts +5 -0
- package/types/react/src/components/layouts/default/media-layout.d.ts +133 -0
- package/types/react/src/components/layouts/default/slots.d.ts +22 -0
- package/types/react/src/components/layouts/default/ui/announcer.d.ts +6 -0
- package/types/react/src/components/layouts/default/ui/buttons.d.ts +54 -0
- package/types/react/src/components/layouts/default/ui/captions.d.ts +6 -0
- package/types/react/src/components/layouts/default/ui/controls.d.ts +6 -0
- package/types/react/src/components/layouts/default/ui/keyboard-display.d.ts +8 -0
- package/types/react/src/components/layouts/default/ui/menus/accessibility-menu.d.ts +10 -0
- package/types/react/src/components/layouts/default/ui/menus/audio-menu.d.ts +10 -0
- package/types/react/src/components/layouts/default/ui/menus/captions-menu.d.ts +10 -0
- package/types/react/src/components/layouts/default/ui/menus/chapters-menu.d.ts +7 -0
- package/types/react/src/components/layouts/default/ui/menus/font-menu.d.ts +6 -0
- package/types/react/src/components/layouts/default/ui/menus/items/menu-checkbox.d.ts +13 -0
- package/types/react/src/components/layouts/default/ui/menus/items/menu-items.d.ts +49 -0
- package/types/react/src/components/layouts/default/ui/menus/items/menu-slider.d.ts +26 -0
- package/types/react/src/components/layouts/default/ui/menus/playback-menu.d.ts +10 -0
- package/types/react/src/components/layouts/default/ui/menus/settings-menu.d.ts +15 -0
- package/types/react/src/components/layouts/default/ui/menus/utils.d.ts +1 -0
- package/types/react/src/components/layouts/default/ui/sliders.d.ts +24 -0
- package/types/react/src/components/layouts/default/ui/time.d.ts +30 -0
- package/types/react/src/components/layouts/default/ui/title.d.ts +6 -0
- package/types/react/src/components/layouts/default/ui/tooltip.d.ts +12 -0
- package/types/react/src/components/layouts/default/ui.d.ts +8 -0
- package/types/react/src/components/layouts/default/video-layout.d.ts +47 -0
- package/types/react/src/components/layouts/plyr/context.d.ts +12 -0
- package/types/react/src/components/layouts/plyr/icons/plyr-airplay.d.ts +2 -0
- package/types/react/src/components/layouts/plyr/icons/plyr-captions-off.d.ts +2 -0
- package/types/react/src/components/layouts/plyr/icons/plyr-captions-on.d.ts +2 -0
- package/types/react/src/components/layouts/plyr/icons/plyr-download.d.ts +2 -0
- package/types/react/src/components/layouts/plyr/icons/plyr-enter-fullscreen.d.ts +2 -0
- package/types/react/src/components/layouts/plyr/icons/plyr-exit-fullscreen.d.ts +2 -0
- package/types/react/src/components/layouts/plyr/icons/plyr-fast-forward.d.ts +2 -0
- package/types/react/src/components/layouts/plyr/icons/plyr-muted.d.ts +2 -0
- package/types/react/src/components/layouts/plyr/icons/plyr-pause.d.ts +2 -0
- package/types/react/src/components/layouts/plyr/icons/plyr-pip.d.ts +2 -0
- package/types/react/src/components/layouts/plyr/icons/plyr-play.d.ts +2 -0
- package/types/react/src/components/layouts/plyr/icons/plyr-restart.d.ts +2 -0
- package/types/react/src/components/layouts/plyr/icons/plyr-rewind.d.ts +2 -0
- package/types/react/src/components/layouts/plyr/icons/plyr-settings.d.ts +2 -0
- package/types/react/src/components/layouts/plyr/icons/plyr-volume.d.ts +2 -0
- package/types/react/src/components/layouts/plyr/icons.d.ts +25 -0
- package/types/react/src/components/layouts/plyr/index.d.ts +6 -0
- package/types/react/src/components/layouts/plyr/layout.d.ts +17 -0
- package/types/react/src/components/layouts/plyr/props.d.ts +71 -0
- package/types/react/src/components/layouts/plyr/slots.d.ts +9 -0
- package/types/react/src/components/layouts/remotion-ui.d.ts +3 -0
- package/types/react/src/components/layouts/utils.d.ts +1 -0
- package/types/react/src/components/player-callbacks.d.ts +6 -0
- package/types/react/src/components/player.d.ts +32 -0
- package/types/react/src/components/primitives/instances.d.ts +83 -0
- package/types/react/src/components/primitives/nodes.d.ts +15 -0
- package/types/react/src/components/primitives/slot.d.ts +11 -0
- package/types/react/src/components/provider.d.ts +26 -0
- package/types/react/src/components/text-track.d.ts +100 -0
- package/types/react/src/components/ui/buttons/airplay-button.d.ts +22 -0
- package/types/react/src/components/ui/buttons/caption-button.d.ts +24 -0
- package/types/react/src/components/ui/buttons/fullscreen-button.d.ts +24 -0
- package/types/react/src/components/ui/buttons/google-cast-button.d.ts +22 -0
- package/types/react/src/components/ui/buttons/live-button.d.ts +26 -0
- package/types/react/src/components/ui/buttons/mute-button.d.ts +30 -0
- package/types/react/src/components/ui/buttons/pip-button.d.ts +24 -0
- package/types/react/src/components/ui/buttons/play-button.d.ts +23 -0
- package/types/react/src/components/ui/buttons/seek-button.d.ts +25 -0
- package/types/react/src/components/ui/buttons/toggle-button.d.ts +22 -0
- package/types/react/src/components/ui/caption.d.ts +11 -0
- package/types/react/src/components/ui/captions.d.ts +20 -0
- package/types/react/src/components/ui/chapter-title.d.ts +20 -0
- package/types/react/src/components/ui/controls.d.ts +40 -0
- package/types/react/src/components/ui/gesture.d.ts +20 -0
- package/types/react/src/components/ui/menu.d.ts +102 -0
- package/types/react/src/components/ui/poster.d.ts +25 -0
- package/types/react/src/components/ui/radio-group.d.ts +39 -0
- package/types/react/src/components/ui/sliders/audio-gain-slider.d.ts +29 -0
- package/types/react/src/components/ui/sliders/quality-slider.d.ts +28 -0
- package/types/react/src/components/ui/sliders/slider-callbacks.d.ts +6 -0
- package/types/react/src/components/ui/sliders/slider-value.d.ts +9 -0
- package/types/react/src/components/ui/sliders/slider.d.ts +134 -0
- package/types/react/src/components/ui/sliders/speed-slider.d.ts +28 -0
- package/types/react/src/components/ui/sliders/time-slider.d.ts +124 -0
- package/types/react/src/components/ui/sliders/volume-slider.d.ts +29 -0
- package/types/react/src/components/ui/spinner.d.ts +31 -0
- package/types/react/src/components/ui/thumbnail.d.ts +26 -0
- package/types/react/src/components/ui/time.d.ts +20 -0
- package/types/react/src/components/ui/title.d.ts +15 -0
- package/types/react/src/components/ui/tooltip.d.ts +63 -0
- package/types/react/src/hooks/create-text-track.d.ts +7 -0
- package/types/react/src/hooks/options/use-audio-gain-options.d.ts +22 -0
- package/types/react/src/hooks/options/use-audio-options.d.ts +17 -0
- package/types/react/src/hooks/options/use-caption-options.d.ts +24 -0
- package/types/react/src/hooks/options/use-chapter-options.d.ts +18 -0
- package/types/react/src/hooks/options/use-playback-rate-options.d.ts +22 -0
- package/types/react/src/hooks/options/use-video-quality-options.d.ts +35 -0
- package/types/react/src/hooks/use-active-text-cues.d.ts +6 -0
- package/types/react/src/hooks/use-active-text-track.d.ts +5 -0
- package/types/react/src/hooks/use-chapter-title.d.ts +4 -0
- package/types/react/src/hooks/use-dom.d.ts +9 -0
- package/types/react/src/hooks/use-media-context.d.ts +1 -0
- package/types/react/src/hooks/use-media-player.d.ts +7 -0
- package/types/react/src/hooks/use-media-provider.d.ts +7 -0
- package/types/react/src/hooks/use-media-remote.d.ts +12 -0
- package/types/react/src/hooks/use-media-state.d.ts +15 -0
- package/types/react/src/hooks/use-signals.d.ts +5 -0
- package/types/react/src/hooks/use-slider-preview.d.ts +27 -0
- package/types/react/src/hooks/use-slider-state.d.ts +16 -0
- package/types/react/src/hooks/use-state.d.ts +18 -0
- package/types/react/src/hooks/use-text-cues.d.ts +6 -0
- package/types/react/src/hooks/use-thumbnails.d.ts +16 -0
- package/types/react/src/icon.d.ts +17 -0
- package/types/react/src/icons.d.ts +215 -0
- package/types/react/src/index.d.ts +78 -0
- package/types/react/src/providers/remotion/index.d.ts +7 -0
- package/types/react/src/providers/remotion/layout-engine.d.ts +8 -0
- package/types/react/src/providers/remotion/loader.d.ts +9 -0
- package/types/react/src/providers/remotion/playback-engine.d.ts +11 -0
- package/types/react/src/providers/remotion/provider.d.ts +26 -0
- package/types/react/src/providers/remotion/type-check.d.ts +6 -0
- package/types/react/src/providers/remotion/types.d.ts +91 -0
- package/types/react/src/providers/remotion/ui/context.d.ts +17 -0
- package/types/react/src/providers/remotion/ui/error-boundary.d.ts +21 -0
- package/types/react/src/providers/remotion/ui/poster.d.ts +18 -0
- package/types/react/src/providers/remotion/ui/slider-thumbnail.d.ts +17 -0
- package/types/react/src/providers/remotion/ui/thumbnail.d.ts +32 -0
- package/types/react/src/providers/remotion/validate.d.ts +12 -0
- package/types/react/src/source.d.ts +3 -0
- package/types/react/src/utils.d.ts +3 -0
- package/types/vidstack/src/core/api/src-types.d.ts +50 -0
- package/types/vidstack/src/utils/mime.d.ts +15 -0
- package/types/vidstack/src/utils/network.d.ts +17 -0
- package/types/vidstack/src/utils/support.d.ts +72 -0
- package/vite.config.ts +23 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
composeRefs,
|
|
5
|
+
createReactComponent,
|
|
6
|
+
useSignal,
|
|
7
|
+
type ReactElementProps,
|
|
8
|
+
} from 'maverick.js/react';
|
|
9
|
+
|
|
10
|
+
import { PosterInstance } from '../primitives/instances';
|
|
11
|
+
import { Primitive } from '../primitives/nodes';
|
|
12
|
+
|
|
13
|
+
/* -------------------------------------------------------------------------------------------------
|
|
14
|
+
* Poster
|
|
15
|
+
* -----------------------------------------------------------------------------------------------*/
|
|
16
|
+
|
|
17
|
+
const PosterBridge = createReactComponent(PosterInstance);
|
|
18
|
+
|
|
19
|
+
export interface PosterProps extends ReactElementProps<PosterInstance, HTMLImageElement> {
|
|
20
|
+
alt?: string;
|
|
21
|
+
asChild?: boolean;
|
|
22
|
+
children?: React.ReactNode;
|
|
23
|
+
ref?: React.Ref<HTMLImageElement>;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Loads and displays the current media poster image. By default, the media provider's
|
|
28
|
+
* loading strategy is respected meaning the poster won't load until the media can.
|
|
29
|
+
*
|
|
30
|
+
* @docs {@link https://www.vidstack.io/docs/player/components/media/poster}
|
|
31
|
+
* @example
|
|
32
|
+
* ```tsx
|
|
33
|
+
* <MediaPlayer>
|
|
34
|
+
* <MediaProvider>
|
|
35
|
+
* <Poster src="..." alt="..." />
|
|
36
|
+
* </MediaProvider>
|
|
37
|
+
* </MediaPlayer>
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
const Poster = React.forwardRef<HTMLImageElement, PosterProps>(
|
|
41
|
+
({ children, ...props }, forwardRef) => {
|
|
42
|
+
return (
|
|
43
|
+
<PosterBridge
|
|
44
|
+
src={
|
|
45
|
+
props.asChild && React.isValidElement(children)
|
|
46
|
+
? (children.props as React.ComponentProps<'img'>).src
|
|
47
|
+
: undefined
|
|
48
|
+
}
|
|
49
|
+
{...(props as Omit<PosterProps, 'ref'>)}
|
|
50
|
+
>
|
|
51
|
+
{(props, instance) => (
|
|
52
|
+
<PosterImg
|
|
53
|
+
{...props}
|
|
54
|
+
instance={instance}
|
|
55
|
+
ref={composeRefs(props.ref as React.Ref<any>, forwardRef as any)}
|
|
56
|
+
>
|
|
57
|
+
{children}
|
|
58
|
+
</PosterImg>
|
|
59
|
+
)}
|
|
60
|
+
</PosterBridge>
|
|
61
|
+
);
|
|
62
|
+
},
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
Poster.displayName = 'Poster';
|
|
66
|
+
export { Poster };
|
|
67
|
+
|
|
68
|
+
/* -------------------------------------------------------------------------------------------------
|
|
69
|
+
* PosterImg
|
|
70
|
+
* -----------------------------------------------------------------------------------------------*/
|
|
71
|
+
|
|
72
|
+
interface PosterImgProps {
|
|
73
|
+
instance: PosterInstance;
|
|
74
|
+
children?: React.ReactNode;
|
|
75
|
+
asChild?: boolean;
|
|
76
|
+
ref?: React.LegacyRef<HTMLImageElement>;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const PosterImg = React.forwardRef<HTMLImageElement, PosterImgProps>(
|
|
80
|
+
({ instance, children, ...props }, forwardRef) => {
|
|
81
|
+
const { src, img, alt, crossOrigin, hidden } = instance.$state,
|
|
82
|
+
$src = useSignal(src),
|
|
83
|
+
$alt = useSignal(alt),
|
|
84
|
+
$crossOrigin = useSignal(crossOrigin),
|
|
85
|
+
$hidden = useSignal(hidden);
|
|
86
|
+
return (
|
|
87
|
+
<Primitive.img
|
|
88
|
+
{...props}
|
|
89
|
+
src={$src || undefined}
|
|
90
|
+
alt={$alt || undefined}
|
|
91
|
+
crossOrigin={$crossOrigin || undefined}
|
|
92
|
+
ref={composeRefs(img.set as any, forwardRef)}
|
|
93
|
+
style={{ display: $hidden ? 'none' : undefined }}
|
|
94
|
+
>
|
|
95
|
+
{children}
|
|
96
|
+
</Primitive.img>
|
|
97
|
+
);
|
|
98
|
+
},
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
PosterImg.displayName = 'PosterImg';
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/* -------------------------------------------------------------------------------------------------
|
|
2
|
+
* RadioGroup
|
|
3
|
+
* -----------------------------------------------------------------------------------------------*/
|
|
4
|
+
|
|
5
|
+
import * as React from 'react';
|
|
6
|
+
|
|
7
|
+
import { composeRefs, createReactComponent, type ReactElementProps } from 'maverick.js/react';
|
|
8
|
+
|
|
9
|
+
import { RadioGroupInstance, RadioInstance } from '../primitives/instances';
|
|
10
|
+
import { Primitive } from '../primitives/nodes';
|
|
11
|
+
|
|
12
|
+
const RadioGroupBridge = createReactComponent(RadioGroupInstance, {
|
|
13
|
+
events: ['onChange'],
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
export interface RootProps extends ReactElementProps<RadioGroupInstance> {
|
|
17
|
+
asChild?: boolean;
|
|
18
|
+
children?: React.ReactNode;
|
|
19
|
+
ref?: React.Ref<RadioGroupInstance>;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* A radio group consists of options where only one of them can be checked. Each option is
|
|
24
|
+
* provided as a radio (i.e., a selectable element).
|
|
25
|
+
*
|
|
26
|
+
* @docs {@link https://www.vidstack.io/docs/player/components/menu/radio-group}
|
|
27
|
+
* @example
|
|
28
|
+
* ```tsx
|
|
29
|
+
* <RadioGroup.Root>
|
|
30
|
+
* <RadioGroup.Item value="1080">1080p</RadioGroup.Item>
|
|
31
|
+
* <RadioGroup.Item value="720">720p</RadioGroup.Item>
|
|
32
|
+
* </RadioGroup.Root>
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
const Root = React.forwardRef<RadioGroupInstance, RootProps>(
|
|
36
|
+
({ children, ...props }, forwardRef) => {
|
|
37
|
+
return (
|
|
38
|
+
<RadioGroupBridge {...props} ref={forwardRef}>
|
|
39
|
+
{(props) => <Primitive.div {...props}>{children}</Primitive.div>}
|
|
40
|
+
</RadioGroupBridge>
|
|
41
|
+
);
|
|
42
|
+
},
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
Root.displayName = 'RadioGroup';
|
|
46
|
+
|
|
47
|
+
/* -------------------------------------------------------------------------------------------------
|
|
48
|
+
* RadioItem
|
|
49
|
+
* -----------------------------------------------------------------------------------------------*/
|
|
50
|
+
|
|
51
|
+
const ItemBridge = createReactComponent(RadioInstance, {
|
|
52
|
+
events: ['onChange', 'onSelect'],
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
export interface ItemProps extends ReactElementProps<RadioInstance> {
|
|
56
|
+
asChild?: boolean;
|
|
57
|
+
children?: React.ReactNode;
|
|
58
|
+
ref?: React.Ref<HTMLElement>;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* A radio represents a option that a user can select inside of a radio group. Only one radio
|
|
63
|
+
* can be checked in a group.
|
|
64
|
+
*
|
|
65
|
+
* @docs {@link https://www.vidstack.io/docs/player/components/menu/radio}
|
|
66
|
+
* @example
|
|
67
|
+
* ```tsx
|
|
68
|
+
* <RadioGroup.Item value="1080">1080p</RadioGroup.Item>
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
const Item = React.forwardRef<HTMLElement, ItemProps>(({ children, ...props }, forwardRef) => {
|
|
72
|
+
return (
|
|
73
|
+
<ItemBridge {...(props as Omit<ItemProps, 'ref'>)}>
|
|
74
|
+
{(props) => (
|
|
75
|
+
<Primitive.div
|
|
76
|
+
{...props}
|
|
77
|
+
ref={composeRefs(props.ref as React.Ref<any>, forwardRef as React.Ref<any>)}
|
|
78
|
+
>
|
|
79
|
+
{children}
|
|
80
|
+
</Primitive.div>
|
|
81
|
+
)}
|
|
82
|
+
</ItemBridge>
|
|
83
|
+
);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
Item.displayName = 'RadioItem';
|
|
87
|
+
|
|
88
|
+
export { Root, Item };
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
import { createReactComponent, type ReactElementProps } from 'maverick.js/react';
|
|
4
|
+
|
|
5
|
+
import { AudioGainSliderInstance } from '../../primitives/instances';
|
|
6
|
+
import { Primitive } from '../../primitives/nodes';
|
|
7
|
+
import { Value } from './slider';
|
|
8
|
+
import { sliderCallbacks } from './slider-callbacks';
|
|
9
|
+
|
|
10
|
+
/* -------------------------------------------------------------------------------------------------
|
|
11
|
+
* AudioGainSlider
|
|
12
|
+
* -----------------------------------------------------------------------------------------------*/
|
|
13
|
+
|
|
14
|
+
const AudioGainSliderBridge = createReactComponent(AudioGainSliderInstance, {
|
|
15
|
+
events: sliderCallbacks,
|
|
16
|
+
domEventsRegex: /^onMedia/,
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
export interface RootProps extends ReactElementProps<AudioGainSliderInstance> {
|
|
20
|
+
asChild?: boolean;
|
|
21
|
+
children?: React.ReactNode;
|
|
22
|
+
ref?: React.Ref<AudioGainSliderInstance>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Versatile and user-friendly audio boost control designed for seamless cross-browser and provider
|
|
27
|
+
* compatibility and accessibility with ARIA support. It offers a smooth user experience for both
|
|
28
|
+
* mouse and touch interactions and is highly customizable in terms of styling. Users can
|
|
29
|
+
* effortlessly change the audio gain within the range 0 to 100.
|
|
30
|
+
*
|
|
31
|
+
* @docs {@link https://www.vidstack.io/docs/player/components/sliders/audio-gain-slider}
|
|
32
|
+
* @example
|
|
33
|
+
* ```tsx
|
|
34
|
+
* <AudioGainSlider.Root>
|
|
35
|
+
* <AudioGainSlider.Track>
|
|
36
|
+
* <AudioGainSlider.TrackFill />
|
|
37
|
+
* </AudioGainSlider.Track>
|
|
38
|
+
* <AudioGainSlider.Thumb />
|
|
39
|
+
* </AudioGainSlider.Root>
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
const Root = React.forwardRef<AudioGainSliderInstance, RootProps>(
|
|
43
|
+
({ children, ...props }, forwardRef) => {
|
|
44
|
+
return (
|
|
45
|
+
<AudioGainSliderBridge {...props} ref={forwardRef}>
|
|
46
|
+
{(props) => <Primitive.div {...props}>{children}</Primitive.div>}
|
|
47
|
+
</AudioGainSliderBridge>
|
|
48
|
+
);
|
|
49
|
+
},
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
Root.displayName = 'AudioGainSlider';
|
|
53
|
+
|
|
54
|
+
export * from './slider';
|
|
55
|
+
export { Root, Value };
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
import { createReactComponent, type ReactElementProps } from 'maverick.js/react';
|
|
4
|
+
|
|
5
|
+
import { QualitySliderInstance } from '../../primitives/instances';
|
|
6
|
+
import { Primitive } from '../../primitives/nodes';
|
|
7
|
+
import { Value } from './slider';
|
|
8
|
+
import { sliderCallbacks } from './slider-callbacks';
|
|
9
|
+
|
|
10
|
+
/* -------------------------------------------------------------------------------------------------
|
|
11
|
+
* QualitySlider
|
|
12
|
+
* -----------------------------------------------------------------------------------------------*/
|
|
13
|
+
|
|
14
|
+
const QualitySliderBridge = createReactComponent(QualitySliderInstance, {
|
|
15
|
+
events: sliderCallbacks,
|
|
16
|
+
domEventsRegex: /^onMedia/,
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
export interface RootProps extends ReactElementProps<QualitySliderInstance> {
|
|
20
|
+
asChild?: boolean;
|
|
21
|
+
children?: React.ReactNode;
|
|
22
|
+
ref?: React.Ref<QualitySliderInstance>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Versatile and user-friendly input video quality control designed for seamless cross-browser and
|
|
27
|
+
* provider compatibility and accessibility with ARIA support. It offers a smooth user experience
|
|
28
|
+
* for both mouse and touch interactions and is highly customizable in terms of styling.
|
|
29
|
+
*
|
|
30
|
+
* @docs {@link https://www.vidstack.io/docs/player/components/sliders/quality-slider}
|
|
31
|
+
* @example
|
|
32
|
+
* ```tsx
|
|
33
|
+
* <QualitySlider.Root>
|
|
34
|
+
* <QualitySlider.Track>
|
|
35
|
+
* <QualitySlider.TrackFill />
|
|
36
|
+
* </QualitySlider.Track>
|
|
37
|
+
* <QualitySlider.Thumb />
|
|
38
|
+
* </QualitySlider.Root>
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
const Root = React.forwardRef<QualitySliderInstance, RootProps>(
|
|
42
|
+
({ children, ...props }, forwardRef) => {
|
|
43
|
+
return (
|
|
44
|
+
<QualitySliderBridge {...props} ref={forwardRef}>
|
|
45
|
+
{(props) => <Primitive.div {...props}>{children}</Primitive.div>}
|
|
46
|
+
</QualitySliderBridge>
|
|
47
|
+
);
|
|
48
|
+
},
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
Root.displayName = 'QualitySlider';
|
|
52
|
+
|
|
53
|
+
export * from './slider';
|
|
54
|
+
export { Root, Value };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { InferComponentEvents } from 'maverick.js';
|
|
2
|
+
import type { ReactEventCallbacks } from 'maverick.js/react';
|
|
3
|
+
|
|
4
|
+
import type { SliderInstance } from '../../primitives/instances';
|
|
5
|
+
|
|
6
|
+
type SliderCallbacks = keyof ReactEventCallbacks<InferComponentEvents<SliderInstance>>;
|
|
7
|
+
|
|
8
|
+
export const sliderCallbacks: SliderCallbacks[] = [
|
|
9
|
+
'onDragStart',
|
|
10
|
+
'onDragEnd',
|
|
11
|
+
'onDragValueChange',
|
|
12
|
+
'onValueChange',
|
|
13
|
+
'onPointerValueChange',
|
|
14
|
+
];
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
import { createReactComponent, type ReactElementProps } from 'maverick.js/react';
|
|
4
|
+
|
|
5
|
+
import { SliderValueInstance } from '../../primitives/instances';
|
|
6
|
+
|
|
7
|
+
export const SliderValueBridge = createReactComponent(SliderValueInstance);
|
|
8
|
+
|
|
9
|
+
export interface SliderValueProps extends ReactElementProps<SliderValueInstance> {
|
|
10
|
+
asChild?: boolean;
|
|
11
|
+
children?: React.ReactNode;
|
|
12
|
+
ref?: React.Ref<HTMLElement>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
composeRefs,
|
|
5
|
+
createReactComponent,
|
|
6
|
+
useSignal,
|
|
7
|
+
type ReactElementProps,
|
|
8
|
+
} from 'maverick.js/react';
|
|
9
|
+
|
|
10
|
+
import { useSliderState } from '../../../hooks/use-slider-state';
|
|
11
|
+
import { SliderInstance, SliderPreviewInstance } from '../../primitives/instances';
|
|
12
|
+
import { Primitive, type PrimitivePropsWithRef } from '../../primitives/nodes';
|
|
13
|
+
import { sliderCallbacks } from './slider-callbacks';
|
|
14
|
+
import { SliderValueBridge, type SliderValueProps } from './slider-value';
|
|
15
|
+
|
|
16
|
+
/* -------------------------------------------------------------------------------------------------
|
|
17
|
+
* Slider
|
|
18
|
+
* -----------------------------------------------------------------------------------------------*/
|
|
19
|
+
|
|
20
|
+
const SliderBridge = createReactComponent(SliderInstance, {
|
|
21
|
+
events: sliderCallbacks,
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
export interface RootProps extends ReactElementProps<SliderInstance> {
|
|
25
|
+
asChild?: boolean;
|
|
26
|
+
children?: React.ReactNode;
|
|
27
|
+
ref?: React.Ref<SliderInstance>;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Versatile and user-friendly input control designed for seamless cross-browser compatibility and
|
|
32
|
+
* accessibility with ARIA support. It offers a smooth user experience for both mouse and touch
|
|
33
|
+
* interactions and is highly customizable in terms of styling. Users can effortlessly input numeric
|
|
34
|
+
* values within a specified range, defined by a minimum and maximum value.
|
|
35
|
+
*
|
|
36
|
+
* @docs {@link https://www.vidstack.io/docs/player/components/sliders/slider}
|
|
37
|
+
* @example
|
|
38
|
+
* ```tsx
|
|
39
|
+
* <Slider.Root>
|
|
40
|
+
* <Slider.Track>
|
|
41
|
+
* <Slider.TrackFill />
|
|
42
|
+
* </Slider.Track>
|
|
43
|
+
* <Slider.Thumb />
|
|
44
|
+
* </Slider.Root>
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
const Root = React.forwardRef<SliderInstance, RootProps>(({ children, ...props }, forwardRef) => {
|
|
48
|
+
return (
|
|
49
|
+
<SliderBridge {...props} ref={forwardRef}>
|
|
50
|
+
{(props) => <Primitive.div {...props}>{children}</Primitive.div>}
|
|
51
|
+
</SliderBridge>
|
|
52
|
+
);
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
Root.displayName = 'Slider';
|
|
56
|
+
|
|
57
|
+
/* -------------------------------------------------------------------------------------------------
|
|
58
|
+
* SliderThumb
|
|
59
|
+
* -----------------------------------------------------------------------------------------------*/
|
|
60
|
+
|
|
61
|
+
export interface ThumbProps extends PrimitivePropsWithRef<'div'> {}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Purely visual element used to display a draggable handle to the user for adjusting the value
|
|
65
|
+
* on the slider component.
|
|
66
|
+
*
|
|
67
|
+
* @example
|
|
68
|
+
* ```tsx
|
|
69
|
+
* <Slider.Root>
|
|
70
|
+
* <Slider.Thumb />
|
|
71
|
+
* </Slider.Root>
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
const Thumb = React.forwardRef<HTMLElement, ThumbProps>((props, forwardRef) => (
|
|
75
|
+
<Primitive.div {...props} ref={forwardRef as React.Ref<any>} />
|
|
76
|
+
));
|
|
77
|
+
|
|
78
|
+
Thumb.displayName = 'SliderThumb';
|
|
79
|
+
|
|
80
|
+
/* -------------------------------------------------------------------------------------------------
|
|
81
|
+
* SliderTrack
|
|
82
|
+
* -----------------------------------------------------------------------------------------------*/
|
|
83
|
+
|
|
84
|
+
export interface TrackProps extends PrimitivePropsWithRef<'div'> {}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Visual element inside the slider that serves as a horizontal or vertical bar, providing a
|
|
88
|
+
* visual reference for the range or values that can be selected by moving the slider thumb along
|
|
89
|
+
* it. Users can interact with the slider by dragging the thumb along the track to set a specific
|
|
90
|
+
* value.
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* ```tsx
|
|
94
|
+
* <Slider.Root>
|
|
95
|
+
* <Slider.Track>
|
|
96
|
+
* <Slider.TrackFill />
|
|
97
|
+
* </Slider.Track>
|
|
98
|
+
* </Slider.Root>
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
const Track = React.forwardRef<HTMLElement, TrackProps>((props, forwardRef) => (
|
|
102
|
+
<Primitive.div {...props} ref={forwardRef as React.Ref<any>} />
|
|
103
|
+
));
|
|
104
|
+
|
|
105
|
+
Track.displayName = 'SliderTrack';
|
|
106
|
+
|
|
107
|
+
/* -------------------------------------------------------------------------------------------------
|
|
108
|
+
* SliderTrackFill
|
|
109
|
+
* -----------------------------------------------------------------------------------------------*/
|
|
110
|
+
|
|
111
|
+
export interface TrackFillProps extends PrimitivePropsWithRef<'div'> {}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Portion of the slider track that is visually filled or highlighted to indicate the selected or
|
|
115
|
+
* currently chosen range or value. As the slider thumb is moved along the track, the track
|
|
116
|
+
* fill dynamically adjusts to visually represent the portion of the track that corresponds to the
|
|
117
|
+
* selected value or range, providing users with a clear visual indication of their selection.
|
|
118
|
+
*
|
|
119
|
+
* @example
|
|
120
|
+
* ```tsx
|
|
121
|
+
* <Slider.Root>
|
|
122
|
+
* <Slider.Track>
|
|
123
|
+
* <Slider.TrackFill />
|
|
124
|
+
* </Slider.Track>
|
|
125
|
+
* </Slider.Root>
|
|
126
|
+
* ```
|
|
127
|
+
*/
|
|
128
|
+
const TrackFill = React.forwardRef<HTMLElement, TrackFillProps>((props, forwardRef) => (
|
|
129
|
+
<Primitive.div {...props} ref={forwardRef as React.Ref<any>} />
|
|
130
|
+
));
|
|
131
|
+
|
|
132
|
+
TrackFill.displayName = 'SliderTrackFill';
|
|
133
|
+
|
|
134
|
+
/* -------------------------------------------------------------------------------------------------
|
|
135
|
+
* SliderPreview
|
|
136
|
+
* -----------------------------------------------------------------------------------------------*/
|
|
137
|
+
|
|
138
|
+
const PreviewBridge = createReactComponent(SliderPreviewInstance);
|
|
139
|
+
|
|
140
|
+
export interface PreviewProps extends ReactElementProps<SliderPreviewInstance> {
|
|
141
|
+
asChild?: boolean;
|
|
142
|
+
children?: React.ReactNode;
|
|
143
|
+
ref?: React.Ref<HTMLElement>;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Used to provide users with a real-time or interactive preview of the value or selection they
|
|
148
|
+
* are making as they move the slider thumb. This can include displaying the current pointer
|
|
149
|
+
* value numerically, or displaying a thumbnail over the time slider.
|
|
150
|
+
*
|
|
151
|
+
* @docs {@link https://www.vidstack.io/docs/player/components/slider#preview}
|
|
152
|
+
* @example
|
|
153
|
+
* ```tsx
|
|
154
|
+
* <Slider.Root>
|
|
155
|
+
* <Slider.Preview>
|
|
156
|
+
* <Slider.Value />
|
|
157
|
+
* </Slider.Preview>
|
|
158
|
+
* </Slider.Root>
|
|
159
|
+
* ```
|
|
160
|
+
*/
|
|
161
|
+
const Preview = React.forwardRef<HTMLElement, PreviewProps>(
|
|
162
|
+
({ children, ...props }, forwardRef) => {
|
|
163
|
+
return (
|
|
164
|
+
<PreviewBridge {...(props as Omit<PreviewProps, 'ref'>)}>
|
|
165
|
+
{(props) => (
|
|
166
|
+
<Primitive.div
|
|
167
|
+
{...props}
|
|
168
|
+
ref={composeRefs(props.ref as React.Ref<any>, forwardRef as React.Ref<any>)}
|
|
169
|
+
>
|
|
170
|
+
{children}
|
|
171
|
+
</Primitive.div>
|
|
172
|
+
)}
|
|
173
|
+
</PreviewBridge>
|
|
174
|
+
);
|
|
175
|
+
},
|
|
176
|
+
);
|
|
177
|
+
|
|
178
|
+
Preview.displayName = 'SliderPreview';
|
|
179
|
+
|
|
180
|
+
/* -------------------------------------------------------------------------------------------------
|
|
181
|
+
* SliderValue
|
|
182
|
+
* -----------------------------------------------------------------------------------------------*/
|
|
183
|
+
|
|
184
|
+
export interface ValueProps extends SliderValueProps {}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Displays the specific numeric representation of the current or pointer value of the slider.
|
|
188
|
+
* When a user interacts with a slider by moving its thumb along the track, the slider value
|
|
189
|
+
* changes accordingly.
|
|
190
|
+
*
|
|
191
|
+
* @docs {@link https://www.vidstack.io/docs/player/components/slider#preview}
|
|
192
|
+
* @example
|
|
193
|
+
* ```tsx
|
|
194
|
+
* <Slider.Root>
|
|
195
|
+
* <Slider.Preview>
|
|
196
|
+
* <Slider.Value />
|
|
197
|
+
* </Slider.Preview>
|
|
198
|
+
* </Slider.Root>
|
|
199
|
+
* ```
|
|
200
|
+
*/
|
|
201
|
+
const Value = React.forwardRef<HTMLElement, ValueProps>(({ children, ...props }, forwardRef) => {
|
|
202
|
+
return (
|
|
203
|
+
<SliderValueBridge {...(props as Omit<ValueProps, 'ref'>)}>
|
|
204
|
+
{(props, instance) => {
|
|
205
|
+
const $text = useSignal(() => instance.getValueText(), instance);
|
|
206
|
+
return (
|
|
207
|
+
<Primitive.div {...props} ref={forwardRef as React.Ref<any>}>
|
|
208
|
+
{$text}
|
|
209
|
+
{children}
|
|
210
|
+
</Primitive.div>
|
|
211
|
+
);
|
|
212
|
+
}}
|
|
213
|
+
</SliderValueBridge>
|
|
214
|
+
);
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
Value.displayName = 'SliderValue';
|
|
218
|
+
|
|
219
|
+
/* -------------------------------------------------------------------------------------------------
|
|
220
|
+
* SliderSteps
|
|
221
|
+
* -----------------------------------------------------------------------------------------------*/
|
|
222
|
+
|
|
223
|
+
export interface StepsProps extends Omit<PrimitivePropsWithRef<'div'>, 'children'> {
|
|
224
|
+
children: (step: number) => React.ReactNode;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* Visual markers that can be used to indicate value steps on the slider track.
|
|
229
|
+
*
|
|
230
|
+
* @example
|
|
231
|
+
* ```tsx
|
|
232
|
+
* <Slider.Root>
|
|
233
|
+
* <Slider.Steps className="steps">
|
|
234
|
+
* {(step) => <div className="step" key={String(step)}></div>}
|
|
235
|
+
* </Slider.Steps>
|
|
236
|
+
* </Slider.Root>
|
|
237
|
+
* ```
|
|
238
|
+
*/
|
|
239
|
+
const Steps = React.forwardRef<HTMLElement, StepsProps>(({ children, ...props }, forwardRef) => {
|
|
240
|
+
const $min = useSliderState('min'),
|
|
241
|
+
$max = useSliderState('max'),
|
|
242
|
+
$step = useSliderState('step'),
|
|
243
|
+
steps = ($max - $min) / $step;
|
|
244
|
+
|
|
245
|
+
return (
|
|
246
|
+
<Primitive.div {...props} ref={forwardRef as React.Ref<any>}>
|
|
247
|
+
{Array.from({ length: Math.floor(steps) + 1 }).map((_, step) => children(step))}
|
|
248
|
+
</Primitive.div>
|
|
249
|
+
);
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
Steps.displayName = 'SliderSteps';
|
|
253
|
+
|
|
254
|
+
export { Root, Thumb, Track, TrackFill, Preview, Value, Steps };
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
import { createReactComponent, type ReactElementProps } from 'maverick.js/react';
|
|
4
|
+
|
|
5
|
+
import { SpeedSliderInstance } from '../../primitives/instances';
|
|
6
|
+
import { Primitive } from '../../primitives/nodes';
|
|
7
|
+
import { Value } from './slider';
|
|
8
|
+
import { sliderCallbacks } from './slider-callbacks';
|
|
9
|
+
|
|
10
|
+
/* -------------------------------------------------------------------------------------------------
|
|
11
|
+
* SpeedSlider
|
|
12
|
+
* -----------------------------------------------------------------------------------------------*/
|
|
13
|
+
|
|
14
|
+
const SpeedSliderBridge = createReactComponent(SpeedSliderInstance, {
|
|
15
|
+
events: sliderCallbacks,
|
|
16
|
+
domEventsRegex: /^onMedia/,
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
export interface RootProps extends ReactElementProps<SpeedSliderInstance> {
|
|
20
|
+
asChild?: boolean;
|
|
21
|
+
children?: React.ReactNode;
|
|
22
|
+
ref?: React.Ref<SpeedSliderInstance>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Versatile and user-friendly input playback rate control designed for seamless cross-browser and
|
|
27
|
+
* provider compatibility and accessibility with ARIA support. It offers a smooth user experience
|
|
28
|
+
* for both mouse and touch interactions and is highly customizable in terms of styling.
|
|
29
|
+
*
|
|
30
|
+
* @docs {@link https://www.vidstack.io/docs/player/components/sliders/speed-slider}
|
|
31
|
+
* @example
|
|
32
|
+
* ```tsx
|
|
33
|
+
* <SpeedSlider.Root>
|
|
34
|
+
* <SpeedSlider.Track>
|
|
35
|
+
* <SpeedSlider.TrackFill />
|
|
36
|
+
* </SpeedSlider.Track>
|
|
37
|
+
* <SpeedSlider.Thumb />
|
|
38
|
+
* </SpeedSlider.Root>
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
const Root = React.forwardRef<SpeedSliderInstance, RootProps>(
|
|
42
|
+
({ children, ...props }, forwardRef) => {
|
|
43
|
+
return (
|
|
44
|
+
<SpeedSliderBridge {...props} ref={forwardRef}>
|
|
45
|
+
{(props) => <Primitive.div {...props}>{children}</Primitive.div>}
|
|
46
|
+
</SpeedSliderBridge>
|
|
47
|
+
);
|
|
48
|
+
},
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
Root.displayName = 'SpeedSlider';
|
|
52
|
+
|
|
53
|
+
export * from './slider';
|
|
54
|
+
export { Root, Value };
|