Undo fixes:
- Move undo now redraws deviceLayer so devices visually snap back
- Label, reference, gauge, color, and all wire/device property changes are now undoable
- Duplicate and paste are now undoable (deletes cloned devices on Ctrl+Z)
Right-click menu additions (roadmap 16-20):
- Align & distribute: left/right/top/bottom edges, H/V spacing for multi-select
- Bring to front / Send to back via zOrder in device.properties
- Copy/paste wire style (color, gauge, stripe, twisted pair, shielded)
- Select all wires on net highlights every wire sharing the same label
- Lock device: prevents moves, shows padlock badge, persists across refresh
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Wire options (twisted pair, shielded, stripe, bundle) were not
persisting because the backend server had stale Python modules loaded
from before the WireUpdate schema was updated with these fields.
Pydantic silently ignored unrecognized fields, so only pre-existing
fields like color_stripe were saved.
Frontend fixes applied alongside the schema work:
- _patchWire now shows visible error on save failure instead of
swallowing errors and falsely flashing Saved
- Bundle dropdown rebuild is guarded with _updatingBundleDropdown flag
to prevent spurious change events from triggering unwanted PATCHes
- Enable uvicorn reload=True so server auto-restarts on code changes,
preventing stale module issues in the future
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>