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