Add direct diagram connections, movable ports, and contextual authoring

This commit is contained in:
2026-09-06 02:13:49 +03:00
parent 35133de650
commit fef2e0dbce
39 changed files with 7076 additions and 499 deletions
+70
View File
@@ -3615,6 +3615,32 @@
],
"additionalProperties": false
},
"PortAnchorSide": {
"type": "string",
"enum": ["Left", "Right", "Top", "Bottom"],
"description": "Presentation side of the owner placement; independent of semantic port direction."
},
"PortAnchor": {
"type": "object",
"description": "Manual position of a direct child Port on one owner placement. Each port occurs at most once per placement; this record has no separate identity.",
"properties": {
"port": {
"type": "string",
"format": "uuid"
},
"side": {
"$ref": "#/components/schemas/PortAnchorSide"
},
"offset": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "Finite binary32 fraction of the complete owner edge, measured from top on Left/Right and from left on Top/Bottom."
}
},
"required": ["port", "side", "offset"],
"additionalProperties": false
},
"NodePlacement": {
"type": "object",
"properties": {
@@ -3639,6 +3665,14 @@
},
"collapsed": {
"type": "boolean"
},
"port_anchors": {
"type": "array",
"items": {
"$ref": "#/components/schemas/PortAnchor"
},
"default": [],
"description": "Per-placement manual port positions. Omitted and empty both select automatic positioning; empty lists are omitted on serialization. Duplicate port references are invalid."
}
},
"required": [
@@ -4734,6 +4768,42 @@
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"SetPortAnchor": {
"type": "object",
"description": "Upsert manual port position by port identity on an existing owner placement, preserving unrelated entries. Port must be a direct child of the placement's semantic element.",
"properties": {
"diagram": { "type": "string", "format": "uuid" },
"node": { "type": "string", "format": "uuid" },
"anchor": { "$ref": "#/components/schemas/PortAnchor" }
},
"required": ["diagram", "node", "anchor"],
"additionalProperties": false
}
},
"required": ["SetPortAnchor"],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"RemovePortAnchor": {
"type": "object",
"description": "Restore automatic positioning for an existing direct child Port. No-op when that valid owner placement has no manual anchor for the port; wrong or stale ownership is rejected.",
"properties": {
"diagram": { "type": "string", "format": "uuid" },
"node": { "type": "string", "format": "uuid" },
"port": { "type": "string", "format": "uuid" }
},
"required": ["diagram", "node", "port"],
"additionalProperties": false
}
},
"required": ["RemovePortAnchor"],
"additionalProperties": false
},
{
"type": "object",
"properties": {