@tumaet/apollon 4.4.0 → 4.5.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.
- package/README.md +206 -34
- package/dist/assets/style.css +1 -1
- package/dist/index.d.ts +897 -10
- package/dist/index.js +7862 -76992
- package/dist/internals.d.ts +868 -0
- package/dist/internals.js +40 -0
- package/dist/react/App.d.ts +9 -0
- package/dist/{apollon-editor.d.ts → react/apollon-editor.d.ts} +11 -12
- package/dist/react/components/AlignmentGuides.d.ts +1 -0
- package/dist/react/components/AssessmentSelectionDebug.d.ts +1 -0
- package/dist/react/components/CustomBackground.d.ts +1 -0
- package/dist/react/components/CustomControls.d.ts +1 -0
- package/dist/react/components/CustomMiniMap.d.ts +1 -0
- package/dist/{components → react/components}/Icon/ArrowBackIcon.d.ts +1 -1
- package/dist/{components → react/components}/Icon/ArrowForwardIcon.d.ts +1 -1
- package/dist/{components → react/components}/Icon/CheckIcon.d.ts +1 -1
- package/dist/{components → react/components}/Icon/CrossIcon.d.ts +1 -1
- package/dist/{components → react/components}/Icon/DeleteIcon.d.ts +1 -1
- package/dist/{components → react/components}/Icon/DragHandleIcon.d.ts +1 -1
- package/dist/{components → react/components}/Icon/EditIcon.d.ts +1 -1
- package/dist/{components → react/components}/Icon/ExclamationIcon.d.ts +1 -1
- package/dist/{components → react/components}/Icon/InfiniteIcon.d.ts +1 -1
- package/dist/{components → react/components}/Icon/MapIcon.d.ts +1 -1
- package/dist/{components → react/components}/Icon/PaintRollerIcon.d.ts +1 -1
- package/dist/{components → react/components}/Icon/RedoIcon.d.ts +1 -1
- package/dist/{components → react/components}/Icon/SouthEastArrowIcon.d.ts +1 -1
- package/dist/{components → react/components}/Icon/SwapHorizIcon.d.ts +1 -1
- package/dist/{components → react/components}/Icon/UndoIcon.d.ts +1 -1
- package/dist/react/components/ReconnectConnectionLine.d.ts +2 -0
- package/dist/react/components/Sidebar.d.ts +1 -0
- package/dist/react/components/collaboration/CollaborationLayer.d.ts +25 -0
- package/dist/{components → react/components}/index.d.ts +2 -0
- package/dist/{components → react/components}/popovers/DefaultNodeGiveFeedbackPopover.d.ts +1 -1
- package/dist/{components → react/components}/popovers/DefaultNodeSeeFeedbackPopover.d.ts +1 -1
- package/dist/{components → react/components}/popovers/GiveFeedbackAssessmentBox.d.ts +1 -1
- package/dist/{components → react/components}/popovers/PopoverManager.d.ts +1 -1
- package/dist/{components → react/components}/popovers/SeeFeedbackAssessmentBox.d.ts +1 -1
- package/dist/{components → react/components}/popovers/bpmnDiagram/BPMNPoolEditPopover.d.ts +1 -1
- package/dist/{components → react/components}/popovers/classDiagram/ClassGiveFeedbackPopover.d.ts +1 -1
- package/dist/{components → react/components}/popovers/classDiagram/ClassSeeFeedbackPopover.d.ts +1 -1
- package/dist/{components → react/components}/popovers/communicationDiagram/CommunicationObjectNameGiveFeedbackPopover.d.ts +1 -1
- package/dist/{components → react/components}/popovers/communicationDiagram/CommunicationObjectNameSeeFeedbackPopover.d.ts +1 -1
- package/dist/{components → react/components}/popovers/edgePopovers/EdgeGiveFeedbackPopover.d.ts +1 -1
- package/dist/{components → react/components}/popovers/edgePopovers/EdgeSeeFeedbackPopover.d.ts +1 -1
- package/dist/{components → react/components}/popovers/objectDiagram/ObjectGiveFeedbackPopover.d.ts +1 -1
- package/dist/{components → react/components}/popovers/objectDiagram/ObjectSeeFeedbackPopover.d.ts +1 -1
- package/dist/react/components/react/Apollon.d.ts +45 -0
- package/dist/react/components/react/context.d.ts +16 -0
- package/dist/react/components/react/useApollonSubscription.d.ts +17 -0
- package/dist/{components → react/components}/svgs/edges/InlineMarker.d.ts +2 -2
- package/dist/react/components/svgs/nodes/CustomText.d.ts +10 -0
- package/dist/{components → react/components}/svgs/nodes/classDiagram/ClassSVG.d.ts +1 -1
- package/dist/{components → react/components}/svgs/nodes/classDiagram/ColorDescriptionSVG.d.ts +1 -1
- package/dist/{components → react/components}/svgs/nodes/communicationDiagram/CommunicationObjectNameSVG.d.ts +1 -1
- package/dist/{components → react/components}/svgs/nodes/objectDiagram/ObjectNameSVG.d.ts +1 -1
- package/dist/{components → react/components}/toolbars/edgeToolBar/CustomEdgeToolBar.d.ts +2 -0
- package/dist/{components → react/components}/ui/StyleEditor/ColorButtons.d.ts +1 -1
- package/dist/{constants.d.ts → react/constants.d.ts} +43 -6
- package/dist/react/edges/GenericEdge.d.ts +79 -0
- package/dist/{edges → react/edges}/edgeTypes/ActivityDiagramEdge.d.ts +1 -1
- package/dist/{edges → react/edges}/edgeTypes/BPMNDiagramEdge.d.ts +1 -1
- package/dist/{edges → react/edges}/edgeTypes/ClassDiagramEdge.d.ts +1 -1
- package/dist/{edges → react/edges}/edgeTypes/CommunicationDiagramEdge.d.ts +1 -1
- package/dist/{edges → react/edges}/edgeTypes/ComponentDiagramEdge.d.ts +1 -1
- package/dist/{edges → react/edges}/edgeTypes/DeploymentDiagramEdge.d.ts +1 -1
- package/dist/{edges → react/edges}/edgeTypes/FlowChartEdge.d.ts +1 -1
- package/dist/{edges → react/edges}/edgeTypes/ObjectDiagramEdge.d.ts +1 -1
- package/dist/{edges → react/edges}/edgeTypes/PetriNetEdge.d.ts +1 -1
- package/dist/{edges → react/edges}/edgeTypes/ReachabilityGraphArc.d.ts +1 -1
- package/dist/{edges → react/edges}/edgeTypes/SfcDiagramEdge.d.ts +1 -1
- package/dist/{edges → react/edges}/edgeTypes/SyntaxTreeEdge.d.ts +1 -1
- package/dist/{edges → react/edges}/edgeTypes/UseCaseDiagramEdge.d.ts +1 -1
- package/dist/{edges → react/edges}/labelTypes/EdgeEndLabels.d.ts +1 -1
- package/dist/{edges → react/edges}/labelTypes/EdgeIncludeExtendLabel.d.ts +1 -1
- package/dist/{edges → react/edges}/labelTypes/EdgeMiddleLabels.d.ts +2 -1
- package/dist/{edges → react/edges}/labelTypes/EdgeMultipleLabels.d.ts +2 -2
- package/dist/{edges → react/edges}/types.d.ts +34 -34
- package/dist/react/enums/index.d.ts +1 -0
- package/dist/react/hooks/useEdgeLineJumps.d.ts +25 -0
- package/dist/{hooks → react/hooks}/useHandleFinder.d.ts +1 -0
- package/dist/{hooks → react/hooks}/useReconnect.d.ts +1 -1
- package/dist/{hooks → react/hooks}/useStepPathEdge.d.ts +10 -6
- package/dist/react/hooks/useStraightPathEdge.d.ts +23 -0
- package/dist/react/index.d.ts +7 -0
- package/dist/react/internals.d.ts +5 -0
- package/dist/{nodes → react/nodes}/TitleAndDescriptionNode.d.ts +1 -1
- package/dist/{nodes → react/nodes}/activityDiagram/Activity.d.ts +1 -1
- package/dist/{nodes → react/nodes}/activityDiagram/ActivityActionNode.d.ts +1 -1
- package/dist/{nodes → react/nodes}/activityDiagram/ActivityFinalNode.d.ts +1 -1
- package/dist/{nodes → react/nodes}/activityDiagram/ActivityForkNode.d.ts +1 -1
- package/dist/{nodes → react/nodes}/activityDiagram/ActivityForkNodeHorizontal.d.ts +1 -1
- package/dist/{nodes → react/nodes}/activityDiagram/ActivityInitialNode.d.ts +1 -1
- package/dist/{nodes → react/nodes}/activityDiagram/ActivityMergeNode.d.ts +1 -1
- package/dist/{nodes → react/nodes}/activityDiagram/ActivityObjectNode.d.ts +1 -1
- package/dist/{nodes → react/nodes}/bpmn/BPMNAnnotation.d.ts +1 -1
- package/dist/{nodes → react/nodes}/bpmn/BPMNCallActivity.d.ts +1 -1
- package/dist/{nodes → react/nodes}/bpmn/BPMNDataObject.d.ts +1 -1
- package/dist/{nodes → react/nodes}/bpmn/BPMNDataStore.d.ts +1 -1
- package/dist/{nodes → react/nodes}/bpmn/BPMNEndEvent.d.ts +1 -1
- package/dist/{nodes → react/nodes}/bpmn/BPMNGateway.d.ts +1 -1
- package/dist/{nodes → react/nodes}/bpmn/BPMNGroup.d.ts +1 -1
- package/dist/{nodes → react/nodes}/bpmn/BPMNIntermediateEvent.d.ts +1 -1
- package/dist/{nodes → react/nodes}/bpmn/BPMNPool.d.ts +1 -1
- package/dist/{nodes → react/nodes}/bpmn/BPMNStartEvent.d.ts +1 -1
- package/dist/{nodes → react/nodes}/bpmn/BPMNSubprocess.d.ts +1 -1
- package/dist/{nodes → react/nodes}/bpmn/BPMNTask.d.ts +1 -1
- package/dist/{nodes → react/nodes}/bpmn/BPMNTransaction.d.ts +1 -1
- package/dist/{nodes → react/nodes}/classDiagram/Class.d.ts +1 -1
- package/dist/{nodes → react/nodes}/classDiagram/ColorDescription.d.ts +1 -1
- package/dist/{nodes → react/nodes}/classDiagram/Package.d.ts +1 -1
- package/dist/{nodes → react/nodes}/communicationDiagram/CommunicationObjectName.d.ts +1 -1
- package/dist/{nodes → react/nodes}/componentDiagram/Component.d.ts +1 -1
- package/dist/{nodes → react/nodes}/componentDiagram/ComponentInterface.d.ts +1 -1
- package/dist/{nodes → react/nodes}/componentDiagram/ComponentSubsystem.d.ts +1 -1
- package/dist/{nodes → react/nodes}/deploymentDiagram/DeploymentArtifact.d.ts +1 -1
- package/dist/{nodes → react/nodes}/deploymentDiagram/DeploymentComponent.d.ts +1 -1
- package/dist/{nodes → react/nodes}/deploymentDiagram/DeploymentInterface.d.ts +1 -1
- package/dist/{nodes → react/nodes}/deploymentDiagram/DeploymentNode.d.ts +1 -1
- package/dist/{nodes → react/nodes}/flowchart/FlowchartDecision.d.ts +1 -1
- package/dist/{nodes → react/nodes}/flowchart/FlowchartFunctionCall.d.ts +1 -1
- package/dist/{nodes → react/nodes}/flowchart/FlowchartInputOutput.d.ts +1 -1
- package/dist/{nodes → react/nodes}/flowchart/FlowchartProcess.d.ts +1 -1
- package/dist/{nodes → react/nodes}/flowchart/FlowchartTerminal.d.ts +1 -1
- package/dist/{nodes → react/nodes}/objectDiagram/ObjectName.d.ts +1 -1
- package/dist/{nodes → react/nodes}/petriNetDiagram/PetriNetPlace.d.ts +1 -1
- package/dist/{nodes → react/nodes}/petriNetDiagram/PetriNetTransition.d.ts +1 -1
- package/dist/{nodes → react/nodes}/reachabilityGraphDiagram/ReachabilityGraphMarking.d.ts +1 -1
- package/dist/{nodes → react/nodes}/sfcDiagram/SfcActionTable.d.ts +1 -1
- package/dist/{nodes → react/nodes}/sfcDiagram/SfcJump.d.ts +1 -1
- package/dist/{nodes → react/nodes}/sfcDiagram/SfcStart.d.ts +1 -1
- package/dist/{nodes → react/nodes}/sfcDiagram/SfcStep.d.ts +1 -1
- package/dist/{nodes → react/nodes}/sfcDiagram/SfcTransitionBranch.d.ts +1 -1
- package/dist/{nodes → react/nodes}/syntaxTreeDiagram/SyntaxTreeNonterminal.d.ts +1 -1
- package/dist/{nodes → react/nodes}/syntaxTreeDiagram/SyntaxTreeTerminal.d.ts +1 -1
- package/dist/{nodes → react/nodes}/useCaseDiagram/UseCase.d.ts +1 -1
- package/dist/{nodes → react/nodes}/useCaseDiagram/UseCaseActor.d.ts +1 -1
- package/dist/{nodes → react/nodes}/useCaseDiagram/UseCaseSystem.d.ts +1 -1
- package/dist/react/nodes/wrappers/DefaultNodeWrapper.d.ts +49 -0
- package/dist/react/react.d.ts +4 -0
- package/dist/react/react.js +34580 -0
- package/dist/react/services/migration/EdgeTransformer.d.ts +11 -0
- package/dist/{store → react/store}/context.d.ts +3 -0
- package/dist/react/store/edgeGeometryStore.d.ts +18 -0
- package/dist/{store → react/store}/index.d.ts +2 -1
- package/dist/{store → react/store}/metadataStore.d.ts +11 -0
- package/dist/{sync → react/sync}/headless.d.ts +3 -3
- package/dist/{sync/yjsSyncClass.d.ts → react/sync/yjsSync.d.ts} +5 -2
- package/dist/{typings.d.ts → react/typings.d.ts} +21 -9
- package/dist/{utils → react/utils}/alignmentUtils.d.ts +2 -2
- package/dist/react/utils/collaboration.d.ts +10 -0
- package/dist/react/utils/edgeUtils.d.ts +167 -0
- package/dist/{utils → react/utils}/exportUtils.d.ts +0 -1
- package/dist/react/utils/geometry/bendHandles.d.ts +42 -0
- package/dist/{utils → react/utils}/index.d.ts +2 -2
- package/dist/{utils → react/utils}/interactiveUtils.d.ts +0 -1
- package/dist/{utils → react/utils}/nodeUtils.d.ts +1 -1
- package/dist/react/utils/storeUtils.d.ts +1 -0
- package/dist/react/utils/textUtils.d.ts +1 -0
- package/dist/yjsSync-hZSPGLEP.js +70938 -0
- package/package.json +91 -35
- package/dist/App.d.ts +0 -6
- package/dist/components/AlignmentGuides.d.ts +0 -1
- package/dist/components/AssessmentSelectionDebug.d.ts +0 -1
- package/dist/components/CustomBackground.d.ts +0 -1
- package/dist/components/CustomControls.d.ts +0 -1
- package/dist/components/CustomMiniMap.d.ts +0 -1
- package/dist/components/Sidebar.d.ts +0 -1
- package/dist/components/debug/AssessmentSelectionDebug.d.ts +0 -6
- package/dist/components/svgs/nodes/CustomText.d.ts +0 -16
- package/dist/components/theme/styles.d.ts +0 -22
- package/dist/edges/GenericEdge.d.ts +0 -43
- package/dist/enums/ExportFileFormat.d.ts +0 -6
- package/dist/enums/index.d.ts +0 -2
- package/dist/hooks/useClipboard.d.ts +0 -11
- package/dist/hooks/useDragContext.d.ts +0 -0
- package/dist/hooks/useStraightPathEdge.d.ts +0 -31
- package/dist/initialElements.d.ts +0 -3
- package/dist/nodes/syntaxTreeDiagram/index.d.ts +0 -0
- package/dist/nodes/wrappers/DefaultNodeWrapper.d.ts +0 -33
- package/dist/sync/index.d.ts +0 -1
- package/dist/utils/edgeUtils.d.ts +0 -90
- package/dist/utils/labelUtils.d.ts +0 -16
- package/dist/utils/storeUtils.d.ts +0 -1
- package/dist/utils/textUtils.d.ts +0 -7
- package/dist/utils/v2Typings.d.ts +0 -127
- /package/dist/{components → react/components}/AssessmentSelectableElement.d.ts +0 -0
- /package/dist/{components → react/components}/DraggableGhost.d.ts +0 -0
- /package/dist/{components → react/components}/Icon/index.d.ts +0 -0
- /package/dist/{components → react/components}/ScrollOverlay.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/DefaultNodeEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/GenericPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/bpmnDiagram/BPMNEndEventEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/bpmnDiagram/BPMNGatewayEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/bpmnDiagram/BPMNIntermediateEventEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/bpmnDiagram/BPMNStartEventEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/bpmnDiagram/BPMNTaskEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/bpmnDiagram/index.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/classDiagram/ClassEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/classDiagram/EditableAttributesList.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/classDiagram/EditableMethodsList.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/classDiagram/index.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/communicationDiagram/CommunicationObjectNameEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/communicationDiagram/index.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/componentDiagram/ComponentEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/componentDiagram/ComponentSubsystemEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/componentDiagram/index.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/deploymentDiagram/DeploymentComponentEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/deploymentDiagram/DeploymentNodeEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/deploymentDiagram/index.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/edgePopovers/ActivityDiagramEdgeEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/edgePopovers/BPMNDiagramEdgeEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/edgePopovers/ClassDiagramEdgeEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/edgePopovers/CommunicationDiagramEdgeEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/edgePopovers/ComponentDiagramEdgeEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/edgePopovers/DeploymentDiagramEdgeEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/edgePopovers/FlowChartEdgeEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/edgePopovers/ObjectDiagramEdgeEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/edgePopovers/PetriNetEdgeEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/edgePopovers/ReachabilityGraphEdgeEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/edgePopovers/SyntaxTreeEdgeEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/edgePopovers/UseCaseDiagramEdgeEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/edgePopovers/index.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/index.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/objectDiagram/ObjectEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/objectDiagram/index.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/petriNetDiagram/PetriNetPlaceEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/petriNetDiagram/index.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/reachabilityGraphDiagram/ReachabilityGraphMarkingEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/reachabilityGraphDiagram/index.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/sfcDiagram/SfcActionTableEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/sfcDiagram/SfcEdgeEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/sfcDiagram/index.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/syntaxTreeDiagram/SyntaxTreeNonterminalEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/syntaxTreeDiagram/SyntaxTreeTerminalEditPopover.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/syntaxTreeDiagram/index.d.ts +0 -0
- /package/dist/{components → react/components}/popovers/types.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/AssessmentIcon.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/StyledElements.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/edges/index.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/index.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/HeaderSection.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/MultilineText.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/RowBlockSection.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/SeparationLine.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/StereotypeAndName.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/activityDiagram/ActivityActionNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/activityDiagram/ActivityFinalNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/activityDiagram/ActivityForkNodeHorizontalSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/activityDiagram/ActivityForkNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/activityDiagram/ActivityInitialNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/activityDiagram/ActivityMergeNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/activityDiagram/ActivityObjectNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/activityDiagram/ActivitySVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/activityDiagram/index.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/bpmnDiagram/BPMNAnnotationNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/bpmnDiagram/BPMNDataObjectNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/bpmnDiagram/BPMNDataStoreNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/bpmnDiagram/BPMNEventNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/bpmnDiagram/BPMNGatewayNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/bpmnDiagram/BPMNGroupNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/bpmnDiagram/BPMNPoolNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/bpmnDiagram/BPMNSubprocessNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/bpmnDiagram/BPMNTaskNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/bpmnDiagram/index.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/classDiagram/PackageSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/classDiagram/TitleAndDescriptionSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/classDiagram/index.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/communicationDiagram/index.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/componentDiagram/ComponentInterfaceNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/componentDiagram/ComponentNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/componentDiagram/ComponentSubsystemNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/componentDiagram/index.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/deploymentDiagram/DeploymentArtifactSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/deploymentDiagram/DeploymentComponentSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/deploymentDiagram/DeploymentInterfaceSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/deploymentDiagram/DeploymentNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/deploymentDiagram/index.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/flowchartDiagram/FlowchartDecisionNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/flowchartDiagram/FlowchartFunctionCallNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/flowchartDiagram/FlowchartInputOutputNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/flowchartDiagram/FlowchartProcessNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/flowchartDiagram/FlowchartTerminalNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/flowchartDiagram/index.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/index.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/objectDiagram/index.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/petriNetDiagram/PetriNetPlaceSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/petriNetDiagram/PetriNetTransitionSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/petriNetDiagram/index.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/reachabilityGraphDiagram/ReachabilityGraphMarkingSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/reachabilityGraphDiagram/index.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/sfcDiagram/SfcActionTableNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/sfcDiagram/SfcJumpNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/sfcDiagram/SfcStartNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/sfcDiagram/SfcStepNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/sfcDiagram/SfcTransitionBranchNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/sfcDiagram/index.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/syntaxTreeDiagram/SyntaxTreeNonterminalNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/syntaxTreeDiagram/SyntaxTreeTerminalNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/syntaxTreeDiagram/index.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/useCaseDiagram/UseCaseActorNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/useCaseDiagram/UseCaseNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/useCaseDiagram/UseCaseSystemNodeSVG.d.ts +0 -0
- /package/dist/{components → react/components}/svgs/nodes/useCaseDiagram/index.d.ts +0 -0
- /package/dist/{components → react/components}/toolbars/NodeToolbar.d.ts +0 -0
- /package/dist/{components → react/components}/toolbars/edgeToolBar/index.d.ts +0 -0
- /package/dist/{components → react/components}/toolbars/index.d.ts +0 -0
- /package/dist/{components → react/components}/ui/DividerLine.d.ts +0 -0
- /package/dist/{components → react/components}/ui/HeaderSwitchElement.d.ts +0 -0
- /package/dist/{components → react/components}/ui/PrimaryButton.d.ts +0 -0
- /package/dist/{components → react/components}/ui/StereotypeButtonGroup.d.ts +0 -0
- /package/dist/{components → react/components}/ui/StyleEditor/EdgeStyleEditor.d.ts +0 -0
- /package/dist/{components → react/components}/ui/StyleEditor/NodeStyleEditor.d.ts +0 -0
- /package/dist/{components → react/components}/ui/StyleEditor/index.d.ts +0 -0
- /package/dist/{components → react/components}/ui/TextField.d.ts +0 -0
- /package/dist/{components → react/components}/ui/Typography.d.ts +0 -0
- /package/dist/{components → react/components}/ui/index.d.ts +0 -0
- /package/dist/{components → react/components}/wrapper/AssessmentSelectableWrapper.d.ts +0 -0
- /package/dist/{components → react/components}/wrapper/FeedbackDropzone.d.ts +0 -0
- /package/dist/{components → react/components}/wrapper/index.d.ts +0 -0
- /package/dist/{edges → react/edges}/Connection.d.ts +0 -0
- /package/dist/{edges → react/edges}/EdgeProps.d.ts +0 -0
- /package/dist/{edges → react/edges}/edgeTypes/index.d.ts +0 -0
- /package/dist/{edges → react/edges}/index.d.ts +0 -0
- /package/dist/{enums → react/enums}/Quadrant.d.ts +0 -0
- /package/dist/{hooks → react/hooks}/index.d.ts +0 -0
- /package/dist/{hooks → react/hooks}/useAssessmentSelection.d.ts +0 -0
- /package/dist/{hooks → react/hooks}/useConnect.d.ts +0 -0
- /package/dist/{hooks → react/hooks}/useDiagramModifiable.d.ts +0 -0
- /package/dist/{hooks → react/hooks}/useDragOver.d.ts +0 -0
- /package/dist/{hooks → react/hooks}/useDropFeedback.d.ts +0 -0
- /package/dist/{hooks → react/hooks}/useEdgeConfig.d.ts +0 -0
- /package/dist/{hooks → react/hooks}/useEdgeToolbar.d.ts +0 -0
- /package/dist/{hooks → react/hooks}/useEdges.d.ts +0 -0
- /package/dist/{hooks → react/hooks}/useElementInteractions.d.ts +0 -0
- /package/dist/{hooks → react/hooks}/useGoToNextAssessment.d.ts +0 -0
- /package/dist/{hooks → react/hooks}/useHandleDelete.d.ts +0 -0
- /package/dist/{hooks → react/hooks}/useHandleOnResize.d.ts +0 -0
- /package/dist/{hooks → react/hooks}/useIsOnlyThisElementSelected.d.ts +0 -0
- /package/dist/{hooks → react/hooks}/useKeyboardShortcuts.d.ts +0 -0
- /package/dist/{hooks → react/hooks}/useMessagePositioning.d.ts +0 -0
- /package/dist/{hooks → react/hooks}/useNodeDrag.d.ts +0 -0
- /package/dist/{hooks → react/hooks}/useNodeDragStop.d.ts +0 -0
- /package/dist/{hooks → react/hooks}/usePaneClicked.d.ts +0 -0
- /package/dist/{hooks → react/hooks}/useSelectionForCopyPaste.d.ts +0 -0
- /package/dist/{hooks → react/hooks}/useViewPointCenter.d.ts +0 -0
- /package/dist/{logger.d.ts → react/logger.d.ts} +0 -0
- /package/dist/{nodes → react/nodes}/activityDiagram/index.d.ts +0 -0
- /package/dist/{nodes → react/nodes}/bpmn/index.d.ts +0 -0
- /package/dist/{nodes → react/nodes}/classDiagram/index.d.ts +0 -0
- /package/dist/{nodes → react/nodes}/communicationDiagram/index.d.ts +0 -0
- /package/dist/{nodes → react/nodes}/componentDiagram/index.d.ts +0 -0
- /package/dist/{nodes → react/nodes}/deploymentDiagram/index.d.ts +0 -0
- /package/dist/{nodes → react/nodes}/flowchart/index.d.ts +0 -0
- /package/dist/{nodes → react/nodes}/index.d.ts +0 -0
- /package/dist/{nodes → react/nodes}/objectDiagram/index.d.ts +0 -0
- /package/dist/{nodes → react/nodes}/petriNetDiagram/index.d.ts +0 -0
- /package/dist/{nodes → react/nodes}/reachabilityGraphDiagram/index.d.ts +0 -0
- /package/dist/{nodes → react/nodes}/sfcDiagram/index.d.ts +0 -0
- /package/dist/{nodes → react/nodes}/types.d.ts +0 -0
- /package/dist/{nodes → react/nodes}/useCaseDiagram/index.d.ts +0 -0
- /package/dist/{nodes → react/nodes}/wrappers/index.d.ts +0 -0
- /package/dist/{store → react/store}/alignmentGuidesStore.d.ts +0 -0
- /package/dist/{store → react/store}/assessmentSelectionStore.d.ts +0 -0
- /package/dist/{store → react/store}/diagramStore.d.ts +0 -0
- /package/dist/{store → react/store}/popoverStore.d.ts +0 -0
- /package/dist/{styles → react/styles}/theme.d.ts +0 -0
- /package/dist/{sync → react/sync}/ydoc.d.ts +0 -0
- /package/dist/{types → react/types}/DiagramType.d.ts +0 -0
- /package/dist/{types → react/types}/SVG.d.ts +0 -0
- /package/dist/{types → react/types}/index.d.ts +0 -0
- /package/dist/{types → react/types}/locationPopover.d.ts +0 -0
- /package/dist/{types → react/types}/nodes/DropNodeDate.d.ts +0 -0
- /package/dist/{types → react/types}/nodes/NodeProps.d.ts +0 -0
- /package/dist/{types → react/types}/nodes/enums/ClassType.d.ts +0 -0
- /package/dist/{types → react/types}/nodes/enums/index.d.ts +0 -0
- /package/dist/{types → react/types}/nodes/index.d.ts +0 -0
- /package/dist/{utils → react/utils}/bpmnConstraints.d.ts +0 -0
- /package/dist/{utils → react/utils}/copyPasteUtils.d.ts +0 -0
- /package/dist/{utils → react/utils}/deepPartial.d.ts +0 -0
- /package/dist/{utils → react/utils}/diagramTypeUtils.d.ts +0 -0
- /package/dist/{utils → react/utils}/helpers.d.ts +0 -0
- /package/dist/{utils → react/utils}/layoutUtils.d.ts +0 -0
- /package/dist/{utils → react/utils}/pathParsing.d.ts +0 -0
- /package/dist/{utils → react/utils}/popoverUtils.d.ts +0 -0
- /package/dist/{utils → react/utils}/quadrantUtils.d.ts +0 -0
- /package/dist/{utils → react/utils}/requiredInterfaceUtils.d.ts +0 -0
- /package/dist/{utils → react/utils}/svgTextLayout.d.ts +0 -0
- /package/dist/{utils → react/utils}/v3Typings.d.ts +0 -0
- /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
|
[](https://www.npmjs.com/package/@tumaet/apollon)
|
|
4
|
-
[](https://www.npmjs.com/package/@tumaet/apollon)
|
|
7
|
+
[](https://github.com/ls1intum/Apollon/blob/main/LICENSE)
|
|
8
|
+
[](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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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.5.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.5.0"
|
|
53
186
|
|
|
54
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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 }`
|
|
74
|
-
-
|
|
75
|
-
- `
|
|
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
|
|
80
|
-
-
|
|
81
|
-
-
|
|
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
|
|
257
|
+
MIT. See [LICENSE](https://github.com/ls1intum/Apollon/blob/main/LICENSE).
|
package/dist/assets/style.css
CHANGED
|
@@ -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-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:fixed;top:0;right:0;bottom:0;left:0;pointer-events:none;z-index:10003}.apollon-collaboration-cursor{position:absolute;transform:translate(8px,8px)}.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}}
|