feat(map): add reference layers and stabilize workspace controls

This commit is contained in:
Codex
2026-07-25 13:12:24 +03:00
parent c859ae4db0
commit eaecce9f56
29 changed files with 1593 additions and 247 deletions
+10 -3
View File
@@ -64,11 +64,17 @@
"package": "@nodedc/ui-react",
"exports": ["RangeControl"],
"domContract": ["nodedc-range"],
"summary": "Filled pill range control with embedded label and value from redesigned Engine settings.",
"summary": "Filled pill range control with embedded label, drag interaction and a persistent native inline exact-value editor.",
"behavior": ["native range drag", "value click exact editing", "Enter/blur commit", "Escape cancel", "min/max clamp", "step normalization"],
"rules": [
"The accent fill follows the active application theme.",
"The native range remains the accessible input while its chrome is visually replaced."
]
"The native range remains the accessible drag input while its chrome is visually replaced.",
"The fill travels beneath the visible value; the persistent transparent native editor above the value receives exact-edit clicks without remounting.",
"Exact editing stays inside the existing value area and never expands the control.",
"The browser places the caret at the clicked character and keeps native drag selection; entering exact editing never forces select-all or adds a second focus ring.",
"The editor has no separate background box and keeps focus across parent window rerenders and pointer leave.",
"Editor keyboard events do not bubble into enclosing Window shortcuts."
]
},
{
"id": "color-field",
@@ -381,6 +387,7 @@
"Legacy Engine inspectors are not reference implementations.",
"Domain-specific field definitions remain in Engine; reusable layout and controls live here.",
"Desktop Engine geometry is fixed at 390 px panel, 330 px content, 154/14/162 px control rows and 50 px section headers with a 12 px radius.",
"Inspector supports controlled openSections/onOpenSectionsChange state so a consumer can persist the exact accordion layout without remount defaults.",
"Inspector selection fields use InspectorSelectField only: a stacked visible label and the 276/8/46 px split control; integrated pills are prohibited.",
"Accent-filled section headers belong to Environment Settings; neutral headers remain available for other approved inspector contexts."
]
+160 -4
View File
@@ -3,7 +3,7 @@
"profiles": [
{
"id": "map.moving-object.operational.default",
"version": "1.3.0",
"version": "1.4.0",
"title": "Флот",
"semanticTypes": ["map.moving_object"],
"label": {
@@ -13,7 +13,7 @@
"sizePx": 18,
"color": "#f5f5f5",
"outlineColor": "#0c0d12",
"outlineWidthPx": 1,
"outlineWidthPx": 0,
"backgroundColor": "#0c0d12",
"backgroundOpacity": 0.86,
"paddingX": 8,
@@ -30,7 +30,7 @@
"stemWidthPx": 5,
"outlineColor": "#0c0d12",
"outlineOpacity": 0.6,
"outlineWidthPx": 1,
"outlineWidthPx": 0,
"hideCameraHeightMeters": 100000
},
"facets": [
@@ -115,7 +115,7 @@
"sizePx": 14,
"color": "#f5f5f5",
"outlineColor": "#0c0d12",
"outlineWidthPx": 1,
"outlineWidthPx": 0,
"backgroundColor": "#0c0d12",
"backgroundOpacity": 0.82,
"paddingX": 8,
@@ -193,6 +193,162 @@
{ "field": "geometry_kind", "order": ["polygon", "circle", "corridor"] },
{ "field": "source_kind", "order": ["live_api", "versioned_snapshot"] }
]
},
{
"id": "map.reference.transport.metro.v1",
"version": "1.2.0",
"title": "Метро",
"semanticTypes": ["map.station"],
"label": {
"mode": "attributes",
"fields": ["name", "official_name", "local_name"],
"fontWeight": 600,
"sizePx": 20,
"color": "#cccccc",
"outlineColor": "#0c0d12",
"outlineWidthPx": 0,
"backgroundColor": "#000000",
"backgroundOpacity": 1,
"paddingX": 6,
"paddingY": 3,
"maxLength": 80,
"offsetX": 15,
"offsetY": 0,
"hideCameraHeightMeters": 10000
},
"target": {
"variant": "elevated-spike",
"stemHeightMeters": 500,
"headSizePx": 20,
"stemWidthPx": 2,
"outlineColor": "#ff00c8",
"outlineOpacity": 1,
"outlineWidthPx": 2,
"hideCameraHeightMeters": 10000
},
"facets": [{
"id": "category",
"field": "category",
"label": "Категория",
"filterable": false,
"counter": false,
"values": [{ "value": "metro", "label": "Метро", "order": 0 }]
}],
"styles": [{ "id": "reference", "color": "#ffffff", "opacity": 1 }],
"classes": [{
"id": "metro",
"label": "Метро",
"priority": 100,
"match": [{ "field": "category", "equals": "metro" }],
"styleId": "reference",
"renderable": true
}],
"defaultClassId": "metro",
"sort": [{ "field": "category", "order": ["metro"] }]
},
{
"id": "map.reference.transport.terminal.v1",
"version": "1.2.0",
"title": "Вокзалы",
"semanticTypes": ["map.terminal"],
"label": {
"mode": "attributes",
"fields": ["name", "official_name", "local_name"],
"fontWeight": 600,
"sizePx": 20,
"color": "#cccccc",
"outlineColor": "#0c0d12",
"outlineWidthPx": 0,
"backgroundColor": "#000000",
"backgroundOpacity": 1,
"paddingX": 6,
"paddingY": 3,
"maxLength": 80,
"offsetX": 15,
"offsetY": 0,
"hideCameraHeightMeters": 35000
},
"target": {
"variant": "elevated-spike",
"stemHeightMeters": 500,
"headSizePx": 20,
"stemWidthPx": 2,
"outlineColor": "#ff00c8",
"outlineOpacity": 1,
"outlineWidthPx": 2,
"hideCameraHeightMeters": 35000
},
"facets": [{
"id": "category",
"field": "category",
"label": "Категория",
"filterable": false,
"counter": false,
"values": [{ "value": "railway_terminal", "label": "Вокзалы", "order": 0 }]
}],
"styles": [{ "id": "reference", "color": "#ffffff", "opacity": 1 }],
"classes": [{
"id": "railway_terminal",
"label": "Вокзалы",
"priority": 100,
"match": [{ "field": "category", "equals": "railway_terminal" }],
"styleId": "reference",
"renderable": true
}],
"defaultClassId": "railway_terminal",
"sort": [{ "field": "category", "order": ["railway_terminal"] }]
},
{
"id": "map.reference.transport.railway-station.v1",
"version": "1.2.0",
"title": "Станции РЖД",
"semanticTypes": ["map.station"],
"label": {
"mode": "attributes",
"fields": ["name", "official_name", "local_name"],
"fontWeight": 600,
"sizePx": 20,
"color": "#cccccc",
"outlineColor": "#0c0d12",
"outlineWidthPx": 0,
"backgroundColor": "#000000",
"backgroundOpacity": 1,
"paddingX": 6,
"paddingY": 3,
"maxLength": 80,
"offsetX": 15,
"offsetY": 0,
"hideCameraHeightMeters": 15000
},
"target": {
"variant": "elevated-spike",
"stemHeightMeters": 500,
"headSizePx": 20,
"stemWidthPx": 2,
"outlineColor": "#ff00c8",
"outlineOpacity": 1,
"outlineWidthPx": 2,
"hideCameraHeightMeters": 15000
},
"facets": [{
"id": "category",
"field": "category",
"label": "Категория",
"filterable": false,
"counter": false,
"values": [{ "value": "railway_station", "label": "Станции РЖД", "order": 0 }]
}],
"styles": [{ "id": "reference", "color": "#ffffff", "opacity": 1 }],
"classes": [{
"id": "railway_station",
"label": "Станции РЖД",
"priority": 100,
"match": [{ "field": "category", "equals": "railway_station" }],
"styleId": "reference",
"renderable": true
}],
"defaultClassId": "railway_station",
"sort": [{ "field": "category", "order": ["railway_station"] }]
}
]
}
+1
View File
@@ -24,6 +24,7 @@
{ "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": "reference-points", "kind": "entity-stream", "label": "Reference points", "description": "Platform-owned provider-neutral reference entities such as stations and terminals.", "required": false, "multiple": true },
{ "id": "subject-details", "kind": "subject-aspect-stream", "label": "Subject details", "description": "Provider-neutral current aspects joined to a stable selected subject.", "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 },
@@ -72,6 +72,12 @@
"map": {
"type": "object",
"properties": {
"inspectorOpenSections": {
"type": "array",
"maxItems": 1,
"uniqueItems": true,
"items": { "type": "string", "minLength": 1, "maxLength": 256 }
},
"dataProductBindings": {
"type": "array",
"maxItems": 64,