fix: переписать слой редактирования лестниц на box-контракт декора (#676)

Лестница рисуется протяжкой, как прямоугольник или эллипс декора: длинная
ось протяжки — ось подъёма, стрелка смотрит от нажатия к отпусканию, клик
ставит размер по умолчанию. Выделенная лестница получает рамку декора в
верхнем оверлее карточки — выше тел стен, с узлами постоянного экранного
размера и курсорами по мировому направлению узла; винтовая — четыре узла на
касательных. Ресайз идёт от противоположной стороны, не зеркалит и не
поворачивает; магнит работает по сторонам: в пределах 6 клеток и 5° сторона
ложится на видимую грань стены, при перемещении лестница доворачивается не
больше чем на 5°, при ресайзе и черновике — никогда. Грани перегородок и
колонн получают внешнюю сторону по обходу многоугольника.

Клик, синтезированный после жеста, глушится: под «Лестницей» больше не
появляется копия, под «Выбором» не пропадает выделение. Диалог свойств
считает в сантиметрах лестницы (30…10000), а не в конвертере толщины стены;
нетронутое поле хранит число бит в бит, «Сохранить» без изменений ничего не
пишет. В Просмотре наведение на лестницу с корректной целью показывает
«Переход на этаж …» — ровно при том же условии, что делает её ссылкой.

Чистые функции слоя — в stairs-editor-model.ts с юнитами; смок лестниц
покрывает протяжку, курсоры, рамку над стенами, клик после жеста, диалог и
пять состояний подсказки; реестр мутантов получил шесть свидетелей.

Issue: #676
User-Visible: yes
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018qZfe7YS4rqEMKoVeS3GKd
This commit is contained in:
Claude
2026-09-27 14:41:18 +00:00
committed by claude[bot]
parent 062af8f1d9
commit 93051edfc2
17 changed files with 1423 additions and 248 deletions
+19 -10
View File
@@ -791,16 +791,25 @@ Undo оптимизации.
| Толщина | Задаёт толщину 0–100 см выбранному участку или всем стенам комнаты |
| Удалить комнату | Открывает выбор: удалить комнату и оставить её физические стены либо удалить комнату вместе с ними; общие стены остаются всегда |
Выберите **Лестница → Прямая** или **Лестница → Винтовая**, затем кликните по
плану. Выбранная лестница перемещается и меняет размер плавно, как мебель;
`Shift` привязывает поворот к 45°. Магнит ставит её к видимой физической грани
стены или вплотную к другой лестнице, а **Оптимизировать планы** сохраняет этот
continuous-transform без привязки к сетке. Двойной клик открывает размеры,
направление подъёма, угол и целевой этаж. В Просмотре чистый клик переходит на
корректную цель и восстанавливает сохранённый вид этажа; хвост жеста, битая
ссылка и карточка с закреплённым этажом ничего не делают. На целевом этаже
объект автоматически не создаётся. В 2.5D символ остаётся плоским на полу.
Подробный контракт — в [документе о лестницах](STAIRS.md).
Выберите **Лестница → Прямая** или **Лестница → Винтовая**, затем нарисуйте её
на плане как фигуру декора: нажмите, протяните и отпустите. Направление
протяжки — направление подъёма, нарисованный размер — размер лестницы, а
обычный клик по-прежнему ставит размер по умолчанию. У выделенной лестницы
поверх стен рисуется рамка с угловыми, серединными узлами и узлом вращения;
курсор над узлом показывает, куда он тянет. Узел меняет размер относительно
противоположной стороны, не поворачивая и не зеркаля лестницу, и
примагничивает перетаскиваемую сторону вплотную к параллельной стене;
перетаскивание за тело магнитит ближайшую сторону к стене (доворачивая не
больше чем на 5°) или вплотную к другой лестнице; `Shift` привязывает поворот
к 45°. **Оптимизировать планы** сохраняет этот continuous-transform без
привязки к сетке. Двойной клик открывает размеры (от 30 см до 100 м, хранятся
ровно такими, как показаны), направление подъёма, угол и целевой этаж. В
Просмотре наведение на лестницу с корректной целью показывает подсказку
«Переход на этаж …», а чистый клик переходит на эту цель и восстанавливает
сохранённый вид этажа; хвост жеста, битая ссылка и карточка с закреплённым
этажом ничего не делают. На целевом этаже объект автоматически не создаётся.
В 2.5D символ остаётся плоским на полу. Подробный контракт — в
[документе о лестницах](STAIRS.md).
При варианте **«Удалить комнату, оставить стены»** эксклюзивные участки
положительной толщины становятся обычными независимыми перегородками с той же