From 517705bf557016357f25fd4935acb8e1b694c600 Mon Sep 17 00:00:00 2001 From: th Date: Wed, 22 Apr 2026 06:22:32 +0200 Subject: [PATCH] 0.8.7: duplicate track via right-click (layer / clip / script) Co-Authored-By: Claude Opus 4.7 (1M context) --- package.json | 2 +- src/components/Timeline.vue | 22 ++++++ src/devtools/tests.ts | 137 ++++++++++++++++++++++++++++++++++++ src/stores/scene.ts | 94 +++++++++++++++++++++++++ 4 files changed, 254 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 579adcc..8168baa 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "animatr", "private": true, - "version": "0.8.6", + "version": "0.8.7", "type": "module", "scripts": { "dev": "vite", diff --git a/src/components/Timeline.vue b/src/components/Timeline.vue index 976c82b..a6cb5a5 100644 --- a/src/components/Timeline.vue +++ b/src/components/Timeline.vue @@ -1998,6 +1998,17 @@ function deleteTrack() { trackMenu.value = null } +function duplicateTrackFromMenu() { + if (!trackMenu.value) return + const newId = store.duplicateTrack(trackMenu.value.trackId) + trackMenu.value = null + if (newId && store.scene.layers.some((l) => l.id === newId)) { + // Only layers have a meaningful per-track selection model; clip / + // script tracks aren't selected in the same sense. + store.selectLayer(newId) + } +} + async function renameFromMenu() { if (!trackMenu.value) return if (trackMenu.value.kind === 'group') { @@ -3043,6 +3054,17 @@ onBeforeUnmount(() => { +