cerevox 2.16.0 → 2.16.2

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,695 @@
1
+ /* ZeroCut Timeline Editor - Professional Video Editing Interface */
2
+
3
+ /* Reset and base styles */
4
+ * {
5
+ margin: 0;
6
+ padding: 0;
7
+ box-sizing: border-box;
8
+ }
9
+
10
+ body {
11
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
12
+ background: #1e1e1e;
13
+ color: #ffffff;
14
+ overflow: hidden;
15
+ height: 100vh;
16
+ }
17
+
18
+ /* Header */
19
+ .header {
20
+ background: #2d2d2d;
21
+ border-bottom: 1px solid #404040;
22
+ padding: 0.5rem 1rem;
23
+ display: flex;
24
+ align-items: center;
25
+ justify-content: space-between;
26
+ height: 50px;
27
+ z-index: 100;
28
+ }
29
+
30
+ .header h1 {
31
+ font-size: 1.2rem;
32
+ font-weight: 600;
33
+ color: #ffffff;
34
+ }
35
+
36
+ .header-controls {
37
+ display: flex;
38
+ gap: 0.5rem;
39
+ }
40
+
41
+ .btn {
42
+ background: #404040;
43
+ border: 1px solid #555555;
44
+ color: #ffffff;
45
+ padding: 0.4rem 0.8rem;
46
+ border-radius: 4px;
47
+ cursor: pointer;
48
+ font-size: 0.85rem;
49
+ transition: all 0.2s;
50
+ }
51
+
52
+ .btn:hover {
53
+ background: #505050;
54
+ border-color: #666666;
55
+ }
56
+
57
+ .btn.primary {
58
+ background: #0066cc;
59
+ border-color: #0066cc;
60
+ }
61
+
62
+ .btn.primary:hover {
63
+ background: #0052a3;
64
+ }
65
+
66
+ /* Main container */
67
+ .main-container {
68
+ display: flex;
69
+ height: calc(100vh - 50px);
70
+ }
71
+
72
+ /* Left assets panel */
73
+ .assets-panel {
74
+ width: 280px;
75
+ background: #252525;
76
+ border-right: 1px solid #404040;
77
+ display: flex;
78
+ flex-direction: column;
79
+ overflow: hidden;
80
+ }
81
+
82
+ .assets-header {
83
+ padding: 1rem;
84
+ border-bottom: 1px solid #404040;
85
+ background: #2d2d2d;
86
+ }
87
+
88
+ .assets-header h3 {
89
+ font-size: 1rem;
90
+ font-weight: 600;
91
+ margin-bottom: 0.5rem;
92
+ }
93
+
94
+ .assets-search {
95
+ width: 100%;
96
+ background: #1e1e1e;
97
+ border: 1px solid #404040;
98
+ color: #ffffff;
99
+ padding: 0.5rem;
100
+ border-radius: 4px;
101
+ font-size: 0.85rem;
102
+ }
103
+
104
+ .assets-content {
105
+ flex: 1;
106
+ overflow-y: auto;
107
+ padding: 0.5rem 0;
108
+ }
109
+
110
+ .asset-category {
111
+ margin-bottom: 0.5rem;
112
+ }
113
+
114
+ .category-header {
115
+ display: flex;
116
+ align-items: center;
117
+ padding: 0.5rem 1rem;
118
+ background: #2d2d2d;
119
+ cursor: pointer;
120
+ font-weight: 500;
121
+ font-size: 0.9rem;
122
+ border-bottom: 1px solid #404040;
123
+ }
124
+
125
+ .category-header:hover {
126
+ background: #353535;
127
+ }
128
+
129
+ .category-icon {
130
+ margin-right: 0.5rem;
131
+ font-size: 1rem;
132
+ }
133
+
134
+ .asset-list {
135
+ list-style: none;
136
+ }
137
+
138
+ .asset-item {
139
+ display: flex;
140
+ align-items: center;
141
+ padding: 0.6rem 1rem;
142
+ cursor: pointer;
143
+ border-bottom: 1px solid #333333;
144
+ transition: background-color 0.2s;
145
+ font-size: 0.85rem;
146
+ }
147
+
148
+ .asset-item:hover {
149
+ background: #333333;
150
+ }
151
+
152
+ .asset-item.selected {
153
+ background: #0066cc;
154
+ color: #ffffff;
155
+ }
156
+
157
+ .asset-icon {
158
+ margin-right: 0.5rem;
159
+ font-size: 1rem;
160
+ }
161
+
162
+ /* Central area */
163
+ .central-area {
164
+ flex: 1;
165
+ display: flex;
166
+ flex-direction: column;
167
+ }
168
+
169
+ /* Video preview area */
170
+ .preview-area {
171
+ height: 60%;
172
+ background: #1a1a1a;
173
+ border-bottom: 1px solid #404040;
174
+ display: flex;
175
+ flex-direction: column;
176
+ }
177
+
178
+ .preview-header {
179
+ background: #2d2d2d;
180
+ padding: 0.5rem 1rem;
181
+ border-bottom: 1px solid #404040;
182
+ display: flex;
183
+ align-items: center;
184
+ justify-content: space-between;
185
+ }
186
+
187
+ .preview-title {
188
+ font-size: 0.9rem;
189
+ font-weight: 500;
190
+ }
191
+
192
+ .preview-controls {
193
+ display: flex;
194
+ gap: 0.5rem;
195
+ align-items: center;
196
+ }
197
+
198
+ .play-btn {
199
+ background: #0066cc;
200
+ border: none;
201
+ color: white;
202
+ width: 36px;
203
+ height: 36px;
204
+ border-radius: 50%;
205
+ cursor: pointer;
206
+ display: flex;
207
+ align-items: center;
208
+ justify-content: center;
209
+ font-size: 1rem;
210
+ transition: background-color 0.2s;
211
+ }
212
+
213
+ .play-btn:hover {
214
+ background: #0052a3;
215
+ }
216
+
217
+ .time-display {
218
+ font-family: 'Monaco', 'Menlo', monospace;
219
+ font-size: 0.85rem;
220
+ color: #cccccc;
221
+ min-width: 100px;
222
+ text-align: center;
223
+ }
224
+
225
+ .preview-content {
226
+ flex: 1;
227
+ display: flex;
228
+ align-items: center;
229
+ justify-content: center;
230
+ position: relative;
231
+ overflow: hidden;
232
+ min-height: 300px;
233
+ }
234
+
235
+ .video-container {
236
+ width: 100%;
237
+ height: 100%;
238
+ display: flex;
239
+ align-items: center;
240
+ justify-content: center;
241
+ background: #000000;
242
+ position: relative;
243
+ }
244
+
245
+ /* Subtitle overlay styles */
246
+ .subtitle-overlay {
247
+ position: absolute;
248
+ bottom: 10%;
249
+ left: 0;
250
+ right: 0;
251
+ display: flex;
252
+ justify-content: center;
253
+ pointer-events: none;
254
+ z-index: 10;
255
+ }
256
+
257
+ .subtitle-text {
258
+ background: rgba(0, 0, 0, 0.7);
259
+ color: white;
260
+ font-size: 24px;
261
+ font-weight: bold;
262
+ padding: 8px 16px;
263
+ border-radius: 4px;
264
+ text-align: center;
265
+ max-width: 80%;
266
+ line-height: 1.4;
267
+ text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.8);
268
+ display: none;
269
+ }
270
+
271
+ .preview-video {
272
+ width: 100%;
273
+ height: 100%;
274
+ max-width: 100%;
275
+ max-height: 100%;
276
+ object-fit: contain;
277
+ display: block;
278
+ }
279
+
280
+ .video-placeholder {
281
+ color: #666666;
282
+ font-size: 1.1rem;
283
+ text-align: center;
284
+ }
285
+
286
+ /* Timeline area */
287
+ .timeline-area {
288
+ height: 40%;
289
+ background: #1e1e1e;
290
+ display: flex;
291
+ flex-direction: column;
292
+ }
293
+
294
+ .timeline-header {
295
+ background: #2d2d2d;
296
+ padding: 0.5rem 1rem;
297
+ border-bottom: 1px solid #404040;
298
+ display: flex;
299
+ align-items: center;
300
+ justify-content: space-between;
301
+ }
302
+
303
+ .timeline-title {
304
+ font-size: 0.9rem;
305
+ font-weight: 500;
306
+ }
307
+
308
+ .timeline-controls {
309
+ display: flex;
310
+ gap: 0.5rem;
311
+ align-items: center;
312
+ }
313
+
314
+ .zoom-controls {
315
+ display: flex;
316
+ gap: 0.25rem;
317
+ }
318
+
319
+ .zoom-btn {
320
+ background: #404040;
321
+ border: 1px solid #555555;
322
+ color: #ffffff;
323
+ width: 28px;
324
+ height: 28px;
325
+ border-radius: 4px;
326
+ cursor: pointer;
327
+ display: flex;
328
+ align-items: center;
329
+ justify-content: center;
330
+ font-size: 0.8rem;
331
+ transition: all 0.2s;
332
+ }
333
+
334
+ .zoom-btn:hover {
335
+ background: #505050;
336
+ }
337
+
338
+ .timeline-info {
339
+ font-size: 0.8rem;
340
+ color: #cccccc;
341
+ font-family: 'Monaco', 'Menlo', monospace;
342
+ }
343
+
344
+ .timeline-content {
345
+ flex: 1;
346
+ display: flex;
347
+ flex-direction: column;
348
+ overflow: hidden;
349
+ position: relative;
350
+ }
351
+
352
+ /* Timeline ruler */
353
+ .timeline-ruler {
354
+ height: 30px;
355
+ background: #2d2d2d;
356
+ border-bottom: 1px solid #404040;
357
+ position: relative;
358
+ overflow: hidden;
359
+ margin-left: 120px; /* 向右移动track-header的宽度 */
360
+ }
361
+
362
+ .timeline-ruler div {
363
+ position: absolute;
364
+ top: 5px;
365
+ font-size: 0.7rem;
366
+ color: #999999;
367
+ font-family: 'Monaco', 'Menlo', monospace;
368
+ }
369
+
370
+ /* Playback indicator */
371
+ .playback-indicator {
372
+ position: absolute;
373
+ top: 0;
374
+ left: 0;
375
+ width: 2px;
376
+ height: 100%;
377
+ background: #ff4444;
378
+ z-index: 1000;
379
+ pointer-events: auto;
380
+ display: block;
381
+ cursor: ew-resize;
382
+ }
383
+
384
+ /* Timeline tracks */
385
+ .timeline-tracks {
386
+ flex: 1;
387
+ overflow-y: auto;
388
+ overflow-x: auto; /* 恢复整体横向滚动 */
389
+ position: relative;
390
+ }
391
+
392
+ .track-container {
393
+ display: flex;
394
+ border-bottom: 1px solid #333333;
395
+ min-height: 60px;
396
+ position: relative;
397
+ }
398
+
399
+ .track-header {
400
+ width: 120px;
401
+ background: #252525;
402
+ border-right: 1px solid #404040;
403
+ display: flex;
404
+ align-items: center;
405
+ padding: 0.5rem;
406
+ font-size: 0.8rem;
407
+ font-weight: 500;
408
+ color: #cccccc;
409
+ position: sticky; /* 固定在左侧 */
410
+ left: 0;
411
+ z-index: 10; /* 确保在内容之上 */
412
+ flex-shrink: 0; /* 防止header被压缩 */
413
+ }
414
+
415
+ .track-content {
416
+ flex: 1;
417
+ background: #1a1a1a;
418
+ position: relative;
419
+ min-height: 60px;
420
+ /* 移除独立滚动,让所有轨道一起滚动 */
421
+ }
422
+
423
+ /* Timeline clips */
424
+ .timeline-clip {
425
+ position: absolute;
426
+ top: 5px;
427
+ height: 50px;
428
+ background: #0066cc;
429
+ border: 1px solid #0052a3;
430
+ border-radius: 4px;
431
+ color: white;
432
+ font-size: 0.75rem;
433
+ padding: 0.25rem 0.5rem;
434
+ cursor: move;
435
+ user-select: none;
436
+ display: flex;
437
+ align-items: center;
438
+ overflow: hidden;
439
+ white-space: nowrap;
440
+ text-overflow: ellipsis;
441
+ transition: all 0.2s;
442
+ }
443
+
444
+ .timeline-clip:hover {
445
+ background: #0077dd;
446
+ border-color: #0066cc;
447
+ transform: translateY(-1px);
448
+ box-shadow: 0 2px 8px rgba(0, 102, 204, 0.3);
449
+ }
450
+
451
+ .timeline-clip.selected {
452
+ background: #ff6b35;
453
+ border-color: #e55a2b;
454
+ box-shadow: 0 0 0 2px rgba(255, 107, 53, 0.5);
455
+ }
456
+
457
+ /* Track type specific colors */
458
+ .timeline-clip.video {
459
+ background: #0066cc;
460
+ border-color: #0052a3;
461
+ }
462
+
463
+ .timeline-clip.audio {
464
+ background: #28a745;
465
+ border-color: #1e7e34;
466
+ }
467
+
468
+ .timeline-clip.bgm {
469
+ background: #6f42c1;
470
+ border-color: #5a32a3;
471
+ }
472
+
473
+ .timeline-clip.voice {
474
+ background: #fd7e14;
475
+ border-color: #e8690b;
476
+ }
477
+
478
+ .timeline-clip.subtitle {
479
+ background: #ffc107;
480
+ border-color: #e0a800;
481
+ color: #000000;
482
+ }
483
+
484
+ /* Right properties panel */
485
+ .properties-panel {
486
+ width: 300px;
487
+ background: #252525;
488
+ border-left: 1px solid #404040;
489
+ display: flex;
490
+ flex-direction: column;
491
+ overflow: hidden;
492
+ }
493
+
494
+ .properties-header {
495
+ padding: 1rem;
496
+ border-bottom: 1px solid #404040;
497
+ background: #2d2d2d;
498
+ }
499
+
500
+ .properties-header h3 {
501
+ font-size: 1rem;
502
+ font-weight: 600;
503
+ }
504
+
505
+ .properties-content {
506
+ flex: 1;
507
+ overflow-y: auto;
508
+ padding: 1rem;
509
+ }
510
+
511
+ .no-selection {
512
+ text-align: center;
513
+ color: #666666;
514
+ font-style: italic;
515
+ margin-top: 2rem;
516
+ }
517
+
518
+ .property-group {
519
+ margin-bottom: 1.5rem;
520
+ }
521
+
522
+ .property-group h4 {
523
+ font-size: 0.9rem;
524
+ font-weight: 600;
525
+ margin-bottom: 0.75rem;
526
+ color: #cccccc;
527
+ border-bottom: 1px solid #404040;
528
+ padding-bottom: 0.25rem;
529
+ }
530
+
531
+ .property-item {
532
+ margin-bottom: 0.75rem;
533
+ }
534
+
535
+ .property-label {
536
+ display: block;
537
+ font-size: 0.8rem;
538
+ color: #cccccc;
539
+ margin-bottom: 0.25rem;
540
+ font-weight: 500;
541
+ }
542
+
543
+ .property-input {
544
+ width: 100%;
545
+ background: #1e1e1e;
546
+ border: 1px solid #404040;
547
+ color: #ffffff;
548
+ padding: 0.5rem;
549
+ border-radius: 4px;
550
+ font-size: 0.85rem;
551
+ transition: border-color 0.2s;
552
+ }
553
+
554
+ .property-input:focus {
555
+ outline: none;
556
+ border-color: #0066cc;
557
+ box-shadow: 0 0 0 2px rgba(0, 102, 204, 0.2);
558
+ }
559
+
560
+ .property-input[readonly] {
561
+ background: #2d2d2d;
562
+ color: #999999;
563
+ }
564
+
565
+ /* Range inputs */
566
+ .property-input[type="range"] {
567
+ -webkit-appearance: none;
568
+ height: 6px;
569
+ background: #404040;
570
+ border-radius: 3px;
571
+ padding: 0;
572
+ }
573
+
574
+ .property-input[type="range"]::-webkit-slider-thumb {
575
+ -webkit-appearance: none;
576
+ width: 16px;
577
+ height: 16px;
578
+ background: #0066cc;
579
+ border-radius: 50%;
580
+ cursor: pointer;
581
+ }
582
+
583
+ .property-input[type="range"]::-moz-range-thumb {
584
+ width: 16px;
585
+ height: 16px;
586
+ background: #0066cc;
587
+ border-radius: 50%;
588
+ cursor: pointer;
589
+ border: none;
590
+ }
591
+
592
+ /* Scrollbars */
593
+ ::-webkit-scrollbar {
594
+ width: 8px;
595
+ height: 8px;
596
+ }
597
+
598
+ ::-webkit-scrollbar-track {
599
+ background: #1e1e1e;
600
+ }
601
+
602
+ ::-webkit-scrollbar-thumb {
603
+ background: #404040;
604
+ border-radius: 4px;
605
+ }
606
+
607
+ ::-webkit-scrollbar-thumb:hover {
608
+ background: #555555;
609
+ }
610
+
611
+ /* Drag and drop states */
612
+ .drag-over {
613
+ background: rgba(0, 102, 204, 0.1) !important;
614
+ border: 2px dashed #0066cc !important;
615
+ }
616
+
617
+ .dragging {
618
+ opacity: 0.5;
619
+ }
620
+
621
+ /* Responsive adjustments */
622
+ @media (max-width: 1200px) {
623
+ .assets-panel {
624
+ width: 240px;
625
+ }
626
+
627
+ .properties-panel {
628
+ width: 260px;
629
+ }
630
+ }
631
+
632
+ @media (max-width: 900px) {
633
+ .assets-panel {
634
+ width: 200px;
635
+ }
636
+
637
+ .properties-panel {
638
+ width: 220px;
639
+ }
640
+
641
+ .track-header {
642
+ width: 100px;
643
+ font-size: 0.75rem;
644
+ }
645
+ }
646
+
647
+ /* Animation keyframes */
648
+ @keyframes slideIn {
649
+ from {
650
+ transform: translateX(100%);
651
+ }
652
+ to {
653
+ transform: translateX(0);
654
+ }
655
+ }
656
+
657
+ @keyframes fadeIn {
658
+ from {
659
+ opacity: 0;
660
+ }
661
+ to {
662
+ opacity: 1;
663
+ }
664
+ }
665
+
666
+ /* Toast notifications */
667
+ .toast {
668
+ animation: slideIn 0.3s ease-out;
669
+ }
670
+
671
+ /* Loading states */
672
+ .loading {
673
+ opacity: 0.6;
674
+ pointer-events: none;
675
+ }
676
+
677
+ .loading::after {
678
+ content: '';
679
+ position: absolute;
680
+ top: 50%;
681
+ left: 50%;
682
+ width: 20px;
683
+ height: 20px;
684
+ margin: -10px 0 0 -10px;
685
+ border: 2px solid #404040;
686
+ border-top-color: #0066cc;
687
+ border-radius: 50%;
688
+ animation: spin 1s linear infinite;
689
+ }
690
+
691
+ @keyframes spin {
692
+ to {
693
+ transform: rotate(360deg);
694
+ }
695
+ }
@@ -175,7 +175,7 @@ class TimelineEditorServer {
175
175
  async serveIndexPage(res) {
176
176
  try {
177
177
  // 尝试读取 public/index.html 文件
178
- const publicDir = (0, path_1.join)(__dirname, '..', '..', 'src', 'timeline-editor', 'public');
178
+ const publicDir = (0, path_1.join)(__dirname, '..', '..', 'dist', 'timeline-editor', 'public');
179
179
  const indexPath = (0, path_1.join)(publicDir, 'index.html');
180
180
  if ((0, fs_1.existsSync)(indexPath)) {
181
181
  const html = await (0, promises_1.readFile)(indexPath, 'utf-8');
@@ -325,7 +325,7 @@ class TimelineEditorServer {
325
325
  }
326
326
  else {
327
327
  // 其他静态文件从 public 目录提供服务
328
- const publicDir = (0, path_1.join)(__dirname, '..', '..', 'src', 'timeline-editor', 'public');
328
+ const publicDir = (0, path_1.join)(__dirname, '..', '..', 'dist', 'timeline-editor', 'public');
329
329
  filePath = (0, path_1.join)(publicDir, relativePath);
330
330
  }
331
331
  if (!(0, fs_1.existsSync)(filePath)) {