@maas/vue-equipment 0.11.6 → 0.12.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 (39) hide show
  1. package/dist/nuxt/module.json +1 -1
  2. package/dist/nuxt/module.mjs +1 -1
  3. package/dist/plugins/MagicModal/src/composables/private/useModalStore.d.ts +2 -2
  4. package/dist/plugins/MagicModal/src/composables/private/useModalStore.mjs +4 -4
  5. package/dist/plugins/MagicModal/src/composables/useModalApi.mjs +3 -3
  6. package/dist/plugins/MagicPlayer/index.d.ts +2 -7
  7. package/dist/plugins/MagicPlayer/index.mjs +4 -25
  8. package/dist/plugins/MagicPlayer/nuxt.mjs +1 -13
  9. package/dist/plugins/MagicPlayer/src/components/MagicPlayer.vue +21 -16
  10. package/dist/plugins/MagicPlayer/src/components/MagicPlayer.vue.d.ts +10 -29
  11. package/dist/plugins/MagicPlayer/src/components/MagicPlayerControls.vue +73 -91
  12. package/dist/plugins/MagicPlayer/src/components/MagicPlayerControls.vue.d.ts +16 -16
  13. package/dist/plugins/MagicPlayer/src/components/MagicPlayerMuxPopover.vue +11 -11
  14. package/dist/plugins/MagicPlayer/src/components/MagicPlayerMuxPopover.vue.d.ts +8 -0
  15. package/dist/plugins/MagicPlayer/src/components/MagicPlayerOverlay.vue +97 -0
  16. package/dist/plugins/MagicPlayer/src/components/MagicPlayerOverlay.vue.d.ts +21 -0
  17. package/dist/plugins/MagicPlayer/src/components/MagicPlayerTimeline.vue +25 -15
  18. package/dist/plugins/MagicPlayer/src/components/MagicPlayerTimeline.vue.d.ts +11 -1
  19. package/dist/plugins/MagicPlayer/src/components/icons/Waiting.vue +1 -1
  20. package/dist/plugins/MagicPlayer/src/composables/{useControlsApi.d.ts → private/useControlsApi.d.ts} +8 -8
  21. package/dist/plugins/MagicPlayer/src/composables/{useControlsApi.mjs → private/useControlsApi.mjs} +23 -20
  22. package/dist/plugins/MagicPlayer/src/composables/{useMediaApi.d.ts → private/useMediaApi.d.ts} +2 -2
  23. package/dist/plugins/MagicPlayer/src/composables/{useMediaApi.mjs → private/useMediaApi.mjs} +29 -28
  24. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerInternalApi.d.ts +18 -0
  25. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerInternalApi.mjs +63 -0
  26. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerStore.d.ts +18 -0
  27. package/dist/plugins/MagicPlayer/src/composables/private/usePlayerStore.mjs +36 -0
  28. package/dist/plugins/MagicPlayer/src/composables/{useRuntimeSourceProvider.d.ts → private/useRuntimeSourceProvider.d.ts} +1 -3
  29. package/dist/plugins/MagicPlayer/src/composables/usePlayerApi.d.ts +2 -17
  30. package/dist/plugins/MagicPlayer/src/composables/usePlayerApi.mjs +62 -43
  31. package/dist/plugins/MagicPlayer/src/types/index.d.ts +14 -3
  32. package/package.json +1 -1
  33. package/dist/plugins/MagicPlayer/src/composables/useControls.d.ts +0 -8
  34. package/dist/plugins/MagicPlayer/src/composables/useControls.mjs +0 -15
  35. package/dist/plugins/MagicPlayer/src/composables/usePlayer.d.ts +0 -12
  36. package/dist/plugins/MagicPlayer/src/composables/usePlayer.mjs +0 -33
  37. package/dist/plugins/MagicPlayer/src/symbols/index.d.ts +0 -45
  38. package/dist/plugins/MagicPlayer/src/symbols/index.mjs +0 -10
  39. /package/dist/plugins/MagicPlayer/src/composables/{useRuntimeSourceProvider.mjs → private/useRuntimeSourceProvider.mjs} +0 -0
@@ -0,0 +1,97 @@
1
+ <template>
2
+ <div
3
+ class="magic-player-overlay"
4
+ :class="{
5
+ '-playing': playing,
6
+ '-paused': !playing,
7
+ '-idle': idle,
8
+ '-not-idle': !idle,
9
+ '-hover': mouseEntered,
10
+ '-not-hover': !mouseEntered,
11
+ }"
12
+ @click.stop="togglePlay"
13
+ >
14
+ <template v-if="waiting">
15
+ <button class="magic-player-overlay__button">
16
+ <slot name="waitingIcon">
17
+ <icon-waiting />
18
+ </slot>
19
+ </button>
20
+ </template>
21
+ <template v-else>
22
+ <button v-if="!playing" class="magic-player-overlay__button">
23
+ <slot name="playIcon">
24
+ <icon-play />
25
+ </slot>
26
+ </button>
27
+ <button v-else class="magic-player-overlay__button">
28
+ <slot name="pauseIcon">
29
+ <icon-pause />
30
+ </slot>
31
+ </button>
32
+ </template>
33
+ </div>
34
+ </template>
35
+
36
+ <script setup lang="ts">
37
+ import { toRefs } from 'vue'
38
+ import { useIdle } from '@vueuse/core'
39
+ import IconPlay from './icons/Play.vue'
40
+ import IconPause from './icons/Pause.vue'
41
+ import IconWaiting from './icons/Waiting.vue'
42
+ import { usePlayerApi } from '../composables/usePlayerApi'
43
+
44
+ interface Props {
45
+ id: string
46
+ }
47
+
48
+ const props = defineProps<Props>()
49
+
50
+ const { instance } = usePlayerApi(props.id)
51
+
52
+ const { playing, waiting } = toRefs(instance.value.mediaApi)
53
+ const { mouseEntered } = toRefs(instance.value.playerApi)
54
+ const { togglePlay } = instance.value.playerApi
55
+
56
+ const { idle } = useIdle(3000)
57
+ </script>
58
+
59
+ <style lang="css">
60
+ :root {
61
+ --magic-player-overlay-background-color: rgba(0, 0, 0, 0.3);
62
+ --magic-player-overlay-color: rgba(255, 255, 255, 1);
63
+ --magic-player-overlay-button-size: 2.5rem;
64
+ }
65
+
66
+ .magic-player-overlay {
67
+ position: absolute;
68
+ inset: 0;
69
+ background-color: var(--magic-player-overlay-background-color);
70
+ color: var(--magic-player-overlay-color);
71
+ transition-duration: 300ms;
72
+ transition-property: opacity;
73
+ transition-timing-function: ease;
74
+ display: flex;
75
+ align-items: center;
76
+ justify-content: center;
77
+ cursor: pointer;
78
+ }
79
+
80
+ .magic-player-overlay__button {
81
+ background-color: transparent;
82
+ color: inherit;
83
+ border: 0;
84
+ border-radius: 0;
85
+ padding: 0;
86
+ outline: none;
87
+ appearance: none;
88
+ cursor: pointer;
89
+ width: var(--magic-player-overlay-button-size);
90
+ height: var(--magic-player-overlay-button-size);
91
+ }
92
+
93
+ .magic-player-overlay.-playing.-idle,
94
+ .magic-player-overlay.-playing.-not-hover {
95
+ opacity: 0;
96
+ }
97
+ </style>
@@ -0,0 +1,21 @@
1
+ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{
2
+ id: {
3
+ type: import("vue").PropType<string>;
4
+ required: true;
5
+ };
6
+ }, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
7
+ id: {
8
+ type: import("vue").PropType<string>;
9
+ required: true;
10
+ };
11
+ }>>, {}, {}>, {
12
+ waitingIcon?(_: {}): any;
13
+ playIcon?(_: {}): any;
14
+ pauseIcon?(_: {}): any;
15
+ }>;
16
+ export default _default;
17
+ type __VLS_WithTemplateSlots<T, S> = T & {
18
+ new (): {
19
+ $slots: S;
20
+ };
21
+ };
@@ -2,11 +2,11 @@
2
2
  <div class="magic-player-timeline">
3
3
  <div
4
4
  class="magic-player-timeline__target"
5
- @mouseenter="onMouseEnter"
6
- @mouseleave="onMouseLeave"
7
- @pointerdown="onPointerDown"
8
- @pointerup="onPointerUp"
9
- @pointermove="onPointerMove"
5
+ @mouseenter="onMouseenter"
6
+ @mouseleave="onMouseleave"
7
+ @pointerdown="onPointerdown"
8
+ @pointerup="onPointerup"
9
+ @pointermove="onPointermove"
10
10
  >
11
11
  <div class="magic-player-timeline__slider-track">
12
12
  <div
@@ -21,7 +21,7 @@
21
21
  :style="{ left: `${bufferedPercentage}%` }"
22
22
  />
23
23
  <div
24
- v-show="entered"
24
+ v-show="mouseEntered"
25
25
  class="magic-player-timeline__slider-seeked"
26
26
  :style="{ left: `${seekedPercentage}%` }"
27
27
  />
@@ -36,20 +36,30 @@
36
36
  </template>
37
37
 
38
38
  <script setup lang="ts">
39
- import { useInjectControls } from '../composables/useControls'
39
+ import { toRefs } from 'vue'
40
+ import { usePlayerApi } from '../composables/usePlayerApi'
41
+
42
+ interface Props {
43
+ id: string
44
+ }
45
+
46
+ const props = defineProps<Props>()
47
+ const { instance } = usePlayerApi(props.id)
40
48
 
41
- const { controlsApi } = useInjectControls()
42
49
  const {
43
- entered,
50
+ mouseEntered,
44
51
  seekedPercentage,
45
52
  scrubbedPercentage,
46
53
  bufferedPercentage,
47
- onMouseEnter,
48
- onMouseLeave,
49
- onPointerDown,
50
- onPointerUp,
51
- onPointerMove,
52
- } = controlsApi
54
+ } = toRefs(instance.value.controlsApi)
55
+
56
+ const {
57
+ onMouseenter,
58
+ onMouseleave,
59
+ onPointerdown,
60
+ onPointerup,
61
+ onPointermove,
62
+ } = instance.value.controlsApi
53
63
  </script>
54
64
 
55
65
  <style lang="css">
@@ -1,2 +1,12 @@
1
- declare const _default: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}, {}>;
1
+ declare const _default: import("vue").DefineComponent<{
2
+ id: {
3
+ type: import("vue").PropType<string>;
4
+ required: true;
5
+ };
6
+ }, {}, unknown, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{
7
+ id: {
8
+ type: import("vue").PropType<string>;
9
+ required: true;
10
+ };
11
+ }>>, {}, {}>;
2
12
  export default _default;
@@ -7,7 +7,7 @@
7
7
  fill="none"
8
8
  stroke-width="4"
9
9
  stroke-linecap="round"
10
- ></circle>
10
+ />
11
11
  </svg>
12
12
  </template>
13
13
 
@@ -1,6 +1,6 @@
1
- import type { UseControlsArgs } from '../types.js';
2
- export declare function useControlsApi(args: UseControlsArgs): {
3
- entered: import("vue").Ref<boolean>;
1
+ import type { UseControlsApiArgs } from '../../types.js';
2
+ export declare function useControlsApi(args: UseControlsApiArgs): {
3
+ mouseEntered: import("vue").Ref<boolean>;
4
4
  dragging: import("vue").Ref<boolean>;
5
5
  seekedTime: import("vue").Ref<number>;
6
6
  seekedPercentage: import("vue").Ref<number>;
@@ -8,10 +8,10 @@ export declare function useControlsApi(args: UseControlsArgs): {
8
8
  bufferedPercentage: import("vue").ComputedRef<any>;
9
9
  thumbPercentage: import("vue").Ref<number>;
10
10
  popoverOffsetX: import("vue").Ref<number>;
11
- onMouseEnter: () => void;
12
- onMouseLeave: () => void;
13
- onPointerDown: (e: MouseEvent | TouchEvent) => void;
14
- onPointerUp: () => void;
15
- onPointerMove: (e: MouseEvent | TouchEvent) => void;
11
+ onMouseenter: () => void;
12
+ onMouseleave: () => void;
13
+ onPointerdown: (e: MouseEvent | TouchEvent) => void;
14
+ onPointerup: () => void;
15
+ onPointermove: (e: MouseEvent | TouchEvent) => void;
16
16
  };
17
17
  export type UseControlsApiReturn = ReturnType<typeof useControlsApi>;
@@ -1,24 +1,27 @@
1
- import { ref, computed, watch, toValue } from "vue";
1
+ import { ref, computed, watch, toValue, toRefs } from "vue";
2
2
  import {
3
3
  useResizeObserver,
4
4
  useEventListener,
5
5
  defaultWindow
6
6
  } from "@vueuse/core";
7
7
  import { clampValue, mapValue } from "@maas/vue-equipment/utils";
8
- import { useInjectPlayer } from "./usePlayer.mjs";
8
+ import { usePlayerStore } from "./usePlayerStore.mjs";
9
9
  export function useControlsApi(args) {
10
- const { mediaApi, playerApi } = useInjectPlayer();
11
- const { playing, buffered, duration, currentTime } = mediaApi;
12
- const { play, pause, seek } = playerApi;
13
- const entered = ref(false);
10
+ const { findInstance } = usePlayerStore();
11
+ const instance = findInstance(toValue(args.id));
12
+ const { buffered, duration, playing, currentTime } = toRefs(instance.mediaApi);
13
+ const { play, pause, seek } = instance.playerApi;
14
14
  const dragging = ref(false);
15
+ const mouseEntered = ref(false);
15
16
  const seekedTime = ref(0);
16
17
  const seekedPercentage = ref(0);
17
18
  const scrubbedPercentage = ref(0);
18
19
  const thumbPercentage = ref(0);
19
20
  const popoverOffsetX = ref(0);
20
21
  const bufferedPercentage = computed(() => {
21
- const endBuffer = buffered.value.length > 0 ? buffered.value[0][1] : 0;
22
+ if (!instance?.mediaApi)
23
+ return 0;
24
+ const endBuffer = buffered.value?.length > 0 ? buffered.value[0][1] : 0;
22
25
  const percentage = endBuffer / duration.value * 100;
23
26
  return clampValue(percentage, 0, thumbPercentage.value);
24
27
  });
@@ -60,30 +63,30 @@ export function useControlsApi(args) {
60
63
  }
61
64
  getPopoverOffsetX();
62
65
  }
63
- function onMouseEnter() {
66
+ function onMouseenter() {
64
67
  getTimelineTrackSize();
65
68
  getPopoverSizes();
66
- entered.value = true;
69
+ mouseEntered.value = true;
67
70
  }
68
- function onMouseLeave() {
69
- entered.value = false;
71
+ function onMouseleave() {
72
+ mouseEntered.value = false;
70
73
  dragging.value = false;
71
74
  seekedTime.value = 0;
72
75
  }
73
- function onPointerDown(e) {
76
+ function onPointerdown(e) {
74
77
  dragging.value = true;
75
78
  resumePlay.value = playing.value;
76
79
  pause();
77
80
  const x = e instanceof MouseEvent ? e.pageX : e.touches[0].pageX;
78
81
  seekToTrackPosition(x);
79
82
  }
80
- function onPointerUp() {
83
+ function onPointerup() {
81
84
  dragging.value = false;
82
85
  if (resumePlay.value) {
83
86
  play();
84
87
  }
85
88
  }
86
- function onPointerMove(e) {
89
+ function onPointermove(e) {
87
90
  const x = e instanceof MouseEvent ? e.pageX : e.touches[0].pageX;
88
91
  seekToTrackPosition(x);
89
92
  }
@@ -111,7 +114,7 @@ export function useControlsApi(args) {
111
114
  }
112
115
  );
113
116
  return {
114
- entered,
117
+ mouseEntered,
115
118
  dragging,
116
119
  seekedTime,
117
120
  seekedPercentage,
@@ -119,10 +122,10 @@ export function useControlsApi(args) {
119
122
  bufferedPercentage,
120
123
  thumbPercentage,
121
124
  popoverOffsetX,
122
- onMouseEnter,
123
- onMouseLeave,
124
- onPointerDown,
125
- onPointerUp,
126
- onPointerMove
125
+ onMouseenter,
126
+ onMouseleave,
127
+ onPointerdown,
128
+ onPointerup,
129
+ onPointermove
127
130
  };
128
131
  }
@@ -1,5 +1,5 @@
1
- import { type MaybeRef } from 'vue';
2
- export declare function useMediaApi(target: MaybeRef<HTMLMediaElement | null | undefined>): {
1
+ import type { UseMediaApiArgs } from '../../types.js';
2
+ export declare function useMediaApi(args: UseMediaApiArgs): {
3
3
  currentTime: import("vue").Ref<number>;
4
4
  duration: import("vue").Ref<number>;
5
5
  waiting: import("vue").Ref<boolean>;
@@ -1,6 +1,6 @@
1
1
  import { ref, watch, unref, toValue } from "vue";
2
2
  import { useEventListener, watchIgnorable } from "@vueuse/core";
3
- export function useMediaApi(target) {
3
+ export function useMediaApi(args) {
4
4
  const currentTime = ref(0);
5
5
  const duration = ref(0);
6
6
  const seeking = ref(false);
@@ -12,26 +12,27 @@ export function useMediaApi(target) {
12
12
  const stalled = ref(false);
13
13
  const buffered = ref([]);
14
14
  const muted = ref(false);
15
+ const { mediaRef } = args;
15
16
  function timeRangeToArray(timeRanges) {
16
17
  let ranges = [];
17
18
  for (let i = 0; i < timeRanges.length; ++i)
18
19
  ranges = [...ranges, [timeRanges.start(i), timeRanges.end(i)]];
19
20
  return ranges;
20
21
  }
21
- watch([target, volume], () => {
22
- const el = toValue(target);
22
+ watch([mediaRef, volume], () => {
23
+ const el = toValue(mediaRef);
23
24
  if (!el)
24
25
  return;
25
26
  el.volume = volume.value;
26
27
  });
27
- watch([target, muted], () => {
28
- const el = toValue(target);
28
+ watch([mediaRef, muted], () => {
29
+ const el = toValue(mediaRef);
29
30
  if (!el)
30
31
  return;
31
32
  el.muted = muted.value;
32
33
  });
33
- watch([target, rate], () => {
34
- const el = toValue(target);
34
+ watch([mediaRef, rate], () => {
35
+ const el = toValue(mediaRef);
35
36
  if (!el)
36
37
  return;
37
38
  el.playbackRate = rate.value;
@@ -39,7 +40,7 @@ export function useMediaApi(target) {
39
40
  const { ignoreUpdates: ignoreCurrentTimeUpdates } = watchIgnorable(
40
41
  currentTime,
41
42
  (time) => {
42
- const el = toValue(target);
43
+ const el = toValue(mediaRef);
43
44
  if (!el)
44
45
  return;
45
46
  el.currentTime = unref(time);
@@ -48,58 +49,58 @@ export function useMediaApi(target) {
48
49
  const { ignoreUpdates: ignorePlayingUpdates } = watchIgnorable(
49
50
  playing,
50
51
  (isPlaying) => {
51
- const el = toValue(target);
52
+ const el = toValue(mediaRef);
52
53
  if (!el)
53
54
  return;
54
55
  isPlaying ? el.play() : el.pause();
55
56
  }
56
57
  );
57
- useEventListener(target, "timeupdate", () => {
58
+ useEventListener(mediaRef, "timeupdate", () => {
58
59
  ignoreCurrentTimeUpdates(
59
- () => currentTime.value = toValue(target).currentTime
60
+ () => currentTime.value = toValue(mediaRef).currentTime
60
61
  );
61
62
  });
62
- useEventListener(target, "durationchange", () => {
63
- duration.value = toValue(target).duration;
63
+ useEventListener(mediaRef, "durationchange", () => {
64
+ duration.value = toValue(mediaRef).duration;
64
65
  });
65
- useEventListener(target, "progress", () => {
66
- buffered.value = timeRangeToArray(toValue(target).buffered);
66
+ useEventListener(mediaRef, "progress", () => {
67
+ buffered.value = timeRangeToArray(toValue(mediaRef).buffered);
67
68
  });
68
- useEventListener(target, "seeking", () => {
69
+ useEventListener(mediaRef, "seeking", () => {
69
70
  seeking.value = true;
70
71
  });
71
- useEventListener(target, "seeked", () => {
72
+ useEventListener(mediaRef, "seeked", () => {
72
73
  seeking.value = false;
73
74
  });
74
- useEventListener(target, ["waiting", "loadstart"], () => {
75
+ useEventListener(mediaRef, ["waiting", "loadstart"], () => {
75
76
  waiting.value = true;
76
77
  ignorePlayingUpdates(() => playing.value = false);
77
78
  });
78
- useEventListener(target, "loadeddata", () => {
79
+ useEventListener(mediaRef, "loadeddata", () => {
79
80
  waiting.value = false;
80
81
  });
81
- useEventListener(target, "playing", () => {
82
+ useEventListener(mediaRef, "playing", () => {
82
83
  waiting.value = false;
83
84
  ended.value = false;
84
85
  ignorePlayingUpdates(() => playing.value = true);
85
86
  });
86
- useEventListener(target, "ratechange", () => {
87
- rate.value = toValue(target).playbackRate;
87
+ useEventListener(mediaRef, "ratechange", () => {
88
+ rate.value = toValue(mediaRef).playbackRate;
88
89
  });
89
- useEventListener(target, "stalled", () => {
90
+ useEventListener(mediaRef, "stalled", () => {
90
91
  stalled.value = true;
91
92
  });
92
- useEventListener(target, "ended", () => {
93
+ useEventListener(mediaRef, "ended", () => {
93
94
  ended.value = true;
94
95
  });
95
- useEventListener(target, "pause", () => {
96
+ useEventListener(mediaRef, "pause", () => {
96
97
  playing.value = false;
97
98
  });
98
- useEventListener(target, "play", () => {
99
+ useEventListener(mediaRef, "play", () => {
99
100
  playing.value = true;
100
101
  });
101
- useEventListener(target, "volumechange", () => {
102
- const el = toValue(target);
102
+ useEventListener(mediaRef, "volumechange", () => {
103
+ const el = toValue(mediaRef);
103
104
  if (!el)
104
105
  return;
105
106
  volume.value = el.volume;
@@ -0,0 +1,18 @@
1
+ import type { UsePlayerInternalApiArgs } from '../../types.js';
2
+ export declare function usePlayerInternalApi(args: UsePlayerInternalApiArgs): {
3
+ mouseEntered: import("vue").Ref<boolean>;
4
+ isFullscreen: import("vue").Ref<boolean>;
5
+ touched: import("vue").Ref<boolean>;
6
+ play: () => void;
7
+ pause: () => void;
8
+ togglePlay: () => void;
9
+ seek: (time: number) => void;
10
+ mute: () => void;
11
+ unmute: () => void;
12
+ enterFullscreen: () => Promise<void>;
13
+ exitFullscreen: () => Promise<void>;
14
+ toggleFullscreen: () => Promise<void>;
15
+ onMouseenter: () => void;
16
+ onMouseleave: () => void;
17
+ };
18
+ export type UsePlayerInternalApiReturn = ReturnType<typeof usePlayerInternalApi>;
@@ -0,0 +1,63 @@
1
+ import { ref, watch, toRefs, toValue } from "vue";
2
+ import { useFullscreen } from "@vueuse/core";
3
+ import { isIOS } from "@maas/vue-equipment/utils";
4
+ import { usePlayerStore } from "./usePlayerStore.mjs";
5
+ export function usePlayerInternalApi(args) {
6
+ const touched = ref(false);
7
+ const mouseEntered = ref(false);
8
+ const fullscreenTarget = isIOS() ? args.videoRef : args.playerRef;
9
+ const { findInstance } = usePlayerStore();
10
+ const instance = findInstance(toValue(args.id));
11
+ const { currentTime, playing, muted } = toRefs(instance.mediaApi);
12
+ const {
13
+ isFullscreen,
14
+ enter: enterFullscreen,
15
+ exit: exitFullscreen,
16
+ toggle: toggleFullscreen
17
+ } = useFullscreen(fullscreenTarget);
18
+ function play() {
19
+ playing.value = true;
20
+ }
21
+ function pause() {
22
+ playing.value = false;
23
+ }
24
+ function togglePlay() {
25
+ playing.value = !playing.value;
26
+ }
27
+ function seek(time) {
28
+ currentTime.value = time;
29
+ }
30
+ function mute() {
31
+ muted.value = true;
32
+ }
33
+ function unmute() {
34
+ muted.value = false;
35
+ }
36
+ function onMouseenter() {
37
+ mouseEntered.value = true;
38
+ }
39
+ function onMouseleave() {
40
+ mouseEntered.value = false;
41
+ }
42
+ watch(playing, () => {
43
+ if (!touched.value) {
44
+ touched.value = true;
45
+ }
46
+ });
47
+ return {
48
+ mouseEntered,
49
+ isFullscreen,
50
+ touched,
51
+ play,
52
+ pause,
53
+ togglePlay,
54
+ seek,
55
+ mute,
56
+ unmute,
57
+ enterFullscreen,
58
+ exitFullscreen,
59
+ toggleFullscreen,
60
+ onMouseenter,
61
+ onMouseleave
62
+ };
63
+ }
@@ -0,0 +1,18 @@
1
+ import { type Ref } from 'vue';
2
+ import type { UseMediaApiReturn } from './useMediaApi.js';
3
+ import type { UsePlayerInternalApiReturn } from './usePlayerInternalApi.js';
4
+ import type { UseRuntimeSourceProviderReturn } from './useRuntimeSourceProvider.js';
5
+ import type { UseControlsApiReturn } from './useControlsApi.js';
6
+ export interface PlayerInstance {
7
+ id: string;
8
+ mediaApi: UseMediaApiReturn;
9
+ playerApi: UsePlayerInternalApiReturn;
10
+ controlsApi: UseControlsApiReturn;
11
+ runtimeProvider: UseRuntimeSourceProviderReturn;
12
+ }
13
+ export declare function usePlayerStore(): {
14
+ playerStore: Ref<PlayerInstance[]>;
15
+ findInstance: (id: string) => PlayerInstance;
16
+ addInstance: (id: string) => PlayerInstance;
17
+ removeInstance: (id: string) => void;
18
+ };
@@ -0,0 +1,36 @@
1
+ import { ref, reactive } from "vue";
2
+ const playerStore = ref([]);
3
+ export function usePlayerStore() {
4
+ function createInstance(id) {
5
+ const instance = {
6
+ id,
7
+ mediaApi: reactive({}),
8
+ playerApi: reactive({}),
9
+ controlsApi: reactive({}),
10
+ runtimeProvider: reactive({})
11
+ };
12
+ return instance;
13
+ }
14
+ function findInstance(id) {
15
+ const instance = playerStore.value.find((instance2) => {
16
+ return instance2.id === id;
17
+ });
18
+ return instance;
19
+ }
20
+ function addInstance(id) {
21
+ const instance = createInstance(id);
22
+ playerStore.value.push(instance);
23
+ return findInstance(id);
24
+ }
25
+ function removeInstance(id) {
26
+ playerStore.value = playerStore.value.filter(
27
+ (instance) => instance.id !== id
28
+ );
29
+ }
30
+ return {
31
+ playerStore,
32
+ findInstance,
33
+ addInstance,
34
+ removeInstance
35
+ };
36
+ }
@@ -1,8 +1,6 @@
1
1
  import { type Ref } from 'vue';
2
- import type { UsePlayerArgs } from './../types.js';
2
+ import type { UseRuntimeSourceProviderArgs } from '../../types.js';
3
3
  export type UseRuntimeSourceProviderReturn = {
4
4
  loaded: Ref<boolean>;
5
5
  };
6
- type UseRuntimeSourceProviderArgs = Pick<UsePlayerArgs, 'videoRef' | 'srcType' | 'src'>;
7
6
  export declare function useRuntimeSourceProvider(args: UseRuntimeSourceProviderArgs): UseRuntimeSourceProviderReturn;
8
- export {};
@@ -1,20 +1,5 @@
1
- import type { UseMediaApiReturn } from './useMediaApi.js';
2
- import type { UsePlayerArgs } from '../types.js';
3
- type UsePlayerApiArgs = Pick<UsePlayerArgs, 'playerRef' | 'videoRef'> & {
4
- mediaApi: UseMediaApiReturn;
5
- };
1
+ import type { UsePlayerApiArgs } from '../types.js';
6
2
  export declare function usePlayerApi(args: UsePlayerApiArgs): {
7
- isFullscreen: import("vue").Ref<boolean>;
8
- touched: import("vue").Ref<boolean>;
9
- play: () => void;
10
- pause: () => void;
11
- togglePlay: () => void;
12
- seek: (time: number) => void;
13
- mute: () => void;
14
- unmute: () => void;
15
- enterFullscreen: () => Promise<void>;
16
- exitFullscreen: () => Promise<void>;
17
- toggleFullscreen: () => Promise<void>;
3
+ instance: import("vue").ComputedRef<import("./private/usePlayerStore").PlayerInstance>;
18
4
  };
19
5
  export type UsePlayerApiReturn = ReturnType<typeof usePlayerApi>;
20
- export {};