The stair tool held its 2D build preview in FloorplanPanel useState, so every grid:move re-rendered the whole ~120-220ms panel. Move the preview into a dedicated useStairBuildPreview store written via getState() (no panel re-render) and render it from a FloorplanStairBuildPreviewLayer leaf that subscribes to the store directly — the same pattern that keeps column/elevator placement smooth. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>