Node selection and direct manipulation. Click/shift/marquee select, move by drag, resize handles, rotation with snapping, duplicate, nudge, delete, and select-all.
## Requirements
### Requirement: Click to select
Clicking on a node SHALL select it (deselecting all others). Clicking empty canvas SHALL deselect all.
#### Scenario: Select a single node
- **WHEN** user clicks on a rectangle
- **THEN** the rectangle is selected and all other nodes are deselected
### Requirement: Multi-select with shift
Shift+clicking a node SHALL toggle it in the current selection.
#### Scenario: Add to selection
- **WHEN** user shift+clicks a second node while one is already selected
- **THEN** both nodes are in the selection
### Requirement: Marquee selection
Dragging on empty canvas SHALL create a selection rectangle. All nodes intersecting the rectangle SHALL be selected on release.
#### Scenario: Marquee drag
- **WHEN** user drags from empty canvas across three nodes
- **THEN** all three nodes are selected when the drag ends
### Requirement: Move by dragging
Dragging a selected node SHALL move it (and all other selected nodes) by the drag delta.
#### Scenario: Drag to move
- **WHEN** user drags a selected node by 50px right
Creating a section on the canvas SHALL automatically reparent overlapping sibling nodes into the section. Only nodes fully or partially within the section bounds are adopted.
#### Scenario: Draw section over existing nodes
- **WHEN** user draws a section that overlaps two rectangles
- **THEN** the two rectangles become children of the new section
The editor SHALL support bringing selected nodes to front (]) and sending to back ([). Bring to front moves node to end of parent's childIds; send to back moves to start.
#### Scenario: Bring to front
- **WHEN** user selects a node and presses ]
- **THEN** the node moves to the top of its sibling z-order
#### Scenario: Send to back
- **WHEN** user selects a node and presses [
- **THEN** the node moves to the bottom of its sibling z-order
### Requirement: Toggle visibility
The editor SHALL support toggling node visibility (⇧⌘H). Hidden nodes are not rendered but remain in the scene graph and layers panel.
#### Scenario: Hide node
- **WHEN** user selects a visible node and presses ⇧⌘H
- **THEN** the node's `visible` property becomes false
### Requirement: Toggle lock
The editor SHALL support toggling node lock state (⇧⌘L). Locked nodes cannot be selected or moved via canvas interaction.
#### Scenario: Lock node
- **WHEN** user selects a node and presses ⇧⌘L
- **THEN** the node's `locked` property becomes true
### Requirement: Move to page
The editor SHALL support moving selected nodes to a different page, reparenting them under the target page's CANVAS node.
#### Scenario: Move selection to another page
- **WHEN** user moves a node to Page 2 via context menu
- **THEN** the node is reparented under Page 2's CANVAS node and removed from the current page
### Requirement: Rename node
The editor SHALL support renaming nodes programmatically via `renameNode(id, name)`.