@twick/video-editor 0.14.6 → 0.14.7
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 +147 -3
- package/dist/components/controls/control-manager.d.ts +4 -1
- package/dist/components/controls/player-controls.d.ts +3 -0
- package/dist/components/controls/seek-control.d.ts +4 -1
- package/dist/components/timeline/timeline-manager.d.ts +6 -1
- package/dist/components/timeline/timeline-view.d.ts +3 -1
- package/dist/components/track/seek-track.d.ts +3 -1
- package/dist/components/track/track-base.d.ts +3 -1
- package/dist/components/track/track-element.d.ts +2 -0
- package/dist/components/video-editor.d.ts +65 -1
- package/dist/helpers/constants.d.ts +50 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.js +270 -78
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +271 -79
- package/dist/index.mjs.map +1 -1
- package/dist/video-editor.css +15 -0
- package/package.json +6 -6
package/dist/index.mjs
CHANGED
|
@@ -4,7 +4,7 @@ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "sy
|
|
|
4
4
|
import { jsxs, jsx } from "react/jsx-runtime";
|
|
5
5
|
import { useLivePlayerContext, PLAYER_STATE, LivePlayer } from "@twick/live-player";
|
|
6
6
|
import { useTimelineContext, TIMELINE_ACTION, getCurrentElements, ElementDeserializer, Track, getDecimalNumber, VideoElement, AudioElement, TrackElement } from "@twick/timeline";
|
|
7
|
-
import React, { useState, useRef, useEffect,
|
|
7
|
+
import React, { useState, useRef, useEffect, useMemo, forwardRef, createElement, createContext, useContext, useId, useCallback, useLayoutEffect, useInsertionEffect, Fragment, Component } from "react";
|
|
8
8
|
function t(t2, e3, s2) {
|
|
9
9
|
return (e3 = function(t3) {
|
|
10
10
|
var e4 = function(t4, e5) {
|
|
@@ -9353,11 +9353,10 @@ function SeekTrack({
|
|
|
9353
9353
|
duration,
|
|
9354
9354
|
zoom = 1,
|
|
9355
9355
|
onSeek,
|
|
9356
|
-
timelineCount = 0
|
|
9356
|
+
timelineCount = 0,
|
|
9357
|
+
timelineTickConfigs
|
|
9357
9358
|
}) {
|
|
9358
|
-
const canvasRef = useRef(null);
|
|
9359
9359
|
const containerRef = useRef(null);
|
|
9360
|
-
const [containerWidth, setContainerWidth] = useState(0);
|
|
9361
9360
|
const [isDragging2, setIsDragging] = useState(false);
|
|
9362
9361
|
const [seekPosition, setSeekPosition] = useState(0);
|
|
9363
9362
|
const pixelsPerSecond = 100 * zoom;
|
|
@@ -9368,61 +9367,62 @@ function SeekTrack({
|
|
|
9368
9367
|
setSeekPosition(currentTime * pixelsPerSecond);
|
|
9369
9368
|
}
|
|
9370
9369
|
}, [currentTime, pixelsPerSecond, isDragging2]);
|
|
9371
|
-
const
|
|
9372
|
-
|
|
9373
|
-
|
|
9374
|
-
|
|
9375
|
-
|
|
9376
|
-
|
|
9377
|
-
|
|
9378
|
-
|
|
9379
|
-
|
|
9380
|
-
canvas.style.width = `${displayWidth}px`;
|
|
9381
|
-
canvas.style.height = "32px";
|
|
9382
|
-
ctx.scale(dpr, dpr);
|
|
9383
|
-
ctx.fillStyle = "#0f0f0f";
|
|
9384
|
-
ctx.fillRect(0, 0, displayWidth, 32);
|
|
9385
|
-
for (let i2 = 0; i2 <= Math.ceil(duration * 10); i2++) {
|
|
9386
|
-
const time2 = i2 * 0.1;
|
|
9387
|
-
const x2 = Math.floor(time2 * pixelsPerSecond) + 0.5;
|
|
9388
|
-
const isSecond = i2 % 10 === 0;
|
|
9389
|
-
ctx.beginPath();
|
|
9390
|
-
ctx.moveTo(x2, 0);
|
|
9391
|
-
ctx.lineTo(x2, isSecond ? 24 : 12);
|
|
9392
|
-
ctx.strokeStyle = isSecond ? "rgba(255, 255, 255, 0.7)" : "rgba(255, 255, 255, 0.3)";
|
|
9393
|
-
ctx.lineWidth = 1;
|
|
9394
|
-
ctx.stroke();
|
|
9395
|
-
if (isSecond) {
|
|
9396
|
-
ctx.font = "bold 10px system-ui, sans-serif";
|
|
9397
|
-
ctx.fillStyle = "rgba(255, 255, 255, 0.7)";
|
|
9398
|
-
ctx.textAlign = "center";
|
|
9399
|
-
ctx.textBaseline = "bottom";
|
|
9400
|
-
if (time2 === 0) ;
|
|
9401
|
-
else {
|
|
9402
|
-
ctx.fillText(`${Math.floor(time2)}s`, x2, 32);
|
|
9370
|
+
const { majorIntervalSec, minorIntervalSec } = useMemo(() => {
|
|
9371
|
+
if (timelineTickConfigs && timelineTickConfigs.length > 0) {
|
|
9372
|
+
const sortedConfigs = [...timelineTickConfigs].sort((a2, b2) => a2.durationThreshold - b2.durationThreshold);
|
|
9373
|
+
for (const config of sortedConfigs) {
|
|
9374
|
+
if (duration < config.durationThreshold) {
|
|
9375
|
+
return {
|
|
9376
|
+
majorIntervalSec: config.majorInterval,
|
|
9377
|
+
minorIntervalSec: config.minorTicks > 0 ? config.majorInterval / (config.minorTicks + 1) : config.majorInterval
|
|
9378
|
+
};
|
|
9403
9379
|
}
|
|
9404
9380
|
}
|
|
9381
|
+
const lastConfig = sortedConfigs[sortedConfigs.length - 1];
|
|
9382
|
+
return {
|
|
9383
|
+
majorIntervalSec: lastConfig.majorInterval,
|
|
9384
|
+
minorIntervalSec: lastConfig.minorTicks > 0 ? lastConfig.majorInterval / (lastConfig.minorTicks + 1) : lastConfig.majorInterval
|
|
9385
|
+
};
|
|
9405
9386
|
}
|
|
9406
|
-
|
|
9407
|
-
|
|
9408
|
-
if (
|
|
9409
|
-
|
|
9387
|
+
let major = 1;
|
|
9388
|
+
let minors = 5;
|
|
9389
|
+
if (duration < 10) {
|
|
9390
|
+
major = 1;
|
|
9391
|
+
minors = 10;
|
|
9392
|
+
} else if (duration < 30) {
|
|
9393
|
+
major = 5;
|
|
9394
|
+
minors = 5;
|
|
9395
|
+
} else if (duration < 120) {
|
|
9396
|
+
major = 10;
|
|
9397
|
+
minors = 5;
|
|
9398
|
+
} else if (duration < 300) {
|
|
9399
|
+
major = 30;
|
|
9400
|
+
minors = 6;
|
|
9401
|
+
} else if (duration < 900) {
|
|
9402
|
+
major = 60;
|
|
9403
|
+
minors = 6;
|
|
9404
|
+
} else if (duration < 1800) {
|
|
9405
|
+
major = 120;
|
|
9406
|
+
minors = 4;
|
|
9407
|
+
} else if (duration < 3600) {
|
|
9408
|
+
major = 300;
|
|
9409
|
+
minors = 5;
|
|
9410
|
+
} else if (duration < 7200) {
|
|
9411
|
+
major = 600;
|
|
9412
|
+
minors = 10;
|
|
9413
|
+
} else {
|
|
9414
|
+
major = 1800;
|
|
9415
|
+
minors = 6;
|
|
9410
9416
|
}
|
|
9411
|
-
|
|
9412
|
-
|
|
9413
|
-
|
|
9414
|
-
}
|
|
9417
|
+
return {
|
|
9418
|
+
majorIntervalSec: major,
|
|
9419
|
+
minorIntervalSec: minors > 0 ? major / (minors + 1) : major
|
|
9415
9420
|
};
|
|
9416
|
-
|
|
9417
|
-
return () => window.removeEventListener("resize", handleResize);
|
|
9418
|
-
}, []);
|
|
9419
|
-
useEffect(() => {
|
|
9420
|
-
drawTimeline();
|
|
9421
|
-
}, [drawTimeline, duration, zoom, containerWidth]);
|
|
9421
|
+
}, [duration, timelineTickConfigs]);
|
|
9422
9422
|
const handleSeek = (clientX) => {
|
|
9423
9423
|
if (!containerRef.current) return;
|
|
9424
9424
|
const rect = containerRef.current.getBoundingClientRect();
|
|
9425
|
-
const x2 = clientX - rect.left;
|
|
9425
|
+
const x2 = clientX - rect.left + (containerRef.current.scrollLeft || 0);
|
|
9426
9426
|
const newTime = Math.max(0, Math.min(duration, x2 / pixelsPerSecond));
|
|
9427
9427
|
onSeek(newTime);
|
|
9428
9428
|
};
|
|
@@ -9433,7 +9433,7 @@ function SeekTrack({
|
|
|
9433
9433
|
setIsDragging(active);
|
|
9434
9434
|
if (!containerRef.current) return;
|
|
9435
9435
|
const rect = containerRef.current.getBoundingClientRect();
|
|
9436
|
-
const xPos = x2 - rect.left;
|
|
9436
|
+
const xPos = x2 - rect.left + (containerRef.current.scrollLeft || 0);
|
|
9437
9437
|
const newTime = Math.max(0, Math.min(duration, xPos / pixelsPerSecond));
|
|
9438
9438
|
setSeekPosition(xPos);
|
|
9439
9439
|
onSeek(newTime);
|
|
@@ -9442,24 +9442,92 @@ function SeekTrack({
|
|
|
9442
9442
|
"div",
|
|
9443
9443
|
{
|
|
9444
9444
|
ref: containerRef,
|
|
9445
|
-
className: "twick-seek-track-container",
|
|
9445
|
+
className: "twick-seek-track-container-no-scrollbar",
|
|
9446
9446
|
onClick: (e3) => handleSeek(e3.clientX),
|
|
9447
|
+
style: {
|
|
9448
|
+
overflowX: "auto",
|
|
9449
|
+
position: "relative",
|
|
9450
|
+
scrollbarWidth: "none",
|
|
9451
|
+
// Firefox
|
|
9452
|
+
msOverflowStyle: "none"
|
|
9453
|
+
// IE/Edge
|
|
9454
|
+
},
|
|
9447
9455
|
children: [
|
|
9448
|
-
|
|
9449
|
-
|
|
9450
|
-
|
|
9451
|
-
|
|
9452
|
-
|
|
9453
|
-
|
|
9456
|
+
(() => {
|
|
9457
|
+
const ticks = [];
|
|
9458
|
+
const labels = [];
|
|
9459
|
+
const epsilon = 1e-6;
|
|
9460
|
+
const tickPositions = /* @__PURE__ */ new Set();
|
|
9461
|
+
for (let t2 = 0; t2 <= duration + epsilon; t2 += minorIntervalSec) {
|
|
9462
|
+
tickPositions.add(Math.round(t2 * 1e3) / 1e3);
|
|
9454
9463
|
}
|
|
9455
|
-
|
|
9464
|
+
tickPositions.forEach((t2) => {
|
|
9465
|
+
const left = t2 * pixelsPerSecond;
|
|
9466
|
+
const isMajor = Math.abs(t2 / majorIntervalSec - Math.round(t2 / majorIntervalSec)) < 1e-3;
|
|
9467
|
+
ticks.push(
|
|
9468
|
+
/* @__PURE__ */ jsx(
|
|
9469
|
+
"div",
|
|
9470
|
+
{
|
|
9471
|
+
style: {
|
|
9472
|
+
position: "absolute",
|
|
9473
|
+
left,
|
|
9474
|
+
top: 0,
|
|
9475
|
+
width: "1px",
|
|
9476
|
+
height: isMajor ? "12px" : "8px",
|
|
9477
|
+
backgroundColor: isMajor ? "rgba(255,255,255,0.5)" : "rgba(255,255,255,0.2)",
|
|
9478
|
+
pointerEvents: "none"
|
|
9479
|
+
}
|
|
9480
|
+
},
|
|
9481
|
+
`tick-${t2}`
|
|
9482
|
+
)
|
|
9483
|
+
);
|
|
9484
|
+
if (isMajor && t2 > epsilon) {
|
|
9485
|
+
labels.push(
|
|
9486
|
+
/* @__PURE__ */ jsx(
|
|
9487
|
+
"div",
|
|
9488
|
+
{
|
|
9489
|
+
style: {
|
|
9490
|
+
position: "absolute",
|
|
9491
|
+
left,
|
|
9492
|
+
bottom: "6px",
|
|
9493
|
+
transform: "translateX(-50%)",
|
|
9494
|
+
color: "rgba(255,255,255,0.7)",
|
|
9495
|
+
font: "bold 10px system-ui, sans-serif",
|
|
9496
|
+
pointerEvents: "none",
|
|
9497
|
+
textShadow: "1px 1px 2px rgba(0,0,0,0.8)"
|
|
9498
|
+
},
|
|
9499
|
+
children: `${Math.floor(t2)}s`
|
|
9500
|
+
},
|
|
9501
|
+
`lbl-${t2}`
|
|
9502
|
+
)
|
|
9503
|
+
);
|
|
9504
|
+
}
|
|
9505
|
+
});
|
|
9506
|
+
return /* @__PURE__ */ jsxs(
|
|
9507
|
+
"div",
|
|
9508
|
+
{
|
|
9509
|
+
style: {
|
|
9510
|
+
position: "relative",
|
|
9511
|
+
width: `${Math.max(1, Math.round(totalWidth))}px`,
|
|
9512
|
+
height: "32px",
|
|
9513
|
+
backgroundColor: "#0f0f0f"
|
|
9514
|
+
},
|
|
9515
|
+
children: [
|
|
9516
|
+
ticks,
|
|
9517
|
+
labels
|
|
9518
|
+
]
|
|
9519
|
+
}
|
|
9520
|
+
);
|
|
9521
|
+
})(),
|
|
9456
9522
|
/* @__PURE__ */ jsxs(
|
|
9457
9523
|
"div",
|
|
9458
9524
|
{
|
|
9459
9525
|
...bind(),
|
|
9460
9526
|
className: "twick-seek-track-playhead",
|
|
9461
9527
|
style: {
|
|
9528
|
+
position: "absolute",
|
|
9462
9529
|
left: seekPosition,
|
|
9530
|
+
top: 0,
|
|
9463
9531
|
touchAction: "none",
|
|
9464
9532
|
transition: isDragging2 ? "none" : "left 0.1s linear"
|
|
9465
9533
|
},
|
|
@@ -9483,7 +9551,8 @@ const SeekControl = ({
|
|
|
9483
9551
|
duration,
|
|
9484
9552
|
zoom,
|
|
9485
9553
|
timelineCount,
|
|
9486
|
-
onSeek
|
|
9554
|
+
onSeek,
|
|
9555
|
+
timelineTickConfigs
|
|
9487
9556
|
}) => {
|
|
9488
9557
|
const { currentTime } = useLivePlayerContext();
|
|
9489
9558
|
return /* @__PURE__ */ jsx(
|
|
@@ -9493,7 +9562,8 @@ const SeekControl = ({
|
|
|
9493
9562
|
currentTime,
|
|
9494
9563
|
zoom,
|
|
9495
9564
|
onSeek,
|
|
9496
|
-
timelineCount
|
|
9565
|
+
timelineCount,
|
|
9566
|
+
timelineTickConfigs
|
|
9497
9567
|
}
|
|
9498
9568
|
);
|
|
9499
9569
|
};
|
|
@@ -16937,6 +17007,90 @@ const DRAG_TYPE = {
|
|
|
16937
17007
|
END: "end"
|
|
16938
17008
|
};
|
|
16939
17009
|
const DEFAULT_TIMELINE_ZOOM = 1.5;
|
|
17010
|
+
const DEFAULT_TIMELINE_ZOOM_CONFIG = {
|
|
17011
|
+
/** Minimum zoom level (10%) */
|
|
17012
|
+
min: 0.1,
|
|
17013
|
+
/** Maximum zoom level (300%) */
|
|
17014
|
+
max: 3,
|
|
17015
|
+
/** Zoom step increment/decrement (10%) */
|
|
17016
|
+
step: 0.1,
|
|
17017
|
+
/** Default zoom level (150%) */
|
|
17018
|
+
default: 1.5
|
|
17019
|
+
};
|
|
17020
|
+
const DEFAULT_TIMELINE_TICK_CONFIGS = [
|
|
17021
|
+
{
|
|
17022
|
+
durationThreshold: 10,
|
|
17023
|
+
// < 10 seconds
|
|
17024
|
+
majorInterval: 1,
|
|
17025
|
+
// 1s major ticks
|
|
17026
|
+
minorTicks: 10
|
|
17027
|
+
// 0.1s minor ticks (10 minors between majors)
|
|
17028
|
+
},
|
|
17029
|
+
{
|
|
17030
|
+
durationThreshold: 30,
|
|
17031
|
+
// < 30 seconds
|
|
17032
|
+
majorInterval: 5,
|
|
17033
|
+
// 5s major ticks
|
|
17034
|
+
minorTicks: 5
|
|
17035
|
+
// 1s minor ticks (5 minors between majors)
|
|
17036
|
+
},
|
|
17037
|
+
{
|
|
17038
|
+
durationThreshold: 120,
|
|
17039
|
+
// < 2 minutes
|
|
17040
|
+
majorInterval: 10,
|
|
17041
|
+
// 10s major ticks
|
|
17042
|
+
minorTicks: 5
|
|
17043
|
+
// 2s minor ticks (5 minors between majors)
|
|
17044
|
+
},
|
|
17045
|
+
{
|
|
17046
|
+
durationThreshold: 300,
|
|
17047
|
+
// < 5 minutes
|
|
17048
|
+
majorInterval: 30,
|
|
17049
|
+
// 30s major ticks
|
|
17050
|
+
minorTicks: 6
|
|
17051
|
+
// 5s minor ticks (6 minors between majors)
|
|
17052
|
+
},
|
|
17053
|
+
{
|
|
17054
|
+
durationThreshold: 900,
|
|
17055
|
+
// < 15 minutes
|
|
17056
|
+
majorInterval: 60,
|
|
17057
|
+
// 1m major ticks
|
|
17058
|
+
minorTicks: 6
|
|
17059
|
+
// 10s minor ticks (6 minors between majors)
|
|
17060
|
+
},
|
|
17061
|
+
{
|
|
17062
|
+
durationThreshold: 1800,
|
|
17063
|
+
// < 30 minutes
|
|
17064
|
+
majorInterval: 120,
|
|
17065
|
+
// 2m major ticks
|
|
17066
|
+
minorTicks: 4
|
|
17067
|
+
// 30s minor ticks (4 minors between majors)
|
|
17068
|
+
},
|
|
17069
|
+
{
|
|
17070
|
+
durationThreshold: 3600,
|
|
17071
|
+
// < 1 hour
|
|
17072
|
+
majorInterval: 300,
|
|
17073
|
+
// 5m major ticks
|
|
17074
|
+
minorTicks: 5
|
|
17075
|
+
// 1m minor ticks (5 minors between majors)
|
|
17076
|
+
},
|
|
17077
|
+
{
|
|
17078
|
+
durationThreshold: 7200,
|
|
17079
|
+
// < 2 hours
|
|
17080
|
+
majorInterval: 600,
|
|
17081
|
+
// 10m major ticks
|
|
17082
|
+
minorTicks: 10
|
|
17083
|
+
// 1m minor ticks (10 minors between majors)
|
|
17084
|
+
},
|
|
17085
|
+
{
|
|
17086
|
+
durationThreshold: Infinity,
|
|
17087
|
+
// >= 2 hours
|
|
17088
|
+
majorInterval: 1800,
|
|
17089
|
+
// 30m major ticks
|
|
17090
|
+
minorTicks: 6
|
|
17091
|
+
// 5m minor ticks (6 minors between majors)
|
|
17092
|
+
}
|
|
17093
|
+
];
|
|
16940
17094
|
const DEFAULT_ELEMENT_COLORS = {
|
|
16941
17095
|
/** Fragment element color - deep charcoal matching UI background */
|
|
16942
17096
|
fragment: "#1A1A1A",
|
|
@@ -17032,7 +17186,8 @@ const TrackElementView = ({
|
|
|
17032
17186
|
selectedItem,
|
|
17033
17187
|
onSelection,
|
|
17034
17188
|
onDrag,
|
|
17035
|
-
allowOverlap = false
|
|
17189
|
+
allowOverlap = false,
|
|
17190
|
+
elementColors
|
|
17036
17191
|
}) => {
|
|
17037
17192
|
const ref = useRef(null);
|
|
17038
17193
|
const dragType = useRef(null);
|
|
@@ -17132,8 +17287,9 @@ const TrackElementView = ({
|
|
|
17132
17287
|
}
|
|
17133
17288
|
};
|
|
17134
17289
|
const getElementColor = (elementType) => {
|
|
17135
|
-
|
|
17136
|
-
|
|
17290
|
+
const colors = elementColors || ELEMENT_COLORS;
|
|
17291
|
+
if (elementType in colors) {
|
|
17292
|
+
return colors[elementType];
|
|
17137
17293
|
}
|
|
17138
17294
|
return ELEMENT_COLORS.element;
|
|
17139
17295
|
};
|
|
@@ -17209,7 +17365,8 @@ const TrackBase = ({
|
|
|
17209
17365
|
selectedItem,
|
|
17210
17366
|
onItemSelection,
|
|
17211
17367
|
onDrag,
|
|
17212
|
-
allowOverlap = false
|
|
17368
|
+
allowOverlap = false,
|
|
17369
|
+
elementColors
|
|
17213
17370
|
}) => {
|
|
17214
17371
|
const trackRef = useRef(null);
|
|
17215
17372
|
const trackWidthStyle = `${Math.max(100, duration * zoom * 100)}px`;
|
|
@@ -17232,6 +17389,7 @@ const TrackBase = ({
|
|
|
17232
17389
|
selectedItem,
|
|
17233
17390
|
onSelection: onItemSelection,
|
|
17234
17391
|
onDrag,
|
|
17392
|
+
elementColors,
|
|
17235
17393
|
nextStart: index < elements.length - 1 ? elements[index + 1].getStart() : null,
|
|
17236
17394
|
prevEnd: index > 0 ? elements[index - 1].getEnd() : 0
|
|
17237
17395
|
},
|
|
@@ -17249,7 +17407,8 @@ function TimelineView({
|
|
|
17249
17407
|
onAddTrack,
|
|
17250
17408
|
onReorder,
|
|
17251
17409
|
onSelectionChange,
|
|
17252
|
-
onElementDrag
|
|
17410
|
+
onElementDrag,
|
|
17411
|
+
elementColors
|
|
17253
17412
|
}) {
|
|
17254
17413
|
const containerRef = useRef(null);
|
|
17255
17414
|
const seekContainerRef = useRef(null);
|
|
@@ -17361,7 +17520,8 @@ function TimelineView({
|
|
|
17361
17520
|
allowOverlap: false,
|
|
17362
17521
|
trackWidth: timelineWidth - labelWidth,
|
|
17363
17522
|
onItemSelection: handleItemSelection,
|
|
17364
|
-
onDrag: onElementDrag
|
|
17523
|
+
onDrag: onElementDrag,
|
|
17524
|
+
elementColors
|
|
17365
17525
|
}
|
|
17366
17526
|
)
|
|
17367
17527
|
] }, track.getId())) })
|
|
@@ -17424,7 +17584,9 @@ const useTimelineManager = () => {
|
|
|
17424
17584
|
};
|
|
17425
17585
|
};
|
|
17426
17586
|
const TimelineManager = ({
|
|
17427
|
-
trackZoom
|
|
17587
|
+
trackZoom,
|
|
17588
|
+
timelineTickConfigs,
|
|
17589
|
+
elementColors
|
|
17428
17590
|
}) => {
|
|
17429
17591
|
var _a2;
|
|
17430
17592
|
const { timelineData, totalDuration, selectedItem, onAddTrack, onReorder, onElementDrag, onSeek, onSelectionChange } = useTimelineManager();
|
|
@@ -17442,13 +17604,15 @@ const TimelineManager = ({
|
|
|
17442
17604
|
onElementDrag,
|
|
17443
17605
|
onSeek,
|
|
17444
17606
|
onSelectionChange,
|
|
17607
|
+
elementColors,
|
|
17445
17608
|
seekTrack: /* @__PURE__ */ jsx(
|
|
17446
17609
|
SeekControl,
|
|
17447
17610
|
{
|
|
17448
17611
|
duration: totalDuration,
|
|
17449
17612
|
zoom: trackZoom,
|
|
17450
17613
|
onSeek,
|
|
17451
|
-
timelineCount: ((_a2 = timelineData == null ? void 0 : timelineData.tracks) == null ? void 0 : _a2.length) ?? 0
|
|
17614
|
+
timelineCount: ((_a2 = timelineData == null ? void 0 : timelineData.tracks) == null ? void 0 : _a2.length) ?? 0,
|
|
17615
|
+
timelineTickConfigs
|
|
17452
17616
|
}
|
|
17453
17617
|
)
|
|
17454
17618
|
}
|
|
@@ -17476,9 +17640,6 @@ const UndoRedoControls = ({ canUndo, canRedo, onUndo, onRedo }) => {
|
|
|
17476
17640
|
)
|
|
17477
17641
|
] });
|
|
17478
17642
|
};
|
|
17479
|
-
const MAX_ZOOM = 3;
|
|
17480
|
-
const MIN_ZOOM = 0.5;
|
|
17481
|
-
const ZOOM_STEP = 0.25;
|
|
17482
17643
|
const PlayerControls = ({
|
|
17483
17644
|
selectedItem,
|
|
17484
17645
|
duration,
|
|
@@ -17493,8 +17654,12 @@ const PlayerControls = ({
|
|
|
17493
17654
|
onDelete,
|
|
17494
17655
|
zoomLevel = 1,
|
|
17495
17656
|
setZoomLevel,
|
|
17496
|
-
className = ""
|
|
17657
|
+
className = "",
|
|
17658
|
+
zoomConfig = DEFAULT_TIMELINE_ZOOM_CONFIG
|
|
17497
17659
|
}) => {
|
|
17660
|
+
const MAX_ZOOM = zoomConfig.max;
|
|
17661
|
+
const MIN_ZOOM = zoomConfig.min;
|
|
17662
|
+
const ZOOM_STEP = zoomConfig.step;
|
|
17498
17663
|
const formatTime = useCallback((time2) => {
|
|
17499
17664
|
const minutes = Math.floor(time2 / 60);
|
|
17500
17665
|
const seconds = Math.floor(time2 % 60);
|
|
@@ -17651,7 +17816,8 @@ const useTimelineControl = () => {
|
|
|
17651
17816
|
};
|
|
17652
17817
|
const ControlManager = ({
|
|
17653
17818
|
trackZoom,
|
|
17654
|
-
setTrackZoom
|
|
17819
|
+
setTrackZoom,
|
|
17820
|
+
zoomConfig
|
|
17655
17821
|
}) => {
|
|
17656
17822
|
const { currentTime, playerState } = useLivePlayerContext();
|
|
17657
17823
|
const { togglePlayback } = usePlayerControl();
|
|
@@ -17672,7 +17838,8 @@ const ControlManager = ({
|
|
|
17672
17838
|
onUndo: handleUndo,
|
|
17673
17839
|
onRedo: handleRedo,
|
|
17674
17840
|
zoomLevel: trackZoom,
|
|
17675
|
-
setZoomLevel: setTrackZoom
|
|
17841
|
+
setZoomLevel: setTrackZoom,
|
|
17842
|
+
zoomConfig
|
|
17676
17843
|
}
|
|
17677
17844
|
) });
|
|
17678
17845
|
};
|
|
@@ -17683,7 +17850,16 @@ const VideoEditor = ({
|
|
|
17683
17850
|
editorConfig,
|
|
17684
17851
|
defaultPlayControls = true
|
|
17685
17852
|
}) => {
|
|
17686
|
-
const
|
|
17853
|
+
const zoomConfig = editorConfig.timelineZoomConfig ?? DEFAULT_TIMELINE_ZOOM_CONFIG;
|
|
17854
|
+
const timelineTickConfigs = (editorConfig == null ? void 0 : editorConfig.timelineTickConfigs) ?? DEFAULT_TIMELINE_TICK_CONFIGS;
|
|
17855
|
+
const elementColors = useMemo(
|
|
17856
|
+
() => ({
|
|
17857
|
+
...DEFAULT_ELEMENT_COLORS,
|
|
17858
|
+
...(editorConfig == null ? void 0 : editorConfig.elementColors) || {}
|
|
17859
|
+
}),
|
|
17860
|
+
[editorConfig == null ? void 0 : editorConfig.elementColors]
|
|
17861
|
+
);
|
|
17862
|
+
const [trackZoom, setTrackZoom] = useState(zoomConfig.default);
|
|
17687
17863
|
const useMemoizedPlayerManager = useMemo(
|
|
17688
17864
|
() => /* @__PURE__ */ jsx(
|
|
17689
17865
|
PlayerManager,
|
|
@@ -17703,8 +17879,22 @@ const VideoEditor = ({
|
|
|
17703
17879
|
] }),
|
|
17704
17880
|
bottomPanel ? bottomPanel : null,
|
|
17705
17881
|
/* @__PURE__ */ jsxs("div", { className: "twick-editor-timeline-section", children: [
|
|
17706
|
-
defaultPlayControls ? /* @__PURE__ */ jsx(
|
|
17707
|
-
|
|
17882
|
+
defaultPlayControls ? /* @__PURE__ */ jsx(
|
|
17883
|
+
ControlManager,
|
|
17884
|
+
{
|
|
17885
|
+
trackZoom,
|
|
17886
|
+
setTrackZoom,
|
|
17887
|
+
zoomConfig
|
|
17888
|
+
}
|
|
17889
|
+
) : null,
|
|
17890
|
+
/* @__PURE__ */ jsx(
|
|
17891
|
+
TimelineManager,
|
|
17892
|
+
{
|
|
17893
|
+
trackZoom,
|
|
17894
|
+
timelineTickConfigs,
|
|
17895
|
+
elementColors
|
|
17896
|
+
}
|
|
17897
|
+
)
|
|
17708
17898
|
] })
|
|
17709
17899
|
] });
|
|
17710
17900
|
};
|
|
@@ -18055,7 +18245,9 @@ export {
|
|
|
18055
18245
|
BaseMediaManager,
|
|
18056
18246
|
BrowserMediaManager,
|
|
18057
18247
|
DEFAULT_ELEMENT_COLORS,
|
|
18248
|
+
DEFAULT_TIMELINE_TICK_CONFIGS,
|
|
18058
18249
|
DEFAULT_TIMELINE_ZOOM,
|
|
18250
|
+
DEFAULT_TIMELINE_ZOOM_CONFIG,
|
|
18059
18251
|
DRAG_TYPE,
|
|
18060
18252
|
INITIAL_TIMELINE_DATA,
|
|
18061
18253
|
MIN_DURATION,
|