diff --git a/frontend/src/lib/components/graph/simplified/SimplifiedBox.svelte b/frontend/src/lib/components/graph/simplified/SimplifiedBox.svelte
index 24d641ee78..5956071d33 100644
--- a/frontend/src/lib/components/graph/simplified/SimplifiedBox.svelte
+++ b/frontend/src/lib/components/graph/simplified/SimplifiedBox.svelte
@@ -2,6 +2,7 @@
import { twMerge } from 'tailwind-merge'
import { GitBranchPlus } from 'lucide-svelte'
import FlowModuleIcon from '$lib/components/flows/FlowModuleIcon.svelte'
+ import { Button } from '$lib/components/common'
import StepContextMenu from './StepContextMenu.svelte'
import { getSimplifiedEditContext, useStepMenu } from './simplifiedContext'
import { getFlowRunStatusContext } from '../flowRunStatus.svelte'
@@ -96,17 +97,18 @@
{header.detail}
{/if}
{#if canAddBranch}
-
+ />
{/if}
diff --git a/frontend/src/lib/components/graph/simplified/SimplifiedFlowGraph.svelte b/frontend/src/lib/components/graph/simplified/SimplifiedFlowGraph.svelte
index 576de3270c..6a4b8b0f19 100644
--- a/frontend/src/lib/components/graph/simplified/SimplifiedFlowGraph.svelte
+++ b/frontend/src/lib/components/graph/simplified/SimplifiedFlowGraph.svelte
@@ -9,7 +9,7 @@
import '@xyflow/svelte/dist/base.css'
import type { FlowModule } from '$lib/gen'
import type { Snippet } from 'svelte'
- import { layoutSimplifiedFlow } from './simplifiedLayout'
+ import { layoutSimplifiedFlow, type SimplifiedBoxData } from './simplifiedLayout'
import { setSimplifiedEditContext } from './simplifiedContext'
import type { FlowStructureNode } from '../flowStructure'
import type { GraphEventHandlers } from '../graphBuilder.svelte'
@@ -183,10 +183,22 @@
zoomOnDoubleClick={false}
deleteKey={null}
onnodeclick={({ node, event }) => {
- // Adding to a multi-selection is xyflow's, synced by SelectionTool
- if (event.shiftKey) return
- // Boxes stand for their loop or branch step; placeholders are not selectable
- if (node.type === 'simplifiedBox' || node.selectable) onSelect?.(node.id)
+ // A loop or branch box stands for its step, keyed by the module id; a user group's
+ // box (`group:`) is no step, and its header handles its own clicks.
+ const isStepBox =
+ node.type === 'simplifiedBox' && (node.data as SimplifiedBoxData).kind !== 'group'
+ if (event.shiftKey) {
+ // Steps are added by xyflow and synced by SelectionTool. Boxes stay unselectable
+ // there, so a rectangle over a loop's steps does not grab the loop, and toggle here.
+ if (isStepBox && selectionOverlay && selectionManager) {
+ const ids = selectionManager.selectedIds
+ selectionManager.selectByIds(
+ ids.includes(node.id) ? ids.filter((i) => i !== node.id) : [...ids, node.id]
+ )
+ }
+ return
+ }
+ if (isStepBox || node.selectable) onSelect?.(node.id)
}}
onpaneclick={() => selectionManager?.clearSelection()}
{proOptions}
diff --git a/frontend/src/lib/components/graph/simplified/SimplifiedNode.svelte b/frontend/src/lib/components/graph/simplified/SimplifiedNode.svelte
index f00d067032..ec742ca931 100644
--- a/frontend/src/lib/components/graph/simplified/SimplifiedNode.svelte
+++ b/frontend/src/lib/components/graph/simplified/SimplifiedNode.svelte
@@ -3,6 +3,7 @@
import { twMerge } from 'tailwind-merge'
import { AlertTriangle, ArrowRightToLine, Filter, Flag, Trash2, X } from 'lucide-svelte'
import FlowModuleIcon from '$lib/components/flows/FlowModuleIcon.svelte'
+ import { Button } from '$lib/components/common'
import type { ContextMenuItem } from '$lib/components/common/contextmenu/ContextMenu.svelte'
import StepContextMenu from './StepContextMenu.svelte'
import { getNodeColorClasses } from '../util'
@@ -79,14 +80,15 @@
>
{data.title}
{#if deleteBranch}
-
+ btnClasses="nodrag shrink-0 opacity-0 group-hover/caption:opacity-100 hover:text-red-500"
+ onClick={deleteBranch}
+ />
{/if}
diff --git a/frontend/src/lib/components/graph/simplified/SimplifiedSlot.svelte b/frontend/src/lib/components/graph/simplified/SimplifiedSlot.svelte
index abf59ed68b..93cb3891f5 100644
--- a/frontend/src/lib/components/graph/simplified/SimplifiedSlot.svelte
+++ b/frontend/src/lib/components/graph/simplified/SimplifiedSlot.svelte
@@ -1,5 +1,6 @@