e.preventDefault()}
ondrop={handleDrop}
ondblclick={handleCanvasDoubleClick}
onpointerdown={onCanvasPointerDown}
onpointermove={onCanvasPointerMove}
onpointerup={onCanvasPointerUp}
onwheel={onWheel}
>
{#each legacyView.nodes as n (n.id)}
startNodeDrag(e, n.id)}
>
{/each}
{#if dragMode?.kind === "marquee" && dragMode.moved}
{@const mx = Math.min(dragMode.startCanvasX, dragMode.endCanvasX)}
{@const my = Math.min(dragMode.startCanvasY, dragMode.endCanvasY)}
{@const mw = Math.abs(dragMode.endCanvasX - dragMode.startCanvasX)}
{@const mh = Math.abs(dragMode.endCanvasY - dragMode.startCanvasY)}
{/if}
{#if nodeCount === 0}
{/if}
{#if running}
{/if}
{#if dropChoice}
{/if}
{#if doubleClickMenu}
{/if}
{#if !readOnly}
{/if}
{#if showShortcuts}
Keyboard shortcuts
Cmd+Enter Run workflow
Cmd+D Duplicate node
F Zoom to fit
Cmd+0 Reset zoom
Delete Remove selection
Cmd+A Select all
Escape Deselect
Scroll Pan
Cmd+Scroll Zoom
Drag canvas Marquee select
Shift+Drag Add to selection
Space+Drag Pan
Double-click Rename node
{/if}
void runWorkflow()}
onstop={stopWorkflow}
/>
{#if activePicker}
{#key activePicker.modality.key}
{
activePicker = null;
}}
oncleared={() => {
if (activePicker)
activePicker = { ...activePicker, modality: ALL_MODALITY };
}}
onerror={(msg) => showToast(msg, 5000, "error")}
/>
{/key}
{/if}