0.18.0: clip instances get stable transform frame + track hide

Each clip instance now renders an invisible frame rect sized to the
union of its layers' footprints across every keyframe. The
transformer wraps that frame so its handles stay on the clip's own
outer constraints instead of chasing the currently-visible inner
shape, and the rect doubles as a hit region so empty-playhead
frames remain selectable. A plain click on a timeline clip-block
also selects the instance (drag still takes over past the 2px
dead-zone).

Clip tracks pick up the same editor-hide affordance as layer
tracks: new eye button on the track-name, setClipTrackEditorHidden
action, and filters in the Konva stackItems + render.ts so
hidden-track instances vanish in the editor. ExportDialog's
skip-hidden opt-in now also strips hidden clip tracks.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
thandClaude Opus 4.7 committed 2026-04-24 14:11:43 +02:00
1 parent a858f94bb7
commit 6784b76607
10 files changed
+764 -7

No files matched your search

+28 -2
View File
@@ -1862,9 +1862,17 @@ function onClipBlockPointerUp(e: PointerEvent) {
const el = e.currentTarget as HTMLElement
if (el.hasPointerCapture(e.pointerId)) el.releasePointerCapture(e.pointerId)
const wasMoved = m.moved
const instanceId = m.instanceId
clipMove.value = null
// suppress click/dblclick if we actually dragged
if (wasMoved) e.preventDefault()
if (wasMoved) {
// suppress click/dblclick if we actually dragged
e.preventDefault()
return
}
// Pure click: select the instance so the canvas transformer attaches
// to its wrapper group. Without this, users have no way to grab a
// clip whose current-playhead content happens to be empty.
store.selectClipInstance(instanceId)
}
const clipDragOverDropzone = ref(false)
@@ -3419,6 +3427,24 @@ onBeforeUnmount(() => {
<PhDotsSixVertical :size="12" class="drag-handle" />
<PhFilmStrip :size="11" class="name-badge" />
<span class="track-label">{{ track.name }}</span>
<button
class="eye-btn"
:class="{ hidden: !!clipTrackById.get(track.clipTrackId)?.editorHidden }"
v-tooltip="clipTrackById.get(track.clipTrackId)?.editorHidden ? t('timeline.showInEditor') : t('timeline.hideInEditor')"
@click.stop="
store.setClipTrackEditorHidden(
track.clipTrackId,
!clipTrackById.get(track.clipTrackId)?.editorHidden,
)
"
@mousedown.stop
@dragstart.prevent.stop
>
<component
:is="clipTrackById.get(track.clipTrackId)?.editorHidden ? PhEyeSlash : PhEye"
:size="12"
/>
</button>
<button
v-if="!lockedGroupChildIds.has(track.clipTrackId)"
class="lock-btn"