Build Module Studio application composition
This commit is contained in:
@@ -154,6 +154,16 @@ Pill navigation для верхней панели и компактного п
|
||||
|
||||
На desktop открытая панель занимает отдельную колонку с Launcher page gap `20 px` до content/stage, а не перекрывает их затемнённым overlay.
|
||||
|
||||
`AdminNavigationPanel` поддерживает сортируемые route-items через общий Drag & Drop contract. Приложение передаёт новый порядок id, а панель использует каноническую шеститочечную ручку Engine. Порядок не хранится отдельно внутри navigation-компонента.
|
||||
|
||||
## Drag & Drop
|
||||
|
||||
`DragHandle`, `DragDropRoot`, `DraggableItem`, `DropZone`, `SortableScope`, `SortableItem` и `SortableList` образуют общий React-контракт переноса и сортировки. Он перенесён из рабочего Engine-паттерна: drag начинается только за шесть точек и только после движения на `6 px`, поэтому обычный клик по строке не конфликтует с навигацией.
|
||||
|
||||
Sortable-строки ограничены вертикальной осью: горизонтальное движение указателя не сдвигает navigation или composition layout. `DragDropRoot` возвращает реальные active/over rectangles, поэтому consumer может принять перенос только после достаточного перекрытия destination. Module Studio использует порог `20%` ширины переносимой строки: короткое движение, движение влево или касание границы не создаёт page instance.
|
||||
|
||||
В Module Studio исходная строка Page Template остаётся в Page Library после переноса. Каждый подтверждённый drop создаёт новый page instance с уникальным id; состав приложения и левая навигация читают один массив страниц и потому всегда перестраиваются синхронно. Удаление instance выполняется стандартным `ConfirmationModal`, а не мгновенным действием крестика.
|
||||
|
||||
## Icon
|
||||
|
||||
`Icon` предоставляет только подтверждённый общий subset иконок. Каноническое имя описывает смысл (`close`, `expand`, `refresh`), а не конкретный путь SVG. Default glyph — `16 px`, stroke — `1.6`; размер не уменьшается дополнительным CSS-scale. В profile-group шапки допустим подтверждённый Launcher-размер `20 px`. Размеры surface/hit target при этом остаются независимыми и не уменьшаются.
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
# NDC Module Studio
|
||||
|
||||
Текущий living catalog эволюционирует в Module Studio без создания второго визуального приложения. Существующие разделы остаются `Visual Library`; рядом живут `Page Library` и `Applications`. Первый вертикальный срез не подключает Engine, Cesium, Authentik, Hub или Deploy.
|
||||
|
||||
## Page Template contract v0.1
|
||||
|
||||
Канонические TypeScript-контракты и manifests находятся в `@nodedc/page-patterns`, машинно-читаемый реестр — в `registry/pages.json`.
|
||||
|
||||
Первый шаблон `Map Page 0.1.0` формально фиксирует:
|
||||
|
||||
- template identity и pinned version;
|
||||
- стартовую страницу и navigation defaults;
|
||||
- разрешённые feature flags `Inspector`, `Toolbar`, `Assistant`;
|
||||
- runtime-neutral slots `points`, `traces`, `routes`, `zones`, `selection`, `commands`, `assistant`;
|
||||
- template-owned actions.
|
||||
|
||||
Шаблон не содержит Cesium token, Engine workflow, React component tree или свободные координаты элементов. Renderer/Cesium adapter и Capability Bindings являются отдельными следующими слоями.
|
||||
|
||||
## Application Manifest v0.1
|
||||
|
||||
Каноническая JSON Schema: `registry/schemas/application-manifest-v0.1.schema.json`.
|
||||
|
||||
Manifest фиксирует:
|
||||
|
||||
- identity, slug, draft status и версию;
|
||||
- ссылку на Design Profile и Dark/Light;
|
||||
- хотя бы одну страницу и pinned page-template version;
|
||||
- navigation visibility;
|
||||
- только заранее разрешённые feature flags;
|
||||
- favicon source;
|
||||
- server-controlled timestamps.
|
||||
|
||||
Manifest не хранит runtime credentials, capability bindings, arbitrary component tree, свободные координаты элементов или deployment secrets.
|
||||
|
||||
## Draft lifecycle
|
||||
|
||||
Catalog server предоставляет минимальный временный API:
|
||||
|
||||
- `GET /api/applications` — список drafts;
|
||||
- `GET /api/page-templates` — получить канонический page registry;
|
||||
- `POST /api/applications` — создать draft из явно выбранных `templateId` и `templateVersion`;
|
||||
- `GET /api/applications/:id` — открыть draft;
|
||||
- `PUT /api/applications/:id` — атомарно сохранить draft.
|
||||
|
||||
Файлы находятся в `runtime-data/applications` и исключены из Git. Этот store доказывает lifecycle `create → save → reload → open`; целевой production store позже принадлежит Platform `application-core`.
|
||||
|
||||
## Согласованный UX Application Projects
|
||||
|
||||
- круглая кнопка `+` в заголовке Applications открывает модалку создания модуля;
|
||||
- текущий модуль выбирается через Hub-style searchable selector, а не через плоский список проектов;
|
||||
- root модуля содержит metadata, ссылку на один pinned Design Profile и Application Composition;
|
||||
- Dark/Light, favicon, Glass и прочие визуальные параметры не настраиваются внутри модуля;
|
||||
- две равные колонки `Доступные страницы / Конфигурация приложения` работают только с готовыми Page Templates;
|
||||
- drag-and-drop меняет состав и порядок ссылок на шаблоны, но не создаёт свободный canvas;
|
||||
- после сохранения страницы появляются в левой навигации и открывают визуальный preview;
|
||||
- режимы `Настройка / Предпросмотр` разделяют Studio controls и поведение будущего приложения;
|
||||
- удаление draft выполняется только через destructive confirmation modal.
|
||||
|
||||
## Design Profile lifecycle
|
||||
|
||||
Visual Library использует отдельный Hub-style selector профилей. Общая кнопка Save открывает каноническую модалку `Сохранить / Сохранить как новый`. Приложение хранит только pinned `profile id + version + theme`; media, favicon и material settings принадлежат Design Profile.
|
||||
|
||||
Временный catalog server предоставляет:
|
||||
|
||||
- `GET /api/design-profiles`;
|
||||
- `GET /api/design-profiles/:id`;
|
||||
- `POST /api/design-profiles`;
|
||||
- `PUT /api/design-profiles/:id`;
|
||||
- `DELETE /api/applications/:id` с переносом draft в локальное deleted-storage.
|
||||
Reference in New Issue
Block a user