feat(ui): add bounded workspace windows
This commit is contained in:
@@ -86,6 +86,14 @@ Window — единая механика открытия modal и правой
|
||||
|
||||
Для modeless Inspector доступен `draggable`: окно двигается за header, не блокирует приложение и ограничивается viewport. Modal-окна не становятся draggable автоматически.
|
||||
|
||||
## WorkspaceWindow
|
||||
|
||||
`WorkspaceWindow` — modeless-окно внутри рабочей сцены приложения. Оно рендерится непосредственно в переданном workspace, не использует portal и не может перекрыть шапку, навигацию или соседние панели за пределами этого workspace.
|
||||
|
||||
Приложение контролирует `rect`, `maximized`, видимость, active-state и `zIndex`. Компонент владеет pointer/keyboard-механикой перемещения и изменения размера, кнопками maximize/restore и close, а также повторно ограничивает геометрию при изменении размеров workspace через `ResizeObserver`. Родительский bounds-контейнер должен быть позиционированным и обрезать содержимое (`position: relative; overflow: hidden`).
|
||||
|
||||
Окно предназначено для вспомогательных камер, инструментов и сопоставляемых представлений внутри сцены. Modal workflow, подтверждение и viewport-level Inspector по-прежнему используют `Window`.
|
||||
|
||||
## Toolbar
|
||||
|
||||
`Toolbar` — канонический dock из нового Engine с требованиями BIM Viewer. Он поддерживает позиции `left`, `right`, `bottom`, lens magnification и autohide. Контролируются фон, border, outline, минимальный/максимальный размер и количество иконок линзы.
|
||||
|
||||
@@ -69,8 +69,26 @@ Side window использует ту же механику, но placement `end
|
||||
|
||||
По умолчанию это modeless-слой: он не затемняет страницу, не перехватывает клики по основной области, не закрывается по backdrop, не блокирует body scroll и не удерживает Tab внутри панели. Escape и кнопка закрытия остаются доступны. Если конкретный workflow должен быть modal, это задаётся явно, а не получается случайно из placement.
|
||||
|
||||
## Workspace window
|
||||
|
||||
`WorkspaceWindow` отличается от modal и side inspector границей слоя: это inline modeless-окно, ограниченное конкретной рабочей сценой приложения.
|
||||
|
||||
Обязательное поведение:
|
||||
|
||||
1. окно рендерится внутри bounds-контейнера без portal;
|
||||
2. приложение контролирует rectangle, maximized-state, visibility, active-state и z-order;
|
||||
3. drag доступен за header мышью, touch/pen pointer и стрелками клавиатуры;
|
||||
4. resize выполняется нижней правой ручкой pointer-ом или стрелками клавиатуры;
|
||||
5. move и resize всегда ограничены текущими размерами workspace;
|
||||
6. `ResizeObserver` повторно ограничивает rectangle после изменения layout;
|
||||
7. maximize заполняет только workspace, а restore возвращает сохранённый приложением rectangle;
|
||||
8. close сообщает intent приложению и не создаёт внутренний store;
|
||||
9. родительский bounds-контейнер использует `position: relative` и `overflow: hidden`.
|
||||
|
||||
Workspace window используется для вспомогательных камер, инструментов и сопоставляемых представлений внутри stage. Оно не заменяет modal `Window`, viewport-level Inspector или `ApplicationPanel`.
|
||||
|
||||
## Управление состоянием
|
||||
|
||||
Библиотека не создаёт глобальный store окон. Приложение владеет тем, какое окно открыто и какие данные в нём загружены. Библиотека владеет одинаковым поведением самого слоя.
|
||||
|
||||
Если приложению позже потребуется stack нескольких modeless-окон, это будет отдельный пакетный контракт, а не расширение локального z-index.
|
||||
Stack workspace-окон остаётся контролируемым приложением: оно передаёт active-state и `zIndex`, а компонент отвечает только за одинаковую геометрию и взаимодействие. Глобальный stack viewport-level modeless-окон остаётся отдельным будущим контрактом.
|
||||
|
||||
Reference in New Issue
Block a user