@gradio/video 0.10.2 → 0.10.4

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 CHANGED
@@ -1,5 +1,40 @@
1
1
  # @gradio/video
2
2
 
3
+ ## 0.10.4
4
+
5
+ ### Fixes
6
+
7
+ - [#9163](https://github.com/gradio-app/gradio/pull/9163) [`2b6cbf2`](https://github.com/gradio-app/gradio/commit/2b6cbf25908e42cf027324e54ef2cc0baad11a91) - fix exports and generate types. Thanks @pngwn!
8
+
9
+ ### Dependency updates
10
+
11
+ - @gradio/utils@0.6.1
12
+ - @gradio/statustracker@0.7.6
13
+ - @gradio/atoms@0.8.1
14
+ - @gradio/icons@0.7.2
15
+ - @gradio/wasm@0.13.1
16
+ - @gradio/client@1.5.2
17
+ - @gradio/upload@0.12.4
18
+ - @gradio/image@0.15.1
19
+
20
+ ## 0.10.3
21
+
22
+ ### Features
23
+
24
+ - [#9118](https://github.com/gradio-app/gradio/pull/9118) [`e1c404d`](https://github.com/gradio-app/gradio/commit/e1c404da1143fb52b659d03e028bdba1badf443d) - setup npm-previews of all packages. Thanks @pngwn!
25
+ - [#9102](https://github.com/gradio-app/gradio/pull/9102) [`efdc323`](https://github.com/gradio-app/gradio/commit/efdc3231a7bde38cfe45d10086d0d36a24c1b9b4) - Initial SSR refactor. Thanks @pngwn!
26
+
27
+ ### Dependency updates
28
+
29
+ - @gradio/utils@0.6.0
30
+ - @gradio/upload@0.12.3
31
+ - @gradio/atoms@0.8.0
32
+ - @gradio/client@1.5.1
33
+ - @gradio/statustracker@0.7.5
34
+ - @gradio/wasm@0.13.0
35
+ - @gradio/icons@0.7.1
36
+ - @gradio/image@0.15.0
37
+
3
38
  ## 0.10.2
4
39
 
5
40
  ### Dependency updates
package/Video.test.ts CHANGED
@@ -8,9 +8,9 @@ import {
8
8
  beforeEach,
9
9
  expect
10
10
  } from "vitest";
11
- import { spy, spyOn } from "tinyspy";
12
- import { cleanup, render } from "@gradio/tootils";
13
- import { setupi18n } from "../app/src/i18n";
11
+ import { spyOn } from "tinyspy";
12
+ import { cleanup, render } from "@self/tootils";
13
+ import { setupi18n } from "../core/src/i18n";
14
14
 
15
15
  import Video from "./Index.svelte";
16
16
 
@@ -0,0 +1,73 @@
1
+ <script>import Video from "./shared/Video.svelte";
2
+ import { playable } from "./shared/utils";
3
+ import {} from "@gradio/client";
4
+ export let type;
5
+ export let selected = false;
6
+ export let value;
7
+ export let loop;
8
+ let video;
9
+ async function init() {
10
+ video.muted = true;
11
+ video.playsInline = true;
12
+ video.controls = false;
13
+ video.setAttribute("muted", "");
14
+ await video.play();
15
+ video.pause();
16
+ }
17
+ </script>
18
+
19
+ {#if value}
20
+ {#if playable()}
21
+ <div
22
+ class="container"
23
+ class:table={type === "table"}
24
+ class:gallery={type === "gallery"}
25
+ class:selected
26
+ >
27
+ <Video
28
+ muted
29
+ playsinline
30
+ bind:node={video}
31
+ on:loadeddata={init}
32
+ on:mouseover={video.play.bind(video)}
33
+ on:mouseout={video.pause.bind(video)}
34
+ src={value?.video.url}
35
+ {loop}
36
+ />
37
+ </div>
38
+ {:else}
39
+ <div>{value}</div>
40
+ {/if}
41
+ {/if}
42
+
43
+ <style>
44
+ .container {
45
+ flex: none;
46
+ max-width: none;
47
+ }
48
+ .container :global(video) {
49
+ width: var(--size-full);
50
+ height: var(--size-full);
51
+ object-fit: cover;
52
+ }
53
+
54
+ .container:hover,
55
+ .container.selected {
56
+ border-color: var(--border-color-accent);
57
+ }
58
+ .container.table {
59
+ margin: 0 auto;
60
+ border: 2px solid var(--border-color-primary);
61
+ border-radius: var(--radius-lg);
62
+ overflow: hidden;
63
+ width: var(--size-20);
64
+ height: var(--size-20);
65
+ object-fit: cover;
66
+ }
67
+
68
+ .container.gallery {
69
+ height: var(--size-20);
70
+ max-height: var(--size-20);
71
+ object-fit: cover;
72
+ }
73
+ </style>
@@ -0,0 +1,23 @@
1
+ import { SvelteComponent } from "svelte";
2
+ import { type FileData } from "@gradio/client";
3
+ declare const __propDef: {
4
+ props: {
5
+ type: "gallery" | "table";
6
+ selected?: boolean | undefined;
7
+ value: {
8
+ video: FileData;
9
+ subtitles: FileData | null;
10
+ } | null;
11
+ loop: boolean;
12
+ };
13
+ events: {
14
+ [evt: string]: CustomEvent<any>;
15
+ };
16
+ slots: {};
17
+ };
18
+ export type ExampleProps = typeof __propDef.props;
19
+ export type ExampleEvents = typeof __propDef.events;
20
+ export type ExampleSlots = typeof __propDef.slots;
21
+ export default class Example extends SvelteComponent<ExampleProps, ExampleEvents, ExampleSlots> {
22
+ }
23
+ export {};
@@ -0,0 +1,176 @@
1
+ <svelte:options accessors={true} />
2
+
3
+ <script>import { Block, UploadText } from "@gradio/atoms";
4
+ import StaticVideo from "./shared/VideoPreview.svelte";
5
+ import Video from "./shared/InteractiveVideo.svelte";
6
+ import { StatusTracker } from "@gradio/statustracker";
7
+ export let elem_id = "";
8
+ export let elem_classes = [];
9
+ export let visible = true;
10
+ export let value = null;
11
+ let old_value = null;
12
+ export let label;
13
+ export let sources;
14
+ export let root;
15
+ export let show_label;
16
+ export let loading_status;
17
+ export let height;
18
+ export let width;
19
+ export let container = false;
20
+ export let scale = null;
21
+ export let min_width = void 0;
22
+ export let autoplay = false;
23
+ export let show_share_button = true;
24
+ export let show_download_button;
25
+ export let gradio;
26
+ export let interactive;
27
+ export let mirror_webcam;
28
+ export let include_audio;
29
+ export let loop = false;
30
+ let _video = null;
31
+ let _subtitle = null;
32
+ let active_source;
33
+ let initial_value = value;
34
+ $:
35
+ if (value && initial_value === null) {
36
+ initial_value = value;
37
+ }
38
+ const handle_reset_value = () => {
39
+ if (initial_value === null || value === initial_value) {
40
+ return;
41
+ }
42
+ value = initial_value;
43
+ };
44
+ $:
45
+ if (sources && !active_source) {
46
+ active_source = sources[0];
47
+ }
48
+ $: {
49
+ if (value != null) {
50
+ _video = value.video;
51
+ _subtitle = value.subtitles;
52
+ } else {
53
+ _video = null;
54
+ _subtitle = null;
55
+ }
56
+ }
57
+ let dragging = false;
58
+ $: {
59
+ if (JSON.stringify(value) !== JSON.stringify(old_value)) {
60
+ old_value = value;
61
+ gradio.dispatch("change");
62
+ }
63
+ }
64
+ function handle_change({ detail }) {
65
+ if (detail != null) {
66
+ value = { video: detail, subtitles: null };
67
+ } else {
68
+ value = null;
69
+ }
70
+ }
71
+ function handle_error({ detail }) {
72
+ const [level, status] = detail.includes("Invalid file type") ? ["warning", "complete"] : ["error", "error"];
73
+ loading_status = loading_status || {};
74
+ loading_status.status = status;
75
+ loading_status.message = detail;
76
+ gradio.dispatch(level, detail);
77
+ }
78
+ </script>
79
+
80
+ {#if !interactive}
81
+ <Block
82
+ {visible}
83
+ variant={value === null && active_source === "upload" ? "dashed" : "solid"}
84
+ border_mode={dragging ? "focus" : "base"}
85
+ padding={false}
86
+ {elem_id}
87
+ {elem_classes}
88
+ {height}
89
+ {width}
90
+ {container}
91
+ {scale}
92
+ {min_width}
93
+ allow_overflow={false}
94
+ >
95
+ <StatusTracker
96
+ autoscroll={gradio.autoscroll}
97
+ i18n={gradio.i18n}
98
+ {...loading_status}
99
+ on:clear_status={() => gradio.dispatch("clear_status", loading_status)}
100
+ />
101
+
102
+ <StaticVideo
103
+ value={_video}
104
+ subtitle={_subtitle}
105
+ {label}
106
+ {show_label}
107
+ {autoplay}
108
+ {loop}
109
+ {show_share_button}
110
+ {show_download_button}
111
+ on:play={() => gradio.dispatch("play")}
112
+ on:pause={() => gradio.dispatch("pause")}
113
+ on:stop={() => gradio.dispatch("stop")}
114
+ on:end={() => gradio.dispatch("end")}
115
+ on:share={({ detail }) => gradio.dispatch("share", detail)}
116
+ on:error={({ detail }) => gradio.dispatch("error", detail)}
117
+ i18n={gradio.i18n}
118
+ upload={gradio.client.upload}
119
+ />
120
+ </Block>
121
+ {:else}
122
+ <Block
123
+ {visible}
124
+ variant={value === null && active_source === "upload" ? "dashed" : "solid"}
125
+ border_mode={dragging ? "focus" : "base"}
126
+ padding={false}
127
+ {elem_id}
128
+ {elem_classes}
129
+ {height}
130
+ {width}
131
+ {container}
132
+ {scale}
133
+ {min_width}
134
+ allow_overflow={false}
135
+ >
136
+ <StatusTracker
137
+ autoscroll={gradio.autoscroll}
138
+ i18n={gradio.i18n}
139
+ {...loading_status}
140
+ on:clear_status={() => gradio.dispatch("clear_status", loading_status)}
141
+ />
142
+
143
+ <Video
144
+ value={_video}
145
+ subtitle={_subtitle}
146
+ on:change={handle_change}
147
+ on:drag={({ detail }) => (dragging = detail)}
148
+ on:error={handle_error}
149
+ {label}
150
+ {show_label}
151
+ {show_download_button}
152
+ {sources}
153
+ {active_source}
154
+ {mirror_webcam}
155
+ {include_audio}
156
+ {autoplay}
157
+ {root}
158
+ {loop}
159
+ {handle_reset_value}
160
+ on:clear={() => gradio.dispatch("clear")}
161
+ on:play={() => gradio.dispatch("play")}
162
+ on:pause={() => gradio.dispatch("pause")}
163
+ on:upload={() => gradio.dispatch("upload")}
164
+ on:stop={() => gradio.dispatch("stop")}
165
+ on:end={() => gradio.dispatch("end")}
166
+ on:start_recording={() => gradio.dispatch("start_recording")}
167
+ on:stop_recording={() => gradio.dispatch("stop_recording")}
168
+ i18n={gradio.i18n}
169
+ max_file_size={gradio.max_file_size}
170
+ upload={gradio.client.upload}
171
+ stream_handler={gradio.client.stream}
172
+ >
173
+ <UploadText i18n={gradio.i18n} type="video" />
174
+ </Video>
175
+ </Block>
176
+ {/if}
@@ -0,0 +1,157 @@
1
+ import { SvelteComponent } from "svelte";
2
+ import type { Gradio, ShareData } from "@gradio/utils";
3
+ import type { FileData } from "@gradio/client";
4
+ import type { LoadingStatus } from "@gradio/statustracker";
5
+ declare const __propDef: {
6
+ props: {
7
+ elem_id?: string | undefined;
8
+ elem_classes?: string[] | undefined;
9
+ visible?: boolean | undefined;
10
+ value?: ({
11
+ video: FileData;
12
+ subtitles: FileData | null;
13
+ } | null) | undefined;
14
+ label: string;
15
+ sources: ["webcam"] | ["upload"] | ["webcam", "upload"] | ["upload", "webcam"];
16
+ root: string;
17
+ show_label: boolean;
18
+ loading_status: LoadingStatus;
19
+ height: number | undefined;
20
+ width: number | undefined;
21
+ container?: boolean | undefined;
22
+ scale?: (number | null) | undefined;
23
+ min_width?: number | undefined;
24
+ autoplay?: boolean | undefined;
25
+ show_share_button?: boolean | undefined;
26
+ show_download_button: boolean;
27
+ gradio: Gradio<{
28
+ change: never;
29
+ clear: never;
30
+ play: never;
31
+ pause: never;
32
+ upload: never;
33
+ stop: never;
34
+ end: never;
35
+ start_recording: never;
36
+ stop_recording: never;
37
+ share: ShareData;
38
+ error: string;
39
+ warning: string;
40
+ clear_status: LoadingStatus;
41
+ }>;
42
+ interactive: boolean;
43
+ mirror_webcam: boolean;
44
+ include_audio: boolean;
45
+ loop?: boolean | undefined;
46
+ };
47
+ events: {
48
+ [evt: string]: CustomEvent<any>;
49
+ };
50
+ slots: {};
51
+ };
52
+ export type IndexProps = typeof __propDef.props;
53
+ export type IndexEvents = typeof __propDef.events;
54
+ export type IndexSlots = typeof __propDef.slots;
55
+ export default class Index extends SvelteComponent<IndexProps, IndexEvents, IndexSlots> {
56
+ get elem_id(): string | undefined;
57
+ /**accessor*/
58
+ set elem_id(_: string | undefined);
59
+ get elem_classes(): string[] | undefined;
60
+ /**accessor*/
61
+ set elem_classes(_: string[] | undefined);
62
+ get visible(): boolean | undefined;
63
+ /**accessor*/
64
+ set visible(_: boolean | undefined);
65
+ get value(): {
66
+ video: FileData;
67
+ subtitles: FileData | null;
68
+ } | null | undefined;
69
+ /**accessor*/
70
+ set value(_: {
71
+ video: FileData;
72
+ subtitles: FileData | null;
73
+ } | null | undefined);
74
+ get label(): string;
75
+ /**accessor*/
76
+ set label(_: string);
77
+ get sources(): ["upload"] | ["webcam"] | ["webcam", "upload"] | ["upload", "webcam"];
78
+ /**accessor*/
79
+ set sources(_: ["upload"] | ["webcam"] | ["webcam", "upload"] | ["upload", "webcam"]);
80
+ get root(): string;
81
+ /**accessor*/
82
+ set root(_: string);
83
+ get show_label(): boolean;
84
+ /**accessor*/
85
+ set show_label(_: boolean);
86
+ get loading_status(): LoadingStatus;
87
+ /**accessor*/
88
+ set loading_status(_: LoadingStatus);
89
+ get height(): number | undefined;
90
+ /**accessor*/
91
+ set height(_: number | undefined);
92
+ get width(): number | undefined;
93
+ /**accessor*/
94
+ set width(_: number | undefined);
95
+ get container(): boolean | undefined;
96
+ /**accessor*/
97
+ set container(_: boolean | undefined);
98
+ get scale(): number | null | undefined;
99
+ /**accessor*/
100
+ set scale(_: number | null | undefined);
101
+ get min_width(): number | undefined;
102
+ /**accessor*/
103
+ set min_width(_: number | undefined);
104
+ get autoplay(): boolean | undefined;
105
+ /**accessor*/
106
+ set autoplay(_: boolean | undefined);
107
+ get show_share_button(): boolean | undefined;
108
+ /**accessor*/
109
+ set show_share_button(_: boolean | undefined);
110
+ get show_download_button(): boolean;
111
+ /**accessor*/
112
+ set show_download_button(_: boolean);
113
+ get gradio(): Gradio<{
114
+ change: never;
115
+ clear: never;
116
+ play: never;
117
+ pause: never;
118
+ upload: never;
119
+ stop: never;
120
+ end: never;
121
+ start_recording: never;
122
+ stop_recording: never;
123
+ share: ShareData;
124
+ error: string;
125
+ warning: string;
126
+ clear_status: LoadingStatus;
127
+ }>;
128
+ /**accessor*/
129
+ set gradio(_: Gradio<{
130
+ change: never;
131
+ clear: never;
132
+ play: never;
133
+ pause: never;
134
+ upload: never;
135
+ stop: never;
136
+ end: never;
137
+ start_recording: never;
138
+ stop_recording: never;
139
+ share: ShareData;
140
+ error: string;
141
+ warning: string;
142
+ clear_status: LoadingStatus;
143
+ }>);
144
+ get interactive(): boolean;
145
+ /**accessor*/
146
+ set interactive(_: boolean);
147
+ get mirror_webcam(): boolean;
148
+ /**accessor*/
149
+ set mirror_webcam(_: boolean);
150
+ get include_audio(): boolean;
151
+ /**accessor*/
152
+ set include_audio(_: boolean);
153
+ get loop(): boolean | undefined;
154
+ /**accessor*/
155
+ set loop(_: boolean | undefined);
156
+ }
157
+ export {};
@@ -0,0 +1,7 @@
1
+ export { default as BaseInteractiveVideo } from "./shared/InteractiveVideo.svelte";
2
+ export { default as BaseStaticVideo } from "./shared/VideoPreview.svelte";
3
+ export { default as BasePlayer } from "./shared/Player.svelte";
4
+ export { prettyBytes, playable, loaded } from "./shared/utils";
5
+ export { default as BaseExample } from "./Example.svelte";
6
+ import { default as Index } from "./Index.svelte";
7
+ export default Index;
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export { default as BaseInteractiveVideo } from "./shared/InteractiveVideo.svelte";
2
+ export { default as BaseStaticVideo } from "./shared/VideoPreview.svelte";
3
+ export { default as BasePlayer } from "./shared/Player.svelte";
4
+ export { prettyBytes, playable, loaded } from "./shared/utils";
5
+ export { default as BaseExample } from "./Example.svelte";
6
+ import { default as Index } from "./Index.svelte";
7
+ export default Index;
@@ -0,0 +1,144 @@
1
+ <script>import { createEventDispatcher } from "svelte";
2
+ import { Upload, ModifyUpload } from "@gradio/upload";
3
+ import { BlockLabel } from "@gradio/atoms";
4
+ import { Webcam } from "@gradio/image";
5
+ import { Video } from "@gradio/icons";
6
+ import { prettyBytes, playable } from "./utils";
7
+ import Player from "./Player.svelte";
8
+ import { SelectSource } from "@gradio/atoms";
9
+ export let value = null;
10
+ export let subtitle = null;
11
+ export let sources = ["webcam", "upload"];
12
+ export let label = void 0;
13
+ export let show_download_button = false;
14
+ export let show_label = true;
15
+ export let mirror_webcam = false;
16
+ export let include_audio;
17
+ export let autoplay;
18
+ export let root;
19
+ export let i18n;
20
+ export let active_source = "webcam";
21
+ export let handle_reset_value = () => {
22
+ };
23
+ export let max_file_size = null;
24
+ export let upload;
25
+ export let stream_handler;
26
+ export let loop;
27
+ const dispatch = createEventDispatcher();
28
+ function handle_load({ detail }) {
29
+ value = detail;
30
+ dispatch("change", detail);
31
+ dispatch("upload", detail);
32
+ }
33
+ function handle_clear() {
34
+ value = null;
35
+ dispatch("change", null);
36
+ dispatch("clear");
37
+ }
38
+ function handle_change(video) {
39
+ dispatch("change", video);
40
+ }
41
+ function handle_capture({
42
+ detail
43
+ }) {
44
+ dispatch("change", detail);
45
+ }
46
+ let dragging = false;
47
+ $:
48
+ dispatch("drag", dragging);
49
+ </script>
50
+
51
+ <BlockLabel {show_label} Icon={Video} label={label || "Video"} />
52
+ <div data-testid="video" class="video-container">
53
+ {#if value === null || value.url === undefined}
54
+ <div class="upload-container">
55
+ {#if active_source === "upload"}
56
+ <Upload
57
+ bind:dragging
58
+ filetype="video/x-m4v,video/*"
59
+ on:load={handle_load}
60
+ {max_file_size}
61
+ on:error={({ detail }) => dispatch("error", detail)}
62
+ {root}
63
+ {upload}
64
+ {stream_handler}
65
+ >
66
+ <slot />
67
+ </Upload>
68
+ {:else if active_source === "webcam"}
69
+ <Webcam
70
+ {root}
71
+ {mirror_webcam}
72
+ {include_audio}
73
+ mode="video"
74
+ on:error
75
+ on:capture={handle_capture}
76
+ on:start_recording
77
+ on:stop_recording
78
+ {i18n}
79
+ {upload}
80
+ />
81
+ {/if}
82
+ </div>
83
+ {:else}
84
+ <ModifyUpload
85
+ {i18n}
86
+ on:clear={handle_clear}
87
+ download={show_download_button ? value.url : null}
88
+ />
89
+ {#if playable()}
90
+ {#key value?.url}
91
+ <Player
92
+ {upload}
93
+ {root}
94
+ interactive
95
+ {autoplay}
96
+ src={value.url}
97
+ subtitle={subtitle?.url}
98
+ on:play
99
+ on:pause
100
+ on:stop
101
+ on:end
102
+ mirror={mirror_webcam && active_source === "webcam"}
103
+ {label}
104
+ {handle_change}
105
+ {handle_reset_value}
106
+ {loop}
107
+ />
108
+ {/key}
109
+ {:else if value.size}
110
+ <div class="file-name">{value.orig_name || value.url}</div>
111
+ <div class="file-size">
112
+ {prettyBytes(value.size)}
113
+ </div>
114
+ {/if}
115
+ {/if}
116
+
117
+ <SelectSource {sources} bind:active_source {handle_clear} />
118
+ </div>
119
+
120
+ <style>
121
+ .file-name {
122
+ padding: var(--size-6);
123
+ font-size: var(--text-xxl);
124
+ word-break: break-all;
125
+ }
126
+
127
+ .file-size {
128
+ padding: var(--size-2);
129
+ font-size: var(--text-xl);
130
+ }
131
+
132
+ .upload-container {
133
+ height: 100%;
134
+ width: 100%;
135
+ }
136
+
137
+ .video-container {
138
+ display: flex;
139
+ height: 100%;
140
+ flex-direction: column;
141
+ justify-content: center;
142
+ align-items: center;
143
+ }
144
+ </style>
@@ -0,0 +1,48 @@
1
+ import { SvelteComponent } from "svelte";
2
+ import type { FileData, Client } from "@gradio/client";
3
+ import type { I18nFormatter } from "@gradio/utils";
4
+ declare const __propDef: {
5
+ props: {
6
+ value?: (FileData | null) | undefined;
7
+ subtitle?: (FileData | null) | undefined;
8
+ sources?: (["webcam"] | ["upload"] | ["webcam", "upload"] | ["upload", "webcam"]) | undefined;
9
+ label?: string | undefined;
10
+ show_download_button?: boolean | undefined;
11
+ show_label?: boolean | undefined;
12
+ mirror_webcam?: boolean | undefined;
13
+ include_audio: boolean;
14
+ autoplay: boolean;
15
+ root: string;
16
+ i18n: I18nFormatter;
17
+ active_source?: ("webcam" | "upload") | undefined;
18
+ handle_reset_value?: (() => void) | undefined;
19
+ max_file_size?: (number | null) | undefined;
20
+ upload: Client["upload"];
21
+ stream_handler: Client["stream"];
22
+ loop: boolean;
23
+ };
24
+ events: {
25
+ error: CustomEvent<any>;
26
+ start_recording: CustomEvent<any>;
27
+ stop_recording: CustomEvent<any>;
28
+ play: CustomEvent<any>;
29
+ pause: CustomEvent<any>;
30
+ stop: CustomEvent<undefined>;
31
+ end: CustomEvent<any>;
32
+ change: CustomEvent<FileData | null>;
33
+ clear?: CustomEvent<undefined> | undefined;
34
+ drag: CustomEvent<boolean>;
35
+ upload: CustomEvent<FileData>;
36
+ } & {
37
+ [evt: string]: CustomEvent<any>;
38
+ };
39
+ slots: {
40
+ default: {};
41
+ };
42
+ };
43
+ export type InteractiveVideoProps = typeof __propDef.props;
44
+ export type InteractiveVideoEvents = typeof __propDef.events;
45
+ export type InteractiveVideoSlots = typeof __propDef.slots;
46
+ export default class InteractiveVideo extends SvelteComponent<InteractiveVideoProps, InteractiveVideoEvents, InteractiveVideoSlots> {
47
+ }
48
+ export {};