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(() => {
+
+
+
+
|