@video-editor/ui 0.0.1-beta.10

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/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # @video-editor/ui
2
+
3
+ video editor UI package
@@ -0,0 +1,131 @@
1
+ import { ComponentOptionsMixin } from 'vue';
2
+ import { ComponentProvideOptions } from 'vue';
3
+ import { DefineComponent } from 'vue';
4
+ import { ITrackType } from '@video-editor/shared';
5
+ import { IVideoProtocol } from '@video-editor/shared';
6
+ import { PublicProps } from 'vue';
7
+ import { SegmentUnion } from '@video-editor/shared';
8
+ import { TimelineTick } from '..';
9
+ import { TrackUnion } from '@video-editor/shared';
10
+
11
+ declare const __VLS_component: DefineComponent<__VLS_Props, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {} & {
12
+ "update:currentTime": (value: number) => any;
13
+ "update:zoom": (value: number) => any;
14
+ segmentClick: (payload: {
15
+ segment: SegmentUnion;
16
+ track: TrackUnion;
17
+ }) => any;
18
+ segmentDragEnd: (payload: SegmentDragPayload) => any;
19
+ segmentResizeEnd: (payload: SegmentResizePayload) => any;
20
+ "update:selectedSegmentId": (value: string | null) => any;
21
+ }, string, PublicProps, Readonly<__VLS_Props> & Readonly<{
22
+ "onUpdate:currentTime"?: ((value: number) => any) | undefined;
23
+ "onUpdate:zoom"?: ((value: number) => any) | undefined;
24
+ onSegmentClick?: ((payload: {
25
+ segment: SegmentUnion;
26
+ track: TrackUnion;
27
+ }) => any) | undefined;
28
+ onSegmentDragEnd?: ((payload: SegmentDragPayload) => any) | undefined;
29
+ onSegmentResizeEnd?: ((payload: SegmentResizePayload) => any) | undefined;
30
+ "onUpdate:selectedSegmentId"?: ((value: string | null) => any) | undefined;
31
+ }>, {
32
+ disableInteraction: boolean;
33
+ snapStep: number;
34
+ selectedSegmentId: string | null;
35
+ protocol: IVideoProtocol | null;
36
+ trackTypes: ITrackType[];
37
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {}, HTMLDivElement>;
38
+
39
+ declare type __VLS_Props = {
40
+ protocol?: IVideoProtocol | null;
41
+ currentTime: number;
42
+ zoom?: number;
43
+ snapStep?: number;
44
+ selectedSegmentId?: string | null;
45
+ trackTypes?: ITrackType[];
46
+ disableInteraction?: boolean;
47
+ };
48
+
49
+ declare function __VLS_template(): {
50
+ attrs: Partial<{}>;
51
+ slots: {
52
+ toolbar?(_: {
53
+ zoom: number;
54
+ canZoomIn: boolean;
55
+ canZoomOut: boolean;
56
+ zoomIn: () => void;
57
+ zoomOut: () => void;
58
+ currentTime: number;
59
+ duration: number;
60
+ formatTime: (ms: number) => string;
61
+ }): any;
62
+ ruler?(_: {
63
+ ticks: TimelineTick[];
64
+ pixelsPerMs: number;
65
+ }): any;
66
+ playhead?(_: {
67
+ left: number;
68
+ currentTime: number;
69
+ }): any;
70
+ };
71
+ refs: {};
72
+ rootEl: HTMLDivElement;
73
+ };
74
+
75
+ declare type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
76
+
77
+ declare type __VLS_WithTemplateSlots<T, S> = T & {
78
+ new (): {
79
+ $slots: S;
80
+ };
81
+ };
82
+
83
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
84
+ export default _default;
85
+
86
+ declare interface SegmentDragPayload {
87
+ segment: TimelineSegment;
88
+ track: TimelineTrack;
89
+ trackIndex: number;
90
+ segmentIndex: number;
91
+ startTime: number;
92
+ endTime: number;
93
+ targetTrackIndex: number;
94
+ targetTrackId: string;
95
+ isNewTrack: boolean;
96
+ newTrackInsertIndex?: number;
97
+ visualTrackIndex: number;
98
+ isValidTarget: boolean;
99
+ mouseDeltaY: number;
100
+ }
101
+
102
+ declare interface SegmentResizePayload {
103
+ segment: TimelineSegment;
104
+ track: TimelineTrack;
105
+ trackIndex: number;
106
+ segmentIndex: number;
107
+ startTime: number;
108
+ endTime: number;
109
+ edge: 'start' | 'end';
110
+ }
111
+
112
+ declare interface TimelineSegment {
113
+ id: string;
114
+ start: number;
115
+ end: number;
116
+ type?: string;
117
+ color?: string;
118
+ payload?: unknown;
119
+ }
120
+
121
+ declare interface TimelineTrack {
122
+ id: string;
123
+ label?: string;
124
+ type?: string;
125
+ color?: string;
126
+ isMain?: boolean;
127
+ payload?: unknown;
128
+ segments: TimelineSegment[];
129
+ }
130
+
131
+ export { }
@@ -0,0 +1,270 @@
1
+ import { defineComponent as V, reactive as J, watch as P, onBeforeUnmount as Y, createElementBlock as l, openBlock as r, createCommentVNode as x, normalizeStyle as L, Fragment as v, renderList as j, createElementVNode as y, toDisplayString as h, computed as S, ref as q, createBlock as E, createSlots as G, withCtx as _, unref as w, renderSlot as C, normalizeProps as M, guardReactiveProps as U } from "vue";
2
+ import { _ as D, V as K } from "./index-CIZtI1B_.js";
3
+ import { generateThumbnails as Q } from "@video-editor/protocol";
4
+ import { isVideoFramesSegment as W } from "@video-editor/shared";
5
+ const X = { class: "frames-segment" }, Z = {
6
+ key: 0,
7
+ class: "frames-segment__video"
8
+ }, ee = {
9
+ key: 1,
10
+ class: "frames-segment__placeholder"
11
+ }, te = { key: 0 }, ne = { key: 1 }, se = { key: 2 }, re = {
12
+ key: 2,
13
+ class: "frames-segment__placeholder"
14
+ }, ae = {
15
+ key: 3,
16
+ class: "frames-segment__badge"
17
+ }, oe = /* @__PURE__ */ V({
18
+ name: "FramesSegment",
19
+ __name: "FramesSegment",
20
+ props: {
21
+ segment: {}
22
+ },
23
+ setup(o) {
24
+ const g = o, n = J({ items: [], loading: !1, error: null });
25
+ let c = 0;
26
+ P(() => g.segment, (s, i) => {
27
+ if (!W(s))
28
+ return;
29
+ (!i || f(i, s)) && $(s);
30
+ }, { immediate: !0, deep: !0 }), Y(() => {
31
+ b();
32
+ });
33
+ function f(s, i) {
34
+ return s.url !== i.url || s.startTime !== i.startTime || s.endTime !== i.endTime || s.fromTime !== i.fromTime;
35
+ }
36
+ async function $(s) {
37
+ if (!s.url)
38
+ return;
39
+ const i = ++c;
40
+ b(), n.loading = !0, n.error = null;
41
+ try {
42
+ const m = I(s), u = await Q(s.url, m);
43
+ if (c !== i)
44
+ return;
45
+ const T = u.map((k) => ({
46
+ tsMs: Math.round(k.ts / 1e3),
47
+ url: URL.createObjectURL(k.img)
48
+ }));
49
+ n.items = T, n.loading = !1;
50
+ } catch (m) {
51
+ if (c !== i)
52
+ return;
53
+ n.error = m instanceof Error ? m.message : String(m), n.loading = !1;
54
+ }
55
+ }
56
+ function I(s) {
57
+ const i = Math.max(s.fromTime ?? 0, 0) * 1e3, m = Math.max(s.endTime - s.startTime, 1), u = i + m * 1e3, k = Math.max(Math.floor((u - i) / 8), 2e5);
58
+ return { start: i, end: u, step: k };
59
+ }
60
+ function b() {
61
+ n.items.forEach((s) => URL.revokeObjectURL(s.url)), n.items = [];
62
+ }
63
+ function R() {
64
+ return {
65
+ backgroundImage: g.segment.url ? `url(${g.segment.url})` : "",
66
+ backgroundRepeat: "repeat-x",
67
+ backgroundSize: "56px 56px",
68
+ backgroundPosition: "left center"
69
+ };
70
+ }
71
+ return (s, i) => (r(), l("div", X, [
72
+ o.segment.type === "image" ? (r(), l("div", {
73
+ key: 0,
74
+ class: "frames-segment__image",
75
+ style: L(R())
76
+ }, null, 4)) : o.segment.type === "video" ? (r(), l(v, { key: 1 }, [
77
+ n.items.length ? (r(), l("div", Z, [
78
+ (r(!0), l(v, null, j(n.items, (m) => (r(), l("div", {
79
+ key: `${o.segment.id}-${m.tsMs}`,
80
+ class: "frames-segment__thumb",
81
+ style: L({ backgroundImage: `url(${m.url})` })
82
+ }, null, 4))), 128))
83
+ ])) : (r(), l("div", ee, [
84
+ n.loading ? (r(), l("span", te, "抽帧中…")) : n.error ? (r(), l("span", ne, "生成失败")) : (r(), l("span", se, "未生成缩略图"))
85
+ ]))
86
+ ], 64)) : (r(), l("div", re, [
87
+ y("span", null, h(o.segment.type), 1)
88
+ ])),
89
+ o.segment.extra?.label ? (r(), l("span", ae, h(o.segment.extra?.label), 1)) : x("", !0)
90
+ ]));
91
+ }
92
+ }), ie = /* @__PURE__ */ D(oe, [["__scopeId", "data-v-dd7a5d19"]]), le = { class: "segment-base" }, ce = { class: "segment-base__content" }, me = { class: "segment-base__pill segment-base__pill--primary" }, de = { class: "segment-base__pill segment-base__pill--muted" }, ue = {
93
+ key: 0,
94
+ class: "segment-base__badge"
95
+ }, ge = /* @__PURE__ */ V({
96
+ name: "SegmentBase",
97
+ __name: "SegmentBase",
98
+ props: {
99
+ segment: {},
100
+ trackType: {},
101
+ accentColor: { default: "#222226" }
102
+ },
103
+ setup(o) {
104
+ const g = o, n = S(() => {
105
+ const c = g.segment?.extra?.label;
106
+ return typeof c == "string" ? c : null;
107
+ });
108
+ return (c, f) => (r(), l("div", le, [
109
+ y("div", ce, [
110
+ y("span", me, h(o.trackType), 1),
111
+ y("span", de, h(o.segment.segmentType), 1)
112
+ ]),
113
+ n.value ? (r(), l("span", ue, h(n.value), 1)) : x("", !0)
114
+ ]));
115
+ }
116
+ }), pe = /* @__PURE__ */ D(ge, [["__scopeId", "data-v-d386af72"]]), fe = { class: "ve-editor-segment__preview" }, B = "#222226", ke = 0.4, ye = /* @__PURE__ */ V({
117
+ name: "VideoEditorTimeline",
118
+ __name: "index",
119
+ props: {
120
+ protocol: { default: null },
121
+ currentTime: {},
122
+ zoom: {},
123
+ snapStep: { default: 0 },
124
+ selectedSegmentId: { default: null },
125
+ trackTypes: { default: void 0 },
126
+ disableInteraction: { type: Boolean, default: !1 }
127
+ },
128
+ emits: ["update:currentTime", "update:zoom", "update:selectedSegmentId", "segmentClick", "segmentDragEnd", "segmentResizeEnd"],
129
+ setup(o, { emit: g }) {
130
+ const n = o, c = g, f = q(n.selectedSegmentId ?? null);
131
+ P(() => n.selectedSegmentId, (e) => {
132
+ f.value = e ?? null;
133
+ });
134
+ const $ = {
135
+ frames: B,
136
+ audio: "#0ea5e9",
137
+ text: "#16a34a",
138
+ sticker: "#f97316",
139
+ effect: "#a855f7",
140
+ filter: "#64748b"
141
+ }, I = S(() => n.protocol?.tracks?.length ? n.trackTypes?.length ? n.protocol.tracks.filter((e) => n.trackTypes?.includes(e.trackType)) : n.protocol.tracks : []), b = S(() => I.value.map((e, a) => {
142
+ const t = $[e.trackType] || B, d = s(t, ke), z = e.trackType === "frames" && e.isMain === !0;
143
+ return {
144
+ id: e.trackId || `${e.trackType}-${a}`,
145
+ label: e.trackType,
146
+ type: e.trackType,
147
+ color: t,
148
+ isMain: z,
149
+ payload: e,
150
+ segments: e.children.map((p) => ({
151
+ id: p.id,
152
+ start: p.startTime,
153
+ end: p.endTime,
154
+ type: p.segmentType,
155
+ color: d,
156
+ payload: p
157
+ }))
158
+ };
159
+ })), R = S(() => {
160
+ if (!n.protocol?.tracks?.length)
161
+ return 0;
162
+ const e = n.protocol.tracks.flatMap((a) => a.children.map((t) => t.endTime));
163
+ return e.length ? Math.max(...e) : 0;
164
+ });
165
+ function s(e, a) {
166
+ const t = e.replace("#", "");
167
+ if (!(t.length === 3 || t.length === 6))
168
+ return e;
169
+ const d = t.length === 3 ? t.split("").map((F) => F + F).join("") : t, z = Number.parseInt(d.slice(0, 2), 16), p = Number.parseInt(d.slice(2, 4), 16), H = Number.parseInt(d.slice(4, 6), 16);
170
+ return `rgba(${z}, ${p}, ${H}, ${a})`;
171
+ }
172
+ function i(e) {
173
+ return e && typeof e == "object" && "segmentType" in e ? e : null;
174
+ }
175
+ function m(e) {
176
+ const a = e.payload;
177
+ if (a)
178
+ return a;
179
+ if (n.protocol)
180
+ return n.protocol.tracks.find((t) => t.trackId === e.id);
181
+ }
182
+ function u(e) {
183
+ f.value = e, c("update:selectedSegmentId", e);
184
+ }
185
+ function T(e) {
186
+ const a = i(e.segment.payload), t = m(e.track);
187
+ a && (u(a.id), t && c("segmentClick", { segment: a, track: t }));
188
+ }
189
+ function k(e) {
190
+ u(e.segment.id);
191
+ }
192
+ function A(e) {
193
+ c("segmentDragEnd", e);
194
+ }
195
+ function N(e) {
196
+ u(e.segment.id);
197
+ }
198
+ function O(e) {
199
+ c("segmentResizeEnd", e);
200
+ }
201
+ return (e, a) => (r(), E(K, {
202
+ tracks: b.value,
203
+ duration: R.value,
204
+ "current-time": o.currentTime,
205
+ zoom: o.zoom,
206
+ fps: o.protocol?.fps || 30,
207
+ "snap-step": o.snapStep,
208
+ "selected-segment-id": f.value ?? null,
209
+ "disable-interaction": o.disableInteraction,
210
+ "onUpdate:currentTime": a[0] || (a[0] = (t) => c("update:currentTime", t)),
211
+ "onUpdate:zoom": a[1] || (a[1] = (t) => c("update:zoom", t)),
212
+ onSegmentClick: T,
213
+ onSegmentDragStart: k,
214
+ onSegmentDragEnd: A,
215
+ onSegmentResizeStart: N,
216
+ onSegmentResizeEnd: O,
217
+ onBackgroundClick: a[2] || (a[2] = (t) => u(null))
218
+ }, G({
219
+ segment: _(({ layout: t }) => [
220
+ (r(!0), l(v, null, j([i(t.segment.payload)], (d) => (r(), l(v, {
221
+ key: d?.id || t.segment.id
222
+ }, [
223
+ d ? (r(), l("div", {
224
+ key: 0,
225
+ class: "ve-editor-segment",
226
+ style: L({ "--ve-segment-accent": t.track.color || B })
227
+ }, [
228
+ y("div", fe, [
229
+ d.segmentType === "frames" ? (r(), E(w(ie), {
230
+ key: 0,
231
+ segment: d
232
+ }, null, 8, ["segment"])) : (r(), E(w(pe), {
233
+ key: 1,
234
+ segment: d,
235
+ "track-type": t.track.type || "unknown",
236
+ "accent-color": t.track.color
237
+ }, null, 8, ["segment", "track-type", "accent-color"]))
238
+ ])
239
+ ], 4)) : x("", !0)
240
+ ], 64))), 128))
241
+ ]),
242
+ _: 2
243
+ }, [
244
+ e.$slots.toolbar ? {
245
+ name: "toolbar",
246
+ fn: _((t) => [
247
+ C(e.$slots, "toolbar", M(U(t)), void 0, !0)
248
+ ]),
249
+ key: "0"
250
+ } : void 0,
251
+ e.$slots.ruler ? {
252
+ name: "ruler",
253
+ fn: _((t) => [
254
+ C(e.$slots, "ruler", M(U(t)), void 0, !0)
255
+ ]),
256
+ key: "1"
257
+ } : void 0,
258
+ e.$slots.playhead ? {
259
+ name: "playhead",
260
+ fn: _((t) => [
261
+ C(e.$slots, "playhead", M(U(t)), void 0, !0)
262
+ ]),
263
+ key: "2"
264
+ } : void 0
265
+ ]), 1032, ["tracks", "duration", "current-time", "zoom", "fps", "snap-step", "selected-segment-id", "disable-interaction"]));
266
+ }
267
+ }), Se = /* @__PURE__ */ D(ye, [["__scopeId", "data-v-d5455177"]]);
268
+ export {
269
+ Se as default
270
+ };
@@ -0,0 +1,200 @@
1
+ import { ComponentOptionsMixin } from 'vue';
2
+ import { ComponentProvideOptions } from 'vue';
3
+ import { DefineComponent } from 'vue';
4
+ import { PublicProps } from 'vue';
5
+ import { TimelineSegment as TimelineSegment_2 } from './types';
6
+
7
+ declare const __VLS_component: DefineComponent<__VLS_Props, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {} & {
8
+ "update:currentTime": (value: number) => any;
9
+ "update:zoom": (value: number) => any;
10
+ segmentClick: (layout: SegmentLayout, event: MouseEvent) => any;
11
+ segmentDragStart: (payload: SegmentDragPayload) => any;
12
+ segmentDrag: (payload: SegmentDragPayload) => any;
13
+ segmentDragEnd: (payload: SegmentDragPayload) => any;
14
+ segmentResizeStart: (payload: SegmentResizePayload) => any;
15
+ segmentResize: (payload: SegmentResizePayload) => any;
16
+ segmentResizeEnd: (payload: SegmentResizePayload) => any;
17
+ backgroundClick: (event: MouseEvent) => any;
18
+ }, string, PublicProps, Readonly<__VLS_Props> & Readonly<{
19
+ "onUpdate:currentTime"?: ((value: number) => any) | undefined;
20
+ "onUpdate:zoom"?: ((value: number) => any) | undefined;
21
+ onSegmentClick?: ((layout: SegmentLayout, event: MouseEvent) => any) | undefined;
22
+ onSegmentDragStart?: ((payload: SegmentDragPayload) => any) | undefined;
23
+ onSegmentDrag?: ((payload: SegmentDragPayload) => any) | undefined;
24
+ onSegmentDragEnd?: ((payload: SegmentDragPayload) => any) | undefined;
25
+ onSegmentResizeStart?: ((payload: SegmentResizePayload) => any) | undefined;
26
+ onSegmentResize?: ((payload: SegmentResizePayload) => any) | undefined;
27
+ onSegmentResizeEnd?: ((payload: SegmentResizePayload) => any) | undefined;
28
+ onBackgroundClick?: ((event: MouseEvent) => any) | undefined;
29
+ }>, {
30
+ minZoom: number;
31
+ maxZoom: number;
32
+ disableInteraction: boolean;
33
+ snapStep: number;
34
+ trackHeight: number;
35
+ trackGap: number;
36
+ rulerHeight: number;
37
+ minSegmentDuration: number;
38
+ selectedSegmentId: string | null;
39
+ fps: number;
40
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {
41
+ viewportRef: HTMLDivElement;
42
+ contentRef: HTMLDivElement;
43
+ tracksRef: HTMLDivElement;
44
+ }, HTMLDivElement>;
45
+
46
+ declare type __VLS_Props = {
47
+ tracks: TimelineTrack[];
48
+ currentTime: number;
49
+ duration?: number;
50
+ zoom?: number;
51
+ minZoom?: number;
52
+ maxZoom?: number;
53
+ snapStep?: number;
54
+ trackHeight?: number;
55
+ trackGap?: number;
56
+ rulerHeight?: number;
57
+ minSegmentDuration?: number;
58
+ selectedSegmentId?: string | null;
59
+ disableInteraction?: boolean;
60
+ fps?: number;
61
+ };
62
+
63
+ declare function __VLS_template(): {
64
+ attrs: Partial<{}>;
65
+ slots: {
66
+ toolbar?(_: {
67
+ zoom: number;
68
+ canZoomIn: boolean;
69
+ canZoomOut: boolean;
70
+ zoomIn: typeof zoomIn;
71
+ zoomOut: typeof zoomOut;
72
+ currentTime: number;
73
+ duration: number;
74
+ formatTime: typeof formatTime;
75
+ }): any;
76
+ ruler?(_: {
77
+ ticks: TimelineTick[];
78
+ pixelsPerMs: number;
79
+ }): any;
80
+ playhead?(_: {
81
+ left: number;
82
+ currentTime: number;
83
+ }): any;
84
+ track?(_: {
85
+ track: TimelineTrack;
86
+ index: number;
87
+ segments: SegmentLayout[];
88
+ pixelsPerMs: number;
89
+ height: number;
90
+ }): any;
91
+ segment?(_: {
92
+ layout: SegmentLayout;
93
+ segment: TimelineSegment_2;
94
+ track: TimelineTrack;
95
+ isSelected: boolean;
96
+ }): any;
97
+ segment?(_: {
98
+ layout: {
99
+ left: number;
100
+ top: number;
101
+ segment: TimelineSegment_2;
102
+ track: TimelineTrack;
103
+ trackIndex: number;
104
+ segmentIndex: number;
105
+ width: number;
106
+ isSelected: boolean;
107
+ };
108
+ segment: TimelineSegment_2;
109
+ track: TimelineTrack;
110
+ isSelected: boolean;
111
+ }): any;
112
+ };
113
+ refs: {
114
+ viewportRef: HTMLDivElement;
115
+ contentRef: HTMLDivElement;
116
+ tracksRef: HTMLDivElement;
117
+ };
118
+ rootEl: HTMLDivElement;
119
+ };
120
+
121
+ declare type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
122
+
123
+ declare type __VLS_WithTemplateSlots<T, S> = T & {
124
+ new (): {
125
+ $slots: S;
126
+ };
127
+ };
128
+
129
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
130
+ export default _default;
131
+
132
+ declare function formatTime(ms: number): string;
133
+
134
+ declare interface SegmentDragPayload {
135
+ segment: TimelineSegment;
136
+ track: TimelineTrack;
137
+ trackIndex: number;
138
+ segmentIndex: number;
139
+ startTime: number;
140
+ endTime: number;
141
+ targetTrackIndex: number;
142
+ targetTrackId: string;
143
+ isNewTrack: boolean;
144
+ newTrackInsertIndex?: number;
145
+ visualTrackIndex: number;
146
+ isValidTarget: boolean;
147
+ mouseDeltaY: number;
148
+ }
149
+
150
+ declare interface SegmentLayout {
151
+ segment: TimelineSegment;
152
+ track: TimelineTrack;
153
+ trackIndex: number;
154
+ segmentIndex: number;
155
+ left: number;
156
+ width: number;
157
+ isSelected: boolean;
158
+ }
159
+
160
+ declare interface SegmentResizePayload {
161
+ segment: TimelineSegment;
162
+ track: TimelineTrack;
163
+ trackIndex: number;
164
+ segmentIndex: number;
165
+ startTime: number;
166
+ endTime: number;
167
+ edge: 'start' | 'end';
168
+ }
169
+
170
+ declare interface TimelineSegment {
171
+ id: string;
172
+ start: number;
173
+ end: number;
174
+ type?: string;
175
+ color?: string;
176
+ payload?: unknown;
177
+ }
178
+
179
+ declare interface TimelineTick {
180
+ position: number;
181
+ timeMs: number;
182
+ isMajor: boolean;
183
+ label?: string;
184
+ }
185
+
186
+ declare interface TimelineTrack {
187
+ id: string;
188
+ label?: string;
189
+ type?: string;
190
+ color?: string;
191
+ isMain?: boolean;
192
+ payload?: unknown;
193
+ segments: TimelineSegment[];
194
+ }
195
+
196
+ declare function zoomIn(): void;
197
+
198
+ declare function zoomOut(): void;
199
+
200
+ export { }
@@ -0,0 +1,4 @@
1
+ import { V as f } from "./index-CIZtI1B_.js";
2
+ export {
3
+ f as default
4
+ };