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.
Files changed (181) hide show
  1. package/README.md +6 -0
  2. package/dist/{Audio-DmoQgIRM.d.ts → audio/Audio.d.ts} +4 -5
  3. package/dist/audio/Audio.js +21 -0
  4. package/dist/audio/AudioPlayer.d.ts +948 -0
  5. package/dist/audio/AudioPlayer.js +10 -0
  6. package/dist/{AudioPlayerRoot-D47326rh.d.ts → audio/AudioPlayerRoot.d.ts} +34 -4
  7. package/dist/audio/AudioPlayerRoot.js +43 -0
  8. package/dist/audio/composables.d.ts +1 -1
  9. package/dist/audio/composables.js +11 -5
  10. package/dist/audio/core.d.ts +6 -5
  11. package/dist/audio/core.js +3 -1
  12. package/dist/audio/createAudioPlayer.d.ts +954 -0
  13. package/dist/{createAudioPlayer-BqZWB8il.js → audio/createAudioPlayer.js} +16 -8
  14. package/dist/audio/default.d.ts +5 -4
  15. package/dist/audio/default.js +1 -1
  16. package/dist/audio/index.d.ts +13 -952
  17. package/dist/audio/index.js +4 -9
  18. package/dist/audio/neutral.d.ts +5 -4
  19. package/dist/audio/neutral.js +1 -1
  20. package/dist/audio/skins/createAudioSkin.d.ts +5 -0
  21. package/dist/audio/skins/createAudioSkin.js +20 -0
  22. package/dist/audio/skins/default.d.ts +6 -2
  23. package/dist/audio/skins/default.js +1 -1
  24. package/dist/audio/skins/neutral.d.ts +6 -2
  25. package/dist/audio/skins/neutral.js +1 -1
  26. package/dist/audio/skins.d.ts +3 -0
  27. package/dist/audio/skins.js +3 -0
  28. package/dist/audio/types.d.ts +22 -0
  29. package/dist/audio/types.js +0 -0
  30. package/dist/composables/index.d.ts +3 -2
  31. package/dist/composables/index.js +3 -1
  32. package/dist/composables/usePlayerActions.d.ts +9 -0
  33. package/dist/composables/usePlayerActions.js +17 -0
  34. package/dist/composables/usePlayerState.d.ts +12 -0
  35. package/dist/composables/usePlayerState.js +19 -0
  36. package/dist/composables/useStoreSelection.d.ts +9 -0
  37. package/dist/{useStoreSelection-BFUpSMPo.js → composables/useStoreSelection.js} +1 -1
  38. package/dist/core/index.d.ts +6 -2
  39. package/dist/core/index.js +3 -1
  40. package/dist/i18n/MediaI18n.d.ts +16 -0
  41. package/dist/i18n/MediaI18n.js +26 -0
  42. package/dist/i18n/MediaText.d.ts +14 -0
  43. package/dist/i18n/MediaText.js +37 -0
  44. package/dist/i18n/index.d.ts +3 -29
  45. package/dist/i18n/index.js +2 -52
  46. package/dist/index.d.ts +16 -5
  47. package/dist/index.js +5 -9
  48. package/dist/media/Video.d.ts +79 -0
  49. package/dist/media/Video.js +21 -0
  50. package/dist/media/events.d.ts +5 -0
  51. package/dist/media/events.js +30 -0
  52. package/dist/media/hls.d.ts +1 -2
  53. package/dist/media/hls.js +3 -1
  54. package/dist/media/props.d.ts +45 -0
  55. package/dist/media/props.js +28 -0
  56. package/dist/media/types.d.ts +23 -0
  57. package/dist/media/types.js +0 -0
  58. package/dist/media/useMediaElement.d.ts +18 -0
  59. package/dist/media/useMediaElement.js +91 -0
  60. package/dist/node_modules/.pnpm/@vue_reactivity@3.5.43/node_modules/@vue/reactivity/dist/reactivity.d.ts +3 -0
  61. package/dist/player/PlayerRoot.d.ts +109 -0
  62. package/dist/player/PlayerRoot.js +43 -0
  63. package/dist/player/actions.d.ts +17 -0
  64. package/dist/{actions-CRZ5C4-3.js → player/actions.js} +1 -1
  65. package/dist/player/context.d.ts +18 -0
  66. package/dist/{context-Zjy9Z5Uy.js → player/context.js} +1 -1
  67. package/dist/player/events.d.ts +32 -0
  68. package/dist/player/events.js +13 -0
  69. package/dist/player/preservePlayerTree.d.ts +8 -0
  70. package/dist/player/preservePlayerTree.js +64 -0
  71. package/dist/player/types.d.ts +22 -0
  72. package/dist/player/types.js +0 -0
  73. package/dist/player/usePlayerRoot.d.ts +32 -0
  74. package/dist/player/usePlayerRoot.js +89 -0
  75. package/dist/polyfills.d.ts +2 -0
  76. package/dist/polyfills.js +2 -0
  77. package/dist/register/audio/player.d.ts +1 -1
  78. package/dist/register/i18n.d.ts +1 -1
  79. package/dist/register/video/compat-skin.d.ts +1 -0
  80. package/dist/register/video/compat-skin.js +1 -0
  81. package/dist/register/video/neutral-skin.d.ts +1 -1
  82. package/dist/register/video/player.d.ts +1 -1
  83. package/dist/register/video/skin.d.ts +1 -1
  84. package/dist/skins/compat.d.ts +6 -0
  85. package/dist/skins/compat.js +6 -0
  86. package/dist/skins/createVideoSkin.d.ts +5 -0
  87. package/dist/skins/createVideoSkin.js +25 -0
  88. package/dist/skins/default.d.ts +6 -2
  89. package/dist/skins/default.js +1 -1
  90. package/dist/skins/index.d.ts +3 -0
  91. package/dist/skins/index.js +3 -0
  92. package/dist/skins/legacy/LegacyControls.d.ts +8 -0
  93. package/dist/skins/legacy/LegacyControls.js +89 -0
  94. package/dist/skins/legacy/useLegacySize.d.ts +9 -0
  95. package/dist/skins/legacy/useLegacySize.js +32 -0
  96. package/dist/skins/legacy.css +160 -0
  97. package/dist/skins/legacy.d.ts +6 -0
  98. package/dist/skins/legacy.js +36 -0
  99. package/dist/skins/neutral.d.ts +6 -2
  100. package/dist/skins/neutral.js +1 -1
  101. package/dist/skins/withSlot.d.ts +10 -0
  102. package/dist/{withSlot-DQS-dOOR.js → skins/withSlot.js} +1 -1
  103. package/dist/ui/captions-button.d.ts +1 -1
  104. package/dist/ui/captions-button.js +3 -3
  105. package/dist/ui/container.d.ts +1 -1
  106. package/dist/ui/container.js +2 -2
  107. package/dist/ui/controls-content.d.ts +1 -1
  108. package/dist/ui/controls-content.js +2 -2
  109. package/dist/ui/controls-group.d.ts +1 -1
  110. package/dist/ui/controls-group.js +2 -2
  111. package/dist/ui/controls.d.ts +1 -1
  112. package/dist/ui/controls.js +2 -2
  113. package/dist/ui/createElementComponent.d.ts +10 -0
  114. package/dist/{createElementComponent-CUeAF_JU.js → ui/createElementComponent.js} +6 -3
  115. package/dist/ui/fullscreen-button.d.ts +1 -1
  116. package/dist/ui/fullscreen-button.js +3 -3
  117. package/dist/ui/hotkey.d.ts +1 -1
  118. package/dist/ui/hotkey.js +3 -3
  119. package/dist/ui/index.d.ts +10 -10
  120. package/dist/ui/index.js +21 -21
  121. package/dist/ui/mute-button.d.ts +1 -1
  122. package/dist/ui/mute-button.js +3 -3
  123. package/dist/ui/pip-button.d.ts +1 -1
  124. package/dist/ui/pip-button.js +3 -3
  125. package/dist/ui/play-button.d.ts +1 -1
  126. package/dist/ui/play-button.js +3 -3
  127. package/dist/ui/poster.d.ts +1 -1
  128. package/dist/ui/poster.js +2 -2
  129. package/dist/ui/props.d.ts +25 -0
  130. package/dist/{props-D3O1wYXT.js → ui/props.js} +1 -1
  131. package/dist/ui/seek-button.d.ts +1 -1
  132. package/dist/ui/seek-button.js +3 -3
  133. package/dist/ui/slider-buffer.d.ts +1 -1
  134. package/dist/ui/slider-buffer.js +2 -2
  135. package/dist/ui/slider-fill.d.ts +1 -1
  136. package/dist/ui/slider-fill.js +2 -2
  137. package/dist/ui/slider-thumb.d.ts +1 -1
  138. package/dist/ui/slider-thumb.js +2 -2
  139. package/dist/ui/slider-track.d.ts +1 -1
  140. package/dist/ui/slider-track.js +2 -2
  141. package/dist/ui/status-announcer.d.ts +1 -1
  142. package/dist/ui/status-announcer.js +2 -2
  143. package/dist/ui/time-slider.d.ts +1 -1
  144. package/dist/ui/time-slider.js +3 -3
  145. package/dist/ui/time.d.ts +1 -1
  146. package/dist/ui/time.js +3 -3
  147. package/dist/ui/volume-slider.d.ts +1 -1
  148. package/dist/ui/volume-slider.js +3 -3
  149. package/dist/{index-DhJ5A5TI.d.ts → video/VideoPlayer.d.ts} +21 -233
  150. package/dist/video/VideoPlayer.js +10 -0
  151. package/dist/video/compat.d.ts +1068 -0
  152. package/dist/video/compat.js +6 -0
  153. package/dist/video/createVideoPlayer.d.ts +1076 -0
  154. package/dist/{createVideoPlayer-CU9HWSAy.js → video/createVideoPlayer.js} +17 -9
  155. package/dist/video/default.d.ts +18 -15
  156. package/dist/video/default.js +1 -1
  157. package/dist/video/legacy.d.ts +1068 -0
  158. package/dist/video/legacy.js +6 -0
  159. package/dist/video/neutral.d.ts +18 -15
  160. package/dist/video/neutral.js +1 -1
  161. package/package.json +38 -7
  162. package/dist/Audio-D-RH-zmq.js +0 -55
  163. package/dist/Video-fUL_ClzK.js +0 -55
  164. package/dist/createAudioPlayer-BhUZLd4H.d.ts +0 -11
  165. package/dist/createAudioSkin-BNmtEp7u.js +0 -17
  166. package/dist/createVideoSkin-BxpJYgKe.js +0 -22
  167. package/dist/default-3MW_94HC.d.ts +0 -7
  168. package/dist/default-C4INOLJr.d.ts +0 -7
  169. package/dist/i18n-C4MwExsj.d.ts +0 -1
  170. package/dist/neutral-DWxkiOeo.d.ts +0 -7
  171. package/dist/neutral-skin-B8htnvI5.d.ts +0 -1
  172. package/dist/neutral-x5edtrGj.d.ts +0 -7
  173. package/dist/player-DwjY3MEu.d.ts +0 -1
  174. package/dist/player-RUaCdKKE.d.ts +0 -1
  175. package/dist/skin-0b-NvVj8.d.ts +0 -1
  176. package/dist/types-DR9kogyX.d.ts +0 -24
  177. package/dist/types-wAkjM01D.d.ts +0 -42
  178. package/dist/useMediaElement-CO_r--i0.js +0 -143
  179. package/dist/usePlayerActions-D3ILoEVZ.js +0 -28
  180. package/dist/usePlayerActions-McyRKswV.d.ts +0 -21
  181. 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 };
@@ -1,5 +1,4 @@
1
- import { t as MediaTrack } from "../types-wAkjM01D.js";
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 { a as mediaEmits, r as mediaProps, t as useMediaElement } from "../useMediaElement-CO_r--i0.js";
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,3 @@
1
+ //#region node_modules/.pnpm/@vue+reactivity@3.5.43/node_modules/@vue/reactivity/dist/reactivity.d.ts
2
+ export type OnCleanup = (cleanupFn: () => void) => void;
3
+ //#endregion
@@ -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
@@ -56,4 +56,4 @@ function createPlayerActions(getStore) {
56
56
  };
57
57
  }
58
58
  //#endregion
59
- export { createPlayerActions as n, createCommonPlayerActions as t };
59
+ export { createCommonPlayerActions, createPlayerActions };
@@ -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 { useTarget as a, usePlayerTarget as i, MEDIA_CONTEXT as n, PLAYER_CONTEXT as r, AUDIO_PLAYER_CONTEXT as t };
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 {};