@grafloria/element 0.3.17 → 0.3.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/jest.config.ts +16 -0
- package/package.json +2 -2
- package/project.json +44 -0
- package/src/front-door-probe.spec.ts +173 -0
- package/src/index.d.ts +2 -1
- package/src/index.js +11 -2
- package/src/index.js.map +1 -1
- package/src/index.ts +804 -0
- package/src/lib/dashboard-kit/dashboard.js.map +1 -1
- package/src/lib/dashboard-kit/dashboard.spec.ts +821 -0
- package/src/lib/dashboard-kit/dashboard.ts +906 -0
- package/src/lib/dashboard-kit/grid-binder.js +16 -15
- package/src/lib/dashboard-kit/grid-binder.js.map +1 -1
- package/src/lib/dashboard-kit/grid-binder.ts +1976 -0
- package/src/lib/dashboard-kit/grid-mapping.js.map +1 -1
- package/src/lib/dashboard-kit/grid-mapping.spec.ts +308 -0
- package/src/lib/dashboard-kit/grid-mapping.ts +283 -0
- package/src/lib/dashboard-kit/index.js.map +1 -1
- package/src/lib/dashboard-kit/index.ts +56 -0
- package/src/lib/dashboard-kit/styles.js +9 -3
- package/src/lib/dashboard-kit/styles.js.map +1 -1
- package/src/lib/dashboard-kit/styles.ts +206 -0
- package/src/lib/dashboard-kit/widgets.js.map +1 -1
- package/src/lib/dashboard-kit/widgets.spec.ts +239 -0
- package/src/lib/dashboard-kit/widgets.ts +484 -0
- package/src/lib/diagram-kit/card.js.map +1 -1
- package/src/lib/diagram-kit/card.ts +219 -0
- package/src/lib/diagram-kit/diagram-kit.spec.ts +465 -0
- package/src/lib/diagram-kit/editing.js +45 -54
- package/src/lib/diagram-kit/editing.js.map +1 -1
- package/src/lib/diagram-kit/editing.spec.ts +172 -0
- package/src/lib/diagram-kit/editing.ts +493 -0
- package/src/lib/diagram-kit/er.js.map +1 -1
- package/src/lib/diagram-kit/er.ts +246 -0
- package/src/lib/diagram-kit/handles.js.map +1 -1
- package/src/lib/diagram-kit/handles.spec.ts +224 -0
- package/src/lib/diagram-kit/handles.ts +375 -0
- package/src/lib/diagram-kit/index.d.ts +1 -0
- package/src/lib/diagram-kit/index.js +11 -1
- package/src/lib/diagram-kit/index.js.map +1 -1
- package/src/lib/diagram-kit/index.ts +66 -0
- package/src/lib/diagram-kit/join-guidance.d.ts +116 -0
- package/src/lib/diagram-kit/join-guidance.js +331 -0
- package/src/lib/diagram-kit/join-guidance.js.map +1 -0
- package/src/lib/diagram-kit/join-guidance.spec.ts +241 -0
- package/src/lib/diagram-kit/join-guidance.ts +390 -0
- package/src/lib/diagram-kit/rows.js.map +1 -1
- package/src/lib/diagram-kit/rows.ts +174 -0
- package/src/lib/diagram-kit/styles.js.map +1 -1
- package/src/lib/diagram-kit/styles.ts +118 -0
- package/src/lib/diagram-kit/uml.js.map +1 -1
- package/src/lib/diagram-kit/uml.ts +213 -0
- package/src/lib/diagram-kit/update.js.map +1 -1
- package/src/lib/diagram-kit/update.spec.ts +208 -0
- package/src/lib/diagram-kit/update.ts +324 -0
- package/src/lib/grafloria-flow-element.js.map +1 -1
- package/src/lib/grafloria-flow-element.spec.ts +290 -0
- package/src/lib/grafloria-flow-element.ts +298 -0
- package/src/lib/grafloria.js.map +1 -1
- package/src/lib/grafloria.ts +151 -0
- package/src/lib/load.js.map +1 -1
- package/src/lib/load.spec.ts +565 -0
- package/src/lib/load.ts +359 -0
- package/src/lib/node-type-registry.js.map +1 -1
- package/src/lib/node-type-registry.ts +76 -0
- package/src/lib/stencil-kit/builders.js.map +1 -1
- package/src/lib/stencil-kit/builders.ts +58 -0
- package/src/lib/stencil-kit/card-builders.js.map +1 -1
- package/src/lib/stencil-kit/card-builders.ts +113 -0
- package/src/lib/stencil-kit/index.js.map +1 -1
- package/src/lib/stencil-kit/index.ts +17 -0
- package/src/lib/stencil-kit/palette.js +60 -6
- package/src/lib/stencil-kit/palette.js.map +1 -1
- package/src/lib/stencil-kit/palette.ts +482 -0
- package/src/lib/stencil-kit/shape-data.d.ts +3 -2
- package/src/lib/stencil-kit/shape-data.js +323 -31
- package/src/lib/stencil-kit/shape-data.js.map +1 -1
- package/src/lib/stencil-kit/shape-data.spec.ts +470 -0
- package/src/lib/stencil-kit/shape-data.ts +680 -0
- package/src/lib/stencil-kit/styles.js +15 -0
- package/src/lib/stencil-kit/styles.js.map +1 -1
- package/src/lib/stencil-kit/styles.ts +126 -0
- package/src/libs/element/src/index.d.ts +92 -0
- package/src/libs/element/src/index.js +576 -0
- package/src/libs/element/src/index.js.map +1 -0
- package/src/libs/element/src/lib/dashboard-kit/dashboard.d.ts +345 -0
- package/src/libs/element/src/lib/dashboard-kit/dashboard.js +594 -0
- package/src/libs/element/src/lib/dashboard-kit/dashboard.js.map +1 -0
- package/src/libs/element/src/lib/dashboard-kit/grid-binder.d.ts +277 -0
- package/src/libs/element/src/lib/dashboard-kit/grid-binder.js +1636 -0
- package/src/libs/element/src/lib/dashboard-kit/grid-binder.js.map +1 -0
- package/src/libs/element/src/lib/dashboard-kit/grid-mapping.d.ts +141 -0
- package/src/libs/element/src/lib/dashboard-kit/grid-mapping.js +176 -0
- package/src/libs/element/src/lib/dashboard-kit/grid-mapping.js.map +1 -0
- package/src/libs/element/src/lib/dashboard-kit/index.d.ts +5 -0
- package/src/libs/element/src/lib/dashboard-kit/index.js +33 -0
- package/src/libs/element/src/lib/dashboard-kit/index.js.map +1 -0
- package/src/libs/element/src/lib/dashboard-kit/styles.d.ts +25 -0
- package/src/libs/element/src/lib/dashboard-kit/styles.js +209 -0
- package/src/libs/element/src/lib/dashboard-kit/styles.js.map +1 -0
- package/src/libs/element/src/lib/dashboard-kit/widgets.d.ts +112 -0
- package/src/libs/element/src/lib/dashboard-kit/widgets.js +389 -0
- package/src/libs/element/src/lib/dashboard-kit/widgets.js.map +1 -0
- package/src/libs/element/src/lib/diagram-kit/card.d.ts +75 -0
- package/src/libs/element/src/lib/diagram-kit/card.js +209 -0
- package/src/libs/element/src/lib/diagram-kit/card.js.map +1 -0
- package/src/libs/element/src/lib/diagram-kit/editing.d.ts +58 -0
- package/src/libs/element/src/lib/diagram-kit/editing.js +453 -0
- package/src/libs/element/src/lib/diagram-kit/editing.js.map +1 -0
- package/src/libs/element/src/lib/diagram-kit/er.d.ts +73 -0
- package/src/libs/element/src/lib/diagram-kit/er.js +163 -0
- package/src/libs/element/src/lib/diagram-kit/er.js.map +1 -0
- package/src/libs/element/src/lib/diagram-kit/handles.d.ts +181 -0
- package/src/libs/element/src/lib/diagram-kit/handles.js +325 -0
- package/src/libs/element/src/lib/diagram-kit/handles.js.map +1 -0
- package/src/libs/element/src/lib/diagram-kit/index.d.ts +10 -0
- package/src/libs/element/src/lib/diagram-kit/index.js +55 -0
- package/src/libs/element/src/lib/diagram-kit/index.js.map +1 -0
- package/src/libs/element/src/lib/diagram-kit/join-guidance.d.ts +116 -0
- package/src/libs/element/src/lib/diagram-kit/join-guidance.js +331 -0
- package/src/libs/element/src/lib/diagram-kit/join-guidance.js.map +1 -0
- package/src/libs/element/src/lib/diagram-kit/rows.d.ts +53 -0
- package/src/libs/element/src/lib/diagram-kit/rows.js +147 -0
- package/src/libs/element/src/lib/diagram-kit/rows.js.map +1 -0
- package/src/libs/element/src/lib/diagram-kit/styles.d.ts +18 -0
- package/src/libs/element/src/lib/diagram-kit/styles.js +122 -0
- package/src/libs/element/src/lib/diagram-kit/styles.js.map +1 -0
- package/src/libs/element/src/lib/diagram-kit/uml.d.ts +59 -0
- package/src/libs/element/src/lib/diagram-kit/uml.js +138 -0
- package/src/libs/element/src/lib/diagram-kit/uml.js.map +1 -0
- package/src/libs/element/src/lib/diagram-kit/update.d.ts +133 -0
- package/src/libs/element/src/lib/diagram-kit/update.js +251 -0
- package/src/libs/element/src/lib/diagram-kit/update.js.map +1 -0
- package/src/libs/element/src/lib/grafloria-flow-element.d.ts +48 -0
- package/src/libs/element/src/lib/grafloria-flow-element.js +271 -0
- package/src/libs/element/src/lib/grafloria-flow-element.js.map +1 -0
- package/src/libs/element/src/lib/grafloria.d.ts +72 -0
- package/src/libs/element/src/lib/grafloria.js +74 -0
- package/src/libs/element/src/lib/grafloria.js.map +1 -0
- package/src/libs/element/src/lib/load.d.ts +72 -0
- package/src/libs/element/src/lib/load.js +255 -0
- package/src/libs/element/src/lib/load.js.map +1 -0
- package/src/libs/element/src/lib/node-type-registry.d.ts +39 -0
- package/src/libs/element/src/lib/node-type-registry.js +50 -0
- package/src/libs/element/src/lib/node-type-registry.js.map +1 -0
- package/src/libs/element/src/lib/stencil-kit/builders.d.ts +45 -0
- package/src/libs/element/src/lib/stencil-kit/builders.js +24 -0
- package/src/libs/element/src/lib/stencil-kit/builders.js.map +1 -0
- package/src/libs/element/src/lib/stencil-kit/card-builders.d.ts +2 -0
- package/src/libs/element/src/lib/stencil-kit/card-builders.js +108 -0
- package/src/libs/element/src/lib/stencil-kit/card-builders.js.map +1 -0
- package/src/libs/element/src/lib/stencil-kit/index.d.ts +7 -0
- package/src/libs/element/src/lib/stencil-kit/index.js +19 -0
- package/src/libs/element/src/lib/stencil-kit/index.js.map +1 -0
- package/src/libs/element/src/lib/stencil-kit/palette.d.ts +93 -0
- package/src/libs/element/src/lib/stencil-kit/palette.js +430 -0
- package/src/libs/element/src/lib/stencil-kit/palette.js.map +1 -0
- package/src/libs/element/src/lib/stencil-kit/shape-data.d.ts +28 -0
- package/src/libs/element/src/lib/stencil-kit/shape-data.js +540 -0
- package/src/libs/element/src/lib/stencil-kit/shape-data.js.map +1 -0
- package/src/libs/element/src/lib/stencil-kit/styles.d.ts +2 -0
- package/src/libs/element/src/lib/stencil-kit/styles.js +129 -0
- package/src/libs/element/src/lib/stencil-kit/styles.js.map +1 -0
- package/src/libs/engine/src/adapters/component-adapter.interface.d.ts +302 -0
- package/src/libs/engine/src/adapters/component-adapter.interface.js +84 -0
- package/src/libs/engine/src/adapters/component-adapter.interface.js.map +1 -0
- package/src/libs/engine/src/adapters/index.d.ts +7 -0
- package/src/libs/engine/src/adapters/index.js +11 -0
- package/src/libs/engine/src/adapters/index.js.map +1 -0
- package/src/libs/engine/src/clipboard/ClipboardManager.d.ts +81 -0
- package/src/libs/engine/src/clipboard/ClipboardManager.js +108 -0
- package/src/libs/engine/src/clipboard/ClipboardManager.js.map +1 -0
- package/src/libs/engine/src/clipboard/index.d.ts +1 -0
- package/src/libs/engine/src/clipboard/index.js +6 -0
- package/src/libs/engine/src/clipboard/index.js.map +1 -0
- package/src/libs/engine/src/collab/apply-op.d.ts +42 -0
- package/src/libs/engine/src/collab/apply-op.js +939 -0
- package/src/libs/engine/src/collab/apply-op.js.map +1 -0
- package/src/libs/engine/src/collab/capture.d.ts +147 -0
- package/src/libs/engine/src/collab/capture.js +510 -0
- package/src/libs/engine/src/collab/capture.js.map +1 -0
- package/src/libs/engine/src/collab/index.d.ts +12 -0
- package/src/libs/engine/src/collab/index.js +84 -0
- package/src/libs/engine/src/collab/index.js.map +1 -0
- package/src/libs/engine/src/collab/integrity.d.ts +178 -0
- package/src/libs/engine/src/collab/integrity.js +438 -0
- package/src/libs/engine/src/collab/integrity.js.map +1 -0
- package/src/libs/engine/src/collab/lww.d.ts +47 -0
- package/src/libs/engine/src/collab/lww.js +188 -0
- package/src/libs/engine/src/collab/lww.js.map +1 -0
- package/src/libs/engine/src/collab/op-log.d.ts +50 -0
- package/src/libs/engine/src/collab/op-log.js +167 -0
- package/src/libs/engine/src/collab/op-log.js.map +1 -0
- package/src/libs/engine/src/collab/op.d.ts +120 -0
- package/src/libs/engine/src/collab/op.js +118 -0
- package/src/libs/engine/src/collab/op.js.map +1 -0
- package/src/libs/engine/src/collab/replica.d.ts +188 -0
- package/src/libs/engine/src/collab/replica.js +526 -0
- package/src/libs/engine/src/collab/replica.js.map +1 -0
- package/src/libs/engine/src/collab/undo.d.ts +106 -0
- package/src/libs/engine/src/collab/undo.js +388 -0
- package/src/libs/engine/src/collab/undo.js.map +1 -0
- package/src/libs/engine/src/commands/Command.d.ts +66 -0
- package/src/libs/engine/src/commands/Command.js +64 -0
- package/src/libs/engine/src/commands/Command.js.map +1 -0
- package/src/libs/engine/src/commands/CommandManager.d.ts +161 -0
- package/src/libs/engine/src/commands/CommandManager.js +417 -0
- package/src/libs/engine/src/commands/CommandManager.js.map +1 -0
- package/src/libs/engine/src/commands/basic/AddGroupCommand.d.ts +13 -0
- package/src/libs/engine/src/commands/basic/AddGroupCommand.js +50 -0
- package/src/libs/engine/src/commands/basic/AddGroupCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/AddLinkCommand.d.ts +13 -0
- package/src/libs/engine/src/commands/basic/AddLinkCommand.js +50 -0
- package/src/libs/engine/src/commands/basic/AddLinkCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/AddNodeCommand.d.ts +13 -0
- package/src/libs/engine/src/commands/basic/AddNodeCommand.js +65 -0
- package/src/libs/engine/src/commands/basic/AddNodeCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/AddToGroupCommand.d.ts +12 -0
- package/src/libs/engine/src/commands/basic/AddToGroupCommand.js +73 -0
- package/src/libs/engine/src/commands/basic/AddToGroupCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/AlignCommands.d.ts +42 -0
- package/src/libs/engine/src/commands/basic/AlignCommands.js +138 -0
- package/src/libs/engine/src/commands/basic/AlignCommands.js.map +1 -0
- package/src/libs/engine/src/commands/basic/CollapseGroupCommand.d.ts +14 -0
- package/src/libs/engine/src/commands/basic/CollapseGroupCommand.js +70 -0
- package/src/libs/engine/src/commands/basic/CollapseGroupCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/CopyCommand.d.ts +29 -0
- package/src/libs/engine/src/commands/basic/CopyCommand.js +131 -0
- package/src/libs/engine/src/commands/basic/CopyCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/CutCommand.d.ts +49 -0
- package/src/libs/engine/src/commands/basic/CutCommand.js +68 -0
- package/src/libs/engine/src/commands/basic/CutCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/DeleteSelectionCommand.d.ts +58 -0
- package/src/libs/engine/src/commands/basic/DeleteSelectionCommand.js +309 -0
- package/src/libs/engine/src/commands/basic/DeleteSelectionCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/DuplicateCommand.d.ts +31 -0
- package/src/libs/engine/src/commands/basic/DuplicateCommand.js +232 -0
- package/src/libs/engine/src/commands/basic/DuplicateCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/ExpandGroupCommand.d.ts +12 -0
- package/src/libs/engine/src/commands/basic/ExpandGroupCommand.js +69 -0
- package/src/libs/engine/src/commands/basic/ExpandGroupCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/MoveGroupCommand.d.ts +46 -0
- package/src/libs/engine/src/commands/basic/MoveGroupCommand.js +77 -0
- package/src/libs/engine/src/commands/basic/MoveGroupCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/MoveNodeCommand.d.ts +30 -0
- package/src/libs/engine/src/commands/basic/MoveNodeCommand.js +87 -0
- package/src/libs/engine/src/commands/basic/MoveNodeCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/NodeZOrderCommands.d.ts +39 -0
- package/src/libs/engine/src/commands/basic/NodeZOrderCommands.js +120 -0
- package/src/libs/engine/src/commands/basic/NodeZOrderCommands.js.map +1 -0
- package/src/libs/engine/src/commands/basic/PasteCommand.d.ts +33 -0
- package/src/libs/engine/src/commands/basic/PasteCommand.js +228 -0
- package/src/libs/engine/src/commands/basic/PasteCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/PortCommands.d.ts +22 -0
- package/src/libs/engine/src/commands/basic/PortCommands.js +85 -0
- package/src/libs/engine/src/commands/basic/PortCommands.js.map +1 -0
- package/src/libs/engine/src/commands/basic/ReconnectLinkCommand.d.ts +15 -0
- package/src/libs/engine/src/commands/basic/ReconnectLinkCommand.js +59 -0
- package/src/libs/engine/src/commands/basic/ReconnectLinkCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/RemoveFromGroupCommand.d.ts +12 -0
- package/src/libs/engine/src/commands/basic/RemoveFromGroupCommand.js +64 -0
- package/src/libs/engine/src/commands/basic/RemoveFromGroupCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/RemoveGroupCommand.d.ts +12 -0
- package/src/libs/engine/src/commands/basic/RemoveGroupCommand.js +56 -0
- package/src/libs/engine/src/commands/basic/RemoveGroupCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/RemoveLinkCommand.d.ts +12 -0
- package/src/libs/engine/src/commands/basic/RemoveLinkCommand.js +57 -0
- package/src/libs/engine/src/commands/basic/RemoveLinkCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/RemoveNodeCommand.d.ts +23 -0
- package/src/libs/engine/src/commands/basic/RemoveNodeCommand.js +108 -0
- package/src/libs/engine/src/commands/basic/RemoveNodeCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/ResizeNodeCommand.d.ts +16 -0
- package/src/libs/engine/src/commands/basic/ResizeNodeCommand.js +81 -0
- package/src/libs/engine/src/commands/basic/ResizeNodeCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/RotateNodeCommand.d.ts +37 -0
- package/src/libs/engine/src/commands/basic/RotateNodeCommand.js +88 -0
- package/src/libs/engine/src/commands/basic/RotateNodeCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/SetFlexItemCommand.d.ts +14 -0
- package/src/libs/engine/src/commands/basic/SetFlexItemCommand.js +74 -0
- package/src/libs/engine/src/commands/basic/SetFlexItemCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/SetGridItemCommand.d.ts +14 -0
- package/src/libs/engine/src/commands/basic/SetGridItemCommand.js +74 -0
- package/src/libs/engine/src/commands/basic/SetGridItemCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/SetLayoutCommand.d.ts +16 -0
- package/src/libs/engine/src/commands/basic/SetLayoutCommand.js +80 -0
- package/src/libs/engine/src/commands/basic/SetLayoutCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/SetLinkDisplayLabelCommand.d.ts +28 -0
- package/src/libs/engine/src/commands/basic/SetLinkDisplayLabelCommand.js +83 -0
- package/src/libs/engine/src/commands/basic/SetLinkDisplayLabelCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/SetLinkLabelCommand.d.ts +24 -0
- package/src/libs/engine/src/commands/basic/SetLinkLabelCommand.js +81 -0
- package/src/libs/engine/src/commands/basic/SetLinkLabelCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/SetLinkLabelsCommand.d.ts +14 -0
- package/src/libs/engine/src/commands/basic/SetLinkLabelsCommand.js +75 -0
- package/src/libs/engine/src/commands/basic/SetLinkLabelsCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/SetLinkPathTypeCommand.d.ts +14 -0
- package/src/libs/engine/src/commands/basic/SetLinkPathTypeCommand.js +77 -0
- package/src/libs/engine/src/commands/basic/SetLinkPathTypeCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/SetLinkPointsCommand.d.ts +32 -0
- package/src/libs/engine/src/commands/basic/SetLinkPointsCommand.js +87 -0
- package/src/libs/engine/src/commands/basic/SetLinkPointsCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/SetNodeDataCommand.d.ts +14 -0
- package/src/libs/engine/src/commands/basic/SetNodeDataCommand.js +93 -0
- package/src/libs/engine/src/commands/basic/SetNodeDataCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/SetNodeLabelCommand.d.ts +26 -0
- package/src/libs/engine/src/commands/basic/SetNodeLabelCommand.js +81 -0
- package/src/libs/engine/src/commands/basic/SetNodeLabelCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/SetNodeShapeConfigCommand.d.ts +14 -0
- package/src/libs/engine/src/commands/basic/SetNodeShapeConfigCommand.js +69 -0
- package/src/libs/engine/src/commands/basic/SetNodeShapeConfigCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/SetNodeStyleCommand.d.ts +15 -0
- package/src/libs/engine/src/commands/basic/SetNodeStyleCommand.js +88 -0
- package/src/libs/engine/src/commands/basic/SetNodeStyleCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/SetParentCommand.d.ts +13 -0
- package/src/libs/engine/src/commands/basic/SetParentCommand.js +109 -0
- package/src/libs/engine/src/commands/basic/SetParentCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/SetStrokePointsCommand.d.ts +34 -0
- package/src/libs/engine/src/commands/basic/SetStrokePointsCommand.js +86 -0
- package/src/libs/engine/src/commands/basic/SetStrokePointsCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/StrokeLifecycleCommands.d.ts +31 -0
- package/src/libs/engine/src/commands/basic/StrokeLifecycleCommands.js +88 -0
- package/src/libs/engine/src/commands/basic/StrokeLifecycleCommands.js.map +1 -0
- package/src/libs/engine/src/commands/basic/UpdateLinkStyleCommand.d.ts +15 -0
- package/src/libs/engine/src/commands/basic/UpdateLinkStyleCommand.js +72 -0
- package/src/libs/engine/src/commands/basic/UpdateLinkStyleCommand.js.map +1 -0
- package/src/libs/engine/src/commands/basic/index.d.ts +41 -0
- package/src/libs/engine/src/commands/basic/index.js +52 -0
- package/src/libs/engine/src/commands/basic/index.js.map +1 -0
- package/src/libs/engine/src/commands/basic/remapNodePortIds.d.ts +23 -0
- package/src/libs/engine/src/commands/basic/remapNodePortIds.js +46 -0
- package/src/libs/engine/src/commands/basic/remapNodePortIds.js.map +1 -0
- package/src/libs/engine/src/commands/basic/resolveLinkNodeIds.d.ts +31 -0
- package/src/libs/engine/src/commands/basic/resolveLinkNodeIds.js +49 -0
- package/src/libs/engine/src/commands/basic/resolveLinkNodeIds.js.map +1 -0
- package/src/libs/engine/src/commands/composite/BatchCommand.d.ts +19 -0
- package/src/libs/engine/src/commands/composite/BatchCommand.js +61 -0
- package/src/libs/engine/src/commands/composite/BatchCommand.js.map +1 -0
- package/src/libs/engine/src/commands/composite/MacroCommand.d.ts +35 -0
- package/src/libs/engine/src/commands/composite/MacroCommand.js +87 -0
- package/src/libs/engine/src/commands/composite/MacroCommand.js.map +1 -0
- package/src/libs/engine/src/commands/composite/index.d.ts +2 -0
- package/src/libs/engine/src/commands/composite/index.js +7 -0
- package/src/libs/engine/src/commands/composite/index.js.map +1 -0
- package/src/libs/engine/src/commands/index.d.ts +4 -0
- package/src/libs/engine/src/commands/index.js +9 -0
- package/src/libs/engine/src/commands/index.js.map +1 -0
- package/src/libs/engine/src/comments/comment-store.d.ts +238 -0
- package/src/libs/engine/src/comments/comment-store.js +538 -0
- package/src/libs/engine/src/comments/comment-store.js.map +1 -0
- package/src/libs/engine/src/comments/index.d.ts +4 -0
- package/src/libs/engine/src/comments/index.js +31 -0
- package/src/libs/engine/src/comments/index.js.map +1 -0
- package/src/libs/engine/src/comments/mentions.d.ts +52 -0
- package/src/libs/engine/src/comments/mentions.js +94 -0
- package/src/libs/engine/src/comments/mentions.js.map +1 -0
- package/src/libs/engine/src/comments/read-state.d.ts +37 -0
- package/src/libs/engine/src/comments/read-state.js +105 -0
- package/src/libs/engine/src/comments/read-state.js.map +1 -0
- package/src/libs/engine/src/comments/types.d.ts +154 -0
- package/src/libs/engine/src/comments/types.js +107 -0
- package/src/libs/engine/src/comments/types.js.map +1 -0
- package/src/libs/engine/src/config/InteractionConfig.d.ts +330 -0
- package/src/libs/engine/src/config/InteractionConfig.js +154 -0
- package/src/libs/engine/src/config/InteractionConfig.js.map +1 -0
- package/src/libs/engine/src/config/index.d.ts +1 -0
- package/src/libs/engine/src/config/index.js +6 -0
- package/src/libs/engine/src/config/index.js.map +1 -0
- package/src/libs/engine/src/dsl/DSL.d.ts +197 -0
- package/src/libs/engine/src/dsl/DSL.js +564 -0
- package/src/libs/engine/src/dsl/DSL.js.map +1 -0
- package/src/libs/engine/src/dsl/advanced/StyleParser.d.ts +75 -0
- package/src/libs/engine/src/dsl/advanced/StyleParser.js +166 -0
- package/src/libs/engine/src/dsl/advanced/StyleParser.js.map +1 -0
- package/src/libs/engine/src/dsl/advanced/TemplateParser.d.ts +88 -0
- package/src/libs/engine/src/dsl/advanced/TemplateParser.js +226 -0
- package/src/libs/engine/src/dsl/advanced/TemplateParser.js.map +1 -0
- package/src/libs/engine/src/dsl/advanced/index.d.ts +9 -0
- package/src/libs/engine/src/dsl/advanced/index.js +13 -0
- package/src/libs/engine/src/dsl/advanced/index.js.map +1 -0
- package/src/libs/engine/src/dsl/detector/LayoutDetector.d.ts +80 -0
- package/src/libs/engine/src/dsl/detector/LayoutDetector.js +333 -0
- package/src/libs/engine/src/dsl/detector/LayoutDetector.js.map +1 -0
- package/src/libs/engine/src/dsl/extended/BPMNGenerator.d.ts +38 -0
- package/src/libs/engine/src/dsl/extended/BPMNGenerator.js +90 -0
- package/src/libs/engine/src/dsl/extended/BPMNGenerator.js.map +1 -0
- package/src/libs/engine/src/dsl/extended/BPMNParser.d.ts +83 -0
- package/src/libs/engine/src/dsl/extended/BPMNParser.js +198 -0
- package/src/libs/engine/src/dsl/extended/BPMNParser.js.map +1 -0
- package/src/libs/engine/src/dsl/extended/ERDGenerator.d.ts +38 -0
- package/src/libs/engine/src/dsl/extended/ERDGenerator.js +126 -0
- package/src/libs/engine/src/dsl/extended/ERDGenerator.js.map +1 -0
- package/src/libs/engine/src/dsl/extended/ERDParser.d.ts +81 -0
- package/src/libs/engine/src/dsl/extended/ERDParser.js +161 -0
- package/src/libs/engine/src/dsl/extended/ERDParser.js.map +1 -0
- package/src/libs/engine/src/dsl/extended/ERDTransformer.d.ts +43 -0
- package/src/libs/engine/src/dsl/extended/ERDTransformer.js +105 -0
- package/src/libs/engine/src/dsl/extended/ERDTransformer.js.map +1 -0
- package/src/libs/engine/src/dsl/extended/UMLGenerator.d.ts +42 -0
- package/src/libs/engine/src/dsl/extended/UMLGenerator.js +157 -0
- package/src/libs/engine/src/dsl/extended/UMLGenerator.js.map +1 -0
- package/src/libs/engine/src/dsl/extended/UMLParser.d.ts +99 -0
- package/src/libs/engine/src/dsl/extended/UMLParser.js +200 -0
- package/src/libs/engine/src/dsl/extended/UMLParser.js.map +1 -0
- package/src/libs/engine/src/dsl/extended/index.d.ts +13 -0
- package/src/libs/engine/src/dsl/extended/index.js +27 -0
- package/src/libs/engine/src/dsl/extended/index.js.map +1 -0
- package/src/libs/engine/src/dsl/generator/DSLFormatter.d.ts +87 -0
- package/src/libs/engine/src/dsl/generator/DSLFormatter.js +261 -0
- package/src/libs/engine/src/dsl/generator/DSLFormatter.js.map +1 -0
- package/src/libs/engine/src/dsl/generator/DSLGenerator.d.ts +96 -0
- package/src/libs/engine/src/dsl/generator/DSLGenerator.js +328 -0
- package/src/libs/engine/src/dsl/generator/DSLGenerator.js.map +1 -0
- package/src/libs/engine/src/dsl/generator/DiagramAnalyzer.d.ts +111 -0
- package/src/libs/engine/src/dsl/generator/DiagramAnalyzer.js +361 -0
- package/src/libs/engine/src/dsl/generator/DiagramAnalyzer.js.map +1 -0
- package/src/libs/engine/src/dsl/index.d.ts +35 -0
- package/src/libs/engine/src/dsl/index.js +64 -0
- package/src/libs/engine/src/dsl/index.js.map +1 -0
- package/src/libs/engine/src/dsl/lexer/Lexer.d.ts +117 -0
- package/src/libs/engine/src/dsl/lexer/Lexer.js +521 -0
- package/src/libs/engine/src/dsl/lexer/Lexer.js.map +1 -0
- package/src/libs/engine/src/dsl/mermaid/MermaidClass.d.ts +136 -0
- package/src/libs/engine/src/dsl/mermaid/MermaidClass.js +429 -0
- package/src/libs/engine/src/dsl/mermaid/MermaidClass.js.map +1 -0
- package/src/libs/engine/src/dsl/mermaid/MermaidER.d.ts +118 -0
- package/src/libs/engine/src/dsl/mermaid/MermaidER.js +338 -0
- package/src/libs/engine/src/dsl/mermaid/MermaidER.js.map +1 -0
- package/src/libs/engine/src/dsl/mermaid/MermaidState.d.ts +89 -0
- package/src/libs/engine/src/dsl/mermaid/MermaidState.js +613 -0
- package/src/libs/engine/src/dsl/mermaid/MermaidState.js.map +1 -0
- package/src/libs/engine/src/dsl/mermaid/index.d.ts +10 -0
- package/src/libs/engine/src/dsl/mermaid/index.js +33 -0
- package/src/libs/engine/src/dsl/mermaid/index.js.map +1 -0
- package/src/libs/engine/src/dsl/mermaid/layout.d.ts +70 -0
- package/src/libs/engine/src/dsl/mermaid/layout.js +162 -0
- package/src/libs/engine/src/dsl/mermaid/layout.js.map +1 -0
- package/src/libs/engine/src/dsl/mermaid/lines.d.ts +25 -0
- package/src/libs/engine/src/dsl/mermaid/lines.js +74 -0
- package/src/libs/engine/src/dsl/mermaid/lines.js.map +1 -0
- package/src/libs/engine/src/dsl/parser/Parser.d.ts +131 -0
- package/src/libs/engine/src/dsl/parser/Parser.js +725 -0
- package/src/libs/engine/src/dsl/parser/Parser.js.map +1 -0
- package/src/libs/engine/src/dsl/sync/BidirectionalSync.d.ts +154 -0
- package/src/libs/engine/src/dsl/sync/BidirectionalSync.js +389 -0
- package/src/libs/engine/src/dsl/sync/BidirectionalSync.js.map +1 -0
- package/src/libs/engine/src/dsl/sync/IntegratedSyncManager.d.ts +128 -0
- package/src/libs/engine/src/dsl/sync/IntegratedSyncManager.js +244 -0
- package/src/libs/engine/src/dsl/sync/IntegratedSyncManager.js.map +1 -0
- package/src/libs/engine/src/dsl/sync/LayoutApplicator.d.ts +140 -0
- package/src/libs/engine/src/dsl/sync/LayoutApplicator.js +271 -0
- package/src/libs/engine/src/dsl/sync/LayoutApplicator.js.map +1 -0
- package/src/libs/engine/src/dsl/sync/SyncStateManager.d.ts +145 -0
- package/src/libs/engine/src/dsl/sync/SyncStateManager.js +253 -0
- package/src/libs/engine/src/dsl/sync/SyncStateManager.js.map +1 -0
- package/src/libs/engine/src/dsl/sync/index.d.ts +13 -0
- package/src/libs/engine/src/dsl/sync/index.js +21 -0
- package/src/libs/engine/src/dsl/sync/index.js.map +1 -0
- package/src/libs/engine/src/dsl/transformer/ASTTransformer.d.ts +150 -0
- package/src/libs/engine/src/dsl/transformer/ASTTransformer.js +605 -0
- package/src/libs/engine/src/dsl/transformer/ASTTransformer.js.map +1 -0
- package/src/libs/engine/src/dsl/types/ASTNode.d.ts +159 -0
- package/src/libs/engine/src/dsl/types/ASTNode.js +31 -0
- package/src/libs/engine/src/dsl/types/ASTNode.js.map +1 -0
- package/src/libs/engine/src/dsl/types/Token.d.ts +79 -0
- package/src/libs/engine/src/dsl/types/Token.js +84 -0
- package/src/libs/engine/src/dsl/types/Token.js.map +1 -0
- package/src/libs/engine/src/engine/DiagramEngine.d.ts +917 -0
- package/src/libs/engine/src/engine/DiagramEngine.js +2190 -0
- package/src/libs/engine/src/engine/DiagramEngine.js.map +1 -0
- package/src/libs/engine/src/engine/DiagramMode.d.ts +51 -0
- package/src/libs/engine/src/engine/DiagramMode.js +53 -0
- package/src/libs/engine/src/engine/DiagramMode.js.map +1 -0
- package/src/libs/engine/src/engine/DiagramModeTypes.d.ts +73 -0
- package/src/libs/engine/src/engine/DiagramModeTypes.js +4 -0
- package/src/libs/engine/src/engine/DiagramModeTypes.js.map +1 -0
- package/src/libs/engine/src/engine/ModeManager.d.ts +155 -0
- package/src/libs/engine/src/engine/ModeManager.js +387 -0
- package/src/libs/engine/src/engine/ModeManager.js.map +1 -0
- package/src/libs/engine/src/engine/index.d.ts +2 -0
- package/src/libs/engine/src/engine/index.js +7 -0
- package/src/libs/engine/src/engine/index.js.map +1 -0
- package/src/libs/engine/src/events/EventBus.d.ts +106 -0
- package/src/libs/engine/src/events/EventBus.js +226 -0
- package/src/libs/engine/src/events/EventBus.js.map +1 -0
- package/src/libs/engine/src/events/index.d.ts +1 -0
- package/src/libs/engine/src/events/index.js +6 -0
- package/src/libs/engine/src/events/index.js.map +1 -0
- package/src/libs/engine/src/index.d.ts +43 -0
- package/src/libs/engine/src/index.js +142 -0
- package/src/libs/engine/src/index.js.map +1 -0
- package/src/libs/engine/src/interaction/GroupCollapseService.d.ts +53 -0
- package/src/libs/engine/src/interaction/GroupCollapseService.js +274 -0
- package/src/libs/engine/src/interaction/GroupCollapseService.js.map +1 -0
- package/src/libs/engine/src/interaction/GroupMembershipService.d.ts +107 -0
- package/src/libs/engine/src/interaction/GroupMembershipService.js +245 -0
- package/src/libs/engine/src/interaction/GroupMembershipService.js.map +1 -0
- package/src/libs/engine/src/interaction/SemanticMembershipService.d.ts +28 -0
- package/src/libs/engine/src/interaction/SemanticMembershipService.js +168 -0
- package/src/libs/engine/src/interaction/SemanticMembershipService.js.map +1 -0
- package/src/libs/engine/src/interaction/SwimlaneService.d.ts +62 -0
- package/src/libs/engine/src/interaction/SwimlaneService.js +180 -0
- package/src/libs/engine/src/interaction/SwimlaneService.js.map +1 -0
- package/src/libs/engine/src/interaction/index.d.ts +4 -0
- package/src/libs/engine/src/interaction/index.js +9 -0
- package/src/libs/engine/src/interaction/index.js.map +1 -0
- package/src/libs/engine/src/interop/drawio/importDrawio.d.ts +52 -0
- package/src/libs/engine/src/interop/drawio/importDrawio.js +940 -0
- package/src/libs/engine/src/interop/drawio/importDrawio.js.map +1 -0
- package/src/libs/engine/src/interop/drawio/index.d.ts +1 -0
- package/src/libs/engine/src/interop/drawio/index.js +12 -0
- package/src/libs/engine/src/interop/drawio/index.js.map +1 -0
- package/src/libs/engine/src/interop/drawio/xml.d.ts +26 -0
- package/src/libs/engine/src/interop/drawio/xml.js +213 -0
- package/src/libs/engine/src/interop/drawio/xml.js.map +1 -0
- package/src/libs/engine/src/layout/CompoundLayoutService.d.ts +121 -0
- package/src/libs/engine/src/layout/CompoundLayoutService.js +616 -0
- package/src/libs/engine/src/layout/CompoundLayoutService.js.map +1 -0
- package/src/libs/engine/src/layout/ILayoutAlgorithm.d.ts +120 -0
- package/src/libs/engine/src/layout/ILayoutAlgorithm.js +88 -0
- package/src/libs/engine/src/layout/ILayoutAlgorithm.js.map +1 -0
- package/src/libs/engine/src/layout/LayoutManager.d.ts +155 -0
- package/src/libs/engine/src/layout/LayoutManager.js +640 -0
- package/src/libs/engine/src/layout/LayoutManager.js.map +1 -0
- package/src/libs/engine/src/layout/SmartSpacingCalculator.d.ts +62 -0
- package/src/libs/engine/src/layout/SmartSpacingCalculator.js +134 -0
- package/src/libs/engine/src/layout/SmartSpacingCalculator.js.map +1 -0
- package/src/libs/engine/src/layout/ViewportTransform.d.ts +55 -0
- package/src/libs/engine/src/layout/ViewportTransform.js +118 -0
- package/src/libs/engine/src/layout/ViewportTransform.js.map +1 -0
- package/src/libs/engine/src/layout/algorithms/ForceDirectedLayoutAlgorithm.d.ts +34 -0
- package/src/libs/engine/src/layout/algorithms/ForceDirectedLayoutAlgorithm.js +317 -0
- package/src/libs/engine/src/layout/algorithms/ForceDirectedLayoutAlgorithm.js.map +1 -0
- package/src/libs/engine/src/layout/algorithms/GridLayoutAlgorithm.d.ts +56 -0
- package/src/libs/engine/src/layout/algorithms/GridLayoutAlgorithm.js +223 -0
- package/src/libs/engine/src/layout/algorithms/GridLayoutAlgorithm.js.map +1 -0
- package/src/libs/engine/src/layout/algorithms/HierarchicalLayoutAlgorithm.d.ts +60 -0
- package/src/libs/engine/src/layout/algorithms/HierarchicalLayoutAlgorithm.js +307 -0
- package/src/libs/engine/src/layout/algorithms/HierarchicalLayoutAlgorithm.js.map +1 -0
- package/src/libs/engine/src/layout/algorithms/HybridLayoutAlgorithm.d.ts +62 -0
- package/src/libs/engine/src/layout/algorithms/HybridLayoutAlgorithm.js +324 -0
- package/src/libs/engine/src/layout/algorithms/HybridLayoutAlgorithm.js.map +1 -0
- package/src/libs/engine/src/layout/community-layout-adapter.d.ts +107 -0
- package/src/libs/engine/src/layout/community-layout-adapter.js +486 -0
- package/src/libs/engine/src/layout/community-layout-adapter.js.map +1 -0
- package/src/libs/engine/src/layout/component-packing.d.ts +98 -0
- package/src/libs/engine/src/layout/component-packing.js +307 -0
- package/src/libs/engine/src/layout/component-packing.js.map +1 -0
- package/src/libs/engine/src/layout/dagre-layout-adapter.d.ts +122 -0
- package/src/libs/engine/src/layout/dagre-layout-adapter.js +697 -0
- package/src/libs/engine/src/layout/dagre-layout-adapter.js.map +1 -0
- package/src/libs/engine/src/layout/edge-bundling.interface.d.ts +159 -0
- package/src/libs/engine/src/layout/edge-bundling.interface.js +379 -0
- package/src/libs/engine/src/layout/edge-bundling.interface.js.map +1 -0
- package/src/libs/engine/src/layout/elk-layout-adapter.d.ts +121 -0
- package/src/libs/engine/src/layout/elk-layout-adapter.js +586 -0
- package/src/libs/engine/src/layout/elk-layout-adapter.js.map +1 -0
- package/src/libs/engine/src/layout/elk-loader.d.ts +1 -0
- package/src/libs/engine/src/layout/elk-loader.js +24 -0
- package/src/libs/engine/src/layout/elk-loader.js.map +1 -0
- package/src/libs/engine/src/layout/force-layout-adapter.d.ts +167 -0
- package/src/libs/engine/src/layout/force-layout-adapter.js +790 -0
- package/src/libs/engine/src/layout/force-layout-adapter.js.map +1 -0
- package/src/libs/engine/src/layout/grid-pack/grid-pack-engine.d.ts +323 -0
- package/src/libs/engine/src/layout/grid-pack/grid-pack-engine.js +685 -0
- package/src/libs/engine/src/layout/grid-pack/grid-pack-engine.js.map +1 -0
- package/src/libs/engine/src/layout/incremental/mental-map.d.ts +98 -0
- package/src/libs/engine/src/layout/incremental/mental-map.js +221 -0
- package/src/libs/engine/src/layout/incremental/mental-map.js.map +1 -0
- package/src/libs/engine/src/layout/incremental-layout.interface.d.ts +145 -0
- package/src/libs/engine/src/layout/incremental-layout.interface.js +300 -0
- package/src/libs/engine/src/layout/incremental-layout.interface.js.map +1 -0
- package/src/libs/engine/src/layout/index.d.ts +83 -0
- package/src/libs/engine/src/layout/index.js +116 -0
- package/src/libs/engine/src/layout/index.js.map +1 -0
- package/src/libs/engine/src/layout/layout-adapter.interface.d.ts +185 -0
- package/src/libs/engine/src/layout/layout-adapter.interface.js +10 -0
- package/src/libs/engine/src/layout/layout-adapter.interface.js.map +1 -0
- package/src/libs/engine/src/layout/layout-auto-select.d.ts +160 -0
- package/src/libs/engine/src/layout/layout-auto-select.js +621 -0
- package/src/libs/engine/src/layout/layout-auto-select.js.map +1 -0
- package/src/libs/engine/src/layout/layout-constraints.interface.d.ts +117 -0
- package/src/libs/engine/src/layout/layout-constraints.interface.js +138 -0
- package/src/libs/engine/src/layout/layout-constraints.interface.js.map +1 -0
- package/src/libs/engine/src/layout/layout-graph.d.ts +70 -0
- package/src/libs/engine/src/layout/layout-graph.js +119 -0
- package/src/libs/engine/src/layout/layout-graph.js.map +1 -0
- package/src/libs/engine/src/layout/layout-history.d.ts +147 -0
- package/src/libs/engine/src/layout/layout-history.js +258 -0
- package/src/libs/engine/src/layout/layout-history.js.map +1 -0
- package/src/libs/engine/src/layout/layout-host.d.ts +172 -0
- package/src/libs/engine/src/layout/layout-host.js +523 -0
- package/src/libs/engine/src/layout/layout-host.js.map +1 -0
- package/src/libs/engine/src/layout/layout-presets.d.ts +91 -0
- package/src/libs/engine/src/layout/layout-presets.js +333 -0
- package/src/libs/engine/src/layout/layout-presets.js.map +1 -0
- package/src/libs/engine/src/layout/layout-quality-extended.d.ts +66 -0
- package/src/libs/engine/src/layout/layout-quality-extended.js +246 -0
- package/src/libs/engine/src/layout/layout-quality-extended.js.map +1 -0
- package/src/libs/engine/src/layout/layout-quality-metrics.d.ts +127 -0
- package/src/libs/engine/src/layout/layout-quality-metrics.js +466 -0
- package/src/libs/engine/src/layout/layout-quality-metrics.js.map +1 -0
- package/src/libs/engine/src/layout/layout-registry.d.ts +309 -0
- package/src/libs/engine/src/layout/layout-registry.js +414 -0
- package/src/libs/engine/src/layout/layout-registry.js.map +1 -0
- package/src/libs/engine/src/layout/layout.service.d.ts +100 -0
- package/src/libs/engine/src/layout/layout.service.js +216 -0
- package/src/libs/engine/src/layout/layout.service.js.map +1 -0
- package/src/libs/engine/src/layout/overlap-removal.d.ts +20 -0
- package/src/libs/engine/src/layout/overlap-removal.js +117 -0
- package/src/libs/engine/src/layout/overlap-removal.js.map +1 -0
- package/src/libs/engine/src/layout/port-aware-layout.interface.d.ts +232 -0
- package/src/libs/engine/src/layout/port-aware-layout.interface.js +413 -0
- package/src/libs/engine/src/layout/port-aware-layout.interface.js.map +1 -0
- package/src/libs/engine/src/layout/port-label-bridge.d.ts +77 -0
- package/src/libs/engine/src/layout/port-label-bridge.js +250 -0
- package/src/libs/engine/src/layout/port-label-bridge.js.map +1 -0
- package/src/libs/engine/src/layout/portfolio-layouts.d.ts +53 -0
- package/src/libs/engine/src/layout/portfolio-layouts.js +388 -0
- package/src/libs/engine/src/layout/portfolio-layouts.js.map +1 -0
- package/src/libs/engine/src/layout/rng.d.ts +34 -0
- package/src/libs/engine/src/layout/rng.js +71 -0
- package/src/libs/engine/src/layout/rng.js.map +1 -0
- package/src/libs/engine/src/layout/spectral-layout-adapter.d.ts +72 -0
- package/src/libs/engine/src/layout/spectral-layout-adapter.js +379 -0
- package/src/libs/engine/src/layout/spectral-layout-adapter.js.map +1 -0
- package/src/libs/engine/src/layout/steppable-layout.d.ts +40 -0
- package/src/libs/engine/src/layout/steppable-layout.js +34 -0
- package/src/libs/engine/src/layout/steppable-layout.js.map +1 -0
- package/src/libs/engine/src/layout/subgraph-layout.interface.d.ts +269 -0
- package/src/libs/engine/src/layout/subgraph-layout.interface.js +452 -0
- package/src/libs/engine/src/layout/subgraph-layout.interface.js.map +1 -0
- package/src/libs/engine/src/layout/sugiyama/layered-layout.d.ts +9 -0
- package/src/libs/engine/src/layout/sugiyama/layered-layout.js +83 -0
- package/src/libs/engine/src/layout/sugiyama/layered-layout.js.map +1 -0
- package/src/libs/engine/src/layout/sugiyama/sugiyama.d.ts +91 -0
- package/src/libs/engine/src/layout/sugiyama/sugiyama.js +797 -0
- package/src/libs/engine/src/layout/sugiyama/sugiyama.js.map +1 -0
- package/src/libs/engine/src/layout/tree-layout.d.ts +43 -0
- package/src/libs/engine/src/layout/tree-layout.js +426 -0
- package/src/libs/engine/src/layout/tree-layout.js.map +1 -0
- package/src/libs/engine/src/layout/types.d.ts +263 -0
- package/src/libs/engine/src/layout/types.js +6 -0
- package/src/libs/engine/src/layout/types.js.map +1 -0
- package/src/libs/engine/src/lib/performance/mobile-performance.service.d.ts +43 -0
- package/src/libs/engine/src/lib/performance/mobile-performance.service.js +95 -0
- package/src/libs/engine/src/lib/performance/mobile-performance.service.js.map +1 -0
- package/src/libs/engine/src/models/DiagramEntity.d.ts +174 -0
- package/src/libs/engine/src/models/DiagramEntity.js +366 -0
- package/src/libs/engine/src/models/DiagramEntity.js.map +1 -0
- package/src/libs/engine/src/models/DiagramModel.d.ts +960 -0
- package/src/libs/engine/src/models/DiagramModel.js +2416 -0
- package/src/libs/engine/src/models/DiagramModel.js.map +1 -0
- package/src/libs/engine/src/models/GroupModel.d.ts +573 -0
- package/src/libs/engine/src/models/GroupModel.js +1373 -0
- package/src/libs/engine/src/models/GroupModel.js.map +1 -0
- package/src/libs/engine/src/models/LinkModel.d.ts +395 -0
- package/src/libs/engine/src/models/LinkModel.js +1045 -0
- package/src/libs/engine/src/models/LinkModel.js.map +1 -0
- package/src/libs/engine/src/models/NodeModel.d.ts +666 -0
- package/src/libs/engine/src/models/NodeModel.js +1512 -0
- package/src/libs/engine/src/models/NodeModel.js.map +1 -0
- package/src/libs/engine/src/models/PortModel.d.ts +292 -0
- package/src/libs/engine/src/models/PortModel.js +637 -0
- package/src/libs/engine/src/models/PortModel.js.map +1 -0
- package/src/libs/engine/src/models/StrokeModel.d.ts +160 -0
- package/src/libs/engine/src/models/StrokeModel.js +387 -0
- package/src/libs/engine/src/models/StrokeModel.js.map +1 -0
- package/src/libs/engine/src/models/index.d.ts +7 -0
- package/src/libs/engine/src/models/index.js +12 -0
- package/src/libs/engine/src/models/index.js.map +1 -0
- package/src/libs/engine/src/models/readonly-lock.d.ts +108 -0
- package/src/libs/engine/src/models/readonly-lock.js +125 -0
- package/src/libs/engine/src/models/readonly-lock.js.map +1 -0
- package/src/libs/engine/src/performance/LRUCache.d.ts +78 -0
- package/src/libs/engine/src/performance/LRUCache.js +179 -0
- package/src/libs/engine/src/performance/LRUCache.js.map +1 -0
- package/src/libs/engine/src/performance/PerformanceMonitor.d.ts +47 -0
- package/src/libs/engine/src/performance/PerformanceMonitor.js +112 -0
- package/src/libs/engine/src/performance/PerformanceMonitor.js.map +1 -0
- package/src/libs/engine/src/performance/SpatialIndex.d.ts +157 -0
- package/src/libs/engine/src/performance/SpatialIndex.js +306 -0
- package/src/libs/engine/src/performance/SpatialIndex.js.map +1 -0
- package/src/libs/engine/src/performance/index.d.ts +2 -0
- package/src/libs/engine/src/performance/index.js +7 -0
- package/src/libs/engine/src/performance/index.js.map +1 -0
- package/src/libs/engine/src/plugins/PluginManager.d.ts +95 -0
- package/src/libs/engine/src/plugins/PluginManager.js +388 -0
- package/src/libs/engine/src/plugins/PluginManager.js.map +1 -0
- package/src/libs/engine/src/plugins/index.d.ts +1 -0
- package/src/libs/engine/src/plugins/index.js +6 -0
- package/src/libs/engine/src/plugins/index.js.map +1 -0
- package/src/libs/engine/src/ports/connection-rules.d.ts +32 -0
- package/src/libs/engine/src/ports/connection-rules.js +131 -0
- package/src/libs/engine/src/ports/connection-rules.js.map +1 -0
- package/src/libs/engine/src/ports/dynamic-ports.d.ts +27 -0
- package/src/libs/engine/src/ports/dynamic-ports.js +135 -0
- package/src/libs/engine/src/ports/dynamic-ports.js.map +1 -0
- package/src/libs/engine/src/ports/index.d.ts +5 -0
- package/src/libs/engine/src/ports/index.js +16 -0
- package/src/libs/engine/src/ports/index.js.map +1 -0
- package/src/libs/engine/src/ports/port-groups.d.ts +43 -0
- package/src/libs/engine/src/ports/port-groups.js +185 -0
- package/src/libs/engine/src/ports/port-groups.js.map +1 -0
- package/src/libs/engine/src/ports/port-type-registry.d.ts +34 -0
- package/src/libs/engine/src/ports/port-type-registry.js +87 -0
- package/src/libs/engine/src/ports/port-type-registry.js.map +1 -0
- package/src/libs/engine/src/ports/port-types.d.ts +266 -0
- package/src/libs/engine/src/ports/port-types.js +30 -0
- package/src/libs/engine/src/ports/port-types.js.map +1 -0
- package/src/libs/engine/src/rendering/HtmlTemplateRenderer.d.ts +136 -0
- package/src/libs/engine/src/rendering/HtmlTemplateRenderer.js +292 -0
- package/src/libs/engine/src/rendering/HtmlTemplateRenderer.js.map +1 -0
- package/src/libs/engine/src/rendering/LemonadeJSRenderer.d.ts +160 -0
- package/src/libs/engine/src/rendering/LemonadeJSRenderer.js +362 -0
- package/src/libs/engine/src/rendering/LemonadeJSRenderer.js.map +1 -0
- package/src/libs/engine/src/rendering/index.d.ts +2 -0
- package/src/libs/engine/src/rendering/index.js +7 -0
- package/src/libs/engine/src/rendering/index.js.map +1 -0
- package/src/libs/engine/src/routing/LiveReroutingEngine.d.ts +75 -0
- package/src/libs/engine/src/routing/LiveReroutingEngine.js +173 -0
- package/src/libs/engine/src/routing/LiveReroutingEngine.js.map +1 -0
- package/src/libs/engine/src/routing/ObstacleIndex.d.ts +42 -0
- package/src/libs/engine/src/routing/ObstacleIndex.js +215 -0
- package/src/libs/engine/src/routing/ObstacleIndex.js.map +1 -0
- package/src/libs/engine/src/routing/ObstacleMap.d.ts +68 -0
- package/src/libs/engine/src/routing/ObstacleMap.js +312 -0
- package/src/libs/engine/src/routing/ObstacleMap.js.map +1 -0
- package/src/libs/engine/src/routing/ObstacleMapBuilder.d.ts +28 -0
- package/src/libs/engine/src/routing/ObstacleMapBuilder.js +76 -0
- package/src/libs/engine/src/routing/ObstacleMapBuilder.js.map +1 -0
- package/src/libs/engine/src/routing/PathSimplifier.d.ts +119 -0
- package/src/libs/engine/src/routing/PathSimplifier.js +224 -0
- package/src/libs/engine/src/routing/PathSimplifier.js.map +1 -0
- package/src/libs/engine/src/routing/RoutingEngine.d.ts +118 -0
- package/src/libs/engine/src/routing/RoutingEngine.js +546 -0
- package/src/libs/engine/src/routing/RoutingEngine.js.map +1 -0
- package/src/libs/engine/src/routing/algorithms/AStarRouter.d.ts +90 -0
- package/src/libs/engine/src/routing/algorithms/AStarRouter.js +331 -0
- package/src/libs/engine/src/routing/algorithms/AStarRouter.js.map +1 -0
- package/src/libs/engine/src/routing/algorithms/DijkstraRouter.d.ts +74 -0
- package/src/libs/engine/src/routing/algorithms/DijkstraRouter.js +297 -0
- package/src/libs/engine/src/routing/algorithms/DijkstraRouter.js.map +1 -0
- package/src/libs/engine/src/routing/algorithms/ElkRouter.d.ts +34 -0
- package/src/libs/engine/src/routing/algorithms/ElkRouter.js +210 -0
- package/src/libs/engine/src/routing/algorithms/ElkRouter.js.map +1 -0
- package/src/libs/engine/src/routing/algorithms/ManhattanRouter.d.ts +18 -0
- package/src/libs/engine/src/routing/algorithms/ManhattanRouter.js +224 -0
- package/src/libs/engine/src/routing/algorithms/ManhattanRouter.js.map +1 -0
- package/src/libs/engine/src/routing/algorithms/OrthogonalRouter.d.ts +173 -0
- package/src/libs/engine/src/routing/algorithms/OrthogonalRouter.js +1092 -0
- package/src/libs/engine/src/routing/algorithms/OrthogonalRouter.js.map +1 -0
- package/src/libs/engine/src/routing/algorithms/StraightRouter.d.ts +8 -0
- package/src/libs/engine/src/routing/algorithms/StraightRouter.js +53 -0
- package/src/libs/engine/src/routing/algorithms/StraightRouter.js.map +1 -0
- package/src/libs/engine/src/routing/algorithms/VisibilityGraphRouter.d.ts +59 -0
- package/src/libs/engine/src/routing/algorithms/VisibilityGraphRouter.js +258 -0
- package/src/libs/engine/src/routing/algorithms/VisibilityGraphRouter.js.map +1 -0
- package/src/libs/engine/src/routing/global/GlobalRouteSolver.d.ts +64 -0
- package/src/libs/engine/src/routing/global/GlobalRouteSolver.js +334 -0
- package/src/libs/engine/src/routing/global/GlobalRouteSolver.js.map +1 -0
- package/src/libs/engine/src/routing/global/solver-host.d.ts +65 -0
- package/src/libs/engine/src/routing/global/solver-host.js +87 -0
- package/src/libs/engine/src/routing/global/solver-host.js.map +1 -0
- package/src/libs/engine/src/routing/index.d.ts +15 -0
- package/src/libs/engine/src/routing/index.js +20 -0
- package/src/libs/engine/src/routing/index.js.map +1 -0
- package/src/libs/engine/src/routing/types.d.ts +161 -0
- package/src/libs/engine/src/routing/types.js +4 -0
- package/src/libs/engine/src/routing/types.js.map +1 -0
- package/src/libs/engine/src/selection/SelectionManager.d.ts +161 -0
- package/src/libs/engine/src/selection/SelectionManager.js +483 -0
- package/src/libs/engine/src/selection/SelectionManager.js.map +1 -0
- package/src/libs/engine/src/selection/index.d.ts +1 -0
- package/src/libs/engine/src/selection/index.js +6 -0
- package/src/libs/engine/src/selection/index.js.map +1 -0
- package/src/libs/engine/src/serialization/DiagramMigrations.d.ts +41 -0
- package/src/libs/engine/src/serialization/DiagramMigrations.js +124 -0
- package/src/libs/engine/src/serialization/DiagramMigrations.js.map +1 -0
- package/src/libs/engine/src/serialization/DiagramValidator.d.ts +20 -0
- package/src/libs/engine/src/serialization/DiagramValidator.js +136 -0
- package/src/libs/engine/src/serialization/DiagramValidator.js.map +1 -0
- package/src/libs/engine/src/serialization/DocumentEnvelope.d.ts +53 -0
- package/src/libs/engine/src/serialization/DocumentEnvelope.js +111 -0
- package/src/libs/engine/src/serialization/DocumentEnvelope.js.map +1 -0
- package/src/libs/engine/src/serialization/Incremental.d.ts +77 -0
- package/src/libs/engine/src/serialization/Incremental.js +227 -0
- package/src/libs/engine/src/serialization/Incremental.js.map +1 -0
- package/src/libs/engine/src/serialization/Serializer.d.ts +29 -0
- package/src/libs/engine/src/serialization/Serializer.js +45 -0
- package/src/libs/engine/src/serialization/Serializer.js.map +1 -0
- package/src/libs/engine/src/serialization/Subgraph.d.ts +51 -0
- package/src/libs/engine/src/serialization/Subgraph.js +172 -0
- package/src/libs/engine/src/serialization/Subgraph.js.map +1 -0
- package/src/libs/engine/src/serialization/TextFormat.d.ts +71 -0
- package/src/libs/engine/src/serialization/TextFormat.js +261 -0
- package/src/libs/engine/src/serialization/TextFormat.js.map +1 -0
- package/src/libs/engine/src/state/ConnectionStateManager.d.ts +178 -0
- package/src/libs/engine/src/state/ConnectionStateManager.js +319 -0
- package/src/libs/engine/src/state/ConnectionStateManager.js.map +1 -0
- package/src/libs/engine/src/state/DiagramStore.d.ts +134 -0
- package/src/libs/engine/src/state/DiagramStore.js +372 -0
- package/src/libs/engine/src/state/DiagramStore.js.map +1 -0
- package/src/libs/engine/src/state/index.d.ts +2 -0
- package/src/libs/engine/src/state/index.js +7 -0
- package/src/libs/engine/src/state/index.js.map +1 -0
- package/src/libs/engine/src/sync/awareness.d.ts +91 -0
- package/src/libs/engine/src/sync/awareness.js +221 -0
- package/src/libs/engine/src/sync/awareness.js.map +1 -0
- package/src/libs/engine/src/sync/batcher.d.ts +84 -0
- package/src/libs/engine/src/sync/batcher.js +0 -0
- package/src/libs/engine/src/sync/batcher.js.map +1 -0
- package/src/libs/engine/src/sync/causal-buffer.d.ts +81 -0
- package/src/libs/engine/src/sync/causal-buffer.js +199 -0
- package/src/libs/engine/src/sync/causal-buffer.js.map +1 -0
- package/src/libs/engine/src/sync/index.d.ts +20 -0
- package/src/libs/engine/src/sync/index.js +41 -0
- package/src/libs/engine/src/sync/index.js.map +1 -0
- package/src/libs/engine/src/sync/protocol.d.ts +74 -0
- package/src/libs/engine/src/sync/protocol.js +39 -0
- package/src/libs/engine/src/sync/protocol.js.map +1 -0
- package/src/libs/engine/src/sync/sync-adapter.d.ts +243 -0
- package/src/libs/engine/src/sync/sync-adapter.js +524 -0
- package/src/libs/engine/src/sync/sync-adapter.js.map +1 -0
- package/src/libs/engine/src/sync/transport.d.ts +30 -0
- package/src/libs/engine/src/sync/transport.js +28 -0
- package/src/libs/engine/src/sync/transport.js.map +1 -0
- package/src/libs/engine/src/sync/transports/broadcast-channel.d.ts +39 -0
- package/src/libs/engine/src/sync/transports/broadcast-channel.js +117 -0
- package/src/libs/engine/src/sync/transports/broadcast-channel.js.map +1 -0
- package/src/libs/engine/src/sync/transports/memory.d.ts +38 -0
- package/src/libs/engine/src/sync/transports/memory.js +111 -0
- package/src/libs/engine/src/sync/transports/memory.js.map +1 -0
- package/src/libs/engine/src/sync/transports/unreliable.d.ts +59 -0
- package/src/libs/engine/src/sync/transports/unreliable.js +153 -0
- package/src/libs/engine/src/sync/transports/unreliable.js.map +1 -0
- package/src/libs/engine/src/sync/transports/websocket.d.ts +60 -0
- package/src/libs/engine/src/sync/transports/websocket.js +210 -0
- package/src/libs/engine/src/sync/transports/websocket.js.map +1 -0
- package/src/libs/engine/src/sync/version-vector.d.ts +47 -0
- package/src/libs/engine/src/sync/version-vector.js +218 -0
- package/src/libs/engine/src/sync/version-vector.js.map +1 -0
- package/src/libs/engine/src/template-library/common-templates.d.ts +46 -0
- package/src/libs/engine/src/template-library/common-templates.js +395 -0
- package/src/libs/engine/src/template-library/common-templates.js.map +1 -0
- package/src/libs/engine/src/template-library/data-viz-templates.d.ts +52 -0
- package/src/libs/engine/src/template-library/data-viz-templates.js +471 -0
- package/src/libs/engine/src/template-library/data-viz-templates.js.map +1 -0
- package/src/libs/engine/src/template-library/erd-templates.d.ts +71 -0
- package/src/libs/engine/src/template-library/erd-templates.js +773 -0
- package/src/libs/engine/src/template-library/erd-templates.js.map +1 -0
- package/src/libs/engine/src/template-library/index.d.ts +141 -0
- package/src/libs/engine/src/template-library/index.js +271 -0
- package/src/libs/engine/src/template-library/index.js.map +1 -0
- package/src/libs/engine/src/template-library/integration.d.ts +80 -0
- package/src/libs/engine/src/template-library/integration.js +141 -0
- package/src/libs/engine/src/template-library/integration.js.map +1 -0
- package/src/libs/engine/src/template-library/workflow-templates.d.ts +52 -0
- package/src/libs/engine/src/template-library/workflow-templates.js +438 -0
- package/src/libs/engine/src/template-library/workflow-templates.js.map +1 -0
- package/src/libs/engine/src/templates/NodeFactory.d.ts +118 -0
- package/src/libs/engine/src/templates/NodeFactory.js +436 -0
- package/src/libs/engine/src/templates/NodeFactory.js.map +1 -0
- package/src/libs/engine/src/templates/NodeTemplate.d.ts +342 -0
- package/src/libs/engine/src/templates/NodeTemplate.js +13 -0
- package/src/libs/engine/src/templates/NodeTemplate.js.map +1 -0
- package/src/libs/engine/src/templates/TemplateLoader.d.ts +46 -0
- package/src/libs/engine/src/templates/TemplateLoader.js +114 -0
- package/src/libs/engine/src/templates/TemplateLoader.js.map +1 -0
- package/src/libs/engine/src/templates/TemplateRegistry.d.ts +70 -0
- package/src/libs/engine/src/templates/TemplateRegistry.js +128 -0
- package/src/libs/engine/src/templates/TemplateRegistry.js.map +1 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-business-rule-task.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-business-rule-task.template.js +123 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-business-rule-task.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-end-event.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-end-event.template.js +123 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-end-event.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-error-event.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-error-event.template.js +123 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-error-event.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-exclusive-gateway.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-exclusive-gateway.template.js +124 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-exclusive-gateway.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-inclusive-gateway.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-inclusive-gateway.template.js +123 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-inclusive-gateway.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-intermediate-event.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-intermediate-event.template.js +124 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-intermediate-event.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-manual-task.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-manual-task.template.js +123 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-manual-task.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-message-event.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-message-event.template.js +122 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-message-event.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-parallel-gateway.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-parallel-gateway.template.js +125 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-parallel-gateway.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-script-task.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-script-task.template.js +123 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-script-task.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-service-task.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-service-task.template.js +123 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-service-task.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-start-event.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-start-event.template.js +123 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-start-event.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-task.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-task.template.js +152 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-task.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-timer-event.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-timer-event.template.js +123 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-timer-event.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-user-task.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-user-task.template.js +123 -0
- package/src/libs/engine/src/templates/generated/bpmn/bpmn-user-task.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/bpmn/index.d.ts +15 -0
- package/src/libs/engine/src/templates/generated/bpmn/index.js +34 -0
- package/src/libs/engine/src/templates/generated/bpmn/index.js.map +1 -0
- package/src/libs/engine/src/templates/generated/erd/erd-associative-entity.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/erd/erd-associative-entity.template.js +152 -0
- package/src/libs/engine/src/templates/generated/erd/erd-associative-entity.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/erd/erd-attribute.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/erd/erd-attribute.template.js +122 -0
- package/src/libs/engine/src/templates/generated/erd/erd-attribute.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/erd/erd-bridge-entity.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/erd/erd-bridge-entity.template.js +151 -0
- package/src/libs/engine/src/templates/generated/erd/erd-bridge-entity.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/erd/erd-composite-attribute.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/erd/erd-composite-attribute.template.js +122 -0
- package/src/libs/engine/src/templates/generated/erd/erd-composite-attribute.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/erd/erd-derived-attribute.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/erd/erd-derived-attribute.template.js +122 -0
- package/src/libs/engine/src/templates/generated/erd/erd-derived-attribute.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/erd/erd-discriminator.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/erd/erd-discriminator.template.js +123 -0
- package/src/libs/engine/src/templates/generated/erd/erd-discriminator.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/erd/erd-entity.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/erd/erd-entity.template.js +149 -0
- package/src/libs/engine/src/templates/generated/erd/erd-entity.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/erd/erd-isa.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/erd/erd-isa.template.js +123 -0
- package/src/libs/engine/src/templates/generated/erd/erd-isa.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/erd/erd-key-attribute.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/erd/erd-key-attribute.template.js +122 -0
- package/src/libs/engine/src/templates/generated/erd/erd-key-attribute.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/erd/erd-multivalued-attribute.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/erd/erd-multivalued-attribute.template.js +122 -0
- package/src/libs/engine/src/templates/generated/erd/erd-multivalued-attribute.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/erd/erd-optional-attribute.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/erd/erd-optional-attribute.template.js +122 -0
- package/src/libs/engine/src/templates/generated/erd/erd-optional-attribute.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/erd/erd-partial-key.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/erd/erd-partial-key.template.js +123 -0
- package/src/libs/engine/src/templates/generated/erd/erd-partial-key.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/erd/erd-relationship.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/erd/erd-relationship.template.js +121 -0
- package/src/libs/engine/src/templates/generated/erd/erd-relationship.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/erd/erd-subtype.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/erd/erd-subtype.template.js +123 -0
- package/src/libs/engine/src/templates/generated/erd/erd-subtype.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/erd/erd-supertype.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/erd/erd-supertype.template.js +123 -0
- package/src/libs/engine/src/templates/generated/erd/erd-supertype.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/erd/erd-table.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/erd/erd-table.template.js +123 -0
- package/src/libs/engine/src/templates/generated/erd/erd-table.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/erd/erd-view.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/erd/erd-view.template.js +123 -0
- package/src/libs/engine/src/templates/generated/erd/erd-view.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/erd/erd-weak-entity.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/erd/erd-weak-entity.template.js +149 -0
- package/src/libs/engine/src/templates/generated/erd/erd-weak-entity.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/erd/erd-weak-relationship.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/erd/erd-weak-relationship.template.js +122 -0
- package/src/libs/engine/src/templates/generated/erd/erd-weak-relationship.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/erd/index.d.ts +19 -0
- package/src/libs/engine/src/templates/generated/erd/index.js +42 -0
- package/src/libs/engine/src/templates/generated/erd/index.js.map +1 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-connector.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-connector.template.js +123 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-connector.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-data.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-data.template.js +123 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-data.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-decision.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-decision.template.js +123 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-decision.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-delay.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-delay.template.js +124 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-delay.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-display.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-display.template.js +124 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-display.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-document.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-document.template.js +123 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-document.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-manual-input.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-manual-input.template.js +123 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-manual-input.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-manual-operation.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-manual-operation.template.js +122 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-manual-operation.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-merge.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-merge.template.js +122 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-merge.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-or.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-or.template.js +123 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-or.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-predefined-process.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-predefined-process.template.js +123 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-predefined-process.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-preparation.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-preparation.template.js +123 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-preparation.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-process.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-process.template.js +122 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-process.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-stored-data.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-stored-data.template.js +123 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-stored-data.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-summing-junction.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-summing-junction.template.js +124 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-summing-junction.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-terminal.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-terminal.template.js +124 -0
- package/src/libs/engine/src/templates/generated/flowchart/flowchart-terminal.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/flowchart/index.d.ts +16 -0
- package/src/libs/engine/src/templates/generated/flowchart/index.js +36 -0
- package/src/libs/engine/src/templates/generated/flowchart/index.js.map +1 -0
- package/src/libs/engine/src/templates/generated/index.d.ts +9 -0
- package/src/libs/engine/src/templates/generated/index.js +13 -0
- package/src/libs/engine/src/templates/generated/index.js.map +1 -0
- package/src/libs/engine/src/templates/generated/register.d.ts +23 -0
- package/src/libs/engine/src/templates/generated/register.js +31 -0
- package/src/libs/engine/src/templates/generated/register.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/index.d.ts +30 -0
- package/src/libs/engine/src/templates/generated/uml/index.js +64 -0
- package/src/libs/engine/src/templates/generated/uml/index.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-abstract-class.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-abstract-class.template.js +204 -0
- package/src/libs/engine/src/templates/generated/uml/uml-abstract-class.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-activation.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-activation.template.js +124 -0
- package/src/libs/engine/src/templates/generated/uml/uml-activation.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-activity-partition.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-activity-partition.template.js +124 -0
- package/src/libs/engine/src/templates/generated/uml/uml-activity-partition.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-activity.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-activity.template.js +123 -0
- package/src/libs/engine/src/templates/generated/uml/uml-activity.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-actor.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-actor.template.js +123 -0
- package/src/libs/engine/src/templates/generated/uml/uml-actor.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-class.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-class.template.js +204 -0
- package/src/libs/engine/src/templates/generated/uml/uml-class.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-collaboration.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-collaboration.template.js +122 -0
- package/src/libs/engine/src/templates/generated/uml/uml-collaboration.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-component.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-component.template.js +122 -0
- package/src/libs/engine/src/templates/generated/uml/uml-component.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-datatype.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-datatype.template.js +204 -0
- package/src/libs/engine/src/templates/generated/uml/uml-datatype.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-decision.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-decision.template.js +124 -0
- package/src/libs/engine/src/templates/generated/uml/uml-decision.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-enum.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-enum.template.js +204 -0
- package/src/libs/engine/src/templates/generated/uml/uml-enum.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-final-node.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-final-node.template.js +124 -0
- package/src/libs/engine/src/templates/generated/uml/uml-final-node.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-final-state.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-final-state.template.js +124 -0
- package/src/libs/engine/src/templates/generated/uml/uml-final-state.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-fork.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-fork.template.js +125 -0
- package/src/libs/engine/src/templates/generated/uml/uml-fork.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-initial-node.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-initial-node.template.js +123 -0
- package/src/libs/engine/src/templates/generated/uml/uml-initial-node.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-initial-state.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-initial-state.template.js +123 -0
- package/src/libs/engine/src/templates/generated/uml/uml-initial-state.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-interface.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-interface.template.js +204 -0
- package/src/libs/engine/src/templates/generated/uml/uml-interface.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-join.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-join.template.js +125 -0
- package/src/libs/engine/src/templates/generated/uml/uml-join.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-lifeline.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-lifeline.template.js +123 -0
- package/src/libs/engine/src/templates/generated/uml/uml-lifeline.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-merge.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-merge.template.js +122 -0
- package/src/libs/engine/src/templates/generated/uml/uml-merge.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-node.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-node.template.js +122 -0
- package/src/libs/engine/src/templates/generated/uml/uml-node.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-note.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-note.template.js +123 -0
- package/src/libs/engine/src/templates/generated/uml/uml-note.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-object.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-object.template.js +204 -0
- package/src/libs/engine/src/templates/generated/uml/uml-object.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-package.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-package.template.js +123 -0
- package/src/libs/engine/src/templates/generated/uml/uml-package.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-part.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-part.template.js +122 -0
- package/src/libs/engine/src/templates/generated/uml/uml-part.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-port.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-port.template.js +123 -0
- package/src/libs/engine/src/templates/generated/uml/uml-port.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-primitive-type.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-primitive-type.template.js +204 -0
- package/src/libs/engine/src/templates/generated/uml/uml-primitive-type.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-signal.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-signal.template.js +123 -0
- package/src/libs/engine/src/templates/generated/uml/uml-signal.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-state.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-state.template.js +123 -0
- package/src/libs/engine/src/templates/generated/uml/uml-state.template.js.map +1 -0
- package/src/libs/engine/src/templates/generated/uml/uml-use-case.template.d.ts +11 -0
- package/src/libs/engine/src/templates/generated/uml/uml-use-case.template.js +122 -0
- package/src/libs/engine/src/templates/generated/uml/uml-use-case.template.js.map +1 -0
- package/src/libs/engine/src/templates/index.d.ts +12 -0
- package/src/libs/engine/src/templates/index.js +27 -0
- package/src/libs/engine/src/templates/index.js.map +1 -0
- package/src/libs/engine/src/templates/stencils.d.ts +45 -0
- package/src/libs/engine/src/templates/stencils.js +85 -0
- package/src/libs/engine/src/templates/stencils.js.map +1 -0
- package/src/libs/engine/src/types/domain/bpmn.d.ts +25 -0
- package/src/libs/engine/src/types/domain/bpmn.js +313 -0
- package/src/libs/engine/src/types/domain/bpmn.js.map +1 -0
- package/src/libs/engine/src/types/domain/erd.d.ts +29 -0
- package/src/libs/engine/src/types/domain/erd.js +394 -0
- package/src/libs/engine/src/types/domain/erd.js.map +1 -0
- package/src/libs/engine/src/types/domain/flowchart.d.ts +26 -0
- package/src/libs/engine/src/types/domain/flowchart.js +434 -0
- package/src/libs/engine/src/types/domain/flowchart.js.map +1 -0
- package/src/libs/engine/src/types/domain/index.d.ts +4 -0
- package/src/libs/engine/src/types/domain/index.js +9 -0
- package/src/libs/engine/src/types/domain/index.js.map +1 -0
- package/src/libs/engine/src/types/domain/uml.d.ts +40 -0
- package/src/libs/engine/src/types/domain/uml.js +758 -0
- package/src/libs/engine/src/types/domain/uml.js.map +1 -0
- package/src/libs/engine/src/types/event.types.d.ts +142 -0
- package/src/libs/engine/src/types/event.types.js +96 -0
- package/src/libs/engine/src/types/event.types.js.map +1 -0
- package/src/libs/engine/src/types/geometry.types.d.ts +84 -0
- package/src/libs/engine/src/types/geometry.types.js +16 -0
- package/src/libs/engine/src/types/geometry.types.js.map +1 -0
- package/src/libs/engine/src/types/index.d.ts +7 -0
- package/src/libs/engine/src/types/index.js +14 -0
- package/src/libs/engine/src/types/index.js.map +1 -0
- package/src/libs/engine/src/types/layout.types.d.ts +148 -0
- package/src/libs/engine/src/types/layout.types.js +28 -0
- package/src/libs/engine/src/types/layout.types.js.map +1 -0
- package/src/libs/engine/src/types/model.types.d.ts +378 -0
- package/src/libs/engine/src/types/model.types.js +4 -0
- package/src/libs/engine/src/types/model.types.js.map +1 -0
- package/src/libs/engine/src/types/performance.types.d.ts +109 -0
- package/src/libs/engine/src/types/performance.types.js +122 -0
- package/src/libs/engine/src/types/performance.types.js.map +1 -0
- package/src/libs/engine/src/types/plugin.types.d.ts +30 -0
- package/src/libs/engine/src/types/plugin.types.js +4 -0
- package/src/libs/engine/src/types/plugin.types.js.map +1 -0
- package/src/libs/engine/src/utils/deep-clone.d.ts +9 -0
- package/src/libs/engine/src/utils/deep-clone.js +123 -0
- package/src/libs/engine/src/utils/deep-clone.js.map +1 -0
- package/src/libs/engine/src/utils/geometry.d.ts +45 -0
- package/src/libs/engine/src/utils/geometry.js +241 -0
- package/src/libs/engine/src/utils/geometry.js.map +1 -0
- package/src/libs/engine/src/utils/id.d.ts +22 -0
- package/src/libs/engine/src/utils/id.js +44 -0
- package/src/libs/engine/src/utils/id.js.map +1 -0
- package/src/libs/engine/src/utils/index.d.ts +3 -0
- package/src/libs/engine/src/utils/index.js +8 -0
- package/src/libs/engine/src/utils/index.js.map +1 -0
- package/src/libs/engine/src/utils/transform.d.ts +84 -0
- package/src/libs/engine/src/utils/transform.js +200 -0
- package/src/libs/engine/src/utils/transform.js.map +1 -0
- package/src/libs/engine/src/validation/ConnectionGroupValidator.d.ts +22 -0
- package/src/libs/engine/src/validation/ConnectionGroupValidator.js +56 -0
- package/src/libs/engine/src/validation/ConnectionGroupValidator.js.map +1 -0
- package/src/libs/engine/src/validation/TypeRegistry.d.ts +179 -0
- package/src/libs/engine/src/validation/TypeRegistry.js +358 -0
- package/src/libs/engine/src/validation/TypeRegistry.js.map +1 -0
- package/src/libs/engine/src/validation/ValidationEngine.d.ts +79 -0
- package/src/libs/engine/src/validation/ValidationEngine.js +1150 -0
- package/src/libs/engine/src/validation/ValidationEngine.js.map +1 -0
- package/src/libs/engine/src/validation/index.d.ts +3 -0
- package/src/libs/engine/src/validation/index.js +8 -0
- package/src/libs/engine/src/validation/index.js.map +1 -0
- package/src/libs/renderer/src/a11y/diagram-outline.d.ts +93 -0
- package/src/libs/renderer/src/a11y/diagram-outline.js +0 -0
- package/src/libs/renderer/src/a11y/diagram-outline.js.map +1 -0
- package/src/libs/renderer/src/a11y/focus-containment.d.ts +90 -0
- package/src/libs/renderer/src/a11y/focus-containment.js +173 -0
- package/src/libs/renderer/src/a11y/focus-containment.js.map +1 -0
- package/src/libs/renderer/src/a11y/graph-topology.d.ts +70 -0
- package/src/libs/renderer/src/a11y/graph-topology.js +0 -0
- package/src/libs/renderer/src/a11y/graph-topology.js.map +1 -0
- package/src/libs/renderer/src/a11y/index.d.ts +26 -0
- package/src/libs/renderer/src/a11y/index.js +30 -0
- package/src/libs/renderer/src/a11y/index.js.map +1 -0
- package/src/libs/renderer/src/a11y/live-region.d.ts +83 -0
- package/src/libs/renderer/src/a11y/live-region.js +170 -0
- package/src/libs/renderer/src/a11y/live-region.js.map +1 -0
- package/src/libs/renderer/src/a11y/outline-view.d.ts +62 -0
- package/src/libs/renderer/src/a11y/outline-view.js +158 -0
- package/src/libs/renderer/src/a11y/outline-view.js.map +1 -0
- package/src/libs/renderer/src/a11y/reduced-motion.d.ts +48 -0
- package/src/libs/renderer/src/a11y/reduced-motion.js +223 -0
- package/src/libs/renderer/src/a11y/reduced-motion.js.map +1 -0
- package/src/libs/renderer/src/a11y/semantics.d.ts +76 -0
- package/src/libs/renderer/src/a11y/semantics.js +229 -0
- package/src/libs/renderer/src/a11y/semantics.js.map +1 -0
- package/src/libs/renderer/src/canvas/canvas-context.d.ts +167 -0
- package/src/libs/renderer/src/canvas/canvas-context.js +267 -0
- package/src/libs/renderer/src/canvas/canvas-context.js.map +1 -0
- package/src/libs/renderer/src/canvas/canvas-renderer.d.ts +194 -0
- package/src/libs/renderer/src/canvas/canvas-renderer.js +600 -0
- package/src/libs/renderer/src/canvas/canvas-renderer.js.map +1 -0
- package/src/libs/renderer/src/canvas/dirty-region.d.ts +56 -0
- package/src/libs/renderer/src/canvas/dirty-region.js +171 -0
- package/src/libs/renderer/src/canvas/dirty-region.js.map +1 -0
- package/src/libs/renderer/src/canvas/index.d.ts +16 -0
- package/src/libs/renderer/src/canvas/index.js +79 -0
- package/src/libs/renderer/src/canvas/index.js.map +1 -0
- package/src/libs/renderer/src/canvas/path-geometry.d.ts +112 -0
- package/src/libs/renderer/src/canvas/path-geometry.js +673 -0
- package/src/libs/renderer/src/canvas/path-geometry.js.map +1 -0
- package/src/libs/renderer/src/canvas/render-backend.d.ts +133 -0
- package/src/libs/renderer/src/canvas/render-backend.js +339 -0
- package/src/libs/renderer/src/canvas/render-backend.js.map +1 -0
- package/src/libs/renderer/src/canvas/style-resolution.d.ts +101 -0
- package/src/libs/renderer/src/canvas/style-resolution.js +466 -0
- package/src/libs/renderer/src/canvas/style-resolution.js.map +1 -0
- package/src/libs/renderer/src/canvas/tier-policy.d.ts +33 -0
- package/src/libs/renderer/src/canvas/tier-policy.js +89 -0
- package/src/libs/renderer/src/canvas/tier-policy.js.map +1 -0
- package/src/libs/renderer/src/canvas/vnode-painter.d.ts +154 -0
- package/src/libs/renderer/src/canvas/vnode-painter.js +649 -0
- package/src/libs/renderer/src/canvas/vnode-painter.js.map +1 -0
- package/src/libs/renderer/src/comments/comment-overlay.d.ts +56 -0
- package/src/libs/renderer/src/comments/comment-overlay.js +127 -0
- package/src/libs/renderer/src/comments/comment-overlay.js.map +1 -0
- package/src/libs/renderer/src/comments/comment-panel.d.ts +45 -0
- package/src/libs/renderer/src/comments/comment-panel.js +287 -0
- package/src/libs/renderer/src/comments/comment-panel.js.map +1 -0
- package/src/libs/renderer/src/comments/comment-pins.d.ts +34 -0
- package/src/libs/renderer/src/comments/comment-pins.js +227 -0
- package/src/libs/renderer/src/comments/comment-pins.js.map +1 -0
- package/src/libs/renderer/src/comments/index.d.ts +3 -0
- package/src/libs/renderer/src/comments/index.js +17 -0
- package/src/libs/renderer/src/comments/index.js.map +1 -0
- package/src/libs/renderer/src/export/assets.d.ts +96 -0
- package/src/libs/renderer/src/export/assets.js +350 -0
- package/src/libs/renderer/src/export/assets.js.map +1 -0
- package/src/libs/renderer/src/export/batch.d.ts +49 -0
- package/src/libs/renderer/src/export/batch.js +95 -0
- package/src/libs/renderer/src/export/batch.js.map +1 -0
- package/src/libs/renderer/src/export/bounds.d.ts +81 -0
- package/src/libs/renderer/src/export/bounds.js +367 -0
- package/src/libs/renderer/src/export/bounds.js.map +1 -0
- package/src/libs/renderer/src/export/capture-host.d.ts +39 -0
- package/src/libs/renderer/src/export/capture-host.js +1259 -0
- package/src/libs/renderer/src/export/capture-host.js.map +1 -0
- package/src/libs/renderer/src/export/custom-nodes.d.ts +88 -0
- package/src/libs/renderer/src/export/custom-nodes.js +237 -0
- package/src/libs/renderer/src/export/custom-nodes.js.map +1 -0
- package/src/libs/renderer/src/export/index.d.ts +14 -0
- package/src/libs/renderer/src/export/index.js +30 -0
- package/src/libs/renderer/src/export/index.js.map +1 -0
- package/src/libs/renderer/src/export/node-raster.d.ts +60 -0
- package/src/libs/renderer/src/export/node-raster.js +161 -0
- package/src/libs/renderer/src/export/node-raster.js.map +1 -0
- package/src/libs/renderer/src/export/pagination.d.ts +116 -0
- package/src/libs/renderer/src/export/pagination.js +245 -0
- package/src/libs/renderer/src/export/pagination.js.map +1 -0
- package/src/libs/renderer/src/export/pdf/flate.d.ts +13 -0
- package/src/libs/renderer/src/export/pdf/flate.js +287 -0
- package/src/libs/renderer/src/export/pdf/flate.js.map +1 -0
- package/src/libs/renderer/src/export/pdf/index.d.ts +4 -0
- package/src/libs/renderer/src/export/pdf/index.js +15 -0
- package/src/libs/renderer/src/export/pdf/index.js.map +1 -0
- package/src/libs/renderer/src/export/pdf/pdf-export.d.ts +64 -0
- package/src/libs/renderer/src/export/pdf/pdf-export.js +1076 -0
- package/src/libs/renderer/src/export/pdf/pdf-export.js.map +1 -0
- package/src/libs/renderer/src/export/pdf/pdf-path.d.ts +17 -0
- package/src/libs/renderer/src/export/pdf/pdf-path.js +85 -0
- package/src/libs/renderer/src/export/pdf/pdf-path.js.map +1 -0
- package/src/libs/renderer/src/export/pdf/pdf-primitives.d.ts +115 -0
- package/src/libs/renderer/src/export/pdf/pdf-primitives.js +338 -0
- package/src/libs/renderer/src/export/pdf/pdf-primitives.js.map +1 -0
- package/src/libs/renderer/src/export/pdf/png.d.ts +25 -0
- package/src/libs/renderer/src/export/pdf/png.js +596 -0
- package/src/libs/renderer/src/export/pdf/png.js.map +1 -0
- package/src/libs/renderer/src/export/raster.d.ts +42 -0
- package/src/libs/renderer/src/export/raster.js +126 -0
- package/src/libs/renderer/src/export/raster.js.map +1 -0
- package/src/libs/renderer/src/export/round-trip.d.ts +83 -0
- package/src/libs/renderer/src/export/round-trip.js +432 -0
- package/src/libs/renderer/src/export/round-trip.js.map +1 -0
- package/src/libs/renderer/src/export/scope.d.ts +16 -0
- package/src/libs/renderer/src/export/scope.js +69 -0
- package/src/libs/renderer/src/export/scope.js.map +1 -0
- package/src/libs/renderer/src/export/style-flattener.d.ts +23 -0
- package/src/libs/renderer/src/export/style-flattener.js +144 -0
- package/src/libs/renderer/src/export/style-flattener.js.map +1 -0
- package/src/libs/renderer/src/export/svg-export.d.ts +123 -0
- package/src/libs/renderer/src/export/svg-export.js +178 -0
- package/src/libs/renderer/src/export/svg-export.js.map +1 -0
- package/src/libs/renderer/src/export/vnode-serializer.d.ts +75 -0
- package/src/libs/renderer/src/export/vnode-serializer.js +344 -0
- package/src/libs/renderer/src/export/vnode-serializer.js.map +1 -0
- package/src/libs/renderer/src/ext/capabilities.d.ts +178 -0
- package/src/libs/renderer/src/ext/capabilities.js +22 -0
- package/src/libs/renderer/src/ext/capabilities.js.map +1 -0
- package/src/libs/renderer/src/ext/capability-factory.d.ts +44 -0
- package/src/libs/renderer/src/ext/capability-factory.js +194 -0
- package/src/libs/renderer/src/ext/capability-factory.js.map +1 -0
- package/src/libs/renderer/src/ext/components/attach.d.ts +66 -0
- package/src/libs/renderer/src/ext/components/attach.js +112 -0
- package/src/libs/renderer/src/ext/components/attach.js.map +1 -0
- package/src/libs/renderer/src/ext/components/background.d.ts +84 -0
- package/src/libs/renderer/src/ext/components/background.js +202 -0
- package/src/libs/renderer/src/ext/components/background.js.map +1 -0
- package/src/libs/renderer/src/ext/components/controls.d.ts +49 -0
- package/src/libs/renderer/src/ext/components/controls.js +144 -0
- package/src/libs/renderer/src/ext/components/controls.js.map +1 -0
- package/src/libs/renderer/src/ext/components/minimap.d.ts +78 -0
- package/src/libs/renderer/src/ext/components/minimap.js +326 -0
- package/src/libs/renderer/src/ext/components/minimap.js.map +1 -0
- package/src/libs/renderer/src/ext/diagram-registry.d.ts +109 -0
- package/src/libs/renderer/src/ext/diagram-registry.js +303 -0
- package/src/libs/renderer/src/ext/diagram-registry.js.map +1 -0
- package/src/libs/renderer/src/ext/disposable.d.ts +51 -0
- package/src/libs/renderer/src/ext/disposable.js +104 -0
- package/src/libs/renderer/src/ext/disposable.js.map +1 -0
- package/src/libs/renderer/src/ext/extension-host.d.ts +144 -0
- package/src/libs/renderer/src/ext/extension-host.js +272 -0
- package/src/libs/renderer/src/ext/extension-host.js.map +1 -0
- package/src/libs/renderer/src/ext/index.d.ts +62 -0
- package/src/libs/renderer/src/ext/index.js +91 -0
- package/src/libs/renderer/src/ext/index.js.map +1 -0
- package/src/libs/renderer/src/ext/link-pipeline.d.ts +195 -0
- package/src/libs/renderer/src/ext/link-pipeline.js +431 -0
- package/src/libs/renderer/src/ext/link-pipeline.js.map +1 -0
- package/src/libs/renderer/src/ext/manifest.d.ts +73 -0
- package/src/libs/renderer/src/ext/manifest.js +149 -0
- package/src/libs/renderer/src/ext/manifest.js.map +1 -0
- package/src/libs/renderer/src/ext/node-component.d.ts +114 -0
- package/src/libs/renderer/src/ext/node-component.js +290 -0
- package/src/libs/renderer/src/ext/node-component.js.map +1 -0
- package/src/libs/renderer/src/ext/plugins-loader.d.ts +1 -0
- package/src/libs/renderer/src/ext/plugins-loader.js +18 -0
- package/src/libs/renderer/src/ext/plugins-loader.js.map +1 -0
- package/src/libs/renderer/src/ext/portal.d.ts +129 -0
- package/src/libs/renderer/src/ext/portal.js +267 -0
- package/src/libs/renderer/src/ext/portal.js.map +1 -0
- package/src/libs/renderer/src/ext/public-api.d.ts +101 -0
- package/src/libs/renderer/src/ext/public-api.js +201 -0
- package/src/libs/renderer/src/ext/public-api.js.map +1 -0
- package/src/libs/renderer/src/ext/registry-scope.d.ts +93 -0
- package/src/libs/renderer/src/ext/registry-scope.js +142 -0
- package/src/libs/renderer/src/ext/registry-scope.js.map +1 -0
- package/src/libs/renderer/src/ext/tools.d.ts +164 -0
- package/src/libs/renderer/src/ext/tools.js +170 -0
- package/src/libs/renderer/src/ext/tools.js.map +1 -0
- package/src/libs/renderer/src/index.d.ts +34 -0
- package/src/libs/renderer/src/index.js +108 -0
- package/src/libs/renderer/src/index.js.map +1 -0
- package/src/libs/renderer/src/instance/create-diagram.d.ts +385 -0
- package/src/libs/renderer/src/instance/create-diagram.js +1150 -0
- package/src/libs/renderer/src/instance/create-diagram.js.map +1 -0
- package/src/libs/renderer/src/instance/diagram-instance.d.ts +48 -0
- package/src/libs/renderer/src/instance/diagram-instance.js +51 -0
- package/src/libs/renderer/src/instance/diagram-instance.js.map +1 -0
- package/src/libs/renderer/src/instance/dom-event-binder.d.ts +394 -0
- package/src/libs/renderer/src/instance/dom-event-binder.js +2104 -0
- package/src/libs/renderer/src/instance/dom-event-binder.js.map +1 -0
- package/src/libs/renderer/src/instance/index.d.ts +5 -0
- package/src/libs/renderer/src/instance/index.js +13 -0
- package/src/libs/renderer/src/instance/index.js.map +1 -0
- package/src/libs/renderer/src/instance/layers.d.ts +31 -0
- package/src/libs/renderer/src/instance/layers.js +43 -0
- package/src/libs/renderer/src/instance/layers.js.map +1 -0
- package/src/libs/renderer/src/instance/model-input.d.ts +229 -0
- package/src/libs/renderer/src/instance/model-input.js +325 -0
- package/src/libs/renderer/src/instance/model-input.js.map +1 -0
- package/src/libs/renderer/src/instance/render-scheduler.d.ts +79 -0
- package/src/libs/renderer/src/instance/render-scheduler.js +96 -0
- package/src/libs/renderer/src/instance/render-scheduler.js.map +1 -0
- package/src/libs/renderer/src/instance/wheel-scroll-yield.d.ts +38 -0
- package/src/libs/renderer/src/instance/wheel-scroll-yield.js +118 -0
- package/src/libs/renderer/src/instance/wheel-scroll-yield.js.map +1 -0
- package/src/libs/renderer/src/interaction/ControlPointEditor.d.ts +160 -0
- package/src/libs/renderer/src/interaction/ControlPointEditor.js +360 -0
- package/src/libs/renderer/src/interaction/ControlPointEditor.js.map +1 -0
- package/src/libs/renderer/src/interaction/WaypointEditor.d.ts +133 -0
- package/src/libs/renderer/src/interaction/WaypointEditor.js +263 -0
- package/src/libs/renderer/src/interaction/WaypointEditor.js.map +1 -0
- package/src/libs/renderer/src/interaction/highlighters.d.ts +88 -0
- package/src/libs/renderer/src/interaction/highlighters.js +212 -0
- package/src/libs/renderer/src/interaction/highlighters.js.map +1 -0
- package/src/libs/renderer/src/interaction/in-place-editor.d.ts +63 -0
- package/src/libs/renderer/src/interaction/in-place-editor.js +141 -0
- package/src/libs/renderer/src/interaction/in-place-editor.js.map +1 -0
- package/src/libs/renderer/src/interaction/index.d.ts +11 -0
- package/src/libs/renderer/src/interaction/index.js +29 -0
- package/src/libs/renderer/src/interaction/index.js.map +1 -0
- package/src/libs/renderer/src/interaction/ink-overlay.d.ts +53 -0
- package/src/libs/renderer/src/interaction/ink-overlay.js +154 -0
- package/src/libs/renderer/src/interaction/ink-overlay.js.map +1 -0
- package/src/libs/renderer/src/interaction/interaction-controller.d.ts +555 -0
- package/src/libs/renderer/src/interaction/interaction-controller.js +1733 -0
- package/src/libs/renderer/src/interaction/interaction-controller.js.map +1 -0
- package/src/libs/renderer/src/interaction/keyboard-navigation.d.ts +223 -0
- package/src/libs/renderer/src/interaction/keyboard-navigation.js +885 -0
- package/src/libs/renderer/src/interaction/keyboard-navigation.js.map +1 -0
- package/src/libs/renderer/src/interaction/selection-tools.d.ts +343 -0
- package/src/libs/renderer/src/interaction/selection-tools.js +918 -0
- package/src/libs/renderer/src/interaction/selection-tools.js.map +1 -0
- package/src/libs/renderer/src/interaction/snapping.d.ts +210 -0
- package/src/libs/renderer/src/interaction/snapping.js +569 -0
- package/src/libs/renderer/src/interaction/snapping.js.map +1 -0
- package/src/libs/renderer/src/interaction/touch-gestures.d.ts +160 -0
- package/src/libs/renderer/src/interaction/touch-gestures.js +549 -0
- package/src/libs/renderer/src/interaction/touch-gestures.js.map +1 -0
- package/src/libs/renderer/src/interaction/whiteboard-tools.d.ts +171 -0
- package/src/libs/renderer/src/interaction/whiteboard-tools.js +476 -0
- package/src/libs/renderer/src/interaction/whiteboard-tools.js.map +1 -0
- package/src/libs/renderer/src/lazy/host-culling.d.ts +116 -0
- package/src/libs/renderer/src/lazy/host-culling.js +135 -0
- package/src/libs/renderer/src/lazy/host-culling.js.map +1 -0
- package/src/libs/renderer/src/lazy/index.d.ts +7 -0
- package/src/libs/renderer/src/lazy/index.js +28 -0
- package/src/libs/renderer/src/lazy/index.js.map +1 -0
- package/src/libs/renderer/src/lazy/progressive-mounter.d.ts +80 -0
- package/src/libs/renderer/src/lazy/progressive-mounter.js +264 -0
- package/src/libs/renderer/src/lazy/progressive-mounter.js.map +1 -0
- package/src/libs/renderer/src/lazy/types.d.ts +43 -0
- package/src/libs/renderer/src/lazy/types.js +14 -0
- package/src/libs/renderer/src/lazy/types.js.map +1 -0
- package/src/libs/renderer/src/lazy/view-lifecycle.d.ts +97 -0
- package/src/libs/renderer/src/lazy/view-lifecycle.js +221 -0
- package/src/libs/renderer/src/lazy/view-lifecycle.js.map +1 -0
- package/src/libs/renderer/src/perf/index.d.ts +2 -0
- package/src/libs/renderer/src/perf/index.js +7 -0
- package/src/libs/renderer/src/perf/index.js.map +1 -0
- package/src/libs/renderer/src/perf/perf-hud.d.ts +46 -0
- package/src/libs/renderer/src/perf/perf-hud.js +105 -0
- package/src/libs/renderer/src/perf/perf-hud.js.map +1 -0
- package/src/libs/renderer/src/perf/quality-governor.d.ts +77 -0
- package/src/libs/renderer/src/perf/quality-governor.js +154 -0
- package/src/libs/renderer/src/perf/quality-governor.js.map +1 -0
- package/src/libs/renderer/src/platform/index.d.ts +1 -0
- package/src/libs/renderer/src/platform/index.js +5 -0
- package/src/libs/renderer/src/platform/index.js.map +1 -0
- package/src/libs/renderer/src/platform/platform.d.ts +34 -0
- package/src/libs/renderer/src/platform/platform.js +64 -0
- package/src/libs/renderer/src/platform/platform.js.map +1 -0
- package/src/libs/renderer/src/presence/bind-presence.d.ts +51 -0
- package/src/libs/renderer/src/presence/bind-presence.js +144 -0
- package/src/libs/renderer/src/presence/bind-presence.js.map +1 -0
- package/src/libs/renderer/src/presence/index.d.ts +4 -0
- package/src/libs/renderer/src/presence/index.js +18 -0
- package/src/libs/renderer/src/presence/index.js.map +1 -0
- package/src/libs/renderer/src/presence/presence-overlay.d.ts +121 -0
- package/src/libs/renderer/src/presence/presence-overlay.js +465 -0
- package/src/libs/renderer/src/presence/presence-overlay.js.map +1 -0
- package/src/libs/renderer/src/presentation/index.d.ts +3 -0
- package/src/libs/renderer/src/presentation/index.js +14 -0
- package/src/libs/renderer/src/presentation/index.js.map +1 -0
- package/src/libs/renderer/src/presentation/presentation.d.ts +94 -0
- package/src/libs/renderer/src/presentation/presentation.js +158 -0
- package/src/libs/renderer/src/presentation/presentation.js.map +1 -0
- package/src/libs/renderer/src/presentation/viewport-channel.d.ts +78 -0
- package/src/libs/renderer/src/presentation/viewport-channel.js +86 -0
- package/src/libs/renderer/src/presentation/viewport-channel.js.map +1 -0
- package/src/libs/renderer/src/services/animation-lifecycle.d.ts +153 -0
- package/src/libs/renderer/src/services/animation-lifecycle.js +326 -0
- package/src/libs/renderer/src/services/animation-lifecycle.js.map +1 -0
- package/src/libs/renderer/src/services/animation-performance.service.d.ts +191 -0
- package/src/libs/renderer/src/services/animation-performance.service.js +371 -0
- package/src/libs/renderer/src/services/animation-performance.service.js.map +1 -0
- package/src/libs/renderer/src/services/animation-sequencer.d.ts +226 -0
- package/src/libs/renderer/src/services/animation-sequencer.js +379 -0
- package/src/libs/renderer/src/services/animation-sequencer.js.map +1 -0
- package/src/libs/renderer/src/services/animation.service.d.ts +182 -0
- package/src/libs/renderer/src/services/animation.service.js +858 -0
- package/src/libs/renderer/src/services/animation.service.js.map +1 -0
- package/src/libs/renderer/src/services/custom-animation-registry.d.ts +182 -0
- package/src/libs/renderer/src/services/custom-animation-registry.js +361 -0
- package/src/libs/renderer/src/services/custom-animation-registry.js.map +1 -0
- package/src/libs/renderer/src/ssr/index.d.ts +1 -0
- package/src/libs/renderer/src/ssr/index.js +6 -0
- package/src/libs/renderer/src/ssr/index.js.map +1 -0
- package/src/libs/renderer/src/ssr/render-to-static.d.ts +91 -0
- package/src/libs/renderer/src/ssr/render-to-static.js +81 -0
- package/src/libs/renderer/src/ssr/render-to-static.js.map +1 -0
- package/src/libs/renderer/src/svg/ArrowRenderer.d.ts +159 -0
- package/src/libs/renderer/src/svg/ArrowRenderer.js +723 -0
- package/src/libs/renderer/src/svg/ArrowRenderer.js.map +1 -0
- package/src/libs/renderer/src/svg/JumpPointDetector.d.ts +79 -0
- package/src/libs/renderer/src/svg/JumpPointDetector.js +176 -0
- package/src/libs/renderer/src/svg/JumpPointDetector.js.map +1 -0
- package/src/libs/renderer/src/svg/JumpPointRenderer.d.ts +59 -0
- package/src/libs/renderer/src/svg/JumpPointRenderer.js +309 -0
- package/src/libs/renderer/src/svg/JumpPointRenderer.js.map +1 -0
- package/src/libs/renderer/src/svg/LabelRenderer.d.ts +76 -0
- package/src/libs/renderer/src/svg/LabelRenderer.js +273 -0
- package/src/libs/renderer/src/svg/LabelRenderer.js.map +1 -0
- package/src/libs/renderer/src/svg/auto-size.d.ts +76 -0
- package/src/libs/renderer/src/svg/auto-size.js +142 -0
- package/src/libs/renderer/src/svg/auto-size.js.map +1 -0
- package/src/libs/renderer/src/svg/channel-nudging.d.ts +34 -0
- package/src/libs/renderer/src/svg/channel-nudging.js +226 -0
- package/src/libs/renderer/src/svg/channel-nudging.js.map +1 -0
- package/src/libs/renderer/src/svg/edge-optimizer.d.ts +228 -0
- package/src/libs/renderer/src/svg/edge-optimizer.js +606 -0
- package/src/libs/renderer/src/svg/edge-optimizer.js.map +1 -0
- package/src/libs/renderer/src/svg/edge-templates.d.ts +152 -0
- package/src/libs/renderer/src/svg/edge-templates.js +233 -0
- package/src/libs/renderer/src/svg/edge-templates.js.map +1 -0
- package/src/libs/renderer/src/svg/html-node.d.ts +50 -0
- package/src/libs/renderer/src/svg/html-node.js +214 -0
- package/src/libs/renderer/src/svg/html-node.js.map +1 -0
- package/src/libs/renderer/src/svg/index.d.ts +25 -0
- package/src/libs/renderer/src/svg/index.js +32 -0
- package/src/libs/renderer/src/svg/index.js.map +1 -0
- package/src/libs/renderer/src/svg/link-fanout.d.ts +127 -0
- package/src/libs/renderer/src/svg/link-fanout.js +333 -0
- package/src/libs/renderer/src/svg/link-fanout.js.map +1 -0
- package/src/libs/renderer/src/svg/link-hit-test.d.ts +142 -0
- package/src/libs/renderer/src/svg/link-hit-test.js +182 -0
- package/src/libs/renderer/src/svg/link-hit-test.js.map +1 -0
- package/src/libs/renderer/src/svg/motion-tracker.d.ts +18 -0
- package/src/libs/renderer/src/svg/motion-tracker.js +71 -0
- package/src/libs/renderer/src/svg/motion-tracker.js.map +1 -0
- package/src/libs/renderer/src/svg/node-sizing.d.ts +51 -0
- package/src/libs/renderer/src/svg/node-sizing.js +65 -0
- package/src/libs/renderer/src/svg/node-sizing.js.map +1 -0
- package/src/libs/renderer/src/svg/node-toolbar.d.ts +30 -0
- package/src/libs/renderer/src/svg/node-toolbar.js +45 -0
- package/src/libs/renderer/src/svg/node-toolbar.js.map +1 -0
- package/src/libs/renderer/src/svg/notation-shapes.d.ts +2 -0
- package/src/libs/renderer/src/svg/notation-shapes.js +126 -0
- package/src/libs/renderer/src/svg/notation-shapes.js.map +1 -0
- package/src/libs/renderer/src/svg/paint-servers.d.ts +49 -0
- package/src/libs/renderer/src/svg/paint-servers.js +225 -0
- package/src/libs/renderer/src/svg/paint-servers.js.map +1 -0
- package/src/libs/renderer/src/svg/panel.d.ts +115 -0
- package/src/libs/renderer/src/svg/panel.js +353 -0
- package/src/libs/renderer/src/svg/panel.js.map +1 -0
- package/src/libs/renderer/src/svg/path-outline.d.ts +35 -0
- package/src/libs/renderer/src/svg/path-outline.js +134 -0
- package/src/libs/renderer/src/svg/path-outline.js.map +1 -0
- package/src/libs/renderer/src/svg/port-glyph.d.ts +27 -0
- package/src/libs/renderer/src/svg/port-glyph.js +97 -0
- package/src/libs/renderer/src/svg/port-glyph.js.map +1 -0
- package/src/libs/renderer/src/svg/port-label.d.ts +74 -0
- package/src/libs/renderer/src/svg/port-label.js +201 -0
- package/src/libs/renderer/src/svg/port-label.js.map +1 -0
- package/src/libs/renderer/src/svg/port-layout.d.ts +50 -0
- package/src/libs/renderer/src/svg/port-layout.js +212 -0
- package/src/libs/renderer/src/svg/port-layout.js.map +1 -0
- package/src/libs/renderer/src/svg/port-positioning.d.ts +33 -0
- package/src/libs/renderer/src/svg/port-positioning.js +101 -0
- package/src/libs/renderer/src/svg/port-positioning.js.map +1 -0
- package/src/libs/renderer/src/svg/port-spots.d.ts +69 -0
- package/src/libs/renderer/src/svg/port-spots.js +154 -0
- package/src/libs/renderer/src/svg/port-spots.js.map +1 -0
- package/src/libs/renderer/src/svg/route-memo.d.ts +63 -0
- package/src/libs/renderer/src/svg/route-memo.js +206 -0
- package/src/libs/renderer/src/svg/route-memo.js.map +1 -0
- package/src/libs/renderer/src/svg/route-solver-bridge.d.ts +48 -0
- package/src/libs/renderer/src/svg/route-solver-bridge.js +151 -0
- package/src/libs/renderer/src/svg/route-solver-bridge.js.map +1 -0
- package/src/libs/renderer/src/svg/shape-registry.d.ts +189 -0
- package/src/libs/renderer/src/svg/shape-registry.js +1104 -0
- package/src/libs/renderer/src/svg/shape-registry.js.map +1 -0
- package/src/libs/renderer/src/svg/stroke-layer.d.ts +36 -0
- package/src/libs/renderer/src/svg/stroke-layer.js +183 -0
- package/src/libs/renderer/src/svg/stroke-layer.js.map +1 -0
- package/src/libs/renderer/src/svg/svg-renderer.d.ts +1737 -0
- package/src/libs/renderer/src/svg/svg-renderer.js +7772 -0
- package/src/libs/renderer/src/svg/svg-renderer.js.map +1 -0
- package/src/libs/renderer/src/svg/text-block.d.ts +54 -0
- package/src/libs/renderer/src/svg/text-block.js +171 -0
- package/src/libs/renderer/src/svg/text-block.js.map +1 -0
- package/src/libs/renderer/src/themes/color-mode.d.ts +81 -0
- package/src/libs/renderer/src/themes/color-mode.js +158 -0
- package/src/libs/renderer/src/themes/color-mode.js.map +1 -0
- package/src/libs/renderer/src/themes/contrast.d.ts +67 -0
- package/src/libs/renderer/src/themes/contrast.js +215 -0
- package/src/libs/renderer/src/themes/contrast.js.map +1 -0
- package/src/libs/renderer/src/themes/default-dark-theme.d.ts +6 -0
- package/src/libs/renderer/src/themes/default-dark-theme.js +126 -0
- package/src/libs/renderer/src/themes/default-dark-theme.js.map +1 -0
- package/src/libs/renderer/src/themes/default-light-theme.d.ts +6 -0
- package/src/libs/renderer/src/themes/default-light-theme.js +168 -0
- package/src/libs/renderer/src/themes/default-light-theme.js.map +1 -0
- package/src/libs/renderer/src/themes/default-theme-set.d.ts +10 -0
- package/src/libs/renderer/src/themes/default-theme-set.js +25 -0
- package/src/libs/renderer/src/themes/default-theme-set.js.map +1 -0
- package/src/libs/renderer/src/themes/high-contrast-theme.d.ts +5 -0
- package/src/libs/renderer/src/themes/high-contrast-theme.js +170 -0
- package/src/libs/renderer/src/themes/high-contrast-theme.js.map +1 -0
- package/src/libs/renderer/src/themes/index.d.ts +22 -0
- package/src/libs/renderer/src/themes/index.js +93 -0
- package/src/libs/renderer/src/themes/index.js.map +1 -0
- package/src/libs/renderer/src/themes/style-cascade.d.ts +23 -0
- package/src/libs/renderer/src/themes/style-cascade.js +194 -0
- package/src/libs/renderer/src/themes/style-cascade.js.map +1 -0
- package/src/libs/renderer/src/themes/style-registry.d.ts +40 -0
- package/src/libs/renderer/src/themes/style-registry.js +129 -0
- package/src/libs/renderer/src/themes/style-registry.js.map +1 -0
- package/src/libs/renderer/src/themes/theme-a11y.d.ts +65 -0
- package/src/libs/renderer/src/themes/theme-a11y.js +256 -0
- package/src/libs/renderer/src/themes/theme-a11y.js.map +1 -0
- package/src/libs/renderer/src/themes/theme-css.d.ts +30 -0
- package/src/libs/renderer/src/themes/theme-css.js +304 -0
- package/src/libs/renderer/src/themes/theme-css.js.map +1 -0
- package/src/libs/renderer/src/themes/theme-ref.d.ts +63 -0
- package/src/libs/renderer/src/themes/theme-ref.js +206 -0
- package/src/libs/renderer/src/themes/theme-ref.js.map +1 -0
- package/src/libs/renderer/src/themes/theme-vars.d.ts +49 -0
- package/src/libs/renderer/src/themes/theme-vars.js +112 -0
- package/src/libs/renderer/src/themes/theme-vars.js.map +1 -0
- package/src/libs/renderer/src/themes/token-bridge.d.ts +62 -0
- package/src/libs/renderer/src/themes/token-bridge.js +354 -0
- package/src/libs/renderer/src/themes/token-bridge.js.map +1 -0
- package/src/libs/renderer/src/types/geometry.types.d.ts +10 -0
- package/src/libs/renderer/src/types/geometry.types.js +3 -0
- package/src/libs/renderer/src/types/geometry.types.js.map +1 -0
- package/src/libs/renderer/src/types/index.d.ts +5 -0
- package/src/libs/renderer/src/types/index.js +14 -0
- package/src/libs/renderer/src/types/index.js.map +1 -0
- package/src/libs/renderer/src/types/property-schema/conditions.d.ts +96 -0
- package/src/libs/renderer/src/types/property-schema/conditions.js +8 -0
- package/src/libs/renderer/src/types/property-schema/conditions.js.map +1 -0
- package/src/libs/renderer/src/types/property-schema/editor-types.d.ts +310 -0
- package/src/libs/renderer/src/types/property-schema/editor-types.js +8 -0
- package/src/libs/renderer/src/types/property-schema/editor-types.js.map +1 -0
- package/src/libs/renderer/src/types/property-schema/groups.d.ts +58 -0
- package/src/libs/renderer/src/types/property-schema/groups.js +8 -0
- package/src/libs/renderer/src/types/property-schema/groups.js.map +1 -0
- package/src/libs/renderer/src/types/property-schema/index.d.ts +101 -0
- package/src/libs/renderer/src/types/property-schema/index.js +98 -0
- package/src/libs/renderer/src/types/property-schema/index.js.map +1 -0
- package/src/libs/renderer/src/types/property-schema/property-definition.d.ts +117 -0
- package/src/libs/renderer/src/types/property-schema/property-definition.js +8 -0
- package/src/libs/renderer/src/types/property-schema/property-definition.js.map +1 -0
- package/src/libs/renderer/src/types/property-schema/schema.d.ts +108 -0
- package/src/libs/renderer/src/types/property-schema/schema.js +8 -0
- package/src/libs/renderer/src/types/property-schema/schema.js.map +1 -0
- package/src/libs/renderer/src/types/property-schema/validation.d.ts +181 -0
- package/src/libs/renderer/src/types/property-schema/validation.js +8 -0
- package/src/libs/renderer/src/types/property-schema/validation.js.map +1 -0
- package/src/libs/renderer/src/types/renderer.interface.d.ts +623 -0
- package/src/libs/renderer/src/types/renderer.interface.js +3 -0
- package/src/libs/renderer/src/types/renderer.interface.js.map +1 -0
- package/src/libs/renderer/src/types/theme.types.d.ts +305 -0
- package/src/libs/renderer/src/types/theme.types.js +3 -0
- package/src/libs/renderer/src/types/theme.types.js.map +1 -0
- package/src/libs/renderer/src/types/vnode.types.d.ts +139 -0
- package/src/libs/renderer/src/types/vnode.types.js +3 -0
- package/src/libs/renderer/src/types/vnode.types.js.map +1 -0
- package/src/libs/renderer/src/utils/animation-presets.d.ts +310 -0
- package/src/libs/renderer/src/utils/animation-presets.js +406 -0
- package/src/libs/renderer/src/utils/animation-presets.js.map +1 -0
- package/src/libs/renderer/src/utils/animation-priority.d.ts +118 -0
- package/src/libs/renderer/src/utils/animation-priority.js +258 -0
- package/src/libs/renderer/src/utils/animation-priority.js.map +1 -0
- package/src/libs/renderer/src/utils/animation-utils.d.ts +159 -0
- package/src/libs/renderer/src/utils/animation-utils.js +323 -0
- package/src/libs/renderer/src/utils/animation-utils.js.map +1 -0
- package/src/libs/renderer/src/utils/lru-cache.d.ts +34 -0
- package/src/libs/renderer/src/utils/lru-cache.js +72 -0
- package/src/libs/renderer/src/utils/lru-cache.js.map +1 -0
- package/src/libs/renderer/src/viewport/index.d.ts +1 -0
- package/src/libs/renderer/src/viewport/index.js +6 -0
- package/src/libs/renderer/src/viewport/index.js.map +1 -0
- package/src/libs/renderer/src/viewport/viewport-controller.d.ts +198 -0
- package/src/libs/renderer/src/viewport/viewport-controller.js +315 -0
- package/src/libs/renderer/src/viewport/viewport-controller.js.map +1 -0
- package/src/libs/renderer/src/vnode/container-id-generator.d.ts +94 -0
- package/src/libs/renderer/src/vnode/container-id-generator.js +110 -0
- package/src/libs/renderer/src/vnode/container-id-generator.js.map +1 -0
- package/src/libs/renderer/src/vnode/foreign-object.d.ts +157 -0
- package/src/libs/renderer/src/vnode/foreign-object.js +167 -0
- package/src/libs/renderer/src/vnode/foreign-object.js.map +1 -0
- package/src/libs/renderer/src/vnode/index.d.ts +56 -0
- package/src/libs/renderer/src/vnode/index.js +78 -0
- package/src/libs/renderer/src/vnode/index.js.map +1 -0
- package/src/libs/renderer/src/vnode/patch.d.ts +189 -0
- package/src/libs/renderer/src/vnode/patch.js +564 -0
- package/src/libs/renderer/src/vnode/patch.js.map +1 -0
- package/src/reachability.spec.ts +173 -0
- package/tsconfig.esm.json +9 -0
- package/tsconfig.json +24 -0
- package/tsconfig.lib.json +10 -0
- package/tsconfig.spec.json +14 -0
|
@@ -0,0 +1,2416 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// DiagramModel - Root container for all diagram entities
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.DiagramModel = exports.DEFAULT_PORT_SNAP_RADIUS = void 0;
|
|
5
|
+
const tslib_1 = require("tslib");
|
|
6
|
+
const DiagramEntity_1 = require("./DiagramEntity");
|
|
7
|
+
const readonly_lock_1 = require("./readonly-lock"); // Wave 9 — Card 7
|
|
8
|
+
const NodeModel_1 = require("./NodeModel");
|
|
9
|
+
const LinkModel_1 = require("./LinkModel");
|
|
10
|
+
const PortModel_1 = require("./PortModel");
|
|
11
|
+
const GroupModel_1 = require("./GroupModel"); // Phase 1.6c
|
|
12
|
+
const StrokeModel_1 = require("./StrokeModel"); // wave10/whiteboard
|
|
13
|
+
const SpatialIndex_1 = require("../performance/SpatialIndex"); // Phase 5.1
|
|
14
|
+
const performance_types_1 = require("../types/performance.types"); // wave2/rendering
|
|
15
|
+
const LayoutManager_1 = require("../layout/LayoutManager"); // Layout system
|
|
16
|
+
const geometry_1 = require("../utils/geometry"); // Phase 3.3
|
|
17
|
+
const DiagramMigrations_1 = require("../serialization/DiagramMigrations");
|
|
18
|
+
const DiagramValidator_1 = require("../serialization/DiagramValidator");
|
|
19
|
+
const Incremental_1 = require("../serialization/Incremental");
|
|
20
|
+
const deep_clone_1 = require("../utils/deep-clone");
|
|
21
|
+
/**
|
|
22
|
+
* How near a port must be to a point for {@link DiagramModel.findNearestPort} to
|
|
23
|
+
* consider it, in world units. Roughly a fingertip at 100% zoom.
|
|
24
|
+
*/
|
|
25
|
+
exports.DEFAULT_PORT_SNAP_RADIUS = 24;
|
|
26
|
+
/**
|
|
27
|
+
* Slack added to the node-candidate search in {@link DiagramModel.findNearestPort},
|
|
28
|
+
* to cover ports pushed off their node's bounding box by `port.offset`.
|
|
29
|
+
*/
|
|
30
|
+
const PORT_OFFSET_PAD = 64;
|
|
31
|
+
class DiagramModel extends DiagramEntity_1.DiagramEntity {
|
|
32
|
+
/** The comment register tree. Read-only in spirit: write through writeCommentRegister. */
|
|
33
|
+
get comments() {
|
|
34
|
+
return this._comments;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The landing pad for `applyOp`'s whole-tree write (remote ops, replay, load).
|
|
38
|
+
*
|
|
39
|
+
* Coarse ON PURPOSE at this level: applyOp hands us the rebuilt tree, and all we owe
|
|
40
|
+
* the world is "the comments changed". The FINE-grained registers — the thing that
|
|
41
|
+
* decides whether two concurrent replies both survive — are cut in the OPS, not here
|
|
42
|
+
* (see writeCommentRegister and comments/types.ts).
|
|
43
|
+
*/
|
|
44
|
+
set comments(next) {
|
|
45
|
+
const old = this._comments;
|
|
46
|
+
if (old === next)
|
|
47
|
+
return;
|
|
48
|
+
this._comments = next !== null && next !== void 0 ? next : {};
|
|
49
|
+
this.trackChange('comments', old, this._comments);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Write ONE comment register — `t1.status`, `t1.messages.m3` — and nothing else.
|
|
53
|
+
*
|
|
54
|
+
* This is the LOCAL authoring path, and the granularity here becomes the granularity
|
|
55
|
+
* of the emitted op (OpCapture turns `trackChange('comments.t1.messages.m3')` into
|
|
56
|
+
* `set(diagram, path='comments.t1.messages.m3')`), which becomes the granularity of
|
|
57
|
+
* the LWW register, which is what decides whether your colleague's simultaneous reply
|
|
58
|
+
* survives. The dotted path is not a convenience. It is the concurrency semantics.
|
|
59
|
+
*
|
|
60
|
+
* Returns false when the write changes nothing — so a redundant resolve is not an op,
|
|
61
|
+
* not a broadcast, and not a frame.
|
|
62
|
+
*/
|
|
63
|
+
writeCommentRegister(path, value) {
|
|
64
|
+
const parts = path.split('.');
|
|
65
|
+
if (parts.length < 2 || parts.some((p) => !p)) {
|
|
66
|
+
throw new Error(`invalid comment register path: '${path}'`);
|
|
67
|
+
}
|
|
68
|
+
// A WRITE THAT CHANGES NOTHING MUST DO NOTHING — the same discipline applySet keeps,
|
|
69
|
+
// and for the same reason: a redundant register write would otherwise mint an op,
|
|
70
|
+
// broadcast it, bump the version and force a frame, forever, on every duplicate
|
|
71
|
+
// delivery and every re-resolve of an already-resolved thread.
|
|
72
|
+
const cur = this.readCommentRegister(path);
|
|
73
|
+
const cloned = value === undefined ? undefined : (0, deep_clone_1.deepClone)(value);
|
|
74
|
+
if ((0, deep_clone_1.deepEqual)(cur, cloned))
|
|
75
|
+
return false;
|
|
76
|
+
let holder = this._comments;
|
|
77
|
+
for (let i = 0; i < parts.length - 1; i++) {
|
|
78
|
+
const k = parts[i];
|
|
79
|
+
const child = holder[k];
|
|
80
|
+
holder[k] =
|
|
81
|
+
typeof child === 'object' && child !== null && !Array.isArray(child) ? child : {};
|
|
82
|
+
holder = holder[k];
|
|
83
|
+
}
|
|
84
|
+
holder[parts[parts.length - 1]] = cloned;
|
|
85
|
+
// The funnel. `comments.<path>` is exactly the op path OpCapture will emit.
|
|
86
|
+
this.trackChange(`comments.${path}`, cur, cloned);
|
|
87
|
+
return true;
|
|
88
|
+
}
|
|
89
|
+
/** Read one register. Returns undefined for any missing segment — never throws. */
|
|
90
|
+
readCommentRegister(path) {
|
|
91
|
+
let cur = this._comments;
|
|
92
|
+
for (const part of path.split('.')) {
|
|
93
|
+
if (typeof cur !== 'object' || cur === null)
|
|
94
|
+
return undefined;
|
|
95
|
+
cur = cur[part];
|
|
96
|
+
}
|
|
97
|
+
return cur;
|
|
98
|
+
}
|
|
99
|
+
constructor(name, options) {
|
|
100
|
+
var _a;
|
|
101
|
+
// id/uuid pass-through exists so deserialization can reproduce the SAVED
|
|
102
|
+
// diagram identity instead of minting a new one (lossless round-trip).
|
|
103
|
+
super(options === null || options === void 0 ? void 0 : options.id, options === null || options === void 0 ? void 0 : options.uuid);
|
|
104
|
+
this.name = 'Untitled Diagram';
|
|
105
|
+
this.nodes = new Map();
|
|
106
|
+
this.links = new Map();
|
|
107
|
+
this.groups = new Map(); // Phase 1.6c
|
|
108
|
+
/** wave10/whiteboard: freehand ink strokes. See StrokeModel for why these are not nodes. */
|
|
109
|
+
this.strokes = new Map();
|
|
110
|
+
/**
|
|
111
|
+
* Wave 9 — Card 7. The read-only lock. THE enforcement point for
|
|
112
|
+
* `DiagramMode.VIEW` / `PRESENTATION`, which before this wave were advisory flags
|
|
113
|
+
* that gated nothing at all (see ./readonly-lock.ts).
|
|
114
|
+
*
|
|
115
|
+
* Kept on the model rather than the engine because the model is what the mutators
|
|
116
|
+
* live on, and a lock the mutator cannot see is not a lock. `NodeModel` reaches it
|
|
117
|
+
* via its `diagram` back-reference; `LinkModel` via the one this wave added
|
|
118
|
+
* (`installLink`), without which every waypoint / label / reconnect edit — all of
|
|
119
|
+
* which are `LinkModel` methods — would have been an unguardable hole.
|
|
120
|
+
*/
|
|
121
|
+
this.readonlyLock = new readonly_lock_1.ReadonlyLock();
|
|
122
|
+
// O(1) port -> owning node/port lookup. Maintained whenever nodes or ports
|
|
123
|
+
// are added/removed so callers (renderer per-frame link resolution, routing,
|
|
124
|
+
// connection validation) never linear-scan every node's ports.
|
|
125
|
+
this.portIndex = new Map();
|
|
126
|
+
/**
|
|
127
|
+
* wave14/model — LAST-KNOWN ANCHORS of removed nodes. The tolerant-reader half of the
|
|
128
|
+
* soft-reference (quarantine) design; see {@link DetachedParentAnchor} for the shape and
|
|
129
|
+
* {@link removeNode} for the design argument.
|
|
130
|
+
*
|
|
131
|
+
* DERIVED, SESSION-LOCAL STATE — never serialized, never on the wire. In collab, each
|
|
132
|
+
* peer records the anchor when IT applies the removal; since the parent's registers are
|
|
133
|
+
* LWW-converged before either peer applies the remove, peers freeze orphans at the same
|
|
134
|
+
* spot. (The one divergence window: a move-parent op racing the delete-parent op can be
|
|
135
|
+
* applied on one peer and refused-as-late on another, so their anchors — a reading taken
|
|
136
|
+
* at apply time — can differ until the parent is restored. The DOCUMENT still converges;
|
|
137
|
+
* only the derived freeze can briefly disagree, the same tier of divergence as any other
|
|
138
|
+
* derived presentation state.)
|
|
139
|
+
*
|
|
140
|
+
* Lifecycle: written by removeNode (every removal path funnels through it — Delete key,
|
|
141
|
+
* setNodes diffs, collab remove ops, patches), erased by installNode the moment the id
|
|
142
|
+
* comes back (undo, redo, remote resurrect), cleared wholesale by clearNodes/dispose.
|
|
143
|
+
* Bounded by the number of distinct ids removed-and-not-restored in a session.
|
|
144
|
+
*/
|
|
145
|
+
this.detachedAnchors = new Map();
|
|
146
|
+
/**
|
|
147
|
+
* Wave 10 — who owns the invariant "a link whose node is gone is not a link"?
|
|
148
|
+
*
|
|
149
|
+
* `'model'` (the default): {@link removeNode} CASCADES — it removes the links attached
|
|
150
|
+
* to the node it removes. This is the right answer for an ordinary single-user document,
|
|
151
|
+
* and its absence was a real bug: deleting a node left its edges in `getLinks()` and on
|
|
152
|
+
* the screen, through every removal path there is.
|
|
153
|
+
*
|
|
154
|
+
* `'external'`: something with a BETTER answer owns it, and the cascade must keep its
|
|
155
|
+
* hands off. Specifically {@link ReferentialIntegrity} (wave 9, collab), which derives
|
|
156
|
+
* liveness from the presence registers and QUARANTINES an orphaned link instead of
|
|
157
|
+
* destroying it — so undoing the node delete, or a peer resurrecting the node, brings the
|
|
158
|
+
* links back too, including links this peer never saw. A hard cascade there would be
|
|
159
|
+
* irreversible (a `remove link` op puts "removed" in the register for good), chatty (N
|
|
160
|
+
* derived ops on the wire), and still wrong in the only case that matters — the
|
|
161
|
+
* concurrent one, where it cannot see the link a colleague is drawing right now.
|
|
162
|
+
*
|
|
163
|
+
* The Replica sets this when it attaches. Nothing else should touch it.
|
|
164
|
+
*/
|
|
165
|
+
this.linkIntegrityOwner = 'model';
|
|
166
|
+
// =========================================================================
|
|
167
|
+
// wave9/comments — Card 6: THE COMMENT REGISTER NAMESPACE.
|
|
168
|
+
//
|
|
169
|
+
// Comment threads are DOCUMENT DATA and they live here, on the model, as a plain
|
|
170
|
+
// JSON tree — so that they ride the Card 0 op log exactly like a node's position
|
|
171
|
+
// does, and inherit its convergence, transport, persistence and undo without a
|
|
172
|
+
// single line of parallel machinery. `libs/engine/src/comments` owns the shape;
|
|
173
|
+
// this class owns only the storage and the change funnel.
|
|
174
|
+
//
|
|
175
|
+
// WHY AN ACCESSOR PAIR AND NOT A PLAIN FIELD — this is the load-bearing part, and
|
|
176
|
+
// it is not obvious:
|
|
177
|
+
//
|
|
178
|
+
// A remote comment op is applied by `applyOp` → `setDiagramProp`, whose generic
|
|
179
|
+
// branch ends in `holder['comments'] = next`, a RAW ASSIGNMENT. A raw assignment
|
|
180
|
+
// to a plain field mutates the model INVISIBLY: no trackChange, no version bump,
|
|
181
|
+
// no markDirty, and therefore no bump of the renderer's global mutation epoch.
|
|
182
|
+
// And the renderer's frame gate (wave 8) skips a frame outright when the epoch
|
|
183
|
+
// and the viewport are unchanged. A teammate's comment would land in the model
|
|
184
|
+
// and NEVER BE DRAWN — the exact class of bug the frame gate has already caused
|
|
185
|
+
// on three branches.
|
|
186
|
+
//
|
|
187
|
+
// Making `comments` an accessor turns that raw assignment into the model's own
|
|
188
|
+
// change funnel. The op lands, trackChange fires, the epoch moves, the gate opens,
|
|
189
|
+
// the pin appears. No renderer-side special case, no `invalidateFrame()` sprinkled
|
|
190
|
+
// at call sites that will be forgotten — the mechanism that already exists is made
|
|
191
|
+
// to see the write.
|
|
192
|
+
// =========================================================================
|
|
193
|
+
this._comments = {};
|
|
194
|
+
this.viewport = {
|
|
195
|
+
x: 0,
|
|
196
|
+
y: 0,
|
|
197
|
+
width: 1200, // Default viewport width
|
|
198
|
+
height: 800, // Default viewport height
|
|
199
|
+
zoom: 1,
|
|
200
|
+
};
|
|
201
|
+
this._autoLayoutEnabled = false;
|
|
202
|
+
// Batch update support for event queueing
|
|
203
|
+
this._pendingEvents = [];
|
|
204
|
+
// Tiers pre-sorted highest-minZoom first so getLODLevel() is a linear scan,
|
|
205
|
+
// not a per-call sort. Kept in sync whenever _lodConfig changes.
|
|
206
|
+
this._lodTiersDesc = [];
|
|
207
|
+
if (name)
|
|
208
|
+
this.name = name;
|
|
209
|
+
// wave2/rendering: install the LOD policy (custom or default).
|
|
210
|
+
this._lodConfig = (_a = options === null || options === void 0 ? void 0 : options.lodConfig) !== null && _a !== void 0 ? _a : (0, performance_types_1.createDefaultLODConfig)();
|
|
211
|
+
this._resortLODTiers();
|
|
212
|
+
// Initialize layout manager
|
|
213
|
+
this._layoutManager = new LayoutManager_1.LayoutManager(this, 'grid');
|
|
214
|
+
// Phase 5.1: Initialize spatial indices
|
|
215
|
+
this.nodeSpatialIndex = new SpatialIndex_1.SpatialIndex({
|
|
216
|
+
cellSize: 100,
|
|
217
|
+
getBounds: (node) => {
|
|
218
|
+
// Get bounds considering rotation and scale
|
|
219
|
+
const bounds = node.getBoundingBox();
|
|
220
|
+
return {
|
|
221
|
+
x: bounds.left,
|
|
222
|
+
y: bounds.top,
|
|
223
|
+
width: bounds.width,
|
|
224
|
+
height: bounds.height,
|
|
225
|
+
};
|
|
226
|
+
},
|
|
227
|
+
});
|
|
228
|
+
this.linkSpatialIndex = new SpatialIndex_1.SpatialIndex({
|
|
229
|
+
cellSize: 100,
|
|
230
|
+
getBounds: (link) => this.computeLinkBounds(link),
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Bounding box of a link, for viewport culling (`getVisibleLinks`).
|
|
235
|
+
*
|
|
236
|
+
* It is the union of TWO things, and it needs both:
|
|
237
|
+
*
|
|
238
|
+
* - `link.points` — the routed path (including orthogonal detours). Renderers
|
|
239
|
+
* write this back per frame, so for anything that has been drawn it is the
|
|
240
|
+
* real geometry.
|
|
241
|
+
* - the LIVE endpoints, resolved O(1) through the port index. Points alone are
|
|
242
|
+
* not trustworthy: a link built with `new LinkModel()` + `addLink()` has NO
|
|
243
|
+
* points until something routes it (it would otherwise be indexed as a
|
|
244
|
+
* zero-size box at the world origin and get culled everywhere except there),
|
|
245
|
+
* and points go stale the moment a node moves without a reroute. The drawn
|
|
246
|
+
* path always runs between the live ports, so folding them in keeps the box
|
|
247
|
+
* a correct SUPERSET of what will actually be painted.
|
|
248
|
+
*
|
|
249
|
+
* Being a superset is the safe direction: culling too little costs a few
|
|
250
|
+
* VNodes, culling too much makes edges vanish off-screen.
|
|
251
|
+
*/
|
|
252
|
+
computeLinkBounds(link) {
|
|
253
|
+
let minX = Infinity;
|
|
254
|
+
let minY = Infinity;
|
|
255
|
+
let maxX = -Infinity;
|
|
256
|
+
let maxY = -Infinity;
|
|
257
|
+
const include = (point) => {
|
|
258
|
+
minX = Math.min(minX, point.x);
|
|
259
|
+
minY = Math.min(minY, point.y);
|
|
260
|
+
maxX = Math.max(maxX, point.x);
|
|
261
|
+
maxY = Math.max(maxY, point.y);
|
|
262
|
+
};
|
|
263
|
+
for (const point of link.points) {
|
|
264
|
+
include(point);
|
|
265
|
+
}
|
|
266
|
+
const source = this.portIndex.get(link.sourcePortId);
|
|
267
|
+
if (source) {
|
|
268
|
+
include(source.port.getAbsolutePosition(source.node.getBoundingBox()));
|
|
269
|
+
}
|
|
270
|
+
const target = this.portIndex.get(link.targetPortId);
|
|
271
|
+
if (target) {
|
|
272
|
+
include(target.port.getAbsolutePosition(target.node.getBoundingBox()));
|
|
273
|
+
}
|
|
274
|
+
if (minX === Infinity) {
|
|
275
|
+
// Nothing to go on (no points, no resolvable ports).
|
|
276
|
+
return { x: 0, y: 0, width: 0, height: 0 };
|
|
277
|
+
}
|
|
278
|
+
return {
|
|
279
|
+
x: minX,
|
|
280
|
+
y: minY,
|
|
281
|
+
width: maxX - minX,
|
|
282
|
+
height: maxY - minY,
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Re-index a link after its geometry changed WITHOUT a `change:points` event.
|
|
287
|
+
*
|
|
288
|
+
* Renderers route links per frame and assign `link.points` directly (using
|
|
289
|
+
* `setPoints()` would emit `change` → `link:changed` → another render, i.e. a
|
|
290
|
+
* render loop). The spatial index therefore never hears about the routed path,
|
|
291
|
+
* and its grid cells would keep pointing at the geometry the link had when it
|
|
292
|
+
* was added. Call this after writing points directly.
|
|
293
|
+
*/
|
|
294
|
+
refreshLinkBounds(link) {
|
|
295
|
+
if (!this.links.has(link.id))
|
|
296
|
+
return;
|
|
297
|
+
this.linkSpatialIndex.update(link);
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Add node to diagram
|
|
301
|
+
*/
|
|
302
|
+
// ==========================================================================
|
|
303
|
+
// Wave 9 — Card 7: the read-only lock (see ./readonly-lock.ts).
|
|
304
|
+
// ==========================================================================
|
|
305
|
+
/** Is this document locked against edits? */
|
|
306
|
+
isReadonly() {
|
|
307
|
+
return this.readonlyLock.isReadonly();
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Lock / unlock the document. Normally driven by `DiagramEngine.setMode()` —
|
|
311
|
+
* VIEW and PRESENTATION lock, DESIGNER unlocks — so `DiagramMode` finally means
|
|
312
|
+
* something. Can also be set directly for a host that has no mode concept.
|
|
313
|
+
*/
|
|
314
|
+
setReadonly(value) {
|
|
315
|
+
if (this.readonlyLock.isReadonly() === value)
|
|
316
|
+
return;
|
|
317
|
+
this.readonlyLock.setReadonly(value);
|
|
318
|
+
this.emitOrQueue('readonly:change', value);
|
|
319
|
+
}
|
|
320
|
+
/** True when a document mutation must be refused right now. */
|
|
321
|
+
blocksDocumentWrite() {
|
|
322
|
+
return this.readonlyLock.blocksDocumentWrite();
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* True while a SYSTEM write is in flight. Read by the PER-NODE geometry lock
|
|
326
|
+
* (`NodeState.locked`) so it exempts measured writes exactly as the document
|
|
327
|
+
* lock does — see readonly-lock.ts.
|
|
328
|
+
*/
|
|
329
|
+
inSystemWrite() {
|
|
330
|
+
return this.readonlyLock.inSystemWrite();
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Run a SYSTEM write — a derived/measured value (auto-size, portal placement)
|
|
334
|
+
* the engine needs in order to render the document as it already is. Permitted
|
|
335
|
+
* even while locked. NOT reachable from user input; see readonly-lock.ts.
|
|
336
|
+
*/
|
|
337
|
+
runSystemWrite(fn) {
|
|
338
|
+
return this.readonlyLock.runSystemWrite(fn);
|
|
339
|
+
}
|
|
340
|
+
addNode(node) {
|
|
341
|
+
this.assertNotDisposed(); // Phase 5.4
|
|
342
|
+
if (this.blocksDocumentWrite())
|
|
343
|
+
return;
|
|
344
|
+
if (this.nodes.has(node.id)) {
|
|
345
|
+
throw new Error(`Node with id ${node.id} already exists`);
|
|
346
|
+
}
|
|
347
|
+
this.installNode(node);
|
|
348
|
+
}
|
|
349
|
+
/**
|
|
350
|
+
* THE single per-node install path — every route a node takes into the
|
|
351
|
+
* diagram (interactive addNode, undo restoreNode, document fromJSON) runs
|
|
352
|
+
* through here, so a restored node is wired IDENTICALLY to an authored one:
|
|
353
|
+
* diagram back-reference, change tracking, events, port index, spatial
|
|
354
|
+
* index, and change-forwarding listeners.
|
|
355
|
+
*/
|
|
356
|
+
installNode(node) {
|
|
357
|
+
// Set diagram reference (Phase 1.6a)
|
|
358
|
+
node.diagram = this;
|
|
359
|
+
// wave14/model — the id is LIVE again (undo, redo, remote resurrect): drop its
|
|
360
|
+
// last-known anchor so parent chains resolve through the real node, not the freeze.
|
|
361
|
+
this.detachedAnchors.delete(node.id);
|
|
362
|
+
this.nodes.set(node.id, node);
|
|
363
|
+
this.trackChange('nodes', null, node);
|
|
364
|
+
this.emitOrQueue('node:added', node);
|
|
365
|
+
// Maintain O(1) port -> node index (covers ports added before AND after
|
|
366
|
+
// the node joins the diagram)
|
|
367
|
+
this.indexNodePorts(node);
|
|
368
|
+
// Phase 5.1: Add to spatial index and listen for spatial changes
|
|
369
|
+
// Do this AFTER trackChange to avoid cloning issues
|
|
370
|
+
this.nodeSpatialIndex.add(node);
|
|
371
|
+
const updateSpatialIndex = () => this.nodeSpatialIndex.update(node);
|
|
372
|
+
node.on('change:position', updateSpatialIndex);
|
|
373
|
+
node.on('change:size', updateSpatialIndex);
|
|
374
|
+
node.on('change:rotation', updateSpatialIndex);
|
|
375
|
+
node.on('change:scale', updateSpatialIndex);
|
|
376
|
+
// Phase 0.2: Forward position and size changes as diagram-level events for LiveReroutingEngine
|
|
377
|
+
node.on('change:position', () => {
|
|
378
|
+
this.emitOrQueue('node:moved', { nodeId: node.id, position: node.position });
|
|
379
|
+
});
|
|
380
|
+
node.on('change:size', () => {
|
|
381
|
+
this.emitOrQueue('node:resized', { nodeId: node.id, size: node.size });
|
|
382
|
+
});
|
|
383
|
+
// Listen for any node changes and forward as diagram-level 'node:changed' event
|
|
384
|
+
// This allows components like diagram-canvas to re-render when node properties change
|
|
385
|
+
node.on('change', () => {
|
|
386
|
+
this.emitOrQueue('node:changed', node);
|
|
387
|
+
});
|
|
388
|
+
// A transform on a parent MOVES its relative children in the world without
|
|
389
|
+
// touching their own properties. The node already announces exactly who is
|
|
390
|
+
// affected ('transform-propagated', Phase 1.6a Part 4) — but nothing ever
|
|
391
|
+
// consumed it, so renderers kept stale child VNodes and the spatial index
|
|
392
|
+
// kept stale child bounds. markDirty (not trackChange: nothing on the child
|
|
393
|
+
// itself changed — no version bump, no change-log entry, no collab op)
|
|
394
|
+
// rebakes the picture; the index update and node:moved keep culling,
|
|
395
|
+
// hit-testing and live link rerouting truthful.
|
|
396
|
+
node.on('transform-propagated', (payload) => {
|
|
397
|
+
var _a;
|
|
398
|
+
for (const desc of (_a = payload === null || payload === void 0 ? void 0 : payload.affectedNodes) !== null && _a !== void 0 ? _a : []) {
|
|
399
|
+
if (desc === node)
|
|
400
|
+
continue;
|
|
401
|
+
desc.markDirty('incremental');
|
|
402
|
+
this.nodeSpatialIndex.update(desc);
|
|
403
|
+
this.emitOrQueue('node:moved', { nodeId: desc.id, position: desc.getWorldPosition() });
|
|
404
|
+
this.emitOrQueue('node:changed', desc);
|
|
405
|
+
}
|
|
406
|
+
});
|
|
407
|
+
}
|
|
408
|
+
/**
|
|
409
|
+
* Remove node from diagram — AND every link attached to it.
|
|
410
|
+
*
|
|
411
|
+
* Wave 10 BUG FIX. This used to delete the node and nothing else, so every link that
|
|
412
|
+
* touched it survived: still in `getLinks()`, still in the spatial index, and still
|
|
413
|
+
* PAINTED — two edges hanging off a node that no longer existed. `deleteSelected()`
|
|
414
|
+
* carried the comment "this will also trigger link cleanup via events"; nothing
|
|
415
|
+
* listened to `node:removed` for cleanup, so that cleanup never happened, anywhere.
|
|
416
|
+
*
|
|
417
|
+
* It matters because EVERY removal path funnels through here:
|
|
418
|
+
* - `deleteSelected()` — what the Delete key calls;
|
|
419
|
+
* - `applyNodes()` — what `setNodes()` calls, so dropping a node from a React-shaped
|
|
420
|
+
* spec left the dangling links behind;
|
|
421
|
+
* - `RemoveNodeCommand`.
|
|
422
|
+
*
|
|
423
|
+
* A link's endpoints are the invariant that makes it a link; a link to nowhere is not
|
|
424
|
+
* a link. So the cascade belongs at the choke point, not at each of the three call
|
|
425
|
+
* sites that would each have to remember it.
|
|
426
|
+
*
|
|
427
|
+
* UNLESS someone better owns that invariant — see {@link linkIntegrityOwner}.
|
|
428
|
+
*/
|
|
429
|
+
removeNode(nodeId) {
|
|
430
|
+
if (this.blocksDocumentWrite())
|
|
431
|
+
return undefined;
|
|
432
|
+
const node = this.nodes.get(nodeId);
|
|
433
|
+
if (node) {
|
|
434
|
+
// wave14/model — record the LAST-KNOWN ANCHOR before any teardown, while the
|
|
435
|
+
// node can still resolve its own parent chain.
|
|
436
|
+
//
|
|
437
|
+
// Removal deliberately leaves soft refs dangling: children's `parentId` and the
|
|
438
|
+
// id inside `GroupModel.members` keep pointing here. THE DANGLE IS THE DESIGN,
|
|
439
|
+
// not an oversight — the two alternatives are both worse:
|
|
440
|
+
//
|
|
441
|
+
// • HARD-CLEARING the refs at delete time is irreversible under collab/undo.
|
|
442
|
+
// Undo-of-parent-delete restores children exactly BECAUSE the ref dangles
|
|
443
|
+
// and re-resolves; clearing it would need a compensating write per child,
|
|
444
|
+
// and a peer that never saw those writes diverges. It is the cascade trap
|
|
445
|
+
// collab/integrity.ts documents for links, in parentId form.
|
|
446
|
+
// • RE-ANCHORING children here via tracked position writes (position +=
|
|
447
|
+
// parentWorld, parentId = undefined) mutates entities the user did not
|
|
448
|
+
// touch: in collab each rewrite becomes an op that races a peer's real
|
|
449
|
+
// concurrent drag of that child (LWW picks one whole write — either the
|
|
450
|
+
// re-anchor clobbers the drag or the drag re-interprets its offset in a
|
|
451
|
+
// frame that no longer exists), and undo of the delete is no longer one
|
|
452
|
+
// inverse op but 1+N that nothing transacts across the remote/patch paths.
|
|
453
|
+
//
|
|
454
|
+
// So: QUARANTINE the refs (keep them, derived readers tolerate them) — the
|
|
455
|
+
// document is never touched, undo re-adds the parent and the chain re-resolves
|
|
456
|
+
// byte-identically by construction. The anchor below is what the tolerant
|
|
457
|
+
// readers freeze orphaned children at, so they stop jumping to raw offsets.
|
|
458
|
+
this.detachedAnchors.set(nodeId, {
|
|
459
|
+
world: node.getWorldPosition(),
|
|
460
|
+
global: node.getGlobalPosition(),
|
|
461
|
+
rotation: node.rotation,
|
|
462
|
+
scale: Object.assign({}, node.scale),
|
|
463
|
+
matrix: node.getGlobalTransformMatrix(),
|
|
464
|
+
});
|
|
465
|
+
// Links first, while the node's ports are still in the index — removeLink()
|
|
466
|
+
// resolves them to release the ports' connection bookkeeping.
|
|
467
|
+
if (this.linkIntegrityOwner === 'model') {
|
|
468
|
+
for (const link of this.getLinksForNode(nodeId)) {
|
|
469
|
+
this.removeLink(link.id);
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
this.nodes.delete(nodeId);
|
|
473
|
+
// Drop this node's ports from the O(1) port index
|
|
474
|
+
this.unindexNodePorts(node);
|
|
475
|
+
// Phase 5.1: Remove from spatial index
|
|
476
|
+
this.nodeSpatialIndex.remove(nodeId);
|
|
477
|
+
this.trackChange('nodes', node, null);
|
|
478
|
+
this.emitOrQueue('node:removed', node);
|
|
479
|
+
// wave14/model — mirror of installNode's `node.diagram = this` (dispose() already
|
|
480
|
+
// clears it; this was the one detach path that did not). Deliberately LAST:
|
|
481
|
+
// OpCapture serializes the node's full removal snapshot and unwatches it inside the
|
|
482
|
+
// trackChange emission above (capture.ts), and synchronous 'node:removed' listeners
|
|
483
|
+
// may still resolve through the owning diagram — so the ref must survive both.
|
|
484
|
+
// (Under batch mode the queued 'node:removed' flushes after this line and sees a
|
|
485
|
+
// detached node — correct by then: the node no longer belongs to any diagram.)
|
|
486
|
+
// Clearing restores the documented "detached node" status: freely mutable, no stale
|
|
487
|
+
// read-only lock, no strong ref pinning the whole diagram, re-addable anywhere.
|
|
488
|
+
node.diagram = undefined;
|
|
489
|
+
}
|
|
490
|
+
return node;
|
|
491
|
+
}
|
|
492
|
+
/**
|
|
493
|
+
* Every link with an endpoint on `nodeId` (either end, including a self-loop).
|
|
494
|
+
*
|
|
495
|
+
* Resolved through the port index rather than the cached `sourceNodeId`/`targetNodeId`,
|
|
496
|
+
* because those are a backfill that can be absent on a link built by hand.
|
|
497
|
+
*/
|
|
498
|
+
getLinksForNode(nodeId) {
|
|
499
|
+
var _a, _b, _c, _d;
|
|
500
|
+
const out = [];
|
|
501
|
+
for (const link of this.links.values()) {
|
|
502
|
+
const source = (_b = (_a = this.getNodeByPortId(link.sourcePortId)) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : link.sourceNodeId;
|
|
503
|
+
const target = (_d = (_c = this.getNodeByPortId(link.targetPortId)) === null || _c === void 0 ? void 0 : _c.id) !== null && _d !== void 0 ? _d : link.targetNodeId;
|
|
504
|
+
if (source === nodeId || target === nodeId)
|
|
505
|
+
out.push(link);
|
|
506
|
+
}
|
|
507
|
+
return out;
|
|
508
|
+
}
|
|
509
|
+
/**
|
|
510
|
+
* Restore node from serialized data (Phase 1.8)
|
|
511
|
+
*/
|
|
512
|
+
restoreNode(data) {
|
|
513
|
+
try {
|
|
514
|
+
const node = NodeModel_1.NodeModel.fromJSON(data);
|
|
515
|
+
this.installNode(node);
|
|
516
|
+
return node;
|
|
517
|
+
}
|
|
518
|
+
catch (error) {
|
|
519
|
+
console.error('Failed to restore node:', error);
|
|
520
|
+
return undefined;
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
/**
|
|
524
|
+
* Get node by ID
|
|
525
|
+
*/
|
|
526
|
+
getNode(nodeId) {
|
|
527
|
+
return this.nodes.get(nodeId);
|
|
528
|
+
}
|
|
529
|
+
/**
|
|
530
|
+
* Get all nodes
|
|
531
|
+
*/
|
|
532
|
+
getNodes() {
|
|
533
|
+
return Array.from(this.nodes.values());
|
|
534
|
+
}
|
|
535
|
+
/**
|
|
536
|
+
* Phase 3: Get node that owns a specific port
|
|
537
|
+
* Used for connection group validation and other port-based queries.
|
|
538
|
+
* O(1) via the portIndex (was an O(nodes×ports) linear scan).
|
|
539
|
+
*/
|
|
540
|
+
getNodeByPortId(portId) {
|
|
541
|
+
var _a;
|
|
542
|
+
return (_a = this.portIndex.get(portId)) === null || _a === void 0 ? void 0 : _a.node;
|
|
543
|
+
}
|
|
544
|
+
/**
|
|
545
|
+
* Get the port model for a port id, O(1) via the portIndex.
|
|
546
|
+
* Companion to getNodeByPortId for callers that need the port itself.
|
|
547
|
+
*/
|
|
548
|
+
getPortById(portId) {
|
|
549
|
+
var _a;
|
|
550
|
+
return (_a = this.portIndex.get(portId)) === null || _a === void 0 ? void 0 : _a.port;
|
|
551
|
+
}
|
|
552
|
+
/**
|
|
553
|
+
* wave14/model — the last-known anchor of a REMOVED node, or undefined if the id is
|
|
554
|
+
* live, was never here, or the anchor was wholesale-cleared. The tolerant readers in
|
|
555
|
+
* NodeModel (getWorldPosition / getGlobalPosition / getGlobalTransformMatrix /
|
|
556
|
+
* setGlobalPosition) resolve an unresolvable parent through this so orphaned relative
|
|
557
|
+
* children freeze in place instead of jumping to their raw offsets. See
|
|
558
|
+
* {@link detachedAnchors} and the design argument on {@link removeNode}.
|
|
559
|
+
*/
|
|
560
|
+
getDetachedAnchor(nodeId) {
|
|
561
|
+
return this.detachedAnchors.get(nodeId);
|
|
562
|
+
}
|
|
563
|
+
/**
|
|
564
|
+
* Index every current port of a node and keep the index current as ports are
|
|
565
|
+
* added/removed on that node. Called from addNode/restoreNode/fromJSON.
|
|
566
|
+
* Listeners are guarded so a removed node can never re-pollute the index.
|
|
567
|
+
*/
|
|
568
|
+
indexNodePorts(node) {
|
|
569
|
+
for (const port of node.getPorts()) {
|
|
570
|
+
this.portIndex.set(port.id, { node, port });
|
|
571
|
+
}
|
|
572
|
+
// Keep the index correct when ports change AFTER the node is in the diagram.
|
|
573
|
+
node.on('port:added', (port) => {
|
|
574
|
+
// Ignore late additions from a node that is no longer this diagram's.
|
|
575
|
+
if (this.nodes.get(node.id) === node) {
|
|
576
|
+
this.portIndex.set(port.id, { node, port });
|
|
577
|
+
}
|
|
578
|
+
});
|
|
579
|
+
node.on('port:removed', (port) => {
|
|
580
|
+
const entry = this.portIndex.get(port.id);
|
|
581
|
+
if (entry && entry.node === node) {
|
|
582
|
+
this.portIndex.delete(port.id);
|
|
583
|
+
}
|
|
584
|
+
});
|
|
585
|
+
}
|
|
586
|
+
/**
|
|
587
|
+
* Drop a node's ports from the index (called on removeNode).
|
|
588
|
+
*/
|
|
589
|
+
unindexNodePorts(node) {
|
|
590
|
+
for (const port of node.getPorts()) {
|
|
591
|
+
const entry = this.portIndex.get(port.id);
|
|
592
|
+
if (entry && entry.node === node) {
|
|
593
|
+
this.portIndex.delete(port.id);
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
/**
|
|
598
|
+
* Clear all nodes
|
|
599
|
+
*/
|
|
600
|
+
clearNodes() {
|
|
601
|
+
if (this.blocksDocumentWrite())
|
|
602
|
+
return;
|
|
603
|
+
this.nodes.clear();
|
|
604
|
+
this.portIndex.clear();
|
|
605
|
+
// Wholesale reset: no nodes remain to read a frozen frame through.
|
|
606
|
+
this.detachedAnchors.clear();
|
|
607
|
+
this.emitOrQueue('nodes:cleared');
|
|
608
|
+
}
|
|
609
|
+
/**
|
|
610
|
+
* Add link to diagram
|
|
611
|
+
*/
|
|
612
|
+
addLink(link) {
|
|
613
|
+
this.assertNotDisposed(); // Phase 5.4
|
|
614
|
+
if (this.blocksDocumentWrite())
|
|
615
|
+
return;
|
|
616
|
+
if (this.links.has(link.id)) {
|
|
617
|
+
throw new Error(`Link with id ${link.id} already exists`);
|
|
618
|
+
}
|
|
619
|
+
this.installLink(link);
|
|
620
|
+
}
|
|
621
|
+
/**
|
|
622
|
+
* THE single per-link install path (see installNode) — interactive add,
|
|
623
|
+
* undo restore, and document load all wire links identically, including
|
|
624
|
+
* the owning-node-id backfill renderers resolve port sides through.
|
|
625
|
+
*/
|
|
626
|
+
installLink(link) {
|
|
627
|
+
var _a, _b, _c, _d;
|
|
628
|
+
// Wave 9 — Card 7. The diagram back-reference. NodeModel has had one since
|
|
629
|
+
// Phase 1.6a; LinkModel never did — which meant every waypoint, control-point,
|
|
630
|
+
// label and reconnect edit (all LinkModel methods) could not see a read-only
|
|
631
|
+
// lock and was therefore unguardable. Symmetric with installNode.
|
|
632
|
+
link.diagram = this;
|
|
633
|
+
// Cache the owning node ids (renderers resolve port sides through them —
|
|
634
|
+
// without this, links built via `new LinkModel()` + addLink never resolve
|
|
635
|
+
// port direction, unlike connectNodes() which sets the ids itself)
|
|
636
|
+
if (!link.sourceNodeId) {
|
|
637
|
+
link.sourceNodeId = (_a = this.getNodeByPortId(link.sourcePortId)) === null || _a === void 0 ? void 0 : _a.id;
|
|
638
|
+
}
|
|
639
|
+
if (!link.targetNodeId) {
|
|
640
|
+
link.targetNodeId = (_b = this.getNodeByPortId(link.targetPortId)) === null || _b === void 0 ? void 0 : _b.id;
|
|
641
|
+
}
|
|
642
|
+
// Wave 10 BUG FIX — register the link on its PORTS.
|
|
643
|
+
//
|
|
644
|
+
// This is the single install path, and it was the ONE place that did not do the
|
|
645
|
+
// connection bookkeeping. `createSmartLink()`, `DiagramEngine`'s interactive connect
|
|
646
|
+
// and `LayoutManager` each called `port.addConnection()` by hand; a link built the
|
|
647
|
+
// ordinary way — `new LinkModel()` + `addLink()`, which is exactly what the public
|
|
648
|
+
// spec path (`setNodes`/`setEdges` → `applyEdges` → `buildEdge`) does — registered on
|
|
649
|
+
// neither port.
|
|
650
|
+
//
|
|
651
|
+
// So `port.getConnectionCount()` was 0 for every link in every spec-built diagram,
|
|
652
|
+
// and `maxConnections` — whose ONLY enforcement is `evaluatePortConnection()` reading
|
|
653
|
+
// that counter — could never fire. A port declared `maxConnections: 1` that already
|
|
654
|
+
// had its one link from the spec still believed it had none, and accepted a second.
|
|
655
|
+
//
|
|
656
|
+
// `restoreConnection`, not `addConnection`: registering an EXISTING link is a load,
|
|
657
|
+
// not a new connection, so it must not throw when a persisted graph legitimately
|
|
658
|
+
// exceeds a since-tightened limit (that is what the method was written for). It is
|
|
659
|
+
// Set-backed and therefore idempotent, so the hand-rolled call sites above — which
|
|
660
|
+
// register before calling addLink() — stay correct and do not double-count.
|
|
661
|
+
(_c = this.getPortById(link.sourcePortId)) === null || _c === void 0 ? void 0 : _c.restoreConnection(link.id, 'source');
|
|
662
|
+
(_d = this.getPortById(link.targetPortId)) === null || _d === void 0 ? void 0 : _d.restoreConnection(link.id, 'target');
|
|
663
|
+
this.links.set(link.id, link);
|
|
664
|
+
this.trackChange('links', null, link);
|
|
665
|
+
this.emitOrQueue('link:added', link);
|
|
666
|
+
// Phase 5.1: Add to spatial index and listen - AFTER trackChange
|
|
667
|
+
this.linkSpatialIndex.add(link);
|
|
668
|
+
link.on('change:points', () => this.linkSpatialIndex.update(link));
|
|
669
|
+
// generatePath() (layout, live-rerouting, node drag) rewrites `points` in
|
|
670
|
+
// place and only emits 'link:path-changed' — without this the index keeps the
|
|
671
|
+
// grid cells the link had when it was added and viewport culling loses it.
|
|
672
|
+
link.on('link:path-changed', () => this.linkSpatialIndex.update(link));
|
|
673
|
+
// Listen for any link changes and forward as diagram-level 'link:changed' event
|
|
674
|
+
link.on('change', () => {
|
|
675
|
+
this.emitOrQueue('link:changed', link);
|
|
676
|
+
});
|
|
677
|
+
}
|
|
678
|
+
/**
|
|
679
|
+
* Remove link from diagram
|
|
680
|
+
*/
|
|
681
|
+
removeLink(linkId) {
|
|
682
|
+
var _a, _b;
|
|
683
|
+
if (this.blocksDocumentWrite())
|
|
684
|
+
return undefined;
|
|
685
|
+
const link = this.links.get(linkId);
|
|
686
|
+
if (link) {
|
|
687
|
+
// Wave 10 — the mirror of installLink()'s registration. Without it a removed link
|
|
688
|
+
// would keep occupying its ports' connection budget forever, and a port with a
|
|
689
|
+
// maxConnections cap would silently jam after enough add/remove churn.
|
|
690
|
+
(_a = this.getPortById(link.sourcePortId)) === null || _a === void 0 ? void 0 : _a.removeConnection(link.id);
|
|
691
|
+
(_b = this.getPortById(link.targetPortId)) === null || _b === void 0 ? void 0 : _b.removeConnection(link.id);
|
|
692
|
+
this.links.delete(linkId);
|
|
693
|
+
// Phase 5.1: Remove from spatial index
|
|
694
|
+
this.linkSpatialIndex.remove(linkId);
|
|
695
|
+
this.trackChange('links', link, null);
|
|
696
|
+
this.emitOrQueue('link:removed', link);
|
|
697
|
+
}
|
|
698
|
+
return link;
|
|
699
|
+
}
|
|
700
|
+
/**
|
|
701
|
+
* Restore link from serialized data (Phase 1.8)
|
|
702
|
+
*/
|
|
703
|
+
restoreLink(data) {
|
|
704
|
+
try {
|
|
705
|
+
const link = LinkModel_1.LinkModel.fromJSON(data);
|
|
706
|
+
this.installLink(link);
|
|
707
|
+
return link;
|
|
708
|
+
}
|
|
709
|
+
catch (error) {
|
|
710
|
+
console.error('Failed to restore link:', error);
|
|
711
|
+
return undefined;
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
/**
|
|
715
|
+
* Get link by ID
|
|
716
|
+
*/
|
|
717
|
+
getLink(linkId) {
|
|
718
|
+
return this.links.get(linkId);
|
|
719
|
+
}
|
|
720
|
+
/**
|
|
721
|
+
* Get all links
|
|
722
|
+
*/
|
|
723
|
+
getLinks() {
|
|
724
|
+
return Array.from(this.links.values());
|
|
725
|
+
}
|
|
726
|
+
/**
|
|
727
|
+
* Phase 0.2: Get all links connected to a specific port
|
|
728
|
+
*/
|
|
729
|
+
getLinksForPort(portId) {
|
|
730
|
+
return this.getLinks().filter(link => link.sourcePortId === portId || link.targetPortId === portId);
|
|
731
|
+
}
|
|
732
|
+
/**
|
|
733
|
+
* Clear all links
|
|
734
|
+
*/
|
|
735
|
+
clearLinks() {
|
|
736
|
+
if (this.blocksDocumentWrite())
|
|
737
|
+
return;
|
|
738
|
+
this.links.clear();
|
|
739
|
+
this.emitOrQueue('links:cleared');
|
|
740
|
+
}
|
|
741
|
+
/**
|
|
742
|
+
* Phase 0.5.3: Create a smart link with automatic port selection
|
|
743
|
+
*
|
|
744
|
+
* This high-level API simplifies link creation by:
|
|
745
|
+
* - Automatically selecting optimal ports based on node geometry
|
|
746
|
+
* - Creating the link with proper port connections
|
|
747
|
+
* - Registering connections in port models
|
|
748
|
+
* - Generating the initial path
|
|
749
|
+
*
|
|
750
|
+
* @param sourceNode - The source node
|
|
751
|
+
* @param targetNode - The target node
|
|
752
|
+
* @param pathType - Path rendering type (default: 'smooth')
|
|
753
|
+
* @returns The created link, or undefined if port selection failed
|
|
754
|
+
*
|
|
755
|
+
* @example
|
|
756
|
+
* ```typescript
|
|
757
|
+
* const link = diagram.createSmartLink(node1, node2, 'smooth');
|
|
758
|
+
* if (link) {
|
|
759
|
+
* console.log('Connected with optimal ports!');
|
|
760
|
+
* }
|
|
761
|
+
* ```
|
|
762
|
+
*/
|
|
763
|
+
createSmartLink(sourceNode, targetNode, pathType = 'smooth') {
|
|
764
|
+
var _a, _b;
|
|
765
|
+
// Use layout manager's intelligent port selection
|
|
766
|
+
const optimalPorts = this._layoutManager.selectOptimalPorts(sourceNode, targetNode);
|
|
767
|
+
if (!optimalPorts) {
|
|
768
|
+
console.warn(`⚠️ Could not select optimal ports for nodes ${sourceNode.id} → ${targetNode.id}`);
|
|
769
|
+
return undefined;
|
|
770
|
+
}
|
|
771
|
+
const { sourcePort, targetPort } = optimalPorts;
|
|
772
|
+
// Validate port compatibility
|
|
773
|
+
if (!sourcePort.canConnectTo(targetPort)) {
|
|
774
|
+
console.warn(`⚠️ Ports are not compatible: ${sourcePort.type} → ${targetPort.type}`);
|
|
775
|
+
return undefined;
|
|
776
|
+
}
|
|
777
|
+
// Create the link
|
|
778
|
+
const link = new LinkModel_1.LinkModel(sourcePort.id, targetPort.id, pathType);
|
|
779
|
+
link.sourceNodeId = sourceNode.id;
|
|
780
|
+
link.targetNodeId = targetNode.id;
|
|
781
|
+
// Register connections in ports
|
|
782
|
+
sourcePort.addConnection(link.id, 'source');
|
|
783
|
+
targetPort.addConnection(link.id, 'target');
|
|
784
|
+
// Calculate initial path
|
|
785
|
+
const sourceBounds = sourceNode.getBoundingBox();
|
|
786
|
+
const targetBounds = targetNode.getBoundingBox();
|
|
787
|
+
const sourcePoint = sourcePort.getAbsolutePosition(sourceBounds);
|
|
788
|
+
const targetPoint = targetPort.getAbsolutePosition(targetBounds);
|
|
789
|
+
// Get port directions for orthogonal routing
|
|
790
|
+
const sourceDirection = (_a = sourcePort.alignment) === null || _a === void 0 ? void 0 : _a.side;
|
|
791
|
+
const targetDirection = (_b = targetPort.alignment) === null || _b === void 0 ? void 0 : _b.side;
|
|
792
|
+
link.generatePath(sourcePoint, targetPoint, sourceDirection, targetDirection);
|
|
793
|
+
// Add to diagram
|
|
794
|
+
this.addLink(link);
|
|
795
|
+
return link;
|
|
796
|
+
}
|
|
797
|
+
/**
|
|
798
|
+
* Phase 0.5.3: High-level API to connect two nodes
|
|
799
|
+
*
|
|
800
|
+
* Convenience method that creates a smart link and returns success status.
|
|
801
|
+
* This is the simplest way to connect nodes.
|
|
802
|
+
*
|
|
803
|
+
* @param sourceNode - The source node
|
|
804
|
+
* @param targetNode - The target node
|
|
805
|
+
* @param pathType - Path rendering type (default: 'smooth')
|
|
806
|
+
* @returns true if connection was successful, false otherwise
|
|
807
|
+
*
|
|
808
|
+
* @example
|
|
809
|
+
* ```typescript
|
|
810
|
+
* if (diagram.connectNodes(node1, node2)) {
|
|
811
|
+
* console.log('Nodes connected successfully!');
|
|
812
|
+
* }
|
|
813
|
+
* ```
|
|
814
|
+
*/
|
|
815
|
+
connectNodes(sourceNode, targetNode, pathType = 'smooth') {
|
|
816
|
+
const link = this.createSmartLink(sourceNode, targetNode, pathType);
|
|
817
|
+
return link !== undefined;
|
|
818
|
+
}
|
|
819
|
+
/**
|
|
820
|
+
* Phase 0.5.3: Get all connections for a node
|
|
821
|
+
*
|
|
822
|
+
* Returns all links where the node is either source or target.
|
|
823
|
+
* Useful for querying node connectivity.
|
|
824
|
+
*
|
|
825
|
+
* @param node - The node to query
|
|
826
|
+
* @returns Object containing incoming and outgoing links
|
|
827
|
+
*
|
|
828
|
+
* @example
|
|
829
|
+
* ```typescript
|
|
830
|
+
* const connections = diagram.getNodeConnections(node);
|
|
831
|
+
* console.log(`Incoming: ${connections.incoming.length}`);
|
|
832
|
+
* console.log(`Outgoing: ${connections.outgoing.length}`);
|
|
833
|
+
* console.log(`Total: ${connections.all.length}`);
|
|
834
|
+
* ```
|
|
835
|
+
*/
|
|
836
|
+
getNodeConnections(node) {
|
|
837
|
+
const incoming = [];
|
|
838
|
+
const outgoing = [];
|
|
839
|
+
// Get node's port IDs
|
|
840
|
+
const portIds = new Set(node.getPorts().map((p) => p.id));
|
|
841
|
+
// Check all links
|
|
842
|
+
for (const link of this.links.values()) {
|
|
843
|
+
const isTarget = portIds.has(link.targetPortId);
|
|
844
|
+
const isSource = portIds.has(link.sourcePortId);
|
|
845
|
+
if (isTarget) {
|
|
846
|
+
incoming.push(link);
|
|
847
|
+
}
|
|
848
|
+
if (isSource) {
|
|
849
|
+
outgoing.push(link);
|
|
850
|
+
}
|
|
851
|
+
}
|
|
852
|
+
return {
|
|
853
|
+
incoming,
|
|
854
|
+
outgoing,
|
|
855
|
+
all: [...incoming, ...outgoing],
|
|
856
|
+
};
|
|
857
|
+
}
|
|
858
|
+
/**
|
|
859
|
+
* Phase 0.5.3: Disconnect two nodes
|
|
860
|
+
*
|
|
861
|
+
* Removes all links between the specified nodes.
|
|
862
|
+
* Handles cleanup of port connections.
|
|
863
|
+
*
|
|
864
|
+
* @param sourceNode - The source node
|
|
865
|
+
* @param targetNode - The target node
|
|
866
|
+
* @returns Number of links removed
|
|
867
|
+
*
|
|
868
|
+
* @example
|
|
869
|
+
* ```typescript
|
|
870
|
+
* const removed = diagram.disconnectNodes(node1, node2);
|
|
871
|
+
* console.log(`Removed ${removed} connections`);
|
|
872
|
+
* ```
|
|
873
|
+
*/
|
|
874
|
+
disconnectNodes(sourceNode, targetNode) {
|
|
875
|
+
const sourcePortIds = new Set(sourceNode.getPorts().map((p) => p.id));
|
|
876
|
+
const targetPortIds = new Set(targetNode.getPorts().map((p) => p.id));
|
|
877
|
+
const linksToRemove = [];
|
|
878
|
+
// Find all links between these nodes
|
|
879
|
+
for (const link of this.links.values()) {
|
|
880
|
+
const hasSourcePort = sourcePortIds.has(link.sourcePortId);
|
|
881
|
+
const hasTargetPort = targetPortIds.has(link.targetPortId);
|
|
882
|
+
if (hasSourcePort && hasTargetPort) {
|
|
883
|
+
linksToRemove.push(link.id);
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
// Remove the links
|
|
887
|
+
for (const linkId of linksToRemove) {
|
|
888
|
+
const link = this.getLink(linkId);
|
|
889
|
+
if (link) {
|
|
890
|
+
// Clean up port connections
|
|
891
|
+
const sourcePort = sourceNode.getPorts().find((p) => p.id === link.sourcePortId);
|
|
892
|
+
const targetPort = targetNode.getPorts().find((p) => p.id === link.targetPortId);
|
|
893
|
+
if (sourcePort) {
|
|
894
|
+
sourcePort.removeConnection(link.id);
|
|
895
|
+
}
|
|
896
|
+
if (targetPort) {
|
|
897
|
+
targetPort.removeConnection(link.id);
|
|
898
|
+
}
|
|
899
|
+
// Remove link from diagram
|
|
900
|
+
this.removeLink(linkId);
|
|
901
|
+
}
|
|
902
|
+
}
|
|
903
|
+
return linksToRemove.length;
|
|
904
|
+
}
|
|
905
|
+
/**
|
|
906
|
+
* Add group (Phase 1.6c)
|
|
907
|
+
*/
|
|
908
|
+
addGroup(group) {
|
|
909
|
+
if (this.blocksDocumentWrite())
|
|
910
|
+
return;
|
|
911
|
+
this.assertNotDisposed(); // Phase 5.4
|
|
912
|
+
if (this.groups.has(group.id)) {
|
|
913
|
+
throw new Error(`Group with id ${group.id} already exists`);
|
|
914
|
+
}
|
|
915
|
+
this.installGroup(group);
|
|
916
|
+
}
|
|
917
|
+
/**
|
|
918
|
+
* THE single per-group install path (see installNode). The diagram
|
|
919
|
+
* back-reference is RUNTIME wiring: GroupModel.serialize() deliberately
|
|
920
|
+
* excludes it from payloads, and this re-stashes it on every install so a
|
|
921
|
+
* loaded group can resolve its diagram exactly like an authored one.
|
|
922
|
+
*/
|
|
923
|
+
installGroup(group) {
|
|
924
|
+
// Store diagram reference for layout operations. Written to the map
|
|
925
|
+
// DIRECTLY (not setMetadata): this is runtime wiring, not a user
|
|
926
|
+
// mutation — it must not bump the group's version or land in its change
|
|
927
|
+
// log, or a loaded group would report a different version than it was
|
|
928
|
+
// saved with (and every install would count as an edit).
|
|
929
|
+
group.metadata.set('diagram', this);
|
|
930
|
+
this.groups.set(group.id, group);
|
|
931
|
+
this.trackChange('groups', null, group);
|
|
932
|
+
this.emitOrQueue('group:added', group);
|
|
933
|
+
// Mirror of installNode's 'change' forwarding. Without it a group mutation
|
|
934
|
+
// (setFrame/fitToContents, membership, collapse) was invisible at the
|
|
935
|
+
// diagram level: renderers subscribed to node:/link: events repainted on
|
|
936
|
+
// every node twitch but never on a group's — the screenshot audit caught a
|
|
937
|
+
// frame that stayed 40×40 on screen after fitToContents had grown it.
|
|
938
|
+
group.on('change', () => {
|
|
939
|
+
this.emitOrQueue('group:changed', group);
|
|
940
|
+
});
|
|
941
|
+
}
|
|
942
|
+
/**
|
|
943
|
+
* Remove group (Phase 1.6c)
|
|
944
|
+
*/
|
|
945
|
+
removeGroup(groupId) {
|
|
946
|
+
if (this.blocksDocumentWrite())
|
|
947
|
+
return undefined;
|
|
948
|
+
const group = this.groups.get(groupId);
|
|
949
|
+
if (group) {
|
|
950
|
+
this.groups.delete(groupId);
|
|
951
|
+
this.trackChange('groups', group, null);
|
|
952
|
+
this.emitOrQueue('group:removed', group);
|
|
953
|
+
}
|
|
954
|
+
return group;
|
|
955
|
+
}
|
|
956
|
+
/**
|
|
957
|
+
* Restore group from serialized data (Phase 1.8)
|
|
958
|
+
*/
|
|
959
|
+
restoreGroup(data) {
|
|
960
|
+
try {
|
|
961
|
+
const group = GroupModel_1.GroupModel.fromJSON(data);
|
|
962
|
+
this.installGroup(group);
|
|
963
|
+
return group;
|
|
964
|
+
}
|
|
965
|
+
catch (error) {
|
|
966
|
+
console.error('Failed to restore group:', error);
|
|
967
|
+
return undefined;
|
|
968
|
+
}
|
|
969
|
+
}
|
|
970
|
+
/**
|
|
971
|
+
* Get group by ID (Phase 1.6c)
|
|
972
|
+
*/
|
|
973
|
+
getGroup(groupId) {
|
|
974
|
+
return this.groups.get(groupId);
|
|
975
|
+
}
|
|
976
|
+
/**
|
|
977
|
+
* Get all groups (Phase 1.6c)
|
|
978
|
+
*/
|
|
979
|
+
getGroups() {
|
|
980
|
+
return Array.from(this.groups.values());
|
|
981
|
+
}
|
|
982
|
+
/**
|
|
983
|
+
* Wave-5 Card 3: groups in deterministic back-to-front stacking order —
|
|
984
|
+
* ascending `zIndex`, ties broken by Map insertion order (a STABLE sort keeps
|
|
985
|
+
* it). This is the model-level z-order story that replaces "stacking == Map
|
|
986
|
+
* insertion order" as the only determinant; a renderer paints groups in this
|
|
987
|
+
* order (behind their members) instead of relying on iteration order.
|
|
988
|
+
*/
|
|
989
|
+
getGroupsInRenderOrder() {
|
|
990
|
+
return this.getGroups().sort((a, b) => a.zIndex - b.zIndex);
|
|
991
|
+
}
|
|
992
|
+
/**
|
|
993
|
+
* Wave-5 Card 4: the placeholder "group-as-node" for a collapsed group, if
|
|
994
|
+
* present. Placeholder nodes are ordinary NodeModels tagged with the group id
|
|
995
|
+
* so callers can filter them out of exports / counts.
|
|
996
|
+
*/
|
|
997
|
+
getProxyNodeForGroup(groupId) {
|
|
998
|
+
for (const node of this.nodes.values()) {
|
|
999
|
+
if (node.getMetadata('__collapsedGroupId') === groupId) {
|
|
1000
|
+
return node;
|
|
1001
|
+
}
|
|
1002
|
+
}
|
|
1003
|
+
return undefined;
|
|
1004
|
+
}
|
|
1005
|
+
/** Wave-5 Card 4: is this node a collapsed-group placeholder? */
|
|
1006
|
+
isProxyNode(node) {
|
|
1007
|
+
return node.getMetadata('__isGroupProxy') === true;
|
|
1008
|
+
}
|
|
1009
|
+
/**
|
|
1010
|
+
* Clear all groups (Phase 1.6c)
|
|
1011
|
+
*/
|
|
1012
|
+
clearGroups() {
|
|
1013
|
+
this.groups.clear();
|
|
1014
|
+
this.emitOrQueue('groups:cleared');
|
|
1015
|
+
}
|
|
1016
|
+
// =========================================================================
|
|
1017
|
+
// wave10/whiteboard — INK
|
|
1018
|
+
//
|
|
1019
|
+
// Deliberately the THINNEST collection in this model. A stroke has no ports, no
|
|
1020
|
+
// parent, no children, no layout participation and no obstacle registration — the
|
|
1021
|
+
// four things that made "a stroke is just a node" the wrong answer (see StrokeModel).
|
|
1022
|
+
// It is not spatially indexed either: strokes are annotation, they are rare compared
|
|
1023
|
+
// to nodes (a busy whiteboard has tens, not tens of thousands), and the ink layer
|
|
1024
|
+
// culls them with a linear bounds scan that costs microseconds at 500 strokes. If
|
|
1025
|
+
// that ever stops being true, add a third SpatialIndex here — the seam is the same.
|
|
1026
|
+
// =========================================================================
|
|
1027
|
+
addStroke(stroke) {
|
|
1028
|
+
if (this.blocksDocumentWrite())
|
|
1029
|
+
return;
|
|
1030
|
+
this.assertNotDisposed();
|
|
1031
|
+
if (this.strokes.has(stroke.id)) {
|
|
1032
|
+
throw new Error(`Stroke with id ${stroke.id} already exists`);
|
|
1033
|
+
}
|
|
1034
|
+
this.installStroke(stroke);
|
|
1035
|
+
}
|
|
1036
|
+
/** THE single per-stroke install path (see installNode) — authored, restored, or replayed. */
|
|
1037
|
+
installStroke(stroke) {
|
|
1038
|
+
this.strokes.set(stroke.id, stroke);
|
|
1039
|
+
// The op-capture funnel. `trackChange('strokes', null, stroke)` is what makes an
|
|
1040
|
+
// added stroke reach OpCapture (which maps it to an `add` op), the mutation epoch
|
|
1041
|
+
// (which makes the frame gate repaint), and the dirty tracker. All three for free,
|
|
1042
|
+
// and all three ONLY because a stroke is a real DiagramEntity in a real collection.
|
|
1043
|
+
this.trackChange('strokes', null, stroke);
|
|
1044
|
+
this.emitOrQueue('stroke:added', stroke);
|
|
1045
|
+
}
|
|
1046
|
+
removeStroke(strokeId) {
|
|
1047
|
+
if (this.blocksDocumentWrite())
|
|
1048
|
+
return undefined;
|
|
1049
|
+
const stroke = this.strokes.get(strokeId);
|
|
1050
|
+
if (stroke) {
|
|
1051
|
+
this.strokes.delete(strokeId);
|
|
1052
|
+
this.trackChange('strokes', stroke, null);
|
|
1053
|
+
this.emitOrQueue('stroke:removed', stroke);
|
|
1054
|
+
}
|
|
1055
|
+
return stroke;
|
|
1056
|
+
}
|
|
1057
|
+
restoreStroke(data) {
|
|
1058
|
+
try {
|
|
1059
|
+
const stroke = StrokeModel_1.StrokeModel.fromJSON(data);
|
|
1060
|
+
this.installStroke(stroke);
|
|
1061
|
+
return stroke;
|
|
1062
|
+
}
|
|
1063
|
+
catch (error) {
|
|
1064
|
+
console.error('Failed to restore stroke:', error);
|
|
1065
|
+
return undefined;
|
|
1066
|
+
}
|
|
1067
|
+
}
|
|
1068
|
+
getStroke(strokeId) {
|
|
1069
|
+
return this.strokes.get(strokeId);
|
|
1070
|
+
}
|
|
1071
|
+
getStrokes() {
|
|
1072
|
+
return Array.from(this.strokes.values());
|
|
1073
|
+
}
|
|
1074
|
+
clearStrokes() {
|
|
1075
|
+
this.strokes.clear();
|
|
1076
|
+
this.emitOrQueue('strokes:cleared');
|
|
1077
|
+
}
|
|
1078
|
+
/** Strokes whose bounds overlap `viewport`. The ink layer's culling query. */
|
|
1079
|
+
getVisibleStrokes(viewport) {
|
|
1080
|
+
const out = [];
|
|
1081
|
+
for (const stroke of this.strokes.values()) {
|
|
1082
|
+
const b = stroke.getBounds();
|
|
1083
|
+
if (b.x <= viewport.x + viewport.width &&
|
|
1084
|
+
b.x + b.width >= viewport.x &&
|
|
1085
|
+
b.y <= viewport.y + viewport.height &&
|
|
1086
|
+
b.y + b.height >= viewport.y) {
|
|
1087
|
+
out.push(stroke);
|
|
1088
|
+
}
|
|
1089
|
+
}
|
|
1090
|
+
return out;
|
|
1091
|
+
}
|
|
1092
|
+
/**
|
|
1093
|
+
* Every stroke the pointer swept across travelling `a`→`b`. THE ERASER'S QUERY.
|
|
1094
|
+
*
|
|
1095
|
+
* Segment-based, not point-based: a fast flick puts 80px between two pointermove
|
|
1096
|
+
* samples, and an eraser that only tested the samples would jump clean over a stroke
|
|
1097
|
+
* it visibly wiped through. Ask what the pointer TRAVELLED THROUGH, not where it
|
|
1098
|
+
* happened to land.
|
|
1099
|
+
*/
|
|
1100
|
+
getStrokesAlongSegment(a, b, tolerance = 0) {
|
|
1101
|
+
const out = [];
|
|
1102
|
+
for (const stroke of this.strokes.values()) {
|
|
1103
|
+
if (stroke.intersectsSegment(a, b, tolerance))
|
|
1104
|
+
out.push(stroke);
|
|
1105
|
+
}
|
|
1106
|
+
return out;
|
|
1107
|
+
}
|
|
1108
|
+
/**
|
|
1109
|
+
* Compound-graph containment (Wave-2)
|
|
1110
|
+
*
|
|
1111
|
+
* These derive the nesting tree from each GroupModel.parentGroupId pointer,
|
|
1112
|
+
* which addMember/removeMember/setParent keep authoritative. Coordinates stay
|
|
1113
|
+
* ABSOLUTE across the codebase; nesting is purely a logical containment tree.
|
|
1114
|
+
*/
|
|
1115
|
+
/**
|
|
1116
|
+
* Get a group's ancestor chain (nearest parent first), walking parentGroupId
|
|
1117
|
+
* upward. Robust against malformed self/looping pointers.
|
|
1118
|
+
*/
|
|
1119
|
+
getAncestors(groupId) {
|
|
1120
|
+
const result = [];
|
|
1121
|
+
const seen = new Set([groupId]);
|
|
1122
|
+
let current = this.groups.get(groupId);
|
|
1123
|
+
while (current && current.parentGroupId) {
|
|
1124
|
+
if (seen.has(current.parentGroupId)) {
|
|
1125
|
+
break; // defensive: never loop on a corrupt pointer
|
|
1126
|
+
}
|
|
1127
|
+
const parent = this.groups.get(current.parentGroupId);
|
|
1128
|
+
if (!parent) {
|
|
1129
|
+
break;
|
|
1130
|
+
}
|
|
1131
|
+
result.push(parent);
|
|
1132
|
+
seen.add(parent.id);
|
|
1133
|
+
current = parent;
|
|
1134
|
+
}
|
|
1135
|
+
return result;
|
|
1136
|
+
}
|
|
1137
|
+
/**
|
|
1138
|
+
* Get every group nested (directly or transitively) inside `groupId`.
|
|
1139
|
+
* Breadth-first over the parentGroupId back-pointers.
|
|
1140
|
+
*/
|
|
1141
|
+
getDescendants(groupId) {
|
|
1142
|
+
const result = [];
|
|
1143
|
+
const seen = new Set([groupId]);
|
|
1144
|
+
const queue = [groupId];
|
|
1145
|
+
while (queue.length > 0) {
|
|
1146
|
+
const currentId = queue.shift();
|
|
1147
|
+
for (const group of this.groups.values()) {
|
|
1148
|
+
if (group.parentGroupId === currentId && !seen.has(group.id)) {
|
|
1149
|
+
seen.add(group.id);
|
|
1150
|
+
result.push(group);
|
|
1151
|
+
queue.push(group.id);
|
|
1152
|
+
}
|
|
1153
|
+
}
|
|
1154
|
+
}
|
|
1155
|
+
return result;
|
|
1156
|
+
}
|
|
1157
|
+
/**
|
|
1158
|
+
* Nesting depth of a group: number of ancestors (0 for a top-level group).
|
|
1159
|
+
*/
|
|
1160
|
+
getDepth(groupId) {
|
|
1161
|
+
return this.getAncestors(groupId).length;
|
|
1162
|
+
}
|
|
1163
|
+
/**
|
|
1164
|
+
* Selection Management
|
|
1165
|
+
*/
|
|
1166
|
+
/**
|
|
1167
|
+
* Get all selected nodes
|
|
1168
|
+
*/
|
|
1169
|
+
getSelectedNodes() {
|
|
1170
|
+
return this.getNodes().filter((node) => node.isSelected());
|
|
1171
|
+
}
|
|
1172
|
+
/**
|
|
1173
|
+
* Select a single node (clears previous selection)
|
|
1174
|
+
* @param node - Node to select
|
|
1175
|
+
*/
|
|
1176
|
+
selectNode(node) {
|
|
1177
|
+
if (!node.isSelectable()) {
|
|
1178
|
+
return;
|
|
1179
|
+
}
|
|
1180
|
+
// Clear previous selection
|
|
1181
|
+
this.clearSelection();
|
|
1182
|
+
// Select the node
|
|
1183
|
+
node.setSelected(true);
|
|
1184
|
+
// Emit selection changed event
|
|
1185
|
+
this.emitOrQueue('selection:changed', {
|
|
1186
|
+
selected: [node],
|
|
1187
|
+
deselected: []
|
|
1188
|
+
});
|
|
1189
|
+
}
|
|
1190
|
+
/**
|
|
1191
|
+
* Add node to selection (multi-select)
|
|
1192
|
+
* @param node - Node to add to selection
|
|
1193
|
+
*/
|
|
1194
|
+
addToSelection(node) {
|
|
1195
|
+
if (!node.isSelectable() || node.isSelected()) {
|
|
1196
|
+
return;
|
|
1197
|
+
}
|
|
1198
|
+
node.setSelected(true);
|
|
1199
|
+
this.emitOrQueue('selection:changed', {
|
|
1200
|
+
selected: [node],
|
|
1201
|
+
deselected: []
|
|
1202
|
+
});
|
|
1203
|
+
}
|
|
1204
|
+
/**
|
|
1205
|
+
* Remove node from selection
|
|
1206
|
+
* @param node - Node to remove from selection
|
|
1207
|
+
*/
|
|
1208
|
+
removeFromSelection(node) {
|
|
1209
|
+
if (!node.isSelected()) {
|
|
1210
|
+
return;
|
|
1211
|
+
}
|
|
1212
|
+
node.setSelected(false);
|
|
1213
|
+
this.emitOrQueue('selection:changed', {
|
|
1214
|
+
selected: [],
|
|
1215
|
+
deselected: [node]
|
|
1216
|
+
});
|
|
1217
|
+
}
|
|
1218
|
+
/**
|
|
1219
|
+
* Toggle node selection (add if not selected, remove if selected)
|
|
1220
|
+
* @param node - Node to toggle
|
|
1221
|
+
*/
|
|
1222
|
+
toggleNodeSelection(node) {
|
|
1223
|
+
if (!node.isSelectable()) {
|
|
1224
|
+
return;
|
|
1225
|
+
}
|
|
1226
|
+
if (node.isSelected()) {
|
|
1227
|
+
this.removeFromSelection(node);
|
|
1228
|
+
}
|
|
1229
|
+
else {
|
|
1230
|
+
this.addToSelection(node);
|
|
1231
|
+
}
|
|
1232
|
+
}
|
|
1233
|
+
/**
|
|
1234
|
+
* Clear all selections
|
|
1235
|
+
*/
|
|
1236
|
+
clearSelection() {
|
|
1237
|
+
const selectedNodes = this.getSelectedNodes();
|
|
1238
|
+
if (selectedNodes.length === 0) {
|
|
1239
|
+
return;
|
|
1240
|
+
}
|
|
1241
|
+
selectedNodes.forEach((node) => node.setSelected(false));
|
|
1242
|
+
this.emitOrQueue('selection:changed', {
|
|
1243
|
+
selected: [],
|
|
1244
|
+
deselected: selectedNodes
|
|
1245
|
+
});
|
|
1246
|
+
}
|
|
1247
|
+
/**
|
|
1248
|
+
* Select all nodes
|
|
1249
|
+
*/
|
|
1250
|
+
selectAll() {
|
|
1251
|
+
const selectableNodes = this.getNodes().filter((node) => node.isSelectable());
|
|
1252
|
+
const previouslySelected = this.getSelectedNodes();
|
|
1253
|
+
const newlySelected = selectableNodes.filter((node) => !node.isSelected());
|
|
1254
|
+
newlySelected.forEach((node) => node.setSelected(true));
|
|
1255
|
+
if (newlySelected.length > 0) {
|
|
1256
|
+
this.emitOrQueue('selection:changed', {
|
|
1257
|
+
selected: newlySelected,
|
|
1258
|
+
deselected: []
|
|
1259
|
+
});
|
|
1260
|
+
}
|
|
1261
|
+
}
|
|
1262
|
+
/**
|
|
1263
|
+
* Delete all selected nodes and their connected links
|
|
1264
|
+
* @returns Number of nodes deleted
|
|
1265
|
+
*/
|
|
1266
|
+
deleteSelected() {
|
|
1267
|
+
if (this.blocksDocumentWrite())
|
|
1268
|
+
return 0;
|
|
1269
|
+
const selectedNodes = this.getSelectedNodes();
|
|
1270
|
+
if (selectedNodes.length === 0) {
|
|
1271
|
+
return 0;
|
|
1272
|
+
}
|
|
1273
|
+
// Delete nodes (this will also trigger link cleanup via events)
|
|
1274
|
+
selectedNodes.forEach((node) => {
|
|
1275
|
+
this.removeNode(node.id);
|
|
1276
|
+
});
|
|
1277
|
+
return selectedNodes.length;
|
|
1278
|
+
}
|
|
1279
|
+
/**
|
|
1280
|
+
* Get node at position (for click detection)
|
|
1281
|
+
* Returns the topmost node at the given position
|
|
1282
|
+
* @param x - X coordinate
|
|
1283
|
+
* @param y - Y coordinate
|
|
1284
|
+
* @returns Node at position, or undefined if none found
|
|
1285
|
+
* Phase 3.3: Uses shape-aware hit detection
|
|
1286
|
+
*/
|
|
1287
|
+
getNodeAtPosition(x, y) {
|
|
1288
|
+
const nodes = this.getNodes();
|
|
1289
|
+
// Iterate in reverse order (topmost node first)
|
|
1290
|
+
for (let i = nodes.length - 1; i >= 0; i--) {
|
|
1291
|
+
const node = nodes[i];
|
|
1292
|
+
const bounds = node.getBoundingBox();
|
|
1293
|
+
// Phase 3.3: Use shape-aware hit detection
|
|
1294
|
+
const shapeConfig = node.getMetadata('shape');
|
|
1295
|
+
if ((0, geometry_1.isPointInShape)(x, y, bounds, shapeConfig)) {
|
|
1296
|
+
return node;
|
|
1297
|
+
}
|
|
1298
|
+
}
|
|
1299
|
+
return undefined;
|
|
1300
|
+
}
|
|
1301
|
+
/**
|
|
1302
|
+
* Is (x, y) inside any node ABOVE `nodeId` in z-order?
|
|
1303
|
+
*
|
|
1304
|
+
* Same z contract as {@link getNodeAtPosition} (array order, topmost last),
|
|
1305
|
+
* same shape-aware containment. This is the occlusion oracle for PORTS: a
|
|
1306
|
+
* port whose anchor a higher node covers must neither paint nor accept
|
|
1307
|
+
* input — pre-fix, an overlapped node's port glyphs floated on top of the
|
|
1308
|
+
* covering node's body, and its hidden ports still won the hover/press race
|
|
1309
|
+
* through it (live report from stacked pasted nodes).
|
|
1310
|
+
*/
|
|
1311
|
+
isPointCoveredAbove(x, y, nodeId) {
|
|
1312
|
+
const nodes = this.getNodes();
|
|
1313
|
+
let ownerIndex = -1;
|
|
1314
|
+
for (let i = nodes.length - 1; i >= 0; i--) {
|
|
1315
|
+
if (nodes[i].id === nodeId) {
|
|
1316
|
+
ownerIndex = i;
|
|
1317
|
+
break;
|
|
1318
|
+
}
|
|
1319
|
+
}
|
|
1320
|
+
if (ownerIndex < 0)
|
|
1321
|
+
return false;
|
|
1322
|
+
for (let i = nodes.length - 1; i > ownerIndex; i--) {
|
|
1323
|
+
const node = nodes[i];
|
|
1324
|
+
// A node's own DESCENDANTS never occlude it: a composite's chrome (a
|
|
1325
|
+
// title-bar child covering the parent's top strip) is part of the same
|
|
1326
|
+
// widget, and the parent's ports deliberately ride above it — that is
|
|
1327
|
+
// why ports paint in an overlay at all (see create-diagram.spec "port
|
|
1328
|
+
// glyphs paint above overlapping nodes"). Only STRANGERS above cover.
|
|
1329
|
+
if (this.hasAncestor(node, nodeId))
|
|
1330
|
+
continue;
|
|
1331
|
+
const bounds = node.getBoundingBox();
|
|
1332
|
+
if (x < bounds.left || x > bounds.right || y < bounds.top || y > bounds.bottom)
|
|
1333
|
+
continue;
|
|
1334
|
+
if ((0, geometry_1.isPointInShape)(x, y, bounds, node.getMetadata('shape'))) {
|
|
1335
|
+
return true;
|
|
1336
|
+
}
|
|
1337
|
+
}
|
|
1338
|
+
return false;
|
|
1339
|
+
}
|
|
1340
|
+
/** Is `ancestorId` anywhere up `node`'s parent chain? Cycle-guarded. */
|
|
1341
|
+
hasAncestor(node, ancestorId) {
|
|
1342
|
+
var _a;
|
|
1343
|
+
const seen = new Set();
|
|
1344
|
+
let parentId = node.parentId;
|
|
1345
|
+
while (parentId && !seen.has(parentId)) {
|
|
1346
|
+
if (parentId === ancestorId)
|
|
1347
|
+
return true;
|
|
1348
|
+
seen.add(parentId);
|
|
1349
|
+
parentId = (_a = this.getNode(parentId)) === null || _a === void 0 ? void 0 : _a.parentId;
|
|
1350
|
+
}
|
|
1351
|
+
return false;
|
|
1352
|
+
}
|
|
1353
|
+
/**
|
|
1354
|
+
* Option 3: Lock/pin selected nodes
|
|
1355
|
+
* Locked nodes will not move during layout operations
|
|
1356
|
+
*/
|
|
1357
|
+
lockSelected() {
|
|
1358
|
+
const selectedNodes = this.getSelectedNodes();
|
|
1359
|
+
if (selectedNodes.length === 0) {
|
|
1360
|
+
return 0;
|
|
1361
|
+
}
|
|
1362
|
+
selectedNodes.forEach((node) => {
|
|
1363
|
+
node.setState({ locked: true });
|
|
1364
|
+
});
|
|
1365
|
+
return selectedNodes.length;
|
|
1366
|
+
}
|
|
1367
|
+
/**
|
|
1368
|
+
* Option 3: Unlock selected nodes
|
|
1369
|
+
*/
|
|
1370
|
+
unlockSelected() {
|
|
1371
|
+
const selectedNodes = this.getSelectedNodes();
|
|
1372
|
+
if (selectedNodes.length === 0) {
|
|
1373
|
+
return 0;
|
|
1374
|
+
}
|
|
1375
|
+
selectedNodes.forEach((node) => {
|
|
1376
|
+
node.setState({ locked: false });
|
|
1377
|
+
});
|
|
1378
|
+
return selectedNodes.length;
|
|
1379
|
+
}
|
|
1380
|
+
/**
|
|
1381
|
+
* Option 3: Get locked nodes
|
|
1382
|
+
*/
|
|
1383
|
+
getLockedNodes() {
|
|
1384
|
+
return this.getNodes().filter((node) => node.state.locked);
|
|
1385
|
+
}
|
|
1386
|
+
/**
|
|
1387
|
+
* Option 3: Unlock all nodes
|
|
1388
|
+
*/
|
|
1389
|
+
unlockAll() {
|
|
1390
|
+
const lockedNodes = this.getLockedNodes();
|
|
1391
|
+
lockedNodes.forEach((node) => {
|
|
1392
|
+
node.setState({ locked: false });
|
|
1393
|
+
});
|
|
1394
|
+
return lockedNodes.length;
|
|
1395
|
+
}
|
|
1396
|
+
/**
|
|
1397
|
+
* Set viewport (Phase 0.5 - Viewport-Aware Layout)
|
|
1398
|
+
*/
|
|
1399
|
+
setViewport(x, y, width, height, zoom) {
|
|
1400
|
+
const oldViewport = Object.assign({}, this.viewport);
|
|
1401
|
+
this.viewport = {
|
|
1402
|
+
x,
|
|
1403
|
+
y,
|
|
1404
|
+
width,
|
|
1405
|
+
height,
|
|
1406
|
+
zoom: zoom !== undefined ? zoom : this.viewport.zoom
|
|
1407
|
+
};
|
|
1408
|
+
this.trackChange('viewport', oldViewport, this.viewport);
|
|
1409
|
+
this.emitOrQueue('viewport:changed', this.viewport);
|
|
1410
|
+
}
|
|
1411
|
+
/**
|
|
1412
|
+
* Get current viewport
|
|
1413
|
+
*/
|
|
1414
|
+
getViewport() {
|
|
1415
|
+
return Object.assign({}, this.viewport);
|
|
1416
|
+
}
|
|
1417
|
+
/**
|
|
1418
|
+
* Pan viewport
|
|
1419
|
+
*/
|
|
1420
|
+
pan(dx, dy) {
|
|
1421
|
+
this.setViewport(this.viewport.x + dx, this.viewport.y + dy, this.viewport.width, this.viewport.height, this.viewport.zoom);
|
|
1422
|
+
}
|
|
1423
|
+
/**
|
|
1424
|
+
* Zoom viewport (relative adjustment)
|
|
1425
|
+
*/
|
|
1426
|
+
zoom(delta, center) {
|
|
1427
|
+
const newZoom = Math.max(0.1, Math.min(10, this.viewport.zoom + delta));
|
|
1428
|
+
this.setViewport(this.viewport.x, this.viewport.y, this.viewport.width, this.viewport.height, newZoom);
|
|
1429
|
+
}
|
|
1430
|
+
/**
|
|
1431
|
+
* Set absolute zoom level
|
|
1432
|
+
* Phase 0.5 - Option B: Pan/Zoom controls
|
|
1433
|
+
* @param level - Zoom level (0.1 to 10.0)
|
|
1434
|
+
* @param center - Optional center point for zoom (defaults to viewport center)
|
|
1435
|
+
*/
|
|
1436
|
+
setZoom(level, center) {
|
|
1437
|
+
const newZoom = Math.max(0.1, Math.min(10, level));
|
|
1438
|
+
this.setViewport(this.viewport.x, this.viewport.y, this.viewport.width, this.viewport.height, newZoom);
|
|
1439
|
+
}
|
|
1440
|
+
/**
|
|
1441
|
+
* Fit viewport to show all nodes (without changing zoom level)
|
|
1442
|
+
* Phase 0.5 - Option B: Pan/Zoom controls
|
|
1443
|
+
* @param padding - Padding around content (default 100)
|
|
1444
|
+
*/
|
|
1445
|
+
fitToView(padding = 100) {
|
|
1446
|
+
const nodes = this.getNodes();
|
|
1447
|
+
if (nodes.length === 0) {
|
|
1448
|
+
// No nodes - reset to default viewport
|
|
1449
|
+
this.setViewport(0, 0, 1200, 800, this.viewport.zoom);
|
|
1450
|
+
return;
|
|
1451
|
+
}
|
|
1452
|
+
// Calculate bounding box of all nodes
|
|
1453
|
+
let minX = Infinity;
|
|
1454
|
+
let minY = Infinity;
|
|
1455
|
+
let maxX = -Infinity;
|
|
1456
|
+
let maxY = -Infinity;
|
|
1457
|
+
nodes.forEach(node => {
|
|
1458
|
+
const bounds = node.getBoundingBox();
|
|
1459
|
+
minX = Math.min(minX, bounds.left);
|
|
1460
|
+
minY = Math.min(minY, bounds.top);
|
|
1461
|
+
maxX = Math.max(maxX, bounds.right);
|
|
1462
|
+
maxY = Math.max(maxY, bounds.bottom);
|
|
1463
|
+
});
|
|
1464
|
+
// Calculate content dimensions
|
|
1465
|
+
const contentWidth = maxX - minX;
|
|
1466
|
+
const contentHeight = maxY - minY;
|
|
1467
|
+
// Calculate viewport size to fit content with padding
|
|
1468
|
+
const viewportWidth = contentWidth + padding * 2;
|
|
1469
|
+
const viewportHeight = contentHeight + padding * 2;
|
|
1470
|
+
// Center the viewport on the content
|
|
1471
|
+
const centerX = (minX + maxX) / 2;
|
|
1472
|
+
const centerY = (minY + maxY) / 2;
|
|
1473
|
+
this.setViewport(centerX - viewportWidth / 2, centerY - viewportHeight / 2, viewportWidth, viewportHeight, this.viewport.zoom);
|
|
1474
|
+
console.log(`📐 Fit to view: ${nodes.length} nodes, bounds=(${minX.toFixed(1)}, ${minY.toFixed(1)}) to (${maxX.toFixed(1)}, ${maxY.toFixed(1)})`);
|
|
1475
|
+
}
|
|
1476
|
+
/**
|
|
1477
|
+
* Fit viewport to show all nodes AND adjust zoom to fit screen
|
|
1478
|
+
* Phase 0.5 - Option B: Pan/Zoom controls
|
|
1479
|
+
* @param targetWidth - Target viewport width (e.g. screen width)
|
|
1480
|
+
* @param targetHeight - Target viewport height (e.g. screen height)
|
|
1481
|
+
* @param padding - Padding around content (default 100)
|
|
1482
|
+
*/
|
|
1483
|
+
zoomToFit(targetWidth, targetHeight, padding = 100) {
|
|
1484
|
+
const nodes = this.getNodes();
|
|
1485
|
+
if (nodes.length === 0) {
|
|
1486
|
+
// No nodes - reset to default
|
|
1487
|
+
this.setViewport(0, 0, targetWidth, targetHeight, 1.0);
|
|
1488
|
+
return;
|
|
1489
|
+
}
|
|
1490
|
+
// Calculate bounding box of all nodes
|
|
1491
|
+
let minX = Infinity;
|
|
1492
|
+
let minY = Infinity;
|
|
1493
|
+
let maxX = -Infinity;
|
|
1494
|
+
let maxY = -Infinity;
|
|
1495
|
+
nodes.forEach(node => {
|
|
1496
|
+
const bounds = node.getBoundingBox();
|
|
1497
|
+
minX = Math.min(minX, bounds.left);
|
|
1498
|
+
minY = Math.min(minY, bounds.top);
|
|
1499
|
+
maxX = Math.max(maxX, bounds.right);
|
|
1500
|
+
maxY = Math.max(maxY, bounds.bottom);
|
|
1501
|
+
});
|
|
1502
|
+
// Calculate content dimensions
|
|
1503
|
+
const contentWidth = maxX - minX;
|
|
1504
|
+
const contentHeight = maxY - minY;
|
|
1505
|
+
// Calculate zoom level to fit content in target viewport
|
|
1506
|
+
const availableWidth = targetWidth - padding * 2;
|
|
1507
|
+
const availableHeight = targetHeight - padding * 2;
|
|
1508
|
+
const scaleX = availableWidth / contentWidth;
|
|
1509
|
+
const scaleY = availableHeight / contentHeight;
|
|
1510
|
+
const newZoom = Math.min(scaleX, scaleY, 1.0); // Don't zoom in beyond 1.0, only zoom out
|
|
1511
|
+
// Center the content in the target viewport
|
|
1512
|
+
const centerX = (minX + maxX) / 2;
|
|
1513
|
+
const centerY = (minY + maxY) / 2;
|
|
1514
|
+
this.setViewport(centerX - targetWidth / 2, centerY - targetHeight / 2, targetWidth, targetHeight, Math.max(0.1, Math.min(10, newZoom)));
|
|
1515
|
+
console.log(`🔍 Zoom to fit: ${nodes.length} nodes, zoom=${newZoom.toFixed(2)}, content=${contentWidth.toFixed(1)}x${contentHeight.toFixed(1)}`);
|
|
1516
|
+
}
|
|
1517
|
+
/**
|
|
1518
|
+
* Clear all nodes, links, and groups (Phase 1.6c)
|
|
1519
|
+
*/
|
|
1520
|
+
clear() {
|
|
1521
|
+
// Remove all links first
|
|
1522
|
+
const linkIds = Array.from(this.links.keys());
|
|
1523
|
+
for (const linkId of linkIds) {
|
|
1524
|
+
this.removeLink(linkId);
|
|
1525
|
+
}
|
|
1526
|
+
// Remove all nodes
|
|
1527
|
+
const nodeIds = Array.from(this.nodes.keys());
|
|
1528
|
+
for (const nodeId of nodeIds) {
|
|
1529
|
+
this.removeNode(nodeId);
|
|
1530
|
+
}
|
|
1531
|
+
// Remove all groups (Phase 1.6c)
|
|
1532
|
+
const groupIds = Array.from(this.groups.keys());
|
|
1533
|
+
for (const groupId of groupIds) {
|
|
1534
|
+
this.removeGroup(groupId);
|
|
1535
|
+
}
|
|
1536
|
+
// wave10/whiteboard: ink is document content, so clear() clears it. Removed one by
|
|
1537
|
+
// one (not `strokes.clear()`) so each emits its trackChange — otherwise clearing a
|
|
1538
|
+
// collaborative document would wipe the ink locally and NOT tell the other peers,
|
|
1539
|
+
// and their next edit would resurrect it all.
|
|
1540
|
+
const strokeIds = Array.from(this.strokes.keys());
|
|
1541
|
+
for (const strokeId of strokeIds) {
|
|
1542
|
+
this.removeStroke(strokeId);
|
|
1543
|
+
}
|
|
1544
|
+
// Phase 5.1: Clear spatial indices
|
|
1545
|
+
this.nodeSpatialIndex.clear();
|
|
1546
|
+
this.linkSpatialIndex.clear();
|
|
1547
|
+
this.emitOrQueue('diagram:cleared');
|
|
1548
|
+
}
|
|
1549
|
+
/**
|
|
1550
|
+
* Get nodes visible in viewport (Phase 5.1)
|
|
1551
|
+
* This enables viewport virtualization - only render visible nodes
|
|
1552
|
+
*
|
|
1553
|
+
* @param viewport - Rectangular viewport region in world coordinates
|
|
1554
|
+
* @returns Array of nodes that intersect with the viewport
|
|
1555
|
+
*
|
|
1556
|
+
* @example
|
|
1557
|
+
* ```typescript
|
|
1558
|
+
* const viewport = {
|
|
1559
|
+
* x: camera.x,
|
|
1560
|
+
* y: camera.y,
|
|
1561
|
+
* width: canvas.width / camera.zoom,
|
|
1562
|
+
* height: canvas.height / camera.zoom,
|
|
1563
|
+
* };
|
|
1564
|
+
* const visibleNodes = diagram.getVisibleNodes(viewport);
|
|
1565
|
+
* // Only render visibleNodes instead of all nodes
|
|
1566
|
+
* ```
|
|
1567
|
+
*/
|
|
1568
|
+
getVisibleNodes(viewport) {
|
|
1569
|
+
return this.nodeSpatialIndex.queryRegion(viewport, {
|
|
1570
|
+
filter: (node) => node.state.visible !== false,
|
|
1571
|
+
});
|
|
1572
|
+
}
|
|
1573
|
+
/**
|
|
1574
|
+
* Get links visible in viewport (Phase 5.1)
|
|
1575
|
+
* This enables viewport virtualization - only render visible links
|
|
1576
|
+
*
|
|
1577
|
+
* @param viewport - Rectangular viewport region in world coordinates
|
|
1578
|
+
* @returns Array of links that intersect with the viewport
|
|
1579
|
+
*/
|
|
1580
|
+
getVisibleLinks(viewport) {
|
|
1581
|
+
return this.linkSpatialIndex.queryRegion(viewport);
|
|
1582
|
+
}
|
|
1583
|
+
/**
|
|
1584
|
+
* The nearest port to a world point, served BY THE SPATIAL INDEX.
|
|
1585
|
+
*
|
|
1586
|
+
* wave8/culling — Card 2. This is the query a link drag makes on every
|
|
1587
|
+
* pointermove, so it is the one query that must never be a scan: the existing
|
|
1588
|
+
* answer (`PortModel.findNearestPort`) could only search ONE node — the one the
|
|
1589
|
+
* pointer happened to be over — because searching more would have meant walking
|
|
1590
|
+
* every node in the diagram. The index turns "which port am I near" into a
|
|
1591
|
+
* bounded region query, so a drag can snap to a port it is merely NEAR, not one
|
|
1592
|
+
* it is already on top of, without paying O(nodes) sixty times a second.
|
|
1593
|
+
*
|
|
1594
|
+
* `portPosition` is injectable because THE ENGINE DOES NOT KNOW WHERE PORTS ARE.
|
|
1595
|
+
* Its default (`getAbsolutePosition`) walks the bounding box — edge midpoints,
|
|
1596
|
+
* blind to the silhouette and to how many ports share a side — while the
|
|
1597
|
+
* renderer draws them shape-aware (`portWorldPosition`). Wave 6 fixed exactly
|
|
1598
|
+
* this divergence for the port hit-test and the magnet, and it is why callers
|
|
1599
|
+
* inside the renderer MUST pass the shape-aware resolver: otherwise you snap to
|
|
1600
|
+
* a point several pixels from the circle you can see.
|
|
1601
|
+
*
|
|
1602
|
+
* @param point World-space point (usually the drag position).
|
|
1603
|
+
* @param options radius (default 24 world units), an optional port filter, and
|
|
1604
|
+
* the port-position resolver described above.
|
|
1605
|
+
*/
|
|
1606
|
+
findNearestPort(point, options) {
|
|
1607
|
+
var _a, _b;
|
|
1608
|
+
const radius = (_a = options === null || options === void 0 ? void 0 : options.radius) !== null && _a !== void 0 ? _a : exports.DEFAULT_PORT_SNAP_RADIUS;
|
|
1609
|
+
const positionOf = (_b = options === null || options === void 0 ? void 0 : options.portPosition) !== null && _b !== void 0 ? _b : ((port, node) => port.getAbsolutePosition(node.getBoundingBox()));
|
|
1610
|
+
// A port normally sits ON its node's bounding box, so any port within
|
|
1611
|
+
// `radius` belongs to a node whose box is within `radius`. `port.offset` can
|
|
1612
|
+
// push it outside, though, so the CANDIDATE search is padded — a few extra
|
|
1613
|
+
// candidate nodes cost nothing (they fail the real distance test below),
|
|
1614
|
+
// whereas missing one silently loses a snap target.
|
|
1615
|
+
const candidates = this.nodeSpatialIndex.queryNear(point, radius + PORT_OFFSET_PAD, { filter: (node) => node.state.visible !== false });
|
|
1616
|
+
let best = null;
|
|
1617
|
+
for (const node of candidates) {
|
|
1618
|
+
for (const port of node.getPorts()) {
|
|
1619
|
+
if ((options === null || options === void 0 ? void 0 : options.filter) && !options.filter(port, node))
|
|
1620
|
+
continue;
|
|
1621
|
+
const p = positionOf(port, node);
|
|
1622
|
+
const dx = point.x - p.x;
|
|
1623
|
+
const dy = point.y - p.y;
|
|
1624
|
+
const distance = Math.sqrt(dx * dx + dy * dy);
|
|
1625
|
+
if (distance > radius)
|
|
1626
|
+
continue;
|
|
1627
|
+
if (!best || distance < best.distance) {
|
|
1628
|
+
best = { port, node, distance };
|
|
1629
|
+
}
|
|
1630
|
+
}
|
|
1631
|
+
}
|
|
1632
|
+
return best;
|
|
1633
|
+
}
|
|
1634
|
+
/**
|
|
1635
|
+
* Get bounding box of all visible entities (Phase 5.1)
|
|
1636
|
+
* Useful for "fit to viewport" operations
|
|
1637
|
+
*
|
|
1638
|
+
* @param viewport - Rectangular viewport region
|
|
1639
|
+
* @returns Bounding rectangle of visible entities, or null if none visible
|
|
1640
|
+
*/
|
|
1641
|
+
getVisibleBounds(viewport) {
|
|
1642
|
+
const visibleNodes = this.getVisibleNodes(viewport);
|
|
1643
|
+
const visibleLinks = this.getVisibleLinks(viewport);
|
|
1644
|
+
if (visibleNodes.length === 0 && visibleLinks.length === 0) {
|
|
1645
|
+
return null;
|
|
1646
|
+
}
|
|
1647
|
+
let minX = Infinity;
|
|
1648
|
+
let minY = Infinity;
|
|
1649
|
+
let maxX = -Infinity;
|
|
1650
|
+
let maxY = -Infinity;
|
|
1651
|
+
// Include visible nodes
|
|
1652
|
+
for (const node of visibleNodes) {
|
|
1653
|
+
const bounds = node.getBoundingBox();
|
|
1654
|
+
minX = Math.min(minX, bounds.left);
|
|
1655
|
+
minY = Math.min(minY, bounds.top);
|
|
1656
|
+
maxX = Math.max(maxX, bounds.right);
|
|
1657
|
+
maxY = Math.max(maxY, bounds.bottom);
|
|
1658
|
+
}
|
|
1659
|
+
// Include visible links
|
|
1660
|
+
for (const link of visibleLinks) {
|
|
1661
|
+
for (const point of link.points) {
|
|
1662
|
+
minX = Math.min(minX, point.x);
|
|
1663
|
+
minY = Math.min(minY, point.y);
|
|
1664
|
+
maxX = Math.max(maxX, point.x);
|
|
1665
|
+
maxY = Math.max(maxY, point.y);
|
|
1666
|
+
}
|
|
1667
|
+
}
|
|
1668
|
+
return {
|
|
1669
|
+
x: minX,
|
|
1670
|
+
y: minY,
|
|
1671
|
+
width: maxX - minX,
|
|
1672
|
+
height: maxY - minY,
|
|
1673
|
+
};
|
|
1674
|
+
}
|
|
1675
|
+
/**
|
|
1676
|
+
* Get all dirty nodes (Phase 5.2)
|
|
1677
|
+
* Returns nodes that need re-rendering
|
|
1678
|
+
*/
|
|
1679
|
+
getDirtyNodes() {
|
|
1680
|
+
return this.getNodes().filter((node) => node.isDirty);
|
|
1681
|
+
}
|
|
1682
|
+
/**
|
|
1683
|
+
* Get all dirty links (Phase 5.2)
|
|
1684
|
+
* Returns links that need re-rendering
|
|
1685
|
+
*/
|
|
1686
|
+
getDirtyLinks() {
|
|
1687
|
+
return this.getLinks().filter((link) => link.isDirty);
|
|
1688
|
+
}
|
|
1689
|
+
/**
|
|
1690
|
+
* Get all dirty groups (Phase 5.2)
|
|
1691
|
+
* Returns groups that need re-rendering
|
|
1692
|
+
*/
|
|
1693
|
+
getDirtyGroups() {
|
|
1694
|
+
return this.getGroups().filter((group) => group.isDirty);
|
|
1695
|
+
}
|
|
1696
|
+
/**
|
|
1697
|
+
* Mark all entities as clean (Phase 5.2)
|
|
1698
|
+
* Call this after rendering to reset dirty flags
|
|
1699
|
+
*/
|
|
1700
|
+
markAllClean() {
|
|
1701
|
+
// Mark all nodes clean
|
|
1702
|
+
for (const node of this.nodes.values()) {
|
|
1703
|
+
node.markClean();
|
|
1704
|
+
}
|
|
1705
|
+
// Mark all links clean
|
|
1706
|
+
for (const link of this.links.values()) {
|
|
1707
|
+
link.markClean();
|
|
1708
|
+
}
|
|
1709
|
+
// Mark all groups clean
|
|
1710
|
+
for (const group of this.groups.values()) {
|
|
1711
|
+
group.markClean();
|
|
1712
|
+
}
|
|
1713
|
+
// Emit event
|
|
1714
|
+
this.emitOrQueue('dirty:cleared');
|
|
1715
|
+
}
|
|
1716
|
+
/**
|
|
1717
|
+
* Get total count of dirty entities (Phase 5.2)
|
|
1718
|
+
* Useful for monitoring render performance
|
|
1719
|
+
*/
|
|
1720
|
+
getDirtyCount() {
|
|
1721
|
+
let count = 0;
|
|
1722
|
+
for (const node of this.nodes.values()) {
|
|
1723
|
+
if (node.isDirty)
|
|
1724
|
+
count++;
|
|
1725
|
+
}
|
|
1726
|
+
for (const link of this.links.values()) {
|
|
1727
|
+
if (link.isDirty)
|
|
1728
|
+
count++;
|
|
1729
|
+
}
|
|
1730
|
+
for (const group of this.groups.values()) {
|
|
1731
|
+
if (group.isDirty)
|
|
1732
|
+
count++;
|
|
1733
|
+
}
|
|
1734
|
+
return count;
|
|
1735
|
+
}
|
|
1736
|
+
/**
|
|
1737
|
+
* Get visible dirty nodes (Phase 5.2)
|
|
1738
|
+
* Combines viewport virtualization with dirty marking
|
|
1739
|
+
* Only returns nodes that are both visible AND need re-rendering
|
|
1740
|
+
*
|
|
1741
|
+
* @param viewport - Rectangular viewport region
|
|
1742
|
+
* @returns Array of nodes that are visible and dirty
|
|
1743
|
+
*
|
|
1744
|
+
* @example
|
|
1745
|
+
* ```typescript
|
|
1746
|
+
* const viewport = { x: 0, y: 0, width: 800, height: 600 };
|
|
1747
|
+
* const dirtyVisible = diagram.getVisibleDirtyNodes(viewport);
|
|
1748
|
+
* // Only re-render these nodes - maximum efficiency!
|
|
1749
|
+
* ```
|
|
1750
|
+
*/
|
|
1751
|
+
getVisibleDirtyNodes(viewport) {
|
|
1752
|
+
return this.getVisibleNodes(viewport).filter((node) => node.isDirty);
|
|
1753
|
+
}
|
|
1754
|
+
/**
|
|
1755
|
+
* Get visible dirty links (Phase 5.2)
|
|
1756
|
+
* Combines viewport virtualization with dirty marking
|
|
1757
|
+
* Only returns links that are both visible AND need re-rendering
|
|
1758
|
+
*
|
|
1759
|
+
* @param viewport - Rectangular viewport region
|
|
1760
|
+
* @returns Array of links that are visible and dirty
|
|
1761
|
+
*/
|
|
1762
|
+
getVisibleDirtyLinks(viewport) {
|
|
1763
|
+
return this.getVisibleLinks(viewport).filter((link) => link.isDirty);
|
|
1764
|
+
}
|
|
1765
|
+
/**
|
|
1766
|
+
* Get LOD level based on zoom (Phase 5.3)
|
|
1767
|
+
*
|
|
1768
|
+
* wave2/rendering: driven by the declarative {@link LODConfig}. Picks the
|
|
1769
|
+
* tier whose `minZoom` the zoom crosses — tiers are pre-sorted highest-first,
|
|
1770
|
+
* so the first match wins. With the default config this is exactly:
|
|
1771
|
+
* zoom >= 1.0 -> 'high'
|
|
1772
|
+
* 0.5 <= zoom < 1.0 -> 'medium'
|
|
1773
|
+
* zoom < 0.5 -> 'low'
|
|
1774
|
+
*
|
|
1775
|
+
* (wave8/culling moved the medium/low breakpoint 0.2 → 0.5 — see
|
|
1776
|
+
* {@link createDefaultLODConfig} for why.)
|
|
1777
|
+
*
|
|
1778
|
+
* @param zoom - Current zoom level
|
|
1779
|
+
* @returns Tier name (default policy: 'high' | 'medium' | 'low')
|
|
1780
|
+
*/
|
|
1781
|
+
getLODLevel(zoom) {
|
|
1782
|
+
const tiers = this._lodTiersDesc;
|
|
1783
|
+
for (const tier of tiers) {
|
|
1784
|
+
if (zoom >= tier.minZoom) {
|
|
1785
|
+
return tier.name;
|
|
1786
|
+
}
|
|
1787
|
+
}
|
|
1788
|
+
// Below every tier's minZoom → fall back to the coarsest (last) tier.
|
|
1789
|
+
return tiers.length > 0 ? tiers[tiers.length - 1].name : 'low';
|
|
1790
|
+
}
|
|
1791
|
+
/**
|
|
1792
|
+
* wave2/rendering: single feature gate that reads the active LOD tier's
|
|
1793
|
+
* feature set. Renderers call this instead of hardcoding `lod === 'high'`
|
|
1794
|
+
* checks, so custom tiers work automatically.
|
|
1795
|
+
*
|
|
1796
|
+
* @param feature - Visual feature being considered
|
|
1797
|
+
* @param lod - Current tier name (from {@link getLODLevel})
|
|
1798
|
+
* @returns true if the tier renders that feature
|
|
1799
|
+
*/
|
|
1800
|
+
shouldRender(feature, lod) {
|
|
1801
|
+
const tier = this._lodConfig.tiers.find((t) => t.name === lod);
|
|
1802
|
+
return tier ? tier.features.has(feature) : false;
|
|
1803
|
+
}
|
|
1804
|
+
// =========================================================================
|
|
1805
|
+
// LOD configuration API (wave2/rendering)
|
|
1806
|
+
// =========================================================================
|
|
1807
|
+
/** Get the current Level-of-Detail policy. */
|
|
1808
|
+
getLODConfig() {
|
|
1809
|
+
return this._lodConfig;
|
|
1810
|
+
}
|
|
1811
|
+
/**
|
|
1812
|
+
* Replace the Level-of-Detail policy wholesale. Apps use this to define
|
|
1813
|
+
* their own tiers (names, breakpoints and feature sets).
|
|
1814
|
+
*/
|
|
1815
|
+
setLODConfig(config) {
|
|
1816
|
+
this._lodConfig = config;
|
|
1817
|
+
this._resortLODTiers();
|
|
1818
|
+
}
|
|
1819
|
+
/**
|
|
1820
|
+
* Register (or replace, by name) a single LOD tier. Lets apps extend the
|
|
1821
|
+
* default policy with an extra tier without rebuilding the whole config.
|
|
1822
|
+
*/
|
|
1823
|
+
registerLODTier(tier) {
|
|
1824
|
+
const idx = this._lodConfig.tiers.findIndex((t) => t.name === tier.name);
|
|
1825
|
+
if (idx >= 0) {
|
|
1826
|
+
this._lodConfig.tiers[idx] = tier;
|
|
1827
|
+
}
|
|
1828
|
+
else {
|
|
1829
|
+
this._lodConfig.tiers.push(tier);
|
|
1830
|
+
}
|
|
1831
|
+
this._resortLODTiers();
|
|
1832
|
+
}
|
|
1833
|
+
/** Keep the highest-minZoom-first tier cache in sync with _lodConfig. */
|
|
1834
|
+
_resortLODTiers() {
|
|
1835
|
+
this._lodTiersDesc = [...this._lodConfig.tiers].sort((a, b) => b.minZoom - a.minZoom);
|
|
1836
|
+
}
|
|
1837
|
+
/**
|
|
1838
|
+
* Get visible nodes with LOD information (Phase 5.3)
|
|
1839
|
+
* Combines viewport virtualization with Level of Detail
|
|
1840
|
+
*
|
|
1841
|
+
* @param viewport - Rectangular viewport region
|
|
1842
|
+
* @param zoom - Current zoom level
|
|
1843
|
+
* @returns Array of nodes with LOD level
|
|
1844
|
+
*/
|
|
1845
|
+
getNodesWithLOD(viewport, zoom) {
|
|
1846
|
+
const lod = this.getLODLevel(zoom);
|
|
1847
|
+
const visibleNodes = this.getVisibleNodes(viewport);
|
|
1848
|
+
return visibleNodes.map((node) => ({
|
|
1849
|
+
entity: node,
|
|
1850
|
+
lod,
|
|
1851
|
+
}));
|
|
1852
|
+
}
|
|
1853
|
+
/**
|
|
1854
|
+
* Get visible links with LOD information (Phase 5.3)
|
|
1855
|
+
* Combines viewport virtualization with Level of Detail
|
|
1856
|
+
*
|
|
1857
|
+
* @param viewport - Rectangular viewport region
|
|
1858
|
+
* @param zoom - Current zoom level
|
|
1859
|
+
* @returns Array of links with LOD level
|
|
1860
|
+
*/
|
|
1861
|
+
getLinksWithLOD(viewport, zoom) {
|
|
1862
|
+
const lod = this.getLODLevel(zoom);
|
|
1863
|
+
const visibleLinks = this.getVisibleLinks(viewport);
|
|
1864
|
+
return visibleLinks.map((link) => ({
|
|
1865
|
+
entity: link,
|
|
1866
|
+
lod,
|
|
1867
|
+
}));
|
|
1868
|
+
}
|
|
1869
|
+
/**
|
|
1870
|
+
* Check if labels should be rendered at this LOD level (Phase 5.3)
|
|
1871
|
+
* wave2/rendering: now reads the LOD tier's feature set.
|
|
1872
|
+
*/
|
|
1873
|
+
shouldRenderLabels(lod) {
|
|
1874
|
+
return this.shouldRender('labels', lod);
|
|
1875
|
+
}
|
|
1876
|
+
/**
|
|
1877
|
+
* Check if icons should be rendered at this LOD level (Phase 5.3)
|
|
1878
|
+
* wave2/rendering: now reads the LOD tier's feature set.
|
|
1879
|
+
*/
|
|
1880
|
+
shouldRenderIcons(lod) {
|
|
1881
|
+
return this.shouldRender('icons', lod);
|
|
1882
|
+
}
|
|
1883
|
+
/**
|
|
1884
|
+
* Check if borders should be rendered at this LOD level (Phase 5.3)
|
|
1885
|
+
* wave2/rendering: now reads the LOD tier's feature set.
|
|
1886
|
+
*/
|
|
1887
|
+
shouldRenderBorders(lod) {
|
|
1888
|
+
return this.shouldRender('borders', lod);
|
|
1889
|
+
}
|
|
1890
|
+
/**
|
|
1891
|
+
* Check if shadows should be rendered at this LOD level (Phase 5.3)
|
|
1892
|
+
* wave2/rendering: now reads the LOD tier's feature set.
|
|
1893
|
+
*/
|
|
1894
|
+
shouldRenderShadows(lod) {
|
|
1895
|
+
return this.shouldRender('shadows', lod);
|
|
1896
|
+
}
|
|
1897
|
+
// =============================================================================
|
|
1898
|
+
// Layout Management API
|
|
1899
|
+
// =============================================================================
|
|
1900
|
+
/**
|
|
1901
|
+
* Get the layout manager for this diagram
|
|
1902
|
+
*/
|
|
1903
|
+
getLayoutManager() {
|
|
1904
|
+
return this._layoutManager;
|
|
1905
|
+
}
|
|
1906
|
+
/**
|
|
1907
|
+
* Set layout algorithm
|
|
1908
|
+
* @param type - Algorithm type ('grid', 'force-directed', 'hierarchical', 'hybrid')
|
|
1909
|
+
* @param config - Optional configuration
|
|
1910
|
+
*/
|
|
1911
|
+
setLayoutAlgorithm(type, config) {
|
|
1912
|
+
this._layoutManager.setAlgorithm(type, config);
|
|
1913
|
+
}
|
|
1914
|
+
/**
|
|
1915
|
+
* Get current layout algorithm type
|
|
1916
|
+
*/
|
|
1917
|
+
getLayoutAlgorithm() {
|
|
1918
|
+
return this._layoutManager.getCurrentAlgorithmType();
|
|
1919
|
+
}
|
|
1920
|
+
/**
|
|
1921
|
+
* Configure current layout algorithm
|
|
1922
|
+
*/
|
|
1923
|
+
configureLayout(config) {
|
|
1924
|
+
this._layoutManager.configure(config);
|
|
1925
|
+
}
|
|
1926
|
+
/**
|
|
1927
|
+
* Get layout configuration
|
|
1928
|
+
*/
|
|
1929
|
+
getLayoutConfiguration() {
|
|
1930
|
+
return this._layoutManager.getConfiguration();
|
|
1931
|
+
}
|
|
1932
|
+
/**
|
|
1933
|
+
* Enable or disable automatic layout for new nodes
|
|
1934
|
+
* When enabled, newly added nodes will be automatically positioned using the current layout algorithm
|
|
1935
|
+
*/
|
|
1936
|
+
setAutoLayout(enabled) {
|
|
1937
|
+
this._autoLayoutEnabled = enabled;
|
|
1938
|
+
}
|
|
1939
|
+
/**
|
|
1940
|
+
* Check if auto-layout is enabled
|
|
1941
|
+
*/
|
|
1942
|
+
isAutoLayoutEnabled() {
|
|
1943
|
+
return this._autoLayoutEnabled;
|
|
1944
|
+
}
|
|
1945
|
+
/**
|
|
1946
|
+
* Re-layout all nodes using current algorithm
|
|
1947
|
+
* This will recalculate positions for all nodes in the diagram
|
|
1948
|
+
*/
|
|
1949
|
+
reLayout(config) {
|
|
1950
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
1951
|
+
return this._layoutManager.reLayout(config);
|
|
1952
|
+
});
|
|
1953
|
+
}
|
|
1954
|
+
/**
|
|
1955
|
+
* Override: End batch update mode
|
|
1956
|
+
* Fires accumulated events when all batches complete
|
|
1957
|
+
*/
|
|
1958
|
+
endBatch() {
|
|
1959
|
+
// Call parent to handle dirty state
|
|
1960
|
+
super.endBatch();
|
|
1961
|
+
// When all batches complete (check parent's isBatching), fire queued events
|
|
1962
|
+
if (!this.isBatching() && this._pendingEvents.length > 0) {
|
|
1963
|
+
// Fire all queued events individually
|
|
1964
|
+
const events = [...this._pendingEvents];
|
|
1965
|
+
this._pendingEvents = [];
|
|
1966
|
+
for (const event of events) {
|
|
1967
|
+
this.emitter.emit(event.type, event.data);
|
|
1968
|
+
}
|
|
1969
|
+
// Also fire a batch:complete event for listeners that want to know
|
|
1970
|
+
this.emitter.emit('batch:complete', {
|
|
1971
|
+
eventCount: events.length,
|
|
1972
|
+
events: events
|
|
1973
|
+
});
|
|
1974
|
+
}
|
|
1975
|
+
}
|
|
1976
|
+
/**
|
|
1977
|
+
* Emit event, respecting batch mode
|
|
1978
|
+
* During batch mode, events are queued instead of fired immediately
|
|
1979
|
+
*/
|
|
1980
|
+
emitOrQueue(eventType, data) {
|
|
1981
|
+
const batching = this.isBatching();
|
|
1982
|
+
if (batching) {
|
|
1983
|
+
// Queue event for later
|
|
1984
|
+
this._pendingEvents.push({ type: eventType, data });
|
|
1985
|
+
}
|
|
1986
|
+
else {
|
|
1987
|
+
// Emit immediately
|
|
1988
|
+
this.emitter.emit(eventType, data);
|
|
1989
|
+
}
|
|
1990
|
+
}
|
|
1991
|
+
/**
|
|
1992
|
+
* Serialize to JSON
|
|
1993
|
+
*/
|
|
1994
|
+
serialize() {
|
|
1995
|
+
const doc = {
|
|
1996
|
+
schemaVersion: DiagramMigrations_1.DIAGRAM_SCHEMA_VERSION,
|
|
1997
|
+
id: this.id,
|
|
1998
|
+
uuid: this.uuid,
|
|
1999
|
+
type: 'diagram',
|
|
2000
|
+
version: this.version,
|
|
2001
|
+
metadata: Object.fromEntries(this.metadata),
|
|
2002
|
+
name: this.name,
|
|
2003
|
+
nodes: Array.from(this.nodes.values()).map((n) => n.serialize()),
|
|
2004
|
+
links: Array.from(this.links.values()).map((l) => l.serialize()),
|
|
2005
|
+
groups: Array.from(this.groups.values()).map((g) => g.serialize()), // Phase 1.6c
|
|
2006
|
+
viewport: Object.assign({}, this.viewport),
|
|
2007
|
+
};
|
|
2008
|
+
// wave10/whiteboard: present only when there is ink — see SerializedDiagram.strokes.
|
|
2009
|
+
if (this.strokes.size > 0) {
|
|
2010
|
+
doc.strokes = Array.from(this.strokes.values()).map((s) => s.serialize());
|
|
2011
|
+
}
|
|
2012
|
+
// wave9/comments: present only when there are comments — see SerializedDiagram.
|
|
2013
|
+
if (Object.keys(this._comments).length > 0) {
|
|
2014
|
+
doc.comments = (0, deep_clone_1.deepClone)(this._comments);
|
|
2015
|
+
}
|
|
2016
|
+
return doc;
|
|
2017
|
+
}
|
|
2018
|
+
/**
|
|
2019
|
+
* Rebuild the derived port-connection registries from the diagram's links.
|
|
2020
|
+
*
|
|
2021
|
+
* `PortModel.currentConnections` is DERIVED state (which links touch this
|
|
2022
|
+
* port). It is never serialized; instead it is reconstructed
|
|
2023
|
+
* deterministically here so `canConnect()` / `maxConnections` enforcement
|
|
2024
|
+
* survive save/load. Runs inside fromJSON, and is safe to re-run at any
|
|
2025
|
+
* time — existing registries are reset first, so the result is always
|
|
2026
|
+
* exactly the current links.
|
|
2027
|
+
*
|
|
2028
|
+
* A self-loop (source === target port) registers once — the Set dedupes —
|
|
2029
|
+
* so it counts as ONE connection on that port.
|
|
2030
|
+
*
|
|
2031
|
+
* @returns endpoints that resolve to no known port (corrupt/dangling links),
|
|
2032
|
+
* for callers that want to surface them.
|
|
2033
|
+
*/
|
|
2034
|
+
reconcilePortConnections() {
|
|
2035
|
+
// Reset: the registry must be exactly what the links imply, not a merge
|
|
2036
|
+
// of stale + current.
|
|
2037
|
+
for (const { port } of this.portIndex.values()) {
|
|
2038
|
+
port.currentConnections.clear();
|
|
2039
|
+
// Wave 6: the DIRECTIONAL registry is derived state too — rebuilt here, or
|
|
2040
|
+
// `fromMaxLinks`/`toMaxLinks` would count stale roles after a reload.
|
|
2041
|
+
port.linkRoles.clear();
|
|
2042
|
+
}
|
|
2043
|
+
const dangling = [];
|
|
2044
|
+
for (const link of this.links.values()) {
|
|
2045
|
+
for (const [end, portId] of [
|
|
2046
|
+
['source', link.sourcePortId],
|
|
2047
|
+
['target', link.targetPortId],
|
|
2048
|
+
]) {
|
|
2049
|
+
const entry = this.portIndex.get(portId);
|
|
2050
|
+
if (entry) {
|
|
2051
|
+
entry.port.restoreConnection(link.id, end);
|
|
2052
|
+
}
|
|
2053
|
+
else {
|
|
2054
|
+
dangling.push({ linkId: link.id, portId, end });
|
|
2055
|
+
}
|
|
2056
|
+
}
|
|
2057
|
+
}
|
|
2058
|
+
return dangling;
|
|
2059
|
+
}
|
|
2060
|
+
/**
|
|
2061
|
+
* Apply an incremental patch (see serialization/Incremental.ts) — the
|
|
2062
|
+
* receive side of toIncremental/apply. Added entities are installed through
|
|
2063
|
+
* the SAME unified restore path as document load (fully wired); modified
|
|
2064
|
+
* entities are updated IN PLACE so object identity is preserved for
|
|
2065
|
+
* renderers holding references; normal change events fire (an applied
|
|
2066
|
+
* patch IS a mutation, unlike a document load).
|
|
2067
|
+
*/
|
|
2068
|
+
applyIncremental(patch) {
|
|
2069
|
+
var _a, _b, _c;
|
|
2070
|
+
this.assertNotDisposed();
|
|
2071
|
+
if (patch.format !== Incremental_1.INCREMENTAL_FORMAT) {
|
|
2072
|
+
throw new Error(`Not an incremental patch (format '${patch === null || patch === void 0 ? void 0 : patch.format}')`);
|
|
2073
|
+
}
|
|
2074
|
+
if (patch.schemaVersion > DiagramMigrations_1.DIAGRAM_SCHEMA_VERSION) {
|
|
2075
|
+
throw new Error(`Incremental patch has schemaVersion ${patch.schemaVersion}, newer than this ` +
|
|
2076
|
+
`runtime (${DiagramMigrations_1.DIAGRAM_SCHEMA_VERSION}) — refusing to apply.`);
|
|
2077
|
+
}
|
|
2078
|
+
this.beginBatch();
|
|
2079
|
+
try {
|
|
2080
|
+
// Removals first — links before the nodes they reference.
|
|
2081
|
+
for (const id of patch.removed.links)
|
|
2082
|
+
this.removeLink(id);
|
|
2083
|
+
for (const id of patch.removed.nodes)
|
|
2084
|
+
this.removeNode(id);
|
|
2085
|
+
for (const id of patch.removed.groups)
|
|
2086
|
+
this.removeGroup(id);
|
|
2087
|
+
// wave10/whiteboard. Ink references nothing and nothing references it, so its
|
|
2088
|
+
// position in this ordering is free — which is one of the quieter dividends of
|
|
2089
|
+
// strokes not being nodes.
|
|
2090
|
+
for (const id of (_a = patch.removed.strokes) !== null && _a !== void 0 ? _a : [])
|
|
2091
|
+
this.removeStroke(id);
|
|
2092
|
+
// Additions through the unified restore path (fully wired entities).
|
|
2093
|
+
for (const nodeData of patch.added.nodes)
|
|
2094
|
+
this.restoreNode(nodeData);
|
|
2095
|
+
for (const linkData of patch.added.links)
|
|
2096
|
+
this.restoreLink(linkData);
|
|
2097
|
+
for (const groupData of patch.added.groups)
|
|
2098
|
+
this.restoreGroup(groupData);
|
|
2099
|
+
for (const strokeData of (_b = patch.added.strokes) !== null && _b !== void 0 ? _b : [])
|
|
2100
|
+
this.restoreStroke(strokeData);
|
|
2101
|
+
// In-place modifications (a modified-but-locally-missing entity is
|
|
2102
|
+
// treated as an add — patches may arrive against divergent replicas).
|
|
2103
|
+
for (const nodeData of patch.modified.nodes)
|
|
2104
|
+
this.applySerializedNode(nodeData);
|
|
2105
|
+
for (const linkData of patch.modified.links)
|
|
2106
|
+
this.applySerializedLink(linkData);
|
|
2107
|
+
for (const groupData of patch.modified.groups)
|
|
2108
|
+
this.applySerializedGroup(groupData);
|
|
2109
|
+
// A stroke is immutable geometry: "modify" is remove-and-replace, which is also
|
|
2110
|
+
// exactly what a REPLACE-semantics patch means. No in-place applySerializedStroke
|
|
2111
|
+
// exists because nothing holds a reference to a stroke across a patch.
|
|
2112
|
+
for (const strokeData of (_c = patch.modified.strokes) !== null && _c !== void 0 ? _c : []) {
|
|
2113
|
+
this.removeStroke(strokeData.id);
|
|
2114
|
+
this.restoreStroke(strokeData);
|
|
2115
|
+
}
|
|
2116
|
+
if (patch.diagram) {
|
|
2117
|
+
if (patch.diagram.name !== undefined)
|
|
2118
|
+
this.name = patch.diagram.name;
|
|
2119
|
+
if (patch.diagram.viewport)
|
|
2120
|
+
this.viewport = Object.assign({}, patch.diagram.viewport);
|
|
2121
|
+
if (patch.diagram.metadata) {
|
|
2122
|
+
this.metadata = new Map(Object.entries(patch.diagram.metadata));
|
|
2123
|
+
}
|
|
2124
|
+
}
|
|
2125
|
+
// Derived state follows the links.
|
|
2126
|
+
this.reconcilePortConnections();
|
|
2127
|
+
}
|
|
2128
|
+
finally {
|
|
2129
|
+
this.endBatch(); // queued events flush here — normal mutation semantics
|
|
2130
|
+
}
|
|
2131
|
+
// Converge the mutation counter to the SOURCE's — the replica must
|
|
2132
|
+
// serialize identically to the diagram the patch came from, and apply's
|
|
2133
|
+
// own internal trackChange bumps are implementation noise, not edits.
|
|
2134
|
+
if (typeof patch.targetVersion === 'number') {
|
|
2135
|
+
this.version = patch.targetVersion;
|
|
2136
|
+
}
|
|
2137
|
+
this.emitter.emit('diagram:incremental-applied', {
|
|
2138
|
+
added: patch.added.nodes.length + patch.added.links.length + patch.added.groups.length,
|
|
2139
|
+
removed: patch.removed.nodes.length + patch.removed.links.length + patch.removed.groups.length,
|
|
2140
|
+
modified: patch.modified.nodes.length + patch.modified.links.length + patch.modified.groups.length,
|
|
2141
|
+
});
|
|
2142
|
+
}
|
|
2143
|
+
/** In-place node update from serialized data (identity preserved). */
|
|
2144
|
+
applySerializedNode(data) {
|
|
2145
|
+
var _a;
|
|
2146
|
+
const node = this.nodes.get(data.id);
|
|
2147
|
+
if (!node) {
|
|
2148
|
+
this.restoreNode(data);
|
|
2149
|
+
return;
|
|
2150
|
+
}
|
|
2151
|
+
node.position = Object.assign({}, data.position);
|
|
2152
|
+
node.size = Object.assign({}, data.size);
|
|
2153
|
+
node.rotation = data.rotation;
|
|
2154
|
+
node.scale = data.scale;
|
|
2155
|
+
node.parentId = data.parentId;
|
|
2156
|
+
node.children = new Set(data.children);
|
|
2157
|
+
node.state = data.state;
|
|
2158
|
+
node.behavior = data.behavior;
|
|
2159
|
+
node.style = data.style;
|
|
2160
|
+
node.data = data.data;
|
|
2161
|
+
node.positionMode = data.positionMode || 'absolute';
|
|
2162
|
+
node.transformOrigin = data.transformOrigin || { x: 0.5, y: 0.5 };
|
|
2163
|
+
node.metadata = new Map(Object.entries((_a = data.metadata) !== null && _a !== void 0 ? _a : {}));
|
|
2164
|
+
// Replace ports, keeping the O(1) index exact WITHOUT re-running
|
|
2165
|
+
// indexNodePorts (which would stack another pair of port listeners).
|
|
2166
|
+
if (Array.isArray(data.ports)) {
|
|
2167
|
+
for (const port of node.getPorts()) {
|
|
2168
|
+
const entry = this.portIndex.get(port.id);
|
|
2169
|
+
if ((entry === null || entry === void 0 ? void 0 : entry.node) === node)
|
|
2170
|
+
this.portIndex.delete(port.id);
|
|
2171
|
+
}
|
|
2172
|
+
node.ports.clear();
|
|
2173
|
+
for (const portData of data.ports) {
|
|
2174
|
+
const port = PortModel_1.PortModel.fromJSON(portData);
|
|
2175
|
+
node.ports.set(port.id, port);
|
|
2176
|
+
this.portIndex.set(port.id, { node, port });
|
|
2177
|
+
}
|
|
2178
|
+
}
|
|
2179
|
+
if (typeof data.version === 'number')
|
|
2180
|
+
node.version = data.version;
|
|
2181
|
+
this.nodeSpatialIndex.update(node);
|
|
2182
|
+
node.markDirty('incremental');
|
|
2183
|
+
this.emitOrQueue('node:changed', node);
|
|
2184
|
+
this.emitOrQueue('node:moved', { nodeId: node.id, position: node.position });
|
|
2185
|
+
}
|
|
2186
|
+
/** In-place link update from serialized data (identity preserved). */
|
|
2187
|
+
applySerializedLink(data) {
|
|
2188
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
2189
|
+
const link = this.links.get(data.id);
|
|
2190
|
+
if (!link) {
|
|
2191
|
+
this.restoreLink(data);
|
|
2192
|
+
return;
|
|
2193
|
+
}
|
|
2194
|
+
link.sourcePortId = data.sourcePortId;
|
|
2195
|
+
link.targetPortId = data.targetPortId;
|
|
2196
|
+
link.sourceNodeId = (_a = data.sourceNodeId) !== null && _a !== void 0 ? _a : (_b = this.getNodeByPortId(data.sourcePortId)) === null || _b === void 0 ? void 0 : _b.id;
|
|
2197
|
+
link.targetNodeId = (_c = data.targetNodeId) !== null && _c !== void 0 ? _c : (_d = this.getNodeByPortId(data.targetPortId)) === null || _d === void 0 ? void 0 : _d.id;
|
|
2198
|
+
link.pathType = data.pathType;
|
|
2199
|
+
link.points = ((_e = data.points) !== null && _e !== void 0 ? _e : []).map((point) => (Object.assign({}, point)));
|
|
2200
|
+
link.segments = ((_f = data.segments) !== null && _f !== void 0 ? _f : []).map((segment) => (Object.assign({}, segment)));
|
|
2201
|
+
link.labels = ((_g = data.labels) !== null && _g !== void 0 ? _g : []).map((label) => (Object.assign({}, label)));
|
|
2202
|
+
link.state = data.state;
|
|
2203
|
+
link.style = data.style;
|
|
2204
|
+
link.data = data.data;
|
|
2205
|
+
link.metadata = new Map(Object.entries((_h = data.metadata) !== null && _h !== void 0 ? _h : {}));
|
|
2206
|
+
if (typeof data.version === 'number')
|
|
2207
|
+
link.version = data.version;
|
|
2208
|
+
this.linkSpatialIndex.update(link);
|
|
2209
|
+
link.markDirty('incremental');
|
|
2210
|
+
this.emitOrQueue('link:changed', link);
|
|
2211
|
+
}
|
|
2212
|
+
/** In-place group update from serialized data (identity preserved). */
|
|
2213
|
+
applySerializedGroup(data) {
|
|
2214
|
+
var _a, _b, _c, _d, _e;
|
|
2215
|
+
const group = this.groups.get(data.id);
|
|
2216
|
+
if (!group) {
|
|
2217
|
+
this.restoreGroup(data);
|
|
2218
|
+
return;
|
|
2219
|
+
}
|
|
2220
|
+
group.name = data.name;
|
|
2221
|
+
group.members = new Set((_a = data.members) !== null && _a !== void 0 ? _a : []);
|
|
2222
|
+
group.isCollapsed = data.isCollapsed;
|
|
2223
|
+
group.bounds = data.bounds;
|
|
2224
|
+
if (data.layoutType)
|
|
2225
|
+
group.layoutType = data.layoutType;
|
|
2226
|
+
if (data.layoutConfig)
|
|
2227
|
+
group.layoutConfig = data.layoutConfig;
|
|
2228
|
+
if (data.position)
|
|
2229
|
+
group.position = { x: data.position.x, y: data.position.y };
|
|
2230
|
+
if (data.size)
|
|
2231
|
+
group.size = Object.assign({}, data.size);
|
|
2232
|
+
group.parentGroupId = data.parentGroupId;
|
|
2233
|
+
// Wave-5 Card 3: keep the incremental in-place path lossless for the new
|
|
2234
|
+
// subflow geometry (absent keys reset to their defaults, matching fromJSON).
|
|
2235
|
+
// Absent keys pin to 0 (legacy engines wrote 0 as absence) — see fromJSON;
|
|
2236
|
+
// leaving padding undefined would resolve to the authored default instead.
|
|
2237
|
+
group.padding = (_b = data.padding) !== null && _b !== void 0 ? _b : 0;
|
|
2238
|
+
group.headerHeight = typeof data.headerHeight === 'number' ? data.headerHeight : 0;
|
|
2239
|
+
group.zIndex = typeof data.zIndex === 'number' ? data.zIndex : 0;
|
|
2240
|
+
group.fitMode = (_c = data.fitMode) !== null && _c !== void 0 ? _c : 'exact';
|
|
2241
|
+
group.constrainChildren = (_d = data.constrainChildren) !== null && _d !== void 0 ? _d : false;
|
|
2242
|
+
// Wave-5 Card 4: collapsed-state payload (proxy wiring + saved layout).
|
|
2243
|
+
group.collapsedState = data.collapsedState;
|
|
2244
|
+
// Wave-5 Card 5: per-group compound-layout intent.
|
|
2245
|
+
group.subgraphLayout = data.subgraphLayout;
|
|
2246
|
+
// Wave-5 Card 6: swimlane/pool band config.
|
|
2247
|
+
group.laneConfig = data.laneConfig;
|
|
2248
|
+
// Wave-5 Card 7: declarative membership rule + capacity/WIP limit.
|
|
2249
|
+
group.membershipRule = data.membershipRule;
|
|
2250
|
+
group.capacity = data.capacity;
|
|
2251
|
+
// Replace metadata CONTENT but keep the runtime diagram back-ref wired.
|
|
2252
|
+
group.metadata = new Map(Object.entries((_e = data.metadata) !== null && _e !== void 0 ? _e : {}));
|
|
2253
|
+
group.metadata.set('diagram', this);
|
|
2254
|
+
if (typeof data.version === 'number')
|
|
2255
|
+
group.version = data.version;
|
|
2256
|
+
group.markDirty('incremental');
|
|
2257
|
+
this.emitOrQueue('group:changed', group);
|
|
2258
|
+
}
|
|
2259
|
+
/**
|
|
2260
|
+
* Deserialize from JSON — THE document load path.
|
|
2261
|
+
*
|
|
2262
|
+
* Contract: a loaded diagram behaves identically to an authored one.
|
|
2263
|
+
* Every entity is installed through the same install* wiring as
|
|
2264
|
+
* interactive creation (diagram back-refs, spatial indices, port index,
|
|
2265
|
+
* change-forwarding listeners), port registries are reconciled, and the
|
|
2266
|
+
* document is migrated to the current schema first. The load itself is
|
|
2267
|
+
* NOT a user mutation: per-entity events queued during the restore are
|
|
2268
|
+
* dropped, the change log ends empty, and `version` reports the SAVED
|
|
2269
|
+
* counter — then a single 'diagram:loaded' event fires.
|
|
2270
|
+
*/
|
|
2271
|
+
static fromJSON(data, options) {
|
|
2272
|
+
var _a, _b, _c;
|
|
2273
|
+
// 1) Upgrade older documents (throws on newer-than-runtime or a gap).
|
|
2274
|
+
const doc = (0, DiagramMigrations_1.runDiagramMigrations)(data);
|
|
2275
|
+
// 2) Optional structural validation with caller-chosen policy.
|
|
2276
|
+
let report;
|
|
2277
|
+
const policy = (_a = options === null || options === void 0 ? void 0 : options.validate) !== null && _a !== void 0 ? _a : 'off';
|
|
2278
|
+
if (policy !== 'off') {
|
|
2279
|
+
report = (0, DiagramValidator_1.validateSerializedDiagram)(doc);
|
|
2280
|
+
if (policy === 'strict' && !report.ok) {
|
|
2281
|
+
throw new DiagramValidator_1.DiagramValidationError(report);
|
|
2282
|
+
}
|
|
2283
|
+
if (policy === 'warn' && (report.errors.length || report.warnings.length)) {
|
|
2284
|
+
console.warn(`Diagram '${doc.name}' loaded with ${report.errors.length} integrity error(s) ` +
|
|
2285
|
+
`and ${report.warnings.length} warning(s)`, report);
|
|
2286
|
+
}
|
|
2287
|
+
}
|
|
2288
|
+
// 3) Reproduce the saved identity — a load must not mint a new diagram.
|
|
2289
|
+
const diagram = new DiagramModel(doc.name, { id: doc.id, uuid: doc.uuid });
|
|
2290
|
+
// Restore viewport with backward compatibility
|
|
2291
|
+
diagram.viewport = {
|
|
2292
|
+
x: doc.viewport.x,
|
|
2293
|
+
y: doc.viewport.y,
|
|
2294
|
+
width: doc.viewport.width || 1200, // Default for old diagrams
|
|
2295
|
+
height: doc.viewport.height || 800, // Default for old diagrams
|
|
2296
|
+
zoom: doc.viewport.zoom
|
|
2297
|
+
};
|
|
2298
|
+
// wave9/comments: threads outlive everything they point at, including the entities
|
|
2299
|
+
// in this very document — so they are restored WITHOUT reference to whether their
|
|
2300
|
+
// anchor still resolves. A thread whose node was deleted before the save comes back
|
|
2301
|
+
// orphaned, which is exactly what it was. Assigned to the private field rather than
|
|
2302
|
+
// through the accessor: a LOAD is not a CHANGE, and firing trackChange here would
|
|
2303
|
+
// make OpCapture (if one is attached to this fresh model) broadcast the entire
|
|
2304
|
+
// comment tree as a local edit.
|
|
2305
|
+
if (doc.comments) {
|
|
2306
|
+
diagram._comments = (0, deep_clone_1.deepClone)(doc.comments);
|
|
2307
|
+
}
|
|
2308
|
+
// 4) Install every entity through the SAME wiring as interactive
|
|
2309
|
+
// creation, inside a batch window so the restore doesn't fire an
|
|
2310
|
+
// O(entities) event storm. Nodes go first so link node-id backfill
|
|
2311
|
+
// and port resolution work; groups after links (members reference
|
|
2312
|
+
// both).
|
|
2313
|
+
diagram.beginBatch();
|
|
2314
|
+
try {
|
|
2315
|
+
for (const nodeData of doc.nodes) {
|
|
2316
|
+
diagram.restoreNode(nodeData);
|
|
2317
|
+
}
|
|
2318
|
+
for (const linkData of doc.links) {
|
|
2319
|
+
diagram.restoreLink(linkData);
|
|
2320
|
+
}
|
|
2321
|
+
if (doc.groups) {
|
|
2322
|
+
for (const groupData of doc.groups) {
|
|
2323
|
+
diagram.restoreGroup(groupData);
|
|
2324
|
+
}
|
|
2325
|
+
}
|
|
2326
|
+
// wave10/whiteboard. Guarded exactly like `groups` above: an absent `strokes` key
|
|
2327
|
+
// means a document written before this wave (or one with no ink), and it means
|
|
2328
|
+
// zero strokes — NOT a broken document. That guard is the whole reason this
|
|
2329
|
+
// capability needed no schema bump and no migration: bumping
|
|
2330
|
+
// DIAGRAM_SCHEMA_VERSION would have made every newly-saved document unloadable
|
|
2331
|
+
// by any older runtime (runDiagramMigrations throws on newer-than-runtime), which
|
|
2332
|
+
// is a brutal price for a key that can simply be optional.
|
|
2333
|
+
if (doc.strokes) {
|
|
2334
|
+
for (const strokeData of doc.strokes) {
|
|
2335
|
+
diagram.restoreStroke(strokeData);
|
|
2336
|
+
}
|
|
2337
|
+
}
|
|
2338
|
+
// Restore metadata
|
|
2339
|
+
for (const [key, value] of Object.entries(doc.metadata)) {
|
|
2340
|
+
diagram.metadata.set(key, value);
|
|
2341
|
+
}
|
|
2342
|
+
// 5) Rebuild derived state (port connection registries).
|
|
2343
|
+
diagram.reconcilePortConnections();
|
|
2344
|
+
}
|
|
2345
|
+
finally {
|
|
2346
|
+
// A load is not N user mutations: drop the queued per-entity events
|
|
2347
|
+
// (node:added × N, …) instead of firing them, then close the batch.
|
|
2348
|
+
diagram._pendingEvents = [];
|
|
2349
|
+
diagram.endBatch();
|
|
2350
|
+
}
|
|
2351
|
+
// 6) Version parity + clean change state: the loaded model reports the
|
|
2352
|
+
// SAVED mutation counter and an empty change log, exactly like the
|
|
2353
|
+
// diagram that was serialized. (Render-dirty state is untouched — a
|
|
2354
|
+
// fresh load must still paint.)
|
|
2355
|
+
diagram.changeLog.length = 0;
|
|
2356
|
+
diagram.version = (_b = doc.version) !== null && _b !== void 0 ? _b : 1;
|
|
2357
|
+
// 7) One document-level event replaces the storm.
|
|
2358
|
+
diagram.emitter.emit('diagram:loaded', {
|
|
2359
|
+
nodeCount: diagram.nodes.size,
|
|
2360
|
+
linkCount: diagram.links.size,
|
|
2361
|
+
groupCount: diagram.groups.size,
|
|
2362
|
+
schemaVersion: (_c = doc.schemaVersion) !== null && _c !== void 0 ? _c : DiagramMigrations_1.DIAGRAM_SCHEMA_VERSION,
|
|
2363
|
+
validation: report,
|
|
2364
|
+
});
|
|
2365
|
+
return diagram;
|
|
2366
|
+
}
|
|
2367
|
+
/**
|
|
2368
|
+
* Dispose diagram and all child entities (Phase 5.4)
|
|
2369
|
+
* Prevents memory leaks by:
|
|
2370
|
+
* - Disposing all nodes, links, and groups
|
|
2371
|
+
* - Breaking circular references
|
|
2372
|
+
* - Clearing spatial indices
|
|
2373
|
+
* - Calling parent dispose()
|
|
2374
|
+
*/
|
|
2375
|
+
dispose() {
|
|
2376
|
+
this.assertNotDisposed();
|
|
2377
|
+
// Dispose all child entities first (children before parent)
|
|
2378
|
+
// This ensures proper cleanup order and prevents orphaned listeners
|
|
2379
|
+
// Dispose all nodes
|
|
2380
|
+
for (const node of this.nodes.values()) {
|
|
2381
|
+
// Break circular reference before disposal
|
|
2382
|
+
node.diagram = undefined;
|
|
2383
|
+
node.dispose();
|
|
2384
|
+
}
|
|
2385
|
+
// Dispose all links
|
|
2386
|
+
for (const link of this.links.values()) {
|
|
2387
|
+
link.dispose();
|
|
2388
|
+
}
|
|
2389
|
+
// Dispose all groups
|
|
2390
|
+
for (const group of this.groups.values()) {
|
|
2391
|
+
group.dispose();
|
|
2392
|
+
}
|
|
2393
|
+
// wave10/whiteboard: strokes are DiagramEntities and hold an EventEmitter each —
|
|
2394
|
+
// OpCapture subscribes to every one of them. Not disposing them leaks that listener
|
|
2395
|
+
// for the life of the process.
|
|
2396
|
+
for (const stroke of this.strokes.values()) {
|
|
2397
|
+
stroke.dispose();
|
|
2398
|
+
}
|
|
2399
|
+
// Clear collections
|
|
2400
|
+
this.nodes.clear();
|
|
2401
|
+
this.links.clear();
|
|
2402
|
+
this.groups.clear();
|
|
2403
|
+
this.strokes.clear();
|
|
2404
|
+
this.portIndex.clear();
|
|
2405
|
+
this.detachedAnchors.clear(); // wave14/model — nothing left to freeze against
|
|
2406
|
+
// Clear spatial indices (prevents memory leaks from indexed entities)
|
|
2407
|
+
this.nodeSpatialIndex.clear();
|
|
2408
|
+
this.linkSpatialIndex.clear();
|
|
2409
|
+
// Dispose layout manager
|
|
2410
|
+
this._layoutManager.dispose();
|
|
2411
|
+
// Call parent dispose (removes listeners, clears metadata, etc.)
|
|
2412
|
+
super.dispose();
|
|
2413
|
+
}
|
|
2414
|
+
}
|
|
2415
|
+
exports.DiagramModel = DiagramModel;
|
|
2416
|
+
//# sourceMappingURL=DiagramModel.js.map
|