@videojs/react 0.1.0-preview.8 → 10.0.0-alpha.3
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 +18 -0
- package/dist/default/index.js +22 -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 +5 -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 +4 -0
- package/dist/default/presets/background/skin.css +3 -0
- package/dist/default/presets/background/skin.js +11 -0
- package/dist/default/presets/background/skin.js.map +1 -0
- package/dist/default/presets/video/index.js +7 -0
- package/dist/default/presets/video/minimal-skin.css +637 -0
- package/dist/default/presets/video/minimal-skin.js +234 -0
- package/dist/default/presets/video/minimal-skin.js.map +1 -0
- package/dist/default/presets/video/minimal-skin.tailwind.js +231 -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 +223 -0
- package/dist/default/presets/video/skin.js.map +1 -0
- package/dist/default/presets/video/skin.tailwind.js +222 -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 +18 -0
- package/dist/dev/index.d.ts +23 -0
- package/dist/dev/index.js +22 -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 +4 -0
- package/dist/dev/presets/audio/index.js +5 -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 +3 -0
- package/dist/dev/presets/background/index.js +4 -0
- package/dist/dev/presets/background/skin.css +3 -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 +11 -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 +6 -0
- package/dist/dev/presets/video/index.js +7 -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 +234 -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 +231 -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 +223 -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 +222 -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 +58 -53
- 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-DmlupkvF.js +0 -1042
- package/dist/VolumeSlider-DmlupkvF.js.map +0 -1
- package/dist/frosted-0lXuIgHt.js +0 -156
- package/dist/frosted-0lXuIgHt.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 -312
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -89
- package/dist/index.js.map +0 -1
- package/dist/minimal-B-R9aRNe.js +0 -162
- package/dist/minimal-B-R9aRNe.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,36 @@
|
|
|
1
|
+
import { UIComponentProps } from "../../utils/types.js";
|
|
2
|
+
import * as react from "react";
|
|
3
|
+
|
|
4
|
+
//#region src/ui/captions-button/captions-button.d.ts
|
|
5
|
+
type CaptionsButtonState = {
|
|
6
|
+
active: boolean;
|
|
7
|
+
};
|
|
8
|
+
type CaptionButtonCoreProps = {
|
|
9
|
+
/** Custom label for the button. */label?: string | ((state: CaptionsButtonState) => string) | undefined; /** Whether the button is disabled. */
|
|
10
|
+
disabled?: boolean | undefined;
|
|
11
|
+
};
|
|
12
|
+
interface CaptionsButtonProps extends UIComponentProps<'button', CaptionsButtonState>, CaptionButtonCoreProps {}
|
|
13
|
+
/**
|
|
14
|
+
* A button that toggles captions.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```tsx
|
|
18
|
+
* <CaptionsButton />
|
|
19
|
+
*
|
|
20
|
+
* <CaptionsButton
|
|
21
|
+
* render={(props, state) => (
|
|
22
|
+
* <button {...props}>
|
|
23
|
+
* {state.active ? <CaptionsOnIcon /> : <CaptionsOffIcon />}
|
|
24
|
+
* </button>
|
|
25
|
+
* )}
|
|
26
|
+
* />
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
declare const CaptionsButton: react.ForwardRefExoticComponent<Omit<CaptionsButtonProps, "ref"> & react.RefAttributes<HTMLButtonElement>>;
|
|
30
|
+
declare namespace CaptionsButton {
|
|
31
|
+
type Props = CaptionsButtonProps;
|
|
32
|
+
type State = CaptionsButtonState;
|
|
33
|
+
}
|
|
34
|
+
//#endregion
|
|
35
|
+
export { CaptionsButton, CaptionsButtonProps, CaptionsButtonState };
|
|
36
|
+
//# sourceMappingURL=captions-button.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"captions-button.d.ts","names":[],"sources":["../../../../src/ui/captions-button/captions-button.tsx"],"mappings":";;;;KAWY,mBAAA;EACV,MAAA;AAAA;AAAA,KAEG,sBAAA;EAH0B,mCAK7B,KAAA,cAAmB,KAAA,EAAO,mBAAA,0BAJ1B;EAMA,QAAA;AAAA;AAAA,UAOe,mBAAA,SAA4B,gBAAA,WAA2B,mBAAA,GAAsB,sBAAA;;;;;;;;AAA9F;;;;;;;;;cAkBa,cAAA,EAAc,KAAA,CAAA,yBAAA,CAAA,IAAA,CAAA,mBAAA,WAAA,KAAA,CAAA,aAAA,CAAA,iBAAA;AAAA,kBA2BV,cAAA;EAAA,KACH,KAAA,GAAQ,mBAAA;EAAA,KACR,KAAA,GAAQ,mBAAA;AAAA"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { renderElement } from "../../utils/use-render.js";
|
|
4
|
+
import { useButton } from "../hooks/use-button.js";
|
|
5
|
+
import { forwardRef, useState } from "react";
|
|
6
|
+
|
|
7
|
+
//#region src/ui/captions-button/captions-button.tsx
|
|
8
|
+
const CaptionButtonDataAttrs = { active: "data-active" };
|
|
9
|
+
/**
|
|
10
|
+
* A button that toggles captions.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```tsx
|
|
14
|
+
* <CaptionsButton />
|
|
15
|
+
*
|
|
16
|
+
* <CaptionsButton
|
|
17
|
+
* render={(props, state) => (
|
|
18
|
+
* <button {...props}>
|
|
19
|
+
* {state.active ? <CaptionsOnIcon /> : <CaptionsOffIcon />}
|
|
20
|
+
* </button>
|
|
21
|
+
* )}
|
|
22
|
+
* />
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
const CaptionsButton = forwardRef(function CaptionsButton(componentProps, forwardedRef) {
|
|
26
|
+
const { render, className, style, label, disabled, ...elementProps } = componentProps;
|
|
27
|
+
const [isActive, setIsActive] = useState(false);
|
|
28
|
+
const { getButtonProps, buttonRef } = useButton({
|
|
29
|
+
displayName: "CaptionsButton",
|
|
30
|
+
onActivate: () => setIsActive((active) => !active),
|
|
31
|
+
isDisabled: () => disabled ?? false
|
|
32
|
+
});
|
|
33
|
+
return renderElement("button", {
|
|
34
|
+
render,
|
|
35
|
+
className,
|
|
36
|
+
style
|
|
37
|
+
}, {
|
|
38
|
+
state: { active: isActive },
|
|
39
|
+
stateAttrMap: CaptionButtonDataAttrs,
|
|
40
|
+
ref: [forwardedRef, buttonRef],
|
|
41
|
+
props: [
|
|
42
|
+
elementProps,
|
|
43
|
+
getButtonProps(),
|
|
44
|
+
{ "aria-pressed": isActive }
|
|
45
|
+
]
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
//#endregion
|
|
50
|
+
export { CaptionsButton };
|
|
51
|
+
//# sourceMappingURL=captions-button.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"captions-button.js","names":[],"sources":["../../../../src/ui/captions-button/captions-button.tsx"],"sourcesContent":["'use client';\n\nimport type { StateAttrMap } from '@videojs/core';\nimport type { ForwardedRef } from 'react';\nimport { forwardRef, useState } from 'react';\n\nimport type { UIComponentProps } from '../../utils/types';\nimport { renderElement } from '../../utils/use-render';\nimport { useButton } from '../hooks/use-button';\n\n// FIXME: Replace with state/props from core.\nexport type CaptionsButtonState = {\n active: boolean;\n};\ntype CaptionButtonCoreProps = {\n /** Custom label for the button. */\n label?: string | ((state: CaptionsButtonState) => string) | undefined;\n /** Whether the button is disabled. */\n disabled?: boolean | undefined;\n};\nconst CaptionButtonDataAttrs = {\n /** Present when the captions are active. */\n active: 'data-active',\n} as const satisfies StateAttrMap<CaptionsButtonState>;\n\nexport interface CaptionsButtonProps extends UIComponentProps<'button', CaptionsButtonState>, CaptionButtonCoreProps {}\n\n/**\n * A button that toggles captions.\n *\n * @example\n * ```tsx\n * <CaptionsButton />\n *\n * <CaptionsButton\n * render={(props, state) => (\n * <button {...props}>\n * {state.active ? <CaptionsOnIcon /> : <CaptionsOffIcon />}\n * </button>\n * )}\n * />\n * ```\n */\nexport const CaptionsButton = forwardRef(function CaptionsButton(\n componentProps: CaptionsButtonProps,\n forwardedRef: ForwardedRef<HTMLButtonElement>\n) {\n const { render, className, style, label, disabled, ...elementProps } = componentProps;\n\n // FIXME: Replace with actual captions state\n const [isActive, setIsActive] = useState(false);\n\n const { getButtonProps, buttonRef } = useButton({\n displayName: 'CaptionsButton',\n onActivate: () => setIsActive((active) => !active), // FIXME: Replace with actual toggle logic\n isDisabled: () => disabled ?? false,\n });\n\n return renderElement(\n 'button',\n { render, className, style },\n {\n state: { active: isActive }, // FIXME: Replace with actual toggle logic\n stateAttrMap: CaptionButtonDataAttrs,\n ref: [forwardedRef, buttonRef],\n props: [elementProps, getButtonProps(), { 'aria-pressed': isActive }],\n }\n );\n});\n\nexport namespace CaptionsButton {\n export type Props = CaptionsButtonProps;\n export type State = CaptionsButtonState;\n}\n"],"mappings":";;;;;;;AAoBA,MAAM,yBAAyB,EAE7B,QAAQ,eACT;;;;;;;;;;;;;;;;;AAoBD,MAAa,iBAAiB,WAAW,SAAS,eAChD,gBACA,cACA;CACA,MAAM,EAAE,QAAQ,WAAW,OAAO,OAAO,UAAU,GAAG,iBAAiB;CAGvE,MAAM,CAAC,UAAU,eAAe,SAAS,MAAM;CAE/C,MAAM,EAAE,gBAAgB,cAAc,UAAU;EAC9C,aAAa;EACb,kBAAkB,aAAa,WAAW,CAAC,OAAO;EAClD,kBAAkB,YAAY;EAC/B,CAAC;AAEF,QAAO,cACL,UACA;EAAE;EAAQ;EAAW;EAAO,EAC5B;EACE,OAAO,EAAE,QAAQ,UAAU;EAC3B,cAAc;EACd,KAAK,CAAC,cAAc,UAAU;EAC9B,OAAO;GAAC;GAAc,gBAAgB;GAAE,EAAE,gBAAgB,UAAU;GAAC;EACtE,CACF;EACD"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { UIComponentProps } from "../../utils/types.js";
|
|
2
|
+
import * as react from "react";
|
|
3
|
+
import { ReactNode } from "react";
|
|
4
|
+
|
|
5
|
+
//#region src/ui/controls/controls-group.d.ts
|
|
6
|
+
type GroupState = Record<string, never>;
|
|
7
|
+
interface ControlsGroupProps extends UIComponentProps<'div', GroupState> {
|
|
8
|
+
children?: ReactNode | undefined;
|
|
9
|
+
}
|
|
10
|
+
/** Layout group for related controls; sets `role="group"` when labeled. */
|
|
11
|
+
declare const ControlsGroup: react.ForwardRefExoticComponent<Omit<ControlsGroupProps, "ref"> & react.RefAttributes<HTMLDivElement>>;
|
|
12
|
+
declare namespace ControlsGroup {
|
|
13
|
+
type Props = ControlsGroupProps;
|
|
14
|
+
}
|
|
15
|
+
//#endregion
|
|
16
|
+
export { ControlsGroup, ControlsGroupProps };
|
|
17
|
+
//# sourceMappingURL=controls-group.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controls-group.d.ts","names":[],"sources":["../../../../src/ui/controls/controls-group.tsx"],"mappings":";;;;;KAQK,UAAA,GAAa,MAAA;AAAA,UAED,kBAAA,SAA2B,gBAAA,QAAwB,UAAA;EAClE,QAAA,GAAW,SAAA;AAAA;;cAIA,aAAA,EAAa,KAAA,CAAA,yBAAA,CAAA,IAAA,CAAA,kBAAA,WAAA,KAAA,CAAA,aAAA,CAAA,cAAA;AAAA,kBAqBT,aAAA;EAAA,KACH,KAAA,GAAQ,kBAAA;AAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { renderElement } from "../../utils/use-render.js";
|
|
4
|
+
import { forwardRef } from "react";
|
|
5
|
+
|
|
6
|
+
//#region src/ui/controls/controls-group.tsx
|
|
7
|
+
/** Layout group for related controls; sets `role="group"` when labeled. */
|
|
8
|
+
const ControlsGroup = forwardRef(function ControlsGroup(componentProps, forwardedRef) {
|
|
9
|
+
const { render, className, style, children, ...elementProps } = componentProps;
|
|
10
|
+
const role = elementProps["aria-label"] || elementProps["aria-labelledby"] ? "group" : void 0;
|
|
11
|
+
return renderElement("div", {
|
|
12
|
+
render,
|
|
13
|
+
className,
|
|
14
|
+
style
|
|
15
|
+
}, {
|
|
16
|
+
state: {},
|
|
17
|
+
ref: [forwardedRef],
|
|
18
|
+
props: [{
|
|
19
|
+
role,
|
|
20
|
+
children
|
|
21
|
+
}, elementProps]
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
//#endregion
|
|
26
|
+
export { ControlsGroup };
|
|
27
|
+
//# sourceMappingURL=controls-group.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controls-group.js","names":[],"sources":["../../../../src/ui/controls/controls-group.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\ntype GroupState = Record<string, never>;\n\nexport interface ControlsGroupProps extends UIComponentProps<'div', GroupState> {\n children?: ReactNode | undefined;\n}\n\n/** Layout group for related controls; sets `role=\"group\"` when labeled. */\nexport const ControlsGroup = forwardRef(function ControlsGroup(\n componentProps: ControlsGroupProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n const { render, className, style, children, ...elementProps } = componentProps;\n\n const role = elementProps['aria-label'] || elementProps['aria-labelledby'] ? 'group' : undefined;\n\n const state: GroupState = {};\n\n return renderElement(\n 'div',\n { render, className, style },\n {\n state,\n ref: [forwardedRef],\n props: [{ role, children }, elementProps],\n }\n );\n});\n\nexport namespace ControlsGroup {\n export type Props = ControlsGroupProps;\n}\n"],"mappings":";;;;;;;AAeA,MAAa,gBAAgB,WAAW,SAAS,cAC/C,gBACA,cACA;CACA,MAAM,EAAE,QAAQ,WAAW,OAAO,UAAU,GAAG,iBAAiB;CAEhE,MAAM,OAAO,aAAa,iBAAiB,aAAa,qBAAqB,UAAU;AAIvF,QAAO,cACL,OACA;EAAE;EAAQ;EAAW;EAAO,EAC5B;EACE,OANsB,EAAE;EAOxB,KAAK,CAAC,aAAa;EACnB,OAAO,CAAC;GAAE;GAAM;GAAU,EAAE,aAAa;EAC1C,CACF;EACD"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { UIComponentProps } from "../../utils/types.js";
|
|
2
|
+
import * as react from "react";
|
|
3
|
+
import { ReactNode } from "react";
|
|
4
|
+
import { ControlsCore } from "@videojs/core";
|
|
5
|
+
|
|
6
|
+
//#region src/ui/controls/controls-root.d.ts
|
|
7
|
+
interface ControlsRootProps extends UIComponentProps<'div', ControlsCore.State> {
|
|
8
|
+
children?: ReactNode | undefined;
|
|
9
|
+
}
|
|
10
|
+
/** Root container for player controls state and rendered control content. */
|
|
11
|
+
declare const ControlsRoot: react.ForwardRefExoticComponent<Omit<ControlsRootProps, "ref"> & react.RefAttributes<HTMLDivElement>>;
|
|
12
|
+
declare namespace ControlsRoot {
|
|
13
|
+
type Props = ControlsRootProps;
|
|
14
|
+
type State = ControlsCore.State;
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
17
|
+
export { ControlsRoot, ControlsRootProps };
|
|
18
|
+
//# sourceMappingURL=controls-root.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controls-root.d.ts","names":[],"sources":["../../../../src/ui/controls/controls-root.tsx"],"mappings":";;;;;;UAWiB,iBAAA,SAA0B,gBAAA,QAAwB,YAAA,CAAa,KAAA;EAC9E,QAAA,GAAW,SAAA;AAAA;AADb;AAAA,cAKa,YAAA,EAAY,KAAA,CAAA,yBAAA,CAAA,IAAA,CAAA,iBAAA,WAAA,KAAA,CAAA,aAAA,CAAA,cAAA;AAAA,kBA6BR,YAAA;EAAA,KACH,KAAA,GAAQ,iBAAA;EAAA,KACR,KAAA,GAAQ,YAAA,CAAa,KAAA;AAAA"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { usePlayer } from "../../player/context.js";
|
|
4
|
+
import { renderElement } from "../../utils/use-render.js";
|
|
5
|
+
import { logMissingFeature, selectControls } from "@videojs/core/dom";
|
|
6
|
+
import { forwardRef, useState } from "react";
|
|
7
|
+
import { ControlsCore, ControlsDataAttrs } from "@videojs/core";
|
|
8
|
+
|
|
9
|
+
//#region src/ui/controls/controls-root.tsx
|
|
10
|
+
/** Root container for player controls state and rendered control content. */
|
|
11
|
+
const ControlsRoot = forwardRef(function ControlsRoot(componentProps, forwardedRef) {
|
|
12
|
+
const { render, className, style, children, ...elementProps } = componentProps;
|
|
13
|
+
const controls = usePlayer(selectControls);
|
|
14
|
+
const [core] = useState(() => new ControlsCore());
|
|
15
|
+
if (!controls) {
|
|
16
|
+
logMissingFeature("Controls.Root", "controls");
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
const state = core.getState(controls);
|
|
20
|
+
return renderElement("div", {
|
|
21
|
+
render,
|
|
22
|
+
className,
|
|
23
|
+
style
|
|
24
|
+
}, {
|
|
25
|
+
state,
|
|
26
|
+
stateAttrMap: ControlsDataAttrs,
|
|
27
|
+
ref: [forwardedRef],
|
|
28
|
+
props: [{ children }, elementProps]
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
//#endregion
|
|
33
|
+
export { ControlsRoot };
|
|
34
|
+
//# sourceMappingURL=controls-root.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"controls-root.js","names":[],"sources":["../../../../src/ui/controls/controls-root.tsx"],"sourcesContent":["'use client';\n\nimport { ControlsCore, ControlsDataAttrs } from '@videojs/core';\nimport { logMissingFeature, selectControls } from '@videojs/core/dom';\nimport type { ForwardedRef, ReactNode } 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 ControlsRootProps extends UIComponentProps<'div', ControlsCore.State> {\n children?: ReactNode | undefined;\n}\n\n/** Root container for player controls state and rendered control content. */\nexport const ControlsRoot = forwardRef(function ControlsRoot(\n componentProps: ControlsRootProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n const { render, className, style, children, ...elementProps } = componentProps;\n\n const controls = usePlayer(selectControls);\n\n const [core] = useState(() => new ControlsCore());\n\n if (!controls) {\n if (__DEV__) logMissingFeature('Controls.Root', 'controls');\n return null;\n }\n\n const state = core.getState(controls);\n\n return renderElement(\n 'div',\n { render, className, style },\n {\n state,\n stateAttrMap: ControlsDataAttrs,\n ref: [forwardedRef],\n props: [{ children }, elementProps],\n }\n );\n});\n\nexport namespace ControlsRoot {\n export type Props = ControlsRootProps;\n export type State = ControlsCore.State;\n}\n"],"mappings":";;;;;;;;;;AAgBA,MAAa,eAAe,WAAW,SAAS,aAC9C,gBACA,cACA;CACA,MAAM,EAAE,QAAQ,WAAW,OAAO,UAAU,GAAG,iBAAiB;CAEhE,MAAM,WAAW,UAAU,eAAe;CAE1C,MAAM,CAAC,QAAQ,eAAe,IAAI,cAAc,CAAC;AAEjD,KAAI,CAAC,UAAU;AACA,oBAAkB,iBAAiB,WAAW;AAC3D,SAAO;;CAGT,MAAM,QAAQ,KAAK,SAAS,SAAS;AAErC,QAAO,cACL,OACA;EAAE;EAAQ;EAAW;EAAO,EAC5B;EACE;EACA,cAAc;EACd,KAAK,CAAC,aAAa;EACnB,OAAO,CAAC,EAAE,UAAU,EAAE,aAAa;EACpC,CACF;EACD"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ControlsGroup, ControlsGroupProps } from "./controls-group.js";
|
|
2
|
+
import { ControlsRoot, ControlsRootProps } from "./controls-root.js";
|
|
3
|
+
|
|
4
|
+
//#region src/ui/controls/index.parts.d.ts
|
|
5
|
+
declare namespace index_parts_d_exports {
|
|
6
|
+
export { ControlsGroup as Group, ControlsGroupProps as GroupProps, ControlsRoot as Root, ControlsRootProps as RootProps };
|
|
7
|
+
}
|
|
8
|
+
//#endregion
|
|
9
|
+
export { index_parts_d_exports };
|
|
10
|
+
//# sourceMappingURL=index.parts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.parts.d.ts","names":[],"sources":["../../../../src/ui/controls/index.parts.ts"],"mappings":""}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { __exportAll } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { ControlsGroup } from "./controls-group.js";
|
|
3
|
+
import { ControlsRoot } from "./controls-root.js";
|
|
4
|
+
|
|
5
|
+
//#region src/ui/controls/index.parts.ts
|
|
6
|
+
var index_parts_exports = /* @__PURE__ */ __exportAll({
|
|
7
|
+
Group: () => ControlsGroup,
|
|
8
|
+
Root: () => ControlsRoot
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
//#endregion
|
|
12
|
+
export { index_parts_exports };
|
|
13
|
+
//# sourceMappingURL=index.parts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.parts.js","names":[],"sources":["../../../../src/ui/controls/index.parts.ts"],"sourcesContent":["export { ControlsGroup as Group, type ControlsGroupProps as GroupProps } from './controls-group';\nexport { ControlsRoot as Root, type ControlsRootProps as RootProps } from './controls-root';\n"],"mappings":""}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { UIComponentProps } from "../../utils/types.js";
|
|
2
|
+
import * as react from "react";
|
|
3
|
+
|
|
4
|
+
//#region src/ui/error-dialog/error-dialog.d.ts
|
|
5
|
+
type ErrorDialogState = {
|
|
6
|
+
visible: boolean;
|
|
7
|
+
onDismiss: () => void;
|
|
8
|
+
};
|
|
9
|
+
interface ErrorDialogProps extends UIComponentProps<'div', ErrorDialogState> {
|
|
10
|
+
'aria-labelledby': string;
|
|
11
|
+
'aria-describedby'?: string;
|
|
12
|
+
dismiss?: () => void;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Displays an error dialog when media playback encounters an error.
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```tsx
|
|
19
|
+
* <ErrorDialog />
|
|
20
|
+
*
|
|
21
|
+
* <ErrorDialog
|
|
22
|
+
* render={(props, state) => (
|
|
23
|
+
* <div {...props}>Something went wrong</div>
|
|
24
|
+
* )}
|
|
25
|
+
* />
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
declare const ErrorDialog: react.ForwardRefExoticComponent<Omit<ErrorDialogProps, "ref"> & react.RefAttributes<HTMLDivElement>>;
|
|
29
|
+
declare namespace ErrorDialog {
|
|
30
|
+
type Props = ErrorDialogProps;
|
|
31
|
+
type State = ErrorDialogState;
|
|
32
|
+
}
|
|
33
|
+
//#endregion
|
|
34
|
+
export { ErrorDialog, ErrorDialogProps };
|
|
35
|
+
//# sourceMappingURL=error-dialog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-dialog.d.ts","names":[],"sources":["../../../../src/ui/error-dialog/error-dialog.tsx"],"mappings":";;;;KAOK,gBAAA;EAAqB,OAAA;EAAkB,SAAA;AAAA;AAAA,UAE3B,gBAAA,SAAyB,gBAAA,QAAwB,gBAAA;EAChE,iBAAA;EACA,kBAAA;EACA,OAAA;AAAA;;;;;;;;;;;AAmBF;;;;cAAa,WAAA,EAAW,KAAA,CAAA,yBAAA,CAAA,IAAA,CAAA,gBAAA,WAAA,KAAA,CAAA,aAAA,CAAA,cAAA;AAAA,kBAgDP,WAAA;EAAA,KACH,KAAA,GAAQ,gBAAA;EAAA,KACR,KAAA,GAAQ,gBAAA;AAAA"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { renderElement } from "../../utils/use-render.js";
|
|
4
|
+
import { forwardRef, useEffect, useRef, useState } from "react";
|
|
5
|
+
|
|
6
|
+
//#region src/ui/error-dialog/error-dialog.tsx
|
|
7
|
+
/**
|
|
8
|
+
* Displays an error dialog when media playback encounters an error.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```tsx
|
|
12
|
+
* <ErrorDialog />
|
|
13
|
+
*
|
|
14
|
+
* <ErrorDialog
|
|
15
|
+
* render={(props, state) => (
|
|
16
|
+
* <div {...props}>Something went wrong</div>
|
|
17
|
+
* )}
|
|
18
|
+
* />
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
const ErrorDialog = forwardRef(function ErrorDialog(componentProps, forwardedRef) {
|
|
22
|
+
const { render, className, style, ...elementProps } = componentProps;
|
|
23
|
+
const dialogRef = useRef(null);
|
|
24
|
+
const [hasError, setHasError] = useState(false);
|
|
25
|
+
useEffect(() => {
|
|
26
|
+
const handle = setTimeout(() => {}, 2e3);
|
|
27
|
+
return () => clearTimeout(handle);
|
|
28
|
+
}, []);
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
if (!hasError) return;
|
|
31
|
+
requestAnimationFrame(() => {
|
|
32
|
+
dialogRef.current?.focus();
|
|
33
|
+
});
|
|
34
|
+
}, [hasError]);
|
|
35
|
+
return renderElement("div", {
|
|
36
|
+
render,
|
|
37
|
+
className,
|
|
38
|
+
style
|
|
39
|
+
}, {
|
|
40
|
+
state: {
|
|
41
|
+
visible: hasError,
|
|
42
|
+
onDismiss: () => setHasError(false)
|
|
43
|
+
},
|
|
44
|
+
ref: [forwardedRef, dialogRef],
|
|
45
|
+
props: [{
|
|
46
|
+
role: "alertdialog",
|
|
47
|
+
tabIndex: -1
|
|
48
|
+
}, elementProps]
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
//#endregion
|
|
53
|
+
export { ErrorDialog };
|
|
54
|
+
//# sourceMappingURL=error-dialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-dialog.js","names":[],"sources":["../../../../src/ui/error-dialog/error-dialog.tsx"],"sourcesContent":["'use client';\n\nimport type { ForwardedRef } from 'react';\nimport { forwardRef, useEffect, useRef, useState } from 'react';\nimport type { UIComponentProps } from '../../utils/types';\nimport { renderElement } from '../../utils/use-render';\n\ntype ErrorDialogState = { visible: boolean; onDismiss: () => void };\n\nexport interface ErrorDialogProps extends UIComponentProps<'div', ErrorDialogState> {\n 'aria-labelledby': string;\n 'aria-describedby'?: string;\n dismiss?: () => void;\n}\n\nconst DEBUG = false;\n\n/**\n * Displays an error dialog when media playback encounters an error.\n *\n * @example\n * ```tsx\n * <ErrorDialog />\n *\n * <ErrorDialog\n * render={(props, state) => (\n * <div {...props}>Something went wrong</div>\n * )}\n * />\n * ```\n */\nexport const ErrorDialog = forwardRef(function ErrorDialog(\n componentProps: ErrorDialogProps,\n forwardedRef: ForwardedRef<HTMLDivElement>\n) {\n const { render, className, style, ...elementProps } = componentProps;\n const dialogRef = useRef<HTMLDivElement>(null);\n\n const [hasError, setHasError] = useState(false);\n\n // FIXME: This is just debugging code\n useEffect(() => {\n const handle = setTimeout(() => {\n if (!DEBUG) return;\n setHasError(true);\n }, 2000);\n\n return () => clearTimeout(handle);\n }, []);\n\n // Focus the dialog when it becomes visible to ensure it's announced by screen readers.\n // Wait a frame for the accessibility tree to update with the dialog before focusing.\n useEffect(() => {\n if (!hasError) return;\n requestAnimationFrame(() => {\n dialogRef.current?.focus();\n });\n }, [hasError]);\n\n return renderElement(\n 'div',\n { render, className, style },\n {\n state: {\n visible: hasError,\n onDismiss: () => setHasError(false),\n },\n ref: [forwardedRef, dialogRef],\n props: [\n {\n role: 'alertdialog',\n tabIndex: -1,\n },\n elementProps,\n ],\n }\n );\n});\n\nexport namespace ErrorDialog {\n export type Props = ErrorDialogProps;\n export type State = ErrorDialogState;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AA+BA,MAAa,cAAc,WAAW,SAAS,YAC7C,gBACA,cACA;CACA,MAAM,EAAE,QAAQ,WAAW,OAAO,GAAG,iBAAiB;CACtD,MAAM,YAAY,OAAuB,KAAK;CAE9C,MAAM,CAAC,UAAU,eAAe,SAAS,MAAM;AAG/C,iBAAgB;EACd,MAAM,SAAS,iBAAiB,IAG7B,IAAK;AAER,eAAa,aAAa,OAAO;IAChC,EAAE,CAAC;AAIN,iBAAgB;AACd,MAAI,CAAC,SAAU;AACf,8BAA4B;AAC1B,aAAU,SAAS,OAAO;IAC1B;IACD,CAAC,SAAS,CAAC;AAEd,QAAO,cACL,OACA;EAAE;EAAQ;EAAW;EAAO,EAC5B;EACE,OAAO;GACL,SAAS;GACT,iBAAiB,YAAY,MAAM;GACpC;EACD,KAAK,CAAC,cAAc,UAAU;EAC9B,OAAO,CACL;GACE,MAAM;GACN,UAAU;GACX,EACD,aACD;EACF,CACF;EACD"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { UIComponentProps } from "../../utils/types.js";
|
|
2
|
+
import * as react from "react";
|
|
3
|
+
import { FullscreenButtonCore } from "@videojs/core";
|
|
4
|
+
|
|
5
|
+
//#region src/ui/fullscreen-button/fullscreen-button.d.ts
|
|
6
|
+
interface FullscreenButtonProps extends UIComponentProps<'button', FullscreenButtonCore.State>, FullscreenButtonCore.Props {}
|
|
7
|
+
declare const FullscreenButton: react.ForwardRefExoticComponent<Omit<FullscreenButtonProps, "ref"> & react.RefAttributes<HTMLButtonElement>>;
|
|
8
|
+
declare namespace FullscreenButton {
|
|
9
|
+
type Props = FullscreenButtonProps;
|
|
10
|
+
type State = FullscreenButtonCore.State;
|
|
11
|
+
}
|
|
12
|
+
//#endregion
|
|
13
|
+
export { FullscreenButton, FullscreenButtonProps };
|
|
14
|
+
//# sourceMappingURL=fullscreen-button.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fullscreen-button.d.ts","names":[],"sources":["../../../../src/ui/fullscreen-button/fullscreen-button.tsx"],"mappings":";;;;;UAYiB,qBAAA,SACP,gBAAA,WAA2B,oBAAA,CAAqB,KAAA,GACtD,oBAAA,CAAqB,KAAA;AAAA,cAEZ,gBAAA,EAAgB,KAAA,CAAA,yBAAA,CAAA,IAAA,CAAA,qBAAA,WAAA,KAAA,CAAA,aAAA,CAAA,iBAAA;AAAA,kBAoCZ,gBAAA;EAAA,KACH,KAAA,GAAQ,qBAAA;EAAA,KACR,KAAA,GAAQ,oBAAA,CAAqB,KAAA;AAAA"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { usePlayer } from "../../player/context.js";
|
|
4
|
+
import { renderElement } from "../../utils/use-render.js";
|
|
5
|
+
import { useButton } from "../hooks/use-button.js";
|
|
6
|
+
import { logMissingFeature, selectFullscreen } from "@videojs/core/dom";
|
|
7
|
+
import { forwardRef, useState } from "react";
|
|
8
|
+
import { FullscreenButtonCore, FullscreenButtonDataAttrs } from "@videojs/core";
|
|
9
|
+
|
|
10
|
+
//#region src/ui/fullscreen-button/fullscreen-button.tsx
|
|
11
|
+
const FullscreenButton = forwardRef(function FullscreenButton(componentProps, forwardedRef) {
|
|
12
|
+
const { render, className, style, label, disabled, ...elementProps } = componentProps;
|
|
13
|
+
const fullscreen = usePlayer(selectFullscreen);
|
|
14
|
+
const [core] = useState(() => new FullscreenButtonCore());
|
|
15
|
+
core.setProps({
|
|
16
|
+
label,
|
|
17
|
+
disabled
|
|
18
|
+
});
|
|
19
|
+
const { getButtonProps, buttonRef } = useButton({
|
|
20
|
+
displayName: "FullscreenButton",
|
|
21
|
+
onActivate: () => core.toggle(fullscreen),
|
|
22
|
+
isDisabled: () => disabled || !fullscreen
|
|
23
|
+
});
|
|
24
|
+
if (!fullscreen) {
|
|
25
|
+
logMissingFeature("FullscreenButton", "fullscreen");
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
const state = core.getState(fullscreen);
|
|
29
|
+
return renderElement("button", {
|
|
30
|
+
render,
|
|
31
|
+
className,
|
|
32
|
+
style
|
|
33
|
+
}, {
|
|
34
|
+
state,
|
|
35
|
+
stateAttrMap: FullscreenButtonDataAttrs,
|
|
36
|
+
ref: [forwardedRef, buttonRef],
|
|
37
|
+
props: [
|
|
38
|
+
core.getAttrs(state),
|
|
39
|
+
elementProps,
|
|
40
|
+
getButtonProps()
|
|
41
|
+
]
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
//#endregion
|
|
46
|
+
export { FullscreenButton };
|
|
47
|
+
//# sourceMappingURL=fullscreen-button.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fullscreen-button.js","names":[],"sources":["../../../../src/ui/fullscreen-button/fullscreen-button.tsx"],"sourcesContent":["'use client';\n\nimport { FullscreenButtonCore, FullscreenButtonDataAttrs } from '@videojs/core';\nimport { logMissingFeature, selectFullscreen } 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';\nimport { useButton } from '../hooks/use-button';\n\nexport interface FullscreenButtonProps\n extends UIComponentProps<'button', FullscreenButtonCore.State>,\n FullscreenButtonCore.Props {}\n\nexport const FullscreenButton = forwardRef(function FullscreenButton(\n componentProps: FullscreenButtonProps,\n forwardedRef: ForwardedRef<HTMLButtonElement>\n) {\n const { render, className, style, label, disabled, ...elementProps } = componentProps;\n\n const fullscreen = usePlayer(selectFullscreen);\n\n const [core] = useState(() => new FullscreenButtonCore());\n core.setProps({ label, disabled });\n\n const { getButtonProps, buttonRef } = useButton({\n displayName: 'FullscreenButton',\n onActivate: () => core.toggle(fullscreen!),\n isDisabled: () => disabled || !fullscreen,\n });\n\n if (!fullscreen) {\n if (__DEV__) logMissingFeature('FullscreenButton', 'fullscreen');\n return null;\n }\n\n const state = core.getState(fullscreen);\n\n return renderElement(\n 'button',\n { render, className, style },\n {\n state,\n stateAttrMap: FullscreenButtonDataAttrs,\n ref: [forwardedRef, buttonRef],\n props: [core.getAttrs(state), elementProps, getButtonProps()],\n }\n );\n});\n\nexport namespace FullscreenButton {\n export type Props = FullscreenButtonProps;\n export type State = FullscreenButtonCore.State;\n}\n"],"mappings":";;;;;;;;;;AAgBA,MAAa,mBAAmB,WAAW,SAAS,iBAClD,gBACA,cACA;CACA,MAAM,EAAE,QAAQ,WAAW,OAAO,OAAO,UAAU,GAAG,iBAAiB;CAEvE,MAAM,aAAa,UAAU,iBAAiB;CAE9C,MAAM,CAAC,QAAQ,eAAe,IAAI,sBAAsB,CAAC;AACzD,MAAK,SAAS;EAAE;EAAO;EAAU,CAAC;CAElC,MAAM,EAAE,gBAAgB,cAAc,UAAU;EAC9C,aAAa;EACb,kBAAkB,KAAK,OAAO,WAAY;EAC1C,kBAAkB,YAAY,CAAC;EAChC,CAAC;AAEF,KAAI,CAAC,YAAY;AACF,oBAAkB,oBAAoB,aAAa;AAChE,SAAO;;CAGT,MAAM,QAAQ,KAAK,SAAS,WAAW;AAEvC,QAAO,cACL,UACA;EAAE;EAAQ;EAAW;EAAO,EAC5B;EACE;EACA,cAAc;EACd,KAAK,CAAC,cAAc,UAAU;EAC9B,OAAO;GAAC,KAAK,SAAS,MAAM;GAAE;GAAc,gBAAgB;GAAC;EAC9D,CACF;EACD"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { ComponentPropsWithRef, Ref } from "react";
|
|
2
|
+
|
|
3
|
+
//#region src/ui/hooks/use-button.d.ts
|
|
4
|
+
interface UseButtonParameters {
|
|
5
|
+
displayName: string;
|
|
6
|
+
onActivate: () => void;
|
|
7
|
+
isDisabled: () => boolean;
|
|
8
|
+
}
|
|
9
|
+
interface UseButtonReturnValue {
|
|
10
|
+
getButtonProps: (externalProps?: ComponentPropsWithRef<'button'>) => ComponentPropsWithRef<'button'>;
|
|
11
|
+
buttonRef: Ref<HTMLElement>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Hook for button behavior with keyboard and pointer interaction.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```tsx
|
|
18
|
+
* const { getButtonProps, buttonRef } = useButton({
|
|
19
|
+
* displayName: 'PlayButton',
|
|
20
|
+
* onActivate: () => togglePlayback(),
|
|
21
|
+
* isDisabled: () => disabled,
|
|
22
|
+
* });
|
|
23
|
+
*
|
|
24
|
+
* return useRender('button', componentProps, {
|
|
25
|
+
* state,
|
|
26
|
+
* ref: [forwardedRef, buttonRef],
|
|
27
|
+
* props: [elementProps, getButtonProps],
|
|
28
|
+
* });
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* @param params - Button configuration with activation handler and disabled check.
|
|
32
|
+
*/
|
|
33
|
+
declare function useButton(params: UseButtonParameters): UseButtonReturnValue;
|
|
34
|
+
declare namespace useButton {
|
|
35
|
+
type Parameters = UseButtonParameters;
|
|
36
|
+
type ReturnValue = UseButtonReturnValue;
|
|
37
|
+
}
|
|
38
|
+
//#endregion
|
|
39
|
+
export { useButton };
|
|
40
|
+
//# sourceMappingURL=use-button.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-button.d.ts","names":[],"sources":["../../../../src/ui/hooks/use-button.ts"],"mappings":";;;UAOiB,mBAAA;EACf,WAAA;EACA,UAAA;EACA,UAAA;AAAA;AAAA,UAGe,oBAAA;EACf,cAAA,GAAiB,aAAA,GAAgB,qBAAA,eAAoC,qBAAA;EACrE,SAAA,EAAW,GAAA,CAAI,WAAA;AAAA;;;AAFjB;;;;;;;;;;;;;;;;;;iBAyBgB,SAAA,CAAU,MAAA,EAAQ,mBAAA,GAAsB,oBAAA;AAAA,kBAuBvC,SAAA;EAAA,KACH,UAAA,GAAa,mBAAA;EAAA,KACb,WAAA,GAAc,oBAAA;AAAA"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { mergeProps } from "../../utils/merge-props.js";
|
|
4
|
+
import { createButton } from "@videojs/core/dom";
|
|
5
|
+
import { useCallback } from "react";
|
|
6
|
+
|
|
7
|
+
//#region src/ui/hooks/use-button.ts
|
|
8
|
+
/**
|
|
9
|
+
* Hook for button behavior with keyboard and pointer interaction.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```tsx
|
|
13
|
+
* const { getButtonProps, buttonRef } = useButton({
|
|
14
|
+
* displayName: 'PlayButton',
|
|
15
|
+
* onActivate: () => togglePlayback(),
|
|
16
|
+
* isDisabled: () => disabled,
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* return useRender('button', componentProps, {
|
|
20
|
+
* state,
|
|
21
|
+
* ref: [forwardedRef, buttonRef],
|
|
22
|
+
* props: [elementProps, getButtonProps],
|
|
23
|
+
* });
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* @param params - Button configuration with activation handler and disabled check.
|
|
27
|
+
*/
|
|
28
|
+
function useButton(params) {
|
|
29
|
+
const { displayName, onActivate, isDisabled } = params;
|
|
30
|
+
const buttonRef = useCallback((element) => {
|
|
31
|
+
if (element && element.tagName !== "BUTTON") console.warn(`${displayName} should render a <button> element for accessibility`);
|
|
32
|
+
}, [displayName]);
|
|
33
|
+
return {
|
|
34
|
+
getButtonProps: useCallback((externalProps) => {
|
|
35
|
+
return mergeProps(createButton({
|
|
36
|
+
onActivate,
|
|
37
|
+
isDisabled
|
|
38
|
+
}), externalProps);
|
|
39
|
+
}, [onActivate, isDisabled]),
|
|
40
|
+
buttonRef
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
//#endregion
|
|
45
|
+
export { useButton };
|
|
46
|
+
//# sourceMappingURL=use-button.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-button.js","names":[],"sources":["../../../../src/ui/hooks/use-button.ts"],"sourcesContent":["'use client';\n\nimport { createButton } from '@videojs/core/dom';\nimport type { ComponentPropsWithRef, Ref } from 'react';\nimport { useCallback } from 'react';\nimport { mergeProps } from '../../utils/merge-props';\n\nexport interface UseButtonParameters {\n displayName: string;\n onActivate: () => void;\n isDisabled: () => boolean;\n}\n\nexport interface UseButtonReturnValue {\n getButtonProps: (externalProps?: ComponentPropsWithRef<'button'>) => ComponentPropsWithRef<'button'>;\n buttonRef: Ref<HTMLElement>;\n}\n\n/**\n * Hook for button behavior with keyboard and pointer interaction.\n *\n * @example\n * ```tsx\n * const { getButtonProps, buttonRef } = useButton({\n * displayName: 'PlayButton',\n * onActivate: () => togglePlayback(),\n * isDisabled: () => disabled,\n * });\n *\n * return useRender('button', componentProps, {\n * state,\n * ref: [forwardedRef, buttonRef],\n * props: [elementProps, getButtonProps],\n * });\n * ```\n *\n * @param params - Button configuration with activation handler and disabled check.\n */\nexport function useButton(params: UseButtonParameters): UseButtonReturnValue {\n const { displayName, onActivate, isDisabled } = params;\n\n const buttonRef = useCallback(\n (element: HTMLElement | null) => {\n if (__DEV__ && element && element.tagName !== 'BUTTON') {\n console.warn(`${displayName} should render a <button> element for accessibility`);\n }\n },\n [displayName]\n );\n\n const getButtonProps = useCallback(\n (externalProps?: ComponentPropsWithRef<'button'>): ComponentPropsWithRef<'button'> => {\n const buttonProps = createButton({ onActivate, isDisabled });\n return mergeProps(buttonProps, externalProps);\n },\n [onActivate, isDisabled]\n );\n\n return { getButtonProps, buttonRef };\n}\n\nexport namespace useButton {\n export type Parameters = UseButtonParameters;\n export type ReturnValue = UseButtonReturnValue;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCA,SAAgB,UAAU,QAAmD;CAC3E,MAAM,EAAE,aAAa,YAAY,eAAe;CAEhD,MAAM,YAAY,aACf,YAAgC;AAC/B,MAAe,WAAW,QAAQ,YAAY,SAC5C,SAAQ,KAAK,GAAG,YAAY,qDAAqD;IAGrF,CAAC,YAAY,CACd;AAUD,QAAO;EAAE,gBARc,aACpB,kBAAqF;AAEpF,UAAO,WADa,aAAa;IAAE;IAAY;IAAY,CAAC,EAC7B,cAAc;KAE/C,CAAC,YAAY,WAAW,CACzB;EAEwB;EAAW"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { UIComponentProps } from "../../utils/types.js";
|
|
2
|
+
import * as react from "react";
|
|
3
|
+
import { MuteButtonCore } from "@videojs/core";
|
|
4
|
+
|
|
5
|
+
//#region src/ui/mute-button/mute-button.d.ts
|
|
6
|
+
interface MuteButtonProps extends UIComponentProps<'button', MuteButtonCore.State>, MuteButtonCore.Props {}
|
|
7
|
+
/**
|
|
8
|
+
* A button that toggles mute state.
|
|
9
|
+
*/
|
|
10
|
+
declare const MuteButton: react.ForwardRefExoticComponent<Omit<MuteButtonProps, "ref"> & react.RefAttributes<HTMLButtonElement>>;
|
|
11
|
+
declare namespace MuteButton {
|
|
12
|
+
type Props = MuteButtonProps;
|
|
13
|
+
type State = MuteButtonCore.State;
|
|
14
|
+
}
|
|
15
|
+
//#endregion
|
|
16
|
+
export { MuteButton, MuteButtonProps };
|
|
17
|
+
//# sourceMappingURL=mute-button.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mute-button.d.ts","names":[],"sources":["../../../../src/ui/mute-button/mute-button.tsx"],"mappings":";;;;;UAYiB,eAAA,SAAwB,gBAAA,WAA2B,cAAA,CAAe,KAAA,GAAQ,cAAA,CAAe,KAAA;;AAA1G;;cAKa,UAAA,EAAU,KAAA,CAAA,yBAAA,CAAA,IAAA,CAAA,eAAA,WAAA,KAAA,CAAA,aAAA,CAAA,iBAAA;AAAA,kBAoCN,UAAA;EAAA,KACH,KAAA,GAAQ,eAAA;EAAA,KACR,KAAA,GAAQ,cAAA,CAAe,KAAA;AAAA"}
|