diff --git a/ui/src/components/screens/ScreenNode.svelte b/ui/src/components/screens/ScreenNode.svelte index d7449fc..763388c 100644 --- a/ui/src/components/screens/ScreenNode.svelte +++ b/ui/src/components/screens/ScreenNode.svelte @@ -56,7 +56,13 @@ class:unreached={info.unreached} style={`width:${layout.width}px;height:${layout.height}px`} onclick={() => node.onSelect(info.id)} - ondblclick={() => node.onOpen?.(info.id)} + ondblclickcapture={(e) => { + // The flow canvas zooms on a double-click that reaches its pane; a + // double-click on a box is a navigation, not a zoom — stop it here, + // at the target, before it bubbles. The pane's own double-click keeps zooming. + e.stopPropagation(); + node.onOpen?.(info.id); + }} aria-pressed={node.selected} title={(info.origin ? `${info.label} — navigates, but no screen reaches it within the walk. In ${info.sub}.` diff --git a/ui/src/components/steps/StepNode.svelte b/ui/src/components/steps/StepNode.svelte index 49d492a..ec58b48 100644 --- a/ui/src/components/steps/StepNode.svelte +++ b/ui/src/components/steps/StepNode.svelte @@ -79,7 +79,13 @@ class:anchor={step.anchor} style={`width:${layout.width}px;height:${layout.height}px`} onclick={() => node.onSelect(info.id)} - ondblclick={() => node.onStart?.(info.id)} + ondblclickcapture={(e) => { + // The flow canvas zooms on a double-click that reaches its pane; a + // double-click on a box is a navigation, not a zoom — stop it here, + // at the target, before it bubbles. The pane's own double-click keeps zooming. + e.stopPropagation(); + node.onStart?.(info.id); + }} aria-pressed={node.selected} title={`${info.label} — ${step.anchor ? 'where this picture starts; ' : ''}${kindWord(step.kind, node.project, step)}. ${info.sub}.${cutNote}${node.onStart && !step.anchor ? ' Double-click to start here.' : ''}`} >