videojs-vue 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/{Audio-DmoQgIRM.d.ts → audio/Audio.d.ts} +4 -5
- package/dist/audio/Audio.js +21 -0
- package/dist/audio/AudioPlayer.d.ts +948 -0
- package/dist/audio/AudioPlayer.js +10 -0
- package/dist/{AudioPlayerRoot-D47326rh.d.ts → audio/AudioPlayerRoot.d.ts} +34 -4
- package/dist/audio/AudioPlayerRoot.js +43 -0
- package/dist/audio/composables.d.ts +1 -1
- package/dist/audio/composables.js +11 -5
- package/dist/audio/core.d.ts +6 -5
- package/dist/audio/core.js +3 -1
- package/dist/audio/createAudioPlayer.d.ts +954 -0
- package/dist/{createAudioPlayer-BqZWB8il.js → audio/createAudioPlayer.js} +16 -8
- package/dist/audio/default.d.ts +5 -4
- package/dist/audio/default.js +1 -1
- package/dist/audio/index.d.ts +13 -952
- package/dist/audio/index.js +4 -9
- package/dist/audio/neutral.d.ts +5 -4
- package/dist/audio/neutral.js +1 -1
- package/dist/audio/skins/createAudioSkin.d.ts +5 -0
- package/dist/audio/skins/createAudioSkin.js +20 -0
- package/dist/audio/skins/default.d.ts +6 -2
- package/dist/audio/skins/default.js +1 -1
- package/dist/audio/skins/neutral.d.ts +6 -2
- package/dist/audio/skins/neutral.js +1 -1
- package/dist/audio/skins.d.ts +3 -0
- package/dist/audio/skins.js +3 -0
- package/dist/audio/types.d.ts +22 -0
- package/dist/audio/types.js +0 -0
- package/dist/composables/index.d.ts +3 -2
- package/dist/composables/index.js +3 -1
- package/dist/composables/usePlayerActions.d.ts +9 -0
- package/dist/composables/usePlayerActions.js +17 -0
- package/dist/composables/usePlayerState.d.ts +12 -0
- package/dist/composables/usePlayerState.js +19 -0
- package/dist/composables/useStoreSelection.d.ts +9 -0
- package/dist/{useStoreSelection-BFUpSMPo.js → composables/useStoreSelection.js} +1 -1
- package/dist/core/index.d.ts +6 -2
- package/dist/core/index.js +3 -1
- package/dist/i18n/MediaI18n.d.ts +16 -0
- package/dist/i18n/MediaI18n.js +26 -0
- package/dist/i18n/MediaText.d.ts +14 -0
- package/dist/i18n/MediaText.js +37 -0
- package/dist/i18n/index.d.ts +3 -29
- package/dist/i18n/index.js +2 -52
- package/dist/index.d.ts +16 -5
- package/dist/index.js +5 -9
- package/dist/media/Video.d.ts +79 -0
- package/dist/media/Video.js +21 -0
- package/dist/media/events.d.ts +5 -0
- package/dist/media/events.js +30 -0
- package/dist/media/hls.d.ts +1 -2
- package/dist/media/hls.js +3 -1
- package/dist/media/props.d.ts +45 -0
- package/dist/media/props.js +28 -0
- package/dist/media/types.d.ts +23 -0
- package/dist/media/types.js +0 -0
- package/dist/media/useMediaElement.d.ts +18 -0
- package/dist/media/useMediaElement.js +91 -0
- package/dist/node_modules/.pnpm/@vue_reactivity@3.5.43/node_modules/@vue/reactivity/dist/reactivity.d.ts +3 -0
- package/dist/player/PlayerRoot.d.ts +109 -0
- package/dist/player/PlayerRoot.js +43 -0
- package/dist/player/actions.d.ts +17 -0
- package/dist/{actions-CRZ5C4-3.js → player/actions.js} +1 -1
- package/dist/player/context.d.ts +18 -0
- package/dist/{context-Zjy9Z5Uy.js → player/context.js} +1 -1
- package/dist/player/events.d.ts +32 -0
- package/dist/player/events.js +13 -0
- package/dist/player/preservePlayerTree.d.ts +8 -0
- package/dist/player/preservePlayerTree.js +64 -0
- package/dist/player/types.d.ts +22 -0
- package/dist/player/types.js +0 -0
- package/dist/player/usePlayerRoot.d.ts +32 -0
- package/dist/player/usePlayerRoot.js +89 -0
- package/dist/polyfills.d.ts +2 -0
- package/dist/polyfills.js +2 -0
- package/dist/register/audio/player.d.ts +1 -1
- package/dist/register/i18n.d.ts +1 -1
- package/dist/register/video/compat-skin.d.ts +1 -0
- package/dist/register/video/compat-skin.js +1 -0
- package/dist/register/video/neutral-skin.d.ts +1 -1
- package/dist/register/video/player.d.ts +1 -1
- package/dist/register/video/skin.d.ts +1 -1
- package/dist/skins/compat.d.ts +6 -0
- package/dist/skins/compat.js +6 -0
- package/dist/skins/createVideoSkin.d.ts +5 -0
- package/dist/skins/createVideoSkin.js +25 -0
- package/dist/skins/default.d.ts +6 -2
- package/dist/skins/default.js +1 -1
- package/dist/skins/index.d.ts +3 -0
- package/dist/skins/index.js +3 -0
- package/dist/skins/legacy/LegacyControls.d.ts +8 -0
- package/dist/skins/legacy/LegacyControls.js +89 -0
- package/dist/skins/legacy/useLegacySize.d.ts +9 -0
- package/dist/skins/legacy/useLegacySize.js +32 -0
- package/dist/skins/legacy.css +160 -0
- package/dist/skins/legacy.d.ts +6 -0
- package/dist/skins/legacy.js +36 -0
- package/dist/skins/neutral.d.ts +6 -2
- package/dist/skins/neutral.js +1 -1
- package/dist/skins/withSlot.d.ts +10 -0
- package/dist/{withSlot-DQS-dOOR.js → skins/withSlot.js} +1 -1
- package/dist/ui/captions-button.d.ts +1 -1
- package/dist/ui/captions-button.js +3 -3
- package/dist/ui/container.d.ts +1 -1
- package/dist/ui/container.js +2 -2
- package/dist/ui/controls-content.d.ts +1 -1
- package/dist/ui/controls-content.js +2 -2
- package/dist/ui/controls-group.d.ts +1 -1
- package/dist/ui/controls-group.js +2 -2
- package/dist/ui/controls.d.ts +1 -1
- package/dist/ui/controls.js +2 -2
- package/dist/ui/createElementComponent.d.ts +10 -0
- package/dist/{createElementComponent-CUeAF_JU.js → ui/createElementComponent.js} +6 -3
- package/dist/ui/fullscreen-button.d.ts +1 -1
- package/dist/ui/fullscreen-button.js +3 -3
- package/dist/ui/hotkey.d.ts +1 -1
- package/dist/ui/hotkey.js +3 -3
- package/dist/ui/index.d.ts +10 -10
- package/dist/ui/index.js +21 -21
- package/dist/ui/mute-button.d.ts +1 -1
- package/dist/ui/mute-button.js +3 -3
- package/dist/ui/pip-button.d.ts +1 -1
- package/dist/ui/pip-button.js +3 -3
- package/dist/ui/play-button.d.ts +1 -1
- package/dist/ui/play-button.js +3 -3
- package/dist/ui/poster.d.ts +1 -1
- package/dist/ui/poster.js +2 -2
- package/dist/ui/props.d.ts +25 -0
- package/dist/{props-D3O1wYXT.js → ui/props.js} +1 -1
- package/dist/ui/seek-button.d.ts +1 -1
- package/dist/ui/seek-button.js +3 -3
- package/dist/ui/slider-buffer.d.ts +1 -1
- package/dist/ui/slider-buffer.js +2 -2
- package/dist/ui/slider-fill.d.ts +1 -1
- package/dist/ui/slider-fill.js +2 -2
- package/dist/ui/slider-thumb.d.ts +1 -1
- package/dist/ui/slider-thumb.js +2 -2
- package/dist/ui/slider-track.d.ts +1 -1
- package/dist/ui/slider-track.js +2 -2
- package/dist/ui/status-announcer.d.ts +1 -1
- package/dist/ui/status-announcer.js +2 -2
- package/dist/ui/time-slider.d.ts +1 -1
- package/dist/ui/time-slider.js +3 -3
- package/dist/ui/time.d.ts +1 -1
- package/dist/ui/time.js +3 -3
- package/dist/ui/volume-slider.d.ts +1 -1
- package/dist/ui/volume-slider.js +3 -3
- package/dist/{index-DhJ5A5TI.d.ts → video/VideoPlayer.d.ts} +21 -233
- package/dist/video/VideoPlayer.js +10 -0
- package/dist/video/compat.d.ts +1068 -0
- package/dist/video/compat.js +6 -0
- package/dist/video/createVideoPlayer.d.ts +1076 -0
- package/dist/{createVideoPlayer-CU9HWSAy.js → video/createVideoPlayer.js} +17 -9
- package/dist/video/default.d.ts +18 -15
- package/dist/video/default.js +1 -1
- package/dist/video/legacy.d.ts +1068 -0
- package/dist/video/legacy.js +6 -0
- package/dist/video/neutral.d.ts +18 -15
- package/dist/video/neutral.js +1 -1
- package/package.json +38 -7
- package/dist/Audio-D-RH-zmq.js +0 -55
- package/dist/Video-fUL_ClzK.js +0 -55
- package/dist/createAudioPlayer-BhUZLd4H.d.ts +0 -11
- package/dist/createAudioSkin-BNmtEp7u.js +0 -17
- package/dist/createVideoSkin-BxpJYgKe.js +0 -22
- package/dist/default-3MW_94HC.d.ts +0 -7
- package/dist/default-C4INOLJr.d.ts +0 -7
- package/dist/i18n-C4MwExsj.d.ts +0 -1
- package/dist/neutral-DWxkiOeo.d.ts +0 -7
- package/dist/neutral-skin-B8htnvI5.d.ts +0 -1
- package/dist/neutral-x5edtrGj.d.ts +0 -7
- package/dist/player-DwjY3MEu.d.ts +0 -1
- package/dist/player-RUaCdKKE.d.ts +0 -1
- package/dist/skin-0b-NvVj8.d.ts +0 -1
- package/dist/types-DR9kogyX.d.ts +0 -24
- package/dist/types-wAkjM01D.d.ts +0 -42
- package/dist/useMediaElement-CO_r--i0.js +0 -143
- package/dist/usePlayerActions-D3ILoEVZ.js +0 -28
- package/dist/usePlayerActions-McyRKswV.d.ts +0 -21
- package/dist/usePlayerRoot-Nsnn7msd.js +0 -162
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
//#region src/media/events.ts
|
|
2
|
+
const MEDIA_EVENTS = [
|
|
3
|
+
"abort",
|
|
4
|
+
"canplay",
|
|
5
|
+
"canplaythrough",
|
|
6
|
+
"durationchange",
|
|
7
|
+
"emptied",
|
|
8
|
+
"ended",
|
|
9
|
+
"error",
|
|
10
|
+
"loadeddata",
|
|
11
|
+
"loadedmetadata",
|
|
12
|
+
"loadstart",
|
|
13
|
+
"pause",
|
|
14
|
+
"play",
|
|
15
|
+
"playing",
|
|
16
|
+
"progress",
|
|
17
|
+
"ratechange",
|
|
18
|
+
"seeked",
|
|
19
|
+
"seeking",
|
|
20
|
+
"stalled",
|
|
21
|
+
"suspend",
|
|
22
|
+
"timeupdate",
|
|
23
|
+
"volumechange",
|
|
24
|
+
"waiting",
|
|
25
|
+
"enterpictureinpicture",
|
|
26
|
+
"leavepictureinpicture"
|
|
27
|
+
];
|
|
28
|
+
const mediaEmits = Object.fromEntries(MEDIA_EVENTS.map((name) => [name, (_event) => true]));
|
|
29
|
+
//#endregion
|
|
30
|
+
export { MEDIA_EVENTS, mediaEmits };
|
package/dist/media/hls.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import "../index-DhJ5A5TI.js";
|
|
1
|
+
import { MediaTrack } from "./types.js";
|
|
3
2
|
import { PropType } from "vue";
|
|
4
3
|
import { HlsEngineConfig, HlsSource, HlsSource as HlsSource$1 } from "@videojs/hlsjs-video";
|
|
5
4
|
//#region src/media/hls.d.ts
|
package/dist/media/hls.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { mediaEmits } from "./events.js";
|
|
2
|
+
import { mediaProps } from "./props.js";
|
|
3
|
+
import { useMediaElement } from "./useMediaElement.js";
|
|
2
4
|
import { defineComponent } from "vue";
|
|
3
5
|
import { HlsJsVideoElement } from "@videojs/html/media/hlsjs-video";
|
|
4
6
|
//#region src/media/hls.ts
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { MediaTrack } from "./types.js";
|
|
2
|
+
import { ExtractPropTypes, PropType } from "vue";
|
|
3
|
+
//#region src/media/props.d.ts
|
|
4
|
+
export declare const commonMediaProps: {
|
|
5
|
+
readonly src: PropType<string | undefined>;
|
|
6
|
+
readonly autoplay: BooleanConstructor;
|
|
7
|
+
readonly loop: BooleanConstructor;
|
|
8
|
+
readonly preload: {
|
|
9
|
+
readonly type: PropType<'none' | 'metadata' | 'auto'>;
|
|
10
|
+
readonly default: 'metadata';
|
|
11
|
+
};
|
|
12
|
+
readonly crossorigin: PropType<'' | 'anonymous' | 'use-credentials' | undefined>;
|
|
13
|
+
readonly tracks: PropType<readonly MediaTrack[] | undefined>;
|
|
14
|
+
readonly volume: PropType<number | undefined>;
|
|
15
|
+
readonly muted: {
|
|
16
|
+
readonly type: PropType<boolean | undefined>;
|
|
17
|
+
readonly default: undefined;
|
|
18
|
+
};
|
|
19
|
+
readonly playbackRate: PropType<number | undefined>;
|
|
20
|
+
};
|
|
21
|
+
export declare const mediaProps: {
|
|
22
|
+
readonly src: PropType<string | undefined>;
|
|
23
|
+
readonly autoplay: BooleanConstructor;
|
|
24
|
+
readonly loop: BooleanConstructor;
|
|
25
|
+
readonly preload: {
|
|
26
|
+
readonly type: PropType<'none' | 'metadata' | 'auto'>;
|
|
27
|
+
readonly default: 'metadata';
|
|
28
|
+
};
|
|
29
|
+
readonly crossorigin: PropType<'' | 'anonymous' | 'use-credentials' | undefined>;
|
|
30
|
+
readonly tracks: PropType<readonly MediaTrack[] | undefined>;
|
|
31
|
+
readonly volume: PropType<number | undefined>;
|
|
32
|
+
readonly muted: {
|
|
33
|
+
readonly type: PropType<boolean | undefined>;
|
|
34
|
+
readonly default: undefined;
|
|
35
|
+
};
|
|
36
|
+
readonly playbackRate: PropType<number | undefined>;
|
|
37
|
+
readonly poster: PropType<string | undefined>;
|
|
38
|
+
readonly playsinline: {
|
|
39
|
+
readonly type: BooleanConstructor;
|
|
40
|
+
readonly default: true;
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
export type CommonMediaProps = ExtractPropTypes<typeof commonMediaProps>;
|
|
44
|
+
export type MediaProps = ExtractPropTypes<typeof mediaProps>;
|
|
45
|
+
//#endregion
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
//#region src/media/props.ts
|
|
2
|
+
const commonMediaProps = {
|
|
3
|
+
src: String,
|
|
4
|
+
autoplay: Boolean,
|
|
5
|
+
loop: Boolean,
|
|
6
|
+
preload: {
|
|
7
|
+
type: String,
|
|
8
|
+
default: "metadata"
|
|
9
|
+
},
|
|
10
|
+
crossorigin: String,
|
|
11
|
+
tracks: Array,
|
|
12
|
+
volume: Number,
|
|
13
|
+
muted: {
|
|
14
|
+
type: Boolean,
|
|
15
|
+
default: void 0
|
|
16
|
+
},
|
|
17
|
+
playbackRate: Number
|
|
18
|
+
};
|
|
19
|
+
const mediaProps = {
|
|
20
|
+
...commonMediaProps,
|
|
21
|
+
poster: String,
|
|
22
|
+
playsinline: {
|
|
23
|
+
type: Boolean,
|
|
24
|
+
default: true
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
//#endregion
|
|
28
|
+
export { commonMediaProps, mediaProps };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
//#region src/media/types.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Common native and adapter media surface. Adapter-specific APIs remain on the element.
|
|
4
|
+
*/
|
|
5
|
+
export interface PlayerMedia extends HTMLElement {
|
|
6
|
+
src: string;
|
|
7
|
+
volume: number;
|
|
8
|
+
muted: boolean;
|
|
9
|
+
playbackRate: number;
|
|
10
|
+
readonly paused: boolean;
|
|
11
|
+
readonly currentTime: number;
|
|
12
|
+
readonly error: MediaError | null;
|
|
13
|
+
play: () => Promise<void>;
|
|
14
|
+
pause: () => void;
|
|
15
|
+
}
|
|
16
|
+
export interface MediaTrack {
|
|
17
|
+
src: string;
|
|
18
|
+
kind?: 'subtitles' | 'captions' | 'descriptions' | 'chapters' | 'metadata';
|
|
19
|
+
srclang?: string;
|
|
20
|
+
label?: string;
|
|
21
|
+
default?: boolean;
|
|
22
|
+
}
|
|
23
|
+
//#endregion
|
|
File without changes
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { PlayerMedia } from "./types.js";
|
|
2
|
+
import { mediaEmits } from "./events.js";
|
|
3
|
+
import { CommonMediaProps, MediaProps } from "./props.js";
|
|
4
|
+
import { EmitFn, SetupContext } from "vue";
|
|
5
|
+
//#region src/media/useMediaElement.d.ts
|
|
6
|
+
interface MediaElementOptions {
|
|
7
|
+
tag: string;
|
|
8
|
+
props: CommonMediaProps & Partial<Pick<MediaProps, 'poster' | 'playsinline'>>;
|
|
9
|
+
context: Pick<SetupContext, 'attrs' | 'slots' | 'expose'>;
|
|
10
|
+
emit: EmitFn<typeof mediaEmits>;
|
|
11
|
+
extraProps?: () => Record<string, unknown>;
|
|
12
|
+
onUnmount?: (media: PlayerMedia) => void;
|
|
13
|
+
}
|
|
14
|
+
export declare function useMediaElement({ tag, props, context, emit, extraProps, onUnmount }: MediaElementOptions): () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
15
|
+
[key: string]: any;
|
|
16
|
+
}>;
|
|
17
|
+
//#endregion
|
|
18
|
+
export {};
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { MEDIA_EVENTS } from "./events.js";
|
|
2
|
+
import { MEDIA_CONTEXT } from "../player/context.js";
|
|
3
|
+
import { h, inject, onActivated, onBeforeUnmount, onDeactivated, shallowRef, watch } from "vue";
|
|
4
|
+
//#region src/media/useMediaElement.ts
|
|
5
|
+
function useMediaElement({ tag, props, context, emit, extraProps = () => ({}), onUnmount }) {
|
|
6
|
+
const emitMedia = emit;
|
|
7
|
+
const player = inject(MEDIA_CONTEXT, null);
|
|
8
|
+
const element = shallowRef(null);
|
|
9
|
+
const isActive = shallowRef(true);
|
|
10
|
+
const initialMuted = props.muted;
|
|
11
|
+
onActivated(() => {
|
|
12
|
+
isActive.value = true;
|
|
13
|
+
});
|
|
14
|
+
onDeactivated(() => {
|
|
15
|
+
isActive.value = false;
|
|
16
|
+
});
|
|
17
|
+
context.expose({ get element() {
|
|
18
|
+
return element.value;
|
|
19
|
+
} });
|
|
20
|
+
function syncSettings(media) {
|
|
21
|
+
const store = (player === null || player === void 0 ? void 0 : player.handle.media) === media ? player.handle.store : null;
|
|
22
|
+
const muteRequest = props.muted ?? media.muted;
|
|
23
|
+
if (props.volume !== void 0 && Number.isFinite(props.volume)) {
|
|
24
|
+
const volume = Math.min(1, Math.max(0, props.volume));
|
|
25
|
+
if (store) store.setVolume(volume);
|
|
26
|
+
else if (media.volume !== volume) media.volume = volume;
|
|
27
|
+
}
|
|
28
|
+
if (store && (store.muted !== muteRequest || media.muted !== muteRequest)) store.setMuted(muteRequest);
|
|
29
|
+
else if (media.muted !== muteRequest) media.muted = muteRequest;
|
|
30
|
+
if (props.playbackRate !== void 0 && Number.isFinite(props.playbackRate) && props.playbackRate > 0) {
|
|
31
|
+
if (store) store.setPlaybackRate(props.playbackRate);
|
|
32
|
+
else if (media.playbackRate !== props.playbackRate) media.playbackRate = props.playbackRate;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
watch([element, isActive], ([media, active], [previous], onCleanup) => {
|
|
36
|
+
if (previous && previous !== media && (player === null || player === void 0 ? void 0 : player.handle.media) === previous) player.setMedia(null);
|
|
37
|
+
if (!media || !active) return;
|
|
38
|
+
player === null || player === void 0 || player.setMedia(media);
|
|
39
|
+
const listeners = MEDIA_EVENTS.map((name) => {
|
|
40
|
+
const listener = (event) => {
|
|
41
|
+
if (name === "loadedmetadata") syncSettings(media);
|
|
42
|
+
emitMedia(name, event);
|
|
43
|
+
player === null || player === void 0 || player.onMediaEvent(name, event);
|
|
44
|
+
};
|
|
45
|
+
media.addEventListener(name, listener);
|
|
46
|
+
return () => media.removeEventListener(name, listener);
|
|
47
|
+
});
|
|
48
|
+
onCleanup(() => {
|
|
49
|
+
for (const remove of listeners) remove();
|
|
50
|
+
});
|
|
51
|
+
}, { flush: "sync" });
|
|
52
|
+
watch([
|
|
53
|
+
element,
|
|
54
|
+
() => player === null || player === void 0 ? void 0 : player.handle.store,
|
|
55
|
+
() => props.volume,
|
|
56
|
+
() => props.muted,
|
|
57
|
+
() => props.playbackRate
|
|
58
|
+
], ([media]) => {
|
|
59
|
+
if (media) syncSettings(media);
|
|
60
|
+
}, { flush: "post" });
|
|
61
|
+
onBeforeUnmount(() => {
|
|
62
|
+
const media = element.value;
|
|
63
|
+
media === null || media === void 0 || media.removeAttribute("keep-alive");
|
|
64
|
+
media === null || media === void 0 || media.pause();
|
|
65
|
+
if (media) onUnmount === null || onUnmount === void 0 || onUnmount(media);
|
|
66
|
+
if ((player === null || player === void 0 ? void 0 : player.handle.media) === element.value) player === null || player === void 0 || player.setMedia(null);
|
|
67
|
+
element.value = null;
|
|
68
|
+
});
|
|
69
|
+
return () => {
|
|
70
|
+
var _props$tracks, _context$slots$defaul, _context$slots;
|
|
71
|
+
return h(tag, {
|
|
72
|
+
...context.attrs,
|
|
73
|
+
ref: element,
|
|
74
|
+
...tag === "video" || tag === "audio" ? {} : { "keep-alive": "" },
|
|
75
|
+
...props.src === void 0 ? {} : { src: props.src },
|
|
76
|
+
poster: props.poster,
|
|
77
|
+
autoplay: props.autoplay ? "" : void 0,
|
|
78
|
+
loop: props.loop ? "" : void 0,
|
|
79
|
+
preload: props.preload,
|
|
80
|
+
playsinline: props.playsinline ? "" : void 0,
|
|
81
|
+
crossorigin: props.crossorigin,
|
|
82
|
+
"^muted": initialMuted ? "" : void 0,
|
|
83
|
+
...extraProps()
|
|
84
|
+
}, [...((_props$tracks = props.tracks) === null || _props$tracks === void 0 ? void 0 : _props$tracks.map((track) => h("track", {
|
|
85
|
+
...track,
|
|
86
|
+
key: `${track.kind}:${track.src}:${track.srclang}`
|
|
87
|
+
}))) ?? [], (_context$slots$defaul = (_context$slots = context.slots)["default"]) === null || _context$slots$defaul === void 0 ? void 0 : _context$slots$defaul.call(_context$slots)]);
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//#endregion
|
|
91
|
+
export { useMediaElement };
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import "../register/video/player.js";
|
|
2
|
+
import { PlayerHandle } from "./types.js";
|
|
3
|
+
import { PropType } from "vue";
|
|
4
|
+
//#region src/player/PlayerRoot.d.ts
|
|
5
|
+
export declare const playerEmits: {
|
|
6
|
+
ready: (_player: PlayerHandle) => boolean;
|
|
7
|
+
'update:volume': (_volume: number) => boolean;
|
|
8
|
+
'update:muted': (_muted: boolean) => boolean;
|
|
9
|
+
'update:playbackRate': (_rate: number) => boolean;
|
|
10
|
+
abort: (event: Event) => boolean;
|
|
11
|
+
canplay: (event: Event) => boolean;
|
|
12
|
+
canplaythrough: (event: Event) => boolean;
|
|
13
|
+
durationchange: (event: Event) => boolean;
|
|
14
|
+
emptied: (event: Event) => boolean;
|
|
15
|
+
ended: (event: Event) => boolean;
|
|
16
|
+
enterpictureinpicture: (event: Event) => boolean;
|
|
17
|
+
error: (event: Event) => boolean;
|
|
18
|
+
leavepictureinpicture: (event: Event) => boolean;
|
|
19
|
+
loadeddata: (event: Event) => boolean;
|
|
20
|
+
loadedmetadata: (event: Event) => boolean;
|
|
21
|
+
loadstart: (event: Event) => boolean;
|
|
22
|
+
pause: (event: Event) => boolean;
|
|
23
|
+
play: (event: Event) => boolean;
|
|
24
|
+
playing: (event: Event) => boolean;
|
|
25
|
+
progress: (event: Event) => boolean;
|
|
26
|
+
ratechange: (event: Event) => boolean;
|
|
27
|
+
seeked: (event: Event) => boolean;
|
|
28
|
+
seeking: (event: Event) => boolean;
|
|
29
|
+
stalled: (event: Event) => boolean;
|
|
30
|
+
suspend: (event: Event) => boolean;
|
|
31
|
+
timeupdate: (event: Event) => boolean;
|
|
32
|
+
volumechange: (event: Event) => boolean;
|
|
33
|
+
waiting: (event: Event) => boolean;
|
|
34
|
+
};
|
|
35
|
+
declare const component: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
36
|
+
title: PropType<string | undefined>;
|
|
37
|
+
poster: PropType<string | undefined>;
|
|
38
|
+
}>, () => import("vue").VNode<import("vue").RendererNode, import("vue").RendererElement, {
|
|
39
|
+
[key: string]: any;
|
|
40
|
+
}>, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
41
|
+
ready: (_player: PlayerHandle) => boolean;
|
|
42
|
+
'update:volume': (_volume: number) => boolean;
|
|
43
|
+
'update:muted': (_muted: boolean) => boolean;
|
|
44
|
+
'update:playbackRate': (_rate: number) => boolean;
|
|
45
|
+
abort: (event: Event) => boolean;
|
|
46
|
+
canplay: (event: Event) => boolean;
|
|
47
|
+
canplaythrough: (event: Event) => boolean;
|
|
48
|
+
durationchange: (event: Event) => boolean;
|
|
49
|
+
emptied: (event: Event) => boolean;
|
|
50
|
+
ended: (event: Event) => boolean;
|
|
51
|
+
enterpictureinpicture: (event: Event) => boolean;
|
|
52
|
+
error: (event: Event) => boolean;
|
|
53
|
+
leavepictureinpicture: (event: Event) => boolean;
|
|
54
|
+
loadeddata: (event: Event) => boolean;
|
|
55
|
+
loadedmetadata: (event: Event) => boolean;
|
|
56
|
+
loadstart: (event: Event) => boolean;
|
|
57
|
+
pause: (event: Event) => boolean;
|
|
58
|
+
play: (event: Event) => boolean;
|
|
59
|
+
playing: (event: Event) => boolean;
|
|
60
|
+
progress: (event: Event) => boolean;
|
|
61
|
+
ratechange: (event: Event) => boolean;
|
|
62
|
+
seeked: (event: Event) => boolean;
|
|
63
|
+
seeking: (event: Event) => boolean;
|
|
64
|
+
stalled: (event: Event) => boolean;
|
|
65
|
+
suspend: (event: Event) => boolean;
|
|
66
|
+
timeupdate: (event: Event) => boolean;
|
|
67
|
+
volumechange: (event: Event) => boolean;
|
|
68
|
+
waiting: (event: Event) => boolean;
|
|
69
|
+
}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
70
|
+
title: PropType<string | undefined>;
|
|
71
|
+
poster: PropType<string | undefined>;
|
|
72
|
+
}>> & Readonly<{
|
|
73
|
+
onAbort?: (event: Event) => any;
|
|
74
|
+
onCanplay?: (event: Event) => any;
|
|
75
|
+
onCanplaythrough?: (event: Event) => any;
|
|
76
|
+
onDurationchange?: (event: Event) => any;
|
|
77
|
+
onEmptied?: (event: Event) => any;
|
|
78
|
+
onEnded?: (event: Event) => any;
|
|
79
|
+
onEnterpictureinpicture?: (event: Event) => any;
|
|
80
|
+
onError?: (event: Event) => any;
|
|
81
|
+
onLeavepictureinpicture?: (event: Event) => any;
|
|
82
|
+
onLoadeddata?: (event: Event) => any;
|
|
83
|
+
onLoadedmetadata?: (event: Event) => any;
|
|
84
|
+
onLoadstart?: (event: Event) => any;
|
|
85
|
+
onPause?: (event: Event) => any;
|
|
86
|
+
onPlay?: (event: Event) => any;
|
|
87
|
+
onPlaying?: (event: Event) => any;
|
|
88
|
+
onProgress?: (event: Event) => any;
|
|
89
|
+
onRatechange?: (event: Event) => any;
|
|
90
|
+
onReady?: (_player: PlayerHandle) => any;
|
|
91
|
+
onSeeked?: (event: Event) => any;
|
|
92
|
+
onSeeking?: (event: Event) => any;
|
|
93
|
+
onStalled?: (event: Event) => any;
|
|
94
|
+
onSuspend?: (event: Event) => any;
|
|
95
|
+
onTimeupdate?: (event: Event) => any;
|
|
96
|
+
"onUpdate:muted"?: (_muted: boolean) => any;
|
|
97
|
+
"onUpdate:playbackRate"?: (_rate: number) => any;
|
|
98
|
+
"onUpdate:volume"?: (_volume: number) => any;
|
|
99
|
+
onVolumechange?: (event: Event) => any;
|
|
100
|
+
onWaiting?: (event: Event) => any;
|
|
101
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
102
|
+
/**
|
|
103
|
+
* Vue component ref exposes the player handle alongside the standard instance.
|
|
104
|
+
*/
|
|
105
|
+
export declare const PlayerRoot: typeof component & {
|
|
106
|
+
new (): InstanceType<typeof component> & PlayerHandle;
|
|
107
|
+
};
|
|
108
|
+
//#endregion
|
|
109
|
+
export {};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import "../register/video/player.js";
|
|
2
|
+
import { PLAYER_CONTEXT } from "./context.js";
|
|
3
|
+
import { createPlayerActions } from "./actions.js";
|
|
4
|
+
import { createPlayerEmits } from "./events.js";
|
|
5
|
+
import { preservePlayerTree } from "./preservePlayerTree.js";
|
|
6
|
+
import { usePlayerRoot } from "./usePlayerRoot.js";
|
|
7
|
+
import { defineComponent, h, provide, withDirectives } from "vue";
|
|
8
|
+
//#region src/player/PlayerRoot.ts
|
|
9
|
+
const playerEmits = createPlayerEmits();
|
|
10
|
+
/**
|
|
11
|
+
* Vue component ref exposes the player handle alongside the standard instance.
|
|
12
|
+
*/
|
|
13
|
+
const PlayerRoot = defineComponent({
|
|
14
|
+
name: "PlayerRoot",
|
|
15
|
+
inheritAttrs: false,
|
|
16
|
+
props: {
|
|
17
|
+
title: String,
|
|
18
|
+
poster: String
|
|
19
|
+
},
|
|
20
|
+
emits: playerEmits,
|
|
21
|
+
setup(props, { attrs, slots, emit, expose }) {
|
|
22
|
+
const { element, handle } = usePlayerRoot(createPlayerActions, {
|
|
23
|
+
onReady: () => emit("ready", handle),
|
|
24
|
+
onMediaEvent: emit,
|
|
25
|
+
onVolume: (volume) => emit("update:volume", volume),
|
|
26
|
+
onMuted: (muted) => emit("update:muted", muted),
|
|
27
|
+
onPlaybackRate: (rate) => emit("update:playbackRate", rate)
|
|
28
|
+
});
|
|
29
|
+
provide(PLAYER_CONTEXT, handle);
|
|
30
|
+
expose(handle);
|
|
31
|
+
return () => {
|
|
32
|
+
var _slots$default;
|
|
33
|
+
return withDirectives(h("video-player", {
|
|
34
|
+
...attrs,
|
|
35
|
+
ref: element,
|
|
36
|
+
"content-title": props.title,
|
|
37
|
+
poster: props.poster
|
|
38
|
+
}, (_slots$default = slots["default"]) === null || _slots$default === void 0 ? void 0 : _slots$default.call(slots)), [[preservePlayerTree]]);
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
//#endregion
|
|
43
|
+
export { PlayerRoot, playerEmits };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { PlayerActions, PlayerStore } from "./types.js";
|
|
2
|
+
import { AudioPlayerStore } from "@videojs/html";
|
|
3
|
+
//#region src/player/actions.d.ts
|
|
4
|
+
export type CommonPlayerActions = Pick<AudioPlayerStore, 'play' | 'pause' | 'seek' | 'setVolume' | 'setMuted' | 'setPlaybackRate'>;
|
|
5
|
+
/**
|
|
6
|
+
* Resolve shared playback commands against the active store on every call.
|
|
7
|
+
* @param {() => AudioPlayerStore | null} getStore - Reads the currently active audio or video store.
|
|
8
|
+
* @returns {CommonPlayerActions} Commands bound to the current player.
|
|
9
|
+
*/
|
|
10
|
+
export declare function createCommonPlayerActions(getStore: () => AudioPlayerStore | null): CommonPlayerActions;
|
|
11
|
+
/**
|
|
12
|
+
* Resolve on every call so actions cannot retain an unmounted player's store.
|
|
13
|
+
* @param {() => PlayerStore | null} getStore - Reads the currently active store.
|
|
14
|
+
* @returns {PlayerActions} Commands bound to the current player.
|
|
15
|
+
*/
|
|
16
|
+
export declare function createPlayerActions(getStore: () => PlayerStore | null): PlayerActions;
|
|
17
|
+
//#endregion
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { PlayerMedia } from "../media/types.js";
|
|
2
|
+
import { PlayerHandle, PlayerTarget } from "./types.js";
|
|
3
|
+
import { MediaEventName } from "../media/events.js";
|
|
4
|
+
import { AudioPlayerHandle } from "../audio/types.js";
|
|
5
|
+
import { InjectionKey, MaybeRefOrGetter } from "vue";
|
|
6
|
+
//#region src/player/context.d.ts
|
|
7
|
+
interface MediaContext {
|
|
8
|
+
handle: Pick<AudioPlayerHandle, 'media' | 'store'>;
|
|
9
|
+
setMedia: (media: PlayerMedia | null) => void;
|
|
10
|
+
onMediaEvent: (name: MediaEventName, event: Event) => void;
|
|
11
|
+
}
|
|
12
|
+
export declare const MEDIA_CONTEXT: InjectionKey<MediaContext>;
|
|
13
|
+
export declare const PLAYER_CONTEXT: InjectionKey<PlayerHandle>;
|
|
14
|
+
export declare const AUDIO_PLAYER_CONTEXT: InjectionKey<AudioPlayerHandle>;
|
|
15
|
+
export declare function useTarget<Handle>(key: InjectionKey<Handle>, rootName: string, target?: MaybeRefOrGetter<Handle | null | undefined>): import("vue").ComputedRef<Handle | null | undefined>;
|
|
16
|
+
export declare function usePlayerTarget(target?: PlayerTarget): import("vue").ComputedRef<PlayerHandle | null | undefined>;
|
|
17
|
+
//#endregion
|
|
18
|
+
export {};
|
|
@@ -13,4 +13,4 @@ function usePlayerTarget(target) {
|
|
|
13
13
|
return useTarget(PLAYER_CONTEXT, "PlayerRoot", target);
|
|
14
14
|
}
|
|
15
15
|
//#endregion
|
|
16
|
-
export {
|
|
16
|
+
export { AUDIO_PLAYER_CONTEXT, MEDIA_CONTEXT, PLAYER_CONTEXT, usePlayerTarget, useTarget };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
//#region src/player/events.d.ts
|
|
2
|
+
export declare function createPlayerEmits<Handle>(): {
|
|
3
|
+
ready: (_player: Handle) => boolean;
|
|
4
|
+
'update:volume': (_volume: number) => boolean;
|
|
5
|
+
'update:muted': (_muted: boolean) => boolean;
|
|
6
|
+
'update:playbackRate': (_rate: number) => boolean;
|
|
7
|
+
abort: (event: Event) => boolean;
|
|
8
|
+
canplay: (event: Event) => boolean;
|
|
9
|
+
canplaythrough: (event: Event) => boolean;
|
|
10
|
+
durationchange: (event: Event) => boolean;
|
|
11
|
+
emptied: (event: Event) => boolean;
|
|
12
|
+
ended: (event: Event) => boolean;
|
|
13
|
+
enterpictureinpicture: (event: Event) => boolean;
|
|
14
|
+
error: (event: Event) => boolean;
|
|
15
|
+
leavepictureinpicture: (event: Event) => boolean;
|
|
16
|
+
loadeddata: (event: Event) => boolean;
|
|
17
|
+
loadedmetadata: (event: Event) => boolean;
|
|
18
|
+
loadstart: (event: Event) => boolean;
|
|
19
|
+
pause: (event: Event) => boolean;
|
|
20
|
+
play: (event: Event) => boolean;
|
|
21
|
+
playing: (event: Event) => boolean;
|
|
22
|
+
progress: (event: Event) => boolean;
|
|
23
|
+
ratechange: (event: Event) => boolean;
|
|
24
|
+
seeked: (event: Event) => boolean;
|
|
25
|
+
seeking: (event: Event) => boolean;
|
|
26
|
+
stalled: (event: Event) => boolean;
|
|
27
|
+
suspend: (event: Event) => boolean;
|
|
28
|
+
timeupdate: (event: Event) => boolean;
|
|
29
|
+
volumechange: (event: Event) => boolean;
|
|
30
|
+
waiting: (event: Event) => boolean;
|
|
31
|
+
};
|
|
32
|
+
//#endregion
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { mediaEmits } from "../media/events.js";
|
|
2
|
+
//#region src/player/events.ts
|
|
3
|
+
function createPlayerEmits() {
|
|
4
|
+
return {
|
|
5
|
+
...mediaEmits,
|
|
6
|
+
ready: (_player) => true,
|
|
7
|
+
"update:volume": (_volume) => true,
|
|
8
|
+
"update:muted": (_muted) => true,
|
|
9
|
+
"update:playbackRate": (_rate) => true
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//#endregion
|
|
13
|
+
export { createPlayerEmits };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { ObjectDirective } from "vue";
|
|
2
|
+
//#region src/player/preservePlayerTree.d.ts
|
|
3
|
+
/**
|
|
4
|
+
* Vue owns disposal of a player's custom elements, including skin shadow controls.
|
|
5
|
+
* Upstream otherwise permanently destroys them after two disconnected frames.
|
|
6
|
+
*/
|
|
7
|
+
export declare const preservePlayerTree: ObjectDirective<HTMLElement>;
|
|
8
|
+
//#endregion
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
//#region src/player/preservePlayerTree.ts
|
|
2
|
+
function isDestroyable(element) {
|
|
3
|
+
return "destroy" in element && typeof element.destroy === "function" && "destroyed" in element && typeof element.destroyed === "boolean";
|
|
4
|
+
}
|
|
5
|
+
const disposals = /* @__PURE__ */ new WeakMap();
|
|
6
|
+
/**
|
|
7
|
+
* Vue owns disposal of a player's custom elements, including skin shadow controls.
|
|
8
|
+
* Upstream otherwise permanently destroys them after two disconnected frames.
|
|
9
|
+
*/
|
|
10
|
+
const preservePlayerTree = {
|
|
11
|
+
beforeMount(root) {
|
|
12
|
+
const retained = /* @__PURE__ */ new Map();
|
|
13
|
+
const observer = new MutationObserver((records) => {
|
|
14
|
+
if (records.some((record) => [...record.addedNodes, ...record.removedNodes].some((node) => node.nodeType === 1))) sync();
|
|
15
|
+
});
|
|
16
|
+
function release(element, hadKeepAlive) {
|
|
17
|
+
if (!hadKeepAlive) element.removeAttribute("keep-alive");
|
|
18
|
+
if (!element.isConnected && !element.destroyed) element.destroy();
|
|
19
|
+
}
|
|
20
|
+
function sync() {
|
|
21
|
+
observer.disconnect();
|
|
22
|
+
observer.observe(root, {
|
|
23
|
+
childList: true,
|
|
24
|
+
subtree: true
|
|
25
|
+
});
|
|
26
|
+
const current = /* @__PURE__ */ new Set();
|
|
27
|
+
function visit(element) {
|
|
28
|
+
if (isDestroyable(element)) {
|
|
29
|
+
current.add(element);
|
|
30
|
+
if (!retained.has(element)) {
|
|
31
|
+
retained.set(element, element.hasAttribute("keep-alive"));
|
|
32
|
+
element.setAttribute("keep-alive", "");
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
for (const child of element.children) visit(child);
|
|
36
|
+
if (element.shadowRoot) {
|
|
37
|
+
observer.observe(element.shadowRoot, {
|
|
38
|
+
childList: true,
|
|
39
|
+
subtree: true
|
|
40
|
+
});
|
|
41
|
+
for (const child of element.shadowRoot.children) visit(child);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
visit(root);
|
|
45
|
+
for (const [element, hadKeepAlive] of retained) if (!current.has(element)) {
|
|
46
|
+
retained.delete(element);
|
|
47
|
+
release(element, hadKeepAlive);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
sync();
|
|
51
|
+
disposals.set(root, () => {
|
|
52
|
+
observer.disconnect();
|
|
53
|
+
for (const [element, hadKeepAlive] of retained) release(element, hadKeepAlive);
|
|
54
|
+
retained.clear();
|
|
55
|
+
});
|
|
56
|
+
},
|
|
57
|
+
unmounted(root) {
|
|
58
|
+
var _disposals$get;
|
|
59
|
+
(_disposals$get = disposals.get(root)) === null || _disposals$get === void 0 || _disposals$get();
|
|
60
|
+
disposals.delete(root);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
//#endregion
|
|
64
|
+
export { preservePlayerTree };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { MediaTrack, PlayerMedia } from "../media/types.js";
|
|
2
|
+
import { MaybeRefOrGetter } from "vue";
|
|
3
|
+
import { VideoPlayerStore } from "@videojs/html";
|
|
4
|
+
import { VideoPlayerElement } from "@videojs/html/video";
|
|
5
|
+
//#region src/player/types.d.ts
|
|
6
|
+
export type PlayerStore = VideoPlayerStore;
|
|
7
|
+
export type PlayerElement = Omit<VideoPlayerElement, 'store'> & {
|
|
8
|
+
readonly store: PlayerStore;
|
|
9
|
+
};
|
|
10
|
+
export type PlayerState = PlayerStore['state'];
|
|
11
|
+
export type PlayerActions = Pick<PlayerStore, 'play' | 'pause' | 'seek' | 'setVolume' | 'setMuted' | 'setPlaybackRate' | 'requestFullscreen' | 'exitFullscreen' | 'requestPictureInPicture' | 'exitPictureInPicture'>;
|
|
12
|
+
/**
|
|
13
|
+
* Live getters become null when the player is inactive or unmounted.
|
|
14
|
+
*/
|
|
15
|
+
export interface PlayerHandle extends PlayerActions {
|
|
16
|
+
readonly element: PlayerElement | null;
|
|
17
|
+
readonly store: PlayerStore | null;
|
|
18
|
+
readonly media: PlayerMedia | null;
|
|
19
|
+
}
|
|
20
|
+
export type PlayerTarget = MaybeRefOrGetter<PlayerHandle | null | undefined>;
|
|
21
|
+
//#endregion
|
|
22
|
+
export type { MediaTrack, PlayerMedia };
|
|
File without changes
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { PlayerMedia } from "../media/types.js";
|
|
2
|
+
import { MediaEventName } from "../media/events.js";
|
|
3
|
+
import { CommonPlayerActions } from "./actions.js";
|
|
4
|
+
import { ShallowRef } from "vue";
|
|
5
|
+
import { AudioPlayerStore } from "@videojs/html";
|
|
6
|
+
//#region src/player/usePlayerRoot.d.ts
|
|
7
|
+
interface RootCallbacks {
|
|
8
|
+
onReady: () => void;
|
|
9
|
+
onMediaEvent: (name: MediaEventName, event: Event) => void;
|
|
10
|
+
onVolume: (volume: number) => void;
|
|
11
|
+
onMuted: (muted: boolean) => void;
|
|
12
|
+
onPlaybackRate: (rate: number) => void;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Share lifecycle and media synchronization without registering either preset.
|
|
16
|
+
* @param {(getStore: () => Store | null) => Actions} createActions - Binds the preset's commands to the active store.
|
|
17
|
+
* @param {RootCallbacks} callbacks - Forward lifecycle, media, and confirmed setting events.
|
|
18
|
+
* @returns {object} The root element ref and live player handle.
|
|
19
|
+
*/
|
|
20
|
+
export declare function usePlayerRoot<Store extends AudioPlayerStore, Element extends HTMLElement & {
|
|
21
|
+
readonly store: Store;
|
|
22
|
+
readonly updateComplete: Promise<boolean>;
|
|
23
|
+
}, Actions extends CommonPlayerActions>(createActions: (getStore: () => Store | null) => Actions, callbacks: RootCallbacks): {
|
|
24
|
+
element: ShallowRef<Element | null>;
|
|
25
|
+
handle: Actions & {
|
|
26
|
+
readonly element: Element | null;
|
|
27
|
+
readonly store: Store | null;
|
|
28
|
+
readonly media: PlayerMedia | null;
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
//#endregion
|
|
32
|
+
export {};
|