The editor's /icons assets were ~10MB of oversized PNGs (a single
toolbar icon up to 1.4MB). Convert every non-PWA icon to WebP (quality
92) and repoint all /icons/*.png references to .webp across
packages/editor, packages/nodes, and apps/editor. PWA/platform icons
(apple-touch-icon, icon-192, icon-512) stay PNG.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- core: decouple drag-follow from distributionRole — add
portConnectivityFollow flag to NodeDefinition; pipe-trap opts out
(portConnectivityFollow: false) so dragging a connected pipe endpoint
stretches the trap arm instead of yanking the anchored trap fixture
- core: remove the module-level getLevelHeight cache entirely — it was
keyed only by nodes-object identity, which could return stale heights
for in-place mutations by pure/headless callers. The function is now
fully pure and deterministic; viewer hot path recomputes per frame as
before (the cache only ever skipped the resolver-free branch)
- test: harden port-connectivity-pipe.test.ts — real DuctSegmentNode
cross-family isolation case (was waste-vs-vent), new pipe-trap anchor
case (run drag doesn't move trap; trap drag still stretches run), and
beforeEach/afterEach registry reset instead of leaky beforeAll
- nit: biome format/import-order on all touched files
- core: fix layer violation in level-height.ts — extract sceneRegistry
import, replace with optional WallBaseYResolver callback so core stays
pure (no Three.js mesh state); viewer callers pass resolver, headless
callers (MCP/tests) get deterministic node-data-only result
- core: generalise port-connectivity service from duct-only to all
distribution families — match partners by distributionRole ('run' →
endpoint stretch, 'fitting' → rigid follow) instead of hard-coded
duct-segment/duct-fitting type names; add system-compat guard so
cross-system ports (e.g. supply duct vs waste pipe) don't fuse
- editor: fix port-snap rotation bug in move tool — pass preview node
at live rotation into resolvePortSnap so own-port positions reflect
any mid-drag R/T rotation before computing the snap delta
- editor: wire pipe-trap into UI — add to StructureTool union,
MepToolKind, MEP_ITEMS Build-tab tile, and structure-tools action menu
- test: add port-connectivity-pipe.test.ts — 2 tests covering
pipe-fitting → pipe-segment endpoint drag and cross-system isolation
- test: fix stale pipe-auto-fitting.test.ts wye expectation — author
deliberately chose square sanitary-tee for DWV side-taps (documented
in PR description and PipeFittingNode schema); update the one test
that still expected wye to match the implemented behaviour
- nit: fix optional-chain biome warning in validate-dwv.ts