@maas/vue-equipment 0.1.2 → 0.2.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 (100) hide show
  1. package/dist/composables/index.d.mts +87 -0
  2. package/dist/composables/index.d.ts +87 -0
  3. package/dist/composables/index.js +284 -0
  4. package/dist/composables/index.js.map +1 -0
  5. package/dist/composables/index.mjs +254 -0
  6. package/dist/composables/index.mjs.map +1 -0
  7. package/dist/nuxt/module.cjs +5 -0
  8. package/dist/nuxt/module.d.ts +9 -0
  9. package/dist/nuxt/module.json +5 -0
  10. package/dist/nuxt/module.mjs +121 -0
  11. package/dist/nuxt/types.d.ts +15 -0
  12. package/dist/plugins/MagicModal/index.d.ts +4 -0
  13. package/dist/plugins/MagicModal/index.mjs +8 -0
  14. package/dist/plugins/MagicModal/nuxt.d.ts +2 -0
  15. package/dist/plugins/MagicModal/nuxt.mjs +5 -0
  16. package/dist/plugins/MagicModal/src/components/MagicModal.vue +254 -0
  17. package/dist/plugins/MagicModal/src/components/MagicModal.vue.d.ts +43 -0
  18. package/dist/plugins/MagicModal/src/composables/useModalApi.d.ts +18 -0
  19. package/dist/plugins/MagicModal/src/composables/useModalApi.mjs +74 -0
  20. package/dist/plugins/MagicModal/src/composables/useModalStore.d.ts +5 -0
  21. package/dist/plugins/MagicModal/src/composables/useModalStore.mjs +15 -0
  22. package/dist/plugins/MagicModal/src/store/modals.d.ts +4 -0
  23. package/dist/plugins/MagicModal/src/store/modals.mjs +9 -0
  24. package/dist/plugins/MagicModal/src/types/index.d.ts +15 -0
  25. package/dist/plugins/MagicModal/src/types/index.mjs +0 -0
  26. package/dist/plugins/MagicModal/src/utils/defaultOptions.d.ts +3 -0
  27. package/dist/plugins/MagicModal/src/utils/defaultOptions.mjs +15 -0
  28. package/dist/plugins/MagicPlayer/index.d.ts +7 -0
  29. package/dist/plugins/MagicPlayer/index.mjs +15 -0
  30. package/dist/plugins/MagicPlayer/nuxt.d.ts +2 -0
  31. package/dist/plugins/MagicPlayer/nuxt.mjs +5 -0
  32. package/dist/plugins/MagicPlayer/src/components/MagicPlayer.vue +103 -0
  33. package/dist/plugins/MagicPlayer/src/components/MagicPlayer.vue.d.ts +86 -0
  34. package/dist/plugins/MagicPlayer/src/components/MagicPlayerControls.vue +262 -0
  35. package/dist/plugins/MagicPlayer/src/components/MagicPlayerControls.vue.d.ts +25 -0
  36. package/dist/plugins/MagicPlayer/src/components/MagicPlayerMuxPopover.vue +132 -0
  37. package/dist/plugins/MagicPlayer/src/components/MagicPlayerMuxPopover.vue.d.ts +12 -0
  38. package/dist/plugins/MagicPlayer/src/components/MagicPlayerTimeline.vue +155 -0
  39. package/dist/plugins/MagicPlayer/src/components/MagicPlayerTimeline.vue.d.ts +2 -0
  40. package/dist/plugins/MagicPlayer/src/components/icons/FullscreenEnter.vue +13 -0
  41. package/dist/plugins/MagicPlayer/src/components/icons/FullscreenEnter.vue.d.ts +2 -0
  42. package/dist/plugins/MagicPlayer/src/components/icons/FullscreenExit.vue +14 -0
  43. package/dist/plugins/MagicPlayer/src/components/icons/FullscreenExit.vue.d.ts +2 -0
  44. package/dist/plugins/MagicPlayer/src/components/icons/Pause.vue +14 -0
  45. package/dist/plugins/MagicPlayer/src/components/icons/Pause.vue.d.ts +2 -0
  46. package/dist/plugins/MagicPlayer/src/components/icons/Play.vue +11 -0
  47. package/dist/plugins/MagicPlayer/src/components/icons/Play.vue.d.ts +2 -0
  48. package/dist/plugins/MagicPlayer/src/components/icons/VolumeOff.vue +14 -0
  49. package/dist/plugins/MagicPlayer/src/components/icons/VolumeOff.vue.d.ts +2 -0
  50. package/dist/plugins/MagicPlayer/src/components/icons/VolumeOn.vue +11 -0
  51. package/dist/plugins/MagicPlayer/src/components/icons/VolumeOn.vue.d.ts +2 -0
  52. package/dist/plugins/MagicPlayer/src/components/icons/Waiting.vue +38 -0
  53. package/dist/plugins/MagicPlayer/src/components/icons/Waiting.vue.d.ts +2 -0
  54. package/dist/plugins/MagicPlayer/src/composables/useControls.d.ts +8 -0
  55. package/dist/plugins/MagicPlayer/src/composables/useControls.mjs +15 -0
  56. package/dist/plugins/MagicPlayer/src/composables/useControlsApi.d.ts +17 -0
  57. package/dist/plugins/MagicPlayer/src/composables/useControlsApi.mjs +129 -0
  58. package/dist/plugins/MagicPlayer/src/composables/useMediaApi.d.ts +15 -0
  59. package/dist/plugins/MagicPlayer/src/composables/useMediaApi.mjs +122 -0
  60. package/dist/plugins/MagicPlayer/src/composables/usePlayer.d.ts +12 -0
  61. package/dist/plugins/MagicPlayer/src/composables/usePlayer.mjs +33 -0
  62. package/dist/plugins/MagicPlayer/src/composables/usePlayerApi.d.ts +20 -0
  63. package/dist/plugins/MagicPlayer/src/composables/usePlayerApi.mjs +50 -0
  64. package/dist/plugins/MagicPlayer/src/composables/useRuntimeSourceProvider.d.ts +8 -0
  65. package/dist/plugins/MagicPlayer/src/composables/useRuntimeSourceProvider.mjs +49 -0
  66. package/dist/plugins/MagicPlayer/src/types/index.d.ts +15 -0
  67. package/dist/plugins/MagicPlayer/src/types/index.mjs +1 -0
  68. package/dist/plugins/MagicPlayer/src/types/injectionKeys.d.ts +45 -0
  69. package/dist/plugins/MagicPlayer/src/types/injectionKeys.mjs +10 -0
  70. package/dist/plugins/MagicPlayer/src/utils/index.d.ts +4 -0
  71. package/dist/plugins/MagicPlayer/src/utils/index.mjs +19 -0
  72. package/dist/plugins/MagicScroll/index.d.ts +7 -0
  73. package/dist/plugins/MagicScroll/index.mjs +19 -0
  74. package/dist/plugins/MagicScroll/nuxt.d.ts +2 -0
  75. package/dist/plugins/MagicScroll/nuxt.mjs +5 -0
  76. package/dist/plugins/MagicScroll/src/components/MagicScrollCollision.vue +35 -0
  77. package/dist/plugins/MagicScroll/src/components/MagicScrollCollision.vue.d.ts +20 -0
  78. package/dist/plugins/MagicScroll/src/components/MagicScrollProvider.vue +34 -0
  79. package/dist/plugins/MagicScroll/src/components/MagicScrollProvider.vue.d.ts +21 -0
  80. package/dist/plugins/MagicScroll/src/components/MagicScrollScene.vue +80 -0
  81. package/dist/plugins/MagicScroll/src/components/MagicScrollScene.vue.d.ts +41 -0
  82. package/dist/plugins/MagicScroll/src/components/MagicScrollTransform.vue +42 -0
  83. package/dist/plugins/MagicScroll/src/components/MagicScrollTransform.vue.d.ts +84 -0
  84. package/dist/plugins/MagicScroll/src/composables/useCollisionDetect.d.ts +6 -0
  85. package/dist/plugins/MagicScroll/src/composables/useCollisionDetect.mjs +116 -0
  86. package/dist/plugins/MagicScroll/src/composables/useEmitter.d.ts +15 -0
  87. package/dist/plugins/MagicScroll/src/composables/useEmitter.mjs +9 -0
  88. package/dist/plugins/MagicScroll/src/composables/useProgress.d.ts +7 -0
  89. package/dist/plugins/MagicScroll/src/composables/useProgress.mjs +59 -0
  90. package/dist/plugins/MagicScroll/src/store/index.d.ts +4 -0
  91. package/dist/plugins/MagicScroll/src/store/index.mjs +5 -0
  92. package/dist/plugins/MagicScroll/src/types/index.d.ts +34 -0
  93. package/dist/plugins/MagicScroll/src/types/index.mjs +1 -0
  94. package/dist/plugins/MagicScroll/src/types/injectionKeys.d.ts +12 -0
  95. package/dist/plugins/MagicScroll/src/types/injectionKeys.mjs +5 -0
  96. package/dist/plugins/MagicScroll/src/utils/index.d.ts +2 -0
  97. package/dist/plugins/MagicScroll/src/utils/index.mjs +6 -0
  98. package/dist/plugins/index.d.ts +3 -0
  99. package/dist/plugins/index.mjs +3 -0
  100. package/package.json +13 -16
@@ -0,0 +1,262 @@
1
+ <template>
2
+ <div
3
+ class="magic-player-controls"
4
+ :class="{
5
+ '-fullscreen': isFullscreen,
6
+ '-touched': touched,
7
+ '-untouched': !touched,
8
+ '-playing': playing,
9
+ '-paused': !playing,
10
+ '-waiting': waiting,
11
+ '-idle': idle,
12
+ '-not-idle': !idle,
13
+ '-hover': isMouseEnter,
14
+ '-not-hover': !isMouseEnter,
15
+ }"
16
+ @mouseenter="isMouseEnter = true"
17
+ @mouseleave="isMouseEnter = false"
18
+ >
19
+ <div class="magic-player-controls__overlay" @click.stop="togglePlay">
20
+ <template v-if="waiting">
21
+ <button>
22
+ <icon-waiting />
23
+ </button>
24
+ </template>
25
+ <template v-else>
26
+ <button v-if="!playing">
27
+ <icon-play />
28
+ </button>
29
+ <button v-else>
30
+ <icon-pause />
31
+ </button>
32
+ </template>
33
+ </div>
34
+ <div class="magic-player-controls__bar">
35
+ <div
36
+ v-if="$slots.seekPopover"
37
+ v-show="!!seekedTime && touched"
38
+ ref="popoverRef"
39
+ class="magic-player-controls__popover"
40
+ :style="{ marginLeft: `${popoverOffsetX}%` }"
41
+ >
42
+ <slot name="seekPopover" />
43
+ </div>
44
+ <div class="magic-player-controls__bar--inner" ref="barRef">
45
+ <div class="magic-player-controls__item -shrink-0">
46
+ <button v-if="!playing" @click="play">
47
+ <icon-play />
48
+ </button>
49
+ <button v-else @click="pause">
50
+ <icon-pause />
51
+ </button>
52
+ </div>
53
+ <div class="magic-player-controls__item -grow">
54
+ <div class="magic-player-controls__timeline" ref="trackRef">
55
+ <magic-player-timeline />
56
+ </div>
57
+ </div>
58
+ <div class="magic-player-controls__item -shrink-0">
59
+ <button v-if="muted" @click="unmute">
60
+ <icon-volume-off />
61
+ </button>
62
+ <button v-else @click="mute">
63
+ <icon-volume-on />
64
+ </button>
65
+ </div>
66
+ <div class="magic-player-controls__item -shrink-0">
67
+ <button v-if="isFullscreen" @click="exitFullscreen">
68
+ <icon-fullscreen-exit />
69
+ </button>
70
+ <button v-else @click="enterFullscreen">
71
+ <icon-fullscreen-enter />
72
+ </button>
73
+ </div>
74
+ </div>
75
+ </div>
76
+ </div>
77
+ </template>
78
+
79
+ <script setup lang="ts">
80
+ import { ref } from 'vue'
81
+ import { useIdle } from '@vueuse/core'
82
+ import IconPlay from './icons/Play.vue'
83
+ import IconPause from './icons/Pause.vue'
84
+ import IconVolumeOn from './icons/VolumeOn.vue'
85
+ import IconVolumeOff from './icons/VolumeOff.vue'
86
+ import IconFullscreenEnter from './icons/FullscreenEnter.vue'
87
+ import IconFullscreenExit from './icons/FullscreenExit.vue'
88
+ import IconWaiting from './icons/Waiting.vue'
89
+ import { useInjectPlayer } from '../composables/usePlayer'
90
+ import { useProvideControls } from '../composables/useControls'
91
+
92
+ const barRef = ref<HTMLDivElement | undefined>(undefined)
93
+ const trackRef = ref<HTMLDivElement | undefined>(undefined)
94
+ const popoverRef = ref<HTMLDivElement | undefined>(undefined)
95
+
96
+ const { mediaApi, playerApi } = useInjectPlayer()
97
+ const { controlsApi } = useProvideControls({
98
+ barRef: barRef,
99
+ trackRef: trackRef,
100
+ popoverRef: popoverRef,
101
+ })
102
+
103
+ const { playing, muted, waiting } = mediaApi
104
+ const {
105
+ touched,
106
+ isFullscreen,
107
+ play,
108
+ pause,
109
+ togglePlay,
110
+ mute,
111
+ unmute,
112
+ enterFullscreen,
113
+ exitFullscreen,
114
+ } = playerApi
115
+
116
+ const { popoverOffsetX, seekedTime } = controlsApi
117
+
118
+ const { idle } = useIdle(3000)
119
+ const isMouseEnter = ref(false)
120
+
121
+ defineExpose({
122
+ controlsApi,
123
+ })
124
+ </script>
125
+
126
+ <style lang="postcss">
127
+ :root {
128
+ --magic-player-controls-height: 3rem;
129
+ --magic-player-controls-bottom: 1.5rem;
130
+ --magic-player-controls-padding: 0.75rem;
131
+ --magic-player-controls-gap: 1rem;
132
+ --magic-player-controls-border-radius: 50rem;
133
+ --magic-player-controls-background-color: rgba(32, 32, 32, 0.8);
134
+ --magic-player-controls-backdrop-filter: blur(80px);
135
+ --magic-player-controls-color: rgba(255, 255, 255, 1);
136
+ --magic-player-controls-icon-width: 1.25rem;
137
+ --magic-player-controls-overlay-background-color: rgba(0, 0, 0, 0.3);
138
+ --magic-player-controls-overlay-color: rgba(255, 255, 255, 1);
139
+ --magic-player-controls-transition-duration: 300ms;
140
+ --magic-player-controls-transition-timing-function: ease-out:
141
+ }
142
+
143
+ @media (max-width: 640px) {
144
+ :root {
145
+ --magic-player-controls-height: 2.5rem;
146
+ --magic-player-controls-bottom: 0.75rem;
147
+ --magic-player-controls-padding: 0.5rem;
148
+ }
149
+ }
150
+
151
+ .magic-player-controls {
152
+ position: absolute;
153
+ inset: 0;
154
+ }
155
+
156
+ .magic-player-controls__overlay {
157
+ position: absolute;
158
+ inset: 0;
159
+ background-color: var(--magic-player-controls-overlay-background-color);
160
+ color: var(--magic-player-controls-overlay-color);
161
+ transition-duration: 300ms;
162
+ transition-property: opacity;
163
+ transition-timing-function: ease-out;
164
+ display: flex;
165
+ align-items: center;
166
+ justify-content: center;
167
+ cursor: pointer;
168
+ }
169
+
170
+ .magic-player-controls__overlay button {
171
+ background-color: transparent;
172
+ color: inherit;
173
+ border: 0;
174
+ border-radius: 0;
175
+ padding: 0;
176
+ outline: none;
177
+ appearance: none;
178
+ cursor: pointer;
179
+ width: 3.5rem;
180
+ height: 3.5rem;
181
+ }
182
+
183
+ .magic-player-controls__bar {
184
+ position: absolute;
185
+ width: calc(100% - (var(--magic-player-controls-bottom) * 2));
186
+ bottom: var(--magic-player-controls-bottom);
187
+ left: 50%;
188
+ transform: translateX(-50%);
189
+ margin: 0 auto;
190
+ display: flex;
191
+ flex-direction: column;
192
+ align-items: flex-start;
193
+ gap: var(--magic-player-controls-gap);
194
+ transition-duration: var(--magic-player-controls-transition-duration);
195
+ transition-timing-function: var(--magic-player-controls-transition-timing-function);
196
+ transition-property: opacity, transform;
197
+ }
198
+
199
+ .magic-player-controls__bar--inner {
200
+ width: 100%;
201
+ height: var(--magic-player-controls-height);
202
+ padding: 0 var(--magic-player-controls-padding);
203
+ background-color: var(--magic-player-controls-background-color);
204
+ backdrop-filter: var(--magic-player-controls-backdrop-filter);
205
+ color: var(--magic-player-controls-color);
206
+ border-radius: var(--magic-player-controls-border-radius);
207
+ display: flex;
208
+ align-items: center;
209
+ }
210
+
211
+ .magic-player-controls__item {
212
+ display: inline-flex;
213
+ align-items: center;
214
+ user-select: none;
215
+ }
216
+
217
+ .magic-player-controls__item.-shrink-0 {
218
+ flex-shrink: 0;
219
+ }
220
+
221
+ .magic-player-controls__item.-grow {
222
+ flex-grow: 1;
223
+ }
224
+
225
+ .magic-player-controls__item button {
226
+ background-color: transparent;
227
+ color: inherit;
228
+ border: 0;
229
+ outline: none;
230
+ appearance: none;
231
+ padding: 0;
232
+ border-radius: 0;
233
+ cursor: pointer;
234
+ width: var(--magic-player-controls-height);
235
+ height: var(--magic-player-controls-height);
236
+ display: flex;
237
+ align-items: center;
238
+ justify-content: center;
239
+ }
240
+
241
+ .magic-player-controls__item button svg {
242
+ display: block;
243
+ width: var(--magic-player-controls-icon-width);
244
+ height: auto;
245
+ }
246
+
247
+ .magic-player-controls__timeline {
248
+ width: 100%;
249
+ }
250
+
251
+ .magic-player-controls.-playing.-idle .magic-player-controls__bar,
252
+ .magic-player-controls.-playing.-not-hover .magic-player-controls__bar,
253
+ .magic-player-controls.-untouched .magic-player-controls__bar {
254
+ opacity: 0;
255
+ transform: translate(-50%, 25%);
256
+ }
257
+
258
+ .magic-player-controls.-playing.-idle .magic-player-controls__overlay,
259
+ .magic-player-controls.-playing.-not-hover .magic-player-controls__overlay {
260
+ opacity: 0;
261
+ }
262
+ </style>
@@ -0,0 +1,25 @@
1
+ declare const _default: __VLS_WithTemplateSlots<import("vue").DefineComponent<{}, {
2
+ controlsApi: {
3
+ entered: import("vue").Ref<boolean>;
4
+ dragging: import("vue").Ref<boolean>;
5
+ seekedTime: import("vue").Ref<number>;
6
+ seekedPercentage: import("vue").Ref<number>;
7
+ scrubbedPercentage: import("vue").Ref<number>;
8
+ bufferedPercentage: import("vue").ComputedRef<number>;
9
+ thumbPercentage: import("vue").Ref<number>;
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;
16
+ };
17
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").VNodeProps & import("vue").AllowedComponentProps & import("vue").ComponentCustomProps, Readonly<import("vue").ExtractPropTypes<{}>>, {}, {}>, {
18
+ seekPopover?(_: {}): any;
19
+ }>;
20
+ export default _default;
21
+ type __VLS_WithTemplateSlots<T, S> = T & {
22
+ new (): {
23
+ $slots: S;
24
+ };
25
+ };
@@ -0,0 +1,132 @@
1
+ <template>
2
+ <div
3
+ :style="{
4
+ width: `${thumbWidth}px`,
5
+ height: `${thumbHeight}px`,
6
+ }"
7
+ class="magic-player-mux-popover"
8
+ >
9
+ <canvas
10
+ ref="canvas"
11
+ :width="storyboard?.tile_width"
12
+ :height="storyboard?.tile_height"
13
+ />
14
+ </div>
15
+ </template>
16
+ <script setup lang="ts">
17
+ import { shallowRef, onMounted, watch, computed } from 'vue'
18
+ import { useDevicePixelRatio } from '@vueuse/core'
19
+ import { useInjectControls } from '../composables/useControls'
20
+
21
+ const { controlsApi } = useInjectControls()
22
+ const { seekedTime } = controlsApi
23
+
24
+ import type { Ref } from 'vue'
25
+
26
+ type Props = {
27
+ playbackId: string
28
+ }
29
+
30
+ type MuxStoryboard = {
31
+ url: string
32
+ tile_width: number
33
+ tile_height: number
34
+ duration: number
35
+ tiles: Array<{
36
+ start: number
37
+ x: number
38
+ y: number
39
+ }>
40
+ }
41
+
42
+ const props = defineProps<Props>()
43
+ const canvas = shallowRef() as Ref<HTMLCanvasElement>
44
+ let context: CanvasRenderingContext2D | undefined = undefined
45
+ const storyboard = shallowRef<MuxStoryboard | undefined>()
46
+ let image: HTMLImageElement | undefined = undefined
47
+
48
+ const { pixelRatio } = useDevicePixelRatio()
49
+
50
+ const thumbWidth = computed(() => {
51
+ if (!storyboard.value) return 0
52
+ return storyboard.value.tile_width / pixelRatio.value
53
+ })
54
+
55
+ const thumbHeight = computed(() => {
56
+ if (!storyboard.value) return 0
57
+ return storyboard.value.tile_height / pixelRatio.value
58
+ })
59
+
60
+ async function init() {
61
+ if (!props.playbackId) return
62
+
63
+ try {
64
+ storyboard.value = await fetch(
65
+ `https://image.mux.com/${props.playbackId}/storyboard.json`
66
+ ).then((res) => res.json())
67
+
68
+ if (!storyboard.value) throw new Error()
69
+
70
+ image = new Image()
71
+ image.src = storyboard.value.url
72
+ await image.decode()
73
+
74
+ context = canvas.value.getContext('2d')!
75
+ context.drawImage(image, 0, 0)
76
+ } catch (e: any) {
77
+ console.error('Can not initialize timeine preview.', e)
78
+ }
79
+ }
80
+
81
+ function drawFrame(time: number) {
82
+ if (!storyboard.value || !context || !image) return
83
+
84
+ const { tile_height, tile_width, tiles } = storyboard.value
85
+
86
+ let closestIndex = -1
87
+ let minDifference = Infinity
88
+
89
+ for (let i = 0; i < tiles.length; i++) {
90
+ const { start } = tiles[i]
91
+ const difference = Math.abs(start - time)
92
+
93
+ if (difference < minDifference) {
94
+ minDifference = difference
95
+ closestIndex = i
96
+ }
97
+ }
98
+
99
+ const tile = tiles[closestIndex]
100
+
101
+ context.drawImage(
102
+ image,
103
+ tile.x,
104
+ tile.y,
105
+ tile_width,
106
+ tile_height,
107
+ 0,
108
+ 0,
109
+ tile_width,
110
+ tile_height
111
+ )
112
+ }
113
+
114
+ onMounted(init)
115
+ watch(() => seekedTime.value, drawFrame)
116
+ </script>
117
+
118
+ <style lang="postcss">
119
+ :root {
120
+ --magic-player-popover-border-radius: 0.25rem;
121
+ }
122
+
123
+ .magic-player-mux-popover {
124
+ border-radius: var(--magic-player-popover-border-radius);
125
+ overflow: hidden;
126
+ }
127
+
128
+ canvas {
129
+ width: 100%;
130
+ height: auto;
131
+ }
132
+ </style>
@@ -0,0 +1,12 @@
1
+ declare const _default: import("vue").DefineComponent<{
2
+ playbackId: {
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
+ playbackId: {
8
+ type: import("vue").PropType<string>;
9
+ required: true;
10
+ };
11
+ }>>, {}, {}>;
12
+ export default _default;
@@ -0,0 +1,155 @@
1
+ <template>
2
+ <div class="magic-player-timeline">
3
+ <div
4
+ class="magic-player-timeline__target"
5
+ @mouseenter="onMouseEnter"
6
+ @mouseleave="onMouseLeave"
7
+ @pointerdown="onPointerDown"
8
+ @pointerup="onPointerUp"
9
+ @pointermove="onPointerMove"
10
+ >
11
+ <div class="magic-player-timeline__slider-track">
12
+ <div
13
+ class="magic-player-timeline__slider-thumb"
14
+ :style="{ left: `${scrubbedPercentage}%` }"
15
+ >
16
+ <div class="magic-player-timeline__slider-thumb-handle" />
17
+ </div>
18
+ <div class="magic-player-timeline__slider-inner-track">
19
+ <div
20
+ class="magic-player-timeline__slider-buffered"
21
+ :style="{ left: `${bufferedPercentage}%` }"
22
+ />
23
+ <div
24
+ v-show="entered"
25
+ class="magic-player-timeline__slider-seeked"
26
+ :style="{ left: `${seekedPercentage}%` }"
27
+ />
28
+ <div
29
+ class="magic-player-timeline__slider-scrubbed"
30
+ :style="{ left: `${scrubbedPercentage}%` }"
31
+ ></div>
32
+ </div>
33
+ </div>
34
+ </div>
35
+ </div>
36
+ </template>
37
+
38
+ <script setup lang="ts">
39
+ import { useInjectControls } from '../composables/useControls'
40
+
41
+ const { controlsApi } = useInjectControls()
42
+ const {
43
+ entered,
44
+ seekedPercentage,
45
+ scrubbedPercentage,
46
+ bufferedPercentage,
47
+ onMouseEnter,
48
+ onMouseLeave,
49
+ onPointerDown,
50
+ onPointerUp,
51
+ onPointerMove,
52
+ } = controlsApi
53
+ </script>
54
+
55
+ <style lang="postcss">
56
+ :root {
57
+ --magic-player-target-height: 56px;
58
+ --magic-player-track-height: 4px;
59
+ --magic-player-track-bg-color: rgba(250, 250, 250, 0.15);
60
+ --magic-player-thumb-size: 1rem;
61
+ --magic-player-thumb-bg-color: rgba(250, 250, 250, 1);
62
+ }
63
+
64
+ .magic-player-timeline {
65
+ position: relative;
66
+ width: 100%;
67
+ height: var(--magic-player-track-height);
68
+ display: flex;
69
+ align-items: center;
70
+ }
71
+
72
+ .magic-player-timeline__target {
73
+ position: relative;
74
+ width: 100%;
75
+ height: var(--magic-player-target-height);
76
+ display: flex;
77
+ align-items: center;
78
+ cursor: pointer;
79
+ }
80
+
81
+ .magic-player-timeline__slider-track {
82
+ position: relative;
83
+ width: 100%;
84
+ height: var(--magic-player-track-height);
85
+ background: var(--magic-player-track-bg-color);
86
+ border-radius: 50rem;
87
+ }
88
+
89
+ .magic-player-timeline__slider-inner-track {
90
+ position: relative;
91
+ border-radius: 50rem;
92
+ overflow: hidden;
93
+ width: 100%;
94
+ height: 100%;
95
+ top: 0;
96
+ left: 0;
97
+ z-index: 1;
98
+ }
99
+
100
+ .magic-player-timeline__slider-thumb {
101
+ position: absolute;
102
+ width: var(--magic-player-track-height);
103
+ height: var(--magic-player-track-height);
104
+ z-index: 10;
105
+ }
106
+
107
+ .magic-player-timeline__slider-thumb-handle {
108
+ position: absolute;
109
+ width: var(--magic-player-thumb-size);
110
+ height: var(--magic-player-thumb-size);
111
+ top: 50%;
112
+ left: 50%;
113
+ transform: translate(-50%, -50%) scale(0);
114
+ transition: transform 300ms ease-out;
115
+ z-index: 10;
116
+ background-color: var(--magic-player-thumb-bg-color);
117
+ border-radius: 50rem;
118
+ }
119
+ .magic-player-timeline__slider-scrubbed,
120
+ .magic-player-timeline__slider-seeked,
121
+ .magic-player-timeline__slider-buffered {
122
+ position: absolute;
123
+ left: 0;
124
+ width: 100%;
125
+ height: 100%;
126
+ margin-left: calc(-100% + var(--magic-player-track-height));
127
+ background: currentColor;
128
+ border-radius: 50rem;
129
+ }
130
+
131
+ .magic-player-timeline__slider-scrubbed {
132
+ z-index: 1;
133
+ min-width: var(--magic-player-track-height);
134
+ display: flex;
135
+ }
136
+
137
+ .magic-player-timeline__slider-seeked {
138
+ opacity: 0.25;
139
+ }
140
+
141
+ .magic-player-timeline__slider-buffered {
142
+ opacity: 0.15;
143
+ }
144
+
145
+ .magic-player-timeline:hover .magic-player-timeline__slider-thumb-handle {
146
+ transform: translate(-50%, -50%) scale(1);
147
+ }
148
+
149
+ .magic-player-timeline__seek-popover {
150
+ position: absolute;
151
+ left: 0;
152
+ bottom: 100%;
153
+ transform: translateX(-50%);
154
+ }
155
+ </style>
@@ -0,0 +1,2 @@
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<{}>>, {}, {}>;
2
+ export default _default;
@@ -0,0 +1,13 @@
1
+ <template>
2
+ <svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
3
+ <rect
4
+ x="1"
5
+ y="6"
6
+ width="22"
7
+ height="12"
8
+ rx="3"
9
+ stroke="currentColor"
10
+ stroke-width="2"
11
+ />
12
+ </svg>
13
+ </template>
@@ -0,0 +1,2 @@
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<{}>>, {}, {}>;
2
+ export default _default;
@@ -0,0 +1,14 @@
1
+ <template>
2
+ <svg viewBox="0 0 24 14" fill="none" xmlns="http://www.w3.org/2000/svg">
3
+ <rect
4
+ x="1"
5
+ y="1"
6
+ width="22"
7
+ height="12"
8
+ rx="3"
9
+ fill="currentColor"
10
+ stroke="currentColor"
11
+ stroke-width="2"
12
+ />
13
+ </svg>
14
+ </template>
@@ -0,0 +1,2 @@
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<{}>>, {}, {}>;
2
+ export default _default;
@@ -0,0 +1,14 @@
1
+ <template>
2
+ <svg
3
+ viewBox="0 0 24 24"
4
+ fill="currentColor"
5
+ xmlns="http://www.w3.org/2000/svg"
6
+ >
7
+ <path
8
+ d="M8 4C6.89543 4 6 4.89543 6 6V18C6 19.1046 6.89543 20 8 20C9.10457 20 10 19.1046 10 18V6C10 4.89543 9.10457 4 8 4Z"
9
+ />
10
+ <path
11
+ d="M16 4C14.8954 4 14 4.89543 14 6V18C14 19.1046 14.8954 20 16 20C17.1046 20 18 19.1046 18 18V6C18 4.89543 17.1046 4 16 4Z"
12
+ />
13
+ </svg>
14
+ </template>
@@ -0,0 +1,2 @@
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<{}>>, {}, {}>;
2
+ export default _default;
@@ -0,0 +1,11 @@
1
+ <template>
2
+ <svg
3
+ viewBox="0 0 24 24"
4
+ fill="currentColor"
5
+ xmlns="http://www.w3.org/2000/svg"
6
+ >
7
+ <path
8
+ d="M5 4.76619C5 3.9889 5.84797 3.50878 6.5145 3.9087L18.5708 11.1425C19.2182 11.5309 19.2182 12.4691 18.5708 12.8575L6.5145 20.0913C5.84797 20.4912 5 20.0111 5 19.2338V4.76619Z"
9
+ />
10
+ </svg>
11
+ </template>
@@ -0,0 +1,2 @@
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<{}>>, {}, {}>;
2
+ export default _default;
@@ -0,0 +1,14 @@
1
+ <template>
2
+ <svg
3
+ viewBox="0 0 24 24"
4
+ fill="currentColor"
5
+ xmlns="http://www.w3.org/2000/svg"
6
+ >
7
+ <path
8
+ d="M16.4 4.2C17.0592 3.70557 18 4.17595 18 5V6.17513L20.3643 4.22807C20.7906 3.87698 21.4208 3.93797 21.7719 4.36429C22.123 4.79062 22.062 5.42084 21.6357 5.77193L4.6357 19.7719C4.20938 20.123 3.57916 20.062 3.22807 19.6357C2.87698 19.2094 2.93797 18.5792 3.36429 18.2281L6.35555 15.7647C6.13812 15.5812 6 15.3068 6 15V9C6 8.44772 6.44772 8 7 8H11.3333L16.4 4.2Z"
9
+ />
10
+ <path
11
+ d="M11.4962 16.1221L18 10.766V19C18 19.824 17.0592 20.2944 16.4 19.8L11.4962 16.1221Z"
12
+ />
13
+ </svg>
14
+ </template>
@@ -0,0 +1,2 @@
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<{}>>, {}, {}>;
2
+ export default _default;