@vuetify/nightly 3.9.2-master.2025-07-23 → 3.9.2-master.2025-07-24
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/CHANGELOG.md +11 -3
- package/dist/_component-variables-labs.sass +2 -1
- package/dist/json/attributes.json +2563 -2299
- package/dist/json/importMap-labs.json +24 -12
- package/dist/json/importMap.json +174 -174
- package/dist/json/tags.json +81 -0
- package/dist/json/web-types.json +5100 -3978
- package/dist/vuetify-labs.cjs +751 -15
- package/dist/vuetify-labs.css +5171 -4837
- package/dist/vuetify-labs.d.ts +6526 -845
- package/dist/vuetify-labs.esm.js +752 -16
- package/dist/vuetify-labs.esm.js.map +1 -1
- package/dist/vuetify-labs.js +751 -15
- package/dist/vuetify-labs.min.css +2 -2
- package/dist/vuetify.cjs +37 -9
- package/dist/vuetify.cjs.map +1 -1
- package/dist/vuetify.css +3169 -3169
- package/dist/vuetify.d.ts +88 -68
- package/dist/vuetify.esm.js +37 -9
- package/dist/vuetify.esm.js.map +1 -1
- package/dist/vuetify.js +37 -9
- package/dist/vuetify.js.map +1 -1
- package/dist/vuetify.min.css +2 -2
- package/dist/vuetify.min.js +264 -263
- package/dist/vuetify.min.js.map +1 -1
- package/lib/components/VBottomSheet/VBottomSheet.d.ts +6 -6
- package/lib/components/VDialog/VDialog.d.ts +6 -6
- package/lib/components/VOverlay/VOverlay.js +1 -0
- package/lib/components/VOverlay/VOverlay.js.map +1 -1
- package/lib/components/VOverlay/scrollStrategies.d.ts +1 -0
- package/lib/components/VOverlay/scrollStrategies.js +6 -4
- package/lib/components/VOverlay/scrollStrategies.js.map +1 -1
- package/lib/components/VRangeSlider/VRangeSlider.d.ts +13 -0
- package/lib/components/VSlider/VSlider.d.ts +13 -0
- package/lib/components/VSlider/VSlider.js +3 -1
- package/lib/components/VSlider/VSlider.js.map +1 -1
- package/lib/components/VSlider/VSliderThumb.d.ts +13 -0
- package/lib/components/VSlider/VSliderThumb.js +2 -0
- package/lib/components/VSlider/VSliderThumb.js.map +1 -1
- package/lib/components/VSlider/slider.d.ts +6 -0
- package/lib/components/VSlider/slider.js +2 -0
- package/lib/components/VSlider/slider.js.map +1 -1
- package/lib/components/index.js +1 -1
- package/lib/components/index.js.map +1 -1
- package/lib/entry-bundler.js +1 -1
- package/lib/framework.d.ts +60 -56
- package/lib/framework.js +1 -1
- package/lib/iconsets/fa.js +9 -1
- package/lib/iconsets/fa.js.map +1 -1
- package/lib/iconsets/fa4.js +9 -1
- package/lib/iconsets/fa4.js.map +1 -1
- package/lib/iconsets/md.js +9 -1
- package/lib/iconsets/md.js.map +1 -1
- package/lib/iconsets/mdi-svg.js +9 -1
- package/lib/iconsets/mdi-svg.js.map +1 -1
- package/lib/iconsets/mdi.js +9 -1
- package/lib/iconsets/mdi.js.map +1 -1
- package/lib/labs/VVideo/VVideo.css +319 -0
- package/lib/labs/VVideo/VVideo.d.ts +6932 -0
- package/lib/labs/VVideo/VVideo.js +424 -0
- package/lib/labs/VVideo/VVideo.js.map +1 -0
- package/lib/labs/VVideo/VVideo.sass +301 -0
- package/lib/labs/VVideo/VVideoControls.d.ts +3524 -0
- package/lib/labs/VVideo/VVideoControls.js +232 -0
- package/lib/labs/VVideo/VVideoControls.js.map +1 -0
- package/lib/labs/VVideo/VVideoVolume.d.ts +3088 -0
- package/lib/labs/VVideo/VVideoVolume.js +90 -0
- package/lib/labs/VVideo/VVideoVolume.js.map +1 -0
- package/lib/labs/VVideo/_variables.scss +58 -0
- package/lib/labs/VVideo/index.d.ts +3 -0
- package/lib/labs/VVideo/index.js +4 -0
- package/lib/labs/VVideo/index.js.map +1 -0
- package/lib/labs/components.d.ts +1 -0
- package/lib/labs/components.js +1 -0
- package/lib/labs/components.js.map +1 -1
- package/lib/locale/af.d.ts +11 -0
- package/lib/locale/af.js +11 -0
- package/lib/locale/af.js.map +1 -1
- package/lib/locale/ar.d.ts +11 -0
- package/lib/locale/ar.js +11 -0
- package/lib/locale/ar.js.map +1 -1
- package/lib/locale/az.d.ts +11 -0
- package/lib/locale/az.js +11 -0
- package/lib/locale/az.js.map +1 -1
- package/lib/locale/bg.d.ts +11 -0
- package/lib/locale/bg.js +11 -0
- package/lib/locale/bg.js.map +1 -1
- package/lib/locale/ca.d.ts +11 -0
- package/lib/locale/ca.js +11 -0
- package/lib/locale/ca.js.map +1 -1
- package/lib/locale/ckb.d.ts +11 -0
- package/lib/locale/ckb.js +11 -0
- package/lib/locale/ckb.js.map +1 -1
- package/lib/locale/cs.d.ts +11 -0
- package/lib/locale/cs.js +11 -0
- package/lib/locale/cs.js.map +1 -1
- package/lib/locale/da.d.ts +11 -0
- package/lib/locale/da.js +11 -0
- package/lib/locale/da.js.map +1 -1
- package/lib/locale/de.d.ts +11 -0
- package/lib/locale/de.js +11 -0
- package/lib/locale/de.js.map +1 -1
- package/lib/locale/el.d.ts +11 -0
- package/lib/locale/el.js +11 -0
- package/lib/locale/el.js.map +1 -1
- package/lib/locale/en.d.ts +11 -0
- package/lib/locale/en.js +11 -0
- package/lib/locale/en.js.map +1 -1
- package/lib/locale/es.d.ts +11 -0
- package/lib/locale/es.js +11 -0
- package/lib/locale/es.js.map +1 -1
- package/lib/locale/et.d.ts +11 -0
- package/lib/locale/et.js +11 -0
- package/lib/locale/et.js.map +1 -1
- package/lib/locale/fa.d.ts +11 -0
- package/lib/locale/fa.js +11 -0
- package/lib/locale/fa.js.map +1 -1
- package/lib/locale/fi.d.ts +11 -0
- package/lib/locale/fi.js +11 -0
- package/lib/locale/fi.js.map +1 -1
- package/lib/locale/fr.d.ts +11 -0
- package/lib/locale/fr.js +11 -0
- package/lib/locale/fr.js.map +1 -1
- package/lib/locale/he.d.ts +11 -0
- package/lib/locale/he.js +11 -0
- package/lib/locale/he.js.map +1 -1
- package/lib/locale/hr.d.ts +11 -0
- package/lib/locale/hr.js +11 -0
- package/lib/locale/hr.js.map +1 -1
- package/lib/locale/hu.d.ts +11 -0
- package/lib/locale/hu.js +11 -0
- package/lib/locale/hu.js.map +1 -1
- package/lib/locale/id.d.ts +11 -0
- package/lib/locale/id.js +11 -0
- package/lib/locale/id.js.map +1 -1
- package/lib/locale/it.d.ts +11 -0
- package/lib/locale/it.js +11 -0
- package/lib/locale/it.js.map +1 -1
- package/lib/locale/ja.d.ts +11 -0
- package/lib/locale/ja.js +11 -0
- package/lib/locale/ja.js.map +1 -1
- package/lib/locale/km.d.ts +11 -0
- package/lib/locale/km.js +11 -0
- package/lib/locale/km.js.map +1 -1
- package/lib/locale/ko.d.ts +11 -0
- package/lib/locale/ko.js +11 -0
- package/lib/locale/ko.js.map +1 -1
- package/lib/locale/lt.d.ts +11 -0
- package/lib/locale/lt.js +11 -0
- package/lib/locale/lt.js.map +1 -1
- package/lib/locale/lv.d.ts +11 -0
- package/lib/locale/lv.js +11 -0
- package/lib/locale/lv.js.map +1 -1
- package/lib/locale/nl.d.ts +11 -0
- package/lib/locale/nl.js +11 -0
- package/lib/locale/nl.js.map +1 -1
- package/lib/locale/no.d.ts +11 -0
- package/lib/locale/no.js +11 -0
- package/lib/locale/no.js.map +1 -1
- package/lib/locale/pl.d.ts +11 -0
- package/lib/locale/pl.js +11 -0
- package/lib/locale/pl.js.map +1 -1
- package/lib/locale/pt.d.ts +11 -0
- package/lib/locale/pt.js +11 -0
- package/lib/locale/pt.js.map +1 -1
- package/lib/locale/ro.d.ts +11 -0
- package/lib/locale/ro.js +11 -0
- package/lib/locale/ro.js.map +1 -1
- package/lib/locale/ru.d.ts +11 -0
- package/lib/locale/ru.js +11 -0
- package/lib/locale/ru.js.map +1 -1
- package/lib/locale/sk.d.ts +11 -0
- package/lib/locale/sk.js +11 -0
- package/lib/locale/sk.js.map +1 -1
- package/lib/locale/sl.d.ts +11 -0
- package/lib/locale/sl.js +11 -0
- package/lib/locale/sl.js.map +1 -1
- package/lib/locale/sr-Cyrl.d.ts +11 -0
- package/lib/locale/sr-Cyrl.js +11 -0
- package/lib/locale/sr-Cyrl.js.map +1 -1
- package/lib/locale/sr-Latn.d.ts +11 -0
- package/lib/locale/sr-Latn.js +11 -0
- package/lib/locale/sr-Latn.js.map +1 -1
- package/lib/locale/sv.d.ts +11 -0
- package/lib/locale/sv.js +11 -0
- package/lib/locale/sv.js.map +1 -1
- package/lib/locale/th.d.ts +11 -0
- package/lib/locale/th.js +11 -0
- package/lib/locale/th.js.map +1 -1
- package/lib/locale/tr.d.ts +11 -0
- package/lib/locale/tr.js +11 -0
- package/lib/locale/tr.js.map +1 -1
- package/lib/locale/uk.d.ts +11 -0
- package/lib/locale/uk.js +11 -0
- package/lib/locale/uk.js.map +1 -1
- package/lib/locale/vi.d.ts +11 -0
- package/lib/locale/vi.js +11 -0
- package/lib/locale/vi.js.map +1 -1
- package/lib/locale/zh-Hans.d.ts +11 -0
- package/lib/locale/zh-Hans.js +11 -0
- package/lib/locale/zh-Hans.js.map +1 -1
- package/lib/locale/zh-Hant.d.ts +11 -0
- package/lib/locale/zh-Hant.js +11 -0
- package/lib/locale/zh-Hant.js.map +1 -1
- package/lib/util/index.d.ts +1 -0
- package/lib/util/index.js +1 -0
- package/lib/util/index.js.map +1 -1
- package/lib/util/timeUtils.d.ts +1 -0
- package/lib/util/timeUtils.js +4 -0
- package/lib/util/timeUtils.js.map +1 -0
- package/package.json +1 -1
@@ -0,0 +1,424 @@
|
|
1
|
+
import { createVNode as _createVNode, createElementVNode as _createElementVNode, mergeProps as _mergeProps, normalizeClass as _normalizeClass, normalizeStyle as _normalizeStyle } from "vue";
|
2
|
+
// Styles
|
3
|
+
import "./VVideo.css";
|
4
|
+
|
5
|
+
// Components
|
6
|
+
import { makeVVideoControlsProps, VVideoControls } from "./VVideoControls.js";
|
7
|
+
import { VFadeTransition } from "../../components/transitions/index.js";
|
8
|
+
import { VSpacer } from "../../components/VGrid/VSpacer.js";
|
9
|
+
import { VImg } from "../../components/VImg/VImg.js";
|
10
|
+
import { VOverlay } from "../../components/VOverlay/VOverlay.js";
|
11
|
+
import { VProgressCircular } from "../../components/VProgressCircular/VProgressCircular.js";
|
12
|
+
import { VIconBtn } from "../VIconBtn/VIconBtn.js"; // Composables
|
13
|
+
import { useDisplay } from "../../composables/index.js";
|
14
|
+
import { makeComponentProps } from "../../composables/component.js";
|
15
|
+
import { makeDensityProps, useDensity } from "../../composables/density.js";
|
16
|
+
import { makeDimensionProps, useDimension } from "../../composables/dimensions.js";
|
17
|
+
import { useElevation } from "../../composables/elevation.js";
|
18
|
+
import { forwardRefs } from "../../composables/forwardRefs.js";
|
19
|
+
import { useProxiedModel } from "../../composables/proxiedModel.js";
|
20
|
+
import { useRounded } from "../../composables/rounded.js";
|
21
|
+
import { makeThemeProps, provideTheme } from "../../composables/theme.js";
|
22
|
+
import { MaybeTransition } from "../../composables/transition.js"; // Utilities
|
23
|
+
import { nextTick, onBeforeUnmount, onMounted, ref, shallowRef, toRef, watch } from 'vue';
|
24
|
+
import { createRange, genericComponent, omit, pick, propsFactory, useRender } from "../../util/index.js"; // Types
|
25
|
+
const allowedVariants = ['background', 'player'];
|
26
|
+
export const makeVVideoProps = propsFactory({
|
27
|
+
autoplay: Boolean,
|
28
|
+
muted: Boolean,
|
29
|
+
eager: Boolean,
|
30
|
+
src: String,
|
31
|
+
type: String,
|
32
|
+
// e.g. video/mp4
|
33
|
+
image: String,
|
34
|
+
hideOverlay: Boolean,
|
35
|
+
noFullscreen: Boolean,
|
36
|
+
startAt: [Number, String],
|
37
|
+
variant: {
|
38
|
+
type: String,
|
39
|
+
default: 'player',
|
40
|
+
validator: v => allowedVariants.includes(v)
|
41
|
+
},
|
42
|
+
controlsTransition: {
|
43
|
+
type: [Boolean, String, Object],
|
44
|
+
component: VFadeTransition
|
45
|
+
},
|
46
|
+
controlsVariant: {
|
47
|
+
type: String,
|
48
|
+
default: 'default'
|
49
|
+
},
|
50
|
+
controlsProps: {
|
51
|
+
type: Object
|
52
|
+
},
|
53
|
+
rounded: [Boolean, Number, String, Array],
|
54
|
+
...makeComponentProps(),
|
55
|
+
...makeDensityProps(),
|
56
|
+
...makeDimensionProps(),
|
57
|
+
...makeThemeProps(),
|
58
|
+
...omit(makeVVideoControlsProps(), ['fullscreen', 'variant'])
|
59
|
+
}, 'VVideo');
|
60
|
+
export const VVideo = genericComponent()({
|
61
|
+
name: 'VVideo',
|
62
|
+
inheritAttrs: false,
|
63
|
+
props: makeVVideoProps(),
|
64
|
+
emits: {
|
65
|
+
loaded: element => true,
|
66
|
+
'update:playing': val => true,
|
67
|
+
'update:progress': val => true,
|
68
|
+
'update:volume': val => true
|
69
|
+
},
|
70
|
+
setup(props, _ref) {
|
71
|
+
let {
|
72
|
+
attrs,
|
73
|
+
emit,
|
74
|
+
slots
|
75
|
+
} = _ref;
|
76
|
+
const {
|
77
|
+
themeClasses
|
78
|
+
} = provideTheme(props);
|
79
|
+
const {
|
80
|
+
densityClasses
|
81
|
+
} = useDensity(props);
|
82
|
+
const {
|
83
|
+
dimensionStyles
|
84
|
+
} = useDimension(props);
|
85
|
+
const {
|
86
|
+
elevationClasses
|
87
|
+
} = useElevation(props);
|
88
|
+
const {
|
89
|
+
ssr
|
90
|
+
} = useDisplay();
|
91
|
+
const roundedForContainer = toRef(() => Array.isArray(props.rounded) ? props.rounded[0] : props.rounded);
|
92
|
+
const roundedForControls = toRef(() => Array.isArray(props.rounded) ? props.rounded.at(-1) : props.rounded ?? false);
|
93
|
+
const {
|
94
|
+
roundedClasses: roundedContainerClasses
|
95
|
+
} = useRounded(roundedForContainer);
|
96
|
+
const {
|
97
|
+
roundedClasses: roundedControlsClasses
|
98
|
+
} = useRounded(roundedForControls);
|
99
|
+
const containerRef = ref();
|
100
|
+
const videoRef = ref();
|
101
|
+
const controlsRef = ref();
|
102
|
+
const playing = useProxiedModel(props, 'playing');
|
103
|
+
const progress = useProxiedModel(props, 'progress');
|
104
|
+
const volume = useProxiedModel(props, 'volume', 0, v => Number(v ?? 0));
|
105
|
+
const fullscreen = shallowRef(false);
|
106
|
+
const waiting = shallowRef(false);
|
107
|
+
const triggered = shallowRef(false);
|
108
|
+
const startAfterLoad = shallowRef(false);
|
109
|
+
const state = shallowRef(props.autoplay ? 'loading' : 'idle');
|
110
|
+
const duration = shallowRef(0);
|
111
|
+
const fullscreenEnabled = toRef(() => !props.noFullscreen && !String(attrs.controlsList ?? '').includes('nofullscreen'));
|
112
|
+
function onTimeupdate() {
|
113
|
+
const {
|
114
|
+
currentTime,
|
115
|
+
duration
|
116
|
+
} = videoRef.value;
|
117
|
+
progress.value = duration === 0 ? 0 : 100 * currentTime / duration;
|
118
|
+
}
|
119
|
+
async function onTriggered() {
|
120
|
+
await nextTick();
|
121
|
+
if (!videoRef.value) return;
|
122
|
+
videoRef.value.addEventListener('timeupdate', onTimeupdate);
|
123
|
+
videoRef.value.volume = volume.value / 100;
|
124
|
+
if (state.value !== 'loaded') {
|
125
|
+
state.value = 'loading';
|
126
|
+
}
|
127
|
+
}
|
128
|
+
function onVideoLoaded() {
|
129
|
+
state.value = 'loaded';
|
130
|
+
duration.value = videoRef.value.duration;
|
131
|
+
const startTime = Number(props.startAt ?? 0);
|
132
|
+
if (startTime && startTime <= duration.value) {
|
133
|
+
videoRef.value.currentTime = startTime;
|
134
|
+
progress.value = duration.value === 0 ? 0 : 100 * startTime / duration.value;
|
135
|
+
}
|
136
|
+
if (startAfterLoad.value) {
|
137
|
+
setTimeout(() => playing.value = true, 100);
|
138
|
+
}
|
139
|
+
emit('loaded', videoRef.value);
|
140
|
+
}
|
141
|
+
function onClick() {
|
142
|
+
if (state.value !== 'loaded') {
|
143
|
+
triggered.value = true;
|
144
|
+
startAfterLoad.value = !startAfterLoad.value;
|
145
|
+
}
|
146
|
+
}
|
147
|
+
function onKeydown(e) {
|
148
|
+
if (!videoRef.value || e.ctrlKey) return;
|
149
|
+
if (e.key.startsWith('Arrow')) {
|
150
|
+
e.preventDefault();
|
151
|
+
}
|
152
|
+
switch (true) {
|
153
|
+
case e.key === ' ':
|
154
|
+
{
|
155
|
+
if (!['A', 'BUTTON'].includes(e.target?.tagName)) {
|
156
|
+
e.preventDefault();
|
157
|
+
playing.value = !playing.value;
|
158
|
+
}
|
159
|
+
break;
|
160
|
+
}
|
161
|
+
case e.key === 'ArrowRight':
|
162
|
+
{
|
163
|
+
const step = 10 * (e.shiftKey ? 6 : 1);
|
164
|
+
videoRef.value.currentTime = Math.min(videoRef.value.currentTime + step, duration.value);
|
165
|
+
// TODO: show skip indicator
|
166
|
+
break;
|
167
|
+
}
|
168
|
+
case e.key === 'ArrowLeft':
|
169
|
+
{
|
170
|
+
const step = 10 * (e.shiftKey ? 6 : 1);
|
171
|
+
videoRef.value.currentTime = Math.max(videoRef.value.currentTime - step, 0);
|
172
|
+
// TODO: show skip indicator
|
173
|
+
break;
|
174
|
+
}
|
175
|
+
case createRange(10).map(String).includes(e.key):
|
176
|
+
{
|
177
|
+
skipTo(Number(e.key) * 10);
|
178
|
+
break;
|
179
|
+
}
|
180
|
+
case e.key === 'ArrowUp':
|
181
|
+
{
|
182
|
+
volume.value = Math.min(volume.value + 10, 100);
|
183
|
+
// TODO: show volume change indicator
|
184
|
+
break;
|
185
|
+
}
|
186
|
+
case e.key === 'ArrowDown':
|
187
|
+
{
|
188
|
+
volume.value = Math.max(volume.value - 10, 0);
|
189
|
+
// TODO: show volume change indicator
|
190
|
+
break;
|
191
|
+
}
|
192
|
+
case e.key === 'm':
|
193
|
+
{
|
194
|
+
controlsRef.value?.toggleMuted();
|
195
|
+
break;
|
196
|
+
}
|
197
|
+
case e.key === 'f':
|
198
|
+
{
|
199
|
+
toggleFullscreen();
|
200
|
+
break;
|
201
|
+
}
|
202
|
+
}
|
203
|
+
}
|
204
|
+
function skipTo(v) {
|
205
|
+
if (!videoRef.value) return;
|
206
|
+
progress.value = v;
|
207
|
+
videoRef.value.currentTime = duration.value * v / 100;
|
208
|
+
}
|
209
|
+
watch(() => props.src, v => {
|
210
|
+
progress.value = 0;
|
211
|
+
});
|
212
|
+
watch(playing, v => {
|
213
|
+
if (!videoRef.value) return;
|
214
|
+
if (v) {
|
215
|
+
videoRef.value.play();
|
216
|
+
} else {
|
217
|
+
videoRef.value.pause();
|
218
|
+
}
|
219
|
+
});
|
220
|
+
watch(volume, v => {
|
221
|
+
if (!videoRef.value) return;
|
222
|
+
videoRef.value.volume = v / 100;
|
223
|
+
});
|
224
|
+
watch(triggered, () => onTriggered(), {
|
225
|
+
once: true
|
226
|
+
});
|
227
|
+
watch(() => props.eager, v => v && (triggered.value = true), {
|
228
|
+
immediate: true
|
229
|
+
});
|
230
|
+
onMounted(() => {
|
231
|
+
if (props.autoplay && !ssr) {
|
232
|
+
triggered.value = true;
|
233
|
+
startAfterLoad.value = true;
|
234
|
+
}
|
235
|
+
});
|
236
|
+
onBeforeUnmount(() => {
|
237
|
+
videoRef.value?.removeEventListener('timeupdate', onTimeupdate);
|
238
|
+
});
|
239
|
+
function focusSlider() {
|
240
|
+
const container = videoRef.value?.closest('.v-video');
|
241
|
+
const innerSlider = container?.querySelector('[role="slider"]');
|
242
|
+
innerSlider?.focus();
|
243
|
+
}
|
244
|
+
function fullscreenExitShortcut(e) {
|
245
|
+
if (['ESC', 'f'].includes(e.key)) {
|
246
|
+
toggleFullscreen();
|
247
|
+
document.body.removeEventListener('keydown', fullscreenExitShortcut);
|
248
|
+
}
|
249
|
+
}
|
250
|
+
async function toggleFullscreen() {
|
251
|
+
if (!fullscreenEnabled.value || !document.fullscreenEnabled) {
|
252
|
+
return;
|
253
|
+
}
|
254
|
+
if (document.fullscreenElement) {
|
255
|
+
document.exitFullscreen();
|
256
|
+
onFullscreenExit();
|
257
|
+
} else {
|
258
|
+
await containerRef.value?.requestFullscreen();
|
259
|
+
document.body.addEventListener('keydown', fullscreenExitShortcut);
|
260
|
+
document.addEventListener('fullscreenchange', onFullscreenExit);
|
261
|
+
fullscreen.value = true;
|
262
|
+
}
|
263
|
+
}
|
264
|
+
function onFullscreenExit() {
|
265
|
+
// event fires with a delay after requestFullscreen(), ignore first run
|
266
|
+
if (document.fullscreenElement) return;
|
267
|
+
focusSlider();
|
268
|
+
fullscreen.value = false;
|
269
|
+
document.body.removeEventListener('keydown', fullscreenExitShortcut);
|
270
|
+
document.removeEventListener('fullscreenchange', onFullscreenExit);
|
271
|
+
}
|
272
|
+
function onVideoClick(e) {
|
273
|
+
e.preventDefault();
|
274
|
+
if (state.value === 'loaded') {
|
275
|
+
playing.value = !playing.value;
|
276
|
+
focusSlider();
|
277
|
+
}
|
278
|
+
}
|
279
|
+
function onDoubleClick(e) {
|
280
|
+
e.preventDefault();
|
281
|
+
toggleFullscreen();
|
282
|
+
}
|
283
|
+
let lastTap = 0;
|
284
|
+
function onTouchend(e) {
|
285
|
+
const now = performance.now();
|
286
|
+
if (now - lastTap < 500) {
|
287
|
+
e.preventDefault();
|
288
|
+
toggleFullscreen();
|
289
|
+
} else {
|
290
|
+
lastTap = now;
|
291
|
+
}
|
292
|
+
}
|
293
|
+
useRender(() => {
|
294
|
+
const showControls = state.value === 'loaded' && props.variant === 'player' && props.controlsVariant !== 'hidden';
|
295
|
+
const posterTransition = props.variant === 'background' ? 'poster-fade-out' : 'fade-transition';
|
296
|
+
const overlayProps = {
|
297
|
+
contained: true,
|
298
|
+
persistent: true,
|
299
|
+
contentClass: 'v-video__overlay-fill'
|
300
|
+
};
|
301
|
+
const controlsProps = {
|
302
|
+
...VVideoControls.filterProps(omit(props, ['variant', 'rounded', 'hideVolume'])),
|
303
|
+
rounded: Array.isArray(props.rounded) ? props.rounded.at(-1) : props.rounded,
|
304
|
+
fullscreen: fullscreen.value,
|
305
|
+
hideVolume: props.hideVolume || props.muted,
|
306
|
+
hideFullscreen: props.hideFullscreen || !fullscreenEnabled.value,
|
307
|
+
density: props.density,
|
308
|
+
variant: props.controlsVariant,
|
309
|
+
playing: playing.value,
|
310
|
+
progress: progress.value,
|
311
|
+
duration: duration.value,
|
312
|
+
volume: volume.value,
|
313
|
+
...props.controlsProps
|
314
|
+
};
|
315
|
+
const controlsEventHandlers = {
|
316
|
+
onSkip: v => skipTo(v),
|
317
|
+
'onClick:fullscreen': () => toggleFullscreen(),
|
318
|
+
'onUpdate:playing': v => playing.value = v,
|
319
|
+
'onUpdate:progress': v => skipTo(v),
|
320
|
+
'onUpdate:volume': v => volume.value = v,
|
321
|
+
onClick: e => e.stopPropagation()
|
322
|
+
};
|
323
|
+
const controlslist = [attrs.controlslist, props.noFullscreen ? 'nofullscreen' : ''].filter(Boolean).join(' ');
|
324
|
+
const loadingIndicator = _createVNode(VProgressCircular, {
|
325
|
+
"indeterminate": true,
|
326
|
+
"color": props.color,
|
327
|
+
"width": "3",
|
328
|
+
"size": Math.min(100, Number(props.height) / 2 || 50)
|
329
|
+
}, null);
|
330
|
+
const overlayPlayIcon = _createVNode(VIconBtn, {
|
331
|
+
"icon": "$play",
|
332
|
+
"size": "80",
|
333
|
+
"color": "#fff",
|
334
|
+
"variant": "outlined",
|
335
|
+
"iconSize": "50",
|
336
|
+
"class": "v-video__center-icon"
|
337
|
+
}, null);
|
338
|
+
return _createElementVNode("div", {
|
339
|
+
"ref": containerRef,
|
340
|
+
"class": _normalizeClass(['v-video', `v-video--variant-${props.variant}`, `v-video--${state.value}`, {
|
341
|
+
'v-video--playing': playing.value
|
342
|
+
}, themeClasses.value, densityClasses.value, roundedContainerClasses.value, props.class]),
|
343
|
+
"style": _normalizeStyle([props.variant === 'background' ? [] : pick(dimensionStyles.value, ['width', 'min-width', 'max-width']), props.style]),
|
344
|
+
"onKeydown": onKeydown,
|
345
|
+
"onClick": onClick
|
346
|
+
}, [_createElementVNode("div", {
|
347
|
+
"class": _normalizeClass(['v-video__content', elevationClasses.value]),
|
348
|
+
"style": _normalizeStyle([props.variant === 'background' ? [] : dimensionStyles.value])
|
349
|
+
}, [(props.eager || triggered.value) && _createElementVNode("video", _mergeProps({
|
350
|
+
"key": "video-element",
|
351
|
+
"class": ['v-video__video', roundedContainerClasses.value]
|
352
|
+
}, omit(attrs, ['controlslist', 'class', 'style']), {
|
353
|
+
"controlslist": controlslist,
|
354
|
+
"autoplay": props.autoplay,
|
355
|
+
"muted": props.muted,
|
356
|
+
"playsinline": true,
|
357
|
+
"ref": videoRef,
|
358
|
+
"onLoadeddata": onVideoLoaded,
|
359
|
+
"onPlay": () => playing.value = true,
|
360
|
+
"onPause": () => playing.value = false,
|
361
|
+
"onWaiting": () => waiting.value = true,
|
362
|
+
"onPlaying": () => waiting.value = false,
|
363
|
+
"onClick": onVideoClick,
|
364
|
+
"onDblclick": onDoubleClick,
|
365
|
+
"onTouchend": onTouchend
|
366
|
+
}), [slots.sources?.() ?? _createElementVNode("source", {
|
367
|
+
"src": props.src,
|
368
|
+
"type": props.type
|
369
|
+
}, null)]), props.variant === 'player' && !props.hideOverlay && _createVNode(VOverlay, _mergeProps({
|
370
|
+
"key": "pause-overlay",
|
371
|
+
"modelValue": state.value === 'loaded',
|
372
|
+
"opacity": "0"
|
373
|
+
}, overlayProps), {
|
374
|
+
default: () => [_createVNode(VSpacer, null, null), _createVNode(MaybeTransition, {
|
375
|
+
"name": "fade-transition"
|
376
|
+
}, {
|
377
|
+
default: () => [!playing.value && overlayPlayIcon]
|
378
|
+
}), _createVNode(VSpacer, null, null)]
|
379
|
+
}), props.variant === 'player' && !!slots.header ? _createElementVNode("div", {
|
380
|
+
"key": "header",
|
381
|
+
"class": "v-video__header"
|
382
|
+
}, [slots.header()]) : '', _createVNode(VOverlay, _mergeProps({
|
383
|
+
"key": "poster-overlay",
|
384
|
+
"modelValue": state.value !== 'loaded',
|
385
|
+
"transition": posterTransition
|
386
|
+
}, overlayProps), {
|
387
|
+
default: () => [_createVNode(VImg, {
|
388
|
+
"cover": true,
|
389
|
+
"src": props.image
|
390
|
+
}, {
|
391
|
+
default: () => [_createElementVNode("div", {
|
392
|
+
"class": _normalizeClass(['v-video__overlay-fill', ...roundedContainerClasses.value])
|
393
|
+
}, [overlayPlayIcon])]
|
394
|
+
})]
|
395
|
+
}), _createVNode(VOverlay, _mergeProps({
|
396
|
+
"key": "loading-overlay",
|
397
|
+
"modelValue": state.value === 'loading' || waiting.value,
|
398
|
+
"opacity": ".1"
|
399
|
+
}, overlayProps), {
|
400
|
+
default: () => [loadingIndicator]
|
401
|
+
})]), _createVNode(MaybeTransition, {
|
402
|
+
"key": "actions",
|
403
|
+
"transition": props.controlsTransition
|
404
|
+
}, {
|
405
|
+
default: () => [showControls && _createVNode(VVideoControls, _mergeProps({
|
406
|
+
"ref": controlsRef,
|
407
|
+
"class": roundedControlsClasses.value
|
408
|
+
}, controlsProps, controlsEventHandlers), {
|
409
|
+
default: slots.controls,
|
410
|
+
prepend: slots.prepend,
|
411
|
+
append: slots.append
|
412
|
+
})]
|
413
|
+
})]);
|
414
|
+
});
|
415
|
+
return {
|
416
|
+
video: videoRef,
|
417
|
+
...forwardRefs({
|
418
|
+
skipTo,
|
419
|
+
toggleFullscreen
|
420
|
+
}, controlsRef)
|
421
|
+
};
|
422
|
+
}
|
423
|
+
});
|
424
|
+
//# sourceMappingURL=VVideo.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"VVideo.js","names":["makeVVideoControlsProps","VVideoControls","VFadeTransition","VSpacer","VImg","VOverlay","VProgressCircular","VIconBtn","useDisplay","makeComponentProps","makeDensityProps","useDensity","makeDimensionProps","useDimension","useElevation","forwardRefs","useProxiedModel","useRounded","makeThemeProps","provideTheme","MaybeTransition","nextTick","onBeforeUnmount","onMounted","ref","shallowRef","toRef","watch","createRange","genericComponent","omit","pick","propsFactory","useRender","allowedVariants","makeVVideoProps","autoplay","Boolean","muted","eager","src","String","type","image","hideOverlay","noFullscreen","startAt","Number","variant","default","validator","v","includes","controlsTransition","Object","component","controlsVariant","controlsProps","rounded","Array","VVideo","name","inheritAttrs","props","emits","loaded","element","val","setup","_ref","attrs","emit","slots","themeClasses","densityClasses","dimensionStyles","elevationClasses","ssr","roundedForContainer","isArray","roundedForControls","at","roundedClasses","roundedContainerClasses","roundedControlsClasses","containerRef","videoRef","controlsRef","playing","progress","volume","fullscreen","waiting","triggered","startAfterLoad","state","duration","fullscreenEnabled","controlsList","onTimeupdate","currentTime","value","onTriggered","addEventListener","onVideoLoaded","startTime","setTimeout","onClick","onKeydown","e","ctrlKey","key","startsWith","preventDefault","target","tagName","step","shiftKey","Math","min","max","map","skipTo","toggleMuted","toggleFullscreen","play","pause","once","immediate","removeEventListener","focusSlider","container","closest","innerSlider","querySelector","focus","fullscreenExitShortcut","document","body","fullscreenElement","exitFullscreen","onFullscreenExit","requestFullscreen","onVideoClick","onDoubleClick","lastTap","onTouchend","now","performance","showControls","posterTransition","overlayProps","contained","persistent","contentClass","filterProps","hideVolume","hideFullscreen","density","controlsEventHandlers","onSkip","onClick:fullscreen","stopPropagation","controlslist","filter","join","loadingIndicator","_createVNode","color","height","overlayPlayIcon","_createElementVNode","_normalizeClass","class","_normalizeStyle","style","_mergeProps","onPlay","onPause","onWaiting","onPlaying","sources","header","controls","prepend","append","video"],"sources":["../../../src/labs/VVideo/VVideo.tsx"],"sourcesContent":["// Styles\nimport './VVideo.sass'\n\n// Components\nimport { makeVVideoControlsProps, VVideoControls } from './VVideoControls'\nimport { VFadeTransition } from '@/components/transitions'\nimport { VSpacer } from '@/components/VGrid/VSpacer'\nimport { VImg } from '@/components/VImg/VImg'\nimport { VOverlay } from '@/components/VOverlay/VOverlay'\nimport { VProgressCircular } from '@/components/VProgressCircular/VProgressCircular'\nimport { VIconBtn } from '@/labs/VIconBtn/VIconBtn'\n\n// Composables\nimport { useDisplay } from '@/composables'\nimport { makeComponentProps } from '@/composables/component'\nimport { makeDensityProps, useDensity } from '@/composables/density'\nimport { makeDimensionProps, useDimension } from '@/composables/dimensions'\nimport { useElevation } from '@/composables/elevation'\nimport { forwardRefs } from '@/composables/forwardRefs'\nimport { useProxiedModel } from '@/composables/proxiedModel'\nimport { useRounded } from '@/composables/rounded'\nimport { makeThemeProps, provideTheme } from '@/composables/theme'\nimport { MaybeTransition } from '@/composables/transition'\n\n// Utilities\nimport { nextTick, onBeforeUnmount, onMounted, ref, shallowRef, toRef, watch } from 'vue'\nimport { createRange, genericComponent, omit, pick, propsFactory, useRender } from '@/util'\n\n// Types\nimport type { Component, PropType, TransitionProps } from 'vue'\nimport type { VVideoControlsActionsSlot, VVideoControlsVariant } from './VVideoControls'\nimport type { LoaderSlotProps } from '@/composables/loader'\n\nexport type VVideoSlots = {\n header: never\n controls: VVideoControlsActionsSlot\n prepend: VVideoControlsActionsSlot\n append: VVideoControlsActionsSlot\n loader: LoaderSlotProps\n sources: never\n}\n\nconst allowedVariants = ['background', 'player'] as const\ntype Variant = typeof allowedVariants[number]\n\nexport const makeVVideoProps = propsFactory({\n autoplay: Boolean,\n muted: Boolean,\n eager: Boolean,\n src: String,\n type: String, // e.g. video/mp4\n image: String,\n hideOverlay: Boolean,\n noFullscreen: Boolean,\n startAt: [Number, String],\n variant: {\n type: String as PropType<Variant>,\n default: 'player',\n validator: (v: any) => allowedVariants.includes(v),\n },\n controlsTransition: {\n type: [Boolean, String, Object] as PropType<null | string | boolean | TransitionProps & { component?: any }>,\n component: VFadeTransition as Component,\n },\n controlsVariant: {\n type: String as PropType<VVideoControlsVariant>,\n default: 'default',\n },\n controlsProps: {\n type: Object as PropType<VVideoControls['$props']>,\n },\n rounded: [Boolean, Number, String, Array] as PropType<boolean | number | string | (boolean | number | string)[]>,\n\n ...makeComponentProps(),\n ...makeDensityProps(),\n ...makeDimensionProps(),\n ...makeThemeProps(),\n ...omit(makeVVideoControlsProps(), [\n 'fullscreen',\n 'variant',\n ]),\n}, 'VVideo')\n\nexport const VVideo = genericComponent<VVideoSlots>()({\n name: 'VVideo',\n\n inheritAttrs: false,\n\n props: makeVVideoProps(),\n\n emits: {\n loaded: (element: HTMLVideoElement) => true,\n 'update:playing': (val: boolean) => true,\n 'update:progress': (val: number) => true,\n 'update:volume': (val: number) => true,\n },\n\n setup (props, { attrs, emit, slots }) {\n const { themeClasses } = provideTheme(props)\n const { densityClasses } = useDensity(props)\n const { dimensionStyles } = useDimension(props)\n const { elevationClasses } = useElevation(props)\n const { ssr } = useDisplay()\n\n const roundedForContainer = toRef(() => Array.isArray(props.rounded) ? props.rounded[0] : props.rounded)\n const roundedForControls = toRef(() => Array.isArray(props.rounded) ? props.rounded.at(-1) : props.rounded ?? false)\n const { roundedClasses: roundedContainerClasses } = useRounded(roundedForContainer)\n const { roundedClasses: roundedControlsClasses } = useRounded(roundedForControls)\n\n const containerRef = ref<HTMLDivElement>()\n const videoRef = ref<HTMLVideoElement>()\n const controlsRef = ref<VVideoControls>()\n\n const playing = useProxiedModel(props, 'playing')\n const progress = useProxiedModel(props, 'progress')\n const volume = useProxiedModel(props, 'volume', 0, (v?: number | string) => Number(v ?? 0))\n\n const fullscreen = shallowRef(false)\n const waiting = shallowRef(false)\n const triggered = shallowRef(false)\n const startAfterLoad = shallowRef(false)\n const state = shallowRef<'idle' | 'loading' | 'loaded' | 'error'>(props.autoplay ? 'loading' : 'idle')\n const duration = shallowRef(0)\n\n const fullscreenEnabled = toRef(() => !props.noFullscreen && !String(attrs.controlsList ?? '').includes('nofullscreen'))\n\n function onTimeupdate () {\n const { currentTime, duration } = videoRef.value!\n progress.value = duration === 0 ? 0 : 100 * currentTime / duration\n }\n\n async function onTriggered () {\n await nextTick()\n if (!videoRef.value) return\n videoRef.value.addEventListener('timeupdate', onTimeupdate)\n videoRef.value.volume = volume.value / 100\n if (state.value !== 'loaded') {\n state.value = 'loading'\n }\n }\n\n function onVideoLoaded () {\n state.value = 'loaded'\n duration.value = videoRef.value!.duration\n\n const startTime = Number(props.startAt ?? 0)\n if (startTime && startTime <= duration.value) {\n videoRef.value!.currentTime = startTime\n progress.value = duration.value === 0 ? 0 : 100 * startTime / duration.value\n }\n\n if (startAfterLoad.value) {\n setTimeout(() => playing.value = true, 100)\n }\n\n emit('loaded', videoRef.value!)\n }\n\n function onClick () {\n if (state.value !== 'loaded') {\n triggered.value = true\n startAfterLoad.value = !startAfterLoad.value\n }\n }\n\n function onKeydown (e: KeyboardEvent) {\n if (!videoRef.value || e.ctrlKey) return\n if (e.key.startsWith('Arrow')) {\n e.preventDefault()\n }\n switch (true) {\n case e.key === ' ': {\n if (!['A', 'BUTTON'].includes((e.target as Element)?.tagName)) {\n e.preventDefault()\n playing.value = !playing.value\n }\n break\n }\n case e.key === 'ArrowRight': {\n const step = 10 * (e.shiftKey ? 6 : 1)\n videoRef.value.currentTime = Math.min(videoRef.value.currentTime + step, duration.value)\n // TODO: show skip indicator\n break\n }\n case e.key === 'ArrowLeft': {\n const step = 10 * (e.shiftKey ? 6 : 1)\n videoRef.value.currentTime = Math.max(videoRef.value.currentTime - step, 0)\n // TODO: show skip indicator\n break\n }\n case createRange(10).map(String).includes(e.key): {\n skipTo(Number(e.key) * 10)\n break\n }\n case e.key === 'ArrowUp': {\n volume.value = Math.min(volume.value + 10, 100)\n // TODO: show volume change indicator\n break\n }\n case e.key === 'ArrowDown': {\n volume.value = Math.max(volume.value - 10, 0)\n // TODO: show volume change indicator\n break\n }\n case e.key === 'm': {\n controlsRef.value?.toggleMuted()\n break\n }\n case e.key === 'f': {\n toggleFullscreen()\n break\n }\n }\n }\n\n function skipTo (v: number) {\n if (!videoRef.value) return\n progress.value = v\n videoRef.value.currentTime = duration.value * v / 100\n }\n\n watch(() => props.src, v => {\n progress.value = 0\n })\n\n watch(playing, v => {\n if (!videoRef.value) return\n if (v) {\n videoRef.value.play()\n } else {\n videoRef.value.pause()\n }\n })\n\n watch(volume, v => {\n if (!videoRef.value) return\n videoRef.value.volume = v / 100\n })\n\n watch(triggered, () => onTriggered(), { once: true })\n\n watch(() => props.eager, v => v && (triggered.value = true), { immediate: true })\n\n onMounted(() => {\n if (props.autoplay && !ssr) {\n triggered.value = true\n startAfterLoad.value = true\n }\n })\n\n onBeforeUnmount(() => {\n videoRef.value?.removeEventListener('timeupdate', onTimeupdate)\n })\n\n function focusSlider () {\n const container = videoRef.value?.closest('.v-video') as HTMLElement\n const innerSlider = container?.querySelector('[role=\"slider\"]') as HTMLElement\n innerSlider?.focus()\n }\n\n function fullscreenExitShortcut (e: KeyboardEvent) {\n if (['ESC', 'f'].includes(e.key)) {\n toggleFullscreen()\n document.body.removeEventListener('keydown', fullscreenExitShortcut)\n }\n }\n\n async function toggleFullscreen () {\n if (!fullscreenEnabled.value || !document.fullscreenEnabled) {\n return\n }\n if (document.fullscreenElement) {\n document.exitFullscreen()\n onFullscreenExit()\n } else {\n await containerRef.value?.requestFullscreen()\n document.body.addEventListener('keydown', fullscreenExitShortcut)\n document.addEventListener('fullscreenchange', onFullscreenExit)\n fullscreen.value = true\n }\n }\n\n function onFullscreenExit () {\n // event fires with a delay after requestFullscreen(), ignore first run\n if (document.fullscreenElement) return\n\n focusSlider()\n fullscreen.value = false\n document.body.removeEventListener('keydown', fullscreenExitShortcut)\n document.removeEventListener('fullscreenchange', onFullscreenExit)\n }\n\n function onVideoClick (e: Event) {\n e.preventDefault()\n if (state.value === 'loaded') {\n playing.value = !playing.value\n focusSlider()\n }\n }\n\n function onDoubleClick (e: Event) {\n e.preventDefault()\n toggleFullscreen()\n }\n\n let lastTap = 0\n function onTouchend (e: Event) {\n const now = performance.now()\n if ((now - lastTap) < 500) {\n e.preventDefault()\n toggleFullscreen()\n } else {\n lastTap = now\n }\n }\n\n useRender(() => {\n const showControls = state.value === 'loaded' &&\n props.variant === 'player' &&\n props.controlsVariant !== 'hidden'\n\n const posterTransition = props.variant === 'background'\n ? 'poster-fade-out'\n : 'fade-transition'\n\n const overlayProps = {\n contained: true,\n persistent: true,\n contentClass: 'v-video__overlay-fill',\n }\n\n const controlsProps = {\n ...VVideoControls.filterProps(omit(props, ['variant', 'rounded', 'hideVolume'])),\n rounded: Array.isArray(props.rounded) ? props.rounded.at(-1) : props.rounded,\n fullscreen: fullscreen.value,\n hideVolume: props.hideVolume || props.muted,\n hideFullscreen: props.hideFullscreen || !fullscreenEnabled.value,\n density: props.density,\n variant: props.controlsVariant,\n playing: playing.value,\n progress: progress.value,\n duration: duration.value,\n volume: volume.value,\n ...props.controlsProps,\n }\n\n const controlsEventHandlers = {\n onSkip: (v: number) => skipTo(v),\n 'onClick:fullscreen': () => toggleFullscreen(),\n 'onUpdate:playing': (v: boolean) => playing.value = v,\n 'onUpdate:progress': (v: number) => skipTo(v),\n 'onUpdate:volume': (v: number) => volume.value = v,\n onClick: (e: Event) => e.stopPropagation(),\n }\n\n const controlslist = [\n attrs.controlslist,\n props.noFullscreen ? 'nofullscreen' : '',\n ].filter(Boolean).join(' ')\n\n const loadingIndicator = (\n <VProgressCircular\n indeterminate\n color={ props.color }\n width=\"3\"\n size={ Math.min(100, Number(props.height) / 2 || 50) }\n />\n )\n\n const overlayPlayIcon = (\n <VIconBtn\n icon=\"$play\"\n size=\"80\"\n color=\"#fff\"\n variant=\"outlined\"\n iconSize=\"50\"\n class=\"v-video__center-icon\"\n />\n )\n\n return (\n <div\n ref={ containerRef }\n class={[\n 'v-video',\n `v-video--variant-${props.variant}`,\n `v-video--${state.value}`,\n { 'v-video--playing': playing.value },\n themeClasses.value,\n densityClasses.value,\n roundedContainerClasses.value,\n props.class,\n ]}\n style={[\n props.variant === 'background' ? [] : pick(dimensionStyles.value, ['width', 'min-width', 'max-width']),\n props.style,\n ]}\n onKeydown={ onKeydown }\n onClick={ onClick }\n >\n <div\n class={[\n 'v-video__content',\n elevationClasses.value,\n ]}\n style={[\n props.variant === 'background' ? [] : dimensionStyles.value,\n ]}\n >\n { (props.eager || triggered.value) && (\n <video\n key=\"video-element\"\n class={[\n 'v-video__video',\n roundedContainerClasses.value,\n ]}\n { ...omit(attrs, ['controlslist', 'class', 'style']) }\n controlslist={ controlslist }\n autoplay={ props.autoplay }\n muted={ props.muted }\n playsinline\n ref={ videoRef }\n onLoadeddata={ onVideoLoaded }\n onPlay={ () => playing.value = true }\n onPause={ () => playing.value = false }\n onWaiting={ () => waiting.value = true }\n onPlaying={ () => waiting.value = false }\n onClick={ onVideoClick }\n onDblclick={ onDoubleClick }\n onTouchend={ onTouchend }\n >\n { slots.sources?.() ?? <source src={ props.src } type={ props.type } /> }\n </video>\n )}\n { props.variant === 'player' && !props.hideOverlay && (\n <VOverlay\n key=\"pause-overlay\"\n modelValue={ state.value === 'loaded' }\n opacity=\"0\"\n { ...overlayProps }\n >\n <VSpacer />\n <MaybeTransition name=\"fade-transition\">\n { !playing.value && overlayPlayIcon }\n </MaybeTransition>\n <VSpacer />\n </VOverlay>\n )}\n { props.variant === 'player' && !!slots.header\n ? (\n <div key=\"header\" class=\"v-video__header\">\n { slots.header() }\n </div>\n )\n : '' }\n <VOverlay\n key=\"poster-overlay\"\n modelValue={ state.value !== 'loaded' }\n transition={ posterTransition }\n { ...overlayProps }\n >\n <VImg cover src={ props.image }>\n <div\n class={[\n 'v-video__overlay-fill',\n ...roundedContainerClasses.value,\n ]}\n >\n { overlayPlayIcon }\n </div>\n </VImg>\n </VOverlay>\n <VOverlay\n key=\"loading-overlay\"\n modelValue={ state.value === 'loading' || waiting.value }\n opacity=\".1\"\n { ...overlayProps }\n >\n { loadingIndicator }\n </VOverlay>\n </div>\n <MaybeTransition key=\"actions\" transition={ props.controlsTransition }>\n { showControls && (\n <VVideoControls\n ref={ controlsRef }\n class={ roundedControlsClasses.value }\n { ...controlsProps }\n { ...controlsEventHandlers }\n >\n {{\n default: slots.controls,\n prepend: slots.prepend,\n append: slots.append,\n }}\n </VVideoControls>\n )}\n </MaybeTransition>\n </div>\n )\n })\n\n return {\n video: videoRef,\n ...forwardRefs({\n skipTo,\n toggleFullscreen,\n }, controlsRef),\n }\n },\n})\n\nexport type VVideo = InstanceType<typeof VVideo>\n"],"mappings":"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","ignoreList":[]}
|