@twick/video-editor 0.15.13 → 0.15.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.
Files changed (31) hide show
  1. package/dist/components/controls/control-manager.d.ts +2 -1
  2. package/dist/components/controls/player-controls.d.ts +13 -3
  3. package/dist/components/controls/seek-control.d.ts +3 -1
  4. package/dist/components/player/canvas-context-menu.d.ts +18 -0
  5. package/dist/components/player/player-manager.d.ts +5 -1
  6. package/dist/components/timeline/marquee-overlay.d.ts +12 -0
  7. package/dist/components/timeline/timeline-view.d.ts +21 -3
  8. package/dist/components/track/seek-track.d.ts +7 -1
  9. package/dist/components/track/track-base.d.ts +3 -2
  10. package/dist/components/track/track-element.d.ts +2 -1
  11. package/dist/components/track/track-header.d.ts +3 -3
  12. package/dist/components/video-editor.d.ts +6 -1
  13. package/dist/helpers/asset-type.d.ts +6 -0
  14. package/dist/helpers/constants.d.ts +12 -0
  15. package/dist/helpers/snap-targets.d.ts +7 -0
  16. package/dist/helpers/types.d.ts +10 -0
  17. package/dist/hooks/use-canvas-drop.d.ts +25 -0
  18. package/dist/hooks/use-canvas-keyboard.d.ts +13 -0
  19. package/dist/hooks/use-marquee-selection.d.ts +24 -0
  20. package/dist/hooks/use-player-manager.d.ts +14 -2
  21. package/dist/hooks/use-playhead-scroll.d.ts +19 -0
  22. package/dist/hooks/use-timeline-control.d.ts +1 -1
  23. package/dist/hooks/use-timeline-drop.d.ts +40 -0
  24. package/dist/hooks/use-timeline-selection.d.ts +13 -0
  25. package/dist/index.d.ts +2 -2
  26. package/dist/index.js +2539 -859
  27. package/dist/index.js.map +1 -1
  28. package/dist/index.mjs +2543 -863
  29. package/dist/index.mjs.map +1 -1
  30. package/dist/video-editor.css +180 -31
  31. package/package.json +5 -5
@@ -61,6 +61,34 @@
61
61
 
62
62
  /* Transitions */
63
63
  --transition-all: all 0.2s ease;
64
+
65
+ /* Elevation system */
66
+ --elevation-panel: 0 0 0 1px rgba(255,255,255,0.04), 0 8px 32px rgba(0,0,0,0.4);
67
+ --elevation-canvas: 0 0 0 1px rgba(255,255,255,0.04), 0 8px 32px rgba(0,0,0,0.4);
68
+ --elevation-scrubber: 0 0 8px rgba(139,92,246,0.8);
69
+
70
+ /* Motion */
71
+ --duration-fast: 120ms;
72
+ --duration-normal: 150ms;
73
+ --duration-medium: 180ms;
74
+ --ease-default: cubic-bezier(0.4, 0, 0.2, 1);
75
+
76
+ /* Muted purple for hover (reduce primary purple overuse) */
77
+ --color-purple-muted: rgba(139, 92, 246, 0.15);
78
+
79
+ /* Typography – Level 1 Section Headers */
80
+ --typography-h1: 16px;
81
+ --typography-h1-weight: 600;
82
+ --typography-h1-spacing: 0.3px;
83
+ --typography-h1-margin: 8px 0 12px 0;
84
+
85
+ /* Typography – Level 2 Sub Labels */
86
+ --typography-label: 13px;
87
+ --typography-label-opacity: 0.8;
88
+
89
+ /* Typography – Level 3 Values */
90
+ --typography-value: 13px;
91
+ --typography-value-weight: 500;
64
92
  }
65
93
  /* ========================================
66
94
  LAYOUT UTILITIES
@@ -238,7 +266,11 @@
238
266
  cursor: pointer;
239
267
  position: relative;
240
268
  overflow: hidden;
241
- transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
269
+ transition: transform 150ms cubic-bezier(0.4, 0, 0.2, 1),
270
+ box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1),
271
+ background-color 150ms ease,
272
+ color 150ms ease,
273
+ border-color 150ms ease;
242
274
  text-transform: uppercase;
243
275
  letter-spacing: 0.025em;
244
276
  box-shadow: 0 4px 14px 0 rgba(0, 0, 0, 0.15);
@@ -259,7 +291,7 @@
259
291
  box-shadow: 0 0 0 3px rgba(147, 51, 234, 0.3), 0 4px 14px 0 rgba(0, 0, 0, 0.15);
260
292
  }
261
293
  .btn:active {
262
- transform: translateY(1px);
294
+ transform: scale(0.98);
263
295
  box-shadow: 0 2px 8px 0 rgba(0, 0, 0, 0.2);
264
296
  }
265
297
  .btn:disabled {
@@ -282,7 +314,9 @@
282
314
  cursor: pointer;
283
315
  position: relative;
284
316
  overflow: hidden;
285
- transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
317
+ transition: transform 150ms cubic-bezier(0.4, 0, 0.2, 1),
318
+ box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1),
319
+ background 150ms ease;
286
320
  background: linear-gradient(135deg, var(--color-purple-600), var(--color-purple-700), var(--color-purple-800));
287
321
  color: white;
288
322
  border: 1px solid var(--color-purple-500);
@@ -291,11 +325,12 @@
291
325
  .btn-primary:hover {
292
326
  background: linear-gradient(135deg, var(--color-purple-500), var(--color-purple-600), var(--color-purple-700));
293
327
  box-shadow: 0 12px 35px rgba(147, 51, 234, 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.15);
294
- transform: translateY(-2px);
328
+ transform: translateY(-1px);
295
329
  }
296
330
  .btn-primary:active {
297
331
  background: linear-gradient(135deg, var(--color-purple-700), var(--color-purple-800), var(--color-purple-900));
298
332
  box-shadow: 0 6px 20px rgba(147, 51, 234, 0.35), inset 0 1px 0 rgba(255, 255, 255, 0.1);
333
+ transform: scale(0.98);
299
334
  }
300
335
  .btn-primary:disabled {
301
336
  opacity: 0.6;
@@ -346,7 +381,11 @@
346
381
  cursor: pointer;
347
382
  position: relative;
348
383
  overflow: hidden;
349
- transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
384
+ transition: transform 150ms cubic-bezier(0.4, 0, 0.2, 1),
385
+ box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1),
386
+ background 150ms ease,
387
+ color 150ms ease,
388
+ border-color 150ms ease;
350
389
  background: rgba(64, 64, 64, 0.3);
351
390
  color: var(--color-neutral-300);
352
391
  border: 1px solid rgba(255, 255, 255, 0.1);
@@ -358,7 +397,10 @@
358
397
  color: white;
359
398
  border-color: rgba(255, 255, 255, 0.2);
360
399
  box-shadow: 0 12px 35px rgba(0, 0, 0, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.1);
361
- transform: translateY(-2px);
400
+ transform: translateY(-1px);
401
+ }
402
+ .btn-ghost:active {
403
+ transform: scale(0.98);
362
404
  }
363
405
  .btn-ghost:disabled {
364
406
  opacity: 0.6;
@@ -466,8 +508,8 @@
466
508
  }
467
509
  .input:focus {
468
510
  outline: none;
469
- border-color: var(--color-purple-500);
470
- box-shadow: 0 0 0 3px rgba(147, 51, 234, 0.1);
511
+ border-color: rgba(255, 255, 255, 0.3);
512
+ box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.1);
471
513
  }
472
514
  .input-dark {
473
515
  width: 100%;
@@ -481,8 +523,8 @@
481
523
  }
482
524
  .input-dark:focus {
483
525
  outline: none;
484
- border-color: var(--color-purple-500);
485
- box-shadow: 0 0 0 3px rgba(147, 51, 234, 0.1);
526
+ border-color: rgba(255, 255, 255, 0.3);
527
+ box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.1);
486
528
  }
487
529
  /* ========================================
488
530
  CARD UTILITIES
@@ -499,6 +541,7 @@
499
541
  flex-direction: column;
500
542
  width: 100%;
501
543
  height: 100%;
544
+ background-color: var(--color-neutral-900);
502
545
  gap: 6px;
503
546
  }
504
547
  .twick-editor-view-section {
@@ -514,8 +557,8 @@
514
557
  flex-direction: column;
515
558
  width: 100%;
516
559
  height: 100%;
517
- background-color: #252525;
518
- border-radius: 10px;
560
+ background-color: #141419;
561
+ border-radius: 0.75rem;
519
562
  overflow-x: hidden;
520
563
  }
521
564
  .twick-editor-container {
@@ -565,6 +608,45 @@
565
608
  @keyframes twick-editor-spin {
566
609
  0% { transform: rotate(0deg); }
567
610
  100% { transform: rotate(360deg); }
611
+ }
612
+ /* Canvas context menu (z-order: Bring to Front / Send to Back) */
613
+ .twick-canvas-context-menu {
614
+ position: fixed;
615
+ z-index: 1000;
616
+ min-width: 160px;
617
+ padding: 4px 0;
618
+ background: #2a2a2a;
619
+ border: 1px solid #444;
620
+ border-radius: 8px;
621
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
622
+ display: flex;
623
+ flex-direction: column;
624
+ }
625
+ .twick-canvas-context-menu-item {
626
+ display: block;
627
+ width: 100%;
628
+ padding: 8px 14px;
629
+ border: none;
630
+ background: transparent;
631
+ color: #e5e5e5;
632
+ font-size: 13px;
633
+ text-align: left;
634
+ cursor: pointer;
635
+ font-family: inherit;
636
+ }
637
+ .twick-canvas-context-menu-item:hover {
638
+ background: #3a3a3a;
639
+ }
640
+ .twick-canvas-context-menu-separator {
641
+ height: 1px;
642
+ margin: 4px 8px;
643
+ background: #444;
644
+ }
645
+ .twick-canvas-context-menu-item-danger:hover {
646
+ background: #7f1d1d;
647
+ }
648
+ .twick-canvas-context-menu-item.twick-canvas-context-menu-item-danger {
649
+ color: #fca5a5;
568
650
  }.twick-timeline-scroll-container {
569
651
  display: flex;
570
652
  flex-direction: column;
@@ -624,9 +706,9 @@
624
706
  .twick-seek-track {
625
707
  position: relative;
626
708
  width: 100%;
627
- border-top: 1px solid #262626;
628
- border-bottom: 1px solid #262626;
629
- background-color: #171717;
709
+ border-top: 1px solid rgba(255, 255, 255, 0.06);
710
+ border-bottom: 1px solid rgba(255, 255, 255, 0.06);
711
+ background-color: #0f0f14;
630
712
  }
631
713
 
632
714
  .twick-seek-track-canvas {
@@ -647,8 +729,9 @@
647
729
  top: 0;
648
730
  left: 0;
649
731
  z-index: 30;
650
- width: 1.5px;
651
- background-color: #FFFFFF;
732
+ width: 2px;
733
+ background-color: var(--color-purple-400);
734
+ box-shadow: 0 0 8px rgba(139, 92, 246, 0.8);
652
735
  }
653
736
 
654
737
  .twick-seek-track-handle {
@@ -660,6 +743,7 @@
660
743
  transform: translate(-50%, -50%);
661
744
  background-color: #FFFFFF;
662
745
  border-radius: 25%;
746
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.4);
663
747
  }
664
748
 
665
749
  .twick-track-element {
@@ -796,6 +880,17 @@
796
880
  margin-top: 2px;
797
881
  background-color: #474747;
798
882
  }
883
+
884
+ /* Drop preview - ghost placeholder when dragging files over timeline */
885
+ .twick-drop-preview {
886
+ position: absolute;
887
+ z-index: 20;
888
+ pointer-events: none;
889
+ background: rgba(96, 165, 250, 0.35);
890
+ border: 2px dashed rgba(96, 165, 250, 0.8);
891
+ border-radius: 6px;
892
+ transition: left 0.05s ease-out, top 0.05s ease-out;
893
+ }
799
894
  :root {
800
895
  /* Colors */
801
896
  --color-purple-100: #f3e8ff;
@@ -846,6 +941,34 @@
846
941
 
847
942
  /* Transitions */
848
943
  --transition-all: all 0.2s ease;
944
+
945
+ /* Elevation system */
946
+ --elevation-panel: 0 0 0 1px rgba(255,255,255,0.04), 0 8px 32px rgba(0,0,0,0.4);
947
+ --elevation-canvas: 0 0 0 1px rgba(255,255,255,0.04), 0 8px 32px rgba(0,0,0,0.4);
948
+ --elevation-scrubber: 0 0 8px rgba(139,92,246,0.8);
949
+
950
+ /* Motion */
951
+ --duration-fast: 120ms;
952
+ --duration-normal: 150ms;
953
+ --duration-medium: 180ms;
954
+ --ease-default: cubic-bezier(0.4, 0, 0.2, 1);
955
+
956
+ /* Muted purple for hover (reduce primary purple overuse) */
957
+ --color-purple-muted: rgba(139, 92, 246, 0.15);
958
+
959
+ /* Typography – Level 1 Section Headers */
960
+ --typography-h1: 16px;
961
+ --typography-h1-weight: 600;
962
+ --typography-h1-spacing: 0.3px;
963
+ --typography-h1-margin: 8px 0 12px 0;
964
+
965
+ /* Typography – Level 2 Sub Labels */
966
+ --typography-label: 13px;
967
+ --typography-label-opacity: 0.8;
968
+
969
+ /* Typography – Level 3 Values */
970
+ --typography-value: 13px;
971
+ --typography-value-weight: 500;
849
972
  }
850
973
 
851
974
  /* ========================================
@@ -1073,7 +1196,11 @@
1073
1196
  cursor: pointer;
1074
1197
  position: relative;
1075
1198
  overflow: hidden;
1076
- transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
1199
+ transition: transform 150ms cubic-bezier(0.4, 0, 0.2, 1),
1200
+ box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1),
1201
+ background-color 150ms ease,
1202
+ color 150ms ease,
1203
+ border-color 150ms ease;
1077
1204
  text-transform: uppercase;
1078
1205
  letter-spacing: 0.025em;
1079
1206
  box-shadow: 0 4px 14px 0 rgba(0, 0, 0, 0.15);
@@ -1097,7 +1224,7 @@
1097
1224
  }
1098
1225
 
1099
1226
  .btn:active {
1100
- transform: translateY(1px);
1227
+ transform: scale(0.98);
1101
1228
  box-shadow: 0 2px 8px 0 rgba(0, 0, 0, 0.2);
1102
1229
  }
1103
1230
 
@@ -1123,7 +1250,9 @@
1123
1250
  cursor: pointer;
1124
1251
  position: relative;
1125
1252
  overflow: hidden;
1126
- transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
1253
+ transition: transform 150ms cubic-bezier(0.4, 0, 0.2, 1),
1254
+ box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1),
1255
+ background 150ms ease;
1127
1256
  background: linear-gradient(135deg, var(--color-purple-600), var(--color-purple-700), var(--color-purple-800));
1128
1257
  color: white;
1129
1258
  border: 1px solid var(--color-purple-500);
@@ -1133,12 +1262,13 @@
1133
1262
  .btn-primary:hover {
1134
1263
  background: linear-gradient(135deg, var(--color-purple-500), var(--color-purple-600), var(--color-purple-700));
1135
1264
  box-shadow: 0 12px 35px rgba(147, 51, 234, 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.15);
1136
- transform: translateY(-2px);
1265
+ transform: translateY(-1px);
1137
1266
  }
1138
1267
 
1139
1268
  .btn-primary:active {
1140
1269
  background: linear-gradient(135deg, var(--color-purple-700), var(--color-purple-800), var(--color-purple-900));
1141
1270
  box-shadow: 0 6px 20px rgba(147, 51, 234, 0.35), inset 0 1px 0 rgba(255, 255, 255, 0.1);
1271
+ transform: scale(0.98);
1142
1272
  }
1143
1273
 
1144
1274
  .btn-primary:disabled {
@@ -1194,7 +1324,11 @@
1194
1324
  cursor: pointer;
1195
1325
  position: relative;
1196
1326
  overflow: hidden;
1197
- transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
1327
+ transition: transform 150ms cubic-bezier(0.4, 0, 0.2, 1),
1328
+ box-shadow 150ms cubic-bezier(0.4, 0, 0.2, 1),
1329
+ background 150ms ease,
1330
+ color 150ms ease,
1331
+ border-color 150ms ease;
1198
1332
  background: rgba(64, 64, 64, 0.3);
1199
1333
  color: var(--color-neutral-300);
1200
1334
  border: 1px solid rgba(255, 255, 255, 0.1);
@@ -1207,7 +1341,11 @@
1207
1341
  color: white;
1208
1342
  border-color: rgba(255, 255, 255, 0.2);
1209
1343
  box-shadow: 0 12px 35px rgba(0, 0, 0, 0.15), inset 0 1px 0 rgba(255, 255, 255, 0.1);
1210
- transform: translateY(-2px);
1344
+ transform: translateY(-1px);
1345
+ }
1346
+
1347
+ .btn-ghost:active {
1348
+ transform: scale(0.98);
1211
1349
  }
1212
1350
 
1213
1351
  .btn-ghost:disabled {
@@ -1330,8 +1468,8 @@
1330
1468
 
1331
1469
  .input:focus {
1332
1470
  outline: none;
1333
- border-color: var(--color-purple-500);
1334
- box-shadow: 0 0 0 3px rgba(147, 51, 234, 0.1);
1471
+ border-color: rgba(255, 255, 255, 0.3);
1472
+ box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.1);
1335
1473
  }
1336
1474
 
1337
1475
  .input-dark {
@@ -1347,8 +1485,8 @@
1347
1485
 
1348
1486
  .input-dark:focus {
1349
1487
  outline: none;
1350
- border-color: var(--color-purple-500);
1351
- box-shadow: 0 0 0 3px rgba(147, 51, 234, 0.1);
1488
+ border-color: rgba(255, 255, 255, 0.3);
1489
+ box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.1);
1352
1490
  }
1353
1491
 
1354
1492
  /* ========================================
@@ -1367,8 +1505,8 @@
1367
1505
 
1368
1506
  .player-controls {
1369
1507
  height: 3rem;
1370
- background-color: var(--color-neutral-800);
1371
- border-top: 1px solid var(--color-neutral-600);
1508
+ background-color: #141419;
1509
+ border-top: 1px solid rgba(255, 255, 255, 0.06);
1372
1510
  padding: 0 0.5rem;
1373
1511
  display: flex;
1374
1512
  align-items: center;
@@ -1400,17 +1538,20 @@
1400
1538
  background: transparent;
1401
1539
  border: none;
1402
1540
  color: var(--color-neutral-400);
1403
- transition: var(--transition-all);
1541
+ transition: transform 150ms cubic-bezier(0.4, 0, 0.2, 1),
1542
+ color 150ms ease,
1543
+ background-color 150ms ease;
1404
1544
  cursor: pointer;
1405
1545
  }
1406
1546
 
1407
1547
  .control-btn:hover {
1408
1548
  color: var(--color-neutral-100);
1409
1549
  background-color: var(--color-neutral-700);
1550
+ transform: translateY(-1px);
1410
1551
  }
1411
1552
 
1412
1553
  .control-btn:active {
1413
- transform: scale(0.95);
1554
+ transform: scale(0.98);
1414
1555
  background-color: var(--color-neutral-600);
1415
1556
  }
1416
1557
 
@@ -1439,6 +1580,14 @@
1439
1580
  color: var(--color-purple-300);
1440
1581
  }
1441
1582
 
1583
+ .follow-btn-active {
1584
+ color: var(--color-purple-400);
1585
+ }
1586
+
1587
+ .follow-btn-active:hover {
1588
+ color: var(--color-purple-300);
1589
+ }
1590
+
1442
1591
  .play-pause-btn {
1443
1592
  padding: 0.75rem;
1444
1593
  color: white;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@twick/video-editor",
3
- "version": "0.15.13",
3
+ "version": "0.15.15",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.mjs",
6
6
  "types": "./dist/index.d.ts",
@@ -34,12 +34,12 @@
34
34
  },
35
35
  "dependencies": {
36
36
  "@emotion/is-prop-valid": "^1.2.2",
37
- "@twick/canvas": "0.15.13",
38
- "@twick/live-player": "0.15.13",
39
- "@twick/timeline": "0.15.13",
37
+ "@twick/canvas": "0.15.15",
38
+ "@twick/live-player": "0.15.15",
39
+ "@twick/timeline": "0.15.15",
40
40
  "@react-spring/web": "^10.0.1",
41
41
  "@use-gesture/react": "^10.3.0",
42
- "@twick/media-utils": "0.15.13",
42
+ "@twick/media-utils": "0.15.15",
43
43
  "framer-motion": "^11.0.3",
44
44
  "lucide-react": "^0.511.0"
45
45
  },