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
+17
View File
@@ -291,6 +291,23 @@
"domContract": ["nodedc-status"],
"summary": "Semantic status pill whose tone is independent from the application accent."
},
{
"id": "drag-drop",
"status": "baseline",
"package": "@nodedc/ui-react",
"exports": ["DragHandle", "DragDropRoot", "DraggableItem", "DropZone", "SortableScope", "SortableItem", "SortableList"],
"domContract": ["nodedc-drag-handle"],
"summary": "Engine-derived handle-only drag, transfer and sortable primitives with the canonical six-dot grip and a 6 px activation threshold.",
"behavior": ["handle-only drag", "cross-list transfer with explicit overlap acceptance", "vertical-axis reorder", "drop-zone state", "keyboard attributes from dnd-kit"],
"rules": [
"The six-dot handle is the only drag initiator; clicking the row keeps its normal navigation or selection action.",
"Sortable rows are visually constrained to the vertical axis and cannot pull their layout horizontally.",
"A transfer is accepted only when the dragged surface overlaps the destination by at least the consumer-defined threshold; Module Studio uses 20 percent.",
"Consumers own domain mutations while the package owns sensors, transforms, accessible drag attributes and geometry.",
"Repeated page-template drops create distinct application page instances instead of consuming the source template.",
"A reordered application page array is the single source of truth for both composition and navigation order."
]
},
{
"id": "inspector",
"status": "baseline",
+38
View File
@@ -0,0 +1,38 @@
{
"schemaVersion": "0.1.0",
"templates": [
{
"schemaVersion": "0.1.0",
"id": "map",
"version": "0.1.0",
"title": "Map Page",
"description": "Full-map NODE.DC page with fixed system actions, Inspector, Toolbar and typed spatial data slots.",
"category": "map",
"page": {
"id": "map",
"title": "Map",
"path": "/",
"navigationLabel": "Map"
},
"features": [
{ "id": "inspector", "label": "Inspector", "description": "Canonical draggable Glass Inspector for map settings and selected entities.", "defaultVisible": true, "required": true },
{ "id": "toolbar", "label": "Toolbar", "description": "Canonical positional Toolbar with template-owned actions.", "defaultVisible": true },
{ "id": "assistant", "label": "Assistant", "description": "Floating NODE.DC assistant entry point and overlay slot.", "defaultVisible": false }
],
"slots": [
{ "id": "points", "kind": "entity-stream", "label": "Points", "description": "Live point entities with position and semantic state.", "required": false, "multiple": true },
{ "id": "traces", "kind": "trace-stream", "label": "Traces", "description": "Time-ordered entity traces.", "required": false, "multiple": true },
{ "id": "routes", "kind": "route-stream", "label": "Routes", "description": "Planned or computed routes.", "required": false, "multiple": true },
{ "id": "zones", "kind": "zone-stream", "label": "Zones", "description": "Polygons, geofences and operational areas.", "required": false, "multiple": true },
{ "id": "selection", "kind": "selection", "label": "Selection", "description": "Selected map entity and contextual state.", "required": false, "multiple": false },
{ "id": "commands", "kind": "command", "label": "Commands", "description": "Capability-backed actions for selected entities.", "required": false, "multiple": true },
{ "id": "assistant", "kind": "assistant", "label": "Assistant context", "description": "Context exposed to the assistant overlay.", "required": false, "multiple": false }
],
"actions": [
{ "id": "open-inspector", "label": "Inspector", "command": "map.inspector.open", "feature": "inspector" },
{ "id": "toggle-toolbar", "label": "Toolbar", "command": "map.toolbar.toggle", "feature": "toolbar" },
{ "id": "open-assistant", "label": "Assistant", "command": "assistant.open", "feature": "assistant" }
]
}
]
}
+8
View File
@@ -23,12 +23,18 @@
"name": "@nodedc/ui-dom",
"path": "packages/ui-dom",
"role": "DOM controllers for non-React applications"
},
{
"name": "@nodedc/page-patterns",
"path": "packages/page-patterns",
"role": "runtime-neutral page template contracts and canonical template manifests"
}
],
"sourceRegistry": "sources.json",
"componentRegistry": "components.json",
"candidateRegistry": "candidates.json",
"iconRegistry": "icons.json",
"pageRegistry": "pages.json",
"documentation": {
"architecture": "../docs/ARCHITECTURE.md",
"components": "../docs/COMPONENTS.md",
@@ -39,8 +45,10 @@
"adoption": "../docs/ADOPTION.md",
"candidates": "../docs/CANDIDATES.md",
"applicationTemplate": "../docs/APPLICATION_TEMPLATE.md",
"moduleStudio": "../docs/MODULE_STUDIO.md",
"icons": "../docs/ICONS.md",
"consumption": "../docs/CONSUMPTION.md"
},
"applicationManifestSchema": "schemas/application-manifest-v0.1.schema.json",
"operatingRule": "Check this registry before creating a NODE.DC interface element. Reuse or extend the canonical export instead of creating an application-local copy."
}
@@ -0,0 +1,88 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://nodedc.ru/schemas/application-manifest-v0.1.schema.json",
"title": "NODE.DC Application Manifest v0.1",
"type": "object",
"additionalProperties": false,
"required": ["schemaVersion", "id", "status", "version", "metadata", "designProfile", "pages", "favicon", "timestamps"],
"properties": {
"schemaVersion": { "const": "0.1.0" },
"id": { "type": "string", "format": "uuid" },
"status": { "const": "draft" },
"version": { "type": "string", "pattern": "^0\\.[0-9]+\\.[0-9]+$" },
"metadata": {
"type": "object",
"additionalProperties": false,
"required": ["name", "slug", "description"],
"properties": {
"name": { "type": "string", "minLength": 1, "maxLength": 120 },
"slug": { "type": "string", "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$", "maxLength": 64 },
"description": { "type": "string", "maxLength": 500 }
}
},
"designProfile": {
"type": "object",
"additionalProperties": false,
"required": ["id", "version", "theme"],
"properties": {
"id": { "type": "string", "minLength": 1 },
"version": { "type": "string", "minLength": 1 },
"theme": { "enum": ["dark", "light"] }
}
},
"pages": {
"type": "array",
"minItems": 0,
"items": {
"type": "object",
"additionalProperties": false,
"required": ["id", "title", "path", "template", "navigation", "features"],
"properties": {
"id": { "type": "string", "pattern": "^[a-z0-9-]+$" },
"title": { "type": "string", "minLength": 1 },
"path": { "type": "string", "minLength": 1 },
"template": {
"type": "object",
"additionalProperties": false,
"required": ["id", "version"],
"properties": {
"id": { "type": "string", "minLength": 1 },
"version": { "type": "string", "minLength": 1 }
}
},
"navigation": {
"type": "object",
"additionalProperties": false,
"required": ["visible", "label", "order"],
"properties": {
"visible": { "type": "boolean" },
"label": { "type": "string" },
"order": { "type": "integer", "minimum": 0 }
}
},
"features": {
"type": "object",
"additionalProperties": { "type": "boolean" }
}
}
}
},
"favicon": {
"type": "object",
"additionalProperties": false,
"required": ["source"],
"properties": {
"source": { "const": "design-profile" }
}
},
"timestamps": {
"type": "object",
"additionalProperties": false,
"required": ["createdAt", "updatedAt"],
"properties": {
"createdAt": { "type": "string", "format": "date-time" },
"updatedAt": { "type": "string", "format": "date-time" }
}
}
}
}