@tumaet/apollon 4.4.0 → 4.6.0

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 (392) hide show
  1. package/README.md +206 -34
  2. package/dist/assets/style.css +1 -1
  3. package/dist/index.d.ts +897 -10
  4. package/dist/index.js +7726 -77129
  5. package/dist/internals.d.ts +868 -0
  6. package/dist/internals.js +40 -0
  7. package/dist/react/App.d.ts +9 -0
  8. package/dist/{apollon-editor.d.ts → react/apollon-editor.d.ts} +11 -12
  9. package/dist/react/components/AlignmentGuides.d.ts +1 -0
  10. package/dist/react/components/AssessmentSelectionDebug.d.ts +1 -0
  11. package/dist/react/components/CustomBackground.d.ts +1 -0
  12. package/dist/react/components/CustomControls.d.ts +1 -0
  13. package/dist/react/components/CustomMiniMap.d.ts +1 -0
  14. package/dist/{components → react/components}/Icon/ArrowBackIcon.d.ts +1 -1
  15. package/dist/{components → react/components}/Icon/ArrowForwardIcon.d.ts +1 -1
  16. package/dist/{components → react/components}/Icon/CheckIcon.d.ts +1 -1
  17. package/dist/{components → react/components}/Icon/CrossIcon.d.ts +1 -1
  18. package/dist/{components → react/components}/Icon/DeleteIcon.d.ts +1 -1
  19. package/dist/{components → react/components}/Icon/DragHandleIcon.d.ts +1 -1
  20. package/dist/{components → react/components}/Icon/EditIcon.d.ts +1 -1
  21. package/dist/{components → react/components}/Icon/ExclamationIcon.d.ts +1 -1
  22. package/dist/{components → react/components}/Icon/InfiniteIcon.d.ts +1 -1
  23. package/dist/{components → react/components}/Icon/MapIcon.d.ts +1 -1
  24. package/dist/{components → react/components}/Icon/PaintRollerIcon.d.ts +1 -1
  25. package/dist/{components → react/components}/Icon/RedoIcon.d.ts +1 -1
  26. package/dist/{components → react/components}/Icon/SouthEastArrowIcon.d.ts +1 -1
  27. package/dist/{components → react/components}/Icon/SwapHorizIcon.d.ts +1 -1
  28. package/dist/{components → react/components}/Icon/UndoIcon.d.ts +1 -1
  29. package/dist/react/components/ReconnectConnectionLine.d.ts +2 -0
  30. package/dist/react/components/Sidebar.d.ts +1 -0
  31. package/dist/react/components/collaboration/CollaborationLayer.d.ts +25 -0
  32. package/dist/react/components/collaboration/coordinates.d.ts +7 -0
  33. package/dist/{components → react/components}/index.d.ts +2 -0
  34. package/dist/{components → react/components}/popovers/DefaultNodeGiveFeedbackPopover.d.ts +1 -1
  35. package/dist/{components → react/components}/popovers/DefaultNodeSeeFeedbackPopover.d.ts +1 -1
  36. package/dist/{components → react/components}/popovers/GiveFeedbackAssessmentBox.d.ts +1 -1
  37. package/dist/{components → react/components}/popovers/PopoverManager.d.ts +1 -1
  38. package/dist/{components → react/components}/popovers/SeeFeedbackAssessmentBox.d.ts +1 -1
  39. package/dist/{components → react/components}/popovers/bpmnDiagram/BPMNPoolEditPopover.d.ts +1 -1
  40. package/dist/{components → react/components}/popovers/classDiagram/ClassGiveFeedbackPopover.d.ts +1 -1
  41. package/dist/{components → react/components}/popovers/classDiagram/ClassSeeFeedbackPopover.d.ts +1 -1
  42. package/dist/{components → react/components}/popovers/communicationDiagram/CommunicationObjectNameGiveFeedbackPopover.d.ts +1 -1
  43. package/dist/{components → react/components}/popovers/communicationDiagram/CommunicationObjectNameSeeFeedbackPopover.d.ts +1 -1
  44. package/dist/{components → react/components}/popovers/edgePopovers/EdgeGiveFeedbackPopover.d.ts +1 -1
  45. package/dist/{components → react/components}/popovers/edgePopovers/EdgeSeeFeedbackPopover.d.ts +1 -1
  46. package/dist/react/components/popovers/edgePopovers/EdgeTypePreviewIcon.d.ts +3 -0
  47. package/dist/react/components/popovers/edgePopovers/EdgeTypeSelect.d.ts +9 -0
  48. package/dist/{components → react/components}/popovers/objectDiagram/ObjectGiveFeedbackPopover.d.ts +1 -1
  49. package/dist/{components → react/components}/popovers/objectDiagram/ObjectSeeFeedbackPopover.d.ts +1 -1
  50. package/dist/react/components/react/Apollon.d.ts +45 -0
  51. package/dist/react/components/react/context.d.ts +16 -0
  52. package/dist/react/components/react/useApollonSubscription.d.ts +17 -0
  53. package/dist/{components → react/components}/svgs/edges/InlineMarker.d.ts +10 -2
  54. package/dist/react/components/svgs/nodes/CustomText.d.ts +10 -0
  55. package/dist/{components → react/components}/svgs/nodes/classDiagram/ClassSVG.d.ts +1 -1
  56. package/dist/{components → react/components}/svgs/nodes/classDiagram/ColorDescriptionSVG.d.ts +1 -1
  57. package/dist/{components → react/components}/svgs/nodes/communicationDiagram/CommunicationObjectNameSVG.d.ts +1 -1
  58. package/dist/{components → react/components}/svgs/nodes/objectDiagram/ObjectNameSVG.d.ts +1 -1
  59. package/dist/{components → react/components}/toolbars/edgeToolBar/CustomEdgeToolBar.d.ts +2 -0
  60. package/dist/{components → react/components}/ui/StyleEditor/ColorButtons.d.ts +1 -1
  61. package/dist/{constants.d.ts → react/constants.d.ts} +43 -6
  62. package/dist/react/edges/GenericEdge.d.ts +79 -0
  63. package/dist/{edges → react/edges}/edgeTypes/ActivityDiagramEdge.d.ts +1 -1
  64. package/dist/{edges → react/edges}/edgeTypes/BPMNDiagramEdge.d.ts +1 -1
  65. package/dist/{edges → react/edges}/edgeTypes/ClassDiagramEdge.d.ts +1 -1
  66. package/dist/{edges → react/edges}/edgeTypes/CommunicationDiagramEdge.d.ts +1 -1
  67. package/dist/{edges → react/edges}/edgeTypes/ComponentDiagramEdge.d.ts +1 -1
  68. package/dist/{edges → react/edges}/edgeTypes/DeploymentDiagramEdge.d.ts +1 -1
  69. package/dist/{edges → react/edges}/edgeTypes/FlowChartEdge.d.ts +1 -1
  70. package/dist/{edges → react/edges}/edgeTypes/ObjectDiagramEdge.d.ts +1 -1
  71. package/dist/{edges → react/edges}/edgeTypes/PetriNetEdge.d.ts +1 -1
  72. package/dist/{edges → react/edges}/edgeTypes/ReachabilityGraphArc.d.ts +1 -1
  73. package/dist/{edges → react/edges}/edgeTypes/SfcDiagramEdge.d.ts +1 -1
  74. package/dist/{edges → react/edges}/edgeTypes/SyntaxTreeEdge.d.ts +1 -1
  75. package/dist/{edges → react/edges}/edgeTypes/UseCaseDiagramEdge.d.ts +1 -1
  76. package/dist/{edges → react/edges}/labelTypes/EdgeEndLabels.d.ts +1 -1
  77. package/dist/{edges → react/edges}/labelTypes/EdgeIncludeExtendLabel.d.ts +1 -1
  78. package/dist/{edges → react/edges}/labelTypes/EdgeMiddleLabels.d.ts +2 -1
  79. package/dist/{edges → react/edges}/labelTypes/EdgeMultipleLabels.d.ts +2 -2
  80. package/dist/{edges → react/edges}/types.d.ts +34 -34
  81. package/dist/react/enums/index.d.ts +1 -0
  82. package/dist/react/hooks/useEdgeLineJumps.d.ts +25 -0
  83. package/dist/{hooks → react/hooks}/useHandleFinder.d.ts +1 -0
  84. package/dist/{hooks → react/hooks}/useReconnect.d.ts +1 -1
  85. package/dist/{hooks → react/hooks}/useStepPathEdge.d.ts +10 -6
  86. package/dist/react/hooks/useStraightPathEdge.d.ts +23 -0
  87. package/dist/react/index.d.ts +7 -0
  88. package/dist/react/internals.d.ts +5 -0
  89. package/dist/{nodes → react/nodes}/TitleAndDescriptionNode.d.ts +1 -1
  90. package/dist/{nodes → react/nodes}/activityDiagram/Activity.d.ts +1 -1
  91. package/dist/{nodes → react/nodes}/activityDiagram/ActivityActionNode.d.ts +1 -1
  92. package/dist/{nodes → react/nodes}/activityDiagram/ActivityFinalNode.d.ts +1 -1
  93. package/dist/{nodes → react/nodes}/activityDiagram/ActivityForkNode.d.ts +1 -1
  94. package/dist/{nodes → react/nodes}/activityDiagram/ActivityForkNodeHorizontal.d.ts +1 -1
  95. package/dist/{nodes → react/nodes}/activityDiagram/ActivityInitialNode.d.ts +1 -1
  96. package/dist/{nodes → react/nodes}/activityDiagram/ActivityMergeNode.d.ts +1 -1
  97. package/dist/{nodes → react/nodes}/activityDiagram/ActivityObjectNode.d.ts +1 -1
  98. package/dist/{nodes → react/nodes}/bpmn/BPMNAnnotation.d.ts +1 -1
  99. package/dist/{nodes → react/nodes}/bpmn/BPMNCallActivity.d.ts +1 -1
  100. package/dist/{nodes → react/nodes}/bpmn/BPMNDataObject.d.ts +1 -1
  101. package/dist/{nodes → react/nodes}/bpmn/BPMNDataStore.d.ts +1 -1
  102. package/dist/{nodes → react/nodes}/bpmn/BPMNEndEvent.d.ts +1 -1
  103. package/dist/{nodes → react/nodes}/bpmn/BPMNGateway.d.ts +1 -1
  104. package/dist/{nodes → react/nodes}/bpmn/BPMNGroup.d.ts +1 -1
  105. package/dist/{nodes → react/nodes}/bpmn/BPMNIntermediateEvent.d.ts +1 -1
  106. package/dist/{nodes → react/nodes}/bpmn/BPMNPool.d.ts +1 -1
  107. package/dist/{nodes → react/nodes}/bpmn/BPMNStartEvent.d.ts +1 -1
  108. package/dist/{nodes → react/nodes}/bpmn/BPMNSubprocess.d.ts +1 -1
  109. package/dist/{nodes → react/nodes}/bpmn/BPMNTask.d.ts +1 -1
  110. package/dist/{nodes → react/nodes}/bpmn/BPMNTransaction.d.ts +1 -1
  111. package/dist/{nodes → react/nodes}/classDiagram/Class.d.ts +1 -1
  112. package/dist/{nodes → react/nodes}/classDiagram/ColorDescription.d.ts +1 -1
  113. package/dist/{nodes → react/nodes}/classDiagram/Package.d.ts +1 -1
  114. package/dist/{nodes → react/nodes}/communicationDiagram/CommunicationObjectName.d.ts +1 -1
  115. package/dist/{nodes → react/nodes}/componentDiagram/Component.d.ts +1 -1
  116. package/dist/{nodes → react/nodes}/componentDiagram/ComponentInterface.d.ts +1 -1
  117. package/dist/{nodes → react/nodes}/componentDiagram/ComponentSubsystem.d.ts +1 -1
  118. package/dist/{nodes → react/nodes}/deploymentDiagram/DeploymentArtifact.d.ts +1 -1
  119. package/dist/{nodes → react/nodes}/deploymentDiagram/DeploymentComponent.d.ts +1 -1
  120. package/dist/{nodes → react/nodes}/deploymentDiagram/DeploymentInterface.d.ts +1 -1
  121. package/dist/{nodes → react/nodes}/deploymentDiagram/DeploymentNode.d.ts +1 -1
  122. package/dist/{nodes → react/nodes}/flowchart/FlowchartDecision.d.ts +1 -1
  123. package/dist/{nodes → react/nodes}/flowchart/FlowchartFunctionCall.d.ts +1 -1
  124. package/dist/{nodes → react/nodes}/flowchart/FlowchartInputOutput.d.ts +1 -1
  125. package/dist/{nodes → react/nodes}/flowchart/FlowchartProcess.d.ts +1 -1
  126. package/dist/{nodes → react/nodes}/flowchart/FlowchartTerminal.d.ts +1 -1
  127. package/dist/{nodes → react/nodes}/objectDiagram/ObjectName.d.ts +1 -1
  128. package/dist/{nodes → react/nodes}/petriNetDiagram/PetriNetPlace.d.ts +1 -1
  129. package/dist/{nodes → react/nodes}/petriNetDiagram/PetriNetTransition.d.ts +1 -1
  130. package/dist/{nodes → react/nodes}/reachabilityGraphDiagram/ReachabilityGraphMarking.d.ts +1 -1
  131. package/dist/{nodes → react/nodes}/sfcDiagram/SfcActionTable.d.ts +1 -1
  132. package/dist/{nodes → react/nodes}/sfcDiagram/SfcJump.d.ts +1 -1
  133. package/dist/{nodes → react/nodes}/sfcDiagram/SfcStart.d.ts +1 -1
  134. package/dist/{nodes → react/nodes}/sfcDiagram/SfcStep.d.ts +1 -1
  135. package/dist/{nodes → react/nodes}/sfcDiagram/SfcTransitionBranch.d.ts +1 -1
  136. package/dist/{nodes → react/nodes}/syntaxTreeDiagram/SyntaxTreeNonterminal.d.ts +1 -1
  137. package/dist/{nodes → react/nodes}/syntaxTreeDiagram/SyntaxTreeTerminal.d.ts +1 -1
  138. package/dist/{nodes → react/nodes}/useCaseDiagram/UseCase.d.ts +1 -1
  139. package/dist/{nodes → react/nodes}/useCaseDiagram/UseCaseActor.d.ts +1 -1
  140. package/dist/{nodes → react/nodes}/useCaseDiagram/UseCaseSystem.d.ts +1 -1
  141. package/dist/react/nodes/wrappers/DefaultNodeWrapper.d.ts +49 -0
  142. package/dist/react/react.d.ts +4 -0
  143. package/dist/react/react.js +34679 -0
  144. package/dist/react/services/migration/EdgeTransformer.d.ts +11 -0
  145. package/dist/{store → react/store}/context.d.ts +3 -0
  146. package/dist/react/store/edgeGeometryStore.d.ts +18 -0
  147. package/dist/{store → react/store}/index.d.ts +2 -1
  148. package/dist/{store → react/store}/metadataStore.d.ts +11 -0
  149. package/dist/{sync → react/sync}/headless.d.ts +3 -3
  150. package/dist/{sync/yjsSyncClass.d.ts → react/sync/yjsSync.d.ts} +5 -2
  151. package/dist/{typings.d.ts → react/typings.d.ts} +21 -9
  152. package/dist/{utils → react/utils}/alignmentUtils.d.ts +2 -2
  153. package/dist/react/utils/collaboration.d.ts +10 -0
  154. package/dist/react/utils/edgeUtils.d.ts +167 -0
  155. package/dist/{utils → react/utils}/exportUtils.d.ts +0 -1
  156. package/dist/react/utils/geometry/bendHandles.d.ts +42 -0
  157. package/dist/{utils → react/utils}/index.d.ts +2 -2
  158. package/dist/{utils → react/utils}/interactiveUtils.d.ts +0 -1
  159. package/dist/{utils → react/utils}/nodeUtils.d.ts +1 -1
  160. package/dist/react/utils/storeUtils.d.ts +1 -0
  161. package/dist/react/utils/textUtils.d.ts +1 -0
  162. package/dist/yjsSync-CK5cmd5z.js +71308 -0
  163. package/package.json +91 -35
  164. package/dist/App.d.ts +0 -6
  165. package/dist/components/AlignmentGuides.d.ts +0 -1
  166. package/dist/components/AssessmentSelectionDebug.d.ts +0 -1
  167. package/dist/components/CustomBackground.d.ts +0 -1
  168. package/dist/components/CustomControls.d.ts +0 -1
  169. package/dist/components/CustomMiniMap.d.ts +0 -1
  170. package/dist/components/Sidebar.d.ts +0 -1
  171. package/dist/components/debug/AssessmentSelectionDebug.d.ts +0 -6
  172. package/dist/components/svgs/nodes/CustomText.d.ts +0 -16
  173. package/dist/components/theme/styles.d.ts +0 -22
  174. package/dist/edges/GenericEdge.d.ts +0 -43
  175. package/dist/enums/ExportFileFormat.d.ts +0 -6
  176. package/dist/enums/index.d.ts +0 -2
  177. package/dist/hooks/useClipboard.d.ts +0 -11
  178. package/dist/hooks/useDragContext.d.ts +0 -0
  179. package/dist/hooks/useStraightPathEdge.d.ts +0 -31
  180. package/dist/initialElements.d.ts +0 -3
  181. package/dist/nodes/syntaxTreeDiagram/index.d.ts +0 -0
  182. package/dist/nodes/wrappers/DefaultNodeWrapper.d.ts +0 -33
  183. package/dist/sync/index.d.ts +0 -1
  184. package/dist/utils/edgeUtils.d.ts +0 -90
  185. package/dist/utils/labelUtils.d.ts +0 -16
  186. package/dist/utils/storeUtils.d.ts +0 -1
  187. package/dist/utils/textUtils.d.ts +0 -7
  188. package/dist/utils/v2Typings.d.ts +0 -127
  189. /package/dist/{components → react/components}/AssessmentSelectableElement.d.ts +0 -0
  190. /package/dist/{components → react/components}/DraggableGhost.d.ts +0 -0
  191. /package/dist/{components → react/components}/Icon/index.d.ts +0 -0
  192. /package/dist/{components → react/components}/ScrollOverlay.d.ts +0 -0
  193. /package/dist/{components → react/components}/popovers/DefaultNodeEditPopover.d.ts +0 -0
  194. /package/dist/{components → react/components}/popovers/GenericPopover.d.ts +0 -0
  195. /package/dist/{components → react/components}/popovers/bpmnDiagram/BPMNEndEventEditPopover.d.ts +0 -0
  196. /package/dist/{components → react/components}/popovers/bpmnDiagram/BPMNGatewayEditPopover.d.ts +0 -0
  197. /package/dist/{components → react/components}/popovers/bpmnDiagram/BPMNIntermediateEventEditPopover.d.ts +0 -0
  198. /package/dist/{components → react/components}/popovers/bpmnDiagram/BPMNStartEventEditPopover.d.ts +0 -0
  199. /package/dist/{components → react/components}/popovers/bpmnDiagram/BPMNTaskEditPopover.d.ts +0 -0
  200. /package/dist/{components → react/components}/popovers/bpmnDiagram/index.d.ts +0 -0
  201. /package/dist/{components → react/components}/popovers/classDiagram/ClassEditPopover.d.ts +0 -0
  202. /package/dist/{components → react/components}/popovers/classDiagram/EditableAttributesList.d.ts +0 -0
  203. /package/dist/{components → react/components}/popovers/classDiagram/EditableMethodsList.d.ts +0 -0
  204. /package/dist/{components → react/components}/popovers/classDiagram/index.d.ts +0 -0
  205. /package/dist/{components → react/components}/popovers/communicationDiagram/CommunicationObjectNameEditPopover.d.ts +0 -0
  206. /package/dist/{components → react/components}/popovers/communicationDiagram/index.d.ts +0 -0
  207. /package/dist/{components → react/components}/popovers/componentDiagram/ComponentEditPopover.d.ts +0 -0
  208. /package/dist/{components → react/components}/popovers/componentDiagram/ComponentSubsystemEditPopover.d.ts +0 -0
  209. /package/dist/{components → react/components}/popovers/componentDiagram/index.d.ts +0 -0
  210. /package/dist/{components → react/components}/popovers/deploymentDiagram/DeploymentComponentEditPopover.d.ts +0 -0
  211. /package/dist/{components → react/components}/popovers/deploymentDiagram/DeploymentNodeEditPopover.d.ts +0 -0
  212. /package/dist/{components → react/components}/popovers/deploymentDiagram/index.d.ts +0 -0
  213. /package/dist/{components → react/components}/popovers/edgePopovers/ActivityDiagramEdgeEditPopover.d.ts +0 -0
  214. /package/dist/{components → react/components}/popovers/edgePopovers/BPMNDiagramEdgeEditPopover.d.ts +0 -0
  215. /package/dist/{components → react/components}/popovers/edgePopovers/ClassDiagramEdgeEditPopover.d.ts +0 -0
  216. /package/dist/{components → react/components}/popovers/edgePopovers/CommunicationDiagramEdgeEditPopover.d.ts +0 -0
  217. /package/dist/{components → react/components}/popovers/edgePopovers/ComponentDiagramEdgeEditPopover.d.ts +0 -0
  218. /package/dist/{components → react/components}/popovers/edgePopovers/DeploymentDiagramEdgeEditPopover.d.ts +0 -0
  219. /package/dist/{components → react/components}/popovers/edgePopovers/FlowChartEdgeEditPopover.d.ts +0 -0
  220. /package/dist/{components → react/components}/popovers/edgePopovers/ObjectDiagramEdgeEditPopover.d.ts +0 -0
  221. /package/dist/{components → react/components}/popovers/edgePopovers/PetriNetEdgeEditPopover.d.ts +0 -0
  222. /package/dist/{components → react/components}/popovers/edgePopovers/ReachabilityGraphEdgeEditPopover.d.ts +0 -0
  223. /package/dist/{components → react/components}/popovers/edgePopovers/SyntaxTreeEdgeEditPopover.d.ts +0 -0
  224. /package/dist/{components → react/components}/popovers/edgePopovers/UseCaseDiagramEdgeEditPopover.d.ts +0 -0
  225. /package/dist/{components → react/components}/popovers/edgePopovers/index.d.ts +0 -0
  226. /package/dist/{components → react/components}/popovers/index.d.ts +0 -0
  227. /package/dist/{components → react/components}/popovers/objectDiagram/ObjectEditPopover.d.ts +0 -0
  228. /package/dist/{components → react/components}/popovers/objectDiagram/index.d.ts +0 -0
  229. /package/dist/{components → react/components}/popovers/petriNetDiagram/PetriNetPlaceEditPopover.d.ts +0 -0
  230. /package/dist/{components → react/components}/popovers/petriNetDiagram/index.d.ts +0 -0
  231. /package/dist/{components → react/components}/popovers/reachabilityGraphDiagram/ReachabilityGraphMarkingEditPopover.d.ts +0 -0
  232. /package/dist/{components → react/components}/popovers/reachabilityGraphDiagram/index.d.ts +0 -0
  233. /package/dist/{components → react/components}/popovers/sfcDiagram/SfcActionTableEditPopover.d.ts +0 -0
  234. /package/dist/{components → react/components}/popovers/sfcDiagram/SfcEdgeEditPopover.d.ts +0 -0
  235. /package/dist/{components → react/components}/popovers/sfcDiagram/index.d.ts +0 -0
  236. /package/dist/{components → react/components}/popovers/syntaxTreeDiagram/SyntaxTreeNonterminalEditPopover.d.ts +0 -0
  237. /package/dist/{components → react/components}/popovers/syntaxTreeDiagram/SyntaxTreeTerminalEditPopover.d.ts +0 -0
  238. /package/dist/{components → react/components}/popovers/syntaxTreeDiagram/index.d.ts +0 -0
  239. /package/dist/{components → react/components}/popovers/types.d.ts +0 -0
  240. /package/dist/{components → react/components}/svgs/AssessmentIcon.d.ts +0 -0
  241. /package/dist/{components → react/components}/svgs/StyledElements.d.ts +0 -0
  242. /package/dist/{components → react/components}/svgs/edges/index.d.ts +0 -0
  243. /package/dist/{components → react/components}/svgs/index.d.ts +0 -0
  244. /package/dist/{components → react/components}/svgs/nodes/HeaderSection.d.ts +0 -0
  245. /package/dist/{components → react/components}/svgs/nodes/MultilineText.d.ts +0 -0
  246. /package/dist/{components → react/components}/svgs/nodes/RowBlockSection.d.ts +0 -0
  247. /package/dist/{components → react/components}/svgs/nodes/SeparationLine.d.ts +0 -0
  248. /package/dist/{components → react/components}/svgs/nodes/StereotypeAndName.d.ts +0 -0
  249. /package/dist/{components → react/components}/svgs/nodes/activityDiagram/ActivityActionNodeSVG.d.ts +0 -0
  250. /package/dist/{components → react/components}/svgs/nodes/activityDiagram/ActivityFinalNodeSVG.d.ts +0 -0
  251. /package/dist/{components → react/components}/svgs/nodes/activityDiagram/ActivityForkNodeHorizontalSVG.d.ts +0 -0
  252. /package/dist/{components → react/components}/svgs/nodes/activityDiagram/ActivityForkNodeSVG.d.ts +0 -0
  253. /package/dist/{components → react/components}/svgs/nodes/activityDiagram/ActivityInitialNodeSVG.d.ts +0 -0
  254. /package/dist/{components → react/components}/svgs/nodes/activityDiagram/ActivityMergeNodeSVG.d.ts +0 -0
  255. /package/dist/{components → react/components}/svgs/nodes/activityDiagram/ActivityObjectNodeSVG.d.ts +0 -0
  256. /package/dist/{components → react/components}/svgs/nodes/activityDiagram/ActivitySVG.d.ts +0 -0
  257. /package/dist/{components → react/components}/svgs/nodes/activityDiagram/index.d.ts +0 -0
  258. /package/dist/{components → react/components}/svgs/nodes/bpmnDiagram/BPMNAnnotationNodeSVG.d.ts +0 -0
  259. /package/dist/{components → react/components}/svgs/nodes/bpmnDiagram/BPMNDataObjectNodeSVG.d.ts +0 -0
  260. /package/dist/{components → react/components}/svgs/nodes/bpmnDiagram/BPMNDataStoreNodeSVG.d.ts +0 -0
  261. /package/dist/{components → react/components}/svgs/nodes/bpmnDiagram/BPMNEventNodeSVG.d.ts +0 -0
  262. /package/dist/{components → react/components}/svgs/nodes/bpmnDiagram/BPMNGatewayNodeSVG.d.ts +0 -0
  263. /package/dist/{components → react/components}/svgs/nodes/bpmnDiagram/BPMNGroupNodeSVG.d.ts +0 -0
  264. /package/dist/{components → react/components}/svgs/nodes/bpmnDiagram/BPMNPoolNodeSVG.d.ts +0 -0
  265. /package/dist/{components → react/components}/svgs/nodes/bpmnDiagram/BPMNSubprocessNodeSVG.d.ts +0 -0
  266. /package/dist/{components → react/components}/svgs/nodes/bpmnDiagram/BPMNTaskNodeSVG.d.ts +0 -0
  267. /package/dist/{components → react/components}/svgs/nodes/bpmnDiagram/index.d.ts +0 -0
  268. /package/dist/{components → react/components}/svgs/nodes/classDiagram/PackageSVG.d.ts +0 -0
  269. /package/dist/{components → react/components}/svgs/nodes/classDiagram/TitleAndDescriptionSVG.d.ts +0 -0
  270. /package/dist/{components → react/components}/svgs/nodes/classDiagram/index.d.ts +0 -0
  271. /package/dist/{components → react/components}/svgs/nodes/communicationDiagram/index.d.ts +0 -0
  272. /package/dist/{components → react/components}/svgs/nodes/componentDiagram/ComponentInterfaceNodeSVG.d.ts +0 -0
  273. /package/dist/{components → react/components}/svgs/nodes/componentDiagram/ComponentNodeSVG.d.ts +0 -0
  274. /package/dist/{components → react/components}/svgs/nodes/componentDiagram/ComponentSubsystemNodeSVG.d.ts +0 -0
  275. /package/dist/{components → react/components}/svgs/nodes/componentDiagram/index.d.ts +0 -0
  276. /package/dist/{components → react/components}/svgs/nodes/deploymentDiagram/DeploymentArtifactSVG.d.ts +0 -0
  277. /package/dist/{components → react/components}/svgs/nodes/deploymentDiagram/DeploymentComponentSVG.d.ts +0 -0
  278. /package/dist/{components → react/components}/svgs/nodes/deploymentDiagram/DeploymentInterfaceSVG.d.ts +0 -0
  279. /package/dist/{components → react/components}/svgs/nodes/deploymentDiagram/DeploymentNodeSVG.d.ts +0 -0
  280. /package/dist/{components → react/components}/svgs/nodes/deploymentDiagram/index.d.ts +0 -0
  281. /package/dist/{components → react/components}/svgs/nodes/flowchartDiagram/FlowchartDecisionNodeSVG.d.ts +0 -0
  282. /package/dist/{components → react/components}/svgs/nodes/flowchartDiagram/FlowchartFunctionCallNodeSVG.d.ts +0 -0
  283. /package/dist/{components → react/components}/svgs/nodes/flowchartDiagram/FlowchartInputOutputNodeSVG.d.ts +0 -0
  284. /package/dist/{components → react/components}/svgs/nodes/flowchartDiagram/FlowchartProcessNodeSVG.d.ts +0 -0
  285. /package/dist/{components → react/components}/svgs/nodes/flowchartDiagram/FlowchartTerminalNodeSVG.d.ts +0 -0
  286. /package/dist/{components → react/components}/svgs/nodes/flowchartDiagram/index.d.ts +0 -0
  287. /package/dist/{components → react/components}/svgs/nodes/index.d.ts +0 -0
  288. /package/dist/{components → react/components}/svgs/nodes/objectDiagram/index.d.ts +0 -0
  289. /package/dist/{components → react/components}/svgs/nodes/petriNetDiagram/PetriNetPlaceSVG.d.ts +0 -0
  290. /package/dist/{components → react/components}/svgs/nodes/petriNetDiagram/PetriNetTransitionSVG.d.ts +0 -0
  291. /package/dist/{components → react/components}/svgs/nodes/petriNetDiagram/index.d.ts +0 -0
  292. /package/dist/{components → react/components}/svgs/nodes/reachabilityGraphDiagram/ReachabilityGraphMarkingSVG.d.ts +0 -0
  293. /package/dist/{components → react/components}/svgs/nodes/reachabilityGraphDiagram/index.d.ts +0 -0
  294. /package/dist/{components → react/components}/svgs/nodes/sfcDiagram/SfcActionTableNodeSVG.d.ts +0 -0
  295. /package/dist/{components → react/components}/svgs/nodes/sfcDiagram/SfcJumpNodeSVG.d.ts +0 -0
  296. /package/dist/{components → react/components}/svgs/nodes/sfcDiagram/SfcStartNodeSVG.d.ts +0 -0
  297. /package/dist/{components → react/components}/svgs/nodes/sfcDiagram/SfcStepNodeSVG.d.ts +0 -0
  298. /package/dist/{components → react/components}/svgs/nodes/sfcDiagram/SfcTransitionBranchNodeSVG.d.ts +0 -0
  299. /package/dist/{components → react/components}/svgs/nodes/sfcDiagram/index.d.ts +0 -0
  300. /package/dist/{components → react/components}/svgs/nodes/syntaxTreeDiagram/SyntaxTreeNonterminalNodeSVG.d.ts +0 -0
  301. /package/dist/{components → react/components}/svgs/nodes/syntaxTreeDiagram/SyntaxTreeTerminalNodeSVG.d.ts +0 -0
  302. /package/dist/{components → react/components}/svgs/nodes/syntaxTreeDiagram/index.d.ts +0 -0
  303. /package/dist/{components → react/components}/svgs/nodes/useCaseDiagram/UseCaseActorNodeSVG.d.ts +0 -0
  304. /package/dist/{components → react/components}/svgs/nodes/useCaseDiagram/UseCaseNodeSVG.d.ts +0 -0
  305. /package/dist/{components → react/components}/svgs/nodes/useCaseDiagram/UseCaseSystemNodeSVG.d.ts +0 -0
  306. /package/dist/{components → react/components}/svgs/nodes/useCaseDiagram/index.d.ts +0 -0
  307. /package/dist/{components → react/components}/toolbars/NodeToolbar.d.ts +0 -0
  308. /package/dist/{components → react/components}/toolbars/edgeToolBar/index.d.ts +0 -0
  309. /package/dist/{components → react/components}/toolbars/index.d.ts +0 -0
  310. /package/dist/{components → react/components}/ui/DividerLine.d.ts +0 -0
  311. /package/dist/{components → react/components}/ui/HeaderSwitchElement.d.ts +0 -0
  312. /package/dist/{components → react/components}/ui/PrimaryButton.d.ts +0 -0
  313. /package/dist/{components → react/components}/ui/StereotypeButtonGroup.d.ts +0 -0
  314. /package/dist/{components → react/components}/ui/StyleEditor/EdgeStyleEditor.d.ts +0 -0
  315. /package/dist/{components → react/components}/ui/StyleEditor/NodeStyleEditor.d.ts +0 -0
  316. /package/dist/{components → react/components}/ui/StyleEditor/index.d.ts +0 -0
  317. /package/dist/{components → react/components}/ui/TextField.d.ts +0 -0
  318. /package/dist/{components → react/components}/ui/Typography.d.ts +0 -0
  319. /package/dist/{components → react/components}/ui/index.d.ts +0 -0
  320. /package/dist/{components → react/components}/wrapper/AssessmentSelectableWrapper.d.ts +0 -0
  321. /package/dist/{components → react/components}/wrapper/FeedbackDropzone.d.ts +0 -0
  322. /package/dist/{components → react/components}/wrapper/index.d.ts +0 -0
  323. /package/dist/{edges → react/edges}/Connection.d.ts +0 -0
  324. /package/dist/{edges → react/edges}/EdgeProps.d.ts +0 -0
  325. /package/dist/{edges → react/edges}/edgeTypes/index.d.ts +0 -0
  326. /package/dist/{edges → react/edges}/index.d.ts +0 -0
  327. /package/dist/{enums → react/enums}/Quadrant.d.ts +0 -0
  328. /package/dist/{hooks → react/hooks}/index.d.ts +0 -0
  329. /package/dist/{hooks → react/hooks}/useAssessmentSelection.d.ts +0 -0
  330. /package/dist/{hooks → react/hooks}/useConnect.d.ts +0 -0
  331. /package/dist/{hooks → react/hooks}/useDiagramModifiable.d.ts +0 -0
  332. /package/dist/{hooks → react/hooks}/useDragOver.d.ts +0 -0
  333. /package/dist/{hooks → react/hooks}/useDropFeedback.d.ts +0 -0
  334. /package/dist/{hooks → react/hooks}/useEdgeConfig.d.ts +0 -0
  335. /package/dist/{hooks → react/hooks}/useEdgeToolbar.d.ts +0 -0
  336. /package/dist/{hooks → react/hooks}/useEdges.d.ts +0 -0
  337. /package/dist/{hooks → react/hooks}/useElementInteractions.d.ts +0 -0
  338. /package/dist/{hooks → react/hooks}/useGoToNextAssessment.d.ts +0 -0
  339. /package/dist/{hooks → react/hooks}/useHandleDelete.d.ts +0 -0
  340. /package/dist/{hooks → react/hooks}/useHandleOnResize.d.ts +0 -0
  341. /package/dist/{hooks → react/hooks}/useIsOnlyThisElementSelected.d.ts +0 -0
  342. /package/dist/{hooks → react/hooks}/useKeyboardShortcuts.d.ts +0 -0
  343. /package/dist/{hooks → react/hooks}/useMessagePositioning.d.ts +0 -0
  344. /package/dist/{hooks → react/hooks}/useNodeDrag.d.ts +0 -0
  345. /package/dist/{hooks → react/hooks}/useNodeDragStop.d.ts +0 -0
  346. /package/dist/{hooks → react/hooks}/usePaneClicked.d.ts +0 -0
  347. /package/dist/{hooks → react/hooks}/useSelectionForCopyPaste.d.ts +0 -0
  348. /package/dist/{hooks → react/hooks}/useViewPointCenter.d.ts +0 -0
  349. /package/dist/{logger.d.ts → react/logger.d.ts} +0 -0
  350. /package/dist/{nodes → react/nodes}/activityDiagram/index.d.ts +0 -0
  351. /package/dist/{nodes → react/nodes}/bpmn/index.d.ts +0 -0
  352. /package/dist/{nodes → react/nodes}/classDiagram/index.d.ts +0 -0
  353. /package/dist/{nodes → react/nodes}/communicationDiagram/index.d.ts +0 -0
  354. /package/dist/{nodes → react/nodes}/componentDiagram/index.d.ts +0 -0
  355. /package/dist/{nodes → react/nodes}/deploymentDiagram/index.d.ts +0 -0
  356. /package/dist/{nodes → react/nodes}/flowchart/index.d.ts +0 -0
  357. /package/dist/{nodes → react/nodes}/index.d.ts +0 -0
  358. /package/dist/{nodes → react/nodes}/objectDiagram/index.d.ts +0 -0
  359. /package/dist/{nodes → react/nodes}/petriNetDiagram/index.d.ts +0 -0
  360. /package/dist/{nodes → react/nodes}/reachabilityGraphDiagram/index.d.ts +0 -0
  361. /package/dist/{nodes → react/nodes}/sfcDiagram/index.d.ts +0 -0
  362. /package/dist/{nodes → react/nodes}/types.d.ts +0 -0
  363. /package/dist/{nodes → react/nodes}/useCaseDiagram/index.d.ts +0 -0
  364. /package/dist/{nodes → react/nodes}/wrappers/index.d.ts +0 -0
  365. /package/dist/{store → react/store}/alignmentGuidesStore.d.ts +0 -0
  366. /package/dist/{store → react/store}/assessmentSelectionStore.d.ts +0 -0
  367. /package/dist/{store → react/store}/diagramStore.d.ts +0 -0
  368. /package/dist/{store → react/store}/popoverStore.d.ts +0 -0
  369. /package/dist/{styles → react/styles}/theme.d.ts +0 -0
  370. /package/dist/{sync → react/sync}/ydoc.d.ts +0 -0
  371. /package/dist/{types → react/types}/DiagramType.d.ts +0 -0
  372. /package/dist/{types → react/types}/SVG.d.ts +0 -0
  373. /package/dist/{types → react/types}/index.d.ts +0 -0
  374. /package/dist/{types → react/types}/locationPopover.d.ts +0 -0
  375. /package/dist/{types → react/types}/nodes/DropNodeDate.d.ts +0 -0
  376. /package/dist/{types → react/types}/nodes/NodeProps.d.ts +0 -0
  377. /package/dist/{types → react/types}/nodes/enums/ClassType.d.ts +0 -0
  378. /package/dist/{types → react/types}/nodes/enums/index.d.ts +0 -0
  379. /package/dist/{types → react/types}/nodes/index.d.ts +0 -0
  380. /package/dist/{utils → react/utils}/bpmnConstraints.d.ts +0 -0
  381. /package/dist/{utils → react/utils}/copyPasteUtils.d.ts +0 -0
  382. /package/dist/{utils → react/utils}/deepPartial.d.ts +0 -0
  383. /package/dist/{utils → react/utils}/diagramTypeUtils.d.ts +0 -0
  384. /package/dist/{utils → react/utils}/helpers.d.ts +0 -0
  385. /package/dist/{utils → react/utils}/layoutUtils.d.ts +0 -0
  386. /package/dist/{utils → react/utils}/pathParsing.d.ts +0 -0
  387. /package/dist/{utils → react/utils}/popoverUtils.d.ts +0 -0
  388. /package/dist/{utils → react/utils}/quadrantUtils.d.ts +0 -0
  389. /package/dist/{utils → react/utils}/requiredInterfaceUtils.d.ts +0 -0
  390. /package/dist/{utils → react/utils}/svgTextLayout.d.ts +0 -0
  391. /package/dist/{utils → react/utils}/v3Typings.d.ts +0 -0
  392. /package/dist/{utils → react/utils}/versionConverter.d.ts +0 -0
package/README.md CHANGED
@@ -1,85 +1,257 @@
1
+ <div align="center">
2
+
1
3
  # @tumaet/apollon
2
4
 
3
5
  [![npm version](https://img.shields.io/npm/v/@tumaet/apollon)](https://www.npmjs.com/package/@tumaet/apollon)
4
- [![npm license](https://img.shields.io/npm/l/@tumaet/apollon)](https://github.com/ls1intum/Apollon/blob/main/LICENSE)
6
+ [![npm downloads](https://img.shields.io/npm/dm/@tumaet/apollon)](https://www.npmjs.com/package/@tumaet/apollon)
7
+ [![license](https://img.shields.io/npm/l/@tumaet/apollon)](https://github.com/ls1intum/Apollon/blob/main/LICENSE)
8
+ [![types included](https://img.shields.io/npm/types/@tumaet/apollon)](https://www.npmjs.com/package/@tumaet/apollon)
9
+
10
+ **Embeddable UML modeling editor for the web.** Mounts into any DOM node and works inside Angular, Vue, Svelte, vanilla JS, or React.
11
+
12
+ [**▶ Live demo**](https://apollon.aet.cit.tum.de) · [Docs](https://ls1intum.github.io/Apollon/library/) · [API reference](https://ls1intum.github.io/Apollon/library/api) · [Examples](https://ls1intum.github.io/Apollon/library/embedding/react) · [GitHub](https://github.com/ls1intum/Apollon)
13
+
14
+ </div>
5
15
 
6
- A UML modeling editor for React. Mount it into any DOM node. 13 diagram types, SVG/PNG/PDF/JSON export, optional real-time collaboration via Yjs.
16
+ ---
17
+
18
+ Apollon is the modeling editor behind [Artemis](https://artemis.tum.de/), TUM's interactive learning platform. The API is imperative: you call `new ApollonEditor(container, options)` and the editor renders its own React tree inside that node, so your own code never touches React. In a React app, render the [`<Apollon>` component](#react) instead.
19
+
20
+ ## Features
21
+
22
+ - **13 diagram types**: class, object, activity, use case, communication, component, deployment, Petri net, reachability graph, syntax tree, flowchart, BPMN, and SFC.
23
+ - **Framework-agnostic**: one imperative API for Angular, Vue, Svelte, and vanilla JS, plus a React component, hooks, and provider.
24
+ - **Real-time collaboration**: opt-in multi-user editing over [Yjs](https://yjs.dev/), with any transport you like (WebSocket, WebRTC, BroadcastChannel).
25
+ - **Export**: SVG and JSON are built in. Generate PNG and PDF from the SVG (see [Export](#export)).
26
+ - **Assessment mode**: attach scores and feedback to elements. This is the grading workflow Artemis uses.
27
+ - **TypeScript**: type definitions are included.
7
28
 
8
29
  ## Install
9
30
 
31
+ The package ships two builds with the same API. Pick one based on whether your host already uses React:
32
+
33
+ | Import | React / MUI / emotion / xyflow | Size (min / gzip) | Use when |
34
+ | ----------------------------- | ------------------------------ | ----------------- | ------------------------------------------------------------------------------------------------------- |
35
+ | `@tumaet/apollon` _(default)_ | **bundled** | ~2.4 MB / ~540 KB | Your host is Angular, Vue, Svelte, or vanilla JS. No peer deps to install. |
36
+ | `@tumaet/apollon/react` | **peer deps** (shared) | ~875 KB / ~170 KB | Your host is React 18.3 and should share its React and MUI with the editor instead of duplicating them. |
37
+
38
+ Sizes are the published entry chunks. Gzip is the transfer size. The `/react` number excludes the peers your app already ships.
39
+
40
+ ### Standalone build (any framework, no peer deps)
41
+
10
42
  ```sh
11
43
  npm install @tumaet/apollon
12
44
  ```
13
45
 
14
- ## Usage
46
+ ```ts
47
+ import { ApollonEditor } from "@tumaet/apollon"
48
+ import "@tumaet/apollon/style.css"
49
+ ```
50
+
51
+ React, MUI, emotion, and xyflow are bundled in. Nothing else to install.
52
+
53
+ ### React build (share your host's React)
54
+
55
+ ```sh
56
+ npm install @tumaet/apollon \
57
+ react react-dom \
58
+ @emotion/react @emotion/styled @mui/material @xyflow/react
59
+ ```
60
+
61
+ ```tsx
62
+ import { Apollon } from "@tumaet/apollon/react"
63
+ import "@tumaet/apollon/style.css"
64
+ ```
65
+
66
+ | Peer | Range | | Peer | Range |
67
+ | --------------- | --------- | --- | ----------------- | ---------- |
68
+ | `react` | `^18.3.0` | | `@mui/material` | `^6.4.0` |
69
+ | `react-dom` | `^18.3.0` | | `@emotion/react` | `^11.11.0` |
70
+ | `@xyflow/react` | `^12.3.0` | | `@emotion/styled` | `^11.11.0` |
71
+
72
+ ## Which build do I use?
73
+
74
+ It comes down to whether your host already runs React:
75
+
76
+ - **Not a React app?** Use the default `@tumaet/apollon`. It bundles its own React, so there is nothing extra to install or configure.
77
+ - **A React app?** Use `@tumaet/apollon/react` and install the peers above. The default build bundles its own React, so in a React app you would load two copies. That causes "Invalid hook call" errors and a larger bundle. The `/react` subpath leaves React, MUI, emotion, and xyflow external so the editor shares the copies your app already has. It is also the only entry that exports the `<Apollon>` component, hooks, and provider.
78
+
79
+ > **⚠️ Give the container an explicit, non-zero height** (`600px`, `80vh`, or a sized flex/grid child), whichever build you use. The canvas sizes itself to its parent, so with no resolvable height it collapses to zero pixels and renders blank. This is the most common embedding mistake. See [Troubleshooting](https://ls1intum.github.io/Apollon/library/troubleshooting).
80
+
81
+ ## Quick start
15
82
 
16
83
  ```ts
17
- import {
18
- ApollonEditor,
19
- ApollonMode,
20
- Locale,
21
- UMLDiagramType,
22
- } from "@tumaet/apollon"
84
+ import { ApollonEditor, UMLDiagramType } from "@tumaet/apollon"
85
+ import "@tumaet/apollon/style.css"
23
86
 
24
87
  const container = document.getElementById("apollon")
25
88
  if (!container) throw new Error("#apollon container missing")
26
89
 
27
90
  const editor = new ApollonEditor(container, {
28
91
  type: UMLDiagramType.ClassDiagram,
29
- mode: ApollonMode.Modelling,
30
- locale: Locale.en,
31
- // model, theme, readonly, enablePopups, colorEnabled, scale,
32
- // collaborationEnabled, scrollLock — see `ApollonOptions`
33
92
  })
34
93
 
35
- // Read / write the model
36
- console.log(editor.model)
37
- editor.model = nextModel
38
-
39
- // React to edits
40
94
  const subscriptionId = editor.subscribeToModelChange((model) => {
41
- // persist / broadcast
95
+ // persist / broadcast the latest diagram JSON
42
96
  })
43
97
 
44
- // Export
45
- const svg = await editor.exportAsSVG({ svgMode: "web" })
98
+ const { svg } = await editor.exportAsSVG()
46
99
 
47
- // Teardown
48
100
  editor.unsubscribe(subscriptionId)
49
101
  editor.destroy()
50
102
  ```
51
103
 
52
- The editor mounts into the DOM and is client-only. In SSR frameworks (Next.js, Remix), instantiate inside `useEffect` or behind a dynamic import. Call `editor.destroy()` before re-mounting on the same container.
104
+ The editor is client-only. In SSR frameworks (Next.js, Remix, SvelteKit, Nuxt), construct it from a client-side effect, never during render. Always call `editor.destroy()` before re-mounting on the same container.
105
+
106
+ ## Embedding examples
107
+
108
+ ### React
109
+
110
+ Render the `<Apollon>` component from the `@tumaet/apollon/react` subpath. It owns the editor's lifecycle: it constructs on mount and destroys on unmount.
111
+
112
+ ```tsx
113
+ import { Apollon } from "@tumaet/apollon/react"
114
+ import type { UMLModel } from "@tumaet/apollon"
115
+ import "@tumaet/apollon/style.css"
116
+
117
+ export function DiagramEditor({ initialModel }: { initialModel?: UMLModel }) {
118
+ return (
119
+ <Apollon
120
+ style={{ height: 600 }}
121
+ defaultModel={initialModel}
122
+ onMount={(editor) => {
123
+ const id = editor.subscribeToModelChange((model) => {
124
+ localStorage.setItem("diagram", JSON.stringify(model))
125
+ })
126
+ return () => editor.unsubscribe(id)
127
+ }}
128
+ />
129
+ )
130
+ }
131
+ ```
132
+
133
+ Reach the instance through `ref`, the `onMount(editor)` callback, or the `useApollonEditor()` hook. See the [React embedding guide](https://ls1intum.github.io/Apollon/library/embedding/react) for hooks, the provider, and SSR.
134
+
135
+ ### Angular (17.3+ signal-based)
136
+
137
+ ```ts
138
+ import {
139
+ Component,
140
+ DestroyRef,
141
+ ElementRef,
142
+ afterNextRender,
143
+ inject,
144
+ input,
145
+ viewChild,
146
+ } from "@angular/core"
147
+ import { ApollonEditor, type UMLModel } from "@tumaet/apollon"
148
+ import "@tumaet/apollon/style.css"
149
+
150
+ @Component({
151
+ selector: "app-diagram-editor",
152
+ template: `<div #host style="width: 100%; height: 100%"></div>`,
153
+ })
154
+ export class DiagramEditorComponent {
155
+ readonly initialModel = input<UMLModel>()
156
+ private host = viewChild.required<ElementRef<HTMLDivElement>>("host")
157
+
158
+ constructor() {
159
+ const destroyRef = inject(DestroyRef)
160
+ afterNextRender(() => {
161
+ const editor = new ApollonEditor(this.host().nativeElement, {
162
+ model: this.initialModel(),
163
+ })
164
+ const subId = editor.subscribeToModelChange((model) => {
165
+ localStorage.setItem("diagram", JSON.stringify(model))
166
+ })
167
+ destroyRef.onDestroy(() => {
168
+ editor.unsubscribe(subId)
169
+ editor.destroy()
170
+ })
171
+ })
172
+ }
173
+ }
174
+ ```
175
+
176
+ `afterNextRender` runs only in the browser, so this is SSR-safe.
177
+
178
+ ### Vanilla JS / CDN
179
+
180
+ ```html
181
+ <link rel="stylesheet" href="https://esm.sh/@tumaet/apollon@4.6.0/style.css" />
182
+ <div id="apollon" style="width: 100%; height: 600px"></div>
183
+
184
+ <script type="module">
185
+ import { ApollonEditor } from "https://esm.sh/@tumaet/apollon@4.6.0"
53
186
 
54
- Type definitions ship with the package (`dist/index.d.ts`).
187
+ const saved = localStorage.getItem("diagram")
188
+ const editor = new ApollonEditor(document.getElementById("apollon"), {
189
+ model: saved ? JSON.parse(saved) : undefined,
190
+ })
191
+
192
+ editor.subscribeToModelChange((model) => {
193
+ localStorage.setItem("diagram", JSON.stringify(model))
194
+ })
195
+ </script>
196
+ ```
197
+
198
+ > **⚠️ Pin an exact version**, as the URLs above do. An unpinned CDN URL resolves to `latest`, so a new major can land on the next page refresh and break your embed.
55
199
 
56
200
  ## Supported diagrams
57
201
 
58
- `ClassDiagram`, `ObjectDiagram`, `ActivityDiagram`, `UseCaseDiagram`, `CommunicationDiagram`, `ComponentDiagram`, `DeploymentDiagram`, `PetriNet`, `ReachabilityGraph`, `SyntaxTree`, `Flowchart`, `BPMN`, `Sfc` (Sequential Function Chart).
202
+ Class, Object, Activity, Use Case, Communication, Component, Deployment, Petri Net, Reachability Graph, Syntax Tree, Flowchart, BPMN, SFC. The `UMLDiagramType` enum holds the exact string values.
59
203
 
60
204
  ## Real-time collaboration
61
205
 
62
- Collaboration is opt-in and transport-agnostic. Enable `collaborationEnabled` in `ApollonOptions`, then wire your transport to the editor's Yjs bridge:
206
+ Collaboration is opt-in and transport-agnostic. Set `collaborationEnabled: true`, then wire up your transport:
63
207
 
64
208
  ```ts
209
+ const editor = new ApollonEditor(container, { collaborationEnabled: true })
210
+
211
+ // Outbound: the editor calls back when it has bytes to send.
65
212
  editor.sendBroadcastMessage((base64) => transport.send(base64))
213
+
214
+ // Inbound: forward every received frame back to the editor.
66
215
  transport.onMessage((base64) => editor.receiveBroadcastedMessage(base64))
67
216
  ```
68
217
 
69
- Use any Yjs-compatible transport (WebSocket, WebRTC, `y-websocket`, etc.).
218
+ To let the library render participant presence, live cursors, and remote node/edge selection highlights, pass the optional `collaboration` UI config:
219
+
220
+ ```ts
221
+ const editor = new ApollonEditor(container, {
222
+ collaborationEnabled: true,
223
+ collaboration: {
224
+ enabled: true,
225
+ user: { name: "Ada", color: "#1c7ed6" },
226
+ },
227
+ })
228
+ ```
229
+
230
+ Any Yjs-compatible transport works: `y-websocket`, `y-webrtc`, BroadcastChannel, or your own relay. Cursor and selection awareness travel on the same channel. See [Collaboration](https://ls1intum.github.io/Apollon/library/api/collaboration).
70
231
 
71
232
  ## Export
72
233
 
73
- - `editor.exportAsSVG(options)` resolves to `{ svg, clip }` render or serialize as-is.
74
- - PNG and PDF use the same pipeline via `ExportOptions` (`svgMode: "web" | "compat"`); see `dist/index.d.ts`.
75
- - `editor.model` returns the `UMLModel` as JSON.
234
+ - **SVG**: `await editor.exportAsSVG(options)` resolves to `{ svg, clip }`. `svgMode: "web"` (the default) keeps CSS variables for theme-adaptive output; `"compat"` inlines them for PDF and Inkscape.
235
+ - **JSON**: `editor.model` returns the `UMLModel`, and assigning it back is round-trip safe. Use `importDiagram(json)` to normalize older v2/v3 models first.
236
+ - **Headless**: `ApollonEditor.exportModelAsSvg(model, options)` renders a model without a mounted editor.
237
+ - **PNG / PDF**: not built in. Generate them from the exported SVG. The standalone webapp and server in this repo do this with `@resvg/resvg-js` (PNG) and `pdfmake` (PDF).
238
+
239
+ See [Export](https://ls1intum.github.io/Apollon/library/api/export) for the full `ExportOptions`.
240
+
241
+ ## Documentation
242
+
243
+ - [Library overview](https://ls1intum.github.io/Apollon/library/): install, quickstart, embedding
244
+ - [API reference](https://ls1intum.github.io/Apollon/library/api): the full `ApollonEditor` and `<Apollon>` surface
245
+ - [Troubleshooting](https://ls1intum.github.io/Apollon/library/troubleshooting): blank canvas, SSR, duplicate React, and other gotchas
246
+
247
+ The server-side wire protocol is exposed through the `@tumaet/apollon/internals` subpath. It is unstable and not covered by SemVer.
76
248
 
77
249
  ## Related
78
250
 
79
- - Source and issue tracker: <https://github.com/ls1intum/Apollon>
80
- - Standalone web editor, server, and mobile apps live in the same monorepo.
81
- - Developed alongside [Artemis](https://artemis.tum.de/), TUM's interactive learning platform.
251
+ - Source and issues: <https://github.com/ls1intum/Apollon>
252
+ - Live editor: <https://apollon.aet.cit.tum.de>
253
+ - The standalone web editor, collaboration server, and [VS Code extension](https://marketplace.visualstudio.com/items?itemName=tumaet.apollon-vscode) live in the same monorepo.
82
254
 
83
255
  ## License
84
256
 
85
- MIT see [LICENSE](https://github.com/ls1intum/Apollon/blob/main/LICENSE).
257
+ MIT. See [LICENSE](https://github.com/ls1intum/Apollon/blob/main/LICENSE).
@@ -1 +1 @@
1
- .alignment-guides-svg{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:999}.alignment-guide-line{stroke-width:1;stroke-dasharray:5,5;pointer-events:none;opacity:.8;animation:alignmentPulse .8s ease-in-out infinite}.alignment-guide-vertical{stroke:var(--apollon-guide-vertical, #d63031)}.alignment-guide-horizontal{stroke:var(--apollon-guide-horizontal, #0984e3)}@keyframes alignmentPulse{0%,to{opacity:.8}50%{opacity:.5}}.react-flow{direction:ltr;--xy-edge-stroke-default: #b1b1b7;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #555;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(255, 255, 255, .5);--xy-minimap-background-color-default: #fff;--xy-minimap-mask-background-color-default: rgb(240, 240, 240, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #e2e2e2;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: transparent;--xy-background-pattern-dots-color-default: #91919a;--xy-background-pattern-lines-color-default: #eee;--xy-background-pattern-cross-color-default: #e2e2e2;background-color:var(--xy-background-color, var(--xy-background-color-default));--xy-node-color-default: inherit;--xy-node-border-default: 1px solid #1a192b;--xy-node-background-color-default: #fff;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #1a192b;--xy-node-border-radius-default: 3px;--xy-handle-background-color-default: #1a192b;--xy-handle-border-color-default: #fff;--xy-selection-background-color-default: rgba(0, 89, 220, .08);--xy-selection-border-default: 1px dotted rgba(0, 89, 220, .8);--xy-controls-button-background-color-default: #fefefe;--xy-controls-button-background-color-hover-default: #f4f4f4;--xy-controls-button-color-default: inherit;--xy-controls-button-color-hover-default: inherit;--xy-controls-button-border-color-default: #eee;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #ffffff;--xy-edge-label-color-default: inherit;--xy-resize-background-color-default: #3367d9}.react-flow.dark{--xy-edge-stroke-default: #3e3e3e;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #727272;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(150, 150, 150, .25);--xy-minimap-background-color-default: #141414;--xy-minimap-mask-background-color-default: rgb(60, 60, 60, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #2b2b2b;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: #141414;--xy-background-pattern-dots-color-default: #777;--xy-background-pattern-lines-color-default: #777;--xy-background-pattern-cross-color-default: #777;--xy-node-color-default: #f8f8f8;--xy-node-border-default: 1px solid #3c3c3c;--xy-node-background-color-default: #1e1e1e;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #999;--xy-handle-background-color-default: #bebebe;--xy-handle-border-color-default: #1e1e1e;--xy-selection-background-color-default: rgba(200, 200, 220, .08);--xy-selection-border-default: 1px dotted rgba(200, 200, 220, .8);--xy-controls-button-background-color-default: #2b2b2b;--xy-controls-button-background-color-hover-default: #3e3e3e;--xy-controls-button-color-default: #f8f8f8;--xy-controls-button-color-hover-default: #fff;--xy-controls-button-border-color-default: #5b5b5b;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #141414;--xy-edge-label-color-default: #f8f8f8}.react-flow__background{background-color:var(--xy-background-color, var(--xy-background-color-props, var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.react-flow__pane{z-index:1}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{overflow:visible;position:absolute;pointer-events:none}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}svg.react-flow__connectionline{z-index:1001;overflow:visible;position:absolute}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.react-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.react-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background-color:var(--xy-handle-background-color, var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));border-radius:100%}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;left:50%;bottom:0;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__panel{position:absolute;z-index:5;margin:15px}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.center{left:50%;transform:translate(-50%)}.react-flow__attribution{font-size:10px;background:var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));padding:2px 3px;margin:0}.react-flow__attribution a{text-decoration:none;color:#999}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;left:0;top:0}.react-flow__viewport-portal{position:absolute;width:100%;height:100%;left:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__minimap{background:var( --xy-minimap-background-color-props, var(--xy-minimap-background-color, var(--xy-minimap-background-color-default)) )}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var( --xy-minimap-mask-background-color-props, var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default)) );stroke:var( --xy-minimap-mask-stroke-color-props, var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default)) );stroke-width:var( --xy-minimap-mask-stroke-width-props, var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default)) )}.react-flow__minimap-node{fill:var( --xy-minimap-node-background-color-props, var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default)) );stroke:var( --xy-minimap-node-stroke-color-props, var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default)) );stroke-width:var( --xy-minimap-node-stroke-width-props, var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default)) )}.react-flow__background-pattern.dots{fill:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default)) )}.react-flow__background-pattern.lines{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default)) )}.react-flow__background-pattern.cross{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default)) )}.react-flow__controls{display:flex;flex-direction:column;box-shadow:var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default))}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{display:flex;justify-content:center;align-items:center;height:26px;width:26px;padding:4px;border:none;background:var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));border-bottom:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) );color:var( --xy-controls-button-color-props, var(--xy-controls-button-color, var(--xy-controls-button-color-default)) );cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__controls-button svg{width:100%;max-width:12px;max-height:12px;fill:currentColor}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{padding:10px;border-radius:var(--xy-node-border-radius, var(--xy-node-border-radius-default));width:150px;font-size:12px;color:var(--xy-node-color, var(--xy-node-color-default));text-align:center;border:var(--xy-node-border, var(--xy-node-border-default));background-color:var(--xy-node-background-color, var(--xy-node-background-color-default))}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color, var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color, var(--xy-selection-background-color-default));border:var(--xy-selection-border, var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var( --xy-controls-button-background-color-hover-props, var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default)) );color:var( --xy-controls-button-color-hover-props, var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default)) )}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{width:4px;height:4px;border:1px solid #fff;border-radius:1px;background-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));transform:translate(-50%,-50%)}.react-flow__resize-control.handle.left{left:0;top:50%}.react-flow__resize-control.handle.right{left:100%;top:50%}.react-flow__resize-control.handle.top{left:50%;top:0}.react-flow__resize-control.handle.bottom{left:50%;top:100%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));border-width:0;border-style:solid}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.react-flow__resize-control.line.left{left:0;border-left-width:1px}.react-flow__resize-control.line.right{left:100%;border-right-width:1px}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.react-flow__resize-control.line.top{top:0;border-top-width:1px}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color, var(--xy-edge-label-color-default))}.react-flow{--panel-background: var(--apollon-background, #ffffff);--panel-shadow: 0 0 4px 0 var(--apollon-background-variant, #f8f9fa);--text: var(--apollon-primary-contrast, #000000);--xy-edge-stroke: var(--apollon-primary-contrast, #000000);--xy-edge-stroke-width: 2px;--xy-minimap-mask-background-color-props: #00000020;--xy-controls-button-background-color: var(--apollon-background, #ffffff)}.apollon-editor{background-color:var(--apollon-background, #ffffff);color:var(--apollon-primary-contrast, #000000)}.react-flow__controls-button{background:none;border-bottom:none}.react-flow__panel,.react-flow__node-toolbar{background-color:var(--panel-background);box-shadow:var(--panel-shadow);border-radius:8px;padding:8px}.react-flow svg{display:block}.react-flow__node-toolbar{display:flex;gap:8px}.react-flow__controls-button,.react-flow__controls-button:hover{background:var(--panel-background);border-bottom:none}.react-flow__controls-button>svg{fill:var(--text)}.react-flow__handle{opacity:0;background-color:transparent}.react-flow__handle.apollon-arc-handle:before{content:"";position:absolute;background-color:var(--apollon-primary, #3e8acc);opacity:.4;box-sizing:border-box;pointer-events:all;cursor:crosshair}.react-flow__handle.apollon-arc-handle--top:before{width:28px;height:14px;left:50%;top:50%;transform:translate(-50%,-100%);border-radius:14px 14px 0 0}.react-flow__handle.apollon-arc-handle--right:before{width:14px;height:28px;left:50%;top:50%;transform:translateY(-50%);border-radius:0 14px 14px 0}.react-flow__handle.apollon-arc-handle--bottom:before{width:28px;height:14px;left:50%;top:50%;transform:translate(-50%);border-radius:0 0 14px 14px}.react-flow__handle.apollon-arc-handle--left:before{width:14px;height:28px;left:50%;top:50%;transform:translate(-100%,-50%);border-radius:14px 0 0 14px}.react-flow__resize-control line{z-index:9}.react-flow__resize-control.handle{z-index:20}.react-flow__resize-control{opacity:0;pointer-events:none;transition:opacity .12s ease}.react-flow__node:hover .react-flow__resize-control,.react-flow__node.selected .react-flow__resize-control{opacity:1;pointer-events:all}.react-flow__node:hover .react-flow__handle,.react-flow__node.selected .react-flow__handle{opacity:1;background-color:transparent;pointer-events:all;cursor:crosshair}.edge-circle{opacity:0;background-color:var(--apollon-primary, #3e8acc)}.react-flow__edge:hover .edge-circle,.react-flow__edge.selected .edge-circle{opacity:.4;padding:4px;fill:var(--apollon-primary, #3e8acc)}.react-flow__edge:hover .edge-overlay,.react-flow__edge:hover .edge-marker-highlight,.react-flow__edge.selected .edge-overlay,.react-flow__edge.selected .edge-marker-highlight{opacity:.4;padding:4px;stroke:var(--apollon-primary, #3e8acc);stroke-width:15px}.react-flow__node:hover,.react-flow__node.selected{opacity:.9;box-shadow:0 0 0 2px var(--apollon-primary, #3e8acc);border-radius:4px}.apollon-interactive-selection{--apollon-interactive-selection-color: var( --apollon-interactive-selection, #f39c12 )}.apollon-interactive-selection--selected [stroke]:not([stroke=none]){stroke:var(--apollon-interactive-selection-color)}.apollon-interactive-selection--selected .react-flow__edge-path{stroke-width:3px}.apollon-interactive-selection--selected .edge-overlay,.apollon-interactive-selection--selected .edge-marker-highlight{opacity:.45;stroke:var(--apollon-interactive-selection-color);stroke-width:15px}.react-flow__edges{z-index:9999}.react-flow__node{z-index:9998}svg.react-flow__connectionline{z-index:10000}.react-flow__connection-path{stroke:var(--xy-edge-stroke);stroke-width:var(--xy-edge-stroke-width);opacity:.5}.react-flow__minimap-mask{fill:"#f2f2f2";opacity:.6}.prevent-select{-webkit-user-select:none;-ms-user-select:none;user-select:none}.control-button{background-color:var(--apollon-background, #ffffff);border:1px solid var(--apollon-gray-variant, #495057);border-radius:8px;padding:6px 8px;cursor:pointer;opacity:1;display:flex;align-items:center;justify-content:center;min-width:32px;height:32px;font-size:14px;font-weight:700;transition:background-color .2s ease}.control-button:hover:not(.disabled){background-color:var(--apollon-background-variant, #f8f9fa)}.control-button.disabled{cursor:not-allowed;opacity:.5}.control-button.disabled:hover{background-color:var(--apollon-background, #ffffff)}.horizontally-not-resizable .react-flow__resize-control.top.line:hover,.horizontally-not-resizable .react-flow__resize-control.bottom.line:hover,.vertically-not-resizable .react-flow__resize-control.right.line:hover,.vertically-not-resizable .react-flow__resize-control.left.line:hover{cursor:grab}.apollon-editor .MuiSelect-select,.apollon-editor .MuiFormLabel-root{color:var(--apollon-primary-contrast, #000000)!important}.apollon-editor .MuiOutlinedInput-notchedOutline{border-color:var(--apollon-primary-contrast, #000000)!important}.apollon-editor .MuiSvgIcon-root{color:var(--apollon-primary-contrast, #000000)!important}.scroll-overlay{position:absolute;top:0;left:0;right:0;bottom:0;background-color:var(--apollon-grid, rgba(36, 39, 36, .1));-webkit-backdrop-filter:blur(.5px);backdrop-filter:blur(.5px);z-index:10;cursor:not-allowed;animation:fadeIn .2s ease-in-out;display:flex;align-items:center;justify-content:center;pointer-events:auto}.scroll-overlay-hint{position:absolute;bottom:40px;left:50%;transform:translate(-50%);z-index:11}.scroll-overlay-hint-content{background-color:var(--apollon-background, #ffffff);border:2px solid var(--apollon-primary, #3e8acc);border-radius:8px;padding:16px 24px;box-shadow:0 4px 12px var(--apollon-grid, rgba(36, 39, 36, .1));display:flex;align-items:center;justify-content:center}.scroll-overlay-hint-text{margin:0;color:var(--apollon-primary, #3e8acc);font-weight:600;font-size:14px;text-align:center}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}
1
+ .alignment-guides-svg{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:999}.alignment-guide-line{stroke-width:1;stroke-dasharray:5,5;pointer-events:none;opacity:.8;animation:alignmentPulse .8s ease-in-out infinite}.alignment-guide-vertical{stroke:var(--apollon-guide-vertical, #d63031)}.alignment-guide-horizontal{stroke:var(--apollon-guide-horizontal, #0984e3)}@keyframes alignmentPulse{0%,to{opacity:.8}50%{opacity:.5}}.react-flow{direction:ltr;--xy-edge-stroke-default: #b1b1b7;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #555;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(255, 255, 255, .5);--xy-minimap-background-color-default: #fff;--xy-minimap-mask-background-color-default: rgb(240, 240, 240, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #e2e2e2;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: transparent;--xy-background-pattern-dots-color-default: #91919a;--xy-background-pattern-lines-color-default: #eee;--xy-background-pattern-cross-color-default: #e2e2e2;background-color:var(--xy-background-color, var(--xy-background-color-default));--xy-node-color-default: inherit;--xy-node-border-default: 1px solid #1a192b;--xy-node-background-color-default: #fff;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(0, 0, 0, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #1a192b;--xy-node-border-radius-default: 3px;--xy-handle-background-color-default: #1a192b;--xy-handle-border-color-default: #fff;--xy-selection-background-color-default: rgba(0, 89, 220, .08);--xy-selection-border-default: 1px dotted rgba(0, 89, 220, .8);--xy-controls-button-background-color-default: #fefefe;--xy-controls-button-background-color-hover-default: #f4f4f4;--xy-controls-button-color-default: inherit;--xy-controls-button-color-hover-default: inherit;--xy-controls-button-border-color-default: #eee;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #ffffff;--xy-edge-label-color-default: inherit;--xy-resize-background-color-default: #3367d9}.react-flow.dark{--xy-edge-stroke-default: #3e3e3e;--xy-edge-stroke-width-default: 1;--xy-edge-stroke-selected-default: #727272;--xy-connectionline-stroke-default: #b1b1b7;--xy-connectionline-stroke-width-default: 1;--xy-attribution-background-color-default: rgba(150, 150, 150, .25);--xy-minimap-background-color-default: #141414;--xy-minimap-mask-background-color-default: rgb(60, 60, 60, .6);--xy-minimap-mask-stroke-color-default: transparent;--xy-minimap-mask-stroke-width-default: 1;--xy-minimap-node-background-color-default: #2b2b2b;--xy-minimap-node-stroke-color-default: transparent;--xy-minimap-node-stroke-width-default: 2;--xy-background-color-default: #141414;--xy-background-pattern-dots-color-default: #777;--xy-background-pattern-lines-color-default: #777;--xy-background-pattern-cross-color-default: #777;--xy-node-color-default: #f8f8f8;--xy-node-border-default: 1px solid #3c3c3c;--xy-node-background-color-default: #1e1e1e;--xy-node-group-background-color-default: rgba(240, 240, 240, .25);--xy-node-boxshadow-hover-default: 0 1px 4px 1px rgba(255, 255, 255, .08);--xy-node-boxshadow-selected-default: 0 0 0 .5px #999;--xy-handle-background-color-default: #bebebe;--xy-handle-border-color-default: #1e1e1e;--xy-selection-background-color-default: rgba(200, 200, 220, .08);--xy-selection-border-default: 1px dotted rgba(200, 200, 220, .8);--xy-controls-button-background-color-default: #2b2b2b;--xy-controls-button-background-color-hover-default: #3e3e3e;--xy-controls-button-color-default: #f8f8f8;--xy-controls-button-color-hover-default: #fff;--xy-controls-button-border-color-default: #5b5b5b;--xy-controls-box-shadow-default: 0 0 2px 1px rgba(0, 0, 0, .08);--xy-edge-label-background-color-default: #141414;--xy-edge-label-color-default: #f8f8f8}.react-flow__background{background-color:var(--xy-background-color, var(--xy-background-color-props, var(--xy-background-color-default)));pointer-events:none;z-index:-1}.react-flow__container{position:absolute;width:100%;height:100%;top:0;left:0}.react-flow__pane{z-index:1}.react-flow__pane.draggable{cursor:grab}.react-flow__pane.dragging{cursor:grabbing}.react-flow__pane.selection{cursor:pointer}.react-flow__viewport{transform-origin:0 0;z-index:2;pointer-events:none}.react-flow__renderer{z-index:4}.react-flow__selection{z-index:6}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible{outline:none}.react-flow__edge-path{stroke:var(--xy-edge-stroke, var(--xy-edge-stroke-default));stroke-width:var(--xy-edge-stroke-width, var(--xy-edge-stroke-width-default));fill:none}.react-flow__connection-path{stroke:var(--xy-connectionline-stroke, var(--xy-connectionline-stroke-default));stroke-width:var(--xy-connectionline-stroke-width, var(--xy-connectionline-stroke-width-default));fill:none}.react-flow .react-flow__edges{position:absolute}.react-flow .react-flow__edges svg{overflow:visible;position:absolute;pointer-events:none}.react-flow__edge{pointer-events:visibleStroke}.react-flow__edge.selectable{cursor:pointer}.react-flow__edge.animated path{stroke-dasharray:5;animation:dashdraw .5s linear infinite}.react-flow__edge.animated path.react-flow__edge-interaction{stroke-dasharray:none;animation:none}.react-flow__edge.inactive{pointer-events:none}.react-flow__edge.selected,.react-flow__edge:focus,.react-flow__edge:focus-visible{outline:none}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selectable:focus .react-flow__edge-path,.react-flow__edge.selectable:focus-visible .react-flow__edge-path{stroke:var(--xy-edge-stroke-selected, var(--xy-edge-stroke-selected-default))}.react-flow__edge-textwrapper{pointer-events:all}.react-flow__edge .react-flow__edge-text{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__connection{pointer-events:none}.react-flow__connection .animated{stroke-dasharray:5;animation:dashdraw .5s linear infinite}svg.react-flow__connectionline{z-index:1001;overflow:visible;position:absolute}.react-flow__nodes{pointer-events:none;transform-origin:0 0}.react-flow__node{position:absolute;-webkit-user-select:none;-moz-user-select:none;user-select:none;pointer-events:all;transform-origin:0 0;box-sizing:border-box;cursor:default}.react-flow__node.selectable{cursor:pointer}.react-flow__node.draggable{cursor:grab;pointer-events:all}.react-flow__node.draggable.dragging{cursor:grabbing}.react-flow__nodesselection{z-index:3;transform-origin:left top;pointer-events:none}.react-flow__nodesselection-rect{position:absolute;pointer-events:all;cursor:grab}.react-flow__handle{position:absolute;pointer-events:none;min-width:5px;min-height:5px;width:6px;height:6px;background-color:var(--xy-handle-background-color, var(--xy-handle-background-color-default));border:1px solid var(--xy-handle-border-color, var(--xy-handle-border-color-default));border-radius:100%}.react-flow__handle.connectingfrom{pointer-events:all}.react-flow__handle.connectionindicator{pointer-events:all;cursor:crosshair}.react-flow__handle-bottom{top:auto;left:50%;bottom:0;transform:translate(-50%,50%)}.react-flow__handle-top{top:0;left:50%;transform:translate(-50%,-50%)}.react-flow__handle-left{top:50%;left:0;transform:translate(-50%,-50%)}.react-flow__handle-right{top:50%;right:0;transform:translate(50%,-50%)}.react-flow__edgeupdater{cursor:move;pointer-events:all}.react-flow__panel{position:absolute;z-index:5;margin:15px}.react-flow__panel.top{top:0}.react-flow__panel.bottom{bottom:0}.react-flow__panel.left{left:0}.react-flow__panel.right{right:0}.react-flow__panel.center{left:50%;transform:translate(-50%)}.react-flow__attribution{font-size:10px;background:var(--xy-attribution-background-color, var(--xy-attribution-background-color-default));padding:2px 3px;margin:0}.react-flow__attribution a{text-decoration:none;color:#999}@keyframes dashdraw{0%{stroke-dashoffset:10}}.react-flow__edgelabel-renderer{position:absolute;width:100%;height:100%;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none;left:0;top:0}.react-flow__viewport-portal{position:absolute;width:100%;height:100%;left:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__minimap{background:var( --xy-minimap-background-color-props, var(--xy-minimap-background-color, var(--xy-minimap-background-color-default)) )}.react-flow__minimap-svg{display:block}.react-flow__minimap-mask{fill:var( --xy-minimap-mask-background-color-props, var(--xy-minimap-mask-background-color, var(--xy-minimap-mask-background-color-default)) );stroke:var( --xy-minimap-mask-stroke-color-props, var(--xy-minimap-mask-stroke-color, var(--xy-minimap-mask-stroke-color-default)) );stroke-width:var( --xy-minimap-mask-stroke-width-props, var(--xy-minimap-mask-stroke-width, var(--xy-minimap-mask-stroke-width-default)) )}.react-flow__minimap-node{fill:var( --xy-minimap-node-background-color-props, var(--xy-minimap-node-background-color, var(--xy-minimap-node-background-color-default)) );stroke:var( --xy-minimap-node-stroke-color-props, var(--xy-minimap-node-stroke-color, var(--xy-minimap-node-stroke-color-default)) );stroke-width:var( --xy-minimap-node-stroke-width-props, var(--xy-minimap-node-stroke-width, var(--xy-minimap-node-stroke-width-default)) )}.react-flow__background-pattern.dots{fill:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-dots-color-default)) )}.react-flow__background-pattern.lines{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-lines-color-default)) )}.react-flow__background-pattern.cross{stroke:var( --xy-background-pattern-color-props, var(--xy-background-pattern-color, var(--xy-background-pattern-cross-color-default)) )}.react-flow__controls{display:flex;flex-direction:column;box-shadow:var(--xy-controls-box-shadow, var(--xy-controls-box-shadow-default))}.react-flow__controls.horizontal{flex-direction:row}.react-flow__controls-button{display:flex;justify-content:center;align-items:center;height:26px;width:26px;padding:4px;border:none;background:var(--xy-controls-button-background-color, var(--xy-controls-button-background-color-default));border-bottom:1px solid var( --xy-controls-button-border-color-props, var(--xy-controls-button-border-color, var(--xy-controls-button-border-color-default)) );color:var( --xy-controls-button-color-props, var(--xy-controls-button-color, var(--xy-controls-button-color-default)) );cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.react-flow__controls-button svg{width:100%;max-width:12px;max-height:12px;fill:currentColor}.react-flow__edge.updating .react-flow__edge-path{stroke:#777}.react-flow__edge-text{font-size:10px}.react-flow__node.selectable:focus,.react-flow__node.selectable:focus-visible{outline:none}.react-flow__node-input,.react-flow__node-default,.react-flow__node-output,.react-flow__node-group{padding:10px;border-radius:var(--xy-node-border-radius, var(--xy-node-border-radius-default));width:150px;font-size:12px;color:var(--xy-node-color, var(--xy-node-color-default));text-align:center;border:var(--xy-node-border, var(--xy-node-border-default));background-color:var(--xy-node-background-color, var(--xy-node-background-color-default))}.react-flow__node-input.selectable:hover,.react-flow__node-default.selectable:hover,.react-flow__node-output.selectable:hover,.react-flow__node-group.selectable:hover{box-shadow:var(--xy-node-boxshadow-hover, var(--xy-node-boxshadow-hover-default))}.react-flow__node-input.selectable.selected,.react-flow__node-input.selectable:focus,.react-flow__node-input.selectable:focus-visible,.react-flow__node-default.selectable.selected,.react-flow__node-default.selectable:focus,.react-flow__node-default.selectable:focus-visible,.react-flow__node-output.selectable.selected,.react-flow__node-output.selectable:focus,.react-flow__node-output.selectable:focus-visible,.react-flow__node-group.selectable.selected,.react-flow__node-group.selectable:focus,.react-flow__node-group.selectable:focus-visible{box-shadow:var(--xy-node-boxshadow-selected, var(--xy-node-boxshadow-selected-default))}.react-flow__node-group{background-color:var(--xy-node-group-background-color, var(--xy-node-group-background-color-default))}.react-flow__nodesselection-rect,.react-flow__selection{background:var(--xy-selection-background-color, var(--xy-selection-background-color-default));border:var(--xy-selection-border, var(--xy-selection-border-default))}.react-flow__nodesselection-rect:focus,.react-flow__nodesselection-rect:focus-visible,.react-flow__selection:focus,.react-flow__selection:focus-visible{outline:none}.react-flow__controls-button:hover{background:var( --xy-controls-button-background-color-hover-props, var(--xy-controls-button-background-color-hover, var(--xy-controls-button-background-color-hover-default)) );color:var( --xy-controls-button-color-hover-props, var(--xy-controls-button-color-hover, var(--xy-controls-button-color-hover-default)) )}.react-flow__controls-button:disabled{pointer-events:none}.react-flow__controls-button:disabled svg{fill-opacity:.4}.react-flow__controls-button:last-child{border-bottom:none}.react-flow__resize-control{position:absolute}.react-flow__resize-control.left,.react-flow__resize-control.right{cursor:ew-resize}.react-flow__resize-control.top,.react-flow__resize-control.bottom{cursor:ns-resize}.react-flow__resize-control.top.left,.react-flow__resize-control.bottom.right{cursor:nwse-resize}.react-flow__resize-control.bottom.left,.react-flow__resize-control.top.right{cursor:nesw-resize}.react-flow__resize-control.handle{width:4px;height:4px;border:1px solid #fff;border-radius:1px;background-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));transform:translate(-50%,-50%)}.react-flow__resize-control.handle.left{left:0;top:50%}.react-flow__resize-control.handle.right{left:100%;top:50%}.react-flow__resize-control.handle.top{left:50%;top:0}.react-flow__resize-control.handle.bottom{left:50%;top:100%}.react-flow__resize-control.handle.top.left,.react-flow__resize-control.handle.bottom.left{left:0}.react-flow__resize-control.handle.top.right,.react-flow__resize-control.handle.bottom.right{left:100%}.react-flow__resize-control.line{border-color:var(--xy-resize-background-color, var(--xy-resize-background-color-default));border-width:0;border-style:solid}.react-flow__resize-control.line.left,.react-flow__resize-control.line.right{width:1px;transform:translate(-50%);top:0;height:100%}.react-flow__resize-control.line.left{left:0;border-left-width:1px}.react-flow__resize-control.line.right{left:100%;border-right-width:1px}.react-flow__resize-control.line.top,.react-flow__resize-control.line.bottom{height:1px;transform:translateY(-50%);left:0;width:100%}.react-flow__resize-control.line.top{top:0;border-top-width:1px}.react-flow__resize-control.line.bottom{border-bottom-width:1px;top:100%}.react-flow__edge-textbg{fill:var(--xy-edge-label-background-color, var(--xy-edge-label-background-color-default))}.react-flow__edge-text{fill:var(--xy-edge-label-color, var(--xy-edge-label-color-default))}.react-flow{--panel-background: var(--apollon-background, #fff);--panel-shadow: 0 0 4px 0 var(--apollon-background-variant, #f8f9fa);--text: var(--apollon-primary-contrast, #000);--xy-edge-stroke: var(--apollon-primary-contrast, #000);--xy-edge-stroke-width: 2px;--xy-minimap-mask-background-color-props: #00000020;--xy-controls-button-background-color: var(--apollon-background, #fff)}.apollon-editor{background-color:var(--apollon-background, #fff);color:var(--apollon-primary-contrast, #000)}.apollon-canvas{position:relative;flex:1;min-width:0;height:100%;overflow:hidden}.apollon-collaboration-presence-bar{position:absolute;top:10px;right:10px;display:flex;align-items:center;z-index:10002;pointer-events:auto}.apollon-collaboration-presence-bar [role=button]:focus-visible{outline:2px solid var(--apollon-primary, #3e8acc);outline-offset:2px}.apollon-collaboration-follower-badge{position:absolute;bottom:-4px;left:-4px;min-width:14px;height:14px;padding:0 3px;box-sizing:border-box;display:flex;align-items:center;justify-content:center;border-radius:10px;border:2px solid;background-color:var(--apollon-background, #fff);color:var(--apollon-primary-contrast, #000);font-size:8px;font-weight:700}.apollon-collaboration-follow-frame{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;z-index:10001}.apollon-collaboration-follow-banner{position:absolute;top:16px;left:50%;transform:translate(-50%);display:flex;align-items:center;gap:8px;max-width:min(calc(100% - 32px),420px);padding:6px 6px 6px 14px;border-radius:999px;border:1px solid;background-color:var(--apollon-background, #fff);color:var(--apollon-primary-contrast, #000);box-shadow:0 2px 12px color-mix(in srgb,var(--apollon-primary-contrast, #000) 22%,transparent);font-size:13px;font-weight:500;white-space:nowrap;z-index:10004;pointer-events:auto;animation:apollon-collaboration-follow-banner-in .16s ease-out}@keyframes apollon-collaboration-follow-banner-in{0%{opacity:0;transform:translate(-50%,-8px)}to{opacity:1;transform:translate(-50%)}}@media(prefers-reduced-motion:reduce){.apollon-collaboration-follow-banner{animation:none}}.apollon-collaboration-follow-banner-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}.apollon-collaboration-follow-banner-text{overflow:hidden;text-overflow:ellipsis}.apollon-collaboration-follow-banner-stop{flex-shrink:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;cursor:pointer;border-radius:999px;padding:3px 12px;font:inherit;font-weight:600;background-color:var(--apollon-primary-contrast, #000);color:var(--apollon-background, #fff)}.apollon-collaboration-follow-banner-stop:hover{opacity:.85}.apollon-collaboration-follow-banner-stop:focus-visible{outline:2px solid var(--apollon-primary, #3e8acc);outline-offset:2px}.apollon-collaboration-cursors{position:absolute;top:0;right:0;bottom:0;left:0;overflow:hidden;pointer-events:none;z-index:10003}.apollon-collaboration-cursor{position:absolute}.apollon-collaboration-cursor-label{margin-top:4px;padding:2px 6px;font-size:12px;border-radius:6px;color:#fff;white-space:nowrap}.react-flow__node.apollon-collaboration-highlighted{box-shadow:0 0 0 4px var(--apollon-collaboration-highlight-color),0 0 16px 3px var(--apollon-collaboration-highlight-color)!important;border-color:var(--apollon-collaboration-highlight-color)!important}.react-flow__edge.apollon-collaboration-highlighted path{stroke:var(--apollon-collaboration-highlight-color)!important;stroke-width:4.5px!important;filter:drop-shadow(0 0 4px var(--apollon-collaboration-highlight-color))}.react-flow__controls-button{background:none;border-bottom:none}.react-flow__panel,.react-flow__node-toolbar{background-color:var(--panel-background);box-shadow:var(--panel-shadow);border-radius:8px;padding:8px}.react-flow svg{display:block}.react-flow__node-toolbar{display:flex;gap:8px}.react-flow__controls-button,.react-flow__controls-button:hover{background:var(--panel-background);border-bottom:none}.react-flow__controls-button>svg{fill:var(--text)}.react-flow__handle{opacity:0;background-color:transparent}.react-flow__handle.apollon-arc-handle:before{content:"";position:absolute;background-color:var(--apollon-primary, #3e8acc);opacity:.4;box-sizing:border-box;pointer-events:all;cursor:crosshair;--arc-long: calc(28px * var(--arc-scale, 1));--arc-short: calc(14px * var(--arc-scale, 1));--arc-radius: calc(14px * var(--arc-scale, 1))}.react-flow__handle.apollon-arc-handle--top:before{width:var(--arc-long);height:var(--arc-short);left:50%;top:50%;transform:translate(-50%,-100%);border-radius:var(--arc-radius) var(--arc-radius) 0 0}.react-flow__handle.apollon-arc-handle--right:before{width:var(--arc-short);height:var(--arc-long);left:50%;top:50%;transform:translateY(-50%);border-radius:0 var(--arc-radius) var(--arc-radius) 0}.react-flow__handle.apollon-arc-handle--bottom:before{width:var(--arc-long);height:var(--arc-short);left:50%;top:50%;transform:translate(-50%);border-radius:0 0 var(--arc-radius) var(--arc-radius)}.react-flow__handle.apollon-arc-handle--left:before{width:var(--arc-short);height:var(--arc-long);left:50%;top:50%;transform:translate(-100%,-50%);border-radius:var(--arc-radius) 0 0 var(--arc-radius)}.react-flow__resize-control line{z-index:9}.react-flow__resize-control.handle{z-index:20}.react-flow__resize-control{opacity:0;pointer-events:none;transition:opacity .12s ease}.react-flow__node:hover .react-flow__resize-control,.react-flow__node.selected .react-flow__resize-control{opacity:1;pointer-events:all}.react-flow__node:hover .react-flow__handle,.react-flow__node.selected .react-flow__handle{opacity:1;background-color:transparent;pointer-events:all;cursor:crosshair}.apollon-editor--connection-guidance .react-flow__handle.apollon-arc-handle:before{opacity:0;pointer-events:none}.apollon-editor--connection-guidance .react-flow__node:has(.apollon-connection-guidance-source),.apollon-editor--connection-guidance .react-flow__node:has(.react-flow__handle.connectionindicator.connectingto){z-index:10001!important}.apollon-editor--connection-guidance .react-flow__handle.connectionindicator{opacity:1!important;width:10px!important;height:10px!important;border-radius:999px;border:2px solid var(--apollon-primary, #3e8acc);background-color:var(--apollon-background, #fff);box-sizing:border-box}.apollon-editor--connection-guidance .react-flow__handle.connectionindicator.connectingfrom,.apollon-editor--connection-guidance .react-flow__handle.apollon-connection-guidance-source{opacity:0!important;pointer-events:none!important;border-color:transparent!important;background-color:transparent!important}.apollon-editor--connection-guidance .react-flow__handle.connectionindicator.valid{background-color:var(--apollon-primary, #3e8acc)!important}.edge-bend-handle{opacity:0;stroke:none;fill:color-mix(in srgb,var(--apollon-primary, #3e8acc) 34%,var(--apollon-background, #fff));transition:fill .12s ease,opacity .12s ease;vector-effect:non-scaling-stroke}.edge-endpoint-handle{fill:transparent;stroke:transparent;stroke-width:0;cursor:move;vector-effect:non-scaling-stroke}.edge-endpoint-handle--disabled{cursor:default}.react-flow__edge:hover .edge-bend-handle,.react-flow__edge.selected .edge-bend-handle{opacity:1;fill:var(--apollon-primary, #3e8acc)}.react-flow__edge:hover .edge-bend-handle:hover,.react-flow__edge.selected .edge-bend-handle:hover{fill:color-mix(in srgb,var(--apollon-primary, #3e8acc) 70%,#000)}.react-flow__edge:hover .edge-overlay,.react-flow__edge:hover .edge-marker-highlight{opacity:0}.react-flow__edge.selected .edge-overlay{opacity:0;pointer-events:none}.react-flow__edge.selected .edge-marker-highlight{opacity:0}.react-flow__edge:hover .react-flow__edge-path,.react-flow__edge:hover [data-inline-marker]{stroke:color-mix(in srgb,var(--apollon-primary, #3e8acc) 70%,#000)!important}.react-flow__edge:hover [data-inline-marker-filled=true]{fill:color-mix(in srgb,var(--apollon-primary, #3e8acc) 70%,#000)!important}.react-flow__edge.selected .react-flow__edge-path,.react-flow__edge.selected [data-inline-marker]{stroke:var(--apollon-primary, #3e8acc)!important}.react-flow__edge.selected [data-inline-marker-filled=true]{fill:var(--apollon-primary, #3e8acc)!important}.react-flow__node:hover,.react-flow__node.selected{opacity:.9;box-shadow:0 0 0 2px var(--apollon-primary, #3e8acc);border-radius:4px}.apollon-interactive-selection{--apollon-interactive-selection-color: var( --apollon-interactive-selection, #f39c12 )}.apollon-interactive-selection--selected [stroke]:not([stroke=none]){stroke:var(--apollon-interactive-selection-color)}.apollon-interactive-selection--selected .react-flow__edge-path{stroke-width:3px}.apollon-interactive-selection--selected .edge-overlay,.apollon-interactive-selection--selected .edge-marker-highlight{opacity:.45;stroke:var(--apollon-interactive-selection-color);stroke-width:15px}.react-flow__edges{z-index:9999}.react-flow__node{z-index:9998}svg.react-flow__connectionline{z-index:10000}.react-flow__connection-path{stroke:var(--xy-edge-stroke);stroke-width:var(--xy-edge-stroke-width);opacity:.5}.react-flow__minimap-mask{fill:"#f2f2f2";opacity:.6}.prevent-select{-webkit-user-select:none;-ms-user-select:none;user-select:none}.control-button{background-color:var(--apollon-background, #fff);border:1px solid var(--apollon-gray-variant, #495057);border-radius:8px;padding:6px 8px;cursor:pointer;opacity:1;display:flex;align-items:center;justify-content:center;min-width:32px;height:32px;font-size:14px;font-weight:700;transition:background-color .2s ease}.control-button:hover:not(.disabled){background-color:var(--apollon-background-variant, #f8f9fa)}.control-button.disabled{cursor:not-allowed;opacity:.5}.control-button.disabled:hover{background-color:var(--apollon-background, #fff)}.horizontally-not-resizable .react-flow__resize-control.top.line:hover,.horizontally-not-resizable .react-flow__resize-control.bottom.line:hover,.vertically-not-resizable .react-flow__resize-control.right.line:hover,.vertically-not-resizable .react-flow__resize-control.left.line:hover{cursor:grab}.apollon-editor .MuiSelect-select,.apollon-editor .MuiFormLabel-root{color:var(--apollon-primary-contrast, #000)!important}.apollon-editor .MuiOutlinedInput-notchedOutline{border-color:var(--apollon-primary-contrast, #000)!important}.apollon-editor .MuiSvgIcon-root{color:var(--apollon-primary-contrast, #000)!important}.scroll-overlay{position:absolute;top:0;left:0;right:0;bottom:0;background-color:var(--apollon-grid, rgba(36, 39, 36, .1));-webkit-backdrop-filter:blur(.5px);backdrop-filter:blur(.5px);z-index:10;cursor:not-allowed;animation:fadeIn .2s ease-in-out;display:flex;align-items:center;justify-content:center;pointer-events:auto}.scroll-overlay-hint{position:absolute;bottom:40px;left:50%;transform:translate(-50%);z-index:11}.scroll-overlay-hint-content{background-color:var(--apollon-background, #fff);border:2px solid var(--apollon-primary, #3e8acc);border-radius:8px;padding:16px 24px;box-shadow:0 4px 12px var(--apollon-grid, rgba(36, 39, 36, .1));display:flex;align-items:center;justify-content:center}.scroll-overlay-hint-text{margin:0;color:var(--apollon-primary, #3e8acc);font-weight:600;font-size:14px;text-align:center}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}