@grafloria/element 0.3.18 → 0.3.20
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/esm/src/index.js +295 -0
- package/esm/src/lib/dashboard-kit/dashboard.js +590 -0
- package/esm/src/lib/dashboard-kit/grid-binder.js +1633 -0
- package/esm/src/lib/dashboard-kit/grid-mapping.js +164 -0
- package/esm/src/lib/dashboard-kit/index.js +8 -0
- package/esm/src/lib/dashboard-kit/styles.js +205 -0
- package/esm/src/lib/dashboard-kit/widgets.js +379 -0
- package/esm/src/lib/diagram-kit/card.js +199 -0
- package/esm/src/lib/diagram-kit/editing.js +448 -0
- package/esm/src/lib/diagram-kit/er.js +160 -0
- package/esm/src/lib/diagram-kit/handles.js +312 -0
- package/esm/src/lib/diagram-kit/index.js +15 -0
- package/esm/src/lib/diagram-kit/join-guidance.js +322 -0
- package/esm/src/lib/diagram-kit/rows.js +144 -0
- package/esm/src/lib/diagram-kit/styles.js +118 -0
- package/esm/src/lib/diagram-kit/uml.js +135 -0
- package/esm/src/lib/diagram-kit/update.js +244 -0
- package/esm/src/lib/grafloria-flow-element.js +266 -0
- package/esm/src/lib/grafloria.js +69 -0
- package/esm/src/lib/load.js +252 -0
- package/esm/src/lib/node-type-registry.js +42 -0
- package/esm/src/lib/stencil-kit/builders.js +18 -0
- package/esm/src/lib/stencil-kit/card-builders.js +105 -0
- package/esm/src/lib/stencil-kit/index.js +9 -0
- package/esm/src/lib/stencil-kit/palette.js +427 -0
- package/esm/src/lib/stencil-kit/shape-data.js +537 -0
- package/esm/src/lib/stencil-kit/styles.js +126 -0
- package/package.json +13 -4
- package/src/index.d.ts +2 -1
- package/src/index.js +11 -2
- package/src/lib/dashboard-kit/grid-binder.js +16 -15
- package/src/lib/dashboard-kit/styles.js +9 -3
- package/src/lib/diagram-kit/index.d.ts +1 -0
- package/src/lib/diagram-kit/index.js +11 -1
- package/src/lib/diagram-kit/join-guidance.d.ts +116 -0
- package/src/lib/diagram-kit/join-guidance.js +331 -0
- package/src/lib/stencil-kit/palette.js +60 -6
- 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/styles.js +15 -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/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/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-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/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/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/widgets.d.ts +112 -0
- package/src/libs/element/src/lib/dashboard-kit/widgets.js +389 -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/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/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/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/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/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/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/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/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/update.d.ts +133 -0
- package/src/libs/element/src/lib/diagram-kit/update.js +251 -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.d.ts +72 -0
- package/src/libs/element/src/lib/grafloria.js +74 -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/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/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/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/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/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/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/styles.d.ts +2 -0
- package/src/libs/element/src/lib/stencil-kit/styles.js +129 -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/index.d.ts +7 -0
- package/src/libs/engine/src/adapters/index.js +11 -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/index.d.ts +1 -0
- package/src/libs/engine/src/clipboard/index.js +6 -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/capture.d.ts +147 -0
- package/src/libs/engine/src/collab/capture.js +510 -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/integrity.d.ts +178 -0
- package/src/libs/engine/src/collab/integrity.js +438 -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/op-log.d.ts +50 -0
- package/src/libs/engine/src/collab/op-log.js +167 -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/replica.d.ts +188 -0
- package/src/libs/engine/src/collab/replica.js +526 -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/commands/Command.d.ts +66 -0
- package/src/libs/engine/src/commands/Command.js +64 -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/basic/AddGroupCommand.d.ts +13 -0
- package/src/libs/engine/src/commands/basic/AddGroupCommand.js +50 -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/AddNodeCommand.d.ts +13 -0
- package/src/libs/engine/src/commands/basic/AddNodeCommand.js +65 -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/AlignCommands.d.ts +42 -0
- package/src/libs/engine/src/commands/basic/AlignCommands.js +138 -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/CopyCommand.d.ts +29 -0
- package/src/libs/engine/src/commands/basic/CopyCommand.js +131 -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/DeleteSelectionCommand.d.ts +58 -0
- package/src/libs/engine/src/commands/basic/DeleteSelectionCommand.js +309 -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/ExpandGroupCommand.d.ts +12 -0
- package/src/libs/engine/src/commands/basic/ExpandGroupCommand.js +69 -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/MoveNodeCommand.d.ts +30 -0
- package/src/libs/engine/src/commands/basic/MoveNodeCommand.js +87 -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/PasteCommand.d.ts +33 -0
- package/src/libs/engine/src/commands/basic/PasteCommand.js +228 -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/ReconnectLinkCommand.d.ts +15 -0
- package/src/libs/engine/src/commands/basic/ReconnectLinkCommand.js +59 -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/RemoveGroupCommand.d.ts +12 -0
- package/src/libs/engine/src/commands/basic/RemoveGroupCommand.js +56 -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/RemoveNodeCommand.d.ts +23 -0
- package/src/libs/engine/src/commands/basic/RemoveNodeCommand.js +108 -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/RotateNodeCommand.d.ts +37 -0
- package/src/libs/engine/src/commands/basic/RotateNodeCommand.js +88 -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/SetGridItemCommand.d.ts +14 -0
- package/src/libs/engine/src/commands/basic/SetGridItemCommand.js +74 -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/SetLinkDisplayLabelCommand.d.ts +28 -0
- package/src/libs/engine/src/commands/basic/SetLinkDisplayLabelCommand.js +83 -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/SetLinkLabelsCommand.d.ts +14 -0
- package/src/libs/engine/src/commands/basic/SetLinkLabelsCommand.js +75 -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/SetLinkPointsCommand.d.ts +32 -0
- package/src/libs/engine/src/commands/basic/SetLinkPointsCommand.js +87 -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/SetNodeLabelCommand.d.ts +26 -0
- package/src/libs/engine/src/commands/basic/SetNodeLabelCommand.js +81 -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/SetNodeStyleCommand.d.ts +15 -0
- package/src/libs/engine/src/commands/basic/SetNodeStyleCommand.js +88 -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/SetStrokePointsCommand.d.ts +34 -0
- package/src/libs/engine/src/commands/basic/SetStrokePointsCommand.js +86 -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/UpdateLinkStyleCommand.d.ts +15 -0
- package/src/libs/engine/src/commands/basic/UpdateLinkStyleCommand.js +72 -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/remapNodePortIds.d.ts +23 -0
- package/src/libs/engine/src/commands/basic/remapNodePortIds.js +46 -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/composite/BatchCommand.d.ts +19 -0
- package/src/libs/engine/src/commands/composite/BatchCommand.js +61 -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/index.d.ts +2 -0
- package/src/libs/engine/src/commands/composite/index.js +7 -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/comments/comment-store.d.ts +238 -0
- package/src/libs/engine/src/comments/comment-store.js +538 -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/mentions.d.ts +52 -0
- package/src/libs/engine/src/comments/mentions.js +94 -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/types.d.ts +154 -0
- package/src/libs/engine/src/comments/types.js +107 -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/index.d.ts +1 -0
- package/src/libs/engine/src/config/index.js +6 -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/advanced/StyleParser.d.ts +75 -0
- package/src/libs/engine/src/dsl/advanced/StyleParser.js +166 -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/index.d.ts +9 -0
- package/src/libs/engine/src/dsl/advanced/index.js +13 -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/extended/BPMNGenerator.d.ts +38 -0
- package/src/libs/engine/src/dsl/extended/BPMNGenerator.js +90 -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/ERDGenerator.d.ts +38 -0
- package/src/libs/engine/src/dsl/extended/ERDGenerator.js +126 -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/ERDTransformer.d.ts +43 -0
- package/src/libs/engine/src/dsl/extended/ERDTransformer.js +105 -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/UMLParser.d.ts +99 -0
- package/src/libs/engine/src/dsl/extended/UMLParser.js +200 -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/generator/DSLFormatter.d.ts +87 -0
- package/src/libs/engine/src/dsl/generator/DSLFormatter.js +261 -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/DiagramAnalyzer.d.ts +111 -0
- package/src/libs/engine/src/dsl/generator/DiagramAnalyzer.js +361 -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/lexer/Lexer.d.ts +117 -0
- package/src/libs/engine/src/dsl/lexer/Lexer.js +521 -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/MermaidER.d.ts +118 -0
- package/src/libs/engine/src/dsl/mermaid/MermaidER.js +338 -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/index.d.ts +10 -0
- package/src/libs/engine/src/dsl/mermaid/index.js +33 -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/lines.d.ts +25 -0
- package/src/libs/engine/src/dsl/mermaid/lines.js +74 -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/sync/BidirectionalSync.d.ts +154 -0
- package/src/libs/engine/src/dsl/sync/BidirectionalSync.js +389 -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/LayoutApplicator.d.ts +140 -0
- package/src/libs/engine/src/dsl/sync/LayoutApplicator.js +271 -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/index.d.ts +13 -0
- package/src/libs/engine/src/dsl/sync/index.js +21 -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/types/ASTNode.d.ts +159 -0
- package/src/libs/engine/src/dsl/types/ASTNode.js +31 -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/engine/DiagramEngine.d.ts +917 -0
- package/src/libs/engine/src/engine/DiagramEngine.js +2190 -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/DiagramModeTypes.d.ts +73 -0
- package/src/libs/engine/src/engine/DiagramModeTypes.js +4 -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/index.d.ts +2 -0
- package/src/libs/engine/src/engine/index.js +7 -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/index.d.ts +1 -0
- package/src/libs/engine/src/events/index.js +6 -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/interaction/GroupCollapseService.d.ts +53 -0
- package/src/libs/engine/src/interaction/GroupCollapseService.js +274 -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/SemanticMembershipService.d.ts +28 -0
- package/src/libs/engine/src/interaction/SemanticMembershipService.js +168 -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/index.d.ts +4 -0
- package/src/libs/engine/src/interaction/index.js +9 -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/index.d.ts +1 -0
- package/src/libs/engine/src/interop/drawio/index.js +12 -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/layout/CompoundLayoutService.d.ts +121 -0
- package/src/libs/engine/src/layout/CompoundLayoutService.js +616 -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/LayoutManager.d.ts +155 -0
- package/src/libs/engine/src/layout/LayoutManager.js +640 -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/ViewportTransform.d.ts +55 -0
- package/src/libs/engine/src/layout/ViewportTransform.js +118 -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/GridLayoutAlgorithm.d.ts +56 -0
- package/src/libs/engine/src/layout/algorithms/GridLayoutAlgorithm.js +223 -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/HybridLayoutAlgorithm.d.ts +62 -0
- package/src/libs/engine/src/layout/algorithms/HybridLayoutAlgorithm.js +324 -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/component-packing.d.ts +98 -0
- package/src/libs/engine/src/layout/component-packing.js +307 -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/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/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-loader.d.ts +1 -0
- package/src/libs/engine/src/layout/elk-loader.js +24 -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/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/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-layout.interface.d.ts +145 -0
- package/src/libs/engine/src/layout/incremental-layout.interface.js +300 -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/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-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-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-graph.d.ts +70 -0
- package/src/libs/engine/src/layout/layout-graph.js +119 -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-host.d.ts +172 -0
- package/src/libs/engine/src/layout/layout-host.js +523 -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-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-metrics.d.ts +127 -0
- package/src/libs/engine/src/layout/layout-quality-metrics.js +466 -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.service.d.ts +100 -0
- package/src/libs/engine/src/layout/layout.service.js +216 -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/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-label-bridge.d.ts +77 -0
- package/src/libs/engine/src/layout/port-label-bridge.js +250 -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/rng.d.ts +34 -0
- package/src/libs/engine/src/layout/rng.js +71 -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/steppable-layout.d.ts +40 -0
- package/src/libs/engine/src/layout/steppable-layout.js +34 -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/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/sugiyama.d.ts +91 -0
- package/src/libs/engine/src/layout/sugiyama/sugiyama.js +797 -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/types.d.ts +263 -0
- package/src/libs/engine/src/layout/types.js +6 -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/models/DiagramEntity.d.ts +174 -0
- package/src/libs/engine/src/models/DiagramEntity.js +366 -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/GroupModel.d.ts +573 -0
- package/src/libs/engine/src/models/GroupModel.js +1373 -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/NodeModel.d.ts +666 -0
- package/src/libs/engine/src/models/NodeModel.js +1512 -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/StrokeModel.d.ts +160 -0
- package/src/libs/engine/src/models/StrokeModel.js +387 -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/readonly-lock.d.ts +108 -0
- package/src/libs/engine/src/models/readonly-lock.js +125 -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/PerformanceMonitor.d.ts +47 -0
- package/src/libs/engine/src/performance/PerformanceMonitor.js +112 -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/index.d.ts +2 -0
- package/src/libs/engine/src/performance/index.js +7 -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/index.d.ts +1 -0
- package/src/libs/engine/src/plugins/index.js +6 -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/dynamic-ports.d.ts +27 -0
- package/src/libs/engine/src/ports/dynamic-ports.js +135 -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/port-groups.d.ts +43 -0
- package/src/libs/engine/src/ports/port-groups.js +185 -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-types.d.ts +266 -0
- package/src/libs/engine/src/ports/port-types.js +30 -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/LemonadeJSRenderer.d.ts +160 -0
- package/src/libs/engine/src/rendering/LemonadeJSRenderer.js +362 -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/routing/LiveReroutingEngine.d.ts +75 -0
- package/src/libs/engine/src/routing/LiveReroutingEngine.js +173 -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/ObstacleMap.d.ts +68 -0
- package/src/libs/engine/src/routing/ObstacleMap.js +312 -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/PathSimplifier.d.ts +119 -0
- package/src/libs/engine/src/routing/PathSimplifier.js +224 -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/algorithms/AStarRouter.d.ts +90 -0
- package/src/libs/engine/src/routing/algorithms/AStarRouter.js +331 -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/ElkRouter.d.ts +34 -0
- package/src/libs/engine/src/routing/algorithms/ElkRouter.js +210 -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/OrthogonalRouter.d.ts +173 -0
- package/src/libs/engine/src/routing/algorithms/OrthogonalRouter.js +1092 -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/VisibilityGraphRouter.d.ts +59 -0
- package/src/libs/engine/src/routing/algorithms/VisibilityGraphRouter.js +258 -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/solver-host.d.ts +65 -0
- package/src/libs/engine/src/routing/global/solver-host.js +87 -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/types.d.ts +161 -0
- package/src/libs/engine/src/routing/types.js +4 -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/index.d.ts +1 -0
- package/src/libs/engine/src/selection/index.js +6 -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/DiagramValidator.d.ts +20 -0
- package/src/libs/engine/src/serialization/DiagramValidator.js +136 -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/Incremental.d.ts +77 -0
- package/src/libs/engine/src/serialization/Incremental.js +227 -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/Subgraph.d.ts +51 -0
- package/src/libs/engine/src/serialization/Subgraph.js +172 -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/state/ConnectionStateManager.d.ts +178 -0
- package/src/libs/engine/src/state/ConnectionStateManager.js +319 -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/index.d.ts +2 -0
- package/src/libs/engine/src/state/index.js +7 -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/batcher.d.ts +84 -0
- package/src/libs/engine/src/sync/batcher.js +0 -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/index.d.ts +20 -0
- package/src/libs/engine/src/sync/index.js +41 -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/sync-adapter.d.ts +243 -0
- package/src/libs/engine/src/sync/sync-adapter.js +524 -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/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/memory.d.ts +38 -0
- package/src/libs/engine/src/sync/transports/memory.js +111 -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/websocket.d.ts +60 -0
- package/src/libs/engine/src/sync/transports/websocket.js +210 -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/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/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/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/index.d.ts +141 -0
- package/src/libs/engine/src/template-library/index.js +271 -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/workflow-templates.d.ts +52 -0
- package/src/libs/engine/src/template-library/workflow-templates.js +438 -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/NodeTemplate.d.ts +342 -0
- package/src/libs/engine/src/templates/NodeTemplate.js +13 -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/TemplateRegistry.d.ts +70 -0
- package/src/libs/engine/src/templates/TemplateRegistry.js +128 -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-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-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-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-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-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-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-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-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-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-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-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-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-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-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/index.d.ts +15 -0
- package/src/libs/engine/src/templates/generated/bpmn/index.js +34 -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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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/index.d.ts +19 -0
- package/src/libs/engine/src/templates/generated/erd/index.js +42 -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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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/index.d.ts +16 -0
- package/src/libs/engine/src/templates/generated/flowchart/index.js +36 -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/register.d.ts +23 -0
- package/src/libs/engine/src/templates/generated/register.js +31 -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/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-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-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.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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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-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/index.d.ts +12 -0
- package/src/libs/engine/src/templates/index.js +27 -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/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/erd.d.ts +29 -0
- package/src/libs/engine/src/types/domain/erd.js +394 -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/index.d.ts +4 -0
- package/src/libs/engine/src/types/domain/index.js +9 -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/event.types.d.ts +142 -0
- package/src/libs/engine/src/types/event.types.js +96 -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/index.d.ts +7 -0
- package/src/libs/engine/src/types/index.js +14 -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/model.types.d.ts +378 -0
- package/src/libs/engine/src/types/model.types.js +4 -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/plugin.types.d.ts +30 -0
- package/src/libs/engine/src/types/plugin.types.js +4 -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/geometry.d.ts +45 -0
- package/src/libs/engine/src/utils/geometry.js +241 -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/index.d.ts +3 -0
- package/src/libs/engine/src/utils/index.js +8 -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/validation/ConnectionGroupValidator.d.ts +22 -0
- package/src/libs/engine/src/validation/ConnectionGroupValidator.js +56 -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/ValidationEngine.d.ts +79 -0
- package/src/libs/engine/src/validation/ValidationEngine.js +1150 -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/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/focus-containment.d.ts +90 -0
- package/src/libs/renderer/src/a11y/focus-containment.js +173 -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/index.d.ts +26 -0
- package/src/libs/renderer/src/a11y/index.js +30 -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/outline-view.d.ts +62 -0
- package/src/libs/renderer/src/a11y/outline-view.js +158 -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/semantics.d.ts +76 -0
- package/src/libs/renderer/src/a11y/semantics.js +229 -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-renderer.d.ts +194 -0
- package/src/libs/renderer/src/canvas/canvas-renderer.js +600 -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/index.d.ts +16 -0
- package/src/libs/renderer/src/canvas/index.js +79 -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/render-backend.d.ts +133 -0
- package/src/libs/renderer/src/canvas/render-backend.js +339 -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/tier-policy.d.ts +33 -0
- package/src/libs/renderer/src/canvas/tier-policy.js +89 -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/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-panel.d.ts +45 -0
- package/src/libs/renderer/src/comments/comment-panel.js +287 -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/index.d.ts +3 -0
- package/src/libs/renderer/src/comments/index.js +17 -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/batch.d.ts +49 -0
- package/src/libs/renderer/src/export/batch.js +95 -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/capture-host.d.ts +39 -0
- package/src/libs/renderer/src/export/capture-host.js +1259 -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/index.d.ts +14 -0
- package/src/libs/renderer/src/export/index.js +30 -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/pagination.d.ts +116 -0
- package/src/libs/renderer/src/export/pagination.js +245 -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/index.d.ts +4 -0
- package/src/libs/renderer/src/export/pdf/index.js +15 -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-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-primitives.d.ts +115 -0
- package/src/libs/renderer/src/export/pdf/pdf-primitives.js +338 -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/raster.d.ts +42 -0
- package/src/libs/renderer/src/export/raster.js +126 -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/scope.d.ts +16 -0
- package/src/libs/renderer/src/export/scope.js +69 -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/svg-export.d.ts +123 -0
- package/src/libs/renderer/src/export/svg-export.js +178 -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/ext/capabilities.d.ts +178 -0
- package/src/libs/renderer/src/ext/capabilities.js +22 -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/components/attach.d.ts +66 -0
- package/src/libs/renderer/src/ext/components/attach.js +112 -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/controls.d.ts +49 -0
- package/src/libs/renderer/src/ext/components/controls.js +144 -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/diagram-registry.d.ts +109 -0
- package/src/libs/renderer/src/ext/diagram-registry.js +303 -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/extension-host.d.ts +144 -0
- package/src/libs/renderer/src/ext/extension-host.js +272 -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/link-pipeline.d.ts +195 -0
- package/src/libs/renderer/src/ext/link-pipeline.js +431 -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/node-component.d.ts +114 -0
- package/src/libs/renderer/src/ext/node-component.js +290 -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/portal.d.ts +129 -0
- package/src/libs/renderer/src/ext/portal.js +267 -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/registry-scope.d.ts +93 -0
- package/src/libs/renderer/src/ext/registry-scope.js +142 -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/index.d.ts +34 -0
- package/src/libs/renderer/src/index.js +108 -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/diagram-instance.d.ts +48 -0
- package/src/libs/renderer/src/instance/diagram-instance.js +51 -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/index.d.ts +5 -0
- package/src/libs/renderer/src/instance/index.js +13 -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/model-input.d.ts +229 -0
- package/src/libs/renderer/src/instance/model-input.js +325 -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/wheel-scroll-yield.d.ts +38 -0
- package/src/libs/renderer/src/instance/wheel-scroll-yield.js +118 -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/WaypointEditor.d.ts +133 -0
- package/src/libs/renderer/src/interaction/WaypointEditor.js +263 -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/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/index.d.ts +11 -0
- package/src/libs/renderer/src/interaction/index.js +29 -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/interaction-controller.d.ts +555 -0
- package/src/libs/renderer/src/interaction/interaction-controller.js +1733 -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/selection-tools.d.ts +343 -0
- package/src/libs/renderer/src/interaction/selection-tools.js +918 -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/touch-gestures.d.ts +160 -0
- package/src/libs/renderer/src/interaction/touch-gestures.js +549 -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/lazy/host-culling.d.ts +116 -0
- package/src/libs/renderer/src/lazy/host-culling.js +135 -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/progressive-mounter.d.ts +80 -0
- package/src/libs/renderer/src/lazy/progressive-mounter.js +264 -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/view-lifecycle.d.ts +97 -0
- package/src/libs/renderer/src/lazy/view-lifecycle.js +221 -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/perf-hud.d.ts +46 -0
- package/src/libs/renderer/src/perf/perf-hud.js +105 -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/platform/index.d.ts +1 -0
- package/src/libs/renderer/src/platform/index.js +5 -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/presence/bind-presence.d.ts +51 -0
- package/src/libs/renderer/src/presence/bind-presence.js +144 -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/presence-overlay.d.ts +121 -0
- package/src/libs/renderer/src/presence/presence-overlay.js +465 -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/presentation.d.ts +94 -0
- package/src/libs/renderer/src/presentation/presentation.js +158 -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/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-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-sequencer.d.ts +226 -0
- package/src/libs/renderer/src/services/animation-sequencer.js +379 -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/custom-animation-registry.d.ts +182 -0
- package/src/libs/renderer/src/services/custom-animation-registry.js +361 -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/render-to-static.d.ts +91 -0
- package/src/libs/renderer/src/ssr/render-to-static.js +81 -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/JumpPointDetector.d.ts +79 -0
- package/src/libs/renderer/src/svg/JumpPointDetector.js +176 -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/LabelRenderer.d.ts +76 -0
- package/src/libs/renderer/src/svg/LabelRenderer.js +273 -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/channel-nudging.d.ts +34 -0
- package/src/libs/renderer/src/svg/channel-nudging.js +226 -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-templates.d.ts +152 -0
- package/src/libs/renderer/src/svg/edge-templates.js +233 -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/index.d.ts +25 -0
- package/src/libs/renderer/src/svg/index.js +32 -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-hit-test.d.ts +142 -0
- package/src/libs/renderer/src/svg/link-hit-test.js +182 -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/node-sizing.d.ts +51 -0
- package/src/libs/renderer/src/svg/node-sizing.js +65 -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/notation-shapes.d.ts +2 -0
- package/src/libs/renderer/src/svg/notation-shapes.js +126 -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/panel.d.ts +115 -0
- package/src/libs/renderer/src/svg/panel.js +353 -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/port-glyph.d.ts +27 -0
- package/src/libs/renderer/src/svg/port-glyph.js +97 -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-layout.d.ts +50 -0
- package/src/libs/renderer/src/svg/port-layout.js +212 -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-spots.d.ts +69 -0
- package/src/libs/renderer/src/svg/port-spots.js +154 -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-solver-bridge.d.ts +48 -0
- package/src/libs/renderer/src/svg/route-solver-bridge.js +151 -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/stroke-layer.d.ts +36 -0
- package/src/libs/renderer/src/svg/stroke-layer.js +183 -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/text-block.d.ts +54 -0
- package/src/libs/renderer/src/svg/text-block.js +171 -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/contrast.d.ts +67 -0
- package/src/libs/renderer/src/themes/contrast.js +215 -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-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-theme-set.d.ts +10 -0
- package/src/libs/renderer/src/themes/default-theme-set.js +25 -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/index.d.ts +22 -0
- package/src/libs/renderer/src/themes/index.js +93 -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-registry.d.ts +40 -0
- package/src/libs/renderer/src/themes/style-registry.js +129 -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-css.d.ts +30 -0
- package/src/libs/renderer/src/themes/theme-css.js +304 -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-vars.d.ts +49 -0
- package/src/libs/renderer/src/themes/theme-vars.js +112 -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/types/geometry.types.d.ts +10 -0
- package/src/libs/renderer/src/types/geometry.types.js +3 -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/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/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/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/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/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/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/validation.d.ts +181 -0
- package/src/libs/renderer/src/types/property-schema/validation.js +8 -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/theme.types.d.ts +305 -0
- package/src/libs/renderer/src/types/theme.types.js +3 -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/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-priority.d.ts +118 -0
- package/src/libs/renderer/src/utils/animation-priority.js +258 -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/lru-cache.d.ts +34 -0
- package/src/libs/renderer/src/utils/lru-cache.js +72 -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/viewport-controller.d.ts +198 -0
- package/src/libs/renderer/src/viewport/viewport-controller.js +315 -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/foreign-object.d.ts +157 -0
- package/src/libs/renderer/src/vnode/foreign-object.js +167 -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/patch.d.ts +189 -0
- package/src/libs/renderer/src/vnode/patch.js +564 -0
- package/src/index.js.map +0 -1
- package/src/lib/dashboard-kit/dashboard.js.map +0 -1
- package/src/lib/dashboard-kit/grid-binder.js.map +0 -1
- package/src/lib/dashboard-kit/grid-mapping.js.map +0 -1
- package/src/lib/dashboard-kit/index.js.map +0 -1
- package/src/lib/dashboard-kit/styles.js.map +0 -1
- package/src/lib/dashboard-kit/widgets.js.map +0 -1
- package/src/lib/diagram-kit/card.js.map +0 -1
- package/src/lib/diagram-kit/editing.js.map +0 -1
- package/src/lib/diagram-kit/er.js.map +0 -1
- package/src/lib/diagram-kit/handles.js.map +0 -1
- package/src/lib/diagram-kit/index.js.map +0 -1
- package/src/lib/diagram-kit/rows.js.map +0 -1
- package/src/lib/diagram-kit/styles.js.map +0 -1
- package/src/lib/diagram-kit/uml.js.map +0 -1
- package/src/lib/diagram-kit/update.js.map +0 -1
- package/src/lib/grafloria-flow-element.js.map +0 -1
- package/src/lib/grafloria.js.map +0 -1
- package/src/lib/load.js.map +0 -1
- package/src/lib/node-type-registry.js.map +0 -1
- package/src/lib/stencil-kit/builders.js.map +0 -1
- package/src/lib/stencil-kit/card-builders.js.map +0 -1
- package/src/lib/stencil-kit/index.js.map +0 -1
- package/src/lib/stencil-kit/palette.js.map +0 -1
- package/src/lib/stencil-kit/shape-data.js.map +0 -1
- package/src/lib/stencil-kit/styles.js.map +0 -1
|
@@ -0,0 +1,1733 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InteractionController = void 0;
|
|
4
|
+
const engine_1 = require("@grafloria/engine");
|
|
5
|
+
// Wave 6: THE port-position function — hit-test and magnet where you DRAW.
|
|
6
|
+
const port_positioning_1 = require("../svg/port-positioning");
|
|
7
|
+
const WaypointEditor_1 = require("./WaypointEditor");
|
|
8
|
+
const ControlPointEditor_1 = require("./ControlPointEditor");
|
|
9
|
+
const ArrowRenderer_1 = require("../svg/ArrowRenderer");
|
|
10
|
+
const link_hit_test_1 = require("../svg/link-hit-test");
|
|
11
|
+
// wave10/gallery: the HOST's connection-veto registry. See
|
|
12
|
+
// installHostConnectionValidatorBridge() — the drag path never asked it.
|
|
13
|
+
const tools_1 = require("../ext/tools");
|
|
14
|
+
/**
|
|
15
|
+
* InteractionController — the framework-agnostic interaction brain.
|
|
16
|
+
*
|
|
17
|
+
* Owns all pointer/keyboard-driven interaction LOGIC for a diagram: hover
|
|
18
|
+
* detection, port connection dragging, link endpoint reconnection, inline label
|
|
19
|
+
* repositioning, and waypoint / control-point editing.
|
|
20
|
+
*
|
|
21
|
+
* ## Framework contract
|
|
22
|
+
*
|
|
23
|
+
* This class answers **"WHAT changed?"** — never **"who should re-render?"**.
|
|
24
|
+
* Every handler returns a boolean (or a value) telling the host whether a
|
|
25
|
+
* re-render is warranted; the host framework decides how to act on that:
|
|
26
|
+
*
|
|
27
|
+
* - Angular → `cdr.markForCheck()` (see `InteractionHandlerService`)
|
|
28
|
+
* - React → `setState` / `useSyncExternalStore`
|
|
29
|
+
* - Vue → touch a `ref`
|
|
30
|
+
* - Vanilla → call your own `render()`
|
|
31
|
+
*
|
|
32
|
+
* It therefore has **zero framework imports** (no Angular, no DOM beyond the
|
|
33
|
+
* ambient `performance.now()` clock) and is instantiated with a plain `new`.
|
|
34
|
+
* It takes WORLD coordinates only: converting client/screen pixels into world
|
|
35
|
+
* space is the job of {@link ViewportController}, so this class never touches
|
|
36
|
+
* an event, an element, or a bounding rect.
|
|
37
|
+
*
|
|
38
|
+
* Supports three interaction modes (driven by the engine's interaction config):
|
|
39
|
+
* - DIRECT: Drag node body to move, drag port to connect
|
|
40
|
+
* - DELIBERATE: Select node first, then drag to move
|
|
41
|
+
* - SMART: Visio-style with hover-based port visibility
|
|
42
|
+
*
|
|
43
|
+
* The Angular `InteractionHandlerService` is a thin `@Injectable` subclass of
|
|
44
|
+
* this class and adds no behaviour of its own.
|
|
45
|
+
*/
|
|
46
|
+
class InteractionController {
|
|
47
|
+
/**
|
|
48
|
+
* Wave 9 — Card 7. Is the document locked?
|
|
49
|
+
*
|
|
50
|
+
* The InteractionController is the LAST place a read-only bypass could hide,
|
|
51
|
+
* because it is the one layer that mutates the model DIRECTLY — it never touches
|
|
52
|
+
* the CommandManager. Most of its writes now hit the model-level guards anyway,
|
|
53
|
+
* but `moveControlPoint` writes `link.segments` as a RAW PUBLIC FIELD, which no
|
|
54
|
+
* model guard can see. So the refusal has to be here as well.
|
|
55
|
+
*/
|
|
56
|
+
isReadonlyEngine(engine) {
|
|
57
|
+
var _a;
|
|
58
|
+
return ((_a = engine === null || engine === void 0 ? void 0 : engine.getDiagram()) === null || _a === void 0 ? void 0 : _a.isReadonly()) === true;
|
|
59
|
+
}
|
|
60
|
+
/** Read-only probe for the methods that are handed a link but no engine. */
|
|
61
|
+
isReadonlyLink(link) {
|
|
62
|
+
var _a;
|
|
63
|
+
return ((_a = link === null || link === void 0 ? void 0 : link.diagram) === null || _a === void 0 ? void 0 : _a.isReadonly()) === true;
|
|
64
|
+
}
|
|
65
|
+
/** Grow every hit target by `world` units (0 = mouse-precision, the default). */
|
|
66
|
+
setHitSlop(world) {
|
|
67
|
+
this.hitSlop = Math.max(0, world);
|
|
68
|
+
}
|
|
69
|
+
getHitSlop() {
|
|
70
|
+
return this.hitSlop;
|
|
71
|
+
}
|
|
72
|
+
setLinkHitAreaWidth(width) {
|
|
73
|
+
this.linkHitAreaWidthConfig = Math.max(0, width);
|
|
74
|
+
}
|
|
75
|
+
constructor() {
|
|
76
|
+
/**
|
|
77
|
+
* Shared arrow renderer used only for canonical arrow tip-offset geometry
|
|
78
|
+
* when computing arrowhead hit anchors (see {@link buildLinkHitOptions}).
|
|
79
|
+
*/
|
|
80
|
+
this.arrowRenderer = new ArrowRenderer_1.ArrowRenderer();
|
|
81
|
+
/**
|
|
82
|
+
* Wave 9 — Card 2. Extra hit radius in WORLD units, granted while a TOUCH
|
|
83
|
+
* pointer owns the gesture (the binder sets it on touch down and clears it on
|
|
84
|
+
* up). A 5px port is not hittable with a fingertip; this is what makes ports,
|
|
85
|
+
* waypoints and control-point handles touch-sized without changing how any of
|
|
86
|
+
* them RENDER — the visual stays crisp, only the catchment grows.
|
|
87
|
+
*
|
|
88
|
+
* World, not screen: every hit test here is world-space, so a screen-px slop
|
|
89
|
+
* would shrink to nothing exactly when you are zoomed out and the targets are
|
|
90
|
+
* already smallest.
|
|
91
|
+
*/
|
|
92
|
+
this.hitSlop = 0;
|
|
93
|
+
/**
|
|
94
|
+
* The renderer's configured interaction-stroke width (`linkHitAreaWidth`).
|
|
95
|
+
* The link grab distance derives from it so the painted invitation and the
|
|
96
|
+
* accepted press stay the SAME geometry — createDiagram syncs it whenever
|
|
97
|
+
* the host overrides the renderer default.
|
|
98
|
+
*/
|
|
99
|
+
this.linkHitAreaWidthConfig = link_hit_test_1.DEFAULT_LINK_HIT_AREA_WIDTH;
|
|
100
|
+
/**
|
|
101
|
+
* Current hover state
|
|
102
|
+
*/
|
|
103
|
+
this.hoveredNode = null;
|
|
104
|
+
this.hoveredPort = null;
|
|
105
|
+
this.hoveredLink = null;
|
|
106
|
+
/**
|
|
107
|
+
* Connection drag state
|
|
108
|
+
*/
|
|
109
|
+
this.isConnecting = false;
|
|
110
|
+
this.connectionSourcePort = null;
|
|
111
|
+
/**
|
|
112
|
+
* Link reconnection state
|
|
113
|
+
*/
|
|
114
|
+
this.isReconnectingLink = false;
|
|
115
|
+
this.reconnectingLink = null;
|
|
116
|
+
this.reconnectingEndpoint = null;
|
|
117
|
+
/** Wave 2: current cursor position while dragging a reconnecting endpoint. */
|
|
118
|
+
this.reconnectingMousePoint = null;
|
|
119
|
+
/**
|
|
120
|
+
* Wave 2 (Edges & links): inline label drag-reposition state. While active,
|
|
121
|
+
* mouse moves remap the cursor to a (position 0-1, offset) pair on the model
|
|
122
|
+
* so the label survives re-routing. See {@link computeLabelDragUpdate}.
|
|
123
|
+
*/
|
|
124
|
+
this.isDraggingLabel = false;
|
|
125
|
+
this.editingLabelLink = null;
|
|
126
|
+
this.editingLabelIndex = null;
|
|
127
|
+
/**
|
|
128
|
+
* Phase 2.3a: Waypoint editing state
|
|
129
|
+
*/
|
|
130
|
+
this.isDraggingWaypoint = false;
|
|
131
|
+
this.editingLink = null;
|
|
132
|
+
this.editingWaypointIndex = null;
|
|
133
|
+
/**
|
|
134
|
+
* wave12: the link's points when a waypoint drag STARTED, so endWaypointDrag can commit
|
|
135
|
+
* the whole gesture as one undoable SetLinkPointsCommand (FROM→TO). Absent between drags.
|
|
136
|
+
*/
|
|
137
|
+
this.waypointDragStartPoints = null;
|
|
138
|
+
this.waypointEditor = null;
|
|
139
|
+
this.hoveredWaypointIndex = null;
|
|
140
|
+
this.hoveredWaypointLink = null;
|
|
141
|
+
/**
|
|
142
|
+
* Phase 2.3b: Control point editing state
|
|
143
|
+
*/
|
|
144
|
+
this.isDraggingControlPoint = false;
|
|
145
|
+
this.editingControlPointLink = null;
|
|
146
|
+
this.editingControlPointSegmentIndex = null;
|
|
147
|
+
this.editingControlPointType = null;
|
|
148
|
+
this.controlPointEditor = null;
|
|
149
|
+
this.hoveredControlPointSegmentIndex = null;
|
|
150
|
+
this.hoveredControlPointType = null;
|
|
151
|
+
this.hoveredControlPointLink = null;
|
|
152
|
+
/**
|
|
153
|
+
* Phase 5: Performance optimization - debounce hover detection
|
|
154
|
+
*/
|
|
155
|
+
this.hoverDebounceTimer = null;
|
|
156
|
+
this.HOVER_DEBOUNCE_MS = 16; // ~60fps
|
|
157
|
+
/**
|
|
158
|
+
* Phase 5: Performance monitoring
|
|
159
|
+
*/
|
|
160
|
+
this.performanceMetrics = {
|
|
161
|
+
hoverDetectionTime: 0,
|
|
162
|
+
connectionUpdateTime: 0,
|
|
163
|
+
portHitTestTime: 0,
|
|
164
|
+
};
|
|
165
|
+
/**
|
|
166
|
+
* Phase 5: Port hit test cache for performance
|
|
167
|
+
*/
|
|
168
|
+
this.portHitCache = new Map();
|
|
169
|
+
this.portHitCacheInvalidated = false;
|
|
170
|
+
/**
|
|
171
|
+
* ==========================================================================
|
|
172
|
+
* wave10/gallery BUG FIX — `registerConnectionValidator` did not veto a DRAG.
|
|
173
|
+
* ==========================================================================
|
|
174
|
+
*
|
|
175
|
+
* `ext/tools.ts` documents its registry as: "Validators registered here are
|
|
176
|
+
* consulted wherever the renderer offers a connection", and its whole reason
|
|
177
|
+
* for existing is that "a HOST had no way to inject 'an Order may not connect
|
|
178
|
+
* to an Invoice'".
|
|
179
|
+
*
|
|
180
|
+
* It was consulted in exactly ONE place: `canConnectPorts()` in snapping.ts —
|
|
181
|
+
* i.e. proximity-connect and keyboard-connect. The MOUSE DRAG, which is how
|
|
182
|
+
* essentially every connection in every diagram ever made actually gets made,
|
|
183
|
+
* never asked. You could register a validator that rejected every connection
|
|
184
|
+
* in the graph, drag from a port to a port, and get the link.
|
|
185
|
+
*
|
|
186
|
+
* The engine has its own validator list on `ConnectionStateManager` — which
|
|
187
|
+
* the drag DOES consult, and which also feeds `calculateValidTargets()`, so a
|
|
188
|
+
* veto registered there also dims the invalid ports during the drag. So the
|
|
189
|
+
* fix is a bridge, not a second enforcement point: forward the host registry
|
|
190
|
+
* into the engine's list, once per engine. With no validators registered
|
|
191
|
+
* `isValidConnection()` returns `{ valid: true }`, so the bridge costs a
|
|
192
|
+
* function call on a path that is already doing a hit-test.
|
|
193
|
+
*/
|
|
194
|
+
this.validatorBridgedEngines = new WeakSet();
|
|
195
|
+
// Phase 2.3a: Initialize waypoint editor with default config
|
|
196
|
+
this.waypointEditor = new WaypointEditor_1.WaypointEditor({
|
|
197
|
+
snapToGrid: false,
|
|
198
|
+
gridSize: 20,
|
|
199
|
+
removeOnDoubleClick: true,
|
|
200
|
+
handleRadius: 5,
|
|
201
|
+
handleColor: '#3b82f6',
|
|
202
|
+
handleStrokeColor: '#ffffff',
|
|
203
|
+
minDistanceFromEndpoints: 30,
|
|
204
|
+
clickDetectionRadius: 10,
|
|
205
|
+
});
|
|
206
|
+
// Phase 2.3b: Initialize control point editor with default config
|
|
207
|
+
this.controlPointEditor = new ControlPointEditor_1.ControlPointEditor({
|
|
208
|
+
snapToGrid: false,
|
|
209
|
+
gridSize: 20,
|
|
210
|
+
handleRadius: 6,
|
|
211
|
+
handleColor: '#10b981',
|
|
212
|
+
handleStrokeColor: '#ffffff',
|
|
213
|
+
controlLineColor: '#6b7280',
|
|
214
|
+
controlLineWidth: 1,
|
|
215
|
+
controlLineDash: [5, 5],
|
|
216
|
+
clickDetectionRadius: 10,
|
|
217
|
+
showControlLines: true,
|
|
218
|
+
symmetricControls: false,
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Phase 5: Dispose and cleanup resources
|
|
223
|
+
*/
|
|
224
|
+
dispose() {
|
|
225
|
+
if (this.hoverDebounceTimer) {
|
|
226
|
+
clearTimeout(this.hoverDebounceTimer);
|
|
227
|
+
this.hoverDebounceTimer = null;
|
|
228
|
+
}
|
|
229
|
+
this.portHitCache.clear();
|
|
230
|
+
this.hoveredNode = null;
|
|
231
|
+
this.hoveredPort = null;
|
|
232
|
+
this.hoveredLink = null;
|
|
233
|
+
// BUGFIX (wave 3): `isConnecting` was never cleared here, so a disposed
|
|
234
|
+
// controller reported `isInteracting() === true` forever — surfaced by the
|
|
235
|
+
// first framework-free dispose test. Cleared alongside its source port.
|
|
236
|
+
this.isConnecting = false;
|
|
237
|
+
this.connectionSourcePort = null;
|
|
238
|
+
this.reconnectingLink = null;
|
|
239
|
+
this.reconnectingEndpoint = null;
|
|
240
|
+
this.reconnectingMousePoint = null;
|
|
241
|
+
this.isReconnectingLink = false;
|
|
242
|
+
// Wave 2: Clean up label drag state
|
|
243
|
+
this.isDraggingLabel = false;
|
|
244
|
+
this.editingLabelLink = null;
|
|
245
|
+
this.editingLabelIndex = null;
|
|
246
|
+
// Phase 2.3a: Clean up waypoint editing state
|
|
247
|
+
this.editingLink = null;
|
|
248
|
+
this.editingWaypointIndex = null;
|
|
249
|
+
this.isDraggingWaypoint = false;
|
|
250
|
+
this.hoveredWaypointIndex = null;
|
|
251
|
+
this.hoveredWaypointLink = null;
|
|
252
|
+
// Phase 2.3b: Clean up control point editing state
|
|
253
|
+
this.editingControlPointLink = null;
|
|
254
|
+
this.editingControlPointSegmentIndex = null;
|
|
255
|
+
this.editingControlPointType = null;
|
|
256
|
+
this.isDraggingControlPoint = false;
|
|
257
|
+
this.hoveredControlPointSegmentIndex = null;
|
|
258
|
+
this.hoveredControlPointType = null;
|
|
259
|
+
this.hoveredControlPointLink = null;
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Phase 5: Get performance metrics
|
|
263
|
+
*/
|
|
264
|
+
getPerformanceMetrics() {
|
|
265
|
+
return Object.assign({}, this.performanceMetrics);
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Phase 5: Invalidate port hit cache (call when nodes move or ports change)
|
|
269
|
+
*/
|
|
270
|
+
invalidatePortHitCache() {
|
|
271
|
+
this.portHitCacheInvalidated = true;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Phase 3: Handle mouse move for hover detection
|
|
275
|
+
* Phase 5: Enhanced with performance monitoring and validation
|
|
276
|
+
* Updates hover states for nodes, ports, and links
|
|
277
|
+
* CRITICAL FIX: Added comprehensive debugging
|
|
278
|
+
*/
|
|
279
|
+
handleMouseMove(worldX, worldY, engine) {
|
|
280
|
+
var _a, _b;
|
|
281
|
+
// Phase 5: Validate inputs
|
|
282
|
+
if (!engine || !isFinite(worldX) || !isFinite(worldY)) {
|
|
283
|
+
return false;
|
|
284
|
+
}
|
|
285
|
+
const diagram = engine.getDiagram();
|
|
286
|
+
if (!diagram)
|
|
287
|
+
return false;
|
|
288
|
+
// Phase 5: Performance monitoring
|
|
289
|
+
const startTime = performance.now();
|
|
290
|
+
const config = engine.getInteractionConfig();
|
|
291
|
+
let needsRender = false;
|
|
292
|
+
// Find what's under the cursor
|
|
293
|
+
const nodeAtPosition = diagram.getNodeAtPosition(worldX, worldY);
|
|
294
|
+
const portAtPosition = this.findPortAtPosition(worldX, worldY, diagram, engine);
|
|
295
|
+
const linkAtPosition = this.findLinkAtPosition(worldX, worldY, diagram);
|
|
296
|
+
// CRITICAL FIX: Debug logging for port detection
|
|
297
|
+
const debugPortDetection = false; // Disabled - working correctly now
|
|
298
|
+
if (debugPortDetection && (portAtPosition || nodeAtPosition)) {
|
|
299
|
+
console.log('🔍 Hover detection:', {
|
|
300
|
+
worldPos: { x: worldX.toFixed(1), y: worldY.toFixed(1) },
|
|
301
|
+
node: (nodeAtPosition === null || nodeAtPosition === void 0 ? void 0 : nodeAtPosition.getMetadata('label')) || 'none',
|
|
302
|
+
port: portAtPosition ? `${portAtPosition.side} (${portAtPosition.id})` : 'none',
|
|
303
|
+
portVisibility: config.portVisibility,
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
// Update node hover state. Hovering a node's CHROME (a drag-handle child)
|
|
307
|
+
// is hovering the node: without the propagation, a window whose title bar
|
|
308
|
+
// covers its top strip never reads as hovered there — so its hover-visible
|
|
309
|
+
// ports never surfaced ("the port on the title" report, second half).
|
|
310
|
+
const chromeParent = ((_b = (_a = nodeAtPosition === null || nodeAtPosition === void 0 ? void 0 : nodeAtPosition.behavior) === null || _a === void 0 ? void 0 : _a.dragHandler) === null || _b === void 0 ? void 0 : _b.isDragHandler) === true && nodeAtPosition.parentId
|
|
311
|
+
? diagram.getNode(nodeAtPosition.parentId)
|
|
312
|
+
: null;
|
|
313
|
+
const allNodes = diagram.getNodes();
|
|
314
|
+
allNodes.forEach((node) => {
|
|
315
|
+
const wasHovered = node.state.hovered;
|
|
316
|
+
const isHovered = node === nodeAtPosition || node === chromeParent;
|
|
317
|
+
if (wasHovered !== isHovered) {
|
|
318
|
+
node.setState({ hovered: isHovered });
|
|
319
|
+
needsRender = true;
|
|
320
|
+
if (debugPortDetection) {
|
|
321
|
+
console.log(` Node ${node.getMetadata('label')} hover: ${wasHovered} → ${isHovered}`);
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
});
|
|
325
|
+
// Update port hover state
|
|
326
|
+
allNodes.forEach((node) => {
|
|
327
|
+
node.getPorts().forEach((port) => {
|
|
328
|
+
const wasHovered = port.isHovered;
|
|
329
|
+
const isHovered = port === portAtPosition;
|
|
330
|
+
if (wasHovered !== isHovered) {
|
|
331
|
+
port.isHovered = isHovered;
|
|
332
|
+
needsRender = true;
|
|
333
|
+
// CRITICAL FIX: Mark node as dirty when port hover state changes
|
|
334
|
+
// This forces the renderer to regenerate the port VNodes with updated styles
|
|
335
|
+
node.markDirty('port-hover-changed');
|
|
336
|
+
// TEMPORARY DEBUG: Always log port hover changes to see what's happening
|
|
337
|
+
console.log(`🔘 Port ${port.side} hover: ${wasHovered} → ${isHovered}`, { nodeLabel: node.getMetadata('label') });
|
|
338
|
+
}
|
|
339
|
+
});
|
|
340
|
+
});
|
|
341
|
+
// Update link hover state
|
|
342
|
+
const allLinks = diagram.getLinks();
|
|
343
|
+
allLinks.forEach((link) => {
|
|
344
|
+
const currentState = link.state;
|
|
345
|
+
const isHovered = link === linkAtPosition;
|
|
346
|
+
// Don't override selected/highlighted states with hover
|
|
347
|
+
// Selected and highlighted links keep their state even when hovered
|
|
348
|
+
if (currentState === 'selected' || currentState === 'highlighted') {
|
|
349
|
+
return; // Keep current state, don't change to hovered
|
|
350
|
+
}
|
|
351
|
+
const wasHovered = currentState === 'hovered';
|
|
352
|
+
if (wasHovered !== isHovered) {
|
|
353
|
+
link.setState(isHovered ? 'hovered' : 'default');
|
|
354
|
+
needsRender = true;
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
// Store current hover state
|
|
358
|
+
this.hoveredNode = nodeAtPosition || null;
|
|
359
|
+
this.hoveredPort = portAtPosition;
|
|
360
|
+
this.hoveredLink = linkAtPosition;
|
|
361
|
+
// Phase 5: Track performance
|
|
362
|
+
this.performanceMetrics.hoverDetectionTime = performance.now() - startTime;
|
|
363
|
+
return needsRender;
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Phase 3: Handle connection drag update
|
|
367
|
+
* Phase 5: Enhanced with performance monitoring and validation
|
|
368
|
+
* Updates connection preview during drag
|
|
369
|
+
*/
|
|
370
|
+
handleConnectionDrag(worldX, worldY, engine) {
|
|
371
|
+
var _a;
|
|
372
|
+
// Phase 5: Validate state and inputs
|
|
373
|
+
if (!this.isConnecting || !this.connectionSourcePort) {
|
|
374
|
+
return false;
|
|
375
|
+
}
|
|
376
|
+
if (!engine || !isFinite(worldX) || !isFinite(worldY)) {
|
|
377
|
+
return false;
|
|
378
|
+
}
|
|
379
|
+
// Phase 5: Performance monitoring
|
|
380
|
+
const startTime = performance.now();
|
|
381
|
+
try {
|
|
382
|
+
const connectionStateManager = engine.getConnectionStateManager();
|
|
383
|
+
// Wave 6 (Card 6): MAGNET SNAP. Fall back from "the port under the cursor"
|
|
384
|
+
// to "the nearest VALID port within the magnet radius", so a drag latches
|
|
385
|
+
// on before the pointer is precisely over a 6px circle. The radius is the
|
|
386
|
+
// engine's `snapToPortRadius`, and the candidate set is the SAME
|
|
387
|
+
// valid-target set the highlight paints — the thing you can snap to is
|
|
388
|
+
// exactly the thing lit up as snappable, which is the whole contract.
|
|
389
|
+
const hoveredPort = (_a = this.hoveredPort) !== null && _a !== void 0 ? _a : this.findMagnetPort(worldX, worldY, engine);
|
|
390
|
+
// Update connection state with current mouse position and hovered port
|
|
391
|
+
connectionStateManager.updateConnection({ x: worldX, y: worldY }, hoveredPort || undefined);
|
|
392
|
+
// Update port highlight states
|
|
393
|
+
this.updatePortHighlights(engine);
|
|
394
|
+
// Phase 5: Track performance
|
|
395
|
+
this.performanceMetrics.connectionUpdateTime = performance.now() - startTime;
|
|
396
|
+
return true;
|
|
397
|
+
}
|
|
398
|
+
catch (error) {
|
|
399
|
+
// Phase 5: Error handling
|
|
400
|
+
console.error('Error during connection drag:', error);
|
|
401
|
+
this.cancelConnection(engine);
|
|
402
|
+
return false;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Phase 3: Start connection from port
|
|
407
|
+
* Phase 5: Enhanced with validation and error handling
|
|
408
|
+
* CRITICAL FIX: Added detailed logging
|
|
409
|
+
*/
|
|
410
|
+
startConnection(port, worldX, worldY, engine) {
|
|
411
|
+
if (this.isReadonlyEngine(engine))
|
|
412
|
+
return;
|
|
413
|
+
// Phase 5: Validate inputs
|
|
414
|
+
if (!port || !engine || !isFinite(worldX) || !isFinite(worldY)) {
|
|
415
|
+
console.warn('❌ Invalid inputs for startConnection:', { port: !!port, engine: !!engine, worldX, worldY });
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
try {
|
|
419
|
+
this.isConnecting = true;
|
|
420
|
+
this.connectionSourcePort = port;
|
|
421
|
+
const connectionStateManager = engine.getConnectionStateManager();
|
|
422
|
+
connectionStateManager.startConnection(port, { x: worldX, y: worldY });
|
|
423
|
+
console.debug('🔌 Connection started:', {
|
|
424
|
+
portId: port.id,
|
|
425
|
+
portType: port.type,
|
|
426
|
+
portSide: port.side,
|
|
427
|
+
position: { x: worldX.toFixed(1), y: worldY.toFixed(1) }
|
|
428
|
+
});
|
|
429
|
+
}
|
|
430
|
+
catch (error) {
|
|
431
|
+
// Phase 5: Error recovery
|
|
432
|
+
console.error('❌ Error starting connection:', error);
|
|
433
|
+
this.isConnecting = false;
|
|
434
|
+
this.connectionSourcePort = null;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* wave12/connect-ergonomics (gap 3) — Easy Connect: start a connection from a
|
|
439
|
+
* node BODY, not a port glyph. Picks the source port nearest the press point
|
|
440
|
+
* (so a drag off the right side starts from the right port) and begins the
|
|
441
|
+
* normal connection drag from it. Returns false when the node has no port to
|
|
442
|
+
* start from. The whole gesture then flows through the existing connection
|
|
443
|
+
* pipeline (preview on move, {@link completeConnection} on drop).
|
|
444
|
+
*/
|
|
445
|
+
startNodeBodyConnection(node, worldX, worldY, engine) {
|
|
446
|
+
if (this.isReadonlyEngine(engine))
|
|
447
|
+
return false;
|
|
448
|
+
const port = this.nearestPortOnNode(node, worldX, worldY);
|
|
449
|
+
if (!port)
|
|
450
|
+
return false;
|
|
451
|
+
this.startConnection(port, worldX, worldY, engine);
|
|
452
|
+
return true;
|
|
453
|
+
}
|
|
454
|
+
/** The node's port whose drawn position is nearest `(worldX, worldY)`, or null. */
|
|
455
|
+
nearestPortOnNode(node, worldX, worldY) {
|
|
456
|
+
let best = null;
|
|
457
|
+
let bestDistance = Infinity;
|
|
458
|
+
for (const port of node.getPorts().values()) {
|
|
459
|
+
const p = (0, port_positioning_1.portWorldPosition)(port, node);
|
|
460
|
+
const distance = Math.hypot(worldX - p.x, worldY - p.y);
|
|
461
|
+
if (distance < bestDistance) {
|
|
462
|
+
bestDistance = distance;
|
|
463
|
+
best = port;
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
return best;
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
469
|
+
* Phase 3: Complete connection to target port
|
|
470
|
+
* Phase 5: Enhanced with validation and error handling
|
|
471
|
+
*/
|
|
472
|
+
completeConnection(engine) {
|
|
473
|
+
var _a;
|
|
474
|
+
if (this.isReadonlyEngine(engine))
|
|
475
|
+
return false;
|
|
476
|
+
// Phase 5: Validate state
|
|
477
|
+
if (!this.isConnecting || !this.connectionSourcePort) {
|
|
478
|
+
return false;
|
|
479
|
+
}
|
|
480
|
+
if (!engine) {
|
|
481
|
+
console.warn('Invalid engine in completeConnection');
|
|
482
|
+
this.cancelConnection(engine);
|
|
483
|
+
return false;
|
|
484
|
+
}
|
|
485
|
+
try {
|
|
486
|
+
const config = engine.getInteractionConfig();
|
|
487
|
+
const connectionStateManager = engine.getConnectionStateManager();
|
|
488
|
+
let targetPort = this.hoveredPort;
|
|
489
|
+
// Smart mode: Auto-connect to nearest port if dropping on (or near) a node.
|
|
490
|
+
//
|
|
491
|
+
// wave8/culling — Card 2. This used to call `PortModel.findNearestPort`, and
|
|
492
|
+
// it had TWO defects, both of which the spatial index fixes:
|
|
493
|
+
//
|
|
494
|
+
// 1. It searched exactly ONE node — `this.hoveredNode` — because searching
|
|
495
|
+
// more meant walking every node in the diagram. So a drop that landed
|
|
496
|
+
// NEAR a node instead of ON it connected to nothing. `findNearestPort`
|
|
497
|
+
// asks the index, so the search is bounded by the snap radius rather than
|
|
498
|
+
// by the scene, and a near miss now snaps.
|
|
499
|
+
//
|
|
500
|
+
// 2. It measured to the BOUNDING-BOX EDGE MIDPOINT (`getEdgePosition`) while
|
|
501
|
+
// the renderer draws ports shape-aware. On any non-rect silhouette, or any
|
|
502
|
+
// side carrying more than one port, it was snapping to a point several
|
|
503
|
+
// pixels away from the circle the user could see. Wave 6 fixed exactly
|
|
504
|
+
// this divergence for the port hit-test and the magnet — this path was
|
|
505
|
+
// missed. Passing `portWorldPosition` is that fix: hit-test where we draw.
|
|
506
|
+
// wave12 (gap 3): Easy Connect makes the whole TARGET node a handle too. A
|
|
507
|
+
// release ANYWHERE over a node body — not just within the ~24px port-snap
|
|
508
|
+
// radius smart mode uses — resolves the node under the cursor and picks its
|
|
509
|
+
// nearest port. That is the difference from smart auto-connect: smart snaps
|
|
510
|
+
// to a port near the drop; easy-connect accepts the node's whole silhouette.
|
|
511
|
+
const smartAutoConnect = config.mode === 'smart' && config.enableSmartAutoConnect;
|
|
512
|
+
if (!targetPort && (smartAutoConnect || config.enableEasyConnect)) {
|
|
513
|
+
const diagram = engine.getDiagram();
|
|
514
|
+
const dragState = connectionStateManager.getState();
|
|
515
|
+
const pos = dragState.currentMousePosition;
|
|
516
|
+
if (diagram && pos) {
|
|
517
|
+
if (config.enableEasyConnect) {
|
|
518
|
+
const sourceNode = this.connectionSourcePort
|
|
519
|
+
? diagram.getNodeByPortId(this.connectionSourcePort.id)
|
|
520
|
+
: null;
|
|
521
|
+
const overNode = diagram.getNodeAtPosition(pos.x, pos.y);
|
|
522
|
+
if (overNode && overNode.id !== (sourceNode === null || sourceNode === void 0 ? void 0 : sourceNode.id)) {
|
|
523
|
+
// Body-to-body: neither end named a port, so pick the NEAREST PAIR
|
|
524
|
+
// across the two nodes — a centre press used to tie all four source
|
|
525
|
+
// ports and 'top' won by iteration order, wiring side-by-side nodes
|
|
526
|
+
// top→top as a long arc over both (live audit; the obvious wire is
|
|
527
|
+
// right→left). An explicit source press near a specific port still
|
|
528
|
+
// wins: we only re-seed when the pair's source genuinely differs.
|
|
529
|
+
if (sourceNode) {
|
|
530
|
+
let bestSource = null;
|
|
531
|
+
let bestTarget = null;
|
|
532
|
+
let bestDistance = Infinity;
|
|
533
|
+
for (const s of sourceNode.getPorts().values()) {
|
|
534
|
+
const sp = (0, port_positioning_1.portWorldPosition)(s, sourceNode);
|
|
535
|
+
for (const t of overNode.getPorts().values()) {
|
|
536
|
+
const tp = (0, port_positioning_1.portWorldPosition)(t, overNode);
|
|
537
|
+
const d = Math.hypot(sp.x - tp.x, sp.y - tp.y);
|
|
538
|
+
if (d < bestDistance) {
|
|
539
|
+
bestDistance = d;
|
|
540
|
+
bestSource = s;
|
|
541
|
+
bestTarget = t;
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
if (bestSource && bestTarget) {
|
|
546
|
+
if (bestSource !== this.connectionSourcePort) {
|
|
547
|
+
// Re-seed the in-flight connection from the pair's source so
|
|
548
|
+
// validation and the committed link both use it.
|
|
549
|
+
connectionStateManager.startConnection(bestSource, pos);
|
|
550
|
+
this.connectionSourcePort = bestSource;
|
|
551
|
+
}
|
|
552
|
+
targetPort = bestTarget;
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
if (!targetPort) {
|
|
556
|
+
targetPort = this.nearestPortOnNode(overNode, pos.x, pos.y);
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
}
|
|
560
|
+
// Smart-mode port snap (also the fallback when easy-connect found no node).
|
|
561
|
+
if (!targetPort && smartAutoConnect) {
|
|
562
|
+
const hit = diagram.findNearestPort(pos, {
|
|
563
|
+
portPosition: (port, node) => (0, port_positioning_1.portWorldPosition)(port, node),
|
|
564
|
+
});
|
|
565
|
+
targetPort = (_a = hit === null || hit === void 0 ? void 0 : hit.port) !== null && _a !== void 0 ? _a : null;
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
// Complete connection if we have a valid target port
|
|
570
|
+
let success = false;
|
|
571
|
+
if (targetPort) {
|
|
572
|
+
const result = connectionStateManager.completeConnection(targetPort);
|
|
573
|
+
success = result.success;
|
|
574
|
+
if (success) {
|
|
575
|
+
console.debug('✅ Connection completed:', this.connectionSourcePort.id, '->', targetPort.id);
|
|
576
|
+
}
|
|
577
|
+
else {
|
|
578
|
+
console.log('❌ Connection failed: Invalid connection');
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
// Cleanup
|
|
582
|
+
this.cancelConnection(engine);
|
|
583
|
+
return success;
|
|
584
|
+
}
|
|
585
|
+
catch (error) {
|
|
586
|
+
// Phase 5: Error recovery
|
|
587
|
+
console.error('Error completing connection:', error);
|
|
588
|
+
this.cancelConnection(engine);
|
|
589
|
+
return false;
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
/**
|
|
593
|
+
* Phase 3: Cancel connection
|
|
594
|
+
*/
|
|
595
|
+
cancelConnection(engine) {
|
|
596
|
+
if (!this.isConnecting) {
|
|
597
|
+
return;
|
|
598
|
+
}
|
|
599
|
+
const connectionStateManager = engine.getConnectionStateManager();
|
|
600
|
+
connectionStateManager.cancelConnection();
|
|
601
|
+
this.isConnecting = false;
|
|
602
|
+
this.connectionSourcePort = null;
|
|
603
|
+
// Clear port highlights
|
|
604
|
+
this.clearPortHighlights(engine);
|
|
605
|
+
console.debug('🚫 Connection cancelled');
|
|
606
|
+
}
|
|
607
|
+
/**
|
|
608
|
+
* Phase 3 / Wave 2: Start link reconnection.
|
|
609
|
+
*
|
|
610
|
+
* Enters endpoint-drag mode: the dragged endpoint follows the cursor while
|
|
611
|
+
* the OTHER endpoint stays put. Seeds the engine's {@link ReconnectionPreview}
|
|
612
|
+
* so the renderer can draw a ghost link, and primes port validity highlights.
|
|
613
|
+
*/
|
|
614
|
+
startLinkReconnection(link, endpoint, worldX, worldY, engine) {
|
|
615
|
+
this.isReconnectingLink = true;
|
|
616
|
+
this.reconnectingLink = link;
|
|
617
|
+
this.reconnectingEndpoint = endpoint;
|
|
618
|
+
this.reconnectingMousePoint = { x: worldX, y: worldY };
|
|
619
|
+
// Select the endpoint on the link
|
|
620
|
+
if (endpoint === 'source') {
|
|
621
|
+
link.selectSourceEndpoint();
|
|
622
|
+
}
|
|
623
|
+
else {
|
|
624
|
+
link.selectTargetEndpoint();
|
|
625
|
+
}
|
|
626
|
+
// Seed the live preview + validity highlights.
|
|
627
|
+
engine.setReconnectionPreview({
|
|
628
|
+
linkId: link.id,
|
|
629
|
+
endpoint,
|
|
630
|
+
mousePoint: { x: worldX, y: worldY },
|
|
631
|
+
isValid: false,
|
|
632
|
+
});
|
|
633
|
+
this.updateReconnectPortHighlights(engine);
|
|
634
|
+
console.debug(`🔗 Link reconnection started: ${endpoint} endpoint of link ${link.id}`);
|
|
635
|
+
}
|
|
636
|
+
/**
|
|
637
|
+
* Wave 2: Update the in-progress endpoint reconnection as the cursor moves.
|
|
638
|
+
*
|
|
639
|
+
* Refreshes the ghost-preview endpoint, recomputes which ports are valid drop
|
|
640
|
+
* targets (highlighting them), and reflects whether the currently hovered
|
|
641
|
+
* port would be accepted. Returns true when a re-render is warranted.
|
|
642
|
+
*/
|
|
643
|
+
updateLinkReconnection(worldX, worldY, engine) {
|
|
644
|
+
if (!this.isReconnectingLink || !this.reconnectingLink || !this.reconnectingEndpoint) {
|
|
645
|
+
return false;
|
|
646
|
+
}
|
|
647
|
+
if (!isFinite(worldX) || !isFinite(worldY)) {
|
|
648
|
+
return false;
|
|
649
|
+
}
|
|
650
|
+
this.reconnectingMousePoint = { x: worldX, y: worldY };
|
|
651
|
+
// Is the port under the cursor (if any) a legal drop target?
|
|
652
|
+
const isValid = !!(this.hoveredPort &&
|
|
653
|
+
this.isValidReconnectionTarget(this.reconnectingLink, this.reconnectingEndpoint, this.hoveredPort, engine));
|
|
654
|
+
engine.setReconnectionPreview({
|
|
655
|
+
linkId: this.reconnectingLink.id,
|
|
656
|
+
endpoint: this.reconnectingEndpoint,
|
|
657
|
+
mousePoint: { x: worldX, y: worldY },
|
|
658
|
+
isValid,
|
|
659
|
+
});
|
|
660
|
+
this.updateReconnectPortHighlights(engine);
|
|
661
|
+
return true;
|
|
662
|
+
}
|
|
663
|
+
/**
|
|
664
|
+
* Wave 2: Is `candidatePort` a legal target for reconnecting `endpoint` of
|
|
665
|
+
* `link`? The OTHER endpoint's port stays fixed; the candidate must differ
|
|
666
|
+
* from it, live on a different node, be type-compatible (input↔output, or a
|
|
667
|
+
* bidirectional port), and satisfy the connection-group rules. Pure w.r.t.
|
|
668
|
+
* the passed models — the core of the reconnect-validation tests.
|
|
669
|
+
*/
|
|
670
|
+
isValidReconnectionTarget(link, endpoint, candidatePort, engine) {
|
|
671
|
+
const diagram = engine.getDiagram();
|
|
672
|
+
if (!diagram)
|
|
673
|
+
return false;
|
|
674
|
+
// The stationary endpoint's port is the one that must stay connected.
|
|
675
|
+
const fixedPortId = endpoint === 'source' ? link.targetPortId : link.sourcePortId;
|
|
676
|
+
const fixedPort = diagram.getPortById(fixedPortId);
|
|
677
|
+
if (!fixedPort)
|
|
678
|
+
return false;
|
|
679
|
+
// Can't drop back onto the fixed port, or onto its own node.
|
|
680
|
+
if (candidatePort.id === fixedPortId)
|
|
681
|
+
return false;
|
|
682
|
+
const candidateNode = diagram.getNodeByPortId(candidatePort.id);
|
|
683
|
+
const fixedNode = diagram.getNodeByPortId(fixedPortId);
|
|
684
|
+
if (!candidateNode || !fixedNode)
|
|
685
|
+
return false;
|
|
686
|
+
if (candidateNode.id === fixedNode.id)
|
|
687
|
+
return false;
|
|
688
|
+
// Type compatibility: directional ports can't share a direction; a
|
|
689
|
+
// bidirectional ('bi') port on either side lifts the restriction.
|
|
690
|
+
const isBi = (p) => p.type === 'bi';
|
|
691
|
+
if (!isBi(fixedPort) && !isBi(candidatePort) && fixedPort.type === candidatePort.type) {
|
|
692
|
+
return false;
|
|
693
|
+
}
|
|
694
|
+
// Connection-group restriction (same seam the new-link flow validates on).
|
|
695
|
+
return (0, engine_1.isConnectionAllowedByGroup)(fixedPort, candidatePort, engine);
|
|
696
|
+
}
|
|
697
|
+
/**
|
|
698
|
+
* Wave 2: Highlight ports as valid/invalid drop targets during an endpoint
|
|
699
|
+
* reconnection. Mirrors {@link updatePortHighlights} but uses the reconnect
|
|
700
|
+
* validity rule instead of the {@link ConnectionStateManager} valid-target set
|
|
701
|
+
* (which is empty during reconnection).
|
|
702
|
+
*/
|
|
703
|
+
updateReconnectPortHighlights(engine) {
|
|
704
|
+
const diagram = engine.getDiagram();
|
|
705
|
+
if (!diagram || !this.reconnectingLink || !this.reconnectingEndpoint)
|
|
706
|
+
return;
|
|
707
|
+
diagram.getNodes().forEach((node) => {
|
|
708
|
+
node.getPorts().forEach((port) => {
|
|
709
|
+
const valid = this.isValidReconnectionTarget(this.reconnectingLink, this.reconnectingEndpoint, port, engine);
|
|
710
|
+
const highlighted = valid && port === this.hoveredPort;
|
|
711
|
+
if (port.isValidTarget !== valid || port.isHighlighted !== highlighted) {
|
|
712
|
+
node.markDirty('port-highlight');
|
|
713
|
+
}
|
|
714
|
+
port.isValidTarget = valid;
|
|
715
|
+
port.isHighlighted = highlighted;
|
|
716
|
+
});
|
|
717
|
+
});
|
|
718
|
+
}
|
|
719
|
+
/**
|
|
720
|
+
* Phase 3 / Wave 2: Complete link reconnection.
|
|
721
|
+
*
|
|
722
|
+
* Drops the dragged endpoint on the hovered port. Rejects (and restores the
|
|
723
|
+
* original connection) when there is no port under the cursor or the port
|
|
724
|
+
* fails {@link isValidReconnectionTarget}.
|
|
725
|
+
*/
|
|
726
|
+
completeLinkReconnection(engine) {
|
|
727
|
+
var _a, _b;
|
|
728
|
+
if (this.isReadonlyEngine(engine))
|
|
729
|
+
return false;
|
|
730
|
+
if (!this.isReconnectingLink || !this.reconnectingLink || !this.reconnectingEndpoint) {
|
|
731
|
+
return false;
|
|
732
|
+
}
|
|
733
|
+
const targetPort = this.hoveredPort;
|
|
734
|
+
// Reject: no drop target, or an invalid one → restore original connection.
|
|
735
|
+
if (!targetPort ||
|
|
736
|
+
!this.isValidReconnectionTarget(this.reconnectingLink, this.reconnectingEndpoint, targetPort, engine)) {
|
|
737
|
+
console.debug('🚫 Link reconnection rejected: no valid target port');
|
|
738
|
+
this.cancelLinkReconnection(engine);
|
|
739
|
+
return false;
|
|
740
|
+
}
|
|
741
|
+
// Reconnect to new port
|
|
742
|
+
const diagram = engine.getDiagram();
|
|
743
|
+
if (!diagram) {
|
|
744
|
+
this.cancelLinkReconnection(engine);
|
|
745
|
+
return false;
|
|
746
|
+
}
|
|
747
|
+
// Find the node that owns the target port
|
|
748
|
+
let targetNode;
|
|
749
|
+
for (const node of diagram.getNodes()) {
|
|
750
|
+
if (node.getPort(targetPort.id)) {
|
|
751
|
+
targetNode = node;
|
|
752
|
+
break;
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
if (!targetNode) {
|
|
756
|
+
console.log('❌ Link reconnection failed: Target node not found');
|
|
757
|
+
this.cancelLinkReconnection(engine);
|
|
758
|
+
return false;
|
|
759
|
+
}
|
|
760
|
+
// wave12: capture the OLD endpoint before mutating, so the reconnect is undoable. The
|
|
761
|
+
// link still holds its original endpoint here — the reconnect call is on the next line.
|
|
762
|
+
const endpoint = this.reconnectingEndpoint;
|
|
763
|
+
const oldPortId = endpoint === 'source'
|
|
764
|
+
? this.reconnectingLink.sourcePortId
|
|
765
|
+
: this.reconnectingLink.targetPortId;
|
|
766
|
+
const oldNodeId = endpoint === 'source'
|
|
767
|
+
? this.reconnectingLink.sourceNodeId
|
|
768
|
+
: this.reconnectingLink.targetNodeId;
|
|
769
|
+
// Reconnect the link (live).
|
|
770
|
+
if (endpoint === 'source') {
|
|
771
|
+
this.reconnectingLink.reconnectSource(targetPort.id, targetNode.id);
|
|
772
|
+
}
|
|
773
|
+
else {
|
|
774
|
+
this.reconnectingLink.reconnectTarget(targetPort.id, targetNode.id);
|
|
775
|
+
}
|
|
776
|
+
// …and record it as one undoable step. execute() re-applies the already-current new
|
|
777
|
+
// endpoint (a no-op); undo restores the old. Only when the endpoint actually changed.
|
|
778
|
+
if (oldPortId !== targetPort.id) {
|
|
779
|
+
void engine.commandManager.execute(new engine_1.ReconnectLinkCommand(this.reconnectingLink.id, endpoint, targetPort.id, targetNode.id, oldPortId, oldNodeId));
|
|
780
|
+
}
|
|
781
|
+
// Recalculate link path
|
|
782
|
+
const reconnectedSourceNode = this.findNodeForPort(this.reconnectingLink.sourcePortId, diagram);
|
|
783
|
+
const reconnectedTargetNode = this.findNodeForPort(this.reconnectingLink.targetPortId, diagram);
|
|
784
|
+
if (reconnectedSourceNode && reconnectedTargetNode) {
|
|
785
|
+
const sourcePort = reconnectedSourceNode.getPort(this.reconnectingLink.sourcePortId);
|
|
786
|
+
const reconnectedTargetPort = reconnectedTargetNode.getPort(this.reconnectingLink.targetPortId);
|
|
787
|
+
if (sourcePort && reconnectedTargetPort) {
|
|
788
|
+
const sourceBounds = reconnectedSourceNode.getBoundingBox();
|
|
789
|
+
const targetBounds = reconnectedTargetNode.getBoundingBox();
|
|
790
|
+
const sourcePoint = sourcePort.getAbsolutePosition(sourceBounds);
|
|
791
|
+
const targetPoint = reconnectedTargetPort.getAbsolutePosition(targetBounds);
|
|
792
|
+
// Get port directions for orthogonal routing
|
|
793
|
+
const sourceDirection = (_a = sourcePort.alignment) === null || _a === void 0 ? void 0 : _a.side;
|
|
794
|
+
const targetDirection = (_b = reconnectedTargetPort.alignment) === null || _b === void 0 ? void 0 : _b.side;
|
|
795
|
+
this.reconnectingLink.generatePath(sourcePoint, targetPoint, sourceDirection, targetDirection);
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
console.debug(`✅ Link reconnected: ${this.reconnectingEndpoint} endpoint to port ${targetPort.id}`);
|
|
799
|
+
// Cleanup (clears preview + highlights + state)
|
|
800
|
+
this.resetReconnectionState(engine);
|
|
801
|
+
return true;
|
|
802
|
+
}
|
|
803
|
+
/**
|
|
804
|
+
* Wave 2: Cancel an in-progress endpoint reconnection, restoring the link to
|
|
805
|
+
* its original connection. Safe to call when not reconnecting.
|
|
806
|
+
*/
|
|
807
|
+
cancelLinkReconnection(engine) {
|
|
808
|
+
if (!this.isReconnectingLink)
|
|
809
|
+
return;
|
|
810
|
+
this.resetReconnectionState(engine);
|
|
811
|
+
console.debug('🚫 Link reconnection cancelled');
|
|
812
|
+
}
|
|
813
|
+
/**
|
|
814
|
+
* Wave 2: Tear down all reconnection state — deselect the link's endpoints,
|
|
815
|
+
* clear the engine preview, and clear port highlights.
|
|
816
|
+
*/
|
|
817
|
+
resetReconnectionState(engine) {
|
|
818
|
+
var _a;
|
|
819
|
+
(_a = this.reconnectingLink) === null || _a === void 0 ? void 0 : _a.deselectEndpoints();
|
|
820
|
+
this.isReconnectingLink = false;
|
|
821
|
+
this.reconnectingLink = null;
|
|
822
|
+
this.reconnectingEndpoint = null;
|
|
823
|
+
this.reconnectingMousePoint = null;
|
|
824
|
+
engine.setReconnectionPreview(null);
|
|
825
|
+
this.clearPortHighlights(engine);
|
|
826
|
+
}
|
|
827
|
+
// ============================================================================
|
|
828
|
+
// Wave 2 (Edges & links): inline label drag-reposition
|
|
829
|
+
// ============================================================================
|
|
830
|
+
/**
|
|
831
|
+
* Wave 2: Map a dragged world point to a model-space label placement.
|
|
832
|
+
*
|
|
833
|
+
* Returns the `{ position, offset }` to store on the label such that the
|
|
834
|
+
* renderer draws it exactly under the cursor now AND it sticks to the same
|
|
835
|
+
* fraction of the path after re-routing:
|
|
836
|
+
* - `position` (0-1) = closest point on the path to the cursor;
|
|
837
|
+
* - `offset` = cursor − on-path anchor at `position`.
|
|
838
|
+
*
|
|
839
|
+
* The offset is measured against the SAME anchor the renderer uses
|
|
840
|
+
* ({@link LinkModel.getPointAtPosition}), so `getPointAtPosition(position) +
|
|
841
|
+
* offset` reproduces the cursor by construction. Falls back to a direct
|
|
842
|
+
* polyline projection over `link.points` when the model has no segments
|
|
843
|
+
* (renderers sync `points` but leave `segments` stale). Returns null when the
|
|
844
|
+
* link has no drawable path.
|
|
845
|
+
*/
|
|
846
|
+
computeLabelDragUpdate(link, worldPoint) {
|
|
847
|
+
var _a, _b;
|
|
848
|
+
const points = link.points;
|
|
849
|
+
if (!points || points.length < 2)
|
|
850
|
+
return null;
|
|
851
|
+
// Preferred: model's own segment-based projection.
|
|
852
|
+
let t = (_b = (_a = link.getClosestPoint(worldPoint)) === null || _a === void 0 ? void 0 : _a.t) !== null && _b !== void 0 ? _b : null;
|
|
853
|
+
// Fallback: project onto the raw points polyline (mirrors the polyline
|
|
854
|
+
// fallback in getPointAtPosition, so anchors stay consistent).
|
|
855
|
+
if (t === null) {
|
|
856
|
+
t = this.closestPositionOnPolyline(points, worldPoint);
|
|
857
|
+
}
|
|
858
|
+
if (t === null)
|
|
859
|
+
return null;
|
|
860
|
+
const anchor = link.getPointAtPosition(t);
|
|
861
|
+
if (!anchor)
|
|
862
|
+
return null;
|
|
863
|
+
return {
|
|
864
|
+
position: t,
|
|
865
|
+
offset: { x: worldPoint.x - anchor.x, y: worldPoint.y - anchor.y },
|
|
866
|
+
};
|
|
867
|
+
}
|
|
868
|
+
/**
|
|
869
|
+
* Arc-length position (0-1) of the closest point on a polyline to `query`.
|
|
870
|
+
* Returns null for < 2 points. Matches the parametrization used by
|
|
871
|
+
* {@link LinkModel.getPointAtPosition}'s polyline fallback and the
|
|
872
|
+
* hit-test primitive.
|
|
873
|
+
*/
|
|
874
|
+
closestPositionOnPolyline(points, query) {
|
|
875
|
+
if (points.length < 2)
|
|
876
|
+
return null;
|
|
877
|
+
const segLengths = [];
|
|
878
|
+
let total = 0;
|
|
879
|
+
for (let i = 0; i < points.length - 1; i++) {
|
|
880
|
+
const len = Math.hypot(points[i + 1].x - points[i].x, points[i + 1].y - points[i].y);
|
|
881
|
+
segLengths.push(len);
|
|
882
|
+
total += len;
|
|
883
|
+
}
|
|
884
|
+
if (total <= 0)
|
|
885
|
+
return 0;
|
|
886
|
+
let bestDist = Infinity;
|
|
887
|
+
let bestArc = 0;
|
|
888
|
+
let cumulative = 0;
|
|
889
|
+
for (let i = 0; i < points.length - 1; i++) {
|
|
890
|
+
const a = points[i];
|
|
891
|
+
const b = points[i + 1];
|
|
892
|
+
const dx = b.x - a.x;
|
|
893
|
+
const dy = b.y - a.y;
|
|
894
|
+
const lenSq = dx * dx + dy * dy;
|
|
895
|
+
let s = lenSq === 0 ? 0 : ((query.x - a.x) * dx + (query.y - a.y) * dy) / lenSq;
|
|
896
|
+
s = Math.max(0, Math.min(1, s));
|
|
897
|
+
const cx = a.x + s * dx;
|
|
898
|
+
const cy = a.y + s * dy;
|
|
899
|
+
const dist = Math.hypot(query.x - cx, query.y - cy);
|
|
900
|
+
if (dist < bestDist) {
|
|
901
|
+
bestDist = dist;
|
|
902
|
+
bestArc = cumulative + s * segLengths[i];
|
|
903
|
+
}
|
|
904
|
+
cumulative += segLengths[i];
|
|
905
|
+
}
|
|
906
|
+
return bestArc / total;
|
|
907
|
+
}
|
|
908
|
+
/**
|
|
909
|
+
* Wave 2: Begin dragging label `labelIndex` of `link`.
|
|
910
|
+
*/
|
|
911
|
+
startLabelDrag(link, labelIndex) {
|
|
912
|
+
this.isDraggingLabel = true;
|
|
913
|
+
this.editingLabelLink = link;
|
|
914
|
+
this.editingLabelIndex = labelIndex;
|
|
915
|
+
console.log(`🏷️ Started dragging label ${labelIndex} on link ${link.id}`);
|
|
916
|
+
}
|
|
917
|
+
/**
|
|
918
|
+
* Wave 2: Move the dragging label to follow the cursor. Writes the remapped
|
|
919
|
+
* `{ position, offset }` back onto the model so the label survives re-routing.
|
|
920
|
+
* Returns true when a re-render is warranted.
|
|
921
|
+
*/
|
|
922
|
+
moveLabelDrag(worldX, worldY) {
|
|
923
|
+
if (this.isReadonlyLink(this.editingLabelLink))
|
|
924
|
+
return false;
|
|
925
|
+
if (!this.isDraggingLabel || !this.editingLabelLink || this.editingLabelIndex === null) {
|
|
926
|
+
return false;
|
|
927
|
+
}
|
|
928
|
+
if (!isFinite(worldX) || !isFinite(worldY)) {
|
|
929
|
+
return false;
|
|
930
|
+
}
|
|
931
|
+
const update = this.computeLabelDragUpdate(this.editingLabelLink, { x: worldX, y: worldY });
|
|
932
|
+
if (!update)
|
|
933
|
+
return false;
|
|
934
|
+
this.editingLabelLink.updateLabel(this.editingLabelIndex, update);
|
|
935
|
+
this.editingLabelLink.markDirty('label-dragged');
|
|
936
|
+
return true;
|
|
937
|
+
}
|
|
938
|
+
/**
|
|
939
|
+
* Wave 2: End the label drag.
|
|
940
|
+
*/
|
|
941
|
+
endLabelDrag() {
|
|
942
|
+
var _a;
|
|
943
|
+
if (this.isDraggingLabel) {
|
|
944
|
+
console.log(`🏷️ Ended dragging label ${this.editingLabelIndex} on link ${(_a = this.editingLabelLink) === null || _a === void 0 ? void 0 : _a.id}`);
|
|
945
|
+
}
|
|
946
|
+
this.isDraggingLabel = false;
|
|
947
|
+
this.editingLabelLink = null;
|
|
948
|
+
this.editingLabelIndex = null;
|
|
949
|
+
}
|
|
950
|
+
/**
|
|
951
|
+
* Phase 3: Handle link selection
|
|
952
|
+
* FIXED: Support multi-select with Ctrl key, deselect other links otherwise
|
|
953
|
+
*/
|
|
954
|
+
selectLink(link, engine, multiSelect = false) {
|
|
955
|
+
const diagram = engine.getDiagram();
|
|
956
|
+
if (!diagram)
|
|
957
|
+
return;
|
|
958
|
+
if (!multiSelect) {
|
|
959
|
+
// Clear node selections
|
|
960
|
+
diagram.clearSelection();
|
|
961
|
+
// Deselect all other links
|
|
962
|
+
diagram.getLinks().forEach((l) => {
|
|
963
|
+
if (l.id !== link.id && l.state === 'selected') {
|
|
964
|
+
l.setState('default');
|
|
965
|
+
}
|
|
966
|
+
});
|
|
967
|
+
}
|
|
968
|
+
// Toggle or select this link
|
|
969
|
+
if (multiSelect && link.state === 'selected') {
|
|
970
|
+
link.setState('default');
|
|
971
|
+
console.debug('🔗 Link deselected:', link.id);
|
|
972
|
+
}
|
|
973
|
+
else {
|
|
974
|
+
link.setState('selected');
|
|
975
|
+
console.debug('🔗 Link selected:', link.id);
|
|
976
|
+
}
|
|
977
|
+
}
|
|
978
|
+
/**
|
|
979
|
+
* Phase 3: Delete selected link
|
|
980
|
+
*/
|
|
981
|
+
deleteSelectedLink(engine) {
|
|
982
|
+
if (this.isReadonlyEngine(engine))
|
|
983
|
+
return false;
|
|
984
|
+
const diagram = engine.getDiagram();
|
|
985
|
+
if (!diagram)
|
|
986
|
+
return false;
|
|
987
|
+
// Find selected link
|
|
988
|
+
const selectedLink = diagram.getLinks().find((link) => link.state === 'selected');
|
|
989
|
+
if (!selectedLink)
|
|
990
|
+
return false;
|
|
991
|
+
// Remove the link
|
|
992
|
+
diagram.removeLink(selectedLink.id);
|
|
993
|
+
console.log('🗑️ Link deleted:', selectedLink.id);
|
|
994
|
+
return true;
|
|
995
|
+
}
|
|
996
|
+
/**
|
|
997
|
+
* Find link at world position (public wrapper for hit testing)
|
|
998
|
+
* Used for direct link selection without requiring hover state
|
|
999
|
+
*/
|
|
1000
|
+
getLinkAtPosition(worldX, worldY, engine) {
|
|
1001
|
+
const diagram = engine.getDiagram();
|
|
1002
|
+
if (!diagram)
|
|
1003
|
+
return null;
|
|
1004
|
+
return this.findLinkAtPosition(worldX, worldY, diagram);
|
|
1005
|
+
}
|
|
1006
|
+
/**
|
|
1007
|
+
* Part-aware public wrapper: like {@link getLinkAtPosition} but also reports
|
|
1008
|
+
* WHICH sub-part of the link was hit (body / label / endpoint / arrow) plus
|
|
1009
|
+
* local info. Foundation for later edge cards (label editing, endpoint
|
|
1010
|
+
* reconnection, edge toolbar placement).
|
|
1011
|
+
*/
|
|
1012
|
+
getLinkHitAtPosition(worldX, worldY, engine) {
|
|
1013
|
+
const diagram = engine.getDiagram();
|
|
1014
|
+
if (!diagram)
|
|
1015
|
+
return null;
|
|
1016
|
+
return this.findLinkHitAtPosition(worldX, worldY, diagram);
|
|
1017
|
+
}
|
|
1018
|
+
/**
|
|
1019
|
+
* Phase 3: Get current interaction state
|
|
1020
|
+
*/
|
|
1021
|
+
getState() {
|
|
1022
|
+
return {
|
|
1023
|
+
isConnecting: this.isConnecting,
|
|
1024
|
+
isReconnectingLink: this.isReconnectingLink,
|
|
1025
|
+
reconnectingEndpoint: this.reconnectingEndpoint,
|
|
1026
|
+
reconnectingLink: this.reconnectingLink,
|
|
1027
|
+
hoveredNode: this.hoveredNode,
|
|
1028
|
+
hoveredPort: this.hoveredPort,
|
|
1029
|
+
hoveredLink: this.hoveredLink,
|
|
1030
|
+
// Wave 2: Label drag-reposition state
|
|
1031
|
+
isDraggingLabel: this.isDraggingLabel,
|
|
1032
|
+
editingLabelLink: this.editingLabelLink,
|
|
1033
|
+
editingLabelIndex: this.editingLabelIndex,
|
|
1034
|
+
// Phase 2.3a: Waypoint editing state
|
|
1035
|
+
isDraggingWaypoint: this.isDraggingWaypoint,
|
|
1036
|
+
editingLink: this.editingLink,
|
|
1037
|
+
editingWaypointIndex: this.editingWaypointIndex,
|
|
1038
|
+
hoveredWaypointIndex: this.hoveredWaypointIndex,
|
|
1039
|
+
hoveredWaypointLink: this.hoveredWaypointLink,
|
|
1040
|
+
// Phase 2.3b: Control point editing state
|
|
1041
|
+
isDraggingControlPoint: this.isDraggingControlPoint,
|
|
1042
|
+
editingControlPointLink: this.editingControlPointLink,
|
|
1043
|
+
editingControlPointSegmentIndex: this.editingControlPointSegmentIndex,
|
|
1044
|
+
editingControlPointType: this.editingControlPointType,
|
|
1045
|
+
hoveredControlPointSegmentIndex: this.hoveredControlPointSegmentIndex,
|
|
1046
|
+
hoveredControlPointType: this.hoveredControlPointType,
|
|
1047
|
+
hoveredControlPointLink: this.hoveredControlPointLink,
|
|
1048
|
+
};
|
|
1049
|
+
}
|
|
1050
|
+
/**
|
|
1051
|
+
* Phase 3: Check if currently interacting
|
|
1052
|
+
*/
|
|
1053
|
+
isInteracting() {
|
|
1054
|
+
return this.isConnecting || this.isReconnectingLink || this.isDraggingWaypoint || this.isDraggingControlPoint || this.isDraggingLabel;
|
|
1055
|
+
}
|
|
1056
|
+
/**
|
|
1057
|
+
* Phase 3: Get appropriate cursor for current state
|
|
1058
|
+
*/
|
|
1059
|
+
getCursor(engine) {
|
|
1060
|
+
if (this.isConnecting) {
|
|
1061
|
+
return 'crosshair';
|
|
1062
|
+
}
|
|
1063
|
+
if (this.isReconnectingLink) {
|
|
1064
|
+
return 'move';
|
|
1065
|
+
}
|
|
1066
|
+
if (this.hoveredPort) {
|
|
1067
|
+
return 'crosshair';
|
|
1068
|
+
}
|
|
1069
|
+
if (this.hoveredLink) {
|
|
1070
|
+
const config = engine.getInteractionConfig();
|
|
1071
|
+
if (config.enableLinkReconnection && this.hoveredLink.state === 'selected') {
|
|
1072
|
+
return 'pointer';
|
|
1073
|
+
}
|
|
1074
|
+
return 'pointer';
|
|
1075
|
+
}
|
|
1076
|
+
if (this.hoveredNode) {
|
|
1077
|
+
const config = engine.getInteractionConfig();
|
|
1078
|
+
if (config.mode === 'deliberate') {
|
|
1079
|
+
// In deliberate mode, only show move cursor if node is selected
|
|
1080
|
+
return this.hoveredNode.isSelected() ? 'move' : 'pointer';
|
|
1081
|
+
}
|
|
1082
|
+
return this.hoveredNode.isDraggable() ? 'pointer' : 'default';
|
|
1083
|
+
}
|
|
1084
|
+
return 'default';
|
|
1085
|
+
}
|
|
1086
|
+
// Private helper methods
|
|
1087
|
+
/**
|
|
1088
|
+
* Find port at world position
|
|
1089
|
+
* Phase 5: Optimized with performance monitoring and early exit
|
|
1090
|
+
* CRITICAL FIX: Accept engine parameter instead of calling diagram.getEngine()
|
|
1091
|
+
*/
|
|
1092
|
+
findPortAtPosition(worldX, worldY, diagram, engine) {
|
|
1093
|
+
var _a, _b, _c;
|
|
1094
|
+
// Phase 5: Performance monitoring
|
|
1095
|
+
const startTime = performance.now();
|
|
1096
|
+
try {
|
|
1097
|
+
const config = engine.getInteractionConfig();
|
|
1098
|
+
const portRadius = config.portDefaultRadius * config.portHoverScaleFactor;
|
|
1099
|
+
// + hitSlop: touch-sized targets (Wave 9 Card 2). 0 for a mouse.
|
|
1100
|
+
const hitRadius = portRadius + 2 + this.hitSlop; // Add 2px tolerance
|
|
1101
|
+
// Phase 5: Optimization - early exit if no nodes
|
|
1102
|
+
const nodes = diagram.getNodes();
|
|
1103
|
+
if (!nodes || nodes.length === 0) {
|
|
1104
|
+
return null;
|
|
1105
|
+
}
|
|
1106
|
+
for (const node of nodes) {
|
|
1107
|
+
// A drag-handle node is chrome: its ports are not hoverable, so a wire
|
|
1108
|
+
// can never START there (the rules also refuse it as a TARGET).
|
|
1109
|
+
if (((_b = (_a = node.behavior) === null || _a === void 0 ? void 0 : _a.dragHandler) === null || _b === void 0 ? void 0 : _b.isDragHandler) === true)
|
|
1110
|
+
continue;
|
|
1111
|
+
// connectable:false — the rules refuse this node as source AND target,
|
|
1112
|
+
// and the renderer paints no glyph for it (shouldRenderPort). Hovering
|
|
1113
|
+
// must agree, or an invisible port would still grab the cursor and
|
|
1114
|
+
// start a wire the engine then refuses. Dashboard tiles are the case.
|
|
1115
|
+
if (((_c = node.behavior) === null || _c === void 0 ? void 0 : _c.connectable) === false)
|
|
1116
|
+
continue;
|
|
1117
|
+
// CRITICAL FIX: Always check for port hits regardless of visibility mode
|
|
1118
|
+
// Visibility affects RENDERING, not HIT DETECTION
|
|
1119
|
+
// This fixes the chicken-and-egg problem where ports couldn't be hovered
|
|
1120
|
+
// because the node wasn't hovered yet
|
|
1121
|
+
// Phase 5: Optimization - rough node bounds check first
|
|
1122
|
+
const nodeBounds = node.getBoundingBox();
|
|
1123
|
+
const nodeExpandedBounds = {
|
|
1124
|
+
left: nodeBounds.left - hitRadius,
|
|
1125
|
+
right: nodeBounds.right + hitRadius,
|
|
1126
|
+
top: nodeBounds.top - hitRadius,
|
|
1127
|
+
bottom: nodeBounds.bottom + hitRadius,
|
|
1128
|
+
};
|
|
1129
|
+
// Skip node if mouse is not even near it
|
|
1130
|
+
if (worldX < nodeExpandedBounds.left ||
|
|
1131
|
+
worldX > nodeExpandedBounds.right ||
|
|
1132
|
+
worldY < nodeExpandedBounds.top ||
|
|
1133
|
+
worldY > nodeExpandedBounds.bottom) {
|
|
1134
|
+
continue;
|
|
1135
|
+
}
|
|
1136
|
+
const portsMap = node.getPorts();
|
|
1137
|
+
const ports = Array.from(portsMap.values());
|
|
1138
|
+
for (const port of ports) {
|
|
1139
|
+
// Wave 6 BUG FIX: this used `port.getAbsolutePosition(nodeBounds)`,
|
|
1140
|
+
// which walks the BOUNDING BOX and lands on an edge midpoint — while
|
|
1141
|
+
// the renderer draws the port with `getPortPositionForShape`. On any
|
|
1142
|
+
// non-rect shape, and on any side with more than one port, the hit
|
|
1143
|
+
// circle sat several pixels away from the glyph: you clicked the port
|
|
1144
|
+
// you could see and hit nothing. Hit-test where you DRAW.
|
|
1145
|
+
const portPos = (0, port_positioning_1.portWorldPosition)(port, node);
|
|
1146
|
+
// Check if mouse is within port radius
|
|
1147
|
+
const dx = worldX - portPos.x;
|
|
1148
|
+
const dy = worldY - portPos.y;
|
|
1149
|
+
const distanceSquared = dx * dx + dy * dy;
|
|
1150
|
+
// Phase 5: Optimization - compare squared distances to avoid sqrt
|
|
1151
|
+
if (distanceSquared <= hitRadius * hitRadius) {
|
|
1152
|
+
// Occlusion: a port whose anchor a higher node covers is not in
|
|
1153
|
+
// the picture (the renderer hides it via the same oracle) — it
|
|
1154
|
+
// must not win the hover/press race THROUGH the covering node.
|
|
1155
|
+
if (typeof diagram.isPointCoveredAbove === 'function' &&
|
|
1156
|
+
diagram.isPointCoveredAbove(portPos.x, portPos.y, node.id)) {
|
|
1157
|
+
continue;
|
|
1158
|
+
}
|
|
1159
|
+
return port;
|
|
1160
|
+
}
|
|
1161
|
+
}
|
|
1162
|
+
}
|
|
1163
|
+
return null;
|
|
1164
|
+
}
|
|
1165
|
+
finally {
|
|
1166
|
+
// Phase 5: Track performance
|
|
1167
|
+
this.performanceMetrics.portHitTestTime = performance.now() - startTime;
|
|
1168
|
+
}
|
|
1169
|
+
}
|
|
1170
|
+
/**
|
|
1171
|
+
* Find link at world position.
|
|
1172
|
+
*
|
|
1173
|
+
* Backward-compatible thin wrapper over {@link findLinkHitAtPosition}:
|
|
1174
|
+
* existing callers that only ask "which link (if any) is under the cursor?"
|
|
1175
|
+
* keep getting a `LinkModel | null`. Use `findLinkHitAtPosition` /
|
|
1176
|
+
* `getLinkHitAtPosition` when you need to know WHICH sub-part was hit.
|
|
1177
|
+
*/
|
|
1178
|
+
findLinkAtPosition(worldX, worldY, diagram) {
|
|
1179
|
+
var _a, _b;
|
|
1180
|
+
return (_b = (_a = this.findLinkHitAtPosition(worldX, worldY, diagram)) === null || _a === void 0 ? void 0 : _a.link) !== null && _b !== void 0 ? _b : null;
|
|
1181
|
+
}
|
|
1182
|
+
/**
|
|
1183
|
+
* Part-aware link hit-test.
|
|
1184
|
+
*
|
|
1185
|
+
* Reports the link under the cursor AND which sub-part of it was hit
|
|
1186
|
+
* (body / label / source|target-endpoint / source|target-arrow) plus local
|
|
1187
|
+
* info: the label index for label hits, or the 0-1 position `t` along the
|
|
1188
|
+
* path for body hits. Delegates the geometry to the pure `hitTestLink`
|
|
1189
|
+
* primitive in `@grafloria/renderer` so the same logic backs both hit paths.
|
|
1190
|
+
*/
|
|
1191
|
+
findLinkHitAtPosition(worldX, worldY, diagram) {
|
|
1192
|
+
var _a, _b;
|
|
1193
|
+
// The cross-backend link grab distance — PER LINK, derived from the same
|
|
1194
|
+
// formula that sizes the painted hit-area stroke (max(config, stroke+8)/2,
|
|
1195
|
+
// floored at DEFAULT_LINK_HIT_TOLERANCE). A flat 5 here left a dead ring
|
|
1196
|
+
// between the DOM hit-area's edge and the accepted press: the cursor and
|
|
1197
|
+
// native focus said "link", the press selected nothing (live report:
|
|
1198
|
+
// "sometimes clicking around the line draws a rectangle").
|
|
1199
|
+
const query = { x: worldX, y: worldY };
|
|
1200
|
+
// NEAREST link wins, not the first in model order. Fan-out siblings share
|
|
1201
|
+
// an anchor and run close together near it: first-in-order let an earlier
|
|
1202
|
+
// sibling take a press landing ON a later sibling's ink (live report:
|
|
1203
|
+
// fan-out edges near the shared source selected their neighbour). Ranked
|
|
1204
|
+
// by body distance (falling back to the part's own distance) because at a
|
|
1205
|
+
// shared anchor every sibling's endpoint HANDLE is equidistant — only the
|
|
1206
|
+
// link actually under the cursor has body distance ~0.
|
|
1207
|
+
let best = null;
|
|
1208
|
+
let bestScore = Infinity;
|
|
1209
|
+
for (const link of diagram.getLinks()) {
|
|
1210
|
+
const points = link.points;
|
|
1211
|
+
if (!points || points.length < 2)
|
|
1212
|
+
continue;
|
|
1213
|
+
const hitThreshold = (0, link_hit_test_1.linkBodyHitTolerance)(this.literalLinkStrokeWidth(link), this.linkHitAreaWidthConfig) +
|
|
1214
|
+
this.hitSlop;
|
|
1215
|
+
const hit = (0, link_hit_test_1.hitTestLink)(this.buildLinkHitOptions(link), query, hitThreshold);
|
|
1216
|
+
if (!hit)
|
|
1217
|
+
continue;
|
|
1218
|
+
const score = Math.min((_a = hit.bodyDistance) !== null && _a !== void 0 ? _a : Infinity, (_b = hit.distance) !== null && _b !== void 0 ? _b : Infinity);
|
|
1219
|
+
if (score < bestScore) {
|
|
1220
|
+
bestScore = score;
|
|
1221
|
+
best = Object.assign({ link }, hit);
|
|
1222
|
+
}
|
|
1223
|
+
}
|
|
1224
|
+
return best;
|
|
1225
|
+
}
|
|
1226
|
+
/**
|
|
1227
|
+
* The link's resolved numeric stroke width, mirroring the SVG renderer's
|
|
1228
|
+
* `linkPaintLiterals` fallback: a theme-bound `var(--…)` width is not a
|
|
1229
|
+
* number, so it falls back to 2 (the theme default) rather than NaN-ing the
|
|
1230
|
+
* grab distance.
|
|
1231
|
+
*/
|
|
1232
|
+
literalLinkStrokeWidth(link) {
|
|
1233
|
+
var _a;
|
|
1234
|
+
const width = (_a = link.style) === null || _a === void 0 ? void 0 : _a.strokeWidth;
|
|
1235
|
+
return typeof width === 'number' && Number.isFinite(width) ? width : 2;
|
|
1236
|
+
}
|
|
1237
|
+
/**
|
|
1238
|
+
* Translate a link model into the framework-agnostic geometry the pure
|
|
1239
|
+
* `hitTestLink` primitive expects (routed points, label placements and
|
|
1240
|
+
* endpoint / arrowhead anchors). Endpoints default to the path ends inside
|
|
1241
|
+
* the primitive; arrowhead anchors are inset from those ends by the arrow's
|
|
1242
|
+
* canonical tip offset so they line up with the rendered markers.
|
|
1243
|
+
*/
|
|
1244
|
+
buildLinkHitOptions(link) {
|
|
1245
|
+
var _a, _b;
|
|
1246
|
+
const points = link.points;
|
|
1247
|
+
const style = (_a = link.style) !== null && _a !== void 0 ? _a : {};
|
|
1248
|
+
let labels = ((_b = link.labels) !== null && _b !== void 0 ? _b : []).map((label) => ({
|
|
1249
|
+
position: label.position,
|
|
1250
|
+
offset: label.offset,
|
|
1251
|
+
}));
|
|
1252
|
+
// The DISPLAY label dialect (`edges: [{label}]` → `metadata.label`) paints
|
|
1253
|
+
// at the middle routed point but lived in no hit geometry at all — so the
|
|
1254
|
+
// label a user could SEE on such an edge reported `body`, never `label`,
|
|
1255
|
+
// and double-click-to-edit / label affordances could not fire on it.
|
|
1256
|
+
// Synthesize its box at the renderer's own anchor (points[mid], expressed
|
|
1257
|
+
// as the arc-length position the hit primitive expects).
|
|
1258
|
+
if (labels.length === 0 && points.length >= 2 && link.getLabel()) {
|
|
1259
|
+
const mid = Math.floor(points.length / 2);
|
|
1260
|
+
let total = 0;
|
|
1261
|
+
let toMid = 0;
|
|
1262
|
+
for (let i = 1; i < points.length; i++) {
|
|
1263
|
+
const seg = Math.hypot(points[i].x - points[i - 1].x, points[i].y - points[i - 1].y);
|
|
1264
|
+
total += seg;
|
|
1265
|
+
if (i <= mid)
|
|
1266
|
+
toMid += seg;
|
|
1267
|
+
}
|
|
1268
|
+
if (total > 0)
|
|
1269
|
+
labels = [{ position: toMid / total, offset: { x: 0, y: 0 } }];
|
|
1270
|
+
}
|
|
1271
|
+
return {
|
|
1272
|
+
points,
|
|
1273
|
+
labels,
|
|
1274
|
+
// arrowHead renders at the target end, arrowTail at the source end.
|
|
1275
|
+
sourceArrow: this.arrowAnchor(points, false, style.arrowTail),
|
|
1276
|
+
targetArrow: this.arrowAnchor(points, true, style.arrowHead),
|
|
1277
|
+
};
|
|
1278
|
+
}
|
|
1279
|
+
/**
|
|
1280
|
+
* Anchor point for an arrowhead hit region: the terminal point moved inward
|
|
1281
|
+
* along the last (or first) segment by the arrow's tip offset, matching where
|
|
1282
|
+
* the marker actually sits. Returns null when there is no visible arrow.
|
|
1283
|
+
*/
|
|
1284
|
+
arrowAnchor(points, atTarget, style) {
|
|
1285
|
+
if (!style || style.type === 'none' || points.length < 2)
|
|
1286
|
+
return null;
|
|
1287
|
+
const offset = this.arrowRenderer.getTipOffset(style);
|
|
1288
|
+
const tip = atTarget ? points[points.length - 1] : points[0];
|
|
1289
|
+
const adjacent = atTarget ? points[points.length - 2] : points[1];
|
|
1290
|
+
const dx = adjacent.x - tip.x;
|
|
1291
|
+
const dy = adjacent.y - tip.y;
|
|
1292
|
+
const len = Math.hypot(dx, dy) || 1;
|
|
1293
|
+
return { x: tip.x + (dx / len) * offset, y: tip.y + (dy / len) * offset };
|
|
1294
|
+
}
|
|
1295
|
+
/**
|
|
1296
|
+
* Wave 6 (Card 6): the nearest VALID target port within the magnet radius.
|
|
1297
|
+
*
|
|
1298
|
+
* "Valid" means the connection manager's valid-target set — the same set the
|
|
1299
|
+
* highlight paints — so the magnet can never latch onto a port the drop would
|
|
1300
|
+
* then reject. Returns null when nothing is in reach, leaving the drag free.
|
|
1301
|
+
*/
|
|
1302
|
+
findMagnetPort(worldX, worldY, engine) {
|
|
1303
|
+
var _a;
|
|
1304
|
+
const diagram = engine.getDiagram();
|
|
1305
|
+
if (!diagram)
|
|
1306
|
+
return null;
|
|
1307
|
+
const config = engine.getInteractionConfig();
|
|
1308
|
+
const radius = config.snapToPortRadius;
|
|
1309
|
+
if (!radius || radius <= 0)
|
|
1310
|
+
return null;
|
|
1311
|
+
const dragState = engine.getConnectionStateManager().getState();
|
|
1312
|
+
if (!dragState.isConnecting || dragState.validTargetPorts.size === 0)
|
|
1313
|
+
return null;
|
|
1314
|
+
let best = null;
|
|
1315
|
+
let bestDistance = Infinity;
|
|
1316
|
+
for (const node of diagram.getNodes()) {
|
|
1317
|
+
if (((_a = node.state) === null || _a === void 0 ? void 0 : _a.visible) === false)
|
|
1318
|
+
continue;
|
|
1319
|
+
for (const port of node.getPorts()) {
|
|
1320
|
+
if (!dragState.validTargetPorts.has(port.id))
|
|
1321
|
+
continue;
|
|
1322
|
+
const position = (0, port_positioning_1.portWorldPosition)(port, node);
|
|
1323
|
+
const distance = Math.hypot(worldX - position.x, worldY - position.y);
|
|
1324
|
+
if (distance <= radius && distance < bestDistance) {
|
|
1325
|
+
bestDistance = distance;
|
|
1326
|
+
best = port;
|
|
1327
|
+
}
|
|
1328
|
+
}
|
|
1329
|
+
}
|
|
1330
|
+
return best;
|
|
1331
|
+
}
|
|
1332
|
+
/**
|
|
1333
|
+
* Update port highlight states during connection.
|
|
1334
|
+
*
|
|
1335
|
+
* Wave 6 (Card 6): this method was already correct — and already dead. It
|
|
1336
|
+
* loops over `dragState.validTargetPorts`, a set that NOTHING ever filled:
|
|
1337
|
+
* `ConnectionStateManager.calculateValidTargets()` was a comment-only stub and
|
|
1338
|
+
* `setValidTargets()` had no production caller. So the loop ran zero times,
|
|
1339
|
+
* every frame, and only the hovered port ever lit up. The manager now computes
|
|
1340
|
+
* the set for real, which is what finally brings this to life — plus the
|
|
1341
|
+
* `highlightValidTargets` config flag, itself dead config until now (declared,
|
|
1342
|
+
* defaulted true, written by the config panel, read by nobody).
|
|
1343
|
+
*/
|
|
1344
|
+
updatePortHighlights(engine) {
|
|
1345
|
+
const diagram = engine.getDiagram();
|
|
1346
|
+
if (!diagram)
|
|
1347
|
+
return;
|
|
1348
|
+
const config = engine.getInteractionConfig();
|
|
1349
|
+
const dragState = engine.getConnectionStateManager().getState();
|
|
1350
|
+
// Clear all highlights first
|
|
1351
|
+
diagram.getNodes().forEach((node) => {
|
|
1352
|
+
node.getPorts().forEach((port) => {
|
|
1353
|
+
port.isHighlighted = false;
|
|
1354
|
+
port.isValidTarget = false;
|
|
1355
|
+
});
|
|
1356
|
+
});
|
|
1357
|
+
// Highlight valid target ports
|
|
1358
|
+
if (config.highlightValidTargets !== false) {
|
|
1359
|
+
dragState.validTargetPorts.forEach((portId) => {
|
|
1360
|
+
var _a, _b;
|
|
1361
|
+
const port = this.findPortById(portId, diagram);
|
|
1362
|
+
if (port) {
|
|
1363
|
+
port.isValidTarget = true;
|
|
1364
|
+
// A hidden port that is a live target must SURFACE — that is what the
|
|
1365
|
+
// 'on-hover' / 'never' visibility modes key off, and it is the whole
|
|
1366
|
+
// point of highlighting: you cannot drop on a port you cannot see.
|
|
1367
|
+
const owner = (_a = diagram.getNodeByPortId) === null || _a === void 0 ? void 0 : _a.call(diagram, portId);
|
|
1368
|
+
(_b = owner === null || owner === void 0 ? void 0 : owner.markDirty) === null || _b === void 0 ? void 0 : _b.call(owner, 'port-highlight');
|
|
1369
|
+
}
|
|
1370
|
+
});
|
|
1371
|
+
}
|
|
1372
|
+
// Highlight currently hovered port
|
|
1373
|
+
if (this.hoveredPort && dragState.isOverValidTarget) {
|
|
1374
|
+
this.hoveredPort.isHighlighted = true;
|
|
1375
|
+
}
|
|
1376
|
+
}
|
|
1377
|
+
/**
|
|
1378
|
+
* Clear all port highlights
|
|
1379
|
+
*/
|
|
1380
|
+
clearPortHighlights(engine) {
|
|
1381
|
+
const diagram = engine.getDiagram();
|
|
1382
|
+
if (!diagram)
|
|
1383
|
+
return;
|
|
1384
|
+
diagram.getNodes().forEach((node) => {
|
|
1385
|
+
let changed = false;
|
|
1386
|
+
node.getPorts().forEach((port) => {
|
|
1387
|
+
if (port.isHighlighted || port.isValidTarget)
|
|
1388
|
+
changed = true;
|
|
1389
|
+
port.isHighlighted = false;
|
|
1390
|
+
port.isValidTarget = false;
|
|
1391
|
+
});
|
|
1392
|
+
// Bare flag writes bump no epoch — without this the teardown frame is
|
|
1393
|
+
// skipped as idle and the green valid-target glow lingers after every
|
|
1394
|
+
// Escape / invalid drop / empty drop (live audit, four ports pages).
|
|
1395
|
+
if (changed)
|
|
1396
|
+
node.markDirty('port-highlight-clear');
|
|
1397
|
+
});
|
|
1398
|
+
}
|
|
1399
|
+
/**
|
|
1400
|
+
* Find port by ID
|
|
1401
|
+
*/
|
|
1402
|
+
findPortById(portId, diagram) {
|
|
1403
|
+
for (const node of diagram.getNodes()) {
|
|
1404
|
+
const port = node.getPort(portId);
|
|
1405
|
+
if (port) {
|
|
1406
|
+
return port;
|
|
1407
|
+
}
|
|
1408
|
+
}
|
|
1409
|
+
return null;
|
|
1410
|
+
}
|
|
1411
|
+
/**
|
|
1412
|
+
* Find node that owns a port
|
|
1413
|
+
*/
|
|
1414
|
+
findNodeForPort(portId, diagram) {
|
|
1415
|
+
for (const node of diagram.getNodes()) {
|
|
1416
|
+
if (node.getPort(portId)) {
|
|
1417
|
+
return node;
|
|
1418
|
+
}
|
|
1419
|
+
}
|
|
1420
|
+
return undefined;
|
|
1421
|
+
}
|
|
1422
|
+
// ============================================================================
|
|
1423
|
+
// Phase 2.3a: Waypoint Editing Methods
|
|
1424
|
+
// ============================================================================
|
|
1425
|
+
/**
|
|
1426
|
+
* Hit test for waypoint handle at mouse position
|
|
1427
|
+
* Returns the waypoint index if hit, null otherwise
|
|
1428
|
+
*/
|
|
1429
|
+
hitTestWaypoint(mouseX, mouseY, link) {
|
|
1430
|
+
if (!this.waypointEditor || !link.points || link.points.length < 3) {
|
|
1431
|
+
return null;
|
|
1432
|
+
}
|
|
1433
|
+
const hit = this.waypointEditor.hitTestWaypoint(mouseX, mouseY, link.points, this.hitSlop);
|
|
1434
|
+
return hit ? hit.waypointIndex : null;
|
|
1435
|
+
}
|
|
1436
|
+
/**
|
|
1437
|
+
* Hit test for clicking on link path (to add waypoint)
|
|
1438
|
+
*/
|
|
1439
|
+
hitTestPath(mouseX, mouseY, link) {
|
|
1440
|
+
if (!this.waypointEditor || !link.points || link.points.length < 2) {
|
|
1441
|
+
return false;
|
|
1442
|
+
}
|
|
1443
|
+
const hit = this.waypointEditor.hitTestPath(mouseX, mouseY, link.points, this.hitSlop);
|
|
1444
|
+
return hit !== null;
|
|
1445
|
+
}
|
|
1446
|
+
/**
|
|
1447
|
+
* Start dragging a waypoint
|
|
1448
|
+
*/
|
|
1449
|
+
startWaypointDrag(waypointIndex, link) {
|
|
1450
|
+
this.isDraggingWaypoint = true;
|
|
1451
|
+
this.editingLink = link;
|
|
1452
|
+
this.editingWaypointIndex = waypointIndex;
|
|
1453
|
+
// wave12: snapshot the path BEFORE the drag so end can commit one undoable FROM→TO step.
|
|
1454
|
+
this.waypointDragStartPoints = link.points.map((p) => (Object.assign({}, p)));
|
|
1455
|
+
console.log(`🔵 Started dragging waypoint ${waypointIndex} on link ${link.id}`);
|
|
1456
|
+
}
|
|
1457
|
+
/**
|
|
1458
|
+
* Move waypoint during drag
|
|
1459
|
+
* The waypoint is just moved, orthogonal routing happens during rendering
|
|
1460
|
+
*/
|
|
1461
|
+
moveWaypoint(worldX, worldY, engine) {
|
|
1462
|
+
if (this.isReadonlyEngine(engine))
|
|
1463
|
+
return false;
|
|
1464
|
+
if (!this.isDraggingWaypoint || !this.editingLink || this.editingWaypointIndex === null || !this.waypointEditor) {
|
|
1465
|
+
return false;
|
|
1466
|
+
}
|
|
1467
|
+
const newPosition = { x: worldX, y: worldY };
|
|
1468
|
+
const newPoints = this.waypointEditor.moveWaypoint(this.editingWaypointIndex, newPosition, this.editingLink.points, this.editingLink.pathType);
|
|
1469
|
+
if (newPoints) {
|
|
1470
|
+
this.editingLink.setPoints(newPoints);
|
|
1471
|
+
this.editingLink.setMetadata('hasManualWaypoints', true);
|
|
1472
|
+
console.log(`🔵 Moved waypoint ${this.editingWaypointIndex} to (${worldX.toFixed(1)}, ${worldY.toFixed(1)})`);
|
|
1473
|
+
return true;
|
|
1474
|
+
}
|
|
1475
|
+
return false;
|
|
1476
|
+
}
|
|
1477
|
+
/**
|
|
1478
|
+
* End waypoint drag
|
|
1479
|
+
*/
|
|
1480
|
+
endWaypointDrag(engine) {
|
|
1481
|
+
var _a;
|
|
1482
|
+
if (this.isDraggingWaypoint) {
|
|
1483
|
+
console.log(`🔵 Ended dragging waypoint ${this.editingWaypointIndex} on link ${(_a = this.editingLink) === null || _a === void 0 ? void 0 : _a.id}`);
|
|
1484
|
+
// wave12: commit the finished gesture as ONE undoable step. The live moveWaypoint
|
|
1485
|
+
// already applied the final points, so SetLinkPointsCommand's execute() re-sets the
|
|
1486
|
+
// already-current `to` (a no-op) and records one history entry; undo restores `from`.
|
|
1487
|
+
// Same FROM→TO snapshot pattern as node-drag and group-drag. Only commit when the
|
|
1488
|
+
// path actually changed — a click-with-no-drag must not litter the undo stack.
|
|
1489
|
+
const link = this.editingLink;
|
|
1490
|
+
const from = this.waypointDragStartPoints;
|
|
1491
|
+
if (engine && link && from) {
|
|
1492
|
+
const to = link.points.map((p) => (Object.assign({}, p)));
|
|
1493
|
+
const changed = to.length !== from.length ||
|
|
1494
|
+
to.some((p, i) => p.x !== from[i].x || p.y !== from[i].y);
|
|
1495
|
+
if (changed) {
|
|
1496
|
+
void engine.commandManager.execute(new engine_1.SetLinkPointsCommand(link.id, to, from));
|
|
1497
|
+
}
|
|
1498
|
+
}
|
|
1499
|
+
}
|
|
1500
|
+
this.isDraggingWaypoint = false;
|
|
1501
|
+
this.editingLink = null;
|
|
1502
|
+
this.editingWaypointIndex = null;
|
|
1503
|
+
this.waypointDragStartPoints = null;
|
|
1504
|
+
}
|
|
1505
|
+
/**
|
|
1506
|
+
* Add waypoint at click position on path
|
|
1507
|
+
*/
|
|
1508
|
+
addWaypoint(clickX, clickY, link) {
|
|
1509
|
+
if (this.isReadonlyLink(link))
|
|
1510
|
+
return false;
|
|
1511
|
+
if (!this.waypointEditor) {
|
|
1512
|
+
return false;
|
|
1513
|
+
}
|
|
1514
|
+
const result = this.waypointEditor.addWaypointAtPosition(clickX, clickY, link.points);
|
|
1515
|
+
if (result) {
|
|
1516
|
+
link.setPoints(result.newPoints);
|
|
1517
|
+
link.setMetadata('hasManualWaypoints', true);
|
|
1518
|
+
console.log(`🟢 Added waypoint at index ${result.waypointIndex} on link ${link.id}`);
|
|
1519
|
+
return true;
|
|
1520
|
+
}
|
|
1521
|
+
return false;
|
|
1522
|
+
}
|
|
1523
|
+
/**
|
|
1524
|
+
* Remove waypoint at index
|
|
1525
|
+
*/
|
|
1526
|
+
removeWaypoint(waypointIndex, link) {
|
|
1527
|
+
if (this.isReadonlyLink(link))
|
|
1528
|
+
return false;
|
|
1529
|
+
if (!this.waypointEditor) {
|
|
1530
|
+
return false;
|
|
1531
|
+
}
|
|
1532
|
+
const newPoints = this.waypointEditor.removeWaypoint(waypointIndex, link.points);
|
|
1533
|
+
if (newPoints) {
|
|
1534
|
+
link.setPoints(newPoints);
|
|
1535
|
+
if (newPoints.length <= 2) {
|
|
1536
|
+
link.setMetadata('hasManualWaypoints', false);
|
|
1537
|
+
}
|
|
1538
|
+
console.log(`🔴 Removed waypoint at index ${waypointIndex} from link ${link.id}`);
|
|
1539
|
+
return true;
|
|
1540
|
+
}
|
|
1541
|
+
return false;
|
|
1542
|
+
}
|
|
1543
|
+
/**
|
|
1544
|
+
* Update waypoint editor configuration
|
|
1545
|
+
*/
|
|
1546
|
+
updateWaypointEditorConfig(config) {
|
|
1547
|
+
if (this.waypointEditor) {
|
|
1548
|
+
this.waypointEditor.updateConfig(config);
|
|
1549
|
+
}
|
|
1550
|
+
}
|
|
1551
|
+
/**
|
|
1552
|
+
* Synchronize editor configs with engine interaction config
|
|
1553
|
+
* ADDED: Call this when engine config changes to update editor visuals
|
|
1554
|
+
*/
|
|
1555
|
+
syncWithEngineConfig(engine) {
|
|
1556
|
+
const config = engine.getInteractionConfig();
|
|
1557
|
+
if (config.waypointEditor) {
|
|
1558
|
+
this.updateWaypointEditorConfig(config.waypointEditor);
|
|
1559
|
+
}
|
|
1560
|
+
if (config.controlPointEditor) {
|
|
1561
|
+
this.updateControlPointEditorConfig(config.controlPointEditor);
|
|
1562
|
+
}
|
|
1563
|
+
this.installHostConnectionValidatorBridge(engine);
|
|
1564
|
+
}
|
|
1565
|
+
installHostConnectionValidatorBridge(engine) {
|
|
1566
|
+
var _a;
|
|
1567
|
+
if (this.validatorBridgedEngines.has(engine))
|
|
1568
|
+
return;
|
|
1569
|
+
const manager = (_a = engine.getConnectionStateManager) === null || _a === void 0 ? void 0 : _a.call(engine);
|
|
1570
|
+
if (!(manager === null || manager === void 0 ? void 0 : manager.addValidator))
|
|
1571
|
+
return;
|
|
1572
|
+
this.validatorBridgedEngines.add(engine);
|
|
1573
|
+
manager.addValidator((source, target) => {
|
|
1574
|
+
const diagram = engine.getDiagram();
|
|
1575
|
+
const sourceNode = diagram === null || diagram === void 0 ? void 0 : diagram.getNodeByPortId(source.id);
|
|
1576
|
+
const targetNode = diagram === null || diagram === void 0 ? void 0 : diagram.getNodeByPortId(target.id);
|
|
1577
|
+
if (!sourceNode || !targetNode)
|
|
1578
|
+
return true;
|
|
1579
|
+
return (0, tools_1.isValidConnection)({
|
|
1580
|
+
sourceNode,
|
|
1581
|
+
sourcePort: source,
|
|
1582
|
+
targetNode,
|
|
1583
|
+
targetPort: target,
|
|
1584
|
+
}).valid;
|
|
1585
|
+
});
|
|
1586
|
+
}
|
|
1587
|
+
/**
|
|
1588
|
+
* Update hovered waypoint (for Delete key support)
|
|
1589
|
+
* Call this from mousemove to track which waypoint is under cursor
|
|
1590
|
+
*/
|
|
1591
|
+
updateHoveredWaypoint(worldX, worldY, link) {
|
|
1592
|
+
if (!link || !this.waypointEditor) {
|
|
1593
|
+
this.hoveredWaypointIndex = null;
|
|
1594
|
+
this.hoveredWaypointLink = null;
|
|
1595
|
+
return;
|
|
1596
|
+
}
|
|
1597
|
+
const waypointIndex = this.hitTestWaypoint(worldX, worldY, link);
|
|
1598
|
+
this.hoveredWaypointIndex = waypointIndex;
|
|
1599
|
+
this.hoveredWaypointLink = waypointIndex !== null ? link : null;
|
|
1600
|
+
}
|
|
1601
|
+
/**
|
|
1602
|
+
* Delete currently hovered waypoint (for Delete key)
|
|
1603
|
+
*/
|
|
1604
|
+
deleteHoveredWaypoint() {
|
|
1605
|
+
if (this.isReadonlyLink(this.hoveredLink))
|
|
1606
|
+
return false;
|
|
1607
|
+
if (this.hoveredWaypointIndex !== null && this.hoveredWaypointLink) {
|
|
1608
|
+
const removed = this.removeWaypoint(this.hoveredWaypointIndex, this.hoveredWaypointLink);
|
|
1609
|
+
if (removed) {
|
|
1610
|
+
this.hoveredWaypointIndex = null;
|
|
1611
|
+
this.hoveredWaypointLink = null;
|
|
1612
|
+
return true;
|
|
1613
|
+
}
|
|
1614
|
+
}
|
|
1615
|
+
return false;
|
|
1616
|
+
}
|
|
1617
|
+
// ============================================================================
|
|
1618
|
+
// Phase 2.3b: Control Point Editing Methods
|
|
1619
|
+
// ============================================================================
|
|
1620
|
+
/**
|
|
1621
|
+
* Hit test for control point handle at mouse position
|
|
1622
|
+
* Returns the control point info if hit, null otherwise
|
|
1623
|
+
*/
|
|
1624
|
+
hitTestControlPoint(mouseX, mouseY, link) {
|
|
1625
|
+
if (!this.controlPointEditor || !link.segments || link.segments.length === 0) {
|
|
1626
|
+
return null;
|
|
1627
|
+
}
|
|
1628
|
+
const hit = this.controlPointEditor.hitTestControlPoint(mouseX, mouseY, link.segments, this.hitSlop);
|
|
1629
|
+
if (hit) {
|
|
1630
|
+
return {
|
|
1631
|
+
segmentIndex: hit.segmentIndex,
|
|
1632
|
+
controlType: hit.controlType,
|
|
1633
|
+
};
|
|
1634
|
+
}
|
|
1635
|
+
return null;
|
|
1636
|
+
}
|
|
1637
|
+
/**
|
|
1638
|
+
* Start dragging a control point
|
|
1639
|
+
*/
|
|
1640
|
+
startControlPointDrag(segmentIndex, controlType, link) {
|
|
1641
|
+
this.isDraggingControlPoint = true;
|
|
1642
|
+
this.editingControlPointLink = link;
|
|
1643
|
+
this.editingControlPointSegmentIndex = segmentIndex;
|
|
1644
|
+
this.editingControlPointType = controlType;
|
|
1645
|
+
console.log(`🟢 Started dragging ${controlType} of segment ${segmentIndex} on link ${link.id}`);
|
|
1646
|
+
}
|
|
1647
|
+
/**
|
|
1648
|
+
* Move control point during drag
|
|
1649
|
+
*/
|
|
1650
|
+
moveControlPoint(worldX, worldY, engine) {
|
|
1651
|
+
if (this.isReadonlyEngine(engine))
|
|
1652
|
+
return false; // RAW segments write below — no model guard can see it
|
|
1653
|
+
if (!this.isDraggingControlPoint ||
|
|
1654
|
+
!this.editingControlPointLink ||
|
|
1655
|
+
this.editingControlPointSegmentIndex === null ||
|
|
1656
|
+
!this.editingControlPointType ||
|
|
1657
|
+
!this.controlPointEditor) {
|
|
1658
|
+
return false;
|
|
1659
|
+
}
|
|
1660
|
+
const newPosition = { x: worldX, y: worldY };
|
|
1661
|
+
const newSegments = this.controlPointEditor.moveControlPoint(this.editingControlPointSegmentIndex, this.editingControlPointType, newPosition, this.editingControlPointLink.segments);
|
|
1662
|
+
if (newSegments) {
|
|
1663
|
+
this.editingControlPointLink.segments = newSegments;
|
|
1664
|
+
// Mark link as dirty to trigger re-render with updated segments
|
|
1665
|
+
this.editingControlPointLink.markDirty();
|
|
1666
|
+
console.log(`🟢 Moved ${this.editingControlPointType} of segment ${this.editingControlPointSegmentIndex} to (${worldX.toFixed(1)}, ${worldY.toFixed(1)})`);
|
|
1667
|
+
return true;
|
|
1668
|
+
}
|
|
1669
|
+
return false;
|
|
1670
|
+
}
|
|
1671
|
+
/**
|
|
1672
|
+
* End control point drag
|
|
1673
|
+
*/
|
|
1674
|
+
endControlPointDrag() {
|
|
1675
|
+
var _a;
|
|
1676
|
+
if (this.isDraggingControlPoint) {
|
|
1677
|
+
console.log(`🟢 Ended dragging ${this.editingControlPointType} of segment ${this.editingControlPointSegmentIndex} on link ${(_a = this.editingControlPointLink) === null || _a === void 0 ? void 0 : _a.id}`);
|
|
1678
|
+
}
|
|
1679
|
+
this.isDraggingControlPoint = false;
|
|
1680
|
+
this.editingControlPointLink = null;
|
|
1681
|
+
this.editingControlPointSegmentIndex = null;
|
|
1682
|
+
this.editingControlPointType = null;
|
|
1683
|
+
}
|
|
1684
|
+
/**
|
|
1685
|
+
* Update control point editor configuration
|
|
1686
|
+
*/
|
|
1687
|
+
updateControlPointEditorConfig(config) {
|
|
1688
|
+
if (this.controlPointEditor) {
|
|
1689
|
+
this.controlPointEditor.updateConfig(config);
|
|
1690
|
+
}
|
|
1691
|
+
}
|
|
1692
|
+
/**
|
|
1693
|
+
* Update hovered control point (for Delete key support)
|
|
1694
|
+
* Call this from mousemove to track which control point is under cursor
|
|
1695
|
+
*/
|
|
1696
|
+
updateHoveredControlPoint(worldX, worldY, link) {
|
|
1697
|
+
if (!link || !this.controlPointEditor) {
|
|
1698
|
+
this.hoveredControlPointSegmentIndex = null;
|
|
1699
|
+
this.hoveredControlPointType = null;
|
|
1700
|
+
this.hoveredControlPointLink = null;
|
|
1701
|
+
return;
|
|
1702
|
+
}
|
|
1703
|
+
const hit = this.hitTestControlPoint(worldX, worldY, link);
|
|
1704
|
+
if (hit) {
|
|
1705
|
+
this.hoveredControlPointSegmentIndex = hit.segmentIndex;
|
|
1706
|
+
this.hoveredControlPointType = hit.controlType;
|
|
1707
|
+
this.hoveredControlPointLink = link;
|
|
1708
|
+
}
|
|
1709
|
+
else {
|
|
1710
|
+
this.hoveredControlPointSegmentIndex = null;
|
|
1711
|
+
this.hoveredControlPointType = null;
|
|
1712
|
+
this.hoveredControlPointLink = null;
|
|
1713
|
+
}
|
|
1714
|
+
}
|
|
1715
|
+
/**
|
|
1716
|
+
* Reset control point to auto-generated position (for Delete key)
|
|
1717
|
+
* This removes custom control point adjustment, reverting to default bezier
|
|
1718
|
+
*/
|
|
1719
|
+
resetHoveredControlPoint() {
|
|
1720
|
+
if (this.hoveredControlPointSegmentIndex !== null &&
|
|
1721
|
+
this.hoveredControlPointType &&
|
|
1722
|
+
this.hoveredControlPointLink) {
|
|
1723
|
+
// For now, we don't support "deleting" control points
|
|
1724
|
+
// Control points are intrinsic to bezier curves
|
|
1725
|
+
// User would need to change pathType instead
|
|
1726
|
+
console.log('⚠️ Control points cannot be deleted, only moved');
|
|
1727
|
+
return false;
|
|
1728
|
+
}
|
|
1729
|
+
return false;
|
|
1730
|
+
}
|
|
1731
|
+
}
|
|
1732
|
+
exports.InteractionController = InteractionController;
|
|
1733
|
+
//# sourceMappingURL=interaction-controller.js.map
|