@video-editor/ui 0.0.1-beta.13 → 0.0.1-beta.15

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.
@@ -0,0 +1,370 @@
1
+ import { defineComponent as A, reactive as O, watch as J, onBeforeUnmount as X, createElementBlock as f, openBlock as u, renderSlot as i, normalizeStyle as w, createElementVNode as g, Fragment as V, renderList as H, toDisplayString as M, createCommentVNode as D, computed as C, ref as Z, watchEffect as x, createBlock as ee, createSlots as te, withCtx as E, createVNode as S, unref as v, normalizeProps as F, guardReactiveProps as L } from "vue";
2
+ import { generateThumbnails as ne, getMp4Meta as re } from "@video-editor/protocol";
3
+ import { isVideoFramesSegment as j, isAudioSegment as se } from "@video-editor/shared";
4
+ import { _ as N, V as oe } from "./index-Czb5PTVP.js";
5
+ const ae = { class: "frames-segment" }, le = { class: "frames-segment__video" }, ie = {
6
+ key: 1,
7
+ class: "frames-segment__placeholder"
8
+ }, ce = { class: "frames-segment__placeholder" }, me = {
9
+ key: 0,
10
+ class: "frames-segment__badge"
11
+ }, de = /* @__PURE__ */ A({
12
+ name: "FramesSegment",
13
+ __name: "FramesSegment",
14
+ props: {
15
+ segment: {}
16
+ },
17
+ setup(o) {
18
+ const p = o, n = O({ items: [], loading: !1, error: null });
19
+ let c = 0;
20
+ J(() => p.segment, (r, l) => {
21
+ if (!j(r))
22
+ return;
23
+ (!l || k(l, r)) && U(r);
24
+ }, { immediate: !0, deep: !0 }), X(() => {
25
+ y();
26
+ });
27
+ function k(r, l) {
28
+ return r.url !== l.url || r.startTime !== l.startTime || r.endTime !== l.endTime || r.fromTime !== l.fromTime;
29
+ }
30
+ async function U(r) {
31
+ if (!r.url)
32
+ return;
33
+ const l = ++c;
34
+ y(), n.loading = !0, n.error = null;
35
+ try {
36
+ const m = R(r), b = await ne(r.url, m);
37
+ if (c !== l)
38
+ return;
39
+ const $ = b.map((h) => ({
40
+ tsMs: Math.round(h.ts / 1e3),
41
+ url: URL.createObjectURL(h.img)
42
+ }));
43
+ n.items = $, n.loading = !1;
44
+ } catch (m) {
45
+ if (c !== l)
46
+ return;
47
+ n.error = m instanceof Error ? m.message : String(m), n.loading = !1;
48
+ }
49
+ }
50
+ function R(r) {
51
+ const l = Math.max(r.fromTime ?? 0, 0) * 1e3, m = Math.max(r.endTime - r.startTime, 1), b = l + m * 1e3, h = Math.max(Math.floor((b - l) / 8), 2e5);
52
+ return { start: l, end: b, step: h };
53
+ }
54
+ function y() {
55
+ n.items.forEach((r) => URL.revokeObjectURL(r.url)), n.items = [];
56
+ }
57
+ function T() {
58
+ return {
59
+ backgroundImage: p.segment.url ? `url(${p.segment.url})` : "",
60
+ backgroundRepeat: "repeat-x",
61
+ backgroundSize: "56px 56px",
62
+ backgroundPosition: "left center"
63
+ };
64
+ }
65
+ return (r, l) => (u(), f("div", ae, [
66
+ o.segment.type === "image" ? i(r.$slots, "image", {
67
+ key: 0,
68
+ segment: o.segment,
69
+ style: w(T())
70
+ }, () => [
71
+ g("div", {
72
+ class: "frames-segment__image",
73
+ style: w(T())
74
+ }, null, 4)
75
+ ], !0) : o.segment.type === "video" ? (u(), f(V, { key: 1 }, [
76
+ n.items.length ? i(r.$slots, "video", {
77
+ key: 0,
78
+ segment: o.segment,
79
+ thumbnails: n.items
80
+ }, () => [
81
+ g("div", le, [
82
+ (u(!0), f(V, null, H(n.items, (m) => (u(), f("div", {
83
+ key: `${o.segment.id}-${m.tsMs}`,
84
+ class: "frames-segment__thumb",
85
+ style: w({ backgroundImage: `url(${m.url})` })
86
+ }, null, 4))), 128))
87
+ ])
88
+ ], !0) : (u(), f("div", ie, [
89
+ n.loading ? i(r.$slots, "loading", {
90
+ key: 0,
91
+ segment: o.segment
92
+ }, () => [
93
+ l[0] || (l[0] = g("span", null, "抽帧中…", -1))
94
+ ], !0) : n.error ? i(r.$slots, "error", {
95
+ key: 1,
96
+ segment: o.segment,
97
+ error: n.error
98
+ }, () => [
99
+ l[1] || (l[1] = g("span", null, "生成失败", -1))
100
+ ], !0) : i(r.$slots, "empty", {
101
+ key: 2,
102
+ segment: o.segment
103
+ }, () => [
104
+ l[2] || (l[2] = g("span", null, "未生成缩略图", -1))
105
+ ], !0)
106
+ ]))
107
+ ], 64)) : i(r.$slots, "fallback", {
108
+ key: 2,
109
+ segment: o.segment
110
+ }, () => [
111
+ g("div", ce, [
112
+ g("span", null, M(o.segment.type), 1)
113
+ ])
114
+ ], !0),
115
+ i(r.$slots, "overlay", { segment: o.segment }, () => [
116
+ o.segment.extra?.label ? (u(), f("span", me, M(o.segment.extra?.label), 1)) : D("", !0)
117
+ ], !0)
118
+ ]));
119
+ }
120
+ }), ue = /* @__PURE__ */ N(de, [["__scopeId", "data-v-4ab97cd2"]]), ge = { class: "segment-base" }, fe = { class: "segment-base__content" }, pe = { class: "segment-base__pill segment-base__pill--primary" }, ke = { class: "segment-base__pill segment-base__pill--muted" }, ye = {
121
+ key: 0,
122
+ class: "segment-base__badge"
123
+ }, Te = /* @__PURE__ */ A({
124
+ name: "SegmentBase",
125
+ __name: "SegmentBase",
126
+ props: {
127
+ segment: {},
128
+ trackType: {},
129
+ accentColor: { default: "#222226" }
130
+ },
131
+ setup(o) {
132
+ const p = o, n = C(() => {
133
+ const c = p.segment?.extra?.label;
134
+ return typeof c == "string" ? c : null;
135
+ });
136
+ return (c, k) => (u(), f("div", ge, [
137
+ g("div", fe, [
138
+ g("span", pe, M(o.trackType), 1),
139
+ g("span", ke, M(o.segment.segmentType), 1)
140
+ ]),
141
+ n.value ? (u(), f("span", ye, M(n.value), 1)) : D("", !0)
142
+ ]));
143
+ }
144
+ }), I = /* @__PURE__ */ N(Te, [["__scopeId", "data-v-d386af72"]]), be = { class: "ve-editor-segment__preview" }, _ = "#222226", he = 0.4, Se = /* @__PURE__ */ A({
145
+ name: "VideoEditorTimeline",
146
+ __name: "index",
147
+ props: {
148
+ protocol: { default: null },
149
+ currentTime: {},
150
+ zoom: {},
151
+ snapStep: { default: 0 },
152
+ selectedSegmentId: { default: null },
153
+ trackTypes: { default: void 0 },
154
+ disableInteraction: { type: Boolean, default: !1 }
155
+ },
156
+ emits: ["update:currentTime", "update:zoom", "update:selectedSegmentId", "segmentClick", "segmentDragEnd", "segmentResizeEnd"],
157
+ setup(o, { emit: p }) {
158
+ const n = o, c = p, k = Z(n.selectedSegmentId ?? null);
159
+ J(() => n.selectedSegmentId, (e) => {
160
+ k.value = e ?? null;
161
+ });
162
+ const U = {
163
+ frames: _,
164
+ audio: "#0ea5e9",
165
+ text: "#16a34a",
166
+ sticker: "#f97316",
167
+ effect: "#a855f7",
168
+ filter: "#64748b"
169
+ }, R = C(() => n.protocol?.tracks?.length ? n.trackTypes?.length ? n.protocol.tracks.filter((e) => n.trackTypes?.includes(e.trackType)) : n.protocol.tracks : []), y = O(/* @__PURE__ */ new Map()), T = /* @__PURE__ */ new Map();
170
+ function r(e) {
171
+ if (!e || y.has(e) || T.has(e))
172
+ return;
173
+ const a = (async () => {
174
+ try {
175
+ const t = await re(e);
176
+ y.set(e, t.durationMs);
177
+ } catch {
178
+ }
179
+ })().finally(() => {
180
+ T.delete(e);
181
+ });
182
+ T.set(e, a);
183
+ }
184
+ const l = C(() => R.value.map((e, a) => {
185
+ const t = U[e.trackType] || _, s = b(t, he), B = e.trackType === "frames" && e.isMain === !0;
186
+ return {
187
+ id: e.trackId || `${e.trackType}-${a}`,
188
+ label: e.trackType,
189
+ type: e.trackType,
190
+ color: t,
191
+ isMain: B,
192
+ payload: e,
193
+ segments: e.children.map((d) => ({
194
+ ...j(d) ? { fromTime: d.fromTime ?? 0, sourceDurationMs: y.get(d.url) } : se(d) ? { fromTime: d.fromTime ?? 0 } : {},
195
+ id: d.id,
196
+ start: d.startTime,
197
+ end: d.endTime,
198
+ type: d.segmentType,
199
+ color: s,
200
+ payload: d
201
+ }))
202
+ };
203
+ }));
204
+ x(() => {
205
+ for (const e of R.value)
206
+ for (const a of e.children)
207
+ j(a) && r(a.url);
208
+ });
209
+ const m = C(() => {
210
+ if (!n.protocol?.tracks?.length)
211
+ return 0;
212
+ const e = n.protocol.tracks.flatMap((a) => a.children.map((t) => t.endTime));
213
+ return e.length ? Math.max(...e) : 0;
214
+ });
215
+ function b(e, a) {
216
+ const t = e.replace("#", "");
217
+ if (!(t.length === 3 || t.length === 6))
218
+ return e;
219
+ const s = t.length === 3 ? t.split("").map((P) => P + P).join("") : t, B = Number.parseInt(s.slice(0, 2), 16), d = Number.parseInt(s.slice(2, 4), 16), W = Number.parseInt(s.slice(4, 6), 16);
220
+ return `rgba(${B}, ${d}, ${W}, ${a})`;
221
+ }
222
+ function $(e) {
223
+ return e && typeof e == "object" && "segmentType" in e ? e : null;
224
+ }
225
+ function h(e) {
226
+ const a = e.payload;
227
+ if (a)
228
+ return a;
229
+ if (n.protocol)
230
+ return n.protocol.tracks.find((t) => t.trackId === e.id);
231
+ }
232
+ function z(e) {
233
+ k.value = e, c("update:selectedSegmentId", e);
234
+ }
235
+ function Y(e) {
236
+ const a = $(e.segment.payload), t = h(e.track);
237
+ a && (z(a.id), t && c("segmentClick", { segment: a, track: t }));
238
+ }
239
+ function q(e) {
240
+ z(e.segment.id);
241
+ }
242
+ function G(e) {
243
+ c("segmentDragEnd", e);
244
+ }
245
+ function K(e) {
246
+ z(e.segment.id);
247
+ }
248
+ function Q(e) {
249
+ c("segmentResizeEnd", e);
250
+ }
251
+ return (e, a) => (u(), ee(oe, {
252
+ tracks: l.value,
253
+ duration: m.value,
254
+ "current-time": o.currentTime,
255
+ zoom: o.zoom,
256
+ fps: o.protocol?.fps || 30,
257
+ "snap-step": o.snapStep,
258
+ "selected-segment-id": k.value ?? null,
259
+ "disable-interaction": o.disableInteraction,
260
+ "onUpdate:currentTime": a[0] || (a[0] = (t) => c("update:currentTime", t)),
261
+ "onUpdate:zoom": a[1] || (a[1] = (t) => c("update:zoom", t)),
262
+ onSegmentClick: Y,
263
+ onSegmentDragStart: q,
264
+ onSegmentDragEnd: G,
265
+ onSegmentResizeStart: K,
266
+ onSegmentResizeEnd: Q,
267
+ onBackgroundClick: a[2] || (a[2] = (t) => z(null))
268
+ }, te({
269
+ segment: E(({ layout: t }) => [
270
+ (u(!0), f(V, null, H([$(t.segment.payload)], (s) => (u(), f(V, {
271
+ key: s?.id || t.segment.id
272
+ }, [
273
+ s ? (u(), f("div", {
274
+ key: 0,
275
+ class: "ve-editor-segment",
276
+ style: w({ "--ve-segment-accent": t.track.color || _ })
277
+ }, [
278
+ g("div", be, [
279
+ s.segmentType === "frames" ? i(e.$slots, "segment-frames", {
280
+ key: 0,
281
+ segment: s,
282
+ layout: t
283
+ }, () => [
284
+ S(v(ue), { segment: s }, null, 8, ["segment"])
285
+ ], !0) : s.segmentType === "text" ? i(e.$slots, "segment-text", {
286
+ key: 1,
287
+ segment: s,
288
+ layout: t
289
+ }, () => [
290
+ S(v(I), {
291
+ segment: s,
292
+ "track-type": t.track.type || "unknown",
293
+ "accent-color": t.track.color
294
+ }, null, 8, ["segment", "track-type", "accent-color"])
295
+ ], !0) : s.segmentType === "sticker" ? i(e.$slots, "segment-sticker", {
296
+ key: 2,
297
+ segment: s,
298
+ layout: t
299
+ }, () => [
300
+ S(v(I), {
301
+ segment: s,
302
+ "track-type": t.track.type || "unknown",
303
+ "accent-color": t.track.color
304
+ }, null, 8, ["segment", "track-type", "accent-color"])
305
+ ], !0) : s.segmentType === "audio" ? i(e.$slots, "segment-audio", {
306
+ key: 3,
307
+ segment: s,
308
+ layout: t
309
+ }, () => [
310
+ S(v(I), {
311
+ segment: s,
312
+ "track-type": t.track.type || "unknown",
313
+ "accent-color": t.track.color
314
+ }, null, 8, ["segment", "track-type", "accent-color"])
315
+ ], !0) : s.segmentType === "effect" ? i(e.$slots, "segment-effect", {
316
+ key: 4,
317
+ segment: s,
318
+ layout: t
319
+ }, () => [
320
+ S(v(I), {
321
+ segment: s,
322
+ "track-type": t.track.type || "unknown",
323
+ "accent-color": t.track.color
324
+ }, null, 8, ["segment", "track-type", "accent-color"])
325
+ ], !0) : s.segmentType === "filter" ? i(e.$slots, "segment-filter", {
326
+ key: 5,
327
+ segment: s,
328
+ layout: t
329
+ }, () => [
330
+ S(v(I), {
331
+ segment: s,
332
+ "track-type": t.track.type || "unknown",
333
+ "accent-color": t.track.color
334
+ }, null, 8, ["segment", "track-type", "accent-color"])
335
+ ], !0) : D("", !0)
336
+ ])
337
+ ], 4)) : D("", !0)
338
+ ], 64))), 128))
339
+ ]),
340
+ _: 2
341
+ }, [
342
+ e.$slots.toolbar ? {
343
+ name: "toolbar",
344
+ fn: E((t) => [
345
+ i(e.$slots, "toolbar", F(L(t)), void 0, !0)
346
+ ]),
347
+ key: "0"
348
+ } : void 0,
349
+ e.$slots.ruler ? {
350
+ name: "ruler",
351
+ fn: E((t) => [
352
+ i(e.$slots, "ruler", F(L(t)), void 0, !0)
353
+ ]),
354
+ key: "1"
355
+ } : void 0,
356
+ e.$slots.playhead ? {
357
+ name: "playhead",
358
+ fn: E((t) => [
359
+ i(e.$slots, "playhead", F(L(t)), void 0, !0)
360
+ ]),
361
+ key: "2"
362
+ } : void 0
363
+ ]), 1032, ["tracks", "duration", "current-time", "zoom", "fps", "snap-step", "selected-segment-id", "disable-interaction"]));
364
+ }
365
+ }), Re = /* @__PURE__ */ N(Se, [["__scopeId", "data-v-faa94921"]]);
366
+ export {
367
+ ue as F,
368
+ I as S,
369
+ Re as V
370
+ };
package/dist/index.d.ts CHANGED
@@ -3,8 +3,13 @@ import { ComponentOptionsMixin } from 'vue';
3
3
  import { ComponentProvideOptions } from 'vue';
4
4
  import { DefineComponent } from 'vue';
5
5
  import { I3DFramesSegment } from '@video-editor/shared';
6
+ import { IAudioSegment } from '@video-editor/shared';
7
+ import { IEffectSegment } from '@video-editor/shared';
8
+ import { IFilterSegment } from '@video-editor/shared';
6
9
  import { IFramesSegmentUnion } from '@video-editor/shared';
7
10
  import { IImageFramesSegment } from '@video-editor/shared';
11
+ import { IStickerSegment } from '@video-editor/shared';
12
+ import { ITextSegment } from '@video-editor/shared';
8
13
  import { ITrackType } from '@video-editor/shared';
9
14
  import { IVideoFramesSegment } from '@video-editor/shared';
10
15
  import { IVideoProtocol } from '@video-editor/shared';
@@ -123,19 +128,7 @@ declare type __VLS_Props_4 = {
123
128
 
124
129
  declare function __VLS_template(): {
125
130
  attrs: Partial<{}>;
126
- slots: Partial<Record<NonNullable<"segment-filter" | "segment-audio" | "segment-text" | "segment-frames" | "segment-sticker" | "segment-effect">, (_: {
127
- segment: SegmentUnion;
128
- layout: {
129
- left: number;
130
- top: number;
131
- segment: TimelineSegment_2;
132
- track: TimelineTrack;
133
- trackIndex: number;
134
- segmentIndex: number;
135
- width: number;
136
- isSelected: boolean;
137
- };
138
- }) => any>> & {
131
+ slots: {
139
132
  toolbar?(_: {
140
133
  zoom: number;
141
134
  canZoomIn: boolean;
@@ -154,6 +147,84 @@ declare function __VLS_template(): {
154
147
  left: number;
155
148
  currentTime: number;
156
149
  }): any;
150
+ 'segment-frames'?(_: {
151
+ segment: IFramesSegmentUnion;
152
+ layout: {
153
+ left: number;
154
+ top: number;
155
+ segment: TimelineSegment_2;
156
+ track: TimelineTrack;
157
+ trackIndex: number;
158
+ segmentIndex: number;
159
+ width: number;
160
+ isSelected: boolean;
161
+ };
162
+ }): any;
163
+ 'segment-text'?(_: {
164
+ segment: ITextSegment;
165
+ layout: {
166
+ left: number;
167
+ top: number;
168
+ segment: TimelineSegment_2;
169
+ track: TimelineTrack;
170
+ trackIndex: number;
171
+ segmentIndex: number;
172
+ width: number;
173
+ isSelected: boolean;
174
+ };
175
+ }): any;
176
+ 'segment-sticker'?(_: {
177
+ segment: IStickerSegment;
178
+ layout: {
179
+ left: number;
180
+ top: number;
181
+ segment: TimelineSegment_2;
182
+ track: TimelineTrack;
183
+ trackIndex: number;
184
+ segmentIndex: number;
185
+ width: number;
186
+ isSelected: boolean;
187
+ };
188
+ }): any;
189
+ 'segment-audio'?(_: {
190
+ segment: IAudioSegment;
191
+ layout: {
192
+ left: number;
193
+ top: number;
194
+ segment: TimelineSegment_2;
195
+ track: TimelineTrack;
196
+ trackIndex: number;
197
+ segmentIndex: number;
198
+ width: number;
199
+ isSelected: boolean;
200
+ };
201
+ }): any;
202
+ 'segment-effect'?(_: {
203
+ segment: IEffectSegment;
204
+ layout: {
205
+ left: number;
206
+ top: number;
207
+ segment: TimelineSegment_2;
208
+ track: TimelineTrack;
209
+ trackIndex: number;
210
+ segmentIndex: number;
211
+ width: number;
212
+ isSelected: boolean;
213
+ };
214
+ }): any;
215
+ 'segment-filter'?(_: {
216
+ segment: IFilterSegment;
217
+ layout: {
218
+ left: number;
219
+ top: number;
220
+ segment: TimelineSegment_2;
221
+ track: TimelineTrack;
222
+ trackIndex: number;
223
+ segmentIndex: number;
224
+ width: number;
225
+ isSelected: boolean;
226
+ };
227
+ }): any;
157
228
  };
158
229
  refs: {};
159
230
  rootEl: HTMLDivElement;
@@ -343,6 +414,8 @@ export declare interface TimelineSegment {
343
414
  end: number;
344
415
  type?: string;
345
416
  color?: string;
417
+ fromTime?: number;
418
+ sourceDurationMs?: number;
346
419
  payload?: unknown;
347
420
  }
348
421
 
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import { V as i } from "./index-BgON6Mut.js";
2
- import { F as s, S as d } from "./index-BgON6Mut.js";
3
- import { V as o } from "./index-t1DKjcCO.js";
1
+ import { V as i } from "./index-D22E5BT6.js";
2
+ import { F as s, S as d } from "./index-D22E5BT6.js";
3
+ import { V as o } from "./index-Czb5PTVP.js";
4
4
  const t = {
5
5
  install(e) {
6
6
  e.component(o.name || "VeVideoTimeline", o), e.component(i.name || "VeVideoEditorTimeline", i);
package/dist/ui.css CHANGED
@@ -1 +1 @@
1
- :where(.ve-playhead[data-v-601eb0b9]){--ve-playhead-nudge: 0px;--at-apply: absolute z-20 pointer-events-auto cursor-ew-resize h-full;transform:translate(calc(-50% - var(--ve-playhead-nudge)))}:where(.ve-playhead__icon[data-v-601eb0b9]){--at-apply: text-[#222226] pointer-events-none relative z-2}:where(.ve-playhead__line[data-v-601eb0b9]){--at-apply: bg-[#222226] h-full w-px translate-x--50% left-50% top-2px absolute pointer-events-none}:where(.ve-ruler[data-v-30f91636]){--ve-ruler-major: 8px;--ve-ruler-minor: 4px;--at-apply: sticky top-0 left-0 right-0 bg-white z-3 border-b border-[#e5e7eb] overflow-hidden}:where(.ve-ruler .ve-ruler__ticks[data-v-30f91636]){--at-apply: relative h-full w-full box-border}:where(.ve-ruler .ve-ruler__tick[data-v-30f91636]){--at-apply: absolute top-0 h-full text-center text-[#6b7280] text-[11px]}:where(.ve-ruler .ve-ruler__line[data-v-30f91636]){--at-apply: h-[var(--ve-ruler-minor)] w-px mx-auto bg-[#cbd5e1]}:where(.ve-ruler .ve-ruler__tick--major .ve-ruler__line[data-v-30f91636]){--at-apply: relative h-[var(--ve-ruler-major)] bg-[#94a3b8]}:where(.ve-ruler .ve-ruler__label[data-v-30f91636]){--at-apply: absolute font-mono text-right whitespace-nowrap left-4px bottom-0;transform:translateY(-50%)}:where(.ve-toolbar[data-v-85ddeb0f]){--at-apply: flex items-center justify-between gap-2 px-3 py-2.5 border-b border-[#eceff3]}:where(.ve-toolbar .ve-toolbar__group[data-v-85ddeb0f]){--at-apply: inline-flex items-center gap-2}:where(.ve-toolbar .ve-zoom[data-v-85ddeb0f]){--at-apply: min-w-14 text-center text-xs text-[#222226] px-2 py-1 border border-[#e5e7eb] rounded-lg bg-white}:where(.ve-toolbar .ve-btn[data-v-85ddeb0f]){--at-apply: border border-[#d1d5db] bg-white text-[#222226] rounded-lg h-7 w-7 cursor-pointer transition-all duration-150}:where(.ve-toolbar .ve-btn[data-v-85ddeb0f]:disabled){--at-apply: cursor-not-allowed opacity-45}:where(.ve-toolbar .ve-btn[data-v-85ddeb0f]:not(:disabled):hover){--at-apply: border-[#222226] text-[#222226]}:where(.ve-toolbar .ve-toolbar__time[data-v-85ddeb0f]){--at-apply: inline-flex items-center gap-1.5 text-xs font-mono text-[#222226] ml-auto}:where(.ve-toolbar .ve-toolbar__time-divider[data-v-85ddeb0f]){--at-apply: text-[#9ca3af]}:where(.ve-timeline[data-v-547cac41]){--ve-primary: #222226;--at-apply: flex flex-col w-full max-w-full min-w-0 rounded-10px h-full}:where(.ve-timeline .ve-timeline__viewport[data-v-547cac41]){--at-apply: relative overflow-auto w-full flex-1 bg-white}:where(.ve-timeline .ve-timeline__content[data-v-547cac41]){--at-apply: min-h-full min-w-full}:where(.ve-timeline .ve-timeline__tracks[data-v-547cac41]){--at-apply: relative z-1 pb-3 flex flex-col gap-2px flex-1}:where(.ve-timeline .ve-track[data-v-547cac41]){--at-apply: relative bg-[#f8fafc] overflow-hidden}:where(.ve-timeline .ve-track--main[data-v-547cac41]){background-color:#f4f4f6}:where(.ve-timeline .ve-track__body[data-v-547cac41]){--at-apply: relative h-full}:where(.ve-timeline .ve-segment[data-v-547cac41]){--at-apply: absolute top-0 bottom-0 rounded-[4px] text-[#0f172a] cursor-pointer flex items-center overflow-hidden duration-150}:where(.ve-timeline .ve-segment--dragging[data-v-547cac41]){--at-apply: absolute z-50 rounded-[4px] text-[#0f172a] cursor-pointer flex items-center overflow-hidden pointer-events-none;box-shadow:0 4px 16px #0000004d,inset 0 0 0 2px #ffffff80}:where(.ve-timeline .ve-segment--preview[data-v-547cac41]){--at-apply: absolute z-45 rounded-[4px] pointer-events-none;opacity:.7;box-shadow:0 2px 8px #0003,inset 0 0 0 2px #fff6}:where(.ve-timeline .ve-segment__content[data-v-547cac41]){--at-apply: flex flex-col gap-1}:where(.ve-timeline .ve-segment__title[data-v-547cac41]){--at-apply: text-[12px] font-bold capitalize}:where(.ve-timeline .ve-segment__time[data-v-547cac41]){--at-apply: text-[11px] text-[rgba(15,23,42,.8)] font-mono}:where(.ve-timeline .ve-segment__selection[data-v-547cac41]){--at-apply: absolute bottom-0 left-0 right-0 top-0 pointer-events-none z-10}:where(.ve-timeline .ve-segment__handle[data-v-547cac41]){--at-apply: absolute h-full w-1 bg-[var(--ve-primary)] cursor-ew-resize pointer-events-auto;border:2px solid var(--ve-primary)}:where(.ve-timeline .ve-segment__handle--left[data-v-547cac41]){--at-apply: left-0 top-0 rounded-l-1}:where(.ve-timeline .ve-segment__handle--right[data-v-547cac41]){--at-apply: right-0 top-0 rounded-r-1}:where(.ve-timeline .ve-segment__handle-dots[data-v-547cac41]){--at-apply: absolute left-0 top-50% translate-y--50% flex flex-col items-center gap-0.5;justify-content:center}:where(.ve-timeline .ve-segment__handle-dot[data-v-547cac41]){--at-apply: rounded-full bg-white;width:1px;height:1px}:where(.ve-timeline .ve-segment--placeholder[data-v-547cac41]){--at-apply: absolute pointer-events-none rounded-[4px] z-24;background:#2222261f;border:2px solid rgba(34,34,38,.6)}:where(.ve-timeline .ve-segment--placeholder-inner[data-v-547cac41]){--at-apply: absolute inset-0 rounded-[2px];opacity:.2}:where(.ve-timeline .ve-snap-guide[data-v-547cac41]){--at-apply: absolute pointer-events-none z-20;width:2px;background:var(--ve-primary);opacity:.7}:where(.ve-timeline .ve-new-track-line[data-v-547cac41]){--at-apply: absolute pointer-events-none z-25;height:2px;background:var(--ve-primary);opacity:.8}:where(.frames-segment[data-v-4ab97cd2]){--at-apply: relative flex items-stretch w-full h-full overflow-hidden rounded-4px}:where(.frames-segment .frames-segment__image[data-v-4ab97cd2]){--at-apply: w-full h-full rounded-4px;background-color:color-mix(in srgb,var(--ve-segment-accent, #222226) 15%,transparent)}:where(.frames-segment .frames-segment__video[data-v-4ab97cd2]){--at-apply: flex items-center w-full h-full overflow-hidden;background:#f1f5f9}:where(.frames-segment .frames-segment__thumb[data-v-4ab97cd2]){--at-apply: flex-1 min-w-14;aspect-ratio:1 / 1;background-size:cover;background-position:center}:where(.frames-segment .frames-segment__placeholder[data-v-4ab97cd2]){--at-apply: flex items-center justify-center w-full h-full text-[12px] rounded-4px whitespace-nowrap;color:#0f172abf;background:#0000000d}:where(.frames-segment .frames-segment__badge[data-v-4ab97cd2]){--at-apply: absolute top-1.5 left-2 px-1.5 py-0.5 text-[11px] rounded-4px pointer-events-none;background:#00000040;color:#fff;transform-origin:left top;transform:scale(.9)}:where(.segment-base[data-v-d386af72]){--at-apply: relative flex items-center w-full h-full p-1.5 rounded-4px;background:#ffffff52;box-shadow:inset 0 0 0 1px #fff3}:where(.segment-base .segment-base__content[data-v-d386af72]){--at-apply: flex items-center justify-start gap-1.5 w-full}:where(.segment-base .segment-base__pill[data-v-d386af72]){--at-apply: inline-flex items-center gap-1.5 px-2.5 py-1.5 rounded-full text-[11px] font-semibold whitespace-nowrap;box-shadow:inset 0 0 0 1px #ffffff4d}:where(.segment-base .segment-base__pill--primary[data-v-d386af72]){color:var(--ve-segment-accent, #222226);background:#22222614}:where(.segment-base .segment-base__pill--muted[data-v-d386af72]){color:#0f172ab3;background:#2222260d}:where(.segment-base .segment-base__badge[data-v-d386af72]){--at-apply: absolute top-1.5 left-2 px-1.5 py-0.5 text-[11px] rounded-4px pointer-events-none;background:#00000040;color:#fff;transform-origin:left top;transform:scale(.9)}:where(.ve-editor-segment[data-v-8004be28]){--at-apply: relative flex flex-col gap-1.5 w-full h-full text-[#0f172a]}:where(.ve-editor-segment .ve-editor-segment__preview[data-v-8004be28]){--at-apply: flex items-stretch w-full min-h-14}
1
+ :where(.ve-playhead[data-v-601eb0b9]){--ve-playhead-nudge: 0px;--at-apply: absolute z-20 pointer-events-auto cursor-ew-resize h-full;transform:translate(calc(-50% - var(--ve-playhead-nudge)))}:where(.ve-playhead__icon[data-v-601eb0b9]){--at-apply: text-[#222226] pointer-events-none relative z-2}:where(.ve-playhead__line[data-v-601eb0b9]){--at-apply: bg-[#222226] h-full w-px translate-x--50% left-50% top-2px absolute pointer-events-none}:where(.ve-ruler[data-v-30f91636]){--ve-ruler-major: 8px;--ve-ruler-minor: 4px;--at-apply: sticky top-0 left-0 right-0 bg-white z-3 border-b border-[#e5e7eb] overflow-hidden}:where(.ve-ruler .ve-ruler__ticks[data-v-30f91636]){--at-apply: relative h-full w-full box-border}:where(.ve-ruler .ve-ruler__tick[data-v-30f91636]){--at-apply: absolute top-0 h-full text-center text-[#6b7280] text-[11px]}:where(.ve-ruler .ve-ruler__line[data-v-30f91636]){--at-apply: h-[var(--ve-ruler-minor)] w-px mx-auto bg-[#cbd5e1]}:where(.ve-ruler .ve-ruler__tick--major .ve-ruler__line[data-v-30f91636]){--at-apply: relative h-[var(--ve-ruler-major)] bg-[#94a3b8]}:where(.ve-ruler .ve-ruler__label[data-v-30f91636]){--at-apply: absolute font-mono text-right whitespace-nowrap left-4px bottom-0;transform:translateY(-50%)}:where(.ve-toolbar[data-v-85ddeb0f]){--at-apply: flex items-center justify-between gap-2 px-3 py-2.5 border-b border-[#eceff3]}:where(.ve-toolbar .ve-toolbar__group[data-v-85ddeb0f]){--at-apply: inline-flex items-center gap-2}:where(.ve-toolbar .ve-zoom[data-v-85ddeb0f]){--at-apply: min-w-14 text-center text-xs text-[#222226] px-2 py-1 border border-[#e5e7eb] rounded-lg bg-white}:where(.ve-toolbar .ve-btn[data-v-85ddeb0f]){--at-apply: border border-[#d1d5db] bg-white text-[#222226] rounded-lg h-7 w-7 cursor-pointer transition-all duration-150}:where(.ve-toolbar .ve-btn[data-v-85ddeb0f]:disabled){--at-apply: cursor-not-allowed opacity-45}:where(.ve-toolbar .ve-btn[data-v-85ddeb0f]:not(:disabled):hover){--at-apply: border-[#222226] text-[#222226]}:where(.ve-toolbar .ve-toolbar__time[data-v-85ddeb0f]){--at-apply: inline-flex items-center gap-1.5 text-xs font-mono text-[#222226] ml-auto}:where(.ve-toolbar .ve-toolbar__time-divider[data-v-85ddeb0f]){--at-apply: text-[#9ca3af]}:where(.ve-timeline[data-v-70b46d01]){--ve-primary: #222226;--at-apply: flex flex-col w-full max-w-full min-w-0 rounded-10px h-full}:where(.ve-timeline .ve-timeline__viewport[data-v-70b46d01]){--at-apply: relative overflow-auto w-full flex-1 bg-white}:where(.ve-timeline .ve-timeline__content[data-v-70b46d01]){--at-apply: min-h-full min-w-full}:where(.ve-timeline .ve-timeline__tracks[data-v-70b46d01]){--at-apply: relative z-1 pb-3 flex flex-col gap-2px flex-1}:where(.ve-timeline .ve-track[data-v-70b46d01]){--at-apply: relative bg-[#f8fafc] overflow-hidden}:where(.ve-timeline .ve-track--main[data-v-70b46d01]){background-color:#f4f4f6}:where(.ve-timeline .ve-track__body[data-v-70b46d01]){--at-apply: relative h-full}:where(.ve-timeline .ve-segment[data-v-70b46d01]){--at-apply: absolute top-0 bottom-0 rounded-[4px] text-[#0f172a] cursor-pointer flex items-center overflow-hidden duration-150}:where(.ve-timeline .ve-segment--dragging[data-v-70b46d01]){--at-apply: absolute z-50 rounded-[4px] text-[#0f172a] cursor-pointer flex items-center overflow-hidden pointer-events-none;box-shadow:0 4px 16px #0000004d,inset 0 0 0 2px #ffffff80}:where(.ve-timeline .ve-segment--preview[data-v-70b46d01]){--at-apply: absolute z-45 rounded-[4px] pointer-events-none;opacity:.7;box-shadow:0 2px 8px #0003,inset 0 0 0 2px #fff6}:where(.ve-timeline .ve-segment__content[data-v-70b46d01]){--at-apply: flex flex-col gap-1}:where(.ve-timeline .ve-segment__title[data-v-70b46d01]){--at-apply: text-[12px] font-bold capitalize}:where(.ve-timeline .ve-segment__time[data-v-70b46d01]){--at-apply: text-[11px] text-[rgba(15,23,42,.8)] font-mono}:where(.ve-timeline .ve-segment__selection[data-v-70b46d01]){--at-apply: absolute bottom-0 left-0 right-0 top-0 pointer-events-none z-10}:where(.ve-timeline .ve-segment__handle[data-v-70b46d01]){--at-apply: absolute h-full w-1 bg-[var(--ve-primary)] cursor-ew-resize pointer-events-auto;border:2px solid var(--ve-primary)}:where(.ve-timeline .ve-segment__handle--left[data-v-70b46d01]){--at-apply: left-0 top-0 rounded-l-1}:where(.ve-timeline .ve-segment__handle--right[data-v-70b46d01]){--at-apply: right-0 top-0 rounded-r-1}:where(.ve-timeline .ve-segment__handle-dots[data-v-70b46d01]){--at-apply: absolute left-0 top-50% translate-y--50% flex flex-col items-center gap-0.5;justify-content:center}:where(.ve-timeline .ve-segment__handle-dot[data-v-70b46d01]){--at-apply: rounded-full bg-white;width:1px;height:1px}:where(.ve-timeline .ve-segment--placeholder[data-v-70b46d01]){--at-apply: absolute pointer-events-none rounded-[4px] z-24;background:#2222261f;border:2px solid rgba(34,34,38,.6)}:where(.ve-timeline .ve-segment--placeholder-inner[data-v-70b46d01]){--at-apply: absolute inset-0 rounded-[2px];opacity:.2}:where(.ve-timeline .ve-snap-guide[data-v-70b46d01]){--at-apply: absolute pointer-events-none z-20;width:2px;background:var(--ve-primary);opacity:.7}:where(.ve-timeline .ve-new-track-line[data-v-70b46d01]){--at-apply: absolute pointer-events-none z-25;height:2px;background:var(--ve-primary);opacity:.8}:where(.frames-segment[data-v-4ab97cd2]){--at-apply: relative flex items-stretch w-full h-full overflow-hidden rounded-4px}:where(.frames-segment .frames-segment__image[data-v-4ab97cd2]){--at-apply: w-full h-full rounded-4px;background-color:color-mix(in srgb,var(--ve-segment-accent, #222226) 15%,transparent)}:where(.frames-segment .frames-segment__video[data-v-4ab97cd2]){--at-apply: flex items-center w-full h-full overflow-hidden;background:#f1f5f9}:where(.frames-segment .frames-segment__thumb[data-v-4ab97cd2]){--at-apply: flex-1 min-w-14;aspect-ratio:1 / 1;background-size:cover;background-position:center}:where(.frames-segment .frames-segment__placeholder[data-v-4ab97cd2]){--at-apply: flex items-center justify-center w-full h-full text-[12px] rounded-4px whitespace-nowrap;color:#0f172abf;background:#0000000d}:where(.frames-segment .frames-segment__badge[data-v-4ab97cd2]){--at-apply: absolute top-1.5 left-2 px-1.5 py-0.5 text-[11px] rounded-4px pointer-events-none;background:#00000040;color:#fff;transform-origin:left top;transform:scale(.9)}:where(.segment-base[data-v-d386af72]){--at-apply: relative flex items-center w-full h-full p-1.5 rounded-4px;background:#ffffff52;box-shadow:inset 0 0 0 1px #fff3}:where(.segment-base .segment-base__content[data-v-d386af72]){--at-apply: flex items-center justify-start gap-1.5 w-full}:where(.segment-base .segment-base__pill[data-v-d386af72]){--at-apply: inline-flex items-center gap-1.5 px-2.5 py-1.5 rounded-full text-[11px] font-semibold whitespace-nowrap;box-shadow:inset 0 0 0 1px #ffffff4d}:where(.segment-base .segment-base__pill--primary[data-v-d386af72]){color:var(--ve-segment-accent, #222226);background:#22222614}:where(.segment-base .segment-base__pill--muted[data-v-d386af72]){color:#0f172ab3;background:#2222260d}:where(.segment-base .segment-base__badge[data-v-d386af72]){--at-apply: absolute top-1.5 left-2 px-1.5 py-0.5 text-[11px] rounded-4px pointer-events-none;background:#00000040;color:#fff;transform-origin:left top;transform:scale(.9)}:where(.ve-editor-segment[data-v-faa94921]){--at-apply: relative flex flex-col gap-1.5 w-full h-full text-[#0f172a]}:where(.ve-editor-segment .ve-editor-segment__preview[data-v-faa94921]){--at-apply: flex items-stretch w-full min-h-14}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@video-editor/ui",
3
3
  "type": "module",
4
- "version": "0.0.1-beta.13",
4
+ "version": "0.0.1-beta.15",
5
5
  "exports": {
6
6
  ".": {
7
7
  "types": "./dist/index.d.ts",
@@ -20,8 +20,8 @@
20
20
  "vue": "^3.5.25"
21
21
  },
22
22
  "dependencies": {
23
- "@video-editor/protocol": "0.0.1-beta.13",
24
- "@video-editor/shared": "0.0.1-beta.13"
23
+ "@video-editor/protocol": "0.0.1-beta.15",
24
+ "@video-editor/shared": "0.0.1-beta.15"
25
25
  },
26
26
  "scripts": {
27
27
  "build": "vite build",