feat(foundry): refine map application controls
This commit is contained in:
+29
-4
@@ -95,8 +95,11 @@ Window — единая механика открытия modal и правой
|
||||
|
||||
`WorkspaceWindow` — modeless-окно внутри рабочей сцены приложения. Оно рендерится непосредственно в переданном workspace, не использует portal и не может перекрыть шапку, навигацию или соседние панели за пределами этого workspace.
|
||||
|
||||
На Map Page `WorkspaceWindow` используется и для facet-групп, и для
|
||||
provider-neutral карточки выбранного subject. Chevron внутри facet-строки
|
||||
На Map Page `WorkspaceWindow` используется для facet-групп, активного сектора
|
||||
и provider-neutral карточки выбранного subject. Настройки карты являются
|
||||
application-level панелью `ApplicationSidePanel`, а слои открываются через
|
||||
канонический toolbar `Dropdown`; они не участвуют в bounded z-index stack.
|
||||
Chevron внутри facet-строки
|
||||
владеет только раскрытием дерева subjects; тело строки сохраняет действие
|
||||
фильтра. Смена совместимого subject не пересоздаёт карточку и не сбрасывает
|
||||
активную вкладку. Joined data-product aspects не создают отдельные окна или
|
||||
@@ -107,8 +110,10 @@ slot `reference-points`. Их три presentation profiles (`Метро`, `Во
|
||||
`Станции РЖД`) являются живыми каноническими Inspector sections: приложение
|
||||
может менять высоту, размер, label и LOD, не создавая provider-specific UI.
|
||||
|
||||
Центральный Map Toolbar содержит template-owned универсальный поиск. В
|
||||
закрытом состоянии это три круглых действия; при открытии общий pill
|
||||
Центральный Map Toolbar содержит Objects, Layers и template-owned
|
||||
универсальный поиск. Слои используют тот же map-glass dropdown и геометрию,
|
||||
что Objects, вместо отдельного плавающего окна. В закрытом состоянии toolbar
|
||||
содержит четыре круглых действия; при открытии поиска общий pill
|
||||
симметрично расширяется, действия остаются слева, а справа появляется
|
||||
search-field и список результатов. Индекс строится по domain subjects,
|
||||
presentation label fields и разрешённым Data Product projections. Компонент не
|
||||
@@ -220,6 +225,26 @@ setup-команды, сохранение, API и права принадлеж
|
||||
|
||||
`AdminNavigationPanel` поддерживает сортируемые route-items через общий Drag & Drop contract. Приложение передаёт новый порядок id, а панель использует каноническую шеститочечную ручку Engine. Порядок не хранится отдельно внутри navigation-компонента.
|
||||
|
||||
## ApplicationSidePanel
|
||||
|
||||
`ApplicationSidePanel` — правая application-level пара к `AdminNavigationPanel`.
|
||||
Она использует ту же ширину `332–352 px`, радиус, theme-aware surface, тень и
|
||||
круглые действия, но появляется справа налево. `ApplicationShell` размещает её
|
||||
в отдельной end-колонке и на desktop уменьшает доступную ширину раскрытого
|
||||
content/stage на ширину панели плюс канонический gap `20 px`; overlay карты не
|
||||
создаётся.
|
||||
|
||||
Панель контролируется приложением. Она открывается и закрывается явным action
|
||||
в header `ApplicationPanel`; Close всегда закрывает её, а взаимодействие с
|
||||
картой не меняет состояние панели. Внутри настроек используется `Inspector
|
||||
variant="panel"`: accordion сохраняет свой layout-state, а его заголовки
|
||||
получают pill/icon geometry и цвета левой панели из theme tokens.
|
||||
|
||||
Этот формат предназначен для настроек и detail-контента уровня Application.
|
||||
Инструменты, сектор, facet-окна и карточки, ограниченные самой сценой, остаются
|
||||
`WorkspaceWindow`. Floating dropdown для короткого списка слоёв не заменяется
|
||||
полноразмерной side panel.
|
||||
|
||||
## Drag & Drop
|
||||
|
||||
`DragHandle`, `DragDropRoot`, `DraggableItem`, `DropZone`, `SortableScope`, `SortableItem` и `SortableList` образуют общий React-контракт переноса и сортировки. Он перенесён из рабочего Engine-паттерна: drag начинается только за шесть точек и только после движения на `6 px`, поэтому обычный клик по строке не конфликтует с навигацией.
|
||||
|
||||
+25
-7
@@ -43,6 +43,11 @@ profile; renderer не содержит provider-specific условий.
|
||||
|
||||
Кнопка `Объекты` открывает вверх текстовый dropdown из Application bindings. Выбор строки открывает или фокусирует отдельное canonical `WorkspaceWindow`, а его универсальное содержимое строится из presentation profile/facets. Несколько binding-окон могут быть открыты одновременно; stable identity всегда `bindingId`, поэтому пользовательское переименование не ломает сохранённый layout.
|
||||
|
||||
Соседняя кнопка `Слои карты` открывает вверх dropdown той же ширины,
|
||||
map-glass поверхности и row geometry, что `Объекты`. Terrain, 3D buildings,
|
||||
planetary grid и cache policy больше не создают отдельное draggable-окно и не
|
||||
занимают место в bounded window stack.
|
||||
|
||||
Клик по pin или его label открывает второе canonical `WorkspaceWindow` — карточку
|
||||
выбранного объекта. Её вкладки и поля задаёт versioned provider-neutral
|
||||
`subjectDetailProfile`, а не renderer и не provider payload. Базовый профиль
|
||||
@@ -74,7 +79,7 @@ MMAP/AIS: сохраняет `heading`, `pitch`, `roll` и смещение ка
|
||||
центра viewport; длительность перелёта для текущего канонического workflow —
|
||||
`0.45 s`.
|
||||
|
||||
Кнопка поиска разворачивает центральный Toolbar симметрично, оставляя три
|
||||
Кнопка поиска разворачивает центральный Toolbar симметрично, оставляя четыре
|
||||
системных действия слева и открывая единое поле справа. Поиск не знает Gelios,
|
||||
OSM или Cesium: он строит локальный индекс по всем подключённым map subjects.
|
||||
Для primary binding индексируются стабильный `sourceId`, label fields
|
||||
@@ -118,10 +123,22 @@ graticule используется тот же глобальный адреса
|
||||
кнопка `Деактивировать сектор` выполняют одну операцию: снимают selection и
|
||||
очищают transient sector-фильтры.
|
||||
|
||||
Настройки карты, слои, окно сектора, binding-окна и карточка subject используют
|
||||
один application-owned workspace stack. Pointer/focus поднимает выбранное окно
|
||||
выше остальных независимо от его типа; ни одно из этих map-stage окон не
|
||||
рендерится в глобальный viewport overlay.
|
||||
Клик по точечному subject, его elevated spike, label или HGeoZone меняет
|
||||
`map.selection` и открывает карточку, но не снимает активный grid sector.
|
||||
Сектор деактивируется только явным background/grid selection либо одним из
|
||||
двух действий деактивации выше.
|
||||
|
||||
Окно сектора, binding-окна и карточка subject используют один
|
||||
application-owned workspace stack. Pointer/focus поднимает выбранное окно выше
|
||||
остальных независимо от его типа; ни одно из этих map-stage окон не рендерится
|
||||
в глобальный viewport overlay. Настройки карты находятся уровнем выше в
|
||||
`ApplicationSidePanel`: она выезжает справа налево, занимает отдельную колонку
|
||||
`ApplicationShell` и сжимает центральный content вместе с картой. Settings и
|
||||
Toolbar являются theme-aware actions в header `ApplicationPanel`: активное
|
||||
состояние использует белую canonical surface, неактивное — panel surface с
|
||||
обводкой. Панель закрывается повторным Settings action либо собственным Close;
|
||||
клик по карте её не закрывает. Слои остаются коротким portal-dropdown нижнего
|
||||
toolbar.
|
||||
|
||||
## Platform reference layers
|
||||
|
||||
@@ -165,8 +182,9 @@ Layout получают зарегистрированные reference bindings
|
||||
их файл не переписывается до явного сохранения пользователем.
|
||||
|
||||
Тот же Page Layout хранит `inspectorOpenSections`. В текущем single-open
|
||||
Inspector это пустой список либо id ровно одной раскрытой секции. Поэтому
|
||||
закрытие окна настроек и повторное открытие не сбрасывает аккордеон, а общая
|
||||
`Inspector variant="panel"` это пустой список либо id ровно одной раскрытой
|
||||
секции. Поэтому закрытие правой панели настроек и повторное открытие не
|
||||
сбрасывает аккордеон, а общая
|
||||
кнопка Application Save сохраняет его вместе с камерой и остальным layout.
|
||||
|
||||
Cesium adapter рендерит elevated targets и label plates как единый overlay над
|
||||
|
||||
@@ -52,6 +52,15 @@ Semantic status не обязан совпадать с accent. Например
|
||||
|
||||
Portal-компоненты рендерятся в `document.body`, поэтому приложение должно либо задавать тему на `document.documentElement`, либо передавать согласованные переменные на body. Локальная тема глубоко внутри React subtree не сможет автоматически охватить portal без отдельного theme portal root.
|
||||
|
||||
Map-glass overlays являются отдельной, независимой от application theme
|
||||
поверхностью поверх imagery. Их светлые translucent controls используют
|
||||
`--nodedc-map-glass-text`, а непрозрачное светлое поле поиска обязано брать
|
||||
тёмный foreground из `--nodedc-map-field-text` и placeholder из
|
||||
`--nodedc-map-field-text-muted`. Светлый field не наследует белый текст
|
||||
map-glass родителя. `ApplicationSidePanel`, напротив, находится вне imagery и
|
||||
всегда наследует обычные theme-aware application panel/text tokens; при смене
|
||||
dark/light она меняется синхронно с `AdminNavigationPanel`.
|
||||
|
||||
## Совместимость
|
||||
|
||||
Существующие `--nodedc-*` имена сохранены намеренно. Это уменьшает стоимость будущего подключения Launcher, Engine, Task Manager и BIM Viewer.
|
||||
|
||||
@@ -70,6 +70,20 @@ Side window использует ту же механику, но placement `end
|
||||
|
||||
По умолчанию это modeless-слой: он не затемняет страницу, не перехватывает клики по основной области, не закрывается по backdrop, не блокирует body scroll и не удерживает Tab внутри панели. Escape и кнопка закрытия остаются доступны. Если конкретный workflow должен быть modal, это задаётся явно, а не получается случайно из placement.
|
||||
|
||||
### ApplicationSidePanel: отдельная push-колонка
|
||||
|
||||
Когда settings/detail принадлежат всему Application и должны физически
|
||||
уменьшать рабочую область, используется `ApplicationSidePanel` внутри
|
||||
`ApplicationShell.endPanel`. На desktop панель имеет ту же ширину, surface,
|
||||
радиус и тень, что `AdminNavigationPanel`, входит справа налево и сдвигает
|
||||
content/stage на panel width + page gap. Она не является `Window`, не получает
|
||||
backdrop и не входит в stack bounded-окон сцены.
|
||||
|
||||
Открытие панели контролирует action в header владельца, закрытие — тот же
|
||||
action или обязательный close action самой панели. Клик по рабочей области не
|
||||
закрывает её неявно. На mobile отдельная колонка становится полноширинным
|
||||
верхним panel-layer, потому что сохранять две узкие колонки там невозможно.
|
||||
|
||||
## Workspace window
|
||||
|
||||
`WorkspaceWindow` отличается от modal и side inspector границей слоя: это inline modeless-окно, ограниченное конкретной рабочей сценой приложения.
|
||||
@@ -89,10 +103,12 @@ Side window использует ту же механику, но placement `end
|
||||
Workspace window используется для вспомогательных камер, инструментов и сопоставляемых представлений внутри stage. Оно не заменяет modal `Window`, viewport-level Inspector или `ApplicationPanel`.
|
||||
|
||||
Если Inspector принадлежит конкретной bounded-сцене и должен конкурировать по
|
||||
z-order с её слоями, карточками и инструментами, он является содержимым
|
||||
`WorkspaceWindow`, а не viewport-level side window. Map Page следует именно
|
||||
этому варианту: настройки карты, слои, активный сектор, окна bindings и
|
||||
карточка объекта входят в один контролируемый stack.
|
||||
z-order с её карточками и инструментами, он является содержимым
|
||||
`WorkspaceWindow`, а не application-level side panel. Текущий Map Page
|
||||
разделяет уровни явно: активный сектор, окна bindings и карточка объекта входят
|
||||
в один bounded stack; настройки карты живут в `ApplicationSidePanel`; короткие
|
||||
настройки слоёв открываются из нижнего toolbar через `Dropdown` в том же
|
||||
map-glass дизайне, что Objects.
|
||||
|
||||
## Управление состоянием
|
||||
|
||||
|
||||
Reference in New Issue
Block a user