Build Module Studio application composition

This commit is contained in:
DCCONSTRUCTIONS
2026-07-11 21:37:20 +03:00
parent d3e2859ca1
commit 50718a33a1
22 changed files with 2243 additions and 35 deletions
+10
View File
@@ -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 при этом остаются независимыми и не уменьшаются.
+69
View File
@@ -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.