From c2b81b0fb4c5dcaadf833a892a5344b8bf1ae0b0 Mon Sep 17 00:00:00 2001 From: th Date: Fri, 24 Apr 2026 16:40:36 +0200 Subject: [PATCH] 1.0.0: delete-group cascade + native-size APNG preview First stable release. Highlights in this bump: - Group context menu gains a proper danger "Delete group" entry that tears down the group AND every track it contains (layers, clip tracks, script tracks, audio tracks) along with their dependent content. "Ungroup" keeps its old meaning as a separate non-danger item, so the two operations stop being confusable. New removeTrackGroupWithChildren store action clears any selection pointing inside the group before dispatching per-kind removes. - APNG preview page now renders the export at its native pixel size: the .stage + use explicit width/height in pixels instead of a max-960 aspect-ratio box with object-fit: contain. A 4K export looks 4K; the body scrolls if the window is smaller. Co-Authored-By: Claude Opus 4.7 (1M context) --- package.json | 2 +- src/components/Timeline.vue | 16 +++- src/devtools/tests.ts | 177 +++++++++++++++++++++++++++++++++++- src/i18n/messages.ts | 1 + src/lib/apngExport.ts | 14 +-- src/stores/scene.ts | 56 ++++++++++++ src/version.ts | 2 +- 7 files changed, 256 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index f49d1ec..c9b0dee 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ruwio", "private": true, - "version": "0.18.3", + "version": "1.0.0", "type": "module", "scripts": { "dev": "vite", diff --git a/src/components/Timeline.vue b/src/components/Timeline.vue index cbbb426..c0972e5 100644 --- a/src/components/Timeline.vue +++ b/src/components/Timeline.vue @@ -10,6 +10,7 @@ import { PhDotsSixVertical, PhFilmStrip, PhFolder, + PhFolderMinus, PhFolderPlus, PhLock, PhLockOpen, @@ -2751,11 +2752,18 @@ function deleteTrack() { } else if (trackMenu.value.kind === 'script') { store.removeScriptTrack(trackMenu.value.trackId) } else { - store.removeTrackGroup(trackMenu.value.trackId) + // Group: delete the group AND every track inside it. + store.removeTrackGroupWithChildren(trackMenu.value.trackId) } trackMenu.value = null } +function ungroupFromMenu() { + if (!trackMenu.value || trackMenu.value.kind !== 'group') return + store.removeTrackGroup(trackMenu.value.trackId) + trackMenu.value = null +} + function duplicateTrackFromMenu() { if (!trackMenu.value) return const newId = store.duplicateTrack(trackMenu.value.trackId) @@ -4033,6 +4041,10 @@ onBeforeUnmount(() => { {{ t('timeline.renameGroup') }} +