From c13755e5d17b841f3320c616810c8d2994b7baad Mon Sep 17 00:00:00 2001 From: cottongin Date: Mon, 21 Sep 2026 11:05:45 -0400 Subject: [PATCH] feat: add clip management with I/O marking, timeline markers, and clip list Co-authored-by: Cursor --- src/lib/components/ClipList.svelte | 186 ++++++++++++++++++++++++++++- src/lib/components/Timeline.svelte | 60 +++++++++- src/lib/stores/clips.svelte.ts | 95 +++++++++++++++ src/lib/timeline/clipRenderer.ts | 91 ++++++++++++++ src/lib/timeline/renderer.ts | 10 +- tests/lib/stores/clips.test.ts | 77 ++++++++++++ 6 files changed, 513 insertions(+), 6 deletions(-) create mode 100644 src/lib/stores/clips.svelte.ts create mode 100644 src/lib/timeline/clipRenderer.ts create mode 100644 tests/lib/stores/clips.test.ts diff --git a/src/lib/components/ClipList.svelte b/src/lib/components/ClipList.svelte index cade62c..fb6bfce 100644 --- a/src/lib/components/ClipList.svelte +++ b/src/lib/components/ClipList.svelte @@ -1,16 +1,196 @@ + +
-
No clips yet — press I to mark in-point
+ {#if clips.length === 0} +
No clips yet — press I to mark in-point, O to mark out-point
+ {:else} +
+ CLIPS ({clips.length}) +
+ {#each clips as clip (clip.id)} +
handleSelect(clip.id)} + onkeydown={(e) => { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault(); + handleSelect(clip.id); + } + }} + > + + handleLabelEdit(clip.id, (e.target as HTMLInputElement).value)} + onclick={(e) => e.stopPropagation()} + /> + + handleTimeEdit(clip.id, 'startTime', (e.target as HTMLInputElement).value)} + onclick={(e) => e.stopPropagation()} + /> + → + + handleTimeEdit(clip.id, 'endTime', (e.target as HTMLInputElement).value)} + onclick={(e) => e.stopPropagation()} + /> + +
+ {/each} + {/if}
diff --git a/src/lib/components/Timeline.svelte b/src/lib/components/Timeline.svelte index 05c6f65..77c5d6f 100644 --- a/src/lib/components/Timeline.svelte +++ b/src/lib/components/Timeline.svelte @@ -1,10 +1,18 @@