diff --git a/package.json b/package.json index de37f3a..ab2782d 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "ruwio", "private": true, - "version": "0.16.1", + "version": "0.17.0", "type": "module", "scripts": { "dev": "vite", diff --git a/src/components/Timeline.vue b/src/components/Timeline.vue index 6226321..d8b9afe 100644 --- a/src/components/Timeline.vue +++ b/src/components/Timeline.vue @@ -24,6 +24,7 @@ import { PhPencilSimpleLine, PhPlus, PhPolygon, + PhScissors, PhSpeakerSlash, PhSquare, PhTextT, @@ -2683,6 +2684,26 @@ function convertSelectedToClipFromMenu() { trackMenu.value = null } +/** True only for a context-menu tied to an SVG-backed image layer. + * Gates the "Split SVG" entry so the menu doesn't show a dead action + * on raster layers. */ +const canSplitSvgFromMenu = computed(() => { + const m = trackMenu.value + if (!m || m.kind !== 'layer') return false + const layer = store.scene.layers.find((l) => l.id === m.trackId) + if (!layer) return false + const asset = store.scene.assets.find((a) => a.id === layer.assetId) + if (!asset || asset.kind !== 'image') return false + return asset.src.startsWith('data:image/svg+xml') +}) + +function splitSvgFromMenu() { + const m = trackMenu.value + if (!m || m.kind !== 'layer') return + store.splitLayerSvg(m.trackId) + trackMenu.value = null +} + function deleteTrack() { if (!trackMenu.value) return if (trackMenu.value.kind === 'layer') { @@ -3976,6 +3997,15 @@ onBeforeUnmount(() => { {{ t('timeline.convertToClip', { n: store.selectedLayerIds.length }) }} +