fablecut 1.13.0 → 1.15.0
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/CLAUDE.md +802 -16
- package/README.md +71 -7
- package/analyze.js +161 -9
- package/app.js +3905 -258
- package/comp.js +195 -0
- package/delivery.js +779 -0
- package/edit-ops.js +50 -18
- package/export-jobs.js +9 -5
- package/frame-cache.js +49 -0
- package/frame-stats.js +267 -0
- package/index.html +282 -72
- package/library/README.md +2 -0
- package/library/elements/logo-placeholder.svg +12 -0
- package/mcp-server.js +324 -656
- package/media-lib.js +287 -0
- package/media-probe.js +88 -0
- package/motion.js +803 -0
- package/package.json +1 -1
- package/paths.js +33 -3
- package/project-ops.js +1290 -0
- package/proxy.js +180 -0
- package/server.js +517 -15
- package/style.css +534 -20
- package/templates.js +576 -0
package/index.html
CHANGED
|
@@ -55,8 +55,21 @@
|
|
|
55
55
|
<div class="bin-tabs" id="binTabs">
|
|
56
56
|
<button type="button" data-tab="project" class="on" title="Media used by this project — right-click for New folder">Project</button>
|
|
57
57
|
<button type="button" data-tab="elements" title="Overlay art from library/elements">Elements</button>
|
|
58
|
-
<button type="button" data-tab="sfx" title="Sound effects from library/sfx">
|
|
58
|
+
<button type="button" data-tab="sfx" title="Sound effects from library/sfx">SFX</button>
|
|
59
59
|
<button type="button" data-tab="svg" title="Vector animations from library/svg">SVG</button>
|
|
60
|
+
<button type="button" data-tab="shapes" title="Shape layers and null objects">Shapes</button>
|
|
61
|
+
<button type="button" data-tab="templates" title="Lower thirds, logo animations and social layouts — with fields you edit in the Inspector">Templates</button>
|
|
62
|
+
</div>
|
|
63
|
+
<div class="bin-tools" id="binTools">
|
|
64
|
+
<input type="search" id="binSearch" class="bin-search" placeholder="Search name, #tag, codec, 4k…" aria-label="Search the Project bin" spellcheck="false" autocomplete="off">
|
|
65
|
+
<select id="binFilter" class="bin-filter" title="Show only…" aria-label="Show"></select>
|
|
66
|
+
<select id="binSort" class="bin-sort" title="Sort by" aria-label="Sort by">
|
|
67
|
+
<option value="name">Name</option><option value="kind">Kind</option><option value="duration">Duration</option>
|
|
68
|
+
<option value="resolution">Resolution</option><option value="fps">Frame rate</option><option value="codec">Codec</option>
|
|
69
|
+
<option value="audio">Audio channels</option><option value="size">File size</option><option value="usage">Times used</option>
|
|
70
|
+
</select>
|
|
71
|
+
<button type="button" class="btn tiny" id="binSortDir" title="Ascending — click for descending">↑</button>
|
|
72
|
+
<button type="button" class="btn tiny" id="binViewBtn" title="List view: metadata columns">☰</button>
|
|
60
73
|
</div>
|
|
61
74
|
<input type="file" id="fileInput" class="sr-only" multiple accept="video/*,audio/*,image/*,.mp4,.mov,.webm,.mkv,.mp3,.wav,.m4a,.png,.jpg,.jpeg,.gif,.webp,.svg">
|
|
62
75
|
<div class="bin-list" id="binList">
|
|
@@ -93,6 +106,7 @@
|
|
|
93
106
|
<button class="btn tiny toggle" id="btnExportFrame" title="Toggle export frame overlay (drag handle to reframe)">⬒ Frame</button>
|
|
94
107
|
<button type="button" class="btn tiny toggle hidden" id="btnExportFrameDim" aria-pressed="true" title="Lights off — crop to the export frame"><svg class="ico" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"><g class="ef-bulb-rays" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round"><path d="M8 .4v1.05M1.7 3.45l.85.65M14.3 3.45l-.85.65"/></g><path class="ef-bulb-glass" fill="none" stroke="currentColor" stroke-width="1.55" stroke-linejoin="round" d="M8 1.7A4.1 4.1 0 0 0 3.9 5.8c0 1.62.86 2.72 1.8 3.5.38.32.62.68.62 1.15v.35h4.36v-.35c0-.47.24-.83.62-1.15.94-.78 1.8-1.88 1.8-3.5A4.1 4.1 0 0 0 8 1.7z"/><path fill="none" stroke="currentColor" stroke-width="1.45" stroke-linecap="square" d="M6.25 12.85h3.5M6.7 14.35h2.6"/></svg></button>
|
|
95
108
|
<button class="btn tiny toggle" id="btnGuides" title="Toggle safe-area guides">▦ Safe</button>
|
|
109
|
+
<button class="btn tiny toggle proxy-btn" id="btnProxy" title="Play proxies while editing (export always uses the originals)">Proxy</button>
|
|
96
110
|
<span class="dim" id="monitorRes"></span>
|
|
97
111
|
</span>
|
|
98
112
|
</div>
|
|
@@ -195,6 +209,7 @@
|
|
|
195
209
|
<!-- ══════════ TIMELINE ══════════ -->
|
|
196
210
|
<section class="panel timeline-panel" id="timelinePanel">
|
|
197
211
|
<div class="timeline-toolbar">
|
|
212
|
+
<span class="comp-crumb hidden" id="compCrumb" aria-label="Open composition"></span>
|
|
198
213
|
<button class="btn tiny hidden" id="btnTrimIO" title="Trim clips to IN/OUT (⇧T)"><svg class="ico" viewBox="0 0 16 16" width="13" height="13" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-width="1.85" stroke-linecap="square" d="M1.25 4.5H12M4.5 1.25V12M4.5 12H14.75M12 4.5V14.75"/></svg> Trim</button>
|
|
199
214
|
<button class="btn tiny toggle hidden" id="btnWorkAreaPlay" title="Limit playback to IN/OUT (Home/End jump to markers; playhead outside = override)"><svg class="ico" viewBox="0 0 16 16" width="13" height="13" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-width="1.85" stroke-linecap="square" stroke-linejoin="miter" d="M1.5 2.5V13.5M14.5 2.5V13.5M4.25 8H11.75M9.35 5.6L12 8L9.35 10.4"/></svg> Limit</button>
|
|
200
215
|
<span class="tool-seg" role="group" aria-label="Edit tool"><button type="button" class="btn tiny on" data-edit-tool="select" aria-pressed="true" title="Selection tool (V) — move and trim clips"><svg class="ico" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"><path fill="currentColor" d="M4 1.5v11.2l3-2.9 1.9 4.6 1.8-.8-1.9-4.4h4.2z"/></svg></button><button type="button" class="btn tiny" data-edit-tool="ripple" aria-pressed="false" title="Ripple edit (B) — drag a clip edge; everything after it moves with it"><svg class="ico" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M5 2.5v11M5 8h8.5M11 5.5 13.5 8 11 10.5"/></svg></button><button type="button" class="btn tiny" data-edit-tool="roll" aria-pressed="false" title="Rolling edit (R) — drag a cut; the clips on both sides trim, nothing else moves"><svg class="ico" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M8 2v12M1.5 8h4M10.5 8h4M3.5 6 1.5 8l2 2M12.5 6l2 2-2 2"/></svg></button><button type="button" class="btn tiny" data-edit-tool="slip" aria-pressed="false" title="Slip (Y) — drag a clip to change which part of the source it shows"><svg class="ico" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"><path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M2.5 3v10M13.5 3v10M5 8h6M6.8 6.2 5 8l1.8 1.8M9.2 6.2 11 8l-1.8 1.8"/></svg></button><button type="button" class="btn tiny" data-edit-tool="slide" aria-pressed="false" title="Slide (U) — drag a clip along the track; its neighbours trim to make room"><svg class="ico" viewBox="0 0 16 16" width="14" height="14" aria-hidden="true"><rect fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" x="5" y="4" width="6" height="8" rx="1"/><path fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" d="M1 8h2.5M12.5 8H15M2.3 6.7 1 8l1.3 1.3M13.7 6.7 15 8l-1.3 1.3"/></svg></button></span>
|
|
@@ -255,8 +270,9 @@
|
|
|
255
270
|
|
|
256
271
|
<!-- ══════════ EXPORT SETUP ══════════ -->
|
|
257
272
|
<div class="overlay hidden" id="exportSetup">
|
|
258
|
-
<div class="dialog">
|
|
259
|
-
<h2>Export</h2>
|
|
273
|
+
<div class="dialog export-dialog" role="dialog" aria-modal="true" aria-labelledby="exportSetupTitle">
|
|
274
|
+
<h2 id="exportSetupTitle">Export</h2>
|
|
275
|
+
<div class="export-body">
|
|
260
276
|
<div class="export-profile-row" id="exportRangeRow">
|
|
261
277
|
<label class="export-profile-label" for="exportRangeSel">Range</label>
|
|
262
278
|
<select class="export-profile-sel" id="exportRangeSel" aria-describedby="exportRangeNote">
|
|
@@ -273,11 +289,102 @@
|
|
|
273
289
|
<input type="radio" name="engine" id="engineRealtime">
|
|
274
290
|
<span><b>WebCodecs (HW encode)</b><br><span class="dim" id="engineWebCodecsNote">Frame-accurate. Browser encodes H.264; server muxes. Needs a modern Chromium and ffmpeg.</span></span>
|
|
275
291
|
</label>
|
|
276
|
-
<div class="export-profile-row" id="exportProfileRow">
|
|
277
|
-
<
|
|
292
|
+
<div class="export-profile-row dlv" id="exportProfileRow">
|
|
293
|
+
<div class="dlv-preset-line">
|
|
294
|
+
<label class="export-profile-label" for="exportProfileSel">Preset</label>
|
|
295
|
+
<span class="dlv-preset-actions">
|
|
296
|
+
<button type="button" class="btn tiny" id="dlvSaveBtn" title="Save these settings as a preset for every project">Save preset…</button>
|
|
297
|
+
<button type="button" class="btn tiny hidden" id="dlvDeleteBtn" title="Delete this saved preset">Delete</button>
|
|
298
|
+
</span>
|
|
299
|
+
</div>
|
|
278
300
|
<select class="export-profile-sel" id="exportProfileSel" aria-describedby="exportProfileNote exportProfileHint"></select>
|
|
301
|
+
<div class="dlv-save-row hidden" id="dlvSaveRow">
|
|
302
|
+
<input type="text" id="dlvSaveName" maxlength="60" placeholder="Preset name, e.g. Client 4K" aria-label="Preset name">
|
|
303
|
+
<button type="button" class="btn tiny primary" id="dlvSaveOk">Save</button>
|
|
304
|
+
<button type="button" class="btn tiny" id="dlvSaveCancel">Cancel</button>
|
|
305
|
+
</div>
|
|
279
306
|
<p class="dim export-profile-note" id="exportProfileNote"></p>
|
|
280
307
|
<p class="dim export-profile-hint" id="exportProfileHint"></p>
|
|
308
|
+
<div class="dlv-body" id="dlvBody">
|
|
309
|
+
<details class="dlv-sec" id="dlvVideoSec" open>
|
|
310
|
+
<summary>Video</summary>
|
|
311
|
+
<div class="dlv-grid">
|
|
312
|
+
<label class="dlv-f">Resolution<select id="dlvRes"></select></label>
|
|
313
|
+
<label class="dlv-f dlv-wh hidden" id="dlvWhField">Width × height
|
|
314
|
+
<span class="dlv-wh-in"><input type="number" id="dlvW" min="16" max="8192" step="2" aria-label="Width"><span>×</span><input type="number" id="dlvH" min="16" max="8192" step="2" aria-label="Height"></span></label>
|
|
315
|
+
<label class="dlv-f" id="dlvReframeField">Reframe<select id="dlvReframe">
|
|
316
|
+
<option value="fill">Fill (crop to fit)</option>
|
|
317
|
+
<option value="fit">Fit (black bars)</option>
|
|
318
|
+
<option value="stretch">Stretch</option>
|
|
319
|
+
</select></label>
|
|
320
|
+
<label class="dlv-f">Frame rate<select id="dlvFps"></select></label>
|
|
321
|
+
<label class="dlv-f">Codec<select id="dlvCodec"></select></label>
|
|
322
|
+
<label class="dlv-f" id="dlvEncoderField">Encoder<select id="dlvEncoder"></select></label>
|
|
323
|
+
<label class="dlv-f" id="dlvProfileField">Profile<select id="dlvProfile"></select></label>
|
|
324
|
+
<label class="dlv-f" id="dlvRateField">Rate control<select id="dlvRate">
|
|
325
|
+
<option value="crf">CRF (constant quality)</option>
|
|
326
|
+
<option value="vbr">VBR (variable bitrate)</option>
|
|
327
|
+
<option value="cbr">CBR (constant bitrate)</option>
|
|
328
|
+
</select></label>
|
|
329
|
+
<label class="dlv-f" id="dlvCrfField">CRF<input type="number" id="dlvCrf" min="0" max="63" step="1" title="Lower = better quality, bigger file"></label>
|
|
330
|
+
<label class="dlv-f" id="dlvBitrateField">Bitrate (Mb/s)<input type="number" id="dlvBitrate" min="0.1" max="400" step="0.5"></label>
|
|
331
|
+
<label class="dlv-f" id="dlvMaxrateField">Max rate (Mb/s)<input type="number" id="dlvMaxrate" min="0.1" max="800" step="0.5" placeholder="none"></label>
|
|
332
|
+
<label class="dlv-f" id="dlvKeyintField">Keyframe every (s)<input type="number" id="dlvKeyint" min="0" max="20" step="0.5" title="0 = the encoder's default"></label>
|
|
333
|
+
<label class="dlv-f" id="dlvSpeedField">Encoder speed<select id="dlvSpeed">
|
|
334
|
+
<option value="fast">Fast</option>
|
|
335
|
+
<option value="balanced">Balanced</option>
|
|
336
|
+
<option value="best">Best quality (slow)</option>
|
|
337
|
+
</select></label>
|
|
338
|
+
<label class="dlv-f">Pixel format<select id="dlvPixFmt"></select></label>
|
|
339
|
+
<label class="dlv-f">Color<select id="dlvColor"></select></label>
|
|
340
|
+
<label class="dlv-f">Container<select id="dlvContainer"></select></label>
|
|
341
|
+
</div>
|
|
342
|
+
</details>
|
|
343
|
+
<details class="dlv-sec" id="dlvAudioSec" open>
|
|
344
|
+
<summary>Audio</summary>
|
|
345
|
+
<div class="dlv-grid">
|
|
346
|
+
<label class="dlv-f">Codec<select id="dlvACodec"></select></label>
|
|
347
|
+
<label class="dlv-f" id="dlvABitrateField">Bitrate (kb/s)<select id="dlvABitrate"></select></label>
|
|
348
|
+
<label class="dlv-f" id="dlvARateField">Sample rate<select id="dlvARate">
|
|
349
|
+
<option value="48000">48 kHz</option>
|
|
350
|
+
<option value="44100">44.1 kHz</option>
|
|
351
|
+
</select></label>
|
|
352
|
+
<label class="dlv-f" id="dlvAChField">Channels<select id="dlvACh">
|
|
353
|
+
<option value="2">Stereo</option>
|
|
354
|
+
<option value="1">Mono</option>
|
|
355
|
+
</select></label>
|
|
356
|
+
<label class="dlv-f" id="dlvLoudField">Loudness<select id="dlvLoud" title="Turn the whole mix up or down to an integrated loudness, with a true-peak limiter"></select></label>
|
|
357
|
+
<label class="dlv-f" id="dlvTpField">True peak (dBTP)<input type="number" id="dlvTp" min="-9" max="0" step="0.5"></label>
|
|
358
|
+
</div>
|
|
359
|
+
</details>
|
|
360
|
+
<details class="dlv-sec" id="dlvFileSec">
|
|
361
|
+
<summary>File name and metadata</summary>
|
|
362
|
+
<label class="dlv-f dlv-wide">File name
|
|
363
|
+
<input type="text" id="dlvFilename" maxlength="160" spellcheck="false" aria-describedby="dlvFilePreview dlvTokens"></label>
|
|
364
|
+
<p class="dim dlv-file-preview" id="dlvFilePreview"></p>
|
|
365
|
+
<p class="dim dlv-tokens" id="dlvTokens"></p>
|
|
366
|
+
<div class="dlv-grid dlv-meta">
|
|
367
|
+
<label class="dlv-f">Title<input type="text" id="dlvMetaTitle" maxlength="300"></label>
|
|
368
|
+
<label class="dlv-f">Artist / author<input type="text" id="dlvMetaArtist" maxlength="300"></label>
|
|
369
|
+
<label class="dlv-f">Copyright<input type="text" id="dlvMetaCopyright" maxlength="300"></label>
|
|
370
|
+
<label class="dlv-f">Date<input type="text" id="dlvMetaDate" maxlength="40" placeholder="2026-10-18"></label>
|
|
371
|
+
<label class="dlv-f dlv-wide">Description<textarea id="dlvMetaDescription" rows="2" maxlength="2000"></textarea></label>
|
|
372
|
+
<label class="dlv-f dlv-wide">Keywords<input type="text" id="dlvMetaKeywords" maxlength="300" placeholder="comma, separated"></label>
|
|
373
|
+
</div>
|
|
374
|
+
</details>
|
|
375
|
+
<p class="dim dlv-summary" id="dlvSummary"></p>
|
|
376
|
+
</div>
|
|
377
|
+
</div>
|
|
378
|
+
<div class="export-profile-row dlv-batch" id="dlvBatch">
|
|
379
|
+
<div class="dlv-preset-line">
|
|
380
|
+
<span class="export-profile-label">Batch outputs <span class="dim" id="dlvBatchCount"></span></span>
|
|
381
|
+
<span class="dlv-preset-actions">
|
|
382
|
+
<button type="button" class="btn tiny" id="dlvBatchAdd" title="Add the settings above to this project's outputs">+ Add these settings</button>
|
|
383
|
+
<button type="button" class="btn tiny" id="dlvBatchTypical" title="Master, YouTube 1080p, Reel 1080×1920, Square 1080 and a 720p preview">+ Typical set</button>
|
|
384
|
+
</span>
|
|
385
|
+
</div>
|
|
386
|
+
<p class="dim export-profile-hint" id="dlvBatchHint">One render, several files: every checked output is encoded from the same frames. Saved with the project.</p>
|
|
387
|
+
<ul class="dlv-batch-list" id="dlvBatchList"></ul>
|
|
281
388
|
</div>
|
|
282
389
|
<div class="export-wc-opts hidden" id="exportWcOpts">
|
|
283
390
|
<label class="export-wc-field" for="exportWcBitrate">Bitrate
|
|
@@ -302,14 +409,33 @@
|
|
|
302
409
|
</label>
|
|
303
410
|
<p class="dim export-wc-hint">WebCodecs has no CRF — quality is driven by bitrate. VBR spends bits on hard frames; CBR holds a steady rate.</p>
|
|
304
411
|
</div>
|
|
412
|
+
<div class="export-track-warn hidden" id="dlvWarn" role="status"></div>
|
|
305
413
|
<div class="export-track-warn hidden" id="exportTrackWarn" role="status"></div>
|
|
414
|
+
</div>
|
|
306
415
|
<div class="dialog-actions">
|
|
416
|
+
<button class="btn dlv-queue-open" id="btnOpenQueue" title="Show the export queue">Queue</button>
|
|
307
417
|
<button class="btn" id="btnCancelSetup">Cancel</button>
|
|
418
|
+
<button class="btn" id="btnBatchExport" title="Queue every checked batch output and start">Export checked</button>
|
|
419
|
+
<button class="btn" id="btnQueueExport" title="Add these settings to the export queue">Add to queue</button>
|
|
308
420
|
<button class="btn primary" id="btnStartExport">Export</button>
|
|
309
421
|
</div>
|
|
310
422
|
</div>
|
|
311
423
|
</div>
|
|
312
424
|
|
|
425
|
+
<!-- ══════════ EXPORT QUEUE ══════════ -->
|
|
426
|
+
<div class="overlay hidden" id="exportQueue">
|
|
427
|
+
<div class="dialog export-dialog" role="dialog" aria-modal="true" aria-labelledby="exportQueueTitle">
|
|
428
|
+
<h2 id="exportQueueTitle">Export queue</h2>
|
|
429
|
+
<p class="dim" id="exportQueueNote"></p>
|
|
430
|
+
<div class="export-body"><ol class="xq-list" id="exportQueueList"></ol></div>
|
|
431
|
+
<div class="dialog-actions">
|
|
432
|
+
<button class="btn" id="btnQueueClear">Clear finished</button>
|
|
433
|
+
<button class="btn" id="btnQueueClose">Close</button>
|
|
434
|
+
<button class="btn primary" id="btnQueueStart">Start</button>
|
|
435
|
+
</div>
|
|
436
|
+
</div>
|
|
437
|
+
</div>
|
|
438
|
+
|
|
313
439
|
<!-- ══════════ EXPORT OVERLAY ══════════ -->
|
|
314
440
|
<div class="overlay hidden" id="exportOverlay">
|
|
315
441
|
<div class="dialog">
|
|
@@ -342,73 +468,152 @@
|
|
|
342
468
|
<!-- ══════════ HELP OVERLAY ══════════ -->
|
|
343
469
|
<div class="overlay hidden" id="helpOverlay">
|
|
344
470
|
<div class="dialog help">
|
|
345
|
-
<
|
|
346
|
-
|
|
347
|
-
<
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
<
|
|
352
|
-
<
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
<
|
|
365
|
-
<
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
<
|
|
373
|
-
<
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
<
|
|
389
|
-
<
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
<
|
|
398
|
-
<
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
<
|
|
411
|
-
|
|
471
|
+
<div class="help-head">
|
|
472
|
+
<h2>Keyboard shortcuts</h2>
|
|
473
|
+
<input type="search" id="helpFilter" class="help-filter" placeholder="Filter — e.g. marker, trim, mask" aria-label="Filter shortcuts" autocomplete="off" spellcheck="false">
|
|
474
|
+
</div>
|
|
475
|
+
<div class="keys-cols" id="helpKeys">
|
|
476
|
+
<section class="keys-sec">
|
|
477
|
+
<h3>Playback</h3>
|
|
478
|
+
<table class="keys">
|
|
479
|
+
<tr><td><kbd>Space</kbd></td><td>Play / pause (Source or Program — whichever is active)</td></tr>
|
|
480
|
+
<tr><td><kbd>J</kbd> <kbd>K</kbd> <kbd>L</kbd></td><td>Shuttle — <kbd>L</kbd> plays forward, <kbd>J</kbd> in reverse (silent); tap again for 1.5× · 2× · 4×, the other key turns around; <kbd>K</kbd> stops</td></tr>
|
|
481
|
+
<tr><td><kbd>K</kbd>+<kbd>J</kbd> / <kbd>K</kbd>+<kbd>L</kbd></td><td>Hold <kbd>K</kbd> and tap to step one frame; hold both to crawl at ¼ speed</td></tr>
|
|
482
|
+
<tr><td><kbd>←</kbd> <kbd>→</kbd></td><td>Step 1 frame (<kbd>⇧</kbd> = 1 second)</td></tr>
|
|
483
|
+
<tr><td><kbd>↑</kbd> / <kbd>↓</kbd></td><td>Jump to previous / next cut (selected clip In then Out; no selection → targeted tracks). Source monitor: In / Out marks</td></tr>
|
|
484
|
+
<tr><td><kbd>Home</kbd> / <kbd>End</kbd></td><td>Jump to start / end</td></tr>
|
|
485
|
+
<tr><td><kbd>0</kbd>–<kbd>9</kbd> / click timecode</td><td>Type a time: <code>01:15:00</code>, packed <code>1500</code> (= 15 s), <code>+30</code> / <code>-1:00</code> to offset, <code>12.5</code> seconds. Click IN / OUT readouts to type those too</td></tr>
|
|
486
|
+
<tr><td>Limit (toolbar)</td><td>Play stops at OUT; Home / End use IN / OUT</td></tr>
|
|
487
|
+
</table>
|
|
488
|
+
</section>
|
|
489
|
+
<section class="keys-sec">
|
|
490
|
+
<h3>Source monitor</h3>
|
|
491
|
+
<table class="keys">
|
|
492
|
+
<tr><td>Dbl-click bin / clip</td><td>Load into the Source monitor</td></tr>
|
|
493
|
+
<tr><td><kbd>,</kbd></td><td>Insert Source In→Out at the timeline playhead (ripples later clips)</td></tr>
|
|
494
|
+
<tr><td><kbd>.</kbd></td><td>Replace — overwrite at the playhead, or apply new Source In / Out to a timeline-loaded clip (ripples if the duration changes)</td></tr>
|
|
495
|
+
</table>
|
|
496
|
+
</section>
|
|
497
|
+
<section class="keys-sec">
|
|
498
|
+
<h3>Editing</h3>
|
|
499
|
+
<table class="keys">
|
|
500
|
+
<tr><td><kbd>V</kbd> <kbd>B</kbd> <kbd>R</kbd> <kbd>Y</kbd> <kbd>U</kbd></td><td>Tools: Selection · Ripple edit (drag an edge, the rest follows) · Rolling edit (drag a cut) · Slip (change the source under a clip) · Slide (move a clip, neighbours trim)</td></tr>
|
|
501
|
+
<tr><td><kbd>S</kbd></td><td>Split clip(s) at the playhead (selection, else targeted tracks)</td></tr>
|
|
502
|
+
<tr><td><kbd>[</kbd> / <kbd>]</kbd></td><td>Trim selected in / out to the playhead</td></tr>
|
|
503
|
+
<tr><td><kbd>Del</kbd></td><td>Delete selected clip(s), or clear the focused transition</td></tr>
|
|
504
|
+
<tr><td><kbd>⇧</kbd>+<kbd>Del</kbd></td><td>Ripple delete — remove the selection and close the gap on targeted tracks</td></tr>
|
|
505
|
+
<tr><td><kbd>G</kbd></td><td>Find the next shared gap (wraps; respects IN / OUT)</td></tr>
|
|
506
|
+
<tr><td><kbd>⇧</kbd>+<kbd>G</kbd></td><td>Close the gap at the playhead (targeted tracks)</td></tr>
|
|
507
|
+
<tr><td><kbd>Alt</kbd>+<kbd>T</kbd></td><td>Add a transition at the playhead (in / out by half)</td></tr>
|
|
508
|
+
<tr><td><kbd>⇧</kbd>+<kbd>E</kbd></td><td>Disable / enable selected clip(s) — hidden from preview and export</td></tr>
|
|
509
|
+
<tr><td><kbd>Ctrl/Cmd</kbd>+<kbd>L</kbd></td><td>Unlink / link video and its audio</td></tr>
|
|
510
|
+
<tr><td><kbd>Ctrl</kbd>+<kbd>Z</kbd> / <kbd>Ctrl</kbd>+<kbd>⇧</kbd>+<kbd>Z</kbd></td><td>Undo / redo (also <kbd>Ctrl</kbd>+<kbd>Y</kbd>)</td></tr>
|
|
511
|
+
</table>
|
|
512
|
+
</section>
|
|
513
|
+
<section class="keys-sec">
|
|
514
|
+
<h3>Selection</h3>
|
|
515
|
+
<table class="keys">
|
|
516
|
+
<tr><td>Drag empty area</td><td>Marquee-select clips</td></tr>
|
|
517
|
+
<tr><td><kbd>Ctrl</kbd>+click clip</td><td>Add to / remove from the selection</td></tr>
|
|
518
|
+
<tr><td><kbd>Ctrl</kbd>+<kbd>A</kbd> / <kbd>Esc</kbd></td><td>Select all / deselect</td></tr>
|
|
519
|
+
<tr><td>Right-click clip</td><td>Disable / lock / link or unlink / precompose</td></tr>
|
|
520
|
+
</table>
|
|
521
|
+
</section>
|
|
522
|
+
<section class="keys-sec">
|
|
523
|
+
<h3>IN / OUT and markers</h3>
|
|
524
|
+
<table class="keys">
|
|
525
|
+
<tr><td><kbd>I</kbd> / <kbd>O</kbd></td><td>Set Source In / Out (Source mode) or the timeline work area (Program; also bounds Export)</td></tr>
|
|
526
|
+
<tr><td><kbd>⇧</kbd>+<kbd>I</kbd> / <kbd>⇧</kbd>+<kbd>O</kbd></td><td>Clear Source or timeline IN / OUT</td></tr>
|
|
527
|
+
<tr><td><kbd>T</kbd></td><td>Split clips at the IN / OUT marks</td></tr>
|
|
528
|
+
<tr><td><kbd>⇧</kbd>+<kbd>T</kbd></td><td>Trim clips to IN / OUT (remove heads and tails)</td></tr>
|
|
529
|
+
<tr><td><kbd>;</kbd> / <kbd>'</kbd></td><td>Lift / Extract IN→OUT on targeted tracks (Extract closes the gap)</td></tr>
|
|
530
|
+
<tr><td><kbd>M</kbd></td><td>Add / remove a marker at the playhead</td></tr>
|
|
531
|
+
<tr><td><kbd>⇧</kbd>+<kbd>M</kbd> / <kbd>Alt</kbd>+<kbd>⇧</kbd>+<kbd>M</kbd></td><td>Go to the next / previous marker</td></tr>
|
|
532
|
+
<tr><td>Marker on ruler</td><td>Drag to move · click to jump · double-click or right-click to name / colour / delete · <b>Markers</b> lists them all</td></tr>
|
|
533
|
+
</table>
|
|
534
|
+
</section>
|
|
535
|
+
<section class="keys-sec">
|
|
536
|
+
<h3>Timeline view and tracks</h3>
|
|
537
|
+
<table class="keys">
|
|
538
|
+
<tr><td><kbd>+</kbd> / <kbd>-</kbd></td><td>Zoom the timeline</td></tr>
|
|
539
|
+
<tr><td><kbd>Ctrl</kbd>+wheel</td><td>Zoom at the cursor</td></tr>
|
|
540
|
+
<tr><td><kbd>Z</kbd></td><td>Zoom to the selected clip(s)</td></tr>
|
|
541
|
+
<tr><td><kbd>Alt</kbd>+<kbd>Z</kbd></td><td>Zoom to the IN–OUT work area</td></tr>
|
|
542
|
+
<tr><td><kbd>⇧</kbd>+<kbd>Z</kbd></td><td>Zoom to fit</td></tr>
|
|
543
|
+
<tr><td><kbd>N</kbd></td><td>Snapping on / off — <b>▾</b> picks targets (clip edges, playhead, markers, IN / OUT, keyframes, frame grid)</td></tr>
|
|
544
|
+
<tr><td>Click track name</td><td>Target / untarget the track — edits touch lit (targeted) tracks only</td></tr>
|
|
545
|
+
<tr><td>Track <b>S</b></td><td>Solo the track (mutes all others; click again to restore)</td></tr>
|
|
546
|
+
<tr><td>Track padlock</td><td>Lock the track — nothing on it can be edited or moved</td></tr>
|
|
547
|
+
<tr><td>Right-click track</td><td>Remove an empty track (keeps ≥1 video + ≥1 audio)</td></tr>
|
|
548
|
+
</table>
|
|
549
|
+
</section>
|
|
550
|
+
<section class="keys-sec">
|
|
551
|
+
<h3>Keyframes, presets and Inspector</h3>
|
|
552
|
+
<table class="keys">
|
|
553
|
+
<tr><td><kbd>Ctrl/Cmd</kbd>+<kbd>←</kbd> / <kbd>→</kbd></td><td>Go to the previous / next keyframe (the Inspector follows)</td></tr>
|
|
554
|
+
<tr><td><kbd>Ctrl/Cmd</kbd>+click inspector label or slider</td><td>Reset a property and clear all its keyframes</td></tr>
|
|
555
|
+
<tr><td><kbd>⇧</kbd>+click label</td><td>Reset the value at the playhead, or remove that keyframe</td></tr>
|
|
556
|
+
<tr><td>Motion → Presets</td><td>In · Out · At playhead · Loop menus key a ready-made animation onto the selected clips · <b>Save as preset</b> keeps this clip's keyframes for every project</td></tr>
|
|
557
|
+
</table>
|
|
558
|
+
</section>
|
|
559
|
+
<section class="keys-sec">
|
|
560
|
+
<h3>Audio</h3>
|
|
561
|
+
<table class="keys">
|
|
562
|
+
<tr><td>Volume line</td><td>Drag to change the level · <kbd>Ctrl/Cmd</kbd>+click adds a keyframe · <kbd>Alt</kbd>+click or double-click removes one · corner grips drag fades</td></tr>
|
|
563
|
+
<tr><td><kbd>⇧</kbd>+<kbd>D</kbd></td><td>Crossfade the audio cut next to the selected clip (or at the playhead)</td></tr>
|
|
564
|
+
</table>
|
|
565
|
+
</section>
|
|
566
|
+
<section class="keys-sec">
|
|
567
|
+
<h3>Bin, compositions and templates</h3>
|
|
568
|
+
<table class="keys">
|
|
569
|
+
<tr><td><kbd>Ctrl</kbd>+click bin</td><td>Import media files</td></tr>
|
|
570
|
+
<tr><td>Right-click <b>Project</b> tab</td><td>New folder · New composition</td></tr>
|
|
571
|
+
<tr><td>Bin search</td><td>Name, kind, codec, <code>2160p</code> or a tag; <code>#tag</code> matches tags only · <kbd>Esc</kbd> clears</td></tr>
|
|
572
|
+
<tr><td>Right-click a bin file</td><td>Find timeline instances · Media info · favorites · Tags · collections</td></tr>
|
|
573
|
+
<tr><td>☆ / uses badge on a bin file</td><td>Star it · list where it is used (click one to jump there)</td></tr>
|
|
574
|
+
<tr><td>☰ in the bin</td><td>List view with metadata columns · click a heading to sort</td></tr>
|
|
575
|
+
<tr><td>Right-click a clip</td><td><b>Reveal in project</b> — show its file in the bin</td></tr>
|
|
576
|
+
<tr><td>Right-click a bin file</td><td><b>Relink…</b> — point it at the footage where it is now · <b>Replace file…</b> — a new file for every clip that uses it</td></tr>
|
|
577
|
+
<tr><td>Right-click a bin video</td><td><b>Create proxy</b> — a light copy to edit with (right-click the Project tab for all of them) · <b>Proxy</b> above the monitor plays proxies on / off; export always uses the originals</td></tr>
|
|
578
|
+
<tr><td>Comp clip / bin comp</td><td>Double-click to open it on the timeline · drag a bin comp onto the timeline to place it · the breadcrumb above the timeline steps back out</td></tr>
|
|
579
|
+
<tr><td>Right-click clips</td><td><b>Precompose</b> — move the selection into a new comp</td></tr>
|
|
580
|
+
<tr><td><kbd>Esc</kbd> inside a comp</td><td>Back out one level (once nothing is selected)</td></tr>
|
|
581
|
+
<tr><td><b>Templates</b> tab</td><td>Drag a lower third, logo animation or social layout onto the timeline (or click +) · fill in its fields in the Inspector's <b>Template</b> section · right-click a comp → <b>Save as template</b></td></tr>
|
|
582
|
+
</table>
|
|
583
|
+
</section>
|
|
584
|
+
<section class="keys-sec">
|
|
585
|
+
<h3>Color workspace</h3>
|
|
586
|
+
<table class="keys">
|
|
587
|
+
<tr><td>Colour wheel</td><td>Drag to tint (<kbd>⇧</kbd> = fine) · double-click resets the colour · double-click a label or slider name to reset it</td></tr>
|
|
588
|
+
<tr><td>WB pick / Pick</td><td>Click the monitor to balance, to mark a colour on the curves, or to select it in a layer's qualifier · <kbd>Esc</kbd> cancels</td></tr>
|
|
589
|
+
<tr><td>Curves</td><td>Click adds a point on the curve · drag moves it · double-click removes it</td></tr>
|
|
590
|
+
<tr><td>Layer mask on monitor</td><td>Drag inside to move · handles resize · the knob rotates (<kbd>⇧</kbd> snaps to 15°) · poly / bezier: <kbd>Ctrl/Cmd</kbd>+click adds a point, double-click removes one · <b>Draw</b>: drag a free-hand outline</td></tr>
|
|
591
|
+
</table>
|
|
592
|
+
</section>
|
|
593
|
+
<section class="keys-sec">
|
|
594
|
+
<h3>Masks <span>Inspector → Masks</span></h3>
|
|
595
|
+
<table class="keys">
|
|
596
|
+
<tr><td>Pen</td><td>Click to place points, drag while placing to pull curve handles · click the first point or <kbd>Enter</kbd> closes · <kbd>Ctrl</kbd>+<kbd>Z</kbd> / <kbd>Backspace</kbd> removes the last point, <kbd>Ctrl</kbd>+<kbd>⇧</kbd>+<kbd>Z</kbd> puts it back · <kbd>Esc</kbd> cancels</td></tr>
|
|
597
|
+
<tr><td>Draw</td><td>Drag a free-hand outline — it becomes an editable bezier</td></tr>
|
|
598
|
+
<tr><td>Mask on monitor</td><td>Drag inside to move · edge handles resize · the knob rotates (<kbd>⇧</kbd> snaps to 15°) · drag a point or its handles (<kbd>Alt</kbd> breaks the pair) · <kbd>Alt</kbd>+drag a point pulls new handles · <kbd>Ctrl/Cmd</kbd>+click the outline adds a point · double-click a point removes it · <kbd>Esc</kbd> deselects</td></tr>
|
|
599
|
+
</table>
|
|
600
|
+
</section>
|
|
601
|
+
<section class="keys-sec">
|
|
602
|
+
<h3>Shapes and transforms <span>bin → Shapes · Inspector</span></h3>
|
|
603
|
+
<table class="keys">
|
|
604
|
+
<tr><td>Shape item on monitor</td><td>Drag inside to move · corners resize (<kbd>⇧</kbd> keeps the proportions) · the knob rotates (<kbd>⇧</kbd> snaps to 15°) · line / path: drag a point or its handles (<kbd>Alt</kbd> breaks the pair), <kbd>Alt</kbd>+drag a point pulls new handles · path: <kbd>Ctrl/Cmd</kbd>+click the outline adds a point, double-click a point removes it · <kbd>Esc</kbd> deselects</td></tr>
|
|
605
|
+
<tr><td>Shape / text-path pen</td><td>Click to place points, drag while placing to pull curve handles · click the first point closes the path · <kbd>Enter</kbd> keeps it open · <kbd>Ctrl</kbd>+<kbd>Z</kbd> / <kbd>Backspace</kbd> removes the last point, <kbd>Ctrl</kbd>+<kbd>⇧</kbd>+<kbd>Z</kbd> puts it back · <kbd>Esc</kbd> cancels</td></tr>
|
|
606
|
+
<tr><td>Motion path</td><td>Drag a key square to move it · drag a handle to bend the path (<kbd>Alt</kbd> breaks the pair) · <kbd>Alt</kbd>+drag a key pulls new handles · double-click a key makes it a corner again</td></tr>
|
|
607
|
+
<tr><td>Anchor ✥ Move</td><td>Drag on the monitor to move the anchor point; the picture stays put (<kbd>⇧</kbd> snaps to its centre) · <kbd>Esc</kbd> turns it off</td></tr>
|
|
608
|
+
</table>
|
|
609
|
+
</section>
|
|
610
|
+
<section class="keys-sec">
|
|
611
|
+
<h3>Tracking <span>Inspector → Tracking · a mask’s Track buttons</span></h3>
|
|
612
|
+
<table class="keys">
|
|
613
|
+
<tr><td>Track point</td><td>Click the spot to follow on the monitor — it tracks from the playhead to the clip's end · <kbd>Esc</kbd> cancels the pick, or stops a running track (what was tracked so far is kept)</td></tr>
|
|
614
|
+
</table>
|
|
615
|
+
</section>
|
|
616
|
+
<p class="help-empty hidden" id="helpEmpty">No shortcut matches that.</p>
|
|
412
617
|
</div>
|
|
413
618
|
<div class="dialog-actions"><button class="btn primary" id="btnCloseHelp">Close</button></div>
|
|
414
619
|
</div>
|
|
@@ -421,8 +626,13 @@
|
|
|
421
626
|
<script src="audio-fx.js"></script>
|
|
422
627
|
<script src="mask.js"></script>
|
|
423
628
|
<script src="tracker.js"></script>
|
|
629
|
+
<script src="motion.js"></script>
|
|
424
630
|
<script src="color.js"></script>
|
|
425
631
|
<script src="edit-ops.js"></script>
|
|
632
|
+
<script src="comp.js"></script>
|
|
633
|
+
<script src="templates.js"></script>
|
|
634
|
+
<script src="media-lib.js"></script>
|
|
635
|
+
<script src="delivery.js"></script>
|
|
426
636
|
<script src="app.js"></script>
|
|
427
637
|
</body>
|
|
428
638
|
</html>
|
package/library/README.md
CHANGED
|
@@ -10,6 +10,8 @@ place (`/library/...`), never copied into the project.
|
|
|
10
10
|
| `elements/` | Elements | overlay art: PNGs with alpha, light leaks, textures, short loops |
|
|
11
11
|
| `svg/` | SVG | vector animations authored by Claude (see CLAUDE.md conventions) |
|
|
12
12
|
| `fonts/` | (Font editor) | `.ttf .otf .woff .woff2` — auto-registered, family = file name |
|
|
13
|
+
| `presets/` | (Inspector → Motion) | saved animation presets, one `.json` each |
|
|
14
|
+
| `templates/`| Templates | saved templates, one `.json` each, after the built-in ones |
|
|
13
15
|
|
|
14
16
|
Drop free assets you find online into the matching folder — the open editor
|
|
15
17
|
refreshes the list automatically. Subfolders are allowed and listed too.
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 400" width="400" height="400">
|
|
2
|
+
<!-- A stand-in logo for the logo templates: pick your own in the template's Logo field. -->
|
|
3
|
+
<defs>
|
|
4
|
+
<linearGradient id="g" x1="0" y1="0" x2="1" y2="1">
|
|
5
|
+
<stop offset="0" stop-color="#7b6cff"/>
|
|
6
|
+
<stop offset="1" stop-color="#ff7ac8"/>
|
|
7
|
+
</linearGradient>
|
|
8
|
+
</defs>
|
|
9
|
+
<rect x="40" y="40" width="320" height="320" rx="84" fill="url(#g)"/>
|
|
10
|
+
<path d="M138 118 L138 282 L262 282" fill="none" stroke="#ffffff" stroke-width="34" stroke-linecap="round" stroke-linejoin="round"/>
|
|
11
|
+
<circle cx="258" cy="142" r="26" fill="#ffffff"/>
|
|
12
|
+
</svg>
|