nodes: add modular cabinets and wall trim controls#461
Conversation
Items (e.g. solar panels) can now be placed on sloped roof surfaces. The placement system computes euler rotation from the roof surface normal so items sit flush on the slope instead of going inside. - Add roofStrategy to placement-strategies with enter/move/click/leave - Wire roof:enter/move/click/leave events in the placement coordinator - Add calculateRoofRotation in placement-math using surface normals - Support full 3D cursor rotation for sloped surfaces - Items on roofs are parented to the level with world-space rotation Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fridge exterior is now brushed silver with brass accents and the interior is all white. Door/drawer animation no longer rebuilds the full cabinet geometry per frame — animated parts carry pose metadata that a new per-frame cabinet system applies directly to transforms. Co-Authored-By: Claude <noreply@anthropic.com>
Port the curved-flame look from reference gas-burner photos: each burner gets a ring of vertex-coloured tube flames (blue body, orange-yellow tips) whose spines breathe and flicker per frame at ~30fps, plus a flat ignition glow and a faded heat halo. Fix the knob pointer notch to rotate with the knob instead of drifting sideways. Also includes cooktop compartment presets/panels and cabinet selection/move affordance work. Co-Authored-By: Claude <noreply@anthropic.com>
# Conflicts: # packages/editor/src/components/editor/use-floorplan-background-placement.ts
| } | ||
|
|
||
| const current = effectiveOperationState(nodeId, node.operationState) | ||
| animateCabinetOperationState(nodeId, current >= 0.5 ? 0 : 1) |
There was a problem hiding this comment.
Run E-key many undo steps
Medium Severity
Pressing E on a cabinet run starts a separate open/close animation for every module, and each animation commits with its own updateNode when it finishes. One E interaction can push multiple undo history entries instead of a single step like the quick actions use via runAsSingleSceneHistoryStep.
Reviewed by Cursor Bugbot for commit 83163e6. Configure here.
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using high effort and found 1 potential issue.
There are 2 total unresolved issues (including 1 from previous review).
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit e05e4ca. Configure here.
| if (draft) { | ||
| setMovingNode(draft as any) | ||
| setSelection({ selectedIds: [] }) | ||
| return |
There was a problem hiding this comment.
3D duplicate leaves history paused
Medium Severity
When duplicating a cabinet run (or other subtree) via the 3D floating menu, handleDuplicate pauses scene undo history before createFreshPlacementSubtree, but the success path returns without calling resume. The 2D floor-plan duplicate handler resumes in the same situation, so 3D placement can leave history paused and break grouped undo for later edits.
Reviewed by Cursor Bugbot for commit e05e4ca. Configure here.
# Conflicts: # packages/editor/src/components/editor/group-move-handle.tsx # packages/plugin-trees/src/instanced.tsx


What does this PR do?
Adds the modular cabinet workflow: cabinet runs/modules, wall snapping, paint slots, drawer/appliance/fridge/cooktop/range-hood geometry, floorplan/sidebar support, quick actions, move-frame handling, island placement, L-corner actions, grouped undo/redo behavior, and cabinet animation systems.
It also extends the wall finishing workflow with configurable wall bands and paintable skirting/crown/chair rail. The trim work adds curated profiles, Flat defaults, separate material slots for each trim family, raycast selection for paint, and architecture-review cleanup so trim geometry emits metre-scale UVs and cabinet Alt behavior stays force-only rather than bypassing snap modes.
How to test
bun run checkandbun run lint; both should complete without findings.bun test packages/nodes/src/cabinet/__tests__/move-frame.test.ts packages/nodes/src/cabinet/__tests__/wall-snap.test.ts packages/nodes/src/cabinet/__tests__/quick-actions.test.ts packages/core/src/schema/nodes/wall.test.ts packages/nodes/src/wall/paint.test.ts.bun --filter @pascal-app/core build,bun --filter @pascal-app/nodes build, andbun --filter @pascal-app/editor check-types.bun dev, open the editor, add cabinet runs/modules, switch base modules to tall/fridge/cooktop/sink variants, and verify wall snapping, island placement, L-corner quick actions, paint slots, UV-scaled countertop/drawer textures, and grouped undo/redo behavior.Screenshots / screen recording
Will be added — visual/interactive cabinet workflow change.
Checklist
bun devbun checkto verify)mainbranchNote
High Risk
Large surface area across scene graph, movement, collision, selection, and undo history for composite cabinets; wall band/trim changes affect paint and geometry for a core structural kind.
Overview
Introduces
cabinetandcabinet-modulenode types (schemas, events, paint targets) and wires them through the registry: parent-frame movement, selection proxies,quickActions, multi-footprint floor collision, delete cascades, and floor-plan invalidation across linked runs. The editor gainsselection:find-node, registrysceneActionclick dispatch (e.g. cooktop knobs), quick-action rows on 3D/2D action menus, grouped cabinet drags in the floor plan,groupMoveSnapparity for wall attach, andrunAsSingleSceneHistoryStepfor single-undo compound edits.Walls gain optional face bands (1–4 heights with per-band material slots) and skirting / crown / chair rail trim configs with profile enums and dedicated slot defaults, plus helpers to enable bands and seed solid-color slots when counts change.
Plugin loading no longer registers plugin sidebar panels in core; apps use
extendPluginDiscoveryto compose discovery andregisterEditorHostPanelfor host UI (e.g. trees).setPluginDiscoverywarns if it would drop prior extended sources.Other notable changes: spatial
canPlaceOnFloorFootprints(multi-footprint drafts, ignore composite subtrees), handlecommit/ centered guide rings, floor-plan drag docs favoring live overrides over per-tick scene writes, and editor devPORToverride inpackage.json.Reviewed by Cursor Bugbot for commit bc33ac2. Bugbot is set up for automated code reviews on this repo. Configure here.