- Pan the viewport by dragging empty canvas
- Ctrl/Cmd + mouse wheel zooms toward the pointer; handler cleaned up on destroy
- Make PropertiesPanel's selectionRev dependency explicit for the linter
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Icon markup had duplicate 'fill' attributes (white body + stroke's fill:none on
one element). Inline SVG parses leniently, but as an <image>/<img> data-URI the
SVG is parsed as strict XML where duplicate attributes are fatal, showing broken
icons on the canvas. Split fill into FILL/NONE/SOLID so each element declares
exactly one fill, and add width/height for intrinsic sizing.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Relation registry with medium & direction connection validation (canConnect)
- Color schemes (default/dark/blueprint/high-contrast) keyed by medium
- Typed property schema (string/int/float/enum/catalogueItem(s)/color/list)
with grouping and pure coercion/validation
- Catalogues (pipes/pumps/materials) with item attributes
- Node type library with SVG icon set + port layouts
- Edge style presets with arrow/circle/diamond/bar marker specs
- 25 unit tests covering validation, coercion and lookups
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Scaffold Vite React-TS frontend and Tauri v2 shell
- Install JointJS (@joint/core), Zustand, Vitest + Testing Library
- Configure Vite (fixed port 1420) and Vitest (jsdom, coverage)
- Add docs/plan with milestone checklist and JointJS rationale
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>