Full Code of bpmn-io/bpmn-js for AI

develop 0c1e5560a0cb cached
766 files
4.1 MB
1.1M tokens
706 symbols
1 requests
Download .txt
Showing preview only (4,416K chars total). Download the full file or copy to clipboard to get everything.
Repository: bpmn-io/bpmn-js
Branch: develop
Commit: 0c1e5560a0cb
Files: 766
Total size: 4.1 MB

Directory structure:
gitextract_zf5udxc2/

├── .github/
│   ├── CONTRIBUTING.md
│   ├── ISSUE_TEMPLATE/
│   │   ├── BUG_REPORT.md
│   │   ├── FEATURE_REQUEST.md
│   │   ├── TASK.md
│   │   └── config.yml
│   ├── merge-me.yml
│   └── workflows/
│       ├── CI.yml
│       ├── CODE_SCANNING.yml
│       ├── COMMENT_TARGETS_MAIN.yml
│       ├── MERGE_MAIN_TO_DEVELOP.yml
│       ├── POST_RELEASE.yml
│       └── RELEASE.yml
├── .gitignore
├── .release-please-manifest.json
├── CHANGELOG.md
├── LICENSE
├── README.md
├── assets/
│   └── bpmn-js.css
├── docs/
│   ├── project/
│   │   ├── SETUP.md
│   │   ├── setup-alternative.sh
│   │   ├── setup.bat
│   │   └── setup.sh
│   └── translations.json
├── eslint.config.mjs
├── lib/
│   ├── BaseModeler.js
│   ├── BaseModeler.spec.ts
│   ├── BaseViewer.js
│   ├── BaseViewer.spec.ts
│   ├── Modeler.js
│   ├── Modeler.spec.ts
│   ├── NavigatedViewer.js
│   ├── NavigatedViewer.spec.ts
│   ├── Viewer.js
│   ├── Viewer.spec.ts
│   ├── core/
│   │   └── index.js
│   ├── draw/
│   │   ├── BpmnRenderUtil.js
│   │   ├── BpmnRenderer.js
│   │   ├── PathMap.js
│   │   ├── TextRenderer.js
│   │   ├── TextRenderer.spec.ts
│   │   └── index.js
│   ├── features/
│   │   ├── align-elements/
│   │   │   ├── AlignElementsContextPadProvider.js
│   │   │   ├── AlignElementsIcons.js
│   │   │   ├── AlignElementsMenuProvider.js
│   │   │   ├── BpmnAlignElements.js
│   │   │   └── index.js
│   │   ├── append-preview/
│   │   │   ├── AppendPreview.js
│   │   │   └── index.js
│   │   ├── auto-place/
│   │   │   ├── BpmnAutoPlace.js
│   │   │   ├── BpmnAutoPlaceUtil.js
│   │   │   └── index.js
│   │   ├── auto-resize/
│   │   │   ├── BpmnAutoResize.js
│   │   │   ├── BpmnAutoResizeProvider.js
│   │   │   └── index.js
│   │   ├── context-pad/
│   │   │   ├── ContextPadProvider.js
│   │   │   └── index.js
│   │   ├── copy-paste/
│   │   │   ├── BpmnCopyPaste.js
│   │   │   ├── ModdleCopy.js
│   │   │   └── index.js
│   │   ├── di-ordering/
│   │   │   ├── BpmnDiOrdering.js
│   │   │   └── index.js
│   │   ├── distribute-elements/
│   │   │   ├── BpmnDistributeElements.js
│   │   │   ├── DistributeElementsIcons.js
│   │   │   ├── DistributeElementsMenuProvider.js
│   │   │   └── index.js
│   │   ├── drilldown/
│   │   │   ├── DrilldownBreadcrumbs.js
│   │   │   ├── DrilldownCentering.js
│   │   │   ├── DrilldownOverlayBehavior.js
│   │   │   ├── SubprocessCompatibility.js
│   │   │   └── index.js
│   │   ├── editor-actions/
│   │   │   ├── BpmnEditorActions.js
│   │   │   └── index.js
│   │   ├── grid-snapping/
│   │   │   ├── BpmnGridSnapping.js
│   │   │   ├── behavior/
│   │   │   │   ├── GridSnappingAutoPlaceBehavior.js
│   │   │   │   ├── GridSnappingLayoutConnectionBehavior.js
│   │   │   │   ├── GridSnappingParticipantBehavior.js
│   │   │   │   └── index.js
│   │   │   └── index.js
│   │   ├── interaction-events/
│   │   │   ├── BpmnInteractionEvents.js
│   │   │   └── index.js
│   │   ├── keyboard/
│   │   │   ├── BpmnKeyboardBindings.js
│   │   │   └── index.js
│   │   ├── label-editing/
│   │   │   ├── LabelEditingPreview.js
│   │   │   ├── LabelEditingProvider.js
│   │   │   ├── LabelUtil.js
│   │   │   ├── cmd/
│   │   │   │   └── UpdateLabelHandler.js
│   │   │   └── index.js
│   │   ├── label-link/
│   │   │   ├── LabelLink.js
│   │   │   └── index.js
│   │   ├── modeling/
│   │   │   ├── BpmnFactory.js
│   │   │   ├── BpmnLayouter.js
│   │   │   ├── BpmnUpdater.js
│   │   │   ├── ElementFactory.js
│   │   │   ├── ElementFactory.test.ts
│   │   │   ├── Modeling.js
│   │   │   ├── Modeling.test.ts
│   │   │   ├── behavior/
│   │   │   │   ├── AdaptiveLabelPositioningBehavior.js
│   │   │   │   ├── AppendBehavior.js
│   │   │   │   ├── AssociationBehavior.js
│   │   │   │   ├── AttachEventBehavior.js
│   │   │   │   ├── BoundaryEventBehavior.js
│   │   │   │   ├── CompensateBoundaryEventBehavior.js
│   │   │   │   ├── CreateBehavior.js
│   │   │   │   ├── CreateDataObjectBehavior.js
│   │   │   │   ├── CreateParticipantBehavior.js
│   │   │   │   ├── DataInputAssociationBehavior.js
│   │   │   │   ├── DataStoreBehavior.js
│   │   │   │   ├── DeleteLaneBehavior.js
│   │   │   │   ├── DetachEventBehavior.js
│   │   │   │   ├── DropOnFlowBehavior.js
│   │   │   │   ├── EventBasedGatewayBehavior.js
│   │   │   │   ├── FixHoverBehavior.js
│   │   │   │   ├── GroupBehavior.js
│   │   │   │   ├── ImportDockingFix.js
│   │   │   │   ├── IsHorizontalFix.js
│   │   │   │   ├── LabelBehavior.js
│   │   │   │   ├── LayoutConnectionBehavior.js
│   │   │   │   ├── MessageFlowBehavior.js
│   │   │   │   ├── NonInterruptingBehavior.js
│   │   │   │   ├── RemoveElementBehavior.js
│   │   │   │   ├── RemoveEmbeddedLabelBoundsBehavior.js
│   │   │   │   ├── RemoveParticipantBehavior.js
│   │   │   │   ├── ReplaceConnectionBehavior.js
│   │   │   │   ├── ReplaceElementBehaviour.js
│   │   │   │   ├── ResizeBehavior.js
│   │   │   │   ├── ResizeLaneBehavior.js
│   │   │   │   ├── RootElementReferenceBehavior.js
│   │   │   │   ├── SetCompensationActivityAfterPasteBehavior.js
│   │   │   │   ├── SpaceToolBehavior.js
│   │   │   │   ├── SubProcessPlaneBehavior.js
│   │   │   │   ├── SubProcessStartEventBehavior.js
│   │   │   │   ├── TextAnnotationBehavior.js
│   │   │   │   ├── ToggleCollapseConnectionBehaviour.js
│   │   │   │   ├── ToggleElementCollapseBehaviour.js
│   │   │   │   ├── UnclaimIdBehavior.js
│   │   │   │   ├── UnsetDefaultFlowBehavior.js
│   │   │   │   ├── UpdateFlowNodeRefsBehavior.js
│   │   │   │   ├── index.js
│   │   │   │   └── util/
│   │   │   │       ├── CategoryUtil.js
│   │   │   │       ├── ConnectionLayoutUtil.js
│   │   │   │       ├── GeometricUtil.js
│   │   │   │       ├── LabelLayoutUtil.js
│   │   │   │       ├── LayoutUtil.js
│   │   │   │       ├── LineAttachmentUtil.js
│   │   │   │       ├── LineIntersect.js
│   │   │   │       ├── NonInterruptingUtil.js
│   │   │   │       └── ResizeUtil.js
│   │   │   ├── cmd/
│   │   │   │   ├── AddLaneHandler.js
│   │   │   │   ├── IdClaimHandler.js
│   │   │   │   ├── ResizeLaneHandler.js
│   │   │   │   ├── SetColorHandler.js
│   │   │   │   ├── SplitLaneHandler.js
│   │   │   │   ├── UpdateCanvasRootHandler.js
│   │   │   │   ├── UpdateFlowNodeRefsHandler.js
│   │   │   │   ├── UpdateModdlePropertiesHandler.js
│   │   │   │   ├── UpdatePropertiesHandler.js
│   │   │   │   └── UpdateSemanticParentHandler.js
│   │   │   ├── index.js
│   │   │   └── util/
│   │   │       ├── LaneUtil.js
│   │   │       └── ModelingUtil.js
│   │   ├── modeling-feedback/
│   │   │   ├── ModelingFeedback.js
│   │   │   └── index.js
│   │   ├── ordering/
│   │   │   ├── BpmnOrderingProvider.js
│   │   │   └── index.js
│   │   ├── outline/
│   │   │   ├── OutlineProvider.js
│   │   │   ├── OutlineUtil.js
│   │   │   └── index.js
│   │   ├── palette/
│   │   │   ├── PaletteProvider.js
│   │   │   └── index.js
│   │   ├── popup-menu/
│   │   │   ├── ReplaceMenuProvider.js
│   │   │   ├── index.js
│   │   │   └── util/
│   │   │       ├── Icons.js
│   │   │       └── TypeUtil.js
│   │   ├── replace/
│   │   │   ├── BpmnReplace.js
│   │   │   ├── ReplaceOptions.js
│   │   │   └── index.js
│   │   ├── replace-preview/
│   │   │   ├── BpmnReplacePreview.js
│   │   │   └── index.js
│   │   ├── rules/
│   │   │   ├── BpmnRules.js
│   │   │   └── index.js
│   │   ├── search/
│   │   │   ├── BpmnSearchProvider.js
│   │   │   └── index.js
│   │   ├── snapping/
│   │   │   ├── BpmnConnectSnapping.js
│   │   │   ├── BpmnCreateMoveSnapping.js
│   │   │   ├── BpmnSnappingUtil.js
│   │   │   └── index.js
│   │   └── space-tool/
│   │       ├── BpmnSpaceTool.js
│   │       └── index.js
│   ├── import/
│   │   ├── BpmnImporter.js
│   │   ├── BpmnTreeWalker.js
│   │   ├── Importer.js
│   │   ├── Util.js
│   │   └── index.js
│   ├── index.js
│   ├── model/
│   │   └── Types.ts
│   └── util/
│       ├── AnnotationUtil.js
│       ├── CompatibilityUtil.js
│       ├── DiUtil.js
│       ├── DrilldownUtil.js
│       ├── LabelUtil.js
│       ├── ModelUtil.js
│       ├── PoweredByUtil.js
│       ├── Types.js
│       └── Types.ts
├── package.json
├── renovate.json
├── resources/
│   ├── banner-min.txt
│   ├── banner.txt
│   └── initial.bpmn
├── rollup.config.js
├── tasks/
│   ├── build-distro.mjs
│   ├── stages/
│   │   ├── await-published
│   │   ├── update-demo
│   │   ├── update-examples
│   │   ├── update-integration-test
│   │   ├── update-translations
│   │   └── update-website
│   └── test-distro.mjs
├── test/
│   ├── TestHelper.js
│   ├── config/
│   │   ├── karma.distro.js
│   │   ├── karma.unit.js
│   │   └── translation-reporter.js
│   ├── coverageBundle.js
│   ├── distro/
│   │   ├── bpmn-modeler.js
│   │   ├── bpmn-navigated-viewer.js
│   │   ├── bpmn-viewer.js
│   │   └── helper.js
│   ├── fixtures/
│   │   ├── bpmn/
│   │   │   ├── align-elements.bpmn
│   │   │   ├── basic.bpmn
│   │   │   ├── boundary-events.bpmn
│   │   │   ├── collaboration/
│   │   │   │   ├── collaboration-data-store.bpmn
│   │   │   │   ├── collaboration-empty-participant.bpmn
│   │   │   │   ├── collaboration-message-flows.bpmn
│   │   │   │   ├── collaboration-participant.bpmn
│   │   │   │   ├── process-empty.bpmn
│   │   │   │   └── process.bpmn
│   │   │   ├── collaboration-data-items.bpmn
│   │   │   ├── collaboration-message-flows.bpmn
│   │   │   ├── collaboration-sequence-flows.bpmn
│   │   │   ├── collaboration-vertical.bpmn
│   │   │   ├── collaboration.bpmn
│   │   │   ├── collapsed-sub-process-legacy.bpmn
│   │   │   ├── collapsed-sub-process.bpmn
│   │   │   ├── complex.bpmn
│   │   │   ├── conditions.bpmn
│   │   │   ├── containers.bpmn
│   │   │   ├── distribute-elements-filtering.bpmn
│   │   │   ├── distribute-elements-filtering.collaboration.bpmn
│   │   │   ├── distribute-elements.bpmn
│   │   │   ├── draw/
│   │   │   │   ├── activity-markers-combination.bpmn
│   │   │   │   ├── activity-markers-simple.bpmn
│   │   │   │   ├── activity-markers.bpmn
│   │   │   │   ├── associations.bpmn
│   │   │   │   ├── boundary-event-with-refnode.bpmn
│   │   │   │   ├── boundary-event-without-refnode.bpmn
│   │   │   │   ├── boundary-event-z-index.bpmn
│   │   │   │   ├── call-activity.bpmn
│   │   │   │   ├── conditional-flow-default.bpmn
│   │   │   │   ├── conditional-flow-gateways.bpmn
│   │   │   │   ├── conditional-flow-typed-task.bpmn
│   │   │   │   ├── conditional-flow.bpmn
│   │   │   │   ├── data-objects.bpmn
│   │   │   │   ├── event-subprocess-icons.bpmn
│   │   │   │   ├── event-subprocesses-collapsed.bpmn
│   │   │   │   ├── event-subprocesses-expanded.bpmn
│   │   │   │   ├── events-interrupting.bpmn
│   │   │   │   ├── events.bpmn
│   │   │   │   ├── gateway-type-default.bpmn
│   │   │   │   ├── gateways.bpmn
│   │   │   │   ├── group-name.bpmn
│   │   │   │   ├── group.bpmn
│   │   │   │   ├── message-label.bpmn
│   │   │   │   ├── message-marker.bpmn
│   │   │   │   ├── pools-with-collection-marker.bpmn
│   │   │   │   ├── pools.bpmn
│   │   │   │   ├── task-types.bpmn
│   │   │   │   ├── text-annotation.bpmn
│   │   │   │   ├── vertical-pools.bpmn
│   │   │   │   └── xor.bpmn
│   │   │   ├── empty-definitions.bpmn
│   │   │   ├── error/
│   │   │   │   ├── categoryValue.bpmn
│   │   │   │   ├── di-plane-no-bpmn-element.bpmn
│   │   │   │   ├── duplicate-ids.bpmn
│   │   │   │   ├── invalid-child.bpmn
│   │   │   │   ├── missing-namespace.bpmn
│   │   │   │   ├── no-process-collaboration.bpmn
│   │   │   │   └── no-xml.txt
│   │   │   ├── event-sub-processes.bpmn
│   │   │   ├── extension/
│   │   │   │   ├── camunda.bpmn
│   │   │   │   ├── custom-override.bpmn
│   │   │   │   └── custom.bpmn
│   │   │   ├── features/
│   │   │   │   ├── drop/
│   │   │   │   │   ├── drop.bpmn
│   │   │   │   │   └── recursive-task.bpmn
│   │   │   │   ├── replace/
│   │   │   │   │   ├── 01_replace.bpmn
│   │   │   │   │   ├── association-gateways.bpmn
│   │   │   │   │   ├── cancel-events.bpmn
│   │   │   │   │   ├── connection.bpmn
│   │   │   │   │   ├── copy-properties.bpmn
│   │   │   │   │   ├── data-elements.bpmn
│   │   │   │   │   ├── data-stores-positioned-against-participant.bpmn
│   │   │   │   │   └── participants.bpmn
│   │   │   │   └── rules/
│   │   │   │       ├── event-based-gateway-outgoing-edge.bpmn
│   │   │   │       ├── link-event.bpmn
│   │   │   │       └── text-annotation-association.bpmn
│   │   │   ├── flow-markers.bpmn
│   │   │   ├── import/
│   │   │   │   ├── boundaryEvent.bpmn
│   │   │   │   ├── collaboration.bpmn
│   │   │   │   ├── collapsed/
│   │   │   │   │   ├── collaboration.bpmn
│   │   │   │   │   ├── process.bpmn
│   │   │   │   │   └── processWithChildren.bpmn
│   │   │   │   ├── collapsed-subprocess.bpmn
│   │   │   │   ├── data-store.inside-participant.bpmn
│   │   │   │   ├── data-store.outside-participant.dangling.bpmn
│   │   │   │   ├── data-store.outside-participant.participant.bpmn
│   │   │   │   ├── data-store.outside-participant.subprocess.bpmn
│   │   │   │   ├── default-attrs.bpmn
│   │   │   │   ├── error/
│   │   │   │   │   ├── boundaryEvent-invalidAttachToRef.bpmn
│   │   │   │   │   ├── boundaryEvent-missingAttachToRef.bpmn
│   │   │   │   │   ├── dangling-process-message-flow.bpmn
│   │   │   │   │   ├── invalid-flow-element.bpmn
│   │   │   │   │   └── multiple-dis.bpmn
│   │   │   │   ├── groups.bpmn
│   │   │   │   ├── labels/
│   │   │   │   │   ├── collaboration-message-flows.bpmn
│   │   │   │   │   ├── collaboration.bpmn
│   │   │   │   │   ├── embedded.bpmn
│   │   │   │   │   ├── external-no-di.bpmn
│   │   │   │   │   └── external.bpmn
│   │   │   │   ├── multiple-diagrams.bpmn
│   │   │   │   ├── position/
│   │   │   │   │   └── position-testcase.bpmn
│   │   │   │   ├── process.bpmn
│   │   │   │   └── text-annotation-message-flow.bpmn
│   │   │   ├── kitchen-sink.bpmn
│   │   │   ├── multiple-diagrams-lanesets.bpmn
│   │   │   ├── multiple-diagrams-overlapping-di.bpmn
│   │   │   ├── multiple-diagrams.bpmn
│   │   │   ├── multiple-nested-processes.bpmn
│   │   │   ├── nested-subprocesses.bpmn
│   │   │   ├── sequence-flows.bpmn
│   │   │   ├── simple-resizable.bpmn
│   │   │   └── simple.bpmn
│   │   └── json/
│   │       └── model/
│   │           ├── camunda.json
│   │           ├── custom-override.json
│   │           └── custom.json
│   ├── helper/
│   │   ├── TranslationCollector.js
│   │   └── index.js
│   ├── integration/
│   │   ├── CustomElementsSpec.js
│   │   ├── ReimportSpec.js
│   │   ├── SimpleModelingSpec.js
│   │   ├── custom-elements/
│   │   │   ├── CustomElementFactory.js
│   │   │   ├── CustomRenderer.js
│   │   │   ├── CustomRules.js
│   │   │   ├── CustomUpdater.js
│   │   │   └── index.js
│   │   └── model/
│   │       └── BpmnModdleSpec.js
│   ├── matchers/
│   │   ├── BoundsMatchers.js
│   │   ├── ConnectionMatchers.js
│   │   └── JSONMatcher.js
│   ├── spec/
│   │   ├── BaseModelerSpec.js
│   │   ├── BaseViewerSpec.js
│   │   ├── Modeler.copy-paste.a.bpmn
│   │   ├── Modeler.copy-paste.b.bpmn
│   │   ├── Modeler.copy-paste.complex.bpmn
│   │   ├── Modeler.copy-paste.empty.bpmn
│   │   ├── ModelerSpec.js
│   │   ├── NavigatedViewerSpec.js
│   │   ├── ViewerSpec.js
│   │   ├── draw/
│   │   │   ├── BpmnRenderUtilSpec.js
│   │   │   ├── BpmnRenderer.colors.bpmn
│   │   │   ├── BpmnRenderer.connection-colors.bpmn
│   │   │   ├── BpmnRenderer.group-colors.bpmn
│   │   │   ├── BpmnRenderer.labels.bpmn
│   │   │   ├── BpmnRenderer.no-event-icons.bpmn
│   │   │   ├── BpmnRenderer.sequenceFlow-no-source.bpmn
│   │   │   ├── BpmnRenderer.simple-cropping.bpmn
│   │   │   ├── BpmnRendererSpec.js
│   │   │   ├── TextRenderer.bpmn
│   │   │   ├── TextRendererSpec.js
│   │   │   └── custom-renderer/
│   │   │       ├── CustomRenderer.js
│   │   │       └── index.js
│   │   ├── environment/
│   │   │   └── MockingSpec.js
│   │   ├── features/
│   │   │   ├── align-elements/
│   │   │   │   ├── AlignElementsContextPadProviderSpec.js
│   │   │   │   ├── AlignElementsMenuProviderSpec.js
│   │   │   │   └── BpmnAlignElementsSpec.js
│   │   │   ├── append-preview/
│   │   │   │   ├── AppendPreview.bpmn
│   │   │   │   └── AppendPreviewSpec.js
│   │   │   ├── auto-place/
│   │   │   │   ├── BpmnAutoPlace.boundary-events.bpmn
│   │   │   │   ├── BpmnAutoPlace.bpmn
│   │   │   │   ├── BpmnAutoPlace.multi-connection.bpmn
│   │   │   │   ├── BpmnAutoPlace.subprocess.bpmn
│   │   │   │   ├── BpmnAutoPlace.subprocess.horizontal.bpmn
│   │   │   │   ├── BpmnAutoPlace.subprocess.vertical.bpmn
│   │   │   │   ├── BpmnAutoPlace.vertical.boundary-events.bpmn
│   │   │   │   ├── BpmnAutoPlace.vertical.bpmn
│   │   │   │   ├── BpmnAutoPlace.vertical.multi-connection.bpmn
│   │   │   │   └── BpmnAutoPlaceSpec.js
│   │   │   ├── auto-resize/
│   │   │   │   ├── AutoResize.lanes.bpmn
│   │   │   │   ├── AutoResize.multi-selection.bpmn
│   │   │   │   ├── AutoResize.nested-sub-processes.bpmn
│   │   │   │   ├── AutoResize.participant.bpmn
│   │   │   │   ├── AutoResize.space-tool.bpmn
│   │   │   │   ├── AutoResize.sub-processes.bpmn
│   │   │   │   └── AutoResizeSpec.js
│   │   │   ├── context-pad/
│   │   │   │   ├── ContextPad.activation.bpmn
│   │   │   │   └── ContextPadProviderSpec.js
│   │   │   ├── copy-paste/
│   │   │   │   ├── BpmnCopyPasteSpec.js
│   │   │   │   ├── ModdleCopySpec.js
│   │   │   │   ├── basic.bpmn
│   │   │   │   ├── collaboration-multiple.bpmn
│   │   │   │   ├── collaboration.bpmn
│   │   │   │   ├── collapsed-subprocess.bpmn
│   │   │   │   ├── complex.bpmn
│   │   │   │   ├── copy-properties.bpmn
│   │   │   │   ├── data-associations.bpmn
│   │   │   │   ├── event-based-gateway.bpmn
│   │   │   │   ├── nested-subprocess-annotations.bpmn
│   │   │   │   └── properties.bpmn
│   │   │   ├── distribute-elements/
│   │   │   │   ├── BpmnDistributeElementsSpec.js
│   │   │   │   └── DistributeElementsMenuProviderSpec.js
│   │   │   ├── drilldown/
│   │   │   │   ├── DrilldownIntegrationSpec.js
│   │   │   │   ├── DrilldownOverlayBehaviorSpec.bpmn
│   │   │   │   ├── DrilldownOverlaysBehaviorSpec.js
│   │   │   │   ├── DrilldownSpec.js
│   │   │   │   ├── collaboration-subprocesses.bpmn
│   │   │   │   ├── diagram-missing-plane.bpmn
│   │   │   │   ├── legacy-subprocesses.bpmn
│   │   │   │   ├── nested-subprocesses.bpmn
│   │   │   │   ├── plane-missing-bpmnelement.bpmn
│   │   │   │   ├── process-missing-bpmndiagram.bpmn
│   │   │   │   ├── subprocess-missing-bpmndiagram.bpmn
│   │   │   │   └── subprocess-missing-di.bpmn
│   │   │   ├── editor-actions/
│   │   │   │   └── BpmnEditorActionsSpec.js
│   │   │   ├── grid-snapping/
│   │   │   │   ├── BpmnGridSnapping.bpmn
│   │   │   │   ├── BpmnGridSnappingSpec.js
│   │   │   │   ├── basic.bpmn
│   │   │   │   └── behavior/
│   │   │   │       ├── AutoPlaceBehavior.bpmn
│   │   │   │       ├── AutoPlaceBehaviorSpec.js
│   │   │   │       ├── AutoResizeBehavior.bpmn
│   │   │   │       ├── AutoResizeBehaviorSpec.js
│   │   │   │       ├── CreateParticipantBehavior.bpmn
│   │   │   │       ├── CreateParticipantBehaviorSpec.js
│   │   │   │       ├── LayoutConnectionBehavior.bpmn
│   │   │   │       └── LayoutConnectionBehaviorSpec.js
│   │   │   ├── interaction-events/
│   │   │   │   └── BpmnInteractionEventsSpec.js
│   │   │   ├── keyboard/
│   │   │   │   └── BpmnKeyboardBindingsSpec.js
│   │   │   ├── keyboard-move-selection/
│   │   │   │   ├── KeyboardMoveSelectionSpec.js
│   │   │   │   └── keyboard-move-selection.bpmn
│   │   │   ├── label-editing/
│   │   │   │   ├── LabelEditing.bpmn
│   │   │   │   ├── LabelEditingPreviewSpec.js
│   │   │   │   └── LabelEditingProviderSpec.js
│   │   │   ├── label-link/
│   │   │   │   ├── LabelLink.bpmn
│   │   │   │   └── LabelLinkSpec.js
│   │   │   ├── modeling/
│   │   │   │   ├── AppendShapeSpec.js
│   │   │   │   ├── BendpointsSpec.js
│   │   │   │   ├── BpmnFactorySpec.js
│   │   │   │   ├── BpmnUpdater.bpmn
│   │   │   │   ├── BpmnUpdater.incompleteDi.bpmn
│   │   │   │   ├── BpmnUpdaterSpec.js
│   │   │   │   ├── CreateConnectionSpec.js
│   │   │   │   ├── DeleteConnectionSpec.js
│   │   │   │   ├── DeleteParticipantSpec.js
│   │   │   │   ├── DeleteShape.cropping.bpmn
│   │   │   │   ├── DeleteShapeSpec.js
│   │   │   │   ├── DropSpec.js
│   │   │   │   ├── ElementFactory.bpmn
│   │   │   │   ├── ElementFactorySpec.js
│   │   │   │   ├── IdClaim.bpmn
│   │   │   │   ├── IdClaimSpec.js
│   │   │   │   ├── LabelBoundsSpec.js
│   │   │   │   ├── LabelBoundsSpec.simple.bpmn
│   │   │   │   ├── LabelLayouting.initial.bpmn
│   │   │   │   ├── LabelLayouting.integration.bpmn
│   │   │   │   ├── LabelLayouting.move.bpmn
│   │   │   │   ├── LabelLayoutingSpec.js
│   │   │   │   ├── LoggingCroppingConnectionDocking.js
│   │   │   │   ├── MoveConnectionSpec.js
│   │   │   │   ├── MoveElements.boundary-connection.bpmn
│   │   │   │   ├── MoveElements.centered-connection.bpmn
│   │   │   │   ├── MoveElements.collaboration-association.bpmn
│   │   │   │   ├── MoveElements.data-input-output.bpmn
│   │   │   │   ├── MoveElements.eventBasedTargets.bpmn
│   │   │   │   ├── MoveElements.flow-collaboration.bpmn
│   │   │   │   ├── MoveElementsSpec.js
│   │   │   │   ├── MoveRulesSpec.js
│   │   │   │   ├── MoveShapeSpec.js
│   │   │   │   ├── MoveStress.bpmn
│   │   │   │   ├── MoveStressSpec.js
│   │   │   │   ├── ResizeShapeSpec.js
│   │   │   │   ├── SetColor.bpmn
│   │   │   │   ├── SetColorSpec.js
│   │   │   │   ├── UpdateAttachmentSpec.js
│   │   │   │   ├── UpdateLabel.bpmn
│   │   │   │   ├── UpdateLabelSpec.js
│   │   │   │   ├── UpdateModdleProperties.dataObject.bpmn
│   │   │   │   ├── UpdateModdleProperties.error.bpmn
│   │   │   │   ├── UpdateModdlePropertiesSpec.js
│   │   │   │   ├── UpdatePropertiesSpec.js
│   │   │   │   ├── UpdateSemanticParent.bpmn
│   │   │   │   ├── UpdateSemanticParentSpec.js
│   │   │   │   ├── append/
│   │   │   │   │   └── TextAnnotationSpec.js
│   │   │   │   ├── behavior/
│   │   │   │   │   ├── AdaptiveLabelPositioningBehavior.basics.bpmn
│   │   │   │   │   ├── AdaptiveLabelPositioningBehavior.boundary-events.bpmn
│   │   │   │   │   ├── AdaptiveLabelPositioningBehaviorSpec.js
│   │   │   │   │   ├── AssociationBehavior.bpmn
│   │   │   │   │   ├── AssociationBehaviorSpec.js
│   │   │   │   │   ├── AttachEventBehavior.bpmn
│   │   │   │   │   ├── AttachEventBehaviorSpec.js
│   │   │   │   │   ├── BoundaryEvent.bpmn
│   │   │   │   │   ├── BoundaryEventBehaviorSpec.js
│   │   │   │   │   ├── CompensateBoundaryEventBehavior.bpmn
│   │   │   │   │   ├── CompensateBoundaryEventBehaviorSpec.js
│   │   │   │   │   ├── CompensationAssociationBehavior.bpmn
│   │   │   │   │   ├── CompensationAssociationBehaviorSpec.js
│   │   │   │   │   ├── CreateBehavior.bpmn
│   │   │   │   │   ├── CreateBehaviorSpec.js
│   │   │   │   │   ├── CreateParticipantBehaviorSpec.js
│   │   │   │   │   ├── DataInputAssociationBehavior.bpmn
│   │   │   │   │   ├── DataInputAssociationBehaviorSpec.js
│   │   │   │   │   ├── DataObjectBehavior.create-data-association.bpmn
│   │   │   │   │   ├── DataObjectBehavior.data-object-reference.bpmn
│   │   │   │   │   ├── DataObjectBehavior.remove-data-association.bpmn
│   │   │   │   │   ├── DataObjectBehaviorSpec.js
│   │   │   │   │   ├── DataStoreBehavior.bpmn
│   │   │   │   │   ├── DataStoreBehavior.collaboration.bpmn
│   │   │   │   │   ├── DataStoreBehavior.connect.bpmn
│   │   │   │   │   ├── DataStoreBehavior.empty-pool.bpmn
│   │   │   │   │   ├── DataStoreBehavior.process.bpmn
│   │   │   │   │   ├── DataStoreBehavior.remove-participant.bpmn
│   │   │   │   │   ├── DataStoreBehaviorSpec.js
│   │   │   │   │   ├── DetachEventBehavior.bpmn
│   │   │   │   │   ├── DetachEventBehaviorSpec.js
│   │   │   │   │   ├── DropOnFlowBehavior.bpmn
│   │   │   │   │   ├── DropOnFlowBehaviorSpec.js
│   │   │   │   │   ├── EventBasedGatewayBehavior.bpmn
│   │   │   │   │   ├── EventBasedGatewayBehaviorSpec.js
│   │   │   │   │   ├── FixHoverBehavior.annotation.bpmn
│   │   │   │   │   ├── FixHoverBehavior.group.bpmn
│   │   │   │   │   ├── FixHoverBehavior.label.bpmn
│   │   │   │   │   ├── FixHoverBehavior.lane-connect.bpmn
│   │   │   │   │   ├── FixHoverBehavior.participant.bpmn
│   │   │   │   │   ├── FixHoverBehaviorSpec.js
│   │   │   │   │   ├── GroupBehaviorSpec.bpmn
│   │   │   │   │   ├── GroupBehaviorSpec.js
│   │   │   │   │   ├── ImportDockingFix.bpmn
│   │   │   │   │   ├── ImportDockingFixSpec.js
│   │   │   │   │   ├── IsHorizontalFix.bpmn
│   │   │   │   │   ├── IsHorizontalFixSpec.js
│   │   │   │   │   ├── LabelBehavior.bpmn
│   │   │   │   │   ├── LabelBehavior.copyPaste.bpmn
│   │   │   │   │   ├── LabelBehaviorSpec.js
│   │   │   │   │   ├── LayoutConnectionBehavior.bpmn
│   │   │   │   │   ├── LayoutConnectionBehaviorSpec.js
│   │   │   │   │   ├── MessageFlowBehavior.bpmn
│   │   │   │   │   ├── MessageFlowBehaviorSpec.js
│   │   │   │   │   ├── NonInterruptingBehavior.bpmn
│   │   │   │   │   ├── NonInterruptingBehaviorSpec.js
│   │   │   │   │   ├── ReconnectConnection.data-association.bpmn
│   │   │   │   │   ├── ReconnectConnectionSpec.js
│   │   │   │   │   ├── RemoveElementBehavior.bpmn
│   │   │   │   │   ├── RemoveElementBehavior.diagonal.bpmn
│   │   │   │   │   ├── RemoveElementBehavior.perpendicular.bpmn
│   │   │   │   │   ├── RemoveElementBehavior.vertical.diagonal.bpmn
│   │   │   │   │   ├── RemoveElementBehaviorSpec.js
│   │   │   │   │   ├── RemoveEmbeddedLabelBoundsBehavior.bpmn
│   │   │   │   │   ├── RemoveEmbeddedLabelBoundsBehaviorSpec.js
│   │   │   │   │   ├── RemoveParticipantBehaviorSpec.js
│   │   │   │   │   ├── ReplaceConnectionBehavior.association.bpmn
│   │   │   │   │   ├── ReplaceConnectionBehavior.boundary-events.bpmn
│   │   │   │   │   ├── ReplaceConnectionBehavior.message-sequence-flow.bpmn
│   │   │   │   │   ├── ReplaceConnectionBehaviorSpec.js
│   │   │   │   │   ├── ReplaceElementBehaviourSpec.js
│   │   │   │   │   ├── ResizeBehavior.lanes.bpmn
│   │   │   │   │   ├── ResizeBehavior.lanes.vertical.bpmn
│   │   │   │   │   ├── ResizeBehavior.participant.bpmn
│   │   │   │   │   ├── ResizeBehavior.participant.vertical.bpmn
│   │   │   │   │   ├── ResizeBehavior.subProcess.bpmn
│   │   │   │   │   ├── ResizeBehavior.textAnnotation.bpmn
│   │   │   │   │   ├── ResizeBehavior.utility.lanes-flowNodes.bpmn
│   │   │   │   │   ├── ResizeBehavior.utility.lanes.bpmn
│   │   │   │   │   ├── ResizeBehavior.utility.lanes.vertical-flowNodes.bpmn
│   │   │   │   │   ├── ResizeBehavior.utility.lanes.vertical.bpmn
│   │   │   │   │   ├── ResizeBehaviorSpec.js
│   │   │   │   │   ├── RootElementReferenceBehavior.bpmn
│   │   │   │   │   ├── RootElementReferenceBehaviorSpec.js
│   │   │   │   │   ├── SetCompensationActivityAfterPasteBehaviorSpec.bpmn
│   │   │   │   │   ├── SetCompensationActivityAfterPasteBehaviorSpec.js
│   │   │   │   │   ├── SpaceToolBehaviorSpec.group.bpmn
│   │   │   │   │   ├── SpaceToolBehaviorSpec.js
│   │   │   │   │   ├── SpaceToolBehaviorSpec.participant.bpmn
│   │   │   │   │   ├── SpaceToolBehaviorSpec.participant.vertical.bpmn
│   │   │   │   │   ├── SpaceToolBehaviorSpec.subprocess.bpmn
│   │   │   │   │   ├── SubProcessBehavior.copy-paste.bpmn
│   │   │   │   │   ├── SubProcessBehavior.multiple-planes.bpmn
│   │   │   │   │   ├── SubProcessBehavior.nested-subprocess-annotations.bpmn
│   │   │   │   │   ├── SubProcessBehavior.planes.bpmn
│   │   │   │   │   ├── SubProcessBehavior.start-event.bpmn
│   │   │   │   │   ├── SubProcessPlaneBehaviorSpec.js
│   │   │   │   │   ├── SubProcessStartEventBehaviorSpec.js
│   │   │   │   │   ├── TextAnnotationBehaviorSpec.bpmn
│   │   │   │   │   ├── TextAnnotationBehaviorSpec.js
│   │   │   │   │   ├── ToggleCollapseConnectionBehaviourSpec.bpmn
│   │   │   │   │   ├── ToggleCollapseConnectionBehaviourSpec.js
│   │   │   │   │   ├── ToggleElementCollapseBehaviour.bpmn
│   │   │   │   │   ├── ToggleElementCollapseBehaviourSpec.js
│   │   │   │   │   ├── UnclaimIdBehaviorSpec.bpmn
│   │   │   │   │   ├── UnclaimIdBehaviorSpec.js
│   │   │   │   │   ├── UnsetDefaultFlowBehaviorSpec.bpmn
│   │   │   │   │   ├── UnsetDefaultFlowBehaviorSpec.js
│   │   │   │   │   └── util/
│   │   │   │   │       ├── GeometricUtilSpec.js
│   │   │   │   │       ├── LabelLayoutUtilSpec.js
│   │   │   │   │       ├── LineAttachmentUtilSpec.js
│   │   │   │   │       ├── LineIntersectSpec.js
│   │   │   │   │       └── ResizeUtilSpec.js
│   │   │   │   ├── input-output/
│   │   │   │   │   └── DataInputOutput.bpmn
│   │   │   │   ├── lanes/
│   │   │   │   │   ├── AddLaneSpec.js
│   │   │   │   │   ├── DeleteLaneSpec.js
│   │   │   │   │   ├── ResizeLaneSpec.js
│   │   │   │   │   ├── SplitLane.nested.bpmn
│   │   │   │   │   ├── SplitLane.nested.vertical.bpmn
│   │   │   │   │   ├── SplitLaneSpec.js
│   │   │   │   │   ├── UpdateFlowNodeRefs.basic.bpmn
│   │   │   │   │   ├── UpdateFlowNodeRefsSpec.js
│   │   │   │   │   ├── lanes-flow-nodes-vertical.bpmn
│   │   │   │   │   ├── lanes-flow-nodes.bpmn
│   │   │   │   │   ├── lanes.bpmn
│   │   │   │   │   ├── lanes.only.bpmn
│   │   │   │   │   ├── lanes.only.vertical.bpmn
│   │   │   │   │   ├── lanes.vertical.bpmn
│   │   │   │   │   ├── participant-lane-vertical.bpmn
│   │   │   │   │   ├── participant-lane.bpmn
│   │   │   │   │   ├── participant-no-lane-vertical.bpmn
│   │   │   │   │   ├── participant-no-lane.bpmn
│   │   │   │   │   └── participant-single-lane.bpmn
│   │   │   │   └── layout/
│   │   │   │       ├── Helper.js
│   │   │   │       ├── LayoutAssociationSpec.js
│   │   │   │       ├── LayoutConnectionSpec.js
│   │   │   │       ├── LayoutDataAssociationSpec.js
│   │   │   │       ├── LayoutMessageFlowSpec.bpmn
│   │   │   │       ├── LayoutMessageFlowSpec.js
│   │   │   │       ├── LayoutMessageFlowSpec.vertical.bpmn
│   │   │   │       ├── LayoutSequenceFlowSpec.boundaryEvents.bpmn
│   │   │   │       ├── LayoutSequenceFlowSpec.boundaryEventsLoops.bpmn
│   │   │   │       ├── LayoutSequenceFlowSpec.flowElements.bpmn
│   │   │   │       ├── LayoutSequenceFlowSpec.js
│   │   │   │       ├── LayoutSequenceFlowSpec.subProcess.bpmn
│   │   │   │       ├── LayoutSequenceFlowSpec.vertical.boundaryEvents.bpmn
│   │   │   │       ├── LayoutSequenceFlowSpec.vertical.boundaryEventsLoops.bpmn
│   │   │   │       ├── LayoutSequenceFlowSpec.vertical.flowElements.bpmn
│   │   │   │       └── LayoutSequenceFlowSpec.vertical.subProcess.bpmn
│   │   │   ├── modeling-feedback/
│   │   │   │   ├── ModelingFeedback.bpmn
│   │   │   │   └── ModelingFeedbackSpec.js
│   │   │   ├── ordering/
│   │   │   │   ├── BpmnDiOrderingSpec.js
│   │   │   │   ├── BpmnOrderingProviderSpec.js
│   │   │   │   ├── Helper.js
│   │   │   │   ├── collapsed-subprocess.bpmn
│   │   │   │   ├── data-association.bpmn
│   │   │   │   ├── groups.bpmn
│   │   │   │   ├── ordering-start-event.bpmn
│   │   │   │   ├── ordering-subprocesses.bpmn
│   │   │   │   ├── ordering.bpmn
│   │   │   │   └── wrong-di-order.bpmn
│   │   │   ├── outline/
│   │   │   │   ├── OutlineProvider.bpmn
│   │   │   │   └── OutlineProviderSpec.js
│   │   │   ├── palette/
│   │   │   │   └── PaletteProviderSpec.js
│   │   │   ├── popup-menu/
│   │   │   │   ├── ReplaceMenuProvider.collapsedSubProcess.bpmn
│   │   │   │   ├── ReplaceMenuProvider.compensation-activity.bpmn
│   │   │   │   ├── ReplaceMenuProvider.conditionalFlows.bpmn
│   │   │   │   ├── ReplaceMenuProvider.defaultFlows.bpmn
│   │   │   │   ├── ReplaceMenuProvider.defaultFlowsFromComplexGateways.bpmn
│   │   │   │   ├── ReplaceMenuProvider.defaultFlowsFromInclusiveGateways.bpmn
│   │   │   │   ├── ReplaceMenuProvider.events.bpmn
│   │   │   │   ├── ReplaceMenuProvider.pools.bpmn
│   │   │   │   ├── ReplaceMenuProvider.subProcesses.bpmn
│   │   │   │   └── ReplaceMenuProviderSpec.js
│   │   │   ├── replace/
│   │   │   │   ├── BpmnReplace.collaboration.bpmn
│   │   │   │   ├── BpmnReplace.collaboration.vertical.bpmn
│   │   │   │   ├── BpmnReplace.collapsedSubProcess.bpmn
│   │   │   │   ├── BpmnReplace.compensation.bpmn
│   │   │   │   ├── BpmnReplace.dataObjects.bpmn
│   │   │   │   ├── BpmnReplace.eventSubProcesses.bpmn
│   │   │   │   ├── BpmnReplace.poolMessageFlows.bpmn
│   │   │   │   ├── BpmnReplace.poolMessageFlows.vertical.bpmn
│   │   │   │   ├── BpmnReplaceSpec.js
│   │   │   │   ├── ReplaceRulesSpec.js
│   │   │   │   └── SubProcess-collapsed.bpmn
│   │   │   ├── replace-preview/
│   │   │   │   ├── BpmnReplacePreview.bpmn
│   │   │   │   └── BpmnReplacePreviewSpec.js
│   │   │   ├── rules/
│   │   │   │   ├── BpmnRules.attaching.bpmn
│   │   │   │   ├── BpmnRules.boundaryEvent.bpmn
│   │   │   │   ├── BpmnRules.collaboration-dataAssociation.bpmn
│   │   │   │   ├── BpmnRules.collaboration-empty.bpmn
│   │   │   │   ├── BpmnRules.collaboration-lanes.bpmn
│   │   │   │   ├── BpmnRules.collaboration.bpmn
│   │   │   │   ├── BpmnRules.collapsedPools.bpmn
│   │   │   │   ├── BpmnRules.compensation-collaboration.bpmn
│   │   │   │   ├── BpmnRules.compensation.bpmn
│   │   │   │   ├── BpmnRules.connectOnCreate.bpmn
│   │   │   │   ├── BpmnRules.dataAssociation.bpmn
│   │   │   │   ├── BpmnRules.dataInputOutput.collaboration.bpmn
│   │   │   │   ├── BpmnRules.dataInputOutput.process.bpmn
│   │   │   │   ├── BpmnRules.detaching.bpmn
│   │   │   │   ├── BpmnRules.eventBasedGatewayBasic.bpmn
│   │   │   │   ├── BpmnRules.groups.bpmn
│   │   │   │   ├── BpmnRules.insert.bpmn
│   │   │   │   ├── BpmnRules.messageFlow.bpmn
│   │   │   │   ├── BpmnRules.moveLane.bpmn
│   │   │   │   ├── BpmnRules.multiSelectionPools.bpmn
│   │   │   │   ├── BpmnRules.process.bpmn
│   │   │   │   ├── BpmnRules.subProcess-dataAssociation.bpmn
│   │   │   │   ├── BpmnRulesSpec.js
│   │   │   │   └── Helper.js
│   │   │   ├── search/
│   │   │   │   ├── BpmnSearchProviderSpec.js
│   │   │   │   ├── bpmn-search-collaboration.bpmn
│   │   │   │   ├── bpmn-search-sorting.bpmn
│   │   │   │   └── bpmn-search.bpmn
│   │   │   ├── snapping/
│   │   │   │   ├── BpmnConnectSnapping.bpmn
│   │   │   │   ├── BpmnConnectSnappingSpec.js
│   │   │   │   ├── BpmnCreateMoveSnapping.boundary-events.bpmn
│   │   │   │   ├── BpmnCreateMoveSnapping.collaboration.bpmn
│   │   │   │   ├── BpmnCreateMoveSnapping.docking-create-mode.bpmn
│   │   │   │   ├── BpmnCreateMoveSnapping.docking-points.bpmn
│   │   │   │   ├── BpmnCreateMoveSnapping.process.bpmn
│   │   │   │   ├── BpmnCreateMoveSnapping.sequence-flows.bpmn
│   │   │   │   ├── BpmnCreateMoveSnapping.trbl-snapping.bpmn
│   │   │   │   └── BpmnCreateMoveSnappingSpec.js
│   │   │   └── space-tool/
│   │   │       ├── BpmnSpaceTool.artifacts.bpmn
│   │   │       ├── BpmnSpaceTool.basics.bpmn
│   │   │       ├── BpmnSpaceTool.boundary-events.bpmn
│   │   │       ├── BpmnSpaceTool.participants.bpmn
│   │   │       ├── BpmnSpaceTool.text-annotations.bpmn
│   │   │       └── BpmnSpaceToolSpec.js
│   │   ├── helper/
│   │   │   └── InjectSpec.js
│   │   ├── i18n/
│   │   │   ├── custom-translate/
│   │   │   │   ├── custom-translate.js
│   │   │   │   └── index.js
│   │   │   └── translateSpec.js
│   │   ├── import/
│   │   │   ├── BpmnTreeWalkerSpec.js
│   │   │   ├── ImporterSpec.js
│   │   │   ├── ModelWiringSpec.js
│   │   │   ├── data-association.bpmn
│   │   │   ├── elements/
│   │   │   │   ├── AssociationSpec.collaboration.bpmn
│   │   │   │   ├── AssociationSpec.compensation.bpmn
│   │   │   │   ├── AssociationSpec.data-association.bpmn
│   │   │   │   ├── AssociationSpec.data-input-output.bpmn
│   │   │   │   ├── AssociationSpec.events.bpmn
│   │   │   │   ├── AssociationSpec.js
│   │   │   │   ├── AssociationSpec.text-annotation.bpmn
│   │   │   │   ├── CollapsedSpec.js
│   │   │   │   ├── DataInputOutput.bpmn
│   │   │   │   ├── DataInputOutputSpec.js
│   │   │   │   ├── Groups.bpmn
│   │   │   │   ├── GroupsSpec.js
│   │   │   │   └── LabelSpec.js
│   │   │   ├── lane-flowNodes.bpmn
│   │   │   ├── lane-missing-flowNodeRef.bpmn
│   │   │   ├── missing-di-plane-root-element.bpmn
│   │   │   ├── missing-di-plane.bpmn
│   │   │   ├── sequenceFlow-missingWaypoints.bpmn
│   │   │   └── sequenceFlow-ordering.bpmn
│   │   └── util/
│   │       ├── ModelUtilSpec.js
│   │       └── svgHelpersSpec.js
│   ├── testBundle.js
│   └── util/
│       ├── KeyEvents.js
│       ├── MockEvents.js
│       ├── custom-rules/
│       │   ├── CustomRules.js
│       │   └── index.js
│       └── svgHelpers.js
└── tsconfig.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/CONTRIBUTING.md
================================================
# How to Contribute

Great to see you! Help us out by [filing bugs or feature requests](#work-with-issues), assisting others [in our forums](https://forum.bpmn.io/), or [contributing improvements](#contribute-improvements).

## Table of Contents

* [Work with Issues](#work-with-issues)
  * [Create an Issue](#create-an-issue)
  * [Help Out](#help-out)
* [Contribute Improvements](#contribute-improvements)
  * [Setup the Project](#setup-the-project)
  * [Build and Run the Project](#build-and-run-the-project)
  * [Discuss Code Changes](#discuss-code-changes)
  * [Adhere to the Unit Test Style](#adhere-to-the-unit-test-style)
  * [Create a Pull Request](#create-a-pull-request)

## Work with Issues

We use our [issue tracker](https://github.com/bpmn-io/bpmn-js/issues) for project communication, discussion, and planning.

### Create an Issue

File bug reports or feature requests via [our issue tracker](https://github.com/bpmn-io/bpmn-js/issues/new/choose). Please mind the existing issue templates. These guide you and ensure you provide the details needed for us to follow up on your issue.

### Help Out

* Share your perspective on issues
* Be helpful and respect others when commenting

## Contribute Improvements

Learn how to set up the project locally, make changes, and contribute bug fixes and new features through pull requests.

### Setup the Project

The project development runs on top of the [diagram-js](https://github.com/bpmn-io/diagram-js) `develop` branch. The following code snippet sets up both libraries linking diagram-js to bpmn-js.

```sh
mkdir bpmn.io
cd bpmn.io

git clone git@github.com:bpmn-io/diagram-js.git -b develop
(cd diagram-js && npm i)

git clone git@github.com:bpmn-io/bpmn-js.git
(cd bpmn-js && npm install && npm link ../diagram-js)
```

For details consult our in depth [setup guide](../docs/project/SETUP.md).

### Build and Run the Project

Spin up a single modeler instance for local inspection:

```sh
npm start
```

Spin up the development environment, re-run tests with every file change:

```sh
npm run dev
```

You may also run against different browsers:

```sh
TEST_BROWSERS=Firefox npm run dev
```

Build, lint, and test the project, just as the CI does.

```sh
npm run all
```

### Discuss Code Changes

Create a [pull request](#create-a-pull-request) if you would like to have an in-depth discussion about some piece of code.

### Adhere to the Unit Test Style

In order to retrieve a sign-off for your contribution, it needs to be sufficiently and well tested. Please structure your unit tests into __given__, __when__ and __then__ ([ModelerSpec example](https://github.com/bpmn-io/bpmn-js/blob/develop/test/spec/ModelerSpec.js#L116), [ResizeBehaviorSpec example](https://github.com/bpmn-io/bpmn-js/blob/develop/test/spec/features/modeling/behavior/ResizeBehaviorSpec.js#L38)). To increase overall readability and understandability please also leave two empty lines before `describe(...)`, `it(...)` or _setup_ blocks on the same indentation level ([ModelerSpec example](https://github.com/bpmn-io/bpmn-js/blob/develop/test/spec/ModelerSpec.js#L49), [ResizeBehaviorSpec example](https://github.com/bpmn-io/bpmn-js/blob/develop/test/spec/features/modeling/behavior/ResizeBehaviorSpec.js#L36)).

### Create a Pull Request

We use pull requests for feature additions and bug fixes. If you are not yet familiar with pull requests, [read this excellent guide](https://gun.io/blog/how-to-github-fork-branch-and-pull-request).

Some things that make it easier for us to accept your pull requests

* The code adheres to our conventions
  * spaces instead of tabs
  * single-quotes
  * ...
* The code is tested
* The `npm run all` build passes (executes tests + linting)
* The work is combined into a single commit
* The commit messages adhere to the [conventional commits guidelines](https://www.conventionalcommits.org)

We'd be glad to assist you if you do not get these things right in the first place.

---

Thanks for your interest in our library.

:heart: from the bpmn.io team.


================================================
FILE: .github/ISSUE_TEMPLATE/BUG_REPORT.md
================================================
---
name: Bug report
about: Report a problem and help us fix it.
labels: "bug"
---


### Describe the Bug

<!-- A clear and concise description of what the bug is. -->


### Steps to Reproduce

1. do this
2. do that

<!--
If you report a modeling related issue, ensure you can reproduce it on [demo.bpmn.io](https://demo.bpmn.io/new)

When reporting a library error, try to build an example that reproduces your problem. You can use our playgrounds for [viewer](https://jsfiddle.net/07envcu1/) or [modeler](https://jsfiddle.net/bg97r61t/) as a starting point or put a demo up on [GitHub](https://github.com/) for inspection.
-->

### Expected Behavior

<!-- A clear and concise description of what you expected to happen. -->


### Environment

 - Browser: [e.g. IE 11, Chrome 69]
 - OS: [e.g. Windows 7]
 - Library version: [e.g. 2.0.0]


================================================
FILE: .github/ISSUE_TEMPLATE/FEATURE_REQUEST.md
================================================
---
name: Feature request
about: Suggest an idea or general improvement.
labels: "enhancement"
---


### Is your feature request related to a problem? Please describe.

A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]


### Describe the solution you'd like

A clear and concise description of what you want to happen.

### Describe alternatives you've considered

A clear and concise description of any alternative solutions or features you've considered.


### Additional context

Add any other context or screenshots about the feature request here.


================================================
FILE: .github/ISSUE_TEMPLATE/TASK.md
================================================
---
name: Task
about: Describe a generic activity we should carry out.
---


### What should we do?

<!-- Clearly describe the activity we should carry out. -->


### Why should we do it?

<!-- Argue why doing it is a healthy investment of our time. -->

================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
  - name: Ask a question
    url: https://forum.bpmn.io
    about: Head over to our community forum to ask questions and get answers.

================================================
FILE: .github/merge-me.yml
================================================
reviewTeams:
- modeling-dev
- modeling-design


================================================
FILE: .github/workflows/CI.yml
================================================
name: CI
on: [ push, pull_request ]
jobs:
  build_browsers:

    strategy:
      fail-fast: false
      matrix:
        os: [ ubuntu-latest ]
        browser: [ Firefox, ChromeHeadless ]

    runs-on: ${{ matrix.os }}

    steps:
    - name: Checkout
      uses: actions/checkout@v6
    - name: Use Node.js
      uses: actions/setup-node@v6
      with:
        node-version: 24
        cache: 'npm'
    - name: Install dependencies
      run: npm ci
    - name: Setup project
      uses: bpmn-io/actions/setup@latest
    - name: Build (with coverage)
      if: matrix.browser == 'ChromeHeadless'
      env:
        COVERAGE: 1
        TEST_BROWSERS: ${{ matrix.browser }}
      run: npm run all
    - name: Build
      if: matrix.browser == 'Firefox'
      env:
        TEST_BROWSERS: ${{ matrix.browser }}
      run: xvfb-run npm run all
    - name: Upload coverage
      if: matrix.browser == 'ChromeHeadless'
      uses: codecov/codecov-action@v5
      with:
        fail_ci_if_error: true
      env:
        CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

  build_os:

    strategy:
      fail-fast: false
      matrix:
        os: [ macos-latest, windows-latest ]
        browser: [ ChromeHeadless ]

    runs-on: ${{ matrix.os }}

    steps:
    - name: Checkout
      uses: actions/checkout@v6
    - name: Use Node.js
      uses: actions/setup-node@v6
      with:
        node-version: 24
        cache: 'npm'
    - name: Install dependencies
      run: npm ci
    - name: Setup project
      uses: bpmn-io/actions/setup@latest
    - name: Build
      env:
        TEST_BROWSERS: ${{ matrix.browser }}
      run: npm run all


================================================
FILE: .github/workflows/CODE_SCANNING.yml
================================================
name: "Code Scanning"

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main, develop ]
    paths-ignore:
      - '**/*.md'

jobs:
  codeql-build:
    # CodeQL runs on ubuntu-latest, windows-latest, and macos-latest
    runs-on: ubuntu-latest

    permissions:
      # required for all workflows
      security-events: write

    steps:
      - name: Checkout repository
        uses: actions/checkout@v6

      # Initializes the CodeQL tools for scanning.
      - name: Initialize CodeQL
        uses: github/codeql-action/init@v4
        with:
          languages: javascript
          config: |
            paths-ignore:
              - '**/test'

      - name: Perform CodeQL Analysis
        uses: github/codeql-action/analyze@v4


================================================
FILE: .github/workflows/COMMENT_TARGETS_MAIN.yml
================================================
name: COMMENT_TARGETS_MAIN
on:
  pull_request:
    types:
      - opened
    branches:
      - main
permissions:
  pull-requests: write
jobs:
  comment:
    name: Comment on targeting main branch
    runs-on: ubuntu-latest
    permissions:
      pull-requests: write
    steps:
      - name: Create comment
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          GH_REPO: ${{ github.repository }}
          NUMBER: ${{ github.event.number }}
          BODY: |
            This pull request targets the `main` branch. Please target `main` for bug fixes only. Target `develop` for regular feature development.
        run: gh issue comment "$NUMBER" --body "$BODY"

================================================
FILE: .github/workflows/MERGE_MAIN_TO_DEVELOP.yml
================================================
name: MERGE_MAIN_TO_DEVELOP
on:
  push:
    branches:
    - "main"

jobs:
  merge_main_to_develop:
    runs-on: ubuntu-latest
    permissions:
      contents: write

    steps:
    - name: Checkout develop
      uses: actions/checkout@v6
      with:
        token: ${{ secrets.BPMN_IO_TOKEN }}
        persist-credentials: true
        ref: develop
        fetch-depth: 0
    - name: Merge main to develop and push
      run: |
        git config user.name '${{ secrets.BPMN_IO_USERNAME }}'
        git config user.email '${{ secrets.BPMN_IO_EMAIL }}'
        git merge -m 'chore: merge main to develop' --no-edit origin/main
        git push

    - name: Notify failure on Slack
      if: failure()
      uses: slackapi/slack-github-action@v3
      with:
        method: chat.postMessage
        token: ${{ secrets.SLACK_BOT_TOKEN }}
        payload: |
          channel: ${{ secrets.SLACK_CHANNEL_ID }}
          text: "Automatic merge of <https://github.com/${{ github.repository }}/tree/${{ github.ref }}|${{ github.ref }}> to <https://github.com/${{ github.repository }}/tree/develop|${{ github.repository }}#develop> failed."


================================================
FILE: .github/workflows/POST_RELEASE.yml
================================================
name: POST_RELEASE
on:
  push:
    tags:
      - 'v[0-9]+.[0-9]+.[0-9]+'

jobs:
  post_release:

    strategy:
      matrix:
        os: [ ubuntu-latest ]
        node-version: [ 20 ]

    runs-on: ${{ matrix.os }}
    steps:

    - name: Checkout
      uses: actions/checkout@v6

    - name: Use Node.js
      uses: actions/setup-node@v6
      with:
        node-version: ${{ matrix.node-version }}
        cache: 'npm'
        
    - name: Setup project
      uses: bpmn-io/actions/setup@latest

    - name: Set TAG
      run: echo "TAG=$(git describe --tags --abbrev=0)" >> $GITHUB_ENV

    - name: Wait for published
      env:
        PKG: 'bpmn-js@${{ env.TAG }}'
      run: tasks/stages/await-published

    - name: Update integration test
      env:
        BPMN_IO_TOKEN: ${{ secrets.BPMN_IO_TOKEN }}
        BPMN_IO_EMAIL: ${{ secrets.BPMN_IO_EMAIL }}
        BPMN_IO_USERNAME: ${{ secrets.BPMN_IO_USERNAME }}
      run: tasks/stages/update-integration-test

    - name: Update demo
      env:
        BPMN_IO_TOKEN: ${{ secrets.BPMN_IO_TOKEN }}
        BPMN_IO_EMAIL: ${{ secrets.BPMN_IO_EMAIL }}
        BPMN_IO_USERNAME: ${{ secrets.BPMN_IO_USERNAME }}
        BPMN_IO_DEMO_ENDPOINT: ${{ secrets.BPMN_IO_DEMO_ENDPOINT }}
      run: tasks/stages/update-demo

    - name: Update examples
      env:
        BPMN_IO_TOKEN: ${{ secrets.BPMN_IO_TOKEN }}
        BPMN_IO_EMAIL: ${{ secrets.BPMN_IO_EMAIL }}
        BPMN_IO_USERNAME: ${{ secrets.BPMN_IO_USERNAME }}
      run: tasks/stages/update-examples

    - name: Update website
      env:
        BPMN_IO_TOKEN: ${{ secrets.BPMN_IO_TOKEN }}
        BPMN_IO_EMAIL: ${{ secrets.BPMN_IO_EMAIL }}
        BPMN_IO_USERNAME: ${{ secrets.BPMN_IO_USERNAME }}
      run: tasks/stages/update-website

    - name: Update translations
      env:
        GITHUB_TOKEN: ${{ secrets.BPMN_IO_TOKEN }}
        BPMN_IO_EMAIL: ${{ secrets.BPMN_IO_EMAIL }}
        BPMN_IO_USERNAME: ${{ secrets.BPMN_IO_USERNAME }}
        REVIEWERS: 'bpmn-io/modeling-dev'
        TAG: ${{ env.TAG }}
      run: tasks/stages/update-translations


================================================
FILE: .github/workflows/RELEASE.yml
================================================
name: RELEASE
on:
  push:
    branches:
      - main
      - develop
jobs:
  release_please:
    outputs:
      release_created: ${{ steps.release.outputs.release_created }}
      tag: ${{ steps.release.outputs.tag_name }}
    permissions:
      contents: write # to create release commit (google-github-actions/release-please-action)
      pull-requests: write # to create release PR (google-github-actions/release-please-action)

    runs-on: ubuntu-latest
    steps:
      - uses: google-github-actions/release-please-action@v4
        id: release
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          target-branch: main
          release-type: node

  publish:
    needs: release_please
    if: ${{ needs.release_please.outputs.release_created }}

    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v6
      - name: Use Node.js
        uses: actions/setup-node@v6
        with:
          node-version: 24
          cache: 'npm'
          registry-url: 'https://registry.npmjs.org'
      - name: Install dependencies
        run: npm ci
      - run: npm publish
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

================================================
FILE: .gitignore
================================================
node_modules/
dist/
coverage/
lib/**/*.d.ts
.idea
*.iml
.DS_Store

================================================
FILE: .release-please-manifest.json
================================================
{
  "pull-request-title-pattern": "chore: release v${version}",
  "changelog-sections": "[{\"type\":\"feat\",\"section\":\"Features\",\"hidden\":false},{\"type\":\"fix\",\"section\":\"Bug Fixes\",\"hidden\":false},{\"type\":\"deps\",\"section\":\"Dependency Updates\",\"hidden\":false}]",
  "changelog-type": "github",
  ".": "18.13.0"
}

================================================
FILE: CHANGELOG.md
================================================
# Changelog

All notable changes to [bpmn-js](https://github.com/bpmn-io/bpmn-js) are documented here. We use [semantic versioning](http://semver.org/) for releases.

## Unreleased

___Note:__ Yet to be released changes appear here._

* `FIX`: disable grouping in popup menu during search ([bpmn-io/diagram-js#1014](https://github.com/bpmn-io/diagram-js/pull/1014))
* `FIX`: correct handling of annotations during sub-process collapse/expand, copy/paste, and remove actions ([#2388](https://github.com/bpmn-io/bpmn-js/pull/2388))
* `FIX`: allow undo of pasted sub-process ([#2388](https://github.com/bpmn-io/bpmn-js/pull/2388), [#2269](https://github.com/bpmn-io/bpmn-js/issues/2269))
* `DEPS`: update to `diagram-js@15.10.0`

## 18.13.1

* `FIX`: correct sequence flow layout for corner boundary events whose target is strictly axis-aligned ([#2270](https://github.com/bpmn-io/bpmn-js/issues/2270))

## 18.13.0

* `FEAT`: allow to create child elements from the context pad ([#2391](https://github.com/bpmn-io/bpmn-js/issues/2391))

## 18.12.1

* `FIX`: correctly replace non-interrupting event with an interrupting one ([#2313](https://github.com/bpmn-io/bpmn-js/issues/2313))

## 18.12.0

* `FEAT`: activate wheel zoom/scoll on `mouseover` ([#1008](https://github.com/bpmn-io/diagram-js/pull/1008))
* `FEAT`: prevent keyboard movement for boundary events without host ([#2386](https://github.com/bpmn-io/bpmn-js/pull/2386))
* `FIX`: prevent accidental creation of intermediate events during keyboard move ([#1803](https://github.com/bpmn-io/bpmn-js/issues/1803), [#1876](https://github.com/bpmn-io/bpmn-js/issues/1876))
* `DEPS`: update to `diagram-js@15.9.0`

## 18.11.0

* `FEAT`: add `cut` action and keyboard shortcut ([bpmn-io/diagram-js#1006](https://github.com/bpmn-io/diagram-js/pull/1006))
* `DEPS`: update to `diagram-js@15.7.0`
* `DEPS`: update to `bpmn-moddle@10.0.0`
* `DEPS`: update to `min-dash@5.0.0`
* `DEPS`: update to `ids@3.0.0`
* `DEPS`: update to `tiny-svg@4.1.4`
* `DEPS`: update to `diagram-js-direct-editing@3.3.0`
* `DEPS`: update to `min-dom@5.2.0`

## 18.10.1

* `DEPS`: update to `min-dash@4.2.3`
* `DEPS`: update to `tiny-svg@3.1.3`

## 18.10.0

* `FEAT`: add ability to duplicate elements ([bpmn-io/diagram-js#998](https://github.com/bpmn-io/diagram-js/pull/998))
* `DEPS`: update to `diagram-js@15.5.0`

## 18.9.1

* `FIX`: only draw links for currently selected elements ([#2365](https://github.com/bpmn-io/bpmn-js/pull/2365))

## 18.9.0

* `FEAT`: visually link external label with its target ([#2328](https://github.com/bpmn-io/bpmn-js/pull/2328))
* `FEAT`: add support for labels to `OutlineProvider#getOutline`
* `FIX`: ensure `BpmnRenderer#getShapePath` returns correct path for labels

## 18.8.0

* `FEAT`: allow copying data object references and `isCollection` property ([#2348](https://github.com/bpmn-io/bpmn-js/pull/2348))

## 18.7.0

* `FEAT`: support disabled entries in popup menu ([bpmn-io/diagram-js#987](https://github.com/bpmn-io/diagram-js/pull/987))
* `DEPS`: update to `diagram-js@15.4.0`

## 18.6.5

* `FIX`: ensure popup menu keyboard navigation accounts for group order ([bpmn-io/diagram-js#989](https://github.com/bpmn-io/diagram-js/pull/989))
* `DEPS`: update to `diagram-js@15.3.1`

## 18.6.4

* `FIX`: revert `AdHocSubProcess#cancelRemainingInstances` default value removal ([bpmn-io/bpmn-moddle#132](https://github.com/bpmn-io/bpmn-moddle/pull/132))
* `DEPS`: update to `bpmn-moddle@9.0.4`

## 18.6.3

* `FIX`: remove `AdHocSubProcess#cancelRemainingInstances` default value ([bpmn-io/bpmn-moddle#131](https://github.com/bpmn-io/bpmn-moddle/issues/131))
* `DEPS`: update to `bpmn-moddle@9.0.3`

## 18.6.2

* `FIX`: center task markers ([#1995](https://github.com/bpmn-io/bpmn-js/issues/1995))

## 18.6.1

* `FIX`: copy error, escalation, message and signal references when copying elements ([#1906](https://github.com/bpmn-io/bpmn-js/issues/1906), [#2249](https://github.com/bpmn-io/bpmn-js/issues/2249), [#2301](https://github.com/bpmn-io/bpmn-js/pull/2301))

## 18.6.0

* `FEAT`: support searching through arrays in popup menu ([bpmn-io/diagram-js#970](https://github.com/bpmn-io/diagram-js/pull/970))
* `FEAT`: prioritize `search` over `description` when matching popup menu entries ([bpmn-io/diagram-js#963](https://github.com/bpmn-io/diagram-js/pull/963))
* `FEAT`: sort `search` terms across all keys ([bpmn-io/diagram-js#963](https://github.com/bpmn-io/diagram-js/pull/963))
* `FIX`: always select first search entry ([bpmn-io/diagram-js#967](https://github.com/bpmn-io/diagram-js/pull/967))
* `DEPS`: update to `diagram-js@15.3.0`

## 18.5.0

* `FEAT`: allow text annotations for message flows ([#2281](https://github.com/bpmn-io/bpmn-js/issues/2281))

## 18.4.0

* `FEAT`: render collapsed event subprocess icons ([#50](https://github.com/bpmn-io/bpmn-js/issues/50))

## 18.3.2

* `FIX`: remove default start event for ad-hoc subprocess ([#2295](https://github.com/bpmn-io/bpmn-js/issues/2295))
* `FIX`: show modeling feedback error for data objects ([#2290](https://github.com/bpmn-io/bpmn-js/pull/2290))

## 18.3.1

* `FIX`: move artifacts when a participant is resized by space tool ([#2285](https://github.com/bpmn-io/bpmn-js/pull/2285))

## 18.3.0

* `FEAT`: allow to replace between variants of typed events ([#2282](https://github.com/bpmn-io/bpmn-js/pull/2282))

## 18.2.0

* `FEAT`: add ad-hoc subprocess option to replace menu ([#2276](https://github.com/bpmn-io/bpmn-js/pull/2276))

## 18.1.2

* `FIX`: canvas `autoFocus` must explicitly be enabled ([bpmn-io/diagram-js#956](https://github.com/bpmn-io/diagram-js/pull/956))
* `FIX`: properly integrate `zoomscroll` with canvas focus ([bpmn-io/diagram-js#956](https://github.com/bpmn-io/diagram-js/pull/956))
* `FIX`: properly integrate `movecanvas` with canvas focus ([bpmn-io/diagram-js#956](https://github.com/bpmn-io/diagram-js/pull/956))

## 18.1.1

* `FIX`: adjust search to prioritize start of word and exact matches ([bpmn-io/diagram-js#953](https://github.com/bpmn-io/diagram-js/pull/953))
* `FIX`: ignore whitespace when searching ([bpmn-io/diagram-js#954](https://github.com/bpmn-io/diagram-js/pull/954))

## 18.1.0

* `FIX`: clear selection when opening search pad ([bpmn-io/diagram-js#947](https://github.com/bpmn-io/diagram-js/pull/947))
* `FIX`: correct dangling selection after search pad interaction ([bpmn-io/diagram-js#947](https://github.com/bpmn-io/diagram-js/pull/947))
* `DEPS`: update to `diagram-js@15.2.2`

## 18.0.0

* `FEAT`: remove `outline` from `Viewer` modules ([#2135](https://github.com/bpmn-io/bpmn-js/issues/2135))
* `FEAT`: make `Canvas` a focusable element ([bpmn-io/diagram-js#662](https://github.com/bpmn-io/diagram-js/pull/662))
* `FEAT`: implicit keyboard binding ([bpmn-io/diagram-js#662](https://github.com/bpmn-io/diagram-js/pull/662))
* `FEAT`: integrate with global `search` ([#2235](https://github.com/bpmn-io/bpmn-js/pull/2235))
* `FEAT`: integrate `popup-menu` with `search` ([bpmn-io/diagram-js#932](https://github.com/bpmn-io/diagram-js/pull/932))
* `FEAT`: recognize modern `search` tokens in `search-pad` ([bpmn-io/diagram-js#932](https://github.com/bpmn-io/diagram-js/pull/932))
* `FIX`: correctly handle duplicate entries and whitespace in `search` ([bpmn-io/diagram-js#932](https://github.com/bpmn-io/diagram-js/pull/932))
* `FIX`: find `search` terms across all keys ([bpmn-io/diagram-js#932](https://github.com/bpmn-io/diagram-js/pull/932))
* `FIX`: `search` always returns tokens for matched items ([bpmn-io/diagram-js#932](https://github.com/bpmn-io/diagram-js/pull/932))
* `FIX`: prevent crash during label adjustment ([#2239](https://github.com/bpmn-io/bpmn-js/issues/2239))
* `FIX`: keep existing loop characteristics when toggling through the replace menu ([#2251](https://github.com/bpmn-io/bpmn-js/pull/2251))
* `FIX`: prevent covering multi selection with black box in `Viewer` ([#2135](https://github.com/bpmn-io/bpmn-js/issues/2135))
* `FIX`: generate types for main entry ([`986e2bb`](https://github.com/bpmn-io/bpmn-js/commit/986e2bb51ea301e6e0df56f3606a27424fb90179))
* `FIX`: correct handling of group name with whitespace only ([#2231](https://github.com/bpmn-io/bpmn-js/issues/2231))
* `DEPS`: update to `bpmn-moddle@9` ([#2114](https://github.com/bpmn-io/bpmn-js/pull/2114))
* `DEPS`: update to `diagram-js@15.1.0`
* `DEPS`: update to `diagram-js-direct-editing@3.2.0`

### Breaking Changes

* Require `Node >= 20`
* `Canvas` is now a focusable element and provides better support for native browser behaviors. Focus can be controlled with new `focus` and `restoreFocus` APIs ([bpmn-io/diagram-js#662](https://github.com/bpmn-io/diagram-js/pull/662)).
* Keyboard is now implicitly bound to canvas SVG element. Calls to `keyboard.bind` and `keyboard.bindTo` now result with a descriptive console error and have no effect ([bpmn-io/diagram-js#662](https://github.com/bpmn-io/diagram-js/pull/662)).
* Selection outline is no longer included in the viewer. If needed, add it as an additional module ([#2253](https://github.com/bpmn-io/bpmn-js/pull/2253)).

## 17.11.1

* `FIX`: handle searching elements without labels ([#2232](https://github.com/bpmn-io/bpmn-js/issues/2232), [#2234](https://github.com/bpmn-io/bpmn-js/pull/2234))

## 17.11.0

* `FEAT`: align search styles with other popups ([#2187](https://github.com/bpmn-io/bpmn-js/pull/2187))
* `FEAT`: prioritize start of tokens in search results ([#2187](https://github.com/bpmn-io/bpmn-js/pull/2187))
* `FIX`: do not commit viewport changes on `ESC` ([#2189](https://github.com/bpmn-io/bpmn-js/issues/2189), [#2187](https://github.com/bpmn-io/bpmn-js/pull/2187))
* `DEPS`: update to `diagram-js@14.10.0`

## 17.10.0

* `CHORE`: correct various type hints ([#2228](https://github.com/bpmn-io/bpmn-js/issues/2228))
* `FIX`: pasting compensation activity without boundary event ([#2070](https://github.com/bpmn-io/bpmn-js/issues/2070))
* `FIX`: lane resize constraints for se and nw direction ([#2209](https://github.com/bpmn-io/bpmn-js/issues/2209))
* `FIX`: auto place elements vertically in sub-processes ([#2127](https://github.com/bpmn-io/bpmn-js/issues/2127))
* `FIX`: hide lane label during direct editing
* `DEPS`: update to `diagram-js@14.9.0`

## 17.9.2

* `FIX`: keep direction when collapsing pools ([#2208](https://github.com/bpmn-io/bpmn-js/issues/2208))

## 17.9.1

* `FIX`: show delete action for labels ([#2163](https://github.com/bpmn-io/bpmn-js/issues/2163))

## 17.9.0

* `FIX`: remove incorrect attribute in replace menu ([#2196](https://github.com/bpmn-io/bpmn-js/pull/2196))
* `DEPS`: update to diagram-js@14.7.2

## 17.8.3

* `FIX`: add accessible label to drill down button ([#2194](https://github.com/bpmn-io/bpmn-js/pull/2194))

## 17.8.2

* `FIX`: do not suggest root elements in search ([#2143](https://github.com/bpmn-io/bpmn-js/issues/2143))

## 17.8.1

* `FIX`: gracefully handle missing process DI in drilldown ([#2180](https://github.com/bpmn-io/bpmn-js/pull/2180))
* `FIX`: do not cause HTML validation errors on move preview ([#2179](https://github.com/bpmn-io/bpmn-js/issues/2179))
* `DEPS`: update to `diagram-js@14.7.1`

## 17.8.0

* `FEAT`: keep global elements when deleting last participant ([#2175](https://github.com/bpmn-io/bpmn-js/pull/2175))
* `FIX`: allow undo after deleting last participants and data store ([#1676](https://github.com/bpmn-io/bpmn-js/issues/1676))
* `FIX`: allow styling markers with `canvas.addMarker` and css ([#2173](https://github.com/bpmn-io/bpmn-js/pull/2173))
* `CHORE`: render flow markers as part of `djs-visual` ([#2173](https://github.com/bpmn-io/bpmn-js/pull/2173))
* `DEPS`: update to `diagram-js@14.7.0`

## 17.7.1

* `FIX`: correct call activity outline ([#2167](https://github.com/bpmn-io/bpmn-js/issues/2167))
* `FIX`: gracefully handle missing `BPMNDiagram#plane` ([#2172](https://github.com/bpmn-io/bpmn-js/pull/2172), [#2171](https://github.com/bpmn-io/bpmn-js/pull/2171))

## 17.7.0

* `DEPS`: update to `diagram-js@14.6.0`

## 17.6.4

* `DEPS`: update to `diagram-js@14.5.4`

## 17.6.3

* `DEPS`: update to `diagram-js@14.5.3`

## 17.6.2

* `DEPS`: update to `diagram-js@14.5.2` ([#2158](https://github.com/bpmn-io/bpmn-js/pull/2158))

## 17.6.1

* `DEPS`: update to `diagram-js@14.5.1` ([#2157](https://github.com/bpmn-io/bpmn-js/pull/2157))

## 17.6.0

* `FEAT`: add ability to type services and events ([#2121](https://github.com/bpmn-io/bpmn-js/issues/2121), [#2153](https://github.com/bpmn-io/bpmn-js/pull/2153))
* `FIX`: remove preview on context pad close ([#2150](https://github.com/bpmn-io/bpmn-js/issues/2150))
* `FIX`: use tagged template in error logging ([#2151](https://github.com/bpmn-io/bpmn-js/pull/2151))

## 17.5.0

* `FEAT`: remove direct editing outline for embedded labels ([#2147](https://github.com/bpmn-io/bpmn-js/pull/2147))
* `FEAT`: do not translate technical errors ([#2145](https://github.com/bpmn-io/bpmn-js/pull/2145))
* `DEPS`: update to `diagram-js-direct-editing@3.0.1`

## 17.4.0

* `FEAT`: do not scale popup menu and context pad
* `DEPS`: update to `diagram-js@14.4.1`

## 17.3.0

* `FEAT`: auto-place elements vertically ([#2110](https://github.com/bpmn-io/bpmn-js/issues/2110))

## 17.2.2

* `FIX`: correct navigated viewer outline ([#2133](https://github.com/bpmn-io/bpmn-js/issues/2133))

## 17.2.1

* `FIX`: render popup menu on top
* `DEPS`: update to `diagram-js@14.3.1`

## 17.2.0

* `FEAT`: make popup menu keyboard navigatable
* `FIX`: address various accessibility issues
* `FIX`: correct various typing issues
* `DEPS`: update to `diagram-js@14.3.0`
* `DEPS`: update to `diagram-js-direct-editing@2.1.2`

## 17.1.0

* `FEAT`: handle splitting vertical lanes ([#2101](https://github.com/bpmn-io/bpmn-js/pull/2101))

## 17.0.2

* `FIX`: create hit boxes for vertical lanes ([#2093](https://github.com/bpmn-io/bpmn-js/issues/2093))

## 17.0.1

* `FIX`: fix rendering of gateway without marker ([#2102](https://github.com/bpmn-io/bpmn-js/pull/2102))

## 17.0.0

* `FEAT`: add to selection through SHIFT ([bpmn-io/diagram-js#796](https://github.com/bpmn-io/diagram-js/pull/851), [#2053](https://github.com/bpmn-io/bpmn-js/issues/2053))
* `CHORE`: remove broken touch interaction ([bpmn-io/diagram-js#796](https://github.com/bpmn-io/diagram-js/issues/796))
* `DEPS`: update to `diagram-js@14.0.0`

### Breaking Changes

* Migrated to `diagram-js@14` which removes touch interaction module, and dependency on unsupported `hammerjs` package. If you rely on touch interaction, you need to support touch interaction on your own.

## 16.5.0

* `FEAT`: handle adding vertical lanes ([#2086](https://github.com/bpmn-io/bpmn-js/issues/2086))
* `FIX`: don't fill multiple parallel events ([#2085](https://github.com/bpmn-io/bpmn-js/issues/2085))

## 16.4.0

* `FEAT`: handle resizing of vertical lanes ([#2062](https://github.com/bpmn-io/bpmn-js/issues/2062))
* `FEAT`: allow text annotations to overlap with the borders of subprocesses and pools ([#2049](https://github.com/bpmn-io/bpmn-js/issues/2049))
* `FEAT`: support modeling of gateway without marker ([#2063](https://github.com/bpmn-io/bpmn-js/issues/2063))
* `FIX`: correctly remove vertical lanes ([#2081](https://github.com/bpmn-io/bpmn-js/pull/2081))
* `FIX`: do not set label on planes ([#2033](https://github.com/bpmn-io/bpmn-js/issues/2033))

## 16.3.2

* `FIX`: support core replace in compensation behavior ([#2073](https://github.com/bpmn-io/bpmn-js/issues/2073))

## 16.3.1

* `FIX`: do not remove connection that is being created when pasting compensation boundary event and handler ([#2069](https://github.com/bpmn-io/bpmn-js/pull/2069))

## 16.3.0

* `FEAT`: improve handling of compensation association ([#2038](https://github.com/bpmn-io/bpmn-js/issues/2038))

## 16.2.0

* `DEPS`: update to `bpmn-moddle@8.1.0`

## 16.1.0

* `DEPS`: update to `diagram-js@13.4.0`
* `DEPS`: update to `diagram-js-direct-editing@2.1.1`
* `DEPS`: drop unused `object-refs` dependency

## 16.0.0

* `FEAT`: render vertical pools and lanes ([#2024](https://github.com/bpmn-io/bpmn-js/pull/2024))
* `FEAT`: sentence case titles and labels ([#2023](https://github.com/bpmn-io/bpmn-js/issues/2023))
* `FIX`: ensure all error translations are collected ([#2040](https://github.com/bpmn-io/bpmn-js/pull/2040))
* `DEPS` update to diagram-js@13.0.0

### Breaking Changes

* Major updates to [diagram-js@13](https://github.com/bpmn-io/diagram-js/blob/develop/CHANGELOG.md#1300) and [didi@10](https://github.com/nikku/didi/blob/main/CHANGELOG.md#1000). Make sure to check out the linked changelog updates.
* Multiple translation labels has been updated to sentence case. If you rely on the old casing, you need to update your translations.

## 15.2.2

* `FIX`: use correct types in BpmnRenderUtil ([#2036](https://github.com/bpmn-io/bpmn-js/pull/2036))

## 15.2.1

* `DEPS`: update to `diagram-js@13.8.1`

## 15.2.0

* `FEAT`: remove selection outline from connections ([diagram-js#826](https://github.com/bpmn-io/diagram-js/pull/826))
* `FEAT`: position context pad according to last waypoint for connections ([diagram-js#826](https://github.com/bpmn-io/diagram-js/pull/826))
* `FIX`: prevent access of non-existing connection bounds ([diagram-js#824](https://github.com/bpmn-io/diagram-js/pull/824))
* `FIX`: correct selection outline size for end event ([#2026](https://github.com/bpmn-io/bpmn-js/pull/2026))
* `DEPS`: update to `diagram-js@13.8.0`

## 15.1.3

* `FIX`: revert `djs-dragging` CSS class changes ([#2016](https://github.com/bpmn-io/bpmn-js/pull/2016))
* `FIX`: clear context pad hover timeout on close ([#2016](https://github.com/bpmn-io/bpmn-js/pull/2016))
* `DEPS`: update to `diagram-js@12.7.2`

## 15.1.2

* `FIX`: revert selection outline removal for connections ([#2011](https://github.com/bpmn-io/bpmn-js/pull/2011))
* `DEPS`: update to `diagram-js@12.7.1`

## 15.1.1

* `FIX`: adjust selection outline to external label ([#2001](https://github.com/bpmn-io/bpmn-js/issues/2001))

## 15.1.0

* `FEAT`: add toggle for non-interrupting events ([#2000](https://github.com/bpmn-io/bpmn-js/pull/2000))
* `FEAT`: keep events non-interrupting when using `bpmnReplace` by default ([#2000](https://github.com/bpmn-io/bpmn-js/pull/2000))
* `DEPS`: update to `diagram-js@12.7.0`

## 15.0.0

* `FEAT`: align selection outline with element's shape ([#1996](https://github.com/bpmn-io/bpmn-js/issues/1996))
* `FEAT`: preview append on hover ([#1985](https://github.com/bpmn-io/bpmn-js/pull/1985))
* `FEAT`: allow overriding `fill`, `stroke`, `width` and `height` when rendering elements ([#1985](https://github.com/bpmn-io/bpmn-js/pull/1985))
* `FIX`: renderer only renders actual flow elements ([#1985](https://github.com/bpmn-io/bpmn-js/pull/1985))
* `DEPS`: update to `diagram-js@12.6.0`

### Breaking Changes

* `BpmnRenderer` only renders actual flow elements (e.g. `bpmn:IntermediateCatchEvent` but not `bpmn:MessageEventDefinition`)

## 14.2.0

* `FEAT`: make spacetool local per default ([bpmn-io/diagram-js#811](https://github.com/bpmn-io/diagram-js/pull/811), [#1975](https://github.com/bpmn-io/bpmn-js/issues/1975))
* `FEAT`: add complex preview feature ([bpmn-io/diagram-js#807](https://github.com/bpmn-io/diagram-js/pull/807))
* `CHORE`: mark connection as dragging when moving bendpoint ([bpmn-io/diagram-js#807](https://github.com/bpmn-io/diagram-js/pull/807))
* `DEPS`: update to `diagram-js@12.5.0`

## 14.1.3

* `CHORE`: correctly output tag in [#1982](https://github.com/bpmn-io/bpmn-js/pull/1982)

## 14.1.2

* `CHORE`: fix POST_RELEASE job in [#1980](https://github.com/bpmn-io/bpmn-js/pull/1980)

## 14.1.1

* `FIX`: asset path by [__@nikku__](https://github.com/nikku) in [#1977](https://github.com/bpmn-io/bpmn-js/pull/1977)

## 14.1.0

* `FEAT`: ensure lanes aren't resized when using space tool in [#1972](https://github.com/bpmn-io/bpmn-js/pull/1972)
* `DOCS`: update translations for v14.0.0 by [__@bpmn-io-bot__](https://github.com/bpmn-io-bot) in [#1948](https://github.com/bpmn-io/bpmn-js/pull/1948)

## 14.0.0

* `FEAT`: do not hide overlays on canvas move per default ([diagram-js#798](https://github.com/bpmn-io/diagram-js/issues/798))
* `FEAT`: translate _Append TextAnnotation_ context pad action ([#1932](https://github.com/bpmn-io/bpmn-js/pull/1932))
* `FIX`: allow to create connection + event-based gateway ([#1490](https://github.com/bpmn-io/bpmn-js/issues/1490))
* `FIX`: make breadcrumb styling more robust ([#1945](https://github.com/bpmn-io/bpmn-js/pull/1945))
* `FIX`: correct copy of default sequence flow elements ([#1935](https://github.com/bpmn-io/bpmn-js/issues/1935))
* `CHORE`: extract `modeling-feedback` into dedicated module ([#1940](https://github.com/bpmn-io/bpmn-js/pull/1940))
* `CHORE`: drop deprecated callback support from public API
* `CHORE`: drop deprecated `import.parse.complete` event member `context`
* `DEPS`: update to `diagram-js@12.3.0`
* `DEPS`: update to `bpmn-moddle@8.0.1`
* `DEPS`: update to `ids@1.0.3`

### Breaking Changes

* Deprecated callback style API removed. Migrate to promise-based APIs, released with `v7.0.0`.
* Deprecated `import.parse.complete` event member `context` removed. Access the same information via the event itself, as released with `v7.0.0`.

## 13.2.2

* `FIX`: do not vertically resize empty pools using the space tool ([#1769](https://github.com/bpmn-io/bpmn-js/issues/1769))

## 13.2.1

* `FIX`: improve regular expression ([#1927](https://github.com/bpmn-io/bpmn-js/pull/1927))
* `FIX`: show non-interrupting event version in replace menu ([#1924](https://github.com/bpmn-io/bpmn-js/pull/1924))

## 13.2.0

* `CHORE`: provide align and distribute context pad and popup menu icons as html ([#1920](https://github.com/bpmn-io/bpmn-js/pull/1920))
* `DEPS`: update to `diagram-js@12.2.0`

## 13.1.0

* `FEAT`: allow event rendering without icons ([#1917](https://github.com/bpmn-io/bpmn-js/pull/1917))

## 13.0.9

* `CHORE`: update translations infra

## 13.0.8

_Republish of v13.0.7._

## 13.0.7

_Republish of v13.0.6._

## 13.0.6

* `DOCS`: update translations

## 13.0.5

* `DEPS`: update to `diagram-js@12.1.0`

## 13.0.4

* `DEPS`: bump to `diagram-js@12.0.2`

## 13.0.3

* `FIX`: update label on `modeling.updateModdleProperties` ([#1872](https://github.com/bpmn-io/bpmn-js/issues/1872))

## 13.0.2

* `FIX`: export types as `type` ([#1897](https://github.com/bpmn-io/bpmn-js/pull/1897))
* `DEPS`: bump to `diagram-js@12.0.1`

## 13.0.1

* `FIX`: correct some type definitions ([#1896](https://github.com/bpmn-io/bpmn-js/pull/1896))

## 13.0.0

* `FEAT`: rework and complete type definitions ([#1886](https://github.com/bpmn-io/bpmn-js/pull/1886))
* `DEPS`: update to `diagram-js@12.0.0`

## 12.1.1

* `DEPS`: update to `diagram-js@11.13.0`

## 12.1.0

* `FIX`: correct `Viewer#saveXML` type definition ([#1885](https://github.com/bpmn-io/bpmn-js/pull/1885))
* `FIX`: correct `Viewer` constructor type definition ([#1882](https://github.com/bpmn-io/bpmn-js/issues/1882))

## 12.0.0

* `FEAT`: move `create-append-anything` to [external module](https://github.com/bpmn-io/bpmn-js-create-append-anything) ([#1873](https://github.com/bpmn-io/bpmn-js/pull/1873), [#1862](https://github.com/bpmn-io/bpmn-js/issues/1862))
* `CHORE`: use `diagram-js@11.11.0` built-in selection after replace feature ([#1857](https://github.com/bpmn-io/bpmn-js/pull/1857))
* `DEPS`: update to `diagram-js@11.12.0`

### Breaking Changes

* The create/append anything features moved to an [external module](https://github.com/bpmn-io/bpmn-js-create-append-anything). Include it to restore the `v11` create/append behavior.

## 11.5.0

* `FEAT`: add root elements to definitions when provided via `modeling#update(Moddle)Properties`

## 11.4.1

* `FIX`: correct redo triggering on international keyboard layouts ([#1842](https://github.com/bpmn-io/bpmn-js/issues/1842))

## 11.4.0

* `FEAT`: translate append menu entry labels and groups ([#1810](https://github.com/bpmn-io/bpmn-js/pull/1810))
* `FEAT`: activate direct editing on participant creation ([#1845](https://github.com/bpmn-io/bpmn-js/pull/1845))
* `FIX`: dragging append menu entries creates element connection ([#1843](https://github.com/bpmn-io/bpmn-js/pull/1843))
* `FIX`: append shortcut triggers create menu if append not allowed ([#1840](https://github.com/bpmn-io/bpmn-js/issues/1840))
* `FIX`: restore marker rendering workaround ([`9c6e475`](https://github.com/bpmn-io/bpmn-js/commit/9c6e475681dd6b6a418b2fbc1dac19a9df360953))

## 11.3.1

_Republish of `v11.3.0`._

## 11.3.0

* `FEAT`: feature `service` and `user` tasks more prominently in replace menu ([#1836](https://github.com/bpmn-io/bpmn-js/pull/1836))
* `FEAT`: hide rare items initially from create/append menus ([#1836](https://github.com/bpmn-io/bpmn-js/pull/1836))
* `FEAT`: retrieve instantiation modules with context ([#1835](https://github.com/bpmn-io/bpmn-js/pull/1835))
* `DEPS`: update to `diagram-js@11.9.0`

## 11.2.0

_Adds create/append anything._

* `FEAT`: append menu available via context pad ([#1802](https://github.com/bpmn-io/bpmn-js/pull/1802), [#1809](https://github.com/bpmn-io/bpmn-js/pull/1809), [#1815](https://github.com/bpmn-io/bpmn-js/pull/1815), [#1818](https://github.com/bpmn-io/bpmn-js/pull/1818), [#1831](https://github.com/bpmn-io/bpmn-js/pull/1831))
* `FEAT`: create menu available via palette ([#1811](https://github.com/bpmn-io/bpmn-js/pull/1811), [#1809](https://github.com/bpmn-io/bpmn-js/pull/1809), [#1817](https://github.com/bpmn-io/bpmn-js/pull/1817))
* `FEAT`: simplify connection-multi icon ([#1822](https://github.com/bpmn-io/bpmn-js/pull/1822))
* `FEAT`: join paths `round` by default ([1827](https://github.com/bpmn-io/bpmn-js/pull/1827))
* `FEAT`: improved BPMN symbol rendering ([#1830](https://github.com/bpmn-io/bpmn-js/pull/1830))
* `FEAT`: round connection corners ([#1828](https://github.com/bpmn-io/bpmn-js/pull/1828))
* `FEAT`: improve visibility of popup menu ([#1812](https://github.com/bpmn-io/bpmn-js/issues/1812))
* `FIX`: missing special attributes in `bpmnElementFactory` ([#1807](https://github.com/bpmn-io/bpmn-js/pull/1807))
* `FIX`: handle `bpmn:DataObjectReference` without data object in replace menu ([#1823](https://github.com/bpmn-io/bpmn-js/pull/1823))
* `DEPS`: update to `diagram-js@11.8.0`

## 11.1.1

* `FIX`: correct popup menu display in fullscreen ([#1795](https://github.com/bpmn-io/bpmn-js/issues/1795))
* `DEPS`: update to `diagram-js@11.4.3`

## 11.1.0

* `FEAT`: add replace element keyboard binding ([#1785](https://github.com/bpmn-io/bpmn-js/pull/1785))
* `FEAT`: add `replaceElement` editor action ([#1785](https://github.com/bpmn-io/bpmn-js/pull/1785))
* `DEPS`: update to `diagram-js@11.4.1`

## 11.0.5

* `DEPS`: update to `diagram-js@11.3.0`

## 11.0.4

* `DEPS`: update to `diagram-js@11.2.0`

## 11.0.3

_Re-release of `v11.0.2`._

## 11.0.2

* `FIX`: correct test for replace options ([#1787](https://github.com/bpmn-io/bpmn-js/pull/1787))

## 11.0.1

* `DEPS`: update to `diagram-js@11.1.1`

## 11.0.0

_Reworks popup menu UI._

* `FEAT`: integrate new popup menu UI ([#1776](https://github.com/bpmn-io/bpmn-js/pull/1776))
* `DEPS`: update to `diagram-js@11.1.0` ([#1776](https://github.com/bpmn-io/bpmn-js/pull/1776))

### Breaking Changes

* New popup menu UI introduced with `diagram-js@11`. See [`diagram-js` breaking changes and migration guide](https://github.com/bpmn-io/diagram-js/blob/develop/CHANGELOG.md#breaking-changes).
* Keyboard-related features no longer use `KeyboardEvent#keyCode`. Use a polyfill (e.g. [keyboardevent-key-polyfill](https://www.npmjs.com/package/keyboardevent-key-polyfill)) if you need to support old browsers.

## 10.3.0

* `FEAT`: add BPMN specific space tool ([#1344](https://github.com/bpmn-io/bpmn-js/pull/1344))
* `FIX`: do not resize `bpmn:TextAnnotation` when using space tool ([#1344](https://github.com/bpmn-io/bpmn-js/pull/1344))
* `FIX`: correct attachers left hanging when using space tool ([#1344](https://github.com/bpmn-io/bpmn-js/pull/1344))
* `FIX`: stick labels to label targets when using space tool ([#1344](https://github.com/bpmn-io/bpmn-js/pull/1344), [#1302](https://github.com/bpmn-io/bpmn-js/issues/1302))
* `DEPS`: update to `diagram-js@10`

## 10.2.1

* `FIX`: correct preserving of outgoing connections on event-based gateway morph ([#1738](https://github.com/bpmn-io/bpmn-js/issues/1738))

## 10.2.0

* `DEPS`: update to `bpmn-moddle@8`

## 10.1.0

* `DEPS`: update to `diagram-js@9.1.0`

## 10.0.0

_Updates the library target to ES2018._

* `FEAT`: use ES2018 syntax ([#1737](https://github.com/bpmn-io/bpmn-js/pull/1737))

### Breaking Changes

* Migrated to ES2018 syntax. [Read the blog post with details and a migration guide](https://bpmn.io/blog/posts/2022-migration-to-es2018.html).

## 9.4.1

* `FIX`: ignore elements which cannot be colored ([#1734](https://github.com/bpmn-io/bpmn-js/pull/1734))

## 9.4.0

* `FEAT`: allow clipboard to be serialized ([#1707](https://github.com/bpmn-io/bpmn-js/pull/1707))
* `FEAT`: allow cloning of elements ([#1707](https://github.com/bpmn-io/bpmn-js/pull/1707))
* `FEAT`: copy groups in a safe manner ([#1707](https://github.com/bpmn-io/bpmn-js/pull/1707))
* `FIX`: make clipboard contents immutable ([#1707](https://github.com/bpmn-io/bpmn-js/pull/1707))
* `FIX`: do not alter inputs passed to `ElementFactory#create` ([#1711](https://github.com/bpmn-io/bpmn-js/pull/1711))
* `FIX`: prevent bogus meta-data to be attached on paste ([#1707](https://github.com/bpmn-io/bpmn-js/pull/1707))
* `FIX`: only claim existing IDs ([#1707](https://github.com/bpmn-io/bpmn-js/pull/1707))
* `FIX`: prevent double paste on label creation ([#1707](https://github.com/bpmn-io/bpmn-js/pull/1707))
* `FIX`: move labels when collapsing sub-process ([#1695](https://github.com/bpmn-io/bpmn-js/issues/1695))
* `FIX`: assign default size when expanding element ([#1687](https://github.com/bpmn-io/bpmn-js/issues/1687))
* `FIX`: render sequence flows always on top ([#1716](https://github.com/bpmn-io/bpmn-js/issues/1716))
* `DEPS`: update to `diagram-js@8.9.0`
* `DEPS`: update to `bpmn-moddle@7.1.3`

## 9.3.2

* `FIX`: prevent unnecessary scrollbar ([#1692](https://github.com/bpmn-io/bpmn-js/issues/1692))
* `FIX`: check for replacement using actual target ([#1699](https://github.com/bpmn-io/bpmn-js/pull/1699))
* `DEPS`: update to `diagram-js@8.7.1`

## 9.3.1

* `FIX`: properly size icons for distribute/align menu ([#1694](https://github.com/bpmn-io/bpmn-js/pull/1694))

## 9.3.0

* `FEAT`: add aligment and distribution menu ([#1680](https://github.com/bpmn-io/bpmn-js/issues/1680), [#1691](https://github.com/bpmn-io/bpmn-js/issues/1691))
* `DEPS`: update to `diagram-js@8.7.0`

## 9.2.2

* `FIX`: correctly toggle loop characteristics ([#1673](https://github.com/bpmn-io/bpmn-js/issues/1673))

## 9.2.1

* `FIX`: cancel direct editing before shape deletion ([#1677](https://github.com/bpmn-io/bpmn-js/issues/1677))

## 9.2.0

* `FEAT`: rework select and hover interaction on the diagram ([#1616](https://github.com/bpmn-io/bpmn-js/issues/1616), [#640](https://github.com/bpmn-io/diagram-js/pull/640), [#643](https://github.com/bpmn-io/diagram-js/pull/643))
* `FEAT`: rework diagram interaction handles ([#640](https://github.com/bpmn-io/diagram-js/pull/640))
* `FEAT`: clearly distinguish select and hover states ([#1616](https://github.com/bpmn-io/bpmn-js/issues/1616))
* `FEAT`: allow text annotation on sequence flows ([#1652](https://github.com/bpmn-io/bpmn-js/pull/1652))
* `FEAT`: add multi-element context pad ([#1525](https://github.com/bpmn-io/bpmn-js/pull/1525))
* `FEAT`: change default color to off black ([#1656](https://github.com/bpmn-io/bpmn-js/pull/1656))
* `FEAT`: select connection after connect ([#644](https://github.com/bpmn-io/diagram-js/pull/644))
* `FIX`: copy elements with `string` extension properties ([#1518](https://github.com/bpmn-io/bpmn-js/issues/1518))
* `FIX`: cancel direct editing before shape deletion ([#1664](https://github.com/bpmn-io/bpmn-js/issues/1664))
* `FIX`: remove connection on source connection deletion ([#1663](https://github.com/bpmn-io/bpmn-js/issues/1663))
* `FIX`: set correct label color when batch coloring elements ([#1653](https://github.com/bpmn-io/bpmn-js/issues/1653))
* `FIX`: always reconnect labels and associations ([#1659](https://github.com/bpmn-io/bpmn-js/pull/1659))
* `FIX`: correct connection drop highlighting
* `DEPS`: replace `inherits` with `inherits-browser`
* `DEPS`: bump to `diagram-js@8.5.0`

## 9.1.0

* `FEAT`: allow to select participant and subprocess via click on body ([#1646](https://github.com/bpmn-io/bpmn-js/pull/1646))
* `FIX`: comply with strict style-src CSP ([#1625](https://github.com/bpmn-io/bpmn-js/issues/1625))
* `FIX`: complete direct editing when selection changes ([#1648](https://github.com/bpmn-io/bpmn-js/pull/1648))
* `DEPS`: update to `diagram-js@8.3.0`
* `DEPS`: update to `min-dom@3.2.0`

## 9.0.4

* `FIX`: remove `label` property on empty label ([#1637](https://github.com/bpmn-io/bpmn-js/issues/1637))
* `FIX`: create drilldown overlays on `viewer.open` ([`574a67438`](https://github.com/bpmn-io/bpmn-js/commit/574a674381d6449b509396b6d17c4ca94674ea1c))
* `FIX`: render data association inside collapsed sub-processes ([#1619](https://github.com/bpmn-io/bpmn-js/issues/1619))
* `FIX`: preserve multi-instance properties when toggling between parallel and sequential ([#1581](https://github.com/bpmn-io/bpmn-js/issues/1581))
* `FIX`: correct hanging sequence flow label after collapsing sub-process ([#1617](https://github.com/bpmn-io/bpmn-js/issues/1617))
* `FIX`: correct start event not added to newly created sub-process ([#1631](https://github.com/bpmn-io/bpmn-js/issues/1631))

## 9.0.3

* `FIX`: submit direct editing result on drilldown ([#1609](https://github.com/bpmn-io/bpmn-js/issues/1609))
* `DEPS`: bump to `diagram-js@8.2.0` ([2bac149](https://github.com/bpmn-io/bpmn-js/commit/2bac1495058601fec203c134b41efe5600e5fc97))

## 9.0.2

* `FIX`: support modeling of groups in collapsed subporcesses ([#1606](https://github.com/bpmn-io/bpmn-js/issues/1606))
* `FIX`: override default padding of breadcrumb element ([#1608](https://github.com/bpmn-io/bpmn-js/pull/1608))

## 9.0.1

* `FIX`: use ES5 everywhere ([#1605](https://github.com/bpmn-io/bpmn-js/pull/1605))
* `FIX`: support DIs without associated business object ([#1605](https://github.com/bpmn-io/bpmn-js/pull/1605))
* `DEPS`: bump to `diagram-js@8.1.2` ([bdf9cf3](https://github.com/bpmn-io/bpmn-js/commit/bdf9cf3e752254a4c8172031d8a493955a9fca9c))

## 9.0.0

* `FEAT`: support drilldown and modeling of collapsed subprocesses ([#1443](https://github.com/bpmn-io/bpmn-js/issues/1443))
* `FEAT`: update embedded label bounds when shape is moved ([#1586](https://github.com/bpmn-io/bpmn-js/pull/1586))
* `FIX`: create di for embedded labels ([#1579](https://github.com/bpmn-io/bpmn-js/pull/1579))
* `CHORE`: expose `BpmnRenderer` extension points ([#1585](https://github.com/bpmn-io/bpmn-js/pull/1585))
* `DEPS`: bump to `diagram-js@8.1.1`

### Breaking Changes

* Reworked the link of elements to bpmn DIs. You must access the `di` directly from the diagram element instead of the `businessObject` [#1472](https://github.com/bpmn-io/bpmn-js/issues/1472).
* Reworked `viewer.open` behavior for single planes ([#1576](https://github.com/bpmn-io/bpmn-js/pull/1576)).
* Reworked import and `BpmnFactory` APIs [#1472](https://github.com/bpmn-io/bpmn-js/issues/1472).
* Added `bpmn-js.css`, which is required to display drilldown overlays correctly.

## 8.10.0

* `CHORE`: provide `ModelUtil#isAny` utility ([#1604](https://github.com/bpmn-io/bpmn-js/pull/1604))
* `CHORE`: provide `ModelUtil#getDi` utility ([#1604](https://github.com/bpmn-io/bpmn-js/pull/1604))

## 8.9.1

* `FIX`: re-use process for redo of first participant ([#1439](https://github.com/bpmn-io/bpmn-js/issues/1439))
* `FIX`: ensure IDs are claimed when used ([#1555](https://github.com/bpmn-io/bpmn-js/issues/1555))
* `FIX`: prevent morphing data stores outside participants ([#1508](https://github.com/bpmn-io/bpmn-js/issues/1508))

## 8.9.0

* `FEAT`: select newly created sub-process ([`6214772b`](https://github.com/bpmn-io/bpmn-js/commit/6214772b8519cb82f61c4867b16c112bc6344922))
* `FEAT`: select newly created group for immediate resizing ([`56eb34cc`](https://github.com/bpmn-io/bpmn-js/commit/56eb34cc826ca0dc8ee788575a504d5fda301292))
* `FEAT`: simplify color scheme
* `FIX`: set label color on `bpmndi:BPMNLabel#color` ([#1543](https://github.com/bpmn-io/bpmn-js/pull/1543))
* `FIX`: don't create illegal `bpmndi:BPMNEdge#waypoints` property ([#1544](https://github.com/bpmn-io/bpmn-js/issues/1544))
* `FIX`: correct direct editing on touch devices
* `DEPS`: update to `diagram-js@7.8.2`

## 8.8.3

* `FIX`: correct resize handles hidden behind element ([#1520](https://github.com/bpmn-io/bpmn-js/issues/1520))
* `FIX`: handle close to source or target drop on flow ([#1541](https://github.com/bpmn-io/bpmn-js/issues/1541))
* `CHORE`: bump to `diagram-js@7.6.3`

## 8.8.2

* `FIX`: properly re-use ID of a copied element if available ([#1503](https://github.com/bpmn-io/bpmn-js/pull/1509))

## 8.8.1

* `FIX`: re-use ID of a copied element if available ([#1503](https://github.com/bpmn-io/bpmn-js/pull/1503))
* `CHORE`: unbuild circular dependency with `ResizeUtil` ([#1500](https://github.com/bpmn-io/bpmn-js/pull/1500))

## 8.8.0

* `FEAT`: give `keyboard` fine-grained control over which events to handle ([#1493](https://github.com/bpmn-io/bpmn-js/issues/1493))
* `FIX`: correct keyboard shortcuts not working in direct editing mode ([#1493](https://github.com/bpmn-io/bpmn-js/issues/1493))
* `DEPS`: update to `diagram-js@7.15`

## 8.7.3

* `FIX`: convert file to `ES6` module ([#1478](https://github.com/bpmn-io/bpmn-js/pull/1478))

## 8.7.2

* `CHORE`: improve error recovery in ordering provider
* `DEPS`: update build dependencies

## 8.7.1

* `FIX`: allow connecting `bpmn:MessageFlow` to `bpmn:CallActivity` ([#1467](https://github.com/bpmn-io/bpmn-js/issues/1467))
* `DEPS`: update to `bpmn-moddle@7.1.2`

## 8.7.0

* `FEAT`: support BPMN in Color ([#1453](https://github.com/bpmn-io/bpmn-js/pull/1453))
* `DEPS`: update to `bpmn-moddle@7.1.1`

## 8.6.2

* `DEPS`: update diagram-js-direct-editing to v1.6.3

## 8.6.1

* `FIX`: serialize `bpmn:DataStoreReference` correctly in case if first participant is an empty pool ([#1456](https://github.com/bpmn-io/bpmn-js/issues/1456))

## 8.6.0

* `FEAT`: support Promise in `inject` test helper ([#1450](https://github.com/bpmn-io/bpmn-js/pull/1450))
* `DEPS`: update to `hosted-git@2.8.9` ([#1447](https://github.com/bpmn-io/bpmn-js/pull/1447))

## 8.5.0

* `FEAT`: reconnect message flows when participant is collapsed ([#1432](https://github.com/bpmn-io/bpmn-js/pull/1432))
* `FEAT`: replace elements on create ([#1340](https://github.com/bpmn-io/bpmn-js/issues/1340))
* `FEAT`: show message name on message flow ([#777](https://github.com/bpmn-io/bpmn-js/issues/777))
* `FEAT`: ensure auto-placed elements are visible
* `FIX`: fix reversed connection preview ([#1431](https://github.com/bpmn-io/bpmn-js/issues/1431))
* `FIX`: copy root element references on replace ([#1430](https://github.com/bpmn-io/bpmn-js/issues/1431))
* `DEPS`: update to `diagram-js@7.3.0`

## 8.4.0

* `FIX`: disallow inserting multiple elements on a sequence flow ([#1440](https://github.com/bpmn-io/bpmn-js/issues/1440))

## 8.3.1

* `FIX`: correctly serialize `xml` attributes on `Any` elements
* `DEPS`: update bump to `bpmn-moddle@7.0.5`

## 8.3.0

* `FEAT`: enable connection tool for text annotations ([#1428](https://github.com/bpmn-io/bpmn-js/pull/1428))

## 8.2.2

* `FIX`: always emit `saveXML.done`
* `FIX`: correct path intersections not being detected in certain cases
* `CHORE`: bump to `diagram-js@7.2.3`

## 8.2.1

* `FIX`: prevent bendpoint hover error ([#1387](https://github.com/bpmn-io/bpmn-js/issues/1387))

## 8.2.0

* `FIX`: correct label colors on connect / hover ([#1380](https://github.com/bpmn-io/bpmn-js/issues/1380))
* `FIX`: correct new parent indicator when leaving lane ([#1413](https://github.com/bpmn-io/bpmn-js/issues/1413))
* `CHORE`: update to `diagram-js@7.2.0`

## 8.1.0

* `TEST`: simplify markup created by built-in test helpers

## 8.0.1

* `FIX`: activate, not toggle global connect tool on palette click
* `FIX`: only allow cancel boundary events on transactions
* `CHORE`: add `npm start` script for demo purposes

## 8.0.0

* `FEAT`: improve replace label for collapsed pools ([`8faee2bd`](https://github.com/bpmn-io/bpmn-js/commit/8faee2bde9a74b75b4b6bb9b003507652e75c9c5))
* `FEAT`: allow participant multiplicity marker to be toggled ([#533](https://github.com/bpmn-io/bpmn-js/issues/533))
* `FEAT`: support soft breaks / discretionary hyphens in labels ([#1383](https://github.com/bpmn-io/bpmn-js/issues/1383))
* `FEAT`: improve tool activation via keyboard shortcuts or editor actions
* `FEAT`: allow components to react to auxiliary mouse button interactions
* `FEAT`: move canvas on auxiliary button mouse down
* `CHORE`: bump to `diagram-js@7`

### Breaking Changes

* Auxiliary mouse button events will now be passed as `element.*` mouse events to components. You must filter your event listeners to prevent reactions to these events ([`1063f7c1`](https://github.com/bpmn-io/diagram-js/commit/1063f7c18474096d3d7c9e400ce82a1bf762a157)).

## 7.5.0

* `FEAT`: update translatable strings ([#1364](https://github.com/bpmn-io/bpmn-js/pull/1364))
* `FEAT`: add collection marker to DataObjectReference ([#381](https://github.com/bpmn-io/bpmn-js/issues/381))
* `FEAT`: provide generic command for updating moddle properties ([#1376](https://github.com/bpmn-io/bpmn-js/pull/1376))
* `FEAT`: add switch between DataStoreReference and DataObjectReference in replace menu ([#1372](https://github.com/bpmn-io/bpmn-js/issues/1372))
* `FIX`: align collection and parallel instance markers style ([#1371](https://github.com/bpmn-io/bpmn-js/issues/1371))

## 7.4.2

* `FIX`: correctly emit out `element.event` after drop-on-flow ([#1366](https://github.com/bpmn-io/bpmn-js/issues/1366))

## 7.4.1

* `FIX`: correct keyboard zoom in key on international keyboard shortcuts ([#1362](https://github.com/bpmn-io/bpmn-js/issues/1362))

## 7.4.0

* `CHORE`: bump to `diagram-js@6.8.0`
* `CHORE`: migrate to `travis-ci.com`

## 7.3.1

* `CHORE`: bump to `diagram-js@6.7.1`

## 7.3.0

* `FEAT`: disallow typed start events inside non-event based sub processes ([#831](https://github.com/bpmn-io/bpmn-js/issues/831))
* `CHORE`: bump to `diagram-js@6.7.0`

## 7.2.1

* `FIX`: disallow boundary events as message flow targets ([#1300](https://github.com/bpmn-io/bpmn-js/issues/1300))

## 7.2.0

_Republish of `v7.1.0`._

## 7.1.0

* `FEAT`: allow annotating groups ([#1327](https://github.com/bpmn-io/bpmn-js/issues/1327))

## 7.0.1

* `FIX`: roundtrip default `xml` namespace ([#1319](https://github.com/bpmn-io/bpmn-js/issues/1319))
* `CHORE`: bump to `bpmn-moddle@7.0.3`

## 7.0.0

* `FEAT`: make import and export APIs awaitable ([#812](https://github.com/bpmn-io/bpmn-js/issues/812))
* `FEAT`: update watermark ([#1281](https://github.com/bpmn-io/bpmn-js/pull/1281))
* `CHORE`: deprecated `import.parse.complete` context payload ([`157aec6e`](https://github.com/bpmn-io/bpmn-js/commit/157aec6e))
* `CHORE`: clarify license terms ([`bc98a637`](https://github.com/bpmn-io/bpmn-js/commit/bc98a63712f6ac5c66d39f59bf93e296e59ad1e0))
* `CHORE`: bump to `bpmn-moddle@7.0.1`

### Breaking Changes

* The toolkit now requires the ES6 `Promise` to be present. To support IE11 you must polyfill it.

## 6.5.1

* `FIX`: correct namespaces being removed on diagram export ([#1310](https://github.com/bpmn-io/bpmn-js/issues/1310))
* `CHORE`: bump to `bpmn-moddle@6.0.6`

## 6.5.0

* `FEAT`: prefer straight layout for sub-process connections ([#1309](https://github.com/bpmn-io/bpmn-js/pull/1309))
* `FEAT`: move common auto-place feature to diagram-js, add BPMN-specific auto-place feature ([#1284](https://github.com/bpmn-io/bpmn-js/pull/1284))
* `CHORE`: make bpmn-font a development dependency ([`63045bdf`](https://github.com/bpmn-io/bpmn-js/commit/63045bdfa87b9f1989a2a7a509facbeb4616acda))
* `CHORE`: bump to `diagram-js@6.6.1`

## 6.4.2

* `CHORE`: bump to `bpmn-moddle@6.0.5`

## 6.4.1

* `FIX`: parse `>` in attribute names and body tag
* `CHORE`: bump to `bpmn-moddle@6.0.4`

## 6.4.0

* `FEAT`: serialize link events with an empty name ([#1296](https://github.com/bpmn-io/bpmn-js/issues/1296))

## 6.3.5

* `FIX`: correct accidental resizing of label target ([#1294](https://github.com/bpmn-io/bpmn-js/issues/1294))

## 6.3.4

* `FIX`: export BPMNDI in correct order ([#985](https://github.com/bpmn-io/bpmn-js/issues/985))

## 6.3.3

* `FIX`: resize empty text annotations
* `CHORE`: bump `min-dom` version
* `CHORE`: bump to `diagram-js@6.4.1`

## 6.3.2

* `FIX`: correctly move flows when adding lane ([#1287](https://github.com/bpmn-io/bpmn-js/pull/1287))
* `FIX`: restore semantic IDs for non flow nodes ([#1285](https://github.com/bpmn-io/bpmn-js/issues/1285))

## 6.3.1

* `FIX`: prevent editor crash in some strict execution environments ([#1283](https://github.com/bpmn-io/bpmn-js/pull/1283))

## 6.3.0

* `FEAT`: generate more generic IDs for new elements ([`035bb0c1`](https://github.com/bpmn-io/bpmn-js/commit/035bb0c1fd01adbaab8a340cb1075aa57736540d))
* `FEAT`: copy referenced root elements (message, signal, ...) ([`dc5a566e`](https://github.com/bpmn-io/bpmn-js/commit/dc5a566e107bc156505a40de3331b3832afc4b8d))
* `FEAT`: ensure minimum size when resizing elements with space tool ([`7ee304f4`](https://github.com/bpmn-io/bpmn-js/commit/7ee304f424d1c9db46633523165d25ca1fabba1b))
* `FIX`: correct interaction events inside `bpmn:Group` elements ([#1278](https://github.com/bpmn-io/bpmn-js/issues/1278))
* `FIX`: correct copy and paste of collapsed sub-processes ([#1270](https://github.com/bpmn-io/bpmn-js/issues/1270))
* `FIX`: correct various space tool related issues ([#1019](https://github.com/bpmn-io/bpmn-js/issues/1019), [#878](https://github.com/bpmn-io/bpmn-js/issues/878))
* `CHORE`: rework space tool
* `CHORE`: update to `diagram-js@6.4.0`

## 6.2.1

* `FIX`: correct serialization of `DataAssociation#assignment`
* `CHORE`: update to `bpmn-moddle@6.0.2`

## 6.2.0

* `FIX`: keep non-duplicate outgoing connection when dropping on flows ([#1263](https://github.com/bpmn-io/bpmn-js/issues/1263))
* `FIX`: properly reconnect message flows when collapsing participant
* `CHORE`: update to `diagram-js@6.3.0`
* `CHORE`: update to `bpmn-moddle@6.0.1`

## 6.1.2

* `FIX`: translate _Append ReceiveTask_
* `FIX`: allow associations where data associations are allowed, too ([`4a675b37`](https://github.com/bpmn-io/bpmn-js/commit/4a675b378027532db413186ea292daeac087285b))
* `FIX`: correct origin snapping on multi-element create ([`27fec8bd`](https://github.com/bpmn-io/bpmn-js/commit/27fec8bdf1c6236e7ca09b5721b74b1b45b45d39))
* `CHORE`: update to `diagram-js@6.2.2`

## 6.1.1

_Republish of `v6.1.0`._

## 6.1.0

* `FEAT`: copy signals, escalations and errors ([#1245](https://github.com/bpmn-io/bpmn-js/pull/1245))
* `FEAT`: provide base viewer / modeler distributions ([`bb94b206`](https://github.com/bpmn-io/bpmn-js/commit/bb94b206a7c9ab3b80e283d6513600a9591c437d))
* `FEAT`: add horizontal and vertical resize handles
* `FEAT`: improve connection cropping (bump to `path-intersection@2`)
* `FIX`: correctly mark elements as changed on `{shape|connection}.create` undo
* `FIX`: do not open replace menu after multi create ([#1255](https://github.com/bpmn-io/bpmn-js/pull/1255))
* `CHORE`: update to `diagram-js@6.2.0`

## 6.0.7

* `FIX`: disable waypoints-cropping after pasting connections ([`9f8a724e`](https://github.com/bpmn-io/bpmn-js/commit/9f8a724e9a3ff66bfce14e06ab38066189111a95))

## 6.0.6

* `FIX`: create nested lanes in the correct parent again ([#1256](https://github.com/bpmn-io/bpmn-js/issues/1256), [#1253](https://github.com/bpmn-io/bpmn-js/issues/1253), [#1254](https://github.com/bpmn-io/bpmn-js/issues/1254))

## 6.0.5

* `FIX`: only update `Lane#flownNodeRefs` once during paste ([`4455c3fc`](https://github.com/bpmn-io/bpmn-js/commit/4455c3fc35290e51220566fb6539a1efc4d3612f))
* `FIX`: do not adjust labels on paste ([`b2b607f5`](https://github.com/bpmn-io/bpmn-js/commit/b2b607f5582d3409c789d831a0896aaa55949899))
* `FIX`: do not snap connection waypoints on paste ([`d769e6dd`](https://github.com/bpmn-io/bpmn-js/commit/d769e6ddb0cb2dc8befb2e7b31682925089ba8f1))

## 6.0.4

* `FIX`: correctly fix hover on cleanup ([#1247](https://github.com/bpmn-io/bpmn-js/pull/1247))

## 6.0.3

* `FIX`: render colored BPMN groups ([#1246](https://github.com/bpmn-io/bpmn-js/pull/1246))
* `CHORE`: bump to `diagram-js@6.0.2`

## 6.0.2

* `CHORE`: bump `diagram-js-direct-editing` dependency

## 6.0.1

* `CHORE`: bump to `diagram-js@6.0.1`

## 6.0.0

* `FEAT`: rework (re-)connecting of shapes ([#427](https://github.com/bpmn-io/bpmn-js/pull/1230))

### Breaking Changes

Connecting and re-connecting shapes got reworked via [#427](https://github.com/bpmn-io/bpmn-js/pull/1230):

* The rules `connection.reconnectStart` and `connection.reconnectEnd` got replaced with `connection.reconnect` rule
* `BpmnLayouter#layoutConnection` waypoints can be specified via hint

## 5.1.2

* `FIX`: account for label pasting in label behavior ([#1227](https://github.com/bpmn-io/bpmn-js/issues/1227))

## 5.1.1

* `FIX`: re-select only existing elements when dragging is finished ([#1225](https://github.com/bpmn-io/bpmn-js/issues/1225))
* `FIX`: correctly hide nested children of a collapsed shape
* `CHORE`: bump to [`diagram-js@5.1.1`](https://github.com/bpmn-io/diagram-js/blob/develop/CHANGELOG.md#511)

## 5.1.0

* `FEAT`: adjust label position post creation ([`41c6af18`](https://github.com/bpmn-io/bpmn-js/commit/41c6af183014626a0f84e0bda0f8e39018f9151e))
* `FEAT`: copy and paste boundary events ([`2e27d743`](https://github.com/bpmn-io/bpmn-js/commit/2e27d7430642439e30806941d0df43018ca729eb))
* `FIX`: ordering after moving boundary events between hosts ([#1207](https://github.com/bpmn-io/bpmn-js/issues/1207))
* `FIX`: do not remove sequence flow condition on type change ([`b2900786`](https://github.com/bpmn-io/bpmn-js/commit/b290078600ae4e45e7c72bd37919732e3f8fcbea))
* `FIX`: do not remove default sequence flow on type change ([`37bcd070`](https://github.com/bpmn-io/bpmn-js/commit/37bcd070e8406a43a7316893c6b68debeaae5e26))
* `FIX`: do not duplicate flow node references ([`168a1493`](https://github.com/bpmn-io/bpmn-js/commit/168a1493b26c3059d2440a70f7aa5991745b51e5))
* `FIX`: ignore labels that are being created in adaptive label positioning ([`44cceb5d`](https://github.com/bpmn-io/bpmn-js/commit/44cceb5da287a0ad01d9389f475284c88eda7f7b))

## 5.0.5

* `FIX`: snap connections to task mid ([`86c61b0`](https://github.com/bpmn-io/bpmn-js/commit/86c61b0c0d6dcf776adda94b6d72b621644c2abe))
* `FIX`: snap connections to sub process mid ([`83e9f05`](https://github.com/bpmn-io/bpmn-js/commit/83e9f05efab6fbe57100e11d0443291a561bdfe4))
* `FIX`: complete direct editing when auto place starts ([`dcf440b`](https://github.com/bpmn-io/bpmn-js/commit/dcf440b07684339bdb52ba97cd1c83f9eb234044))
* `FIX`: do not clear diagram if no diagram to clear ([#1181](https://github.com/bpmn-io/bpmn-js/issues/1181))
* `FIX`: copy boundary events attachments ([#1190](https://github.com/bpmn-io/bpmn-js/issues/1190))
* `FIX`: do not copy generic properties ([`a74d83`](https://github.com/bpmn-io/bpmn-js/commit/a74d838dc78aceddf88e07231cf85a4cf9e0dd95))

## 5.0.4

* `FIX`: correct sequence flow layout after drop on flow ([#1178](https://github.com/bpmn-io/bpmn-js/issues/1178))

## 5.0.3

_Republish of `v5.0.2`._

## 5.0.2

* `FIX`: allow reconnecting to loops ([#1121](https://github.com/bpmn-io/bpmn-js/issues/1121))
* `CHORE`: bump to `diagram-js@5.0.1`

## 5.0.1

* `FIX`: import boundary event associations ([#1170](https://github.com/bpmn-io/bpmn-js/issues/1170))

## 5.0.0

* `FEAT`: add two-step copy and paste ([#1137](https://github.com/bpmn-io/bpmn-js/pull/1137))
* `FEAT` add `elements.create` rule for creating multiple elements ([#1137](https://github.com/bpmn-io/bpmn-js/pull/1137))
* `FEAT`: make containers draggable via their borders / labels only ([#1097](https://github.com/bpmn-io/bpmn-js/pull/1097), [#957](https://github.com/bpmn-io/bpmn-js/issues/957))
* `FEAT`: allow copied elements to be filtered ([#888](https://github.com/bpmn-io/bpmn-js/issues/888))
* `FIX`: prevent accidental dragging of participants and sub-processes ([#1097](https://github.com/bpmn-io/bpmn-js/pull/1097), [#957](https://github.com/bpmn-io/bpmn-js/issues/957))
* `FIX`: keep labels during pool extraction ([#921](https://github.com/bpmn-io/bpmn-js/issues/921))
* `FIX`: duplicate `bpmn:CategoryValue` when copying groups ([#1055](https://github.com/bpmn-io/bpmn-js/issues/1055))
* `FIX`: translate group creation entry in palette ([#1146](https://github.com/bpmn-io/bpmn-js/issues/1146))
* `CHORE`: use `element.copyProperty` event to copy category value when copying group ([`12bedca5`](https://github.com/bpmn-io/bpmn-js/pull/1137/commits/12bedca5ba2a05791591e53f554dc2310f6c1a6f))
* `CHORE`: bump to `diagram-js@5`

### Breaking Changes

Copy and paste as well as create is completely reworked:

* `CopyPaste`: remove `ModelCloneHelper` in favor of `ModdleCopy` service, remove `property.clone` event, add `moddleCopy.canCopyProperties`, `moddleCopy.canCopyProperty` and `moddleCopy.canSetCopiedProperty` event
* `BpmnRules`: removed `elements.paste` rule in favor of `elements.create` rule
* `BpmnRules`: removed `element.paste` rule
* `ElementFactory`: use `attrs.di` property instead of `attrs.colors` for fill and stroke when creating element through `ElementFactory#createBpmnElement`
* To prevent additional behavior on create after paste you should check for the `createElementsBehavior` hint, cf. [`bf180321`](https://github.com/bpmn-io/bpmn-js/commit/bf180321a3a40428c3f87b639b87cc3fc578066e#diff-2f0de25761fb7459e88071f83fd845c5R22)

## 4.0.4

* `FIX`: creating `bpmn:Participant` on single `bpmn:Group` throwing error ([#1133](https://github.com/bpmn-io/bpmn-js/issues/1133))
* `CHORE`: bump to `diagram-js@4.0.3`

## 4.0.3

* `FIX`: prevent dropping on labels and `bpmn:Group` elements ([#1131](https://github.com/bpmn-io/bpmn-js/pull/1131))

## 4.0.2

* `FIX`: correct element positioning update ([#1129](https://github.com/bpmn-io/bpmn-js/issues/1129))
* `CHORE`: bump to `diagram-js@4.0.2`

## 4.0.1

* `FIX`: prevent adding lane from crashing IE ([#746](https://github.com/bpmn-io/bpmn-js/issues/746))
* `FIX`: correct inverse space tool visuals ([#1105](https://github.com/bpmn-io/bpmn-js/issues/1105))
* `CHORE`: update `diagram-js-direct-editing` to prevent install warning
* `CHORE`: update to `diagram-js@4.0.1`

## 4.0.0

* `FEAT`: add top, right, bottom, left snapping with container elements ([#1108](https://github.com/bpmn-io/bpmn-js/pull/1108))
* `FEAT`: add grid snapping ([#987](https://github.com/bpmn-io/bpmn-js/pull/987))
* `FEAT`: allow modeling of groups ([#343](https://github.com/bpmn-io/bpmn-js/issues/343))
* `FEAT`: improve modeling rules behind event-based gateways ([#1006](https://github.com/bpmn-io/bpmn-js/pull/1006))
* `FEAT`: adjust default collapsed pool to standard height ([`5affe2570`](https://github.com/bpmn-io/bpmn-js/commit/5affe25705082937beace6b4a568f176a0527baf))
* `FEAT`: add connection previews ([#743](https://github.com/bpmn-io/bpmn-js/issues/743))
* `FEAT`: create expanded sub-process with start event included ([#1039](https://github.com/bpmn-io/bpmn-js/pull/1039))
* `FEAT`: improve automatic label adjustment for boundary events ([#1064](https://github.com/bpmn-io/bpmn-js/pull/1064))
* `FEAT`: improve creation of initial participant ([#1046](https://github.com/bpmn-io/bpmn-js/pull/1046))
* `FEAT`: improve boundary to host loop layout ([#1070](https://github.com/bpmn-io/bpmn-js/pull/1070))
* `FEAT`: make connection segment move the primary connection drag behavior
* `FEAT`: allow label and group movement everywhere ([#1080](https://github.com/bpmn-io/bpmn-js/pull/1080))
* `FEAT`: improve message flow to participant connection in the presence of lanes ([#950](https://github.com/bpmn-io/bpmn-js/issues/950))
* `FEAT`: allow detaching of boundary and attaching of intermediate events ([#1045](https://github.com/bpmn-io/bpmn-js/issues/1045))
* `FEAT`: simplify requested palette and context pad translations ([#1027](https://github.com/bpmn-io/bpmn-js/pull/1027))
* `FEAT`: simplify participant dragging in the presence of nested lanes ([`fdb299dc`](https://github.com/bpmn-io/bpmn-js/commit/fdb299dc888a7dcdb3f7674b6ed2a857864df457))
* `FEAT`: correctly render all kinds of multiple events ([#1091](https://github.com/bpmn-io/bpmn-js/pull/1091))
* `CHORE`: validate BPMN 2.0 XML ids as QNames ([`92c03679a`](https://github.com/bpmn-io/bpmn-js/commit/92c03679a4fd3c92a1c5ce3c97f7d366e2a5753a))
* `FIX`: correctly handle flow reconnection + type replacement ([#896](https://github.com/bpmn-io/bpmn-js/issues/896), [#1008](https://github.com/bpmn-io/bpmn-js/issues/1008))

### Breaking Changes

* `CHORE`: bump to [`diagram-js@4.0.0`](https://github.com/bpmn-io/diagram-js/blob/main/CHANGELOG.md#400)

## 3.5.0

* `FEAT`: restore `Viewer#importDefinitions` and make it public API ([#1112](https://github.com/bpmn-io/bpmn-js/pull/1112))

## 3.4.3

* `FIX`: prevent HTML injection in search ([diagram-js#362](https://github.com/bpmn-io/diagram-js/pull/362))

## 2.5.4

* `FIX`: prevent HTML injection in search ([diagram-js#362](https://github.com/bpmn-io/diagram-js/pull/362))
* `CHORE`: bump to `diagram-js@2.6.2`

## 3.4.2

* `FIX`: do not evaluate pasted text as HTML ([#1073](https://github.com/bpmn-io/bpmn-js/issues/1073))

## 2.5.3

* `FIX`: do not evaluate pasted text as HTML ([#1073](https://github.com/bpmn-io/bpmn-js/issues/1073))

## 3.4.1

_Republish of `v3.4.0` without `.git` folder._

## 3.4.0

* `FIX`: properly render colored connection markers ([#981](https://github.com/bpmn-io/bpmn-js/issues/981))
* `FEAT`: add ability to open different DI diagrams ([#87](https://github.com/bpmn-io/bpmn-js/issues/87))
* `FIX`: correctly layout straight boundary to target connections ([#891](https://github.com/bpmn-io/bpmn-js/issues/891))
* `FEAT`: resize participant to standard size on collapse ([#975](https://github.com/bpmn-io/bpmn-js/pull/975))
* `FEAT`: consistently layout connection on reconnect start and end ([#971](https://github.com/bpmn-io/bpmn-js/pull/971))
* `FEAT`: layout connection on element removal ([#989](https://github.com/bpmn-io/bpmn-js/issues/989))
* `FIX`: properly crop sequence flow ends on undo/redo ([#940](https://github.com/bpmn-io/bpmn-js/issues/940))
* `CHORE`: bump to [`diagram-js@3.3.0`](https://github.com/bpmn-io/diagram-js/blob/main/CHANGELOG.md#330)

## 3.3.1

* `FIX`: ignore unchanged direct editing completion
* `CHORE`: update to `diagram-js-direct-editing@1.4.2`

## 3.3.0

* `FEAT`: display `DataInput` / `DataOutput` labels ([`89719de3b`](https://github.com/bpmn-io/bpmn-js/commit/89719de3be50d9270227fd04216f7f19f0d018a2))
* `FEAT`: support basic `DataInput` / `DataOutput` move ([#962](https://github.com/bpmn-io/bpmn-js/pull/962))
* `FIX`: properly handle `DataInput` / `DataOutput` move ([#961](https://github.com/bpmn-io/bpmn-js/issues/961))

## 3.2.3

* `FIX`: update to `diagram-js-direct-editing@1.4.1` to trim trailing/leading whitespace in task names ([#763](https://github.com/bpmn-io/bpmn-js/issues/763))

## 3.2.2

* `FIX`: gracefully handle missing waypoints ([`45486f2`](https://github.com/bpmn-io/bpmn-js/commit/45486f2afe7f42fcac31be9ca477a7c94babe7d8))

## 3.2.1

* `FIX`: bump to `diagram-js@3.1.3` / `tiny-svg@2.2.1` to work around MS Edge bug ([`ed798a15`](https://github.com/bpmn-io/bpmn-js/commit/ed798a152539a613dbc9de9d61231ebbfb50987a))

## 3.2.0

* `FEAT`: set isHorizontal=true for new and updated participant/lane DIs ([#934](https://github.com/bpmn-io/bpmn-js/issues/934))

## 3.1.1

* `CHORE`: update to `diagram-js@3.1.1`

## 3.1.0

* `CHORE`: update to `diagram-js@3.1`

## 3.0.4

* `FIX`: render labels always on top ([#920](https://github.com/bpmn-io/bpmn-js/pull/920))

## 3.0.3

* `FIX`: do not join incoming/outgoing flows other than sequence flows on element deletion ([#917](https://github.com/bpmn-io/bpmn-js/issues/917))

## 3.0.2

* `FIX`: correct IE 11 delete keybinding ([#904](https://github.com/bpmn-io/bpmn-js/issues/904))

## 3.0.1

* `FIX`: restore copy-paste behavior

## 3.0.0

* `FEAT`: improve context pad tooltip titles for `EventBasedGateway` ([`350a5ab`](https://github.com/bpmn-io/bpmn-js/commit/350a5ab75ed675991599faff9615e4bbe184d491))
* `FEAT`: display group names ([#844](https://github.com/bpmn-io/bpmn-js/issues/844))
* `FEAT`: add ability to move selection with keyboard arrows ([#376](https://github.com/bpmn-io/bpmn-js/issues/376))
* `FEAT`: support `SHIFT` modifier to move elements / canvas with keyboard arrows at accelerated speed
* `FEAT`: require `Ctrl/Cmd` to be pressed as a modifier key to move the canvas via keyboard errors
* `FEAT`: auto-expand elements when children resize ([#786](https://github.com/bpmn-io/bpmn-js/issues/786))
* `CHORE`: bind editor actions and keyboard shortcuts for explicitly added features only ([#887](https://github.com/bpmn-io/bpmn-js/pull/887))
* `CHORE`: update to [`diagram-js@3.0.0`](https://github.com/bpmn-io/diagram-js/blob/main/CHANGELOG.md#300)
* `FIX`: disallow attaching of `BoundaryEvent` to a `ReceiveTask` following an `EventBasedGateway` ([#874](https://github.com/bpmn-io/bpmn-js/issues/874))
* `FIX`: fix date in license ([#882](https://github.com/bpmn-io/bpmn-js/pull/882))

### Breaking Changes

* `BpmnGlobalConnect` provider got removed. Use `connection.start` rule to customize whether connection should allowed to be started ([#565](https://github.com/bpmn-io/bpmn-js/issues/565), [#870](https://github.com/bpmn-io/bpmn-js/issues/870))
* `EditorActions` / `Keyboard` do not pull in features implicitly anymore. If you roll your own editor, include features you would like to ship with manually to provide the respective actions / keyboard bindings ([`645265ad`](https://github.com/bpmn-io/bpmn-js/commit/645265ad7e4a47e80657c671068a027752d7504f))
* Moving the canvas with keyboard arrows now requires the `Ctrl/Cmd` modifiers to be pressed.

## 2.5.2

* `FIX`: correct horizontal embedded label padding

## 2.5.1

* `FIX`: prevent error to be thrown on lane move ([#855](https://github.com/bpmn-io/bpmn-js/issues/855))

## 2.5.0

* `FEAT`: snap message flows to `bpmn:Event` center during connect ([#850](https://github.com/bpmn-io/bpmn-js/issues/850))
* `CHORE`: bump to `diagram-js@2.6.0`
* `FIX`: allow label movement over message flow ([#849](https://github.com/bpmn-io/bpmn-js/issues/849))

## 2.4.1

* `FIX`: make viewer IE 9 compatible
* `FIX`: prevent duplicate connections after drop on flow ([#774](https://github.com/bpmn-io/bpmn-js/issues/774))
* `FIX`: fix rules not preventing redundant loop ([#836](https://github.com/bpmn-io/bpmn-js/issues/836))

## 2.4.0

* `FEAT`: improve layouting of boundary event to host loops ([#467](https://github.com/bpmn-io/bpmn-js/issues/467))
* `FEAT`: allow circular activity to activity loops ([#824](https://github.com/bpmn-io/bpmn-js/issues/824))
* `FEAT`: create label on appropriate free position ([#825](https://github.com/bpmn-io/bpmn-js/issues/825))
* `CHORE`: bump to `diagram-js@2.5.0`
* `FIX`: repair label position not being adapted on host move

## 2.3.1

* `FIX`: revert to `Arial` as the default rendering font ([#819](https://github.com/bpmn-io/bpmn-js/issues/819))
* `FIX`: keep event definitions when switching from interrupting to non-interrupting boundary event ([#799](https://github.com/bpmn-io/bpmn-js/issues/799))

## 2.3.0

* `CHORE`: update to `diagram-js@2.4.0`

## 2.2.1

* `FIX`: correct updating of multiple data stores ([`300e7010`](https://github.com/bpmn-io/bpmn-js/commit/300e7010c4e1862394d147988dc4c4bcc09b07bc))

## 2.2.0

* `FEAT`: emit export events ([#813](https://github.com/bpmn-io/bpmn-js/issues/813))
* `FEAT`: unset businessObject name if empty ([`6c081d85`](https://github.com/bpmn-io/bpmn-js/commit/6c081d854fa8a4e87eb7cdd1744be37c78652667))
* `FEAT`: resize text annotation on text change ([`100f3fb2`](https://github.com/bpmn-io/bpmn-js/commit/100f3fb2ee6373cd4b7ad0b76e520a1afb70887e))
* `FIX`: apply data store behavior in collaboration only ([`5cc28d5d`](https://github.com/bpmn-io/bpmn-js/commit/5cc28d5d5571287a798b189aed75095f1fd0189e))
* `FIX`: create/update labels when updating element name via `Modeling#updateProperties` ([`4a0f6da8`](https://github.com/bpmn-io/bpmn-js/commit/4a0f6da814c45268e8a324e73a53479bd2435bbe))

## 2.1.0

* `FEAT`: support specifying `lineHeight` for text rendering ([#256](https://github.com/bpmn-io/diagram-js/pull/256))
* `FEAT`: `bpmn:LaneSet` elements get an ID assigned on creation
* `FEAT`: external labels can be deleted, clearing the elements name ([#791](https://github.com/bpmn-io/bpmn-js/pull/791))
* `FEAT`: add ability to override default element colors ([#713](https://github.com/bpmn-io/bpmn-js/issues/713))
* `FEAT`: add ability to override font family and size of rendered labels ([`4bb270f1`](https://github.com/bpmn-io/bpmn-js/commit/4bb270f19279db40f9cc3c179e09ee3a9a114e7c))

## 2.0.1

_Republish of `v2.0.0` due to registry error._

## 2.0.0

* `FEAT`: allow data store to be modeled between participants ([#483](https://github.com/bpmn-io/bpmn-js/issues/483))
* `CHORE`: update to [`diagram-js@2.0.0`](https://github.com/bpmn-io/diagram-js/blob/main/CHANGELOG.md#200)
* `FIX`: correctly handle missing `bpmndi:Label` bounds during model updating ([#794](https://github.com/bpmn-io/bpmn-js/issues/794))

### Breaking Changes

* The `PopupMenu` API got rewritten, cf. [`b1852e1d`](https://github.com/bpmn-io/diagram-js/pull/254/commits/b1852e1d71f67bd36ae1eb02748d2d0cbf124625)

## 1.3.3

* `CHORE`: update to [`bpmn-moddle@5.1.5`](https://github.com/bpmn-io/bpmn-moddle/blob/main/CHANGELOG.md#515)

## 1.3.2

* `FIX`: correctly serialize extension attributes on `bpmn:Expression`

## 1.3.1

* `FIX`: correctly auto-place from boundary events attached to host edges ([#788](https://github.com/bpmn-io/bpmn-js/issues/788))

## 1.3.0

* `FEAT`: expose additional `BpmnTreeWalker` APIs for advanced import use-cases
* `CHORE`: bump diagram-js and object-refs version

## 1.2.1

* `FIX`: correct side-effects config to not include `*.css` files

## 1.2.0

* `FEAT`: add initial snapping when creating associations
* `CHORE`: update to `diagram-js@1.3.0`
* `FIX`: allow message flows between collapsed pools
* `FIX`: complete direct editing on popup menu use
* `FIX`: focus label editing box on element creation

## 1.1.1

* `FIX`: escape `data-element-id` in CSS selectors

## 1.1.0

* `FEAT`: show gateway icon on context pad without marker ([`15dfab6b`](https://github.com/bpmn-io/bpmn-js/commit/15dfab6b5b12dd184acf070f2ab3ad205d1b245c))

## 1.0.4

* `FIX`: properly wire `$parent` on copy + paste
* `FIX`: improve boundary event rendering to correct SVG to image conversion

## 1.0.3

* `FIX`: re-expose `TestHelper#bootstrapBpmnJS` util

## 1.0.2

* `FIX`: correct library default export

## 1.0.1

_Republished 1.0.0 with CHANGELOG entries._

## 1.0.0

* `CHORE`: convert code base to ES modules
* `CHORE`: update utility toolbelt

### Breaking Changes

* You must now configure a module transpiler such as Babel or Webpack to handle ES module imports and exports.

## 0.31.0

* `FEAT`: encode entities in body properties during XML export
* `CHORE`: bump to [`bpmn-moddle@4.0.0`](https://github.com/bpmn-io/bpmn-moddle/releases/tag/v4.0.0)
* `CHORE`: bump utility version

## 0.30.0

* `CHORE`: bump to [`diagram-js@0.31.0`](https://github.com/bpmn-io/diagram-js/releases/tag/v0.31.0)

## ...

Check `git log` for earlier history.


================================================
FILE: LICENSE
================================================
Copyright (c) 2014-present Camunda Services GmbH

Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in the
Software without restriction, including without limitation the rights to use, copy,
modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
and to permit persons to whom the Software is furnished to do so, subject to the
following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

The source code responsible for displaying the bpmn.io project watermark that
links back to https://bpmn.io as part of rendered diagrams MUST NOT be
removed or changed. When this software is being used in a website or application,
the watermark must stay fully visible and not visually overlapped by other elements.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
OR OTHER DEALINGS IN THE SOFTWARE.


================================================
FILE: README.md
================================================
# bpmn-js - BPMN 2.0 for the web

[![Build Status](https://github.com/bpmn-io/bpmn-js/workflows/CI/badge.svg)](https://github.com/bpmn-io/bpmn-js/actions?query=workflow%3ACI)

View and edit BPMN 2.0 diagrams in the browser.

[![bpmn-js screencast](./resources/screencast.gif "bpmn-js in action")](http://demo.bpmn.io/s/start)

## Installation

Use the library [pre-packaged](https://github.com/bpmn-io/bpmn-js-examples/tree/main/pre-packaged)
or include it [via npm](https://github.com/bpmn-io/bpmn-js-examples/tree/main/bundling)
into your node-style web-application.

## Usage

To get started, create a [bpmn-js](https://github.com/bpmn-io/bpmn-js) instance
and render [BPMN 2.0 diagrams](https://www.omg.org/spec/BPMN/2.0.2/) in the browser:

```javascript
const xml = '...'; // my BPMN 2.0 xml
const viewer = new BpmnJS({
  container: 'body'
});

try {
  const { warnings } = await viewer.importXML(xml);

  console.log('rendered');
} catch (err) {
  console.log('error rendering', err);
}
```

Checkout our [examples](https://github.com/bpmn-io/bpmn-js-examples) for many
more supported usage scenarios.

## Resources

* [Demo](http://demo.bpmn.io)
* [Issues](https://github.com/bpmn-io/bpmn-js/issues)
* [Examples](https://github.com/bpmn-io/bpmn-js-examples)
* [Forum](https://forum.bpmn.io)
* [Changelog](./CHANGELOG.md)

## Build and Run

Prepare the project by installing all dependencies:

```sh
npm install
```

Then, depending on your use-case you may run any of the following commands:

```sh
# build the library and run all tests
npm run all

# spin up a single local modeler instance
npm start

# run the full development setup
npm run dev
```

You may need to perform [additional project setup](./docs/project/SETUP.md) when
building the latest development snapshot.

## Related

bpmn-js builds on top of a few powerful tools:

* [bpmn-moddle](https://github.com/bpmn-io/bpmn-moddle): Read / write support for BPMN 2.0 XML in the browsers
* [diagram-js](https://github.com/bpmn-io/diagram-js): Diagram rendering and editing toolkit

It is an extensible toolkit, complemented by many [additional utilities](https://github.com/bpmn-io/awesome-bpmn-io).

## License

Use under the terms of the [bpmn.io license](http://bpmn.io/license).


================================================
FILE: assets/bpmn-js.css
================================================
.bjs-container {
  --bjs-font-family: Arial, sans-serif;

  --color-grey-225-10-15: hsl(225, 10%, 15%);
  --color-grey-225-10-35: hsl(225, 10%, 35%);
  --color-grey-225-10-55: hsl(225, 10%, 55%);
  --color-grey-225-10-75: hsl(225, 10%, 75%);
  --color-grey-225-10-80: hsl(225, 10%, 80%);
  --color-grey-225-10-85: hsl(225, 10%, 85%);
  --color-grey-225-10-90: hsl(225, 10%, 90%);
  --color-grey-225-10-95: hsl(225, 10%, 95%);
  --color-grey-225-10-97: hsl(225, 10%, 97%);

  --color-blue-205-100-45: hsl(205, 100%, 45%);
  --color-blue-205-100-45-opacity-30: hsla(205, 100%, 45%, 30%);
  --color-blue-205-100-50: hsl(205, 100%, 50%);
  --color-blue-205-100-95: hsl(205, 100%, 95%);

  --color-green-150-86-44: hsl(150, 86%, 44%);

  --color-red-360-100-40: hsl(360, 100%, 40%);
  --color-red-360-100-45: hsl(360, 100%, 45%);
  --color-red-360-100-92: hsl(360, 100%, 92%);
  --color-red-360-100-97: hsl(360, 100%, 97%);

  --color-white: hsl(0, 0%, 100%);
  --color-black: hsl(0, 0%, 0%);
  --color-black-opacity-05: hsla(0, 0%, 0%, 5%);
  --color-black-opacity-10: hsla(0, 0%, 0%, 10%);

  --breadcrumbs-font-family: var(--bjs-font-family);
  --breadcrumbs-item-color: var(--color-blue-205-100-50);
  --breadcrumbs-arrow-color: var(--color-black);
  --drilldown-fill-color: var(--color-white);
  --drilldown-background-color: var(--color-blue-205-100-50);
}

.bjs-breadcrumbs {
  position: absolute;
  display: none;
  flex-wrap: wrap;
  align-items: center;
  top: 30px;
  left: 30px;
  padding: 0px;
  margin: 0px;
  font-family: var(--breadcrumbs-font-family);
  font-size: 16px;
  line-height: normal;
}

.bjs-breadcrumbs-shown .bjs-breadcrumbs {
  display: flex;
}

.djs-palette-shown .bjs-breadcrumbs {
  left: 90px;
}

.djs-palette-shown.djs-palette-two-column .bjs-breadcrumbs {
  left: 140px;
}

.bjs-breadcrumbs li {
  display: inline-flex;
  padding-bottom: 5px;
  align-items: center;
}

.bjs-breadcrumbs li a {
  cursor: pointer;
  color: var(--breadcrumbs-item-color);
}

.bjs-breadcrumbs li:last-of-type a {
  color: inherit;
  cursor: default;
}

.bjs-breadcrumbs li:not(:first-child)::before {
  content: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="17" height="17" viewBox="0 0 24 24"><path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z" /><path d="M0 0h24v24H0z" fill="none" /></svg>');
  padding: 0 8px;
  color: var(--breadcrumbs-arrow-color);
  height: 1em;
}

.bjs-breadcrumbs .bjs-crumb {
  display: inline-block;
  max-width: 200px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.bjs-drilldown {
  width: 20px;
  height: 20px;

  padding: 0px;
  margin-left: -20px;

  cursor: pointer;
  border: none;
  border-radius: 2px;
  outline: none;

  fill: var(--drilldown-fill-color);
  background-color: var(--drilldown-background-color);
}

.bjs-drilldown-empty {
  display: none;
}

.selected .bjs-drilldown-empty {
  display: inherit;
}

[data-popup="align-elements"] .djs-popup-results {
  display: flex;
}

[data-popup="align-elements"] .djs-popup-body [data-group] + [data-group] {
  border-left: 1px solid var(--popup-border-color);
}

[data-popup="align-elements"] [data-group="align"] {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
}

[data-popup="align-elements"] .djs-popup-body .entry {
  padding: 6px 8px;
}

[data-popup="align-elements"] .djs-popup-body .entry:not(:first-child) {
  margin-top: 0;
}

[data-popup="align-elements"] .djs-popup-entry-icon {
  display: block;
  margin: 0;
  height: 20px;
  width: 20px;
}


================================================
FILE: docs/project/SETUP.md
================================================
# Project Setup

This document describes the necessary steps to setup a `bpmn-js` development environment.

## TLDR;

On Linux, OS X or Windows? [git](http://git-scm.com), [NodeJS](https://nodejs.org) and [npm](https://www.npmjs.org/doc/cli/npm.html) ready? Check out the [setup script section](#setup-via-script) below.

## Manual Steps

Make sure you have [git](http://git-scm.com), [NodeJS](https://nodejs.org) and [npm](https://www.npmjs.org/doc/cli/npm.html)  installed before you continue.

### Get Project + Dependencies

The following projects from the [bpmn-io](https://github.com/bpmn-io) project on GitHub

* [bpmn-js](https://github.com/bpmn-io/bpmn-js)
* [diagram-js](https://github.com/bpmn-io/diagram-js)
* [bpmn-moddle](https://github.com/bpmn-io/bpmn-moddle)

and clone them into a common directory via

```sh
git clone git@github.com:bpmn-io/bpmn-js.git
git clone git@github.com:bpmn-io/diagram-js.git
git clone git@github.com:bpmn-io/bpmn-moddle.git
```

### Link Projects

[Link dependent projects](https://docs.npmjs.com/cli/link) between each other to pick up changes immediately.

```plain
.
├─bpmn-js
│   └─node_modules
│       ├─diagram-js <link>
│       └─bpmn-moddle <link>
├─diagram-js
├─bpmn-moddle
```

#### On OS X, Linux

Use [npm-link](https://docs.npmjs.com/cli/link) or `ln -s <target> <link>`.

#### On Windows

Use `mklink /d <link> <target>` [(docs)](http://technet.microsoft.com/en-us/library/cc753194.aspx).

### Install Dependencies

Execute `npm install` on each of the projects to grab their dependencies.

### Verify Things are O.K.

Execute `npm run all` on each project. Things should be fine.

### Setup via Script

The whole setup can be automated through setup scripts for [Linux/OS X](./setup.sh) and [Windows](./setup.bat).


================================================
FILE: docs/project/setup-alternative.sh
================================================
#!/bin/bash

###
# Setup script to be executed in a bpmn.io project root (some empty folder chosen by YOU). Use if you do not want to rely on npm link.
###

base=`pwd`

echo cloning repositories

git clone git@github.com:bpmn-io/diagram-js.git
git clone git@github.com:bpmn-io/bpmn-js.git
git clone git@github.com:bpmn-io/bpmn-moddle.git


echo done.

echo setup diagram-js

cd $base/diagram-js
npm install


echo setup bpmn-moddle

cd $base/bpmn-moddle
npm install


echo setup bpmn-js

cd $base/bpmn-js
mkdir node_modules
ln -s $base/bpmn-moddle node_modules/bpmn-moddle
ln -s $base/diagram-js node_modules/diagram-js
npm install


cd $base

echo all done.


================================================
FILE: docs/project/setup.bat
================================================
@echo off

rem ###
rem # Setup script to be executed in a bpmn.io project root (some empty folder chosen by YOU)
rem ##

set BASE=%CD%

echo cloning repositories

git clone git@github.com:bpmn-io/diagram-js.git
git clone git@github.com:bpmn-io/bpmn-js.git
git clone git@github.com:bpmn-io/bpmn-moddle.git

echo done.


echo setup diagram-js

cd %BASE%\diagram-js
npm install


echo setup bpmn-moddle

cd %BASE%\bpmn-moddle
npm install


echo prepare setup bpmn-js

mkdir %BASE%\bpmn-js\node_modules

rem link bpmn-js
mklink /D %BASE%\bpmn-js\node_modules\bpmn-moddle %BASE%\bpmn-moddle
mklink /D %BASE%\bpmn-js\node_modules\diagram-js %BASE%\diagram-js


echo setup bpmn-js

cd %BASE%\bpmn-js
npm install


cd %BASE%


================================================
FILE: docs/project/setup.sh
================================================
#!/bin/bash

###
# Setup script to be executed in a bpmn.io project root (some empty folder chosen by YOU)
###

base=`pwd`

echo cloning repositories

git clone git@github.com:bpmn-io/diagram-js.git
git clone git@github.com:bpmn-io/bpmn-js.git
git clone git@github.com:bpmn-io/bpmn-moddle.git

echo done.


echo setup diagram-js

cd $base/diagram-js
npm install


echo setup bpmn-moddle

cd $base/bpmn-moddle
npm install


echo setup bpmn-js

cd $base/bpmn-js
npm install
npm link ../diagram-js
npm link ../bpmn-moddle


cd $base

echo all done.


================================================
FILE: docs/translations.json
================================================
[
  "Activate create/remove space tool",
  "Activate global connect tool",
  "Activate hand tool",
  "Activate lasso tool",
  "Ad-hoc sub-process",
  "Ad-hoc sub-process (collapsed)",
  "Ad-hoc sub-process (expanded)",
  "Add lane above",
  "Add lane below",
  "Add text annotation",
  "Align elements",
  "Align elements bottom",
  "Align elements center",
  "Align elements left",
  "Align elements middle",
  "Align elements right",
  "Align elements top",
  "Append compensation activity",
  "Append conditional intermediate catch event",
  "Append end event",
  "Append gateway",
  "Append intermediate/boundary event",
  "Append message intermediate catch event",
  "Append receive task",
  "Append signal intermediate catch event",
  "Append task",
  "Append timer intermediate catch event",
  "Business rule task",
  "Call activity",
  "Cancel boundary event",
  "Cancel end event",
  "Change element",
  "Collection",
  "Compensation boundary event",
  "Compensation end event",
  "Compensation intermediate throw event",
  "Compensation start event",
  "Complex gateway",
  "Conditional boundary event",
  "Conditional boundary event (non-interrupting)",
  "Conditional flow",
  "Conditional intermediate catch event",
  "Conditional start event",
  "Conditional start event (non-interrupting)",
  "Connect to other element",
  "Connect using association",
  "Connect using data input association",
  "Create data object reference",
  "Create data store reference",
  "Create end event",
  "Create expanded sub-process",
  "Create gateway",
  "Create group",
  "Create intermediate/boundary event",
  "Create pool/participant",
  "Create start event",
  "Create task",
  "Data object must be placed within a pool/participant.",
  "Data object reference",
  "Data store reference",
  "Default flow",
  "Delete",
  "Distribute elements horizontally",
  "Distribute elements vertically",
  "Divide into three lanes",
  "Divide into two lanes",
  "Empty pool/participant",
  "Empty pool/participant (removes content)",
  "End event",
  "Error boundary event",
  "Error end event",
  "Error start event",
  "Escalation boundary event",
  "Escalation boundary event (non-interrupting)",
  "Escalation end event",
  "Escalation intermediate throw event",
  "Escalation start event",
  "Escalation start event (non-interrupting)",
  "Event sub-process",
  "Event-based gateway",
  "Exclusive gateway",
  "Inclusive gateway",
  "Intermediate throw event",
  "Link intermediate catch event",
  "Link intermediate throw event",
  "Loop",
  "Manual task",
  "Message boundary event",
  "Message boundary event (non-interrupting)",
  "Message end event",
  "Message intermediate catch event",
  "Message intermediate throw event",
  "Message start event",
  "Message start event (non-interrupting)",
  "Open {element}",
  "Parallel gateway",
  "Parallel multi-instance",
  "Participant multiplicity",
  "Receive task",
  "Script task",
  "Search in diagram",
  "Send task",
  "Sequence flow",
  "Sequential multi-instance",
  "Service task",
  "Signal boundary event",
  "Signal boundary event (non-interrupting)",
  "Signal end event",
  "Signal intermediate catch event",
  "Signal intermediate throw event",
  "Signal start event",
  "Signal start event (non-interrupting)",
  "Start event",
  "Sub-process",
  "Sub-process (collapsed)",
  "Sub-process (expanded)",
  "Task",
  "Terminate end event",
  "Timer boundary event",
  "Timer boundary event (non-interrupting)",
  "Timer intermediate catch event",
  "Timer start event",
  "Timer start event (non-interrupting)",
  "Toggle non-interrupting",
  "Transaction",
  "User task",
  "flow elements must be children of pools/participants"
]

================================================
FILE: eslint.config.mjs
================================================
import bpmnIoPlugin from 'eslint-plugin-bpmn-io';

const files = {
  ignored: [
    'dist',
    'coverage'
  ],
  build: [
    'test/config/*.js',
    'tasks/**/*.mjs',
    '*.js',
    '*.mjs'
  ],
  test: [
    'test/**/*.js'
  ]
};

export default [
  {
    ignores: files.ignored
  },

  // build
  ...bpmnIoPlugin.configs.node.map(config => {

    return {
      ...config,
      files: files.build
    };
  }),

  // lib + test
  ...bpmnIoPlugin.configs.browser.map(config => {

    return {
      ...config,
      ignores: files.build
    };
  }),

  // test
  ...bpmnIoPlugin.configs.mocha.map(config => {

    return {
      ...config,
      files: files.test,
    };
  }),
  {
    languageOptions: {
      globals: {
        sinon: true,
        require: true
      }
    },
    files: files.test
  }
];

================================================
FILE: lib/BaseModeler.js
================================================
import inherits from 'inherits-browser';

import { Ids } from 'ids';

import BaseViewer from './BaseViewer';


/**
 * @typedef {import('./BaseViewer').BaseViewerOptions} BaseViewerOptions
 * @typedef {import('./BaseViewer').ModdleElementsById} ModdleElementsById
 *
 * @typedef {import('./model/Types').ModdleElement} ModdleElement
 */

/**
 * A base modeler for BPMN 2.0 diagrams.
 *
 * See {@link bpmn-js/lib/Modeler} for a fully-featured modeler.
 *
 * @template [ServiceMap=null]
 *
 * @extends BaseViewer<ServiceMap>
 *
 * @param {BaseViewerOptions} [options] The options to configure the modeler.
 */
export default function BaseModeler(options) {
  BaseViewer.call(this, options);

  // hook ID collection into the modeler
  this.on('import.parse.complete', function(event) {
    if (!event.error) {
      this._collectIds(event.definitions, event.elementsById);
    }
  }, this);

  this.on('diagram.destroy', function() {
    this.get('moddle').ids.clear();
  }, this);
}

inherits(BaseModeler, BaseViewer);


/**
 * Create a moddle instance, attaching IDs to it.
 *
 * @param {BaseViewerOptions} options
 *
 * @return {Moddle}
 */
BaseModeler.prototype._createModdle = function(options) {
  var moddle = BaseViewer.prototype._createModdle.call(this, options);

  // attach ids to moddle to be able to track and validated ids in the BPMN 2.0
  // XML document tree
  moddle.ids = new Ids([ 32, 36, 1 ]);

  return moddle;
};

/**
 * Collect IDs processed during parsing of the definitions object.
 *
 * @param {ModdleElement} definitions
 * @param {ModdleElementsById} elementsById
 */
BaseModeler.prototype._collectIds = function(definitions, elementsById) {

  var moddle = definitions.$model,
      ids = moddle.ids,
      id;

  // remove references from previous import
  ids.clear();

  for (id in elementsById) {
    ids.claim(id, elementsById[ id ]);
  }
};


================================================
FILE: lib/BaseModeler.spec.ts
================================================
import Canvas from 'diagram-js/lib/core/Canvas';
import EventBus from 'diagram-js/lib/core/EventBus';

import BaseModeler from './BaseModeler';

import { testViewer } from './BaseViewer.spec';

const modeler = new BaseModeler({
  container: 'container'
});

testViewer(modeler);


const otherModeler = new BaseModeler({
  container: 'container'
});

const extendedModeler = new BaseModeler({
  container: 'container',
  alignToOrigin: false,
  propertiesPanel: {
    attachTo: '#properties-panel'
  }
});


// typed API usage

type FooEvent = {
  /**
   * Very cool field!
   */
  foo: string;
};

type EventMap = {

  foo: FooEvent
};

type TypeMap = {
  canvas: Canvas,
  eventBus: EventBus<EventMap>
};

const typedModeler = new BaseModeler<TypeMap>();

const bus = typedModeler.get('eventBus');

const canvas = typedModeler.get('canvas');

canvas.zoom('fit-viewport');

typedModeler.on('foo', event => {
  console.log(event.foo);
});

typedModeler.get('eventBus').on('foo', e => console.log(e.foo));

================================================
FILE: lib/BaseViewer.js
================================================
/**
 * The code in the <project-logo></project-logo> area
 * must not be changed.
 *
 * @see http://bpmn.io/license for more information.
 */
import {
  assign,
  find,
  isNumber,
  omit
} from 'min-dash';

import {
  domify,
  assignStyle,
  query as domQuery,
  remove as domRemove
} from 'min-dom';

import {
  innerSVG
} from 'tiny-svg';

import Diagram from 'diagram-js';
import { BpmnModdle } from 'bpmn-moddle';

import inherits from 'inherits-browser';

import {
  importBpmnDiagram
} from './import/Importer';

/**
 * @template T
 *
 * @typedef { import('diagram-js/lib/core/EventBus').default<T> } EventBus
 */

/**
 * @template T
 *
 * @typedef {import('diagram-js/lib/core/EventBus').EventBusEventCallback<T>} EventBusEventCallback
 */

/**
 * @typedef {import('didi').ModuleDeclaration} ModuleDeclaration
 *
 * @typedef {import('./model/Types').Moddle} Moddle
 * @typedef {import('./model/Types').ModdleElement} ModdleElement
 * @typedef {import('./model/Types').ModdleExtension} ModdleExtension
 *
 * @typedef { {
 *   width?: number|string;
 *   height?: number|string;
 *   position?: string;
 *   container?: string|HTMLElement;
 *   moddleExtensions?: ModdleExtensions;
 *   additionalModules?: ModuleDeclaration[];
 * } & Record<string, any> } BaseViewerOptions
 *
 * @typedef {Record<string, ModdleElement>} ModdleElementsById
 *
 * @typedef { {
 *   [key: string]: ModdleExtension;
 * } } ModdleExtensions
 *
 * @typedef { {
 *   warnings: string[];
 * } } ImportXMLResult
 *
 * @typedef {ImportXMLResult & Error} ImportXMLError
 *
 * @typedef {ImportXMLResult} ImportDefinitionsResult
 *
 * @typedef {ImportXMLError} ImportDefinitionsError
 *
 * @typedef {ImportXMLResult} OpenResult
 *
 * @typedef {ImportXMLError} OpenError
 *
 * @typedef { {
 *   format?: boolean;
 *   preamble?: boolean;
 * } } SaveXMLOptions
 *
 * @typedef { {
 *   xml?: string;
 *   error?: Error;
 * } } SaveXMLResult
 *
 * @typedef { {
 *   svg: string;
 * } } SaveSVGResult
 *
 * @typedef { {
 *   xml: string;
 * } } ImportParseStartEvent
 *
 * @typedef { {
 *   error?: ImportXMLError;
 *   definitions?: ModdleElement;
 *   elementsById?: ModdleElementsById;
 *   references?: ModdleElement[];
 *   warnings: string[];
 * } } ImportParseCompleteEvent
 *
 * @typedef { {
 *   error?: ImportXMLError;
 *   warnings: string[];
 * } } ImportDoneEvent
 *
 * @typedef { {
 *   definitions: ModdleElement;
 * } } SaveXMLStartEvent
 *
 * @typedef {SaveXMLResult} SaveXMLDoneEvent
 *
 * @typedef { {
 *   error?: Error;
 *   svg: string;
 * } } SaveSVGDoneEvent
 */

/**
 * @template Type
 *
 * @typedef { Type extends { eventBus: EventBus<infer X> } ? X : never } EventMap
 */

/**
 * A base viewer for BPMN 2.0 diagrams.
 *
 * Have a look at {@link bpmn-js/lib/Viewer}, {@link bpmn-js/lib/NavigatedViewer} or {@link bpmn-js/lib/Modeler} for
 * bundles that include actual features.
 *
 * @template [ServiceMap=null]
 *
 * @extends Diagram<ServiceMap>
 *
 * @param {BaseViewerOptions} [options] The options to configure the viewer.
 */
export default function BaseViewer(options) {

  /**
   * @type {BaseViewerOptions}
   */
  options = assign({}, DEFAULT_OPTIONS, options);

  /**
   * @type {Moddle}
   */
  this._moddle = this._createModdle(options);

  /**
   * @type {HTMLElement}
   */
  this._container = this._createContainer(options);

  this._init(this._container, this._moddle, options);

  /* <project-logo> */

  addProjectLogo(this._container);

  /* </project-logo> */
}

inherits(BaseViewer, Diagram);

/**
 * Parse and render a BPMN 2.0 diagram.
 *
 * Once finished the viewer reports back the result to the
 * provided callback function with (err, warnings).
 *
 * ## Life-Cycle Events
 *
 * During import the viewer will fire life-cycle events:
 *
 *   * import.parse.start (about to read model from XML)
 *   * import.parse.complete (model read; may have worked or not)
 *   * import.render.start (graphical import start)
 *   * import.render.complete (graphical import finished)
 *   * import.done (everything done)
 *
 * You can use these events to hook into the life-cycle.
 *
 * @throws {ImportXMLError} An error thrown during the import of the XML.
 *
 * @fires BaseViewer#ImportParseStartEvent
 * @fires BaseViewer#ImportParseCompleteEvent
 * @fires Importer#ImportRenderStartEvent
 * @fires Importer#ImportRenderCompleteEvent
 * @fires BaseViewer#ImportDoneEvent
 *
 * @param {string} xml The BPMN 2.0 XML to be imported.
 * @param {ModdleElement|string} [bpmnDiagram] The optional diagram or Id of the BPMN diagram to open.
 *
 * @return {Promise<ImportXMLResult>} A promise resolving with warnings that were produced during the import.
 */
BaseViewer.prototype.importXML = async function importXML(xml, bpmnDiagram) {

  const self = this;

  function ParseCompleteEvent(data) {
    return self.get('eventBus').createEvent(data);
  }

  let aggregatedWarnings = [];
  try {

    // hook in pre-parse listeners +
    // allow xml manipulation

    /**
     * A `import.parse.start` event.
     *
     * @event BaseViewer#ImportParseStartEvent
     * @type {ImportParseStartEvent}
     */
    xml = this._emit('import.parse.start', { xml: xml }) || xml;

    let parseResult;
    try {
      parseResult = await this._moddle.fromXML(xml, 'bpmn:Definitions');
    } catch (error) {
      this._emit('import.parse.complete', {
        error
      });

      throw error;
    }

    let definitions = parseResult.rootElement;
    const references = parseResult.references;
    const parseWarnings = parseResult.warnings;
    const elementsById = parseResult.elementsById;

    aggregatedWarnings = aggregatedWarnings.concat(parseWarnings);

    // hook in post parse listeners +
    // allow definitions manipulation

    /**
     * A `import.parse.complete` event.
     *
     * @event BaseViewer#ImportParseCompleteEvent
     * @type {ImportParseCompleteEvent}
     */
    definitions = this._emit('import.parse.complete', ParseCompleteEvent({
      error: null,
      definitions: definitions,
      elementsById: elementsById,
      references: references,
      warnings: aggregatedWarnings
    })) || definitions;

    const importResult = await this.importDefinitions(definitions, bpmnDiagram);

    aggregatedWarnings = aggregatedWarnings.concat(importResult.warnings);

    /**
     * A `import.parse.complete` event.
     *
     * @event BaseViewer#ImportDoneEvent
     * @type {ImportDoneEvent}
     */
    this._emit('import.done', { error: null, warnings: aggregatedWarnings });

    return { warnings: aggregatedWarnings };
  } catch (err) {
    let error = err;
    aggregatedWarnings = aggregatedWarnings.concat(error.warnings || []);
    addWarningsToError(error, aggregatedWarnings);

    error = checkValidationError(error);

    this._emit('import.done', { error, warnings: error.warnings });

    throw error;
  }
};


/**
 * Import parsed definitions and render a BPMN 2.0 diagram.
 *
 * Once finished the viewer reports back the result to the
 * provided callback function with (err, warnings).
 *
 * ## Life-Cycle Events
 *
 * During import the viewer will fire life-cycle events:
 *
 *   * import.render.start (graphical import start)
 *   * import.render.complete (graphical import finished)
 *
 * You can use these events to hook into the life-cycle.
 *
 * @throws {ImportDefinitionsError} An error thrown during the import of the definitions.
 *
 * @param {ModdleElement} definitions The definitions.
 * @param {ModdleElement|string} [bpmnDiagram] The optional diagram or ID of the BPMN diagram to open.
 *
 * @return {Promise<ImportDefinitionsResult>} A promise resolving with warnings that were produced during the import.
 */
BaseViewer.prototype.importDefinitions = async function importDefinitions(definitions, bpmnDiagram) {
  this._setDefinitions(definitions);
  const result = await this.open(bpmnDiagram);

  return { warnings: result.warnings };
};


/**
 * Open diagram of previously imported XML.
 *
 * Once finished the viewer reports back the result to the
 * provided callback function with (err, warnings).
 *
 * ## Life-Cycle Events
 *
 * During switch the viewer will fire life-cycle events:
 *
 *   * import.render.start (graphical import start)
 *   * import.render.complete (graphical import finished)
 *
 * You can use these events to hook into the life-cycle.
 *
 * @throws {OpenError} An error thrown during opening.
 *
 * @param {ModdleElement|string} bpmnDiagramOrId The diagram or Id of the BPMN diagram to open.
 *
 * @return {Promise<OpenResult>} A promise resolving with warnings that were produced during opening.
 */
BaseViewer.prototype.open = async function open(bpmnDiagramOrId) {

  const definitions = this._definitions;
  let bpmnDiagram = bpmnDiagramOrId;

  if (!definitions) {
    const error = new Error('no XML imported');
    addWarningsToError(error, []);

    throw error;
  }

  if (typeof bpmnDiagramOrId === 'string') {
    bpmnDiagram = findBPMNDiagram(definitions, bpmnDiagramOrId);

    if (!bpmnDiagram) {
      const error = new Error('BPMNDiagram <' + bpmnDiagramOrId + '> not found');
      addWarningsToError(error, []);

      throw error;
    }
  }

  // clear existing rendered diagram
  // catch synchronous exceptions during #clear()
  try {
    this.clear();
  } catch (error) {
    addWarningsToError(error, []);

    throw error;
  }

  // perform graphical import
  const { warnings } = await importBpmnDiagram(this, definitions, bpmnDiagram);

  return { warnings };
};

/**
 * Export the currently displayed BPMN 2.0 diagram as
 * a BPMN 2.0 XML document.
 *
 * ## Life-Cycle Events
 *
 * During XML saving the viewer will fire life-cycle events:
 *
 *   * saveXML.start (before serialization)
 *   * saveXML.serialized (after xml generation)
 *   * saveXML.done (everything done)
 *
 * You can use these events to hook into the life-cycle.
 *
 * @throws {Error} An error thrown during export.
 *
 * @fires BaseViewer#SaveXMLStart
 * @fires BaseViewer#SaveXMLDone
 *
 * @param {SaveXMLOptions} [options] The options.
 *
 * @return {Promise<SaveXMLResult>} A promise resolving with the XML.
 */
BaseViewer.prototype.saveXML = async function saveXML(options) {

  options = options || {};

  let definitions = this._definitions,
      error, xml;

  try {
    if (!definitions) {
      throw new Error('no definitions loaded');
    }

    // allow to fiddle around with definitions

    /**
     * A `saveXML.start` event.
     *
     * @event BaseViewer#SaveXMLStartEvent
     * @type {SaveXMLStartEvent}
     */
    definitions = this._emit('saveXML.start', {
      definitions
    }) || definitions;

    const result = await this._moddle.toXML(definitions, options);
    xml = result.xml;

    xml = this._emit('saveXML.serialized', {
      xml
    }) || xml;
  } catch (err) {
    error = err;
  }

  const result = error ? { error } : { xml };

  /**
   * A `saveXML.done` event.
   *
   * @event BaseViewer#SaveXMLDoneEvent
   * @type {SaveXMLDoneEvent}
   */
  this._emit('saveXML.done', result);

  if (error) {
    throw error;
  }

  return result;
};


/**
 * Export the currently displayed BPMN 2.0 diagram as
 * an SVG image.
 *
 * ## Life-Cycle Events
 *
 * During SVG saving the viewer will fire life-cycle events:
 *
 *   * saveSVG.start (before serialization)
 *   * saveSVG.done (everything done)
 *
 * You can use these events to hook into the life-cycle.
 *
 * @throws {Error} An error thrown during export.
 *
 * @fires BaseViewer#SaveSVGDone
 *
 * @return {Promise<SaveSVGResult>} A promise resolving with the SVG.
 */
BaseViewer.prototype.saveSVG = async function saveSVG() {
  this._emit('saveSVG.start');

  let svg, err;

  try {
    const canvas = this.get('canvas');

    const contentNode = canvas.getActiveLayer(),
          defsNode = domQuery(':scope > defs', canvas._svg);

    const contents = innerSVG(contentNode),
          defs = defsNode ? '<defs>' + innerSVG(defsNode) + '</defs>' : '';

    const bbox = contentNode.getBBox();

    svg =
      '<?xml version="1.0" encoding="utf-8"?>\n' +
      '<!-- created with bpmn-js / http://bpmn.io -->\n' +
      '<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\n' +
      '<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" ' +
      'width="' + bbox.width + '" height="' + bbox.height + '" ' +
      'viewBox="' + bbox.x + ' ' + bbox.y + ' ' + bbox.width + ' ' + bbox.height + '" version="1.1">' +
      defs + contents +
      '</svg>';
  } catch (e) {
    err = e;
  }

  /**
   * A `saveSVG.done` event.
   *
   * @event BaseViewer#SaveSVGDoneEvent
   * @type {SaveSVGDoneEvent}
   */
  this._emit('saveSVG.done', {
    error: err,
    svg: svg
  });

  if (err) {
    throw err;
  }

  return { svg };
};

BaseViewer.prototype._setDefinitions = function(definitions) {
  this._definitions = definitions;
};

/**
 * Return modules to instantiate with.
 *
 * @return {ModuleDeclaration[]} The modules.
 */
BaseViewer.prototype.getModules = function() {
  return this._modules;
};

/**
 * Remove all drawn elements from the viewer.
 *
 * After calling this method the viewer can still be reused for opening another
 * diagram.
 */
BaseViewer.prototype.clear = function() {
  if (!this.getDefinitions()) {

    // no diagram to clear
    return;
  }

  // remove drawn elements
  Diagram.prototype.clear.call(this);
};

/**
 * Destroy the viewer instance and remove all its remainders from the document
 * tree.
 */
BaseViewer.prototype.destroy = function() {

  // diagram destroy
  Diagram.prototype.destroy.call(this);

  // dom detach
  domRemove(this._container);
};

/**
 * @overlord
 *
 * Register an event listener for events with the given name.
 *
 * The callback will be invoked with `event, ...additionalArguments`
 * that have been passed to {@link EventBus#fire}.
 *
 * Returning false from a listener will prevent the events default action
 * (if any is specified). To stop an event from being processed further in
 * other listeners execute {@link Event#stopPropagation}.
 *
 * Returning anything but `undefined` from a listener will stop the listener propagation.
 *
 * @template T
 *
 * @param {string|string[]} events The event(s) to listen to.
 * @param {number} [priority] The priority with which to listen.
 * @param {EventBusEventCallback<T>} callback The callback.
 * @param {any} [that] Value of `this` the callback will be called with.
 */
/**
 * Register an event listener for events with the given name.
 *
 * The callback will be invoked with `event, ...additionalArguments`
 * that have been passed to {@link EventBus#fire}.
 *
 * Returning false from a listener will prevent the events default action
 * (if any is specified). To stop an event from being processed further in
 * other listeners execute {@link Event#stopPropagation}.
 *
 * Returning anything but `undefined` from a listener will stop the listener propagation.
 *
 * @template {keyof EventMap<ServiceMap>} EventName
 *
 * @param {EventName} events to subscribe to
 * @param {number} [priority=1000] listen priority
 * @param {EventBusEventCallback<(EventMap<ServiceMap>)[EventName]>} callback
 * @param {any} [that] callback context
 */
BaseViewer.prototype.on = function(events, priority, callback, that) {
  return this.get('eventBus').on(events, priority, callback, that);
};

/**
 * Remove an event listener.
 *
 * @param {string|string[]} events The event(s).
 * @param {Function} [callback] The callback.
 */
BaseViewer.prototype.off = function(events, callback) {
  this.get('eventBus').off(events, callback);
};

/**
 * Attach the viewer to an HTML element.
 *
 * @param {HTMLElement} parentNode The parent node to attach to.
 */
BaseViewer.prototype.attachTo = function(parentNode) {

  if (!parentNode) {
    throw new Error('parentNode required');
  }

  // ensure we detach from the
  // previous, old parent
  this.detach();

  // unwrap jQuery if provided
  if (parentNode.get && parentNode.constructor.prototype.jquery) {
    parentNode = parentNode.get(0);
  }

  if (typeof parentNode === 'string') {
    parentNode = domQuery(parentNode);
  }

  parentNode.appendChild(this._container);

  this._emit('attach', {});

  this.get('canvas').resized();
};

/**
 * Get the definitions model element.
 *
 * @return {ModdleElement} The definitions model element.
 */
BaseViewer.prototype.getDefinitions = function() {
  return this._definitions;
};

/**
 * Detach the viewer.
 *
 * @fires BaseViewer#DetachEvent
 */
BaseViewer.prototype.detach = function() {

  const container = this._container,
        parentNode = container.parentNode;

  if (!parentNode) {
    return;
  }

  /**
   * A `detach` event.
   *
   * @event BaseViewer#DetachEvent
   * @type {Object}
   */
  this._emit('detach', {});

  parentNode.removeChild(container);
};

BaseViewer.prototype._init = function(container, moddle, options) {

  const baseModules = options.modules || this.getModules(options),
        additionalModules = options.additionalModules || [],
        staticModules = [
          {
            bpmnjs: [ 'value', this ],
            moddle: [ 'value', moddle ]
          }
        ];

  const diagramModules = [].concat(staticModules, baseModules, additionalModules);

  const diagramOptions = assign(omit(options, [ 'additionalModules' ]), {
    canvas: assign({}, options.canvas, { container: container }),
    modules: diagramModules
  });

  // invoke diagram constructor
  Diagram.call(this, diagramOptions);

  if (options && options.container) {
    this.attachTo(options.container);
  }
};

/**
 * Emit an event on the underlying {@link EventBus}
 *
 * @param  {string} type
 * @param  {Object} event
 *
 * @return {Object} The return value after calling all event listeners.
 */
BaseViewer.prototype._emit = function(type, event) {
  return this.get('eventBus').fire(type, event);
};

/**
 * @param {BaseViewerOptions} options
 *
 * @return {HTMLElement}
 */
BaseViewer.prototype._createContainer = function(options) {

  const container = domify('<div class="bjs-container"></div>');

  assignStyle(container, {
    width: ensureUnit(options.width),
    height: ensureUnit(options.height),
    position: options.position
  });

  return container;
};

/**
 * @param {BaseViewerOptions} options
 *
 * @return {Moddle}
 */
BaseViewer.prototype._createModdle = function(options) {
  const moddleOptions = assign({}, this._moddleExtensions, options.moddleExtensions);

  return new BpmnModdle(moddleOptions);
};

BaseViewer.prototype._modules = [];

// helpers ///////////////

function addWarningsToError(err, warningsAry) {
  err.warnings = warningsAry;
  return err;
}

function checkValidationError(err) {

  // check if we can help the user by indicating wrong BPMN 2.0 xml
  // (in case he or the exporting tool did not get that right)

  const pattern = /unparsable content <([^>]+)> detected([\s\S]*)$/;
  const match = pattern.exec(err.message);

  if (match) {
    err.message =
      'unparsable content <' + match[1] + '> detected; ' +
      'this may indicate an invalid BPMN 2.0 diagram file' + match[2];
  }

  return err;
}

const DEFAULT_OPTIONS = {
  width: '100%',
  height: '100%',
  position: 'relative'
};


/**
 * Ensure the passed argument is a proper unit (defaulting to px)
 */
function ensureUnit(val) {
  return val + (isNumber(val) ? 'px' : '');
}


/**
 * Find BPMNDiagram in definitions by ID
 *
 * @param {ModdleElement<Definitions>} definitions
 * @param {string} diagramId
 *
 * @return {ModdleElement<BPMNDiagram>|null}
 */
function findBPMNDiagram(definitions, diagramId) {
  if (!diagramId) {
    return null;
  }

  return find(definitions.diagrams, function(element) {
    return element.id === diagramId;
  }) || null;
}


/* <project-logo> */

import {
  open as openPoweredBy,
  BPMNIO_IMG,
  LOGO_STYLES,
  LINK_STYLES
} from './util/PoweredByUtil';

import {
  event as domEvent
} from 'min-dom';

/**
 * Adds the project logo to the diagram container as
 * required by the bpmn.io license.
 *
 * @see http://bpmn.io/license
 *
 * @param {Element} container
 */
function addProjectLogo(container) {
  const img = BPMNIO_IMG;

  const linkMarkup =
    '<a href="http://bpmn.io" ' +
    'target="_blank" ' +
    'class="bjs-powered-by" ' +
    'title="Powered by bpmn.io" ' +
    '>' +
    img +
    '</a>';

  const linkElement = domify(linkMarkup);

  assignStyle(domQuery('svg', linkElement), LOGO_STYLES);
  assignStyle(linkElement, LINK_STYLES, {
    position: 'absolute',
    bottom: '15px',
    right: '15px',
    zIndex: '100'
  });

  container.appendChild(linkElement);

  domEvent.bind(linkElement, 'click', function(event) {
    openPoweredBy();

    event.preventDefault();
  });
}

/* </project-logo> */


================================================
FILE: lib/BaseViewer.spec.ts
================================================
import CommandStack from 'diagram-js/lib/command/CommandStack';

import EventBus, { Event } from 'diagram-js/lib/core/EventBus';

import BaseViewer, {
  ImportDoneEvent,
  ImportParseCompleteEvent,
  ImportParseStartEvent,
  SaveXMLDoneEvent,
  SaveXMLStartEvent
} from './BaseViewer';

import OverlaysModule from 'diagram-js/lib/features/overlays';
import Canvas from 'diagram-js/lib/core/Canvas';

const viewer = new BaseViewer();

const configuredViewer = new BaseViewer({
  width: 100,
  height: 100,
  position: 'absolute',
  container: 'container',
  moddleExtensions: {
    foo: {}
  },
  additionalModules: [
    OverlaysModule
  ]
});

testViewer(viewer);

const extendedViewer = new BaseViewer({
  container: 'container',
  alignToOrigin: false,
  propertiesPanel: {
    attachTo: '#properties-panel'
  }
});

export function testViewer(viewer: BaseViewer) {
  viewer.importXML('<?xml version="1.0" encoding="UTF-8"?>', 'BPMNDiagram_1');

  viewer.importXML('<?xml version="1.0" encoding="UTF-8"?>')
    .then(({ warnings }) => {
      console.log(warnings);
    })
    .catch(error => {
      const {
        message,
        warnings
      } = error;

      console.log(message, warnings);
    });

  viewer.importDefinitions({ $type: 'bpmn:Definitions' }, 'BPMNDiagram_1');

  viewer.importDefinitions({ $type: 'bpmn:Definitions' })
    .then(({ warnings }) => {
      console.log(warnings);
    })
    .catch(error => {
      const {
        message,
        warnings
      } = error;

      console.log(message, warnings);
    });

  viewer.open('BPMNDiagram_1');

  viewer.open({ $type: 'bpmn:BPMNDiagram' })
    .then(({ warnings }) => {
      console.log(warnings);
    })
    .catch(error => {
      const {
        message,
        warnings
      } = error;

      console.log(message, warnings);
    });

  viewer.saveXML({ format: true, preamble: false })
    .then(({ xml, error }) => {
      if (error) {
        console.log(error);
      } else {
        console.log(xml);
      }
    })
    .catch(error => {
      console.log(error);
    });

  viewer.saveXML();

  viewer.saveSVG();

  viewer.getModules();

  viewer.clear();

  viewer.destroy();

  viewer.get<CommandStack>('commandStack').undo();

  viewer.invoke((commandStack: CommandStack) => commandStack.undo());

  viewer.on('foo', () => console.log('foo'));

  viewer.on([ 'foo', 'bar' ], () => console.log('foo'));

  viewer.on('foo', 2000, () => console.log('foo'));

  viewer.on('foo', 2000, () => console.log('foo'), { foo: 'bar' });

  viewer.off('foo', () => console.log('foo'));

  viewer.attachTo(document.createElement('div'));

  viewer.getDefinitions();

  viewer.detach();

  viewer.on<ImportParseStartEvent>('import.parse.start', ({ xml }) => {
    console.log(xml);
  });

  viewer.on<ImportParseCompleteEvent>('import.parse.complete', ({
    error,
    definitions,
    elementsById,
    references,
    warnings
  }) => {
    if (error) {
      console.error(error);
    }

    if (warnings.length) {
      warnings.forEach(warning => console.log(warning));
    }

    console.log(definitions, elementsById, references);
  });

  viewer.on<ImportDoneEvent>('import.done', ({ error, warnings }) => {
    if (error) {
      console.error(error);
    }

    if (warnings.length) {
      warnings.forEach(warning => console.log(warning));
    }
  });

  viewer.on<SaveXMLStartEvent>('saveXML.start', ({ definitions }) => {
    console.log(definitions);
  });

  viewer.on<SaveXMLDoneEvent>('saveXML.done', ({ error, xml }) => {
    if (error) {
      console.error(error);
    } else {
      console.log(xml);
    }
  });

  viewer.on<Event>('detach', () => {});
}

// typed API usage

type FooEvent = {
  /**
   * Very cool field!
   */
  foo: string;
};

type EventMap = {

  foo: FooEvent
};

type TypeMap = {
  canvas: Canvas,
  eventBus: EventBus<EventMap>
};

const typedViewer = new BaseViewer<TypeMap>();

const bus = typedViewer.get('eventBus');

const canvas = typedViewer.get('canvas');

canvas.zoom('fit-viewport');

typedViewer.on('foo', event => {
  console.log(event.foo);
});

typedViewer.get('eventBus').on('foo', e => console.log(e.foo));


================================================
FILE: lib/Modeler.js
================================================
import inherits from 'inherits-browser';

import BaseModeler from './BaseModeler';

import Viewer from './Viewer';
import NavigatedViewer from './NavigatedViewer';

import KeyboardMoveModule from 'diagram-js/lib/navigation/keyboard-move';
import MoveCanvasModule from 'diagram-js/lib/navigation/movecanvas';
import ZoomScrollModule from 'diagram-js/lib/navigation/zoomscroll';

import AlignElementsModule from './features/align-elements';
import AutoPlaceModule from './features/auto-place';
import AutoResizeModule from './features/auto-resize';
import AutoScrollModule from 'diagram-js/lib/features/auto-scroll';
import BendpointsModule from 'diagram-js/lib/features/bendpoints';
import ConnectModule from 'diagram-js/lib/features/connect';
import ConnectionPreviewModule from 'diagram-js/lib/features/connection-preview';
import ContextPadModule from './features/context-pad';
import CopyPasteModule from './features/copy-paste';
import CreateModule from 'diagram-js/lib/features/create';
import DistributeElementsModule from './features/distribute-elements';
import EditorActionsModule from './features/editor-actions';
import GridSnappingModule from './features/grid-snapping';
import InteractionEventsModule from './features/interaction-events';
import KeyboardModule from './features/keyboard';
import KeyboardMoveSelectionModule from 'diagram-js/lib/features/keyboard-move-selection';
import LabelEditingModule from './features/label-editing';
import LabelLink from './features/label-link';
import ModelingModule from './features/modeling';
import ModelingFeedbackModule from './features/modeling-feedback';
import MoveModule from 'diagram-js/lib/features/move';
import PaletteModule from './features/palette';
import ReplacePreviewModule from './features/replace-preview';
import ResizeModule from 'diagram-js/lib/features/resize';
import SnappingModule from './features/snapping';
import SearchModule from './features/search';
import OutlineModule from './features/outline';

var initialDiagram =
  '<?xml version="1.0" encoding="UTF-8"?>' +
  '<bpmn:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
                    'xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" ' +
                    'xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" ' +
                    'xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" ' +
                    'targetNamespace="http://bpmn.io/schema/bpmn" ' +
                    'id="Definitions_1">' +
    '<bpmn:process id="Process_1" isExecutable="false">' +
      '<bpmn:startEvent id="StartEvent_1"/>' +
    '</bpmn:process>' +
    '<bpmndi:BPMNDiagram id="BPMNDiagram_1">' +
      '<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1">' +
        '<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">' +
          '<dc:Bounds height="36.0" width="36.0" x="173.0" y="102.0"/>' +
        '</bpmndi:BPMNShape>' +
      '</bpmndi:BPMNPlane>' +
    '</bpmndi:BPMNDiagram>' +
  '</bpmn:definitions>';


/**
 * @typedef {import('./BaseViewer').BaseViewerOptions} BaseViewerOptions
 * @typedef {import('./BaseViewer').ImportXMLResult} ImportXMLResult
 */

/**
 * A modeler for BPMN 2.0 diagrams.
 *
 * ## Extending the Modeler
 *
 * In order to extend the viewer pass extension modules to bootstrap via the
 * `additionalModules` option. An extension module is an object that exposes
 * named services.
 *
 * The following example depicts the integration of a simple
 * logging component that integrates with interaction events:
 *
 *
 * ```javascript
 *
 * // logging component
 * function InteractionLogger(eventBus) {
 *   eventBus.on('element.hover', function(event) {
 *     console.log()
 *   })
 * }
 *
 * InteractionLogger.$inject = [ 'eventBus' ]; // minification save
 *
 * // extension module
 * var extensionModule = {
 *   __init__: [ 'interactionLogger' ],
 *   interactionLogger: [ 'type', InteractionLogger ]
 * };
 *
 * // extend the viewer
 * var bpmnModeler = new Modeler({ additionalModules: [ extensionModule ] });
 * bpmnModeler.importXML(...);
 * ```
 *
 *
 * ## Customizing / Replacing Components
 *
 * You can replace individual diagram components by redefining them in override modules.
 * This works for all components, including those defined in the core.
 *
 * Pass in override modules via the `options.additionalModules` flag like this:
 *
 * ```javascript
 * function CustomContextPadProvider(contextPad) {
 *
 *   contextPad.registerProvider(this);
 *
 *   this.getContextPadEntries = function(element) {
 *     // no entries, effectively disable the context pad
 *     return {};
 *   };
 * }
 *
 * CustomContextPadProvider.$inject = [ 'contextPad' ];
 *
 * var overrideModule = {
 *   contextPadProvider: [ 'type', CustomContextPadProvider ]
 * };
 *
 * var bpmnModeler = new Modeler({ additionalModules: [ overrideModule ]});
 * ```
 *
 * @template [ServiceMap=null]
 *
 * @extends BaseModeler<ServiceMap>
 *
 * @param {BaseViewerOptions} [options] The options to configure the modeler.
 */
export default function Modeler(options) {
  BaseModeler.call(this, options);
}

inherits(Modeler, BaseModeler);


Modeler.Viewer = Viewer;
Modeler.NavigatedViewer = NavigatedViewer;

/**
 * Create a new diagram to start modeling.
 *
 * @throws {ImportXMLError} An error thrown during the import of the XML.
 *
 * @return {Promise<ImportXMLResult>} A promise resolving with warnings that were produced during the import.
 */
Modeler.prototype.createDiagram = function createDiagram() {
  return this.importXML(initialDiagram);
};


Modeler.prototype._interactionModules = [

  // non-modeling components
  KeyboardMoveModule,
  MoveCanvasModule,
  ZoomScrollModule
];

Modeler.prototype._modelingModules = [

  // modeling components
  AlignElementsModule,
  AutoPlaceModule,
  AutoScrollModule,
  AutoResizeModule,
  BendpointsModule,
  ConnectModule,
  ConnectionPreviewModule,
  ContextPadModule,
  CopyPasteModule,
  CreateModule,
  DistributeElementsModule,
  EditorActionsModule,
  GridSnappingModule,
  InteractionEventsModule,
  KeyboardModule,
  KeyboardMoveSelectionModule,
  LabelEditingModule,
  LabelLink,
  ModelingModule,
  ModelingFeedbackModule,
  MoveModule,
  PaletteModule,
  ReplacePreviewModule,
  ResizeModule,
  SnappingModule,
  SearchModule,
  OutlineModule
];


// modules the modeler is composed of
//
// - viewer modules
// - interaction modules
// - modeling modules

Modeler.prototype._modules = [].concat(
  Viewer.prototype._modules,
  Modeler.prototype._interactionModules,
  Modeler.prototype._modelingModules
);


================================================
FILE: lib/Modeler.spec.ts
================================================
import Canvas from 'diagram-js/lib/core/Canvas';
import EventBus from 'diagram-js/lib/core/EventBus';

import Modeler from './Modeler';

import { testViewer } from './BaseViewer.spec';

const modeler = new Modeler({
  container: 'container'
});

testViewer(modeler);

modeler.createDiagram();


const otherModeler = new Modeler({
  container: 'container'
});

const extendedModeler = new Modeler({
  container: 'container',
  alignToOrigin: false,
  propertiesPanel: {
    attachTo: '#properties-panel'
  }
});


// typed API usage

type FooEvent = {
  /**
   * Very cool field!
   */
  foo: string;
};

type EventMap = {

  foo: FooEvent
};

type TypeMap = {
  canvas: Canvas,
  eventBus: EventBus<EventMap>
};

const typedViewer = new Modeler<TypeMap>();

const bus = typedViewer.get('eventBus');

const canvas = typedViewer.get('canvas');

canvas.zoom('fit-viewport');

typedViewer.on('foo', event => {
  console.log(event.foo);
});

typedViewer.get('eventBus').on('foo', e => console.log(e.foo));

================================================
FILE: lib/NavigatedViewer.js
================================================
import inherits from 'inherits-browser';

import Viewer from './Viewer';

import KeyboardMoveModule from 'diagram-js/lib/navigation/keyboard-move';
import MoveCanvasModule from 'diagram-js/lib/navigation/movecanvas';
import ZoomScrollModule from 'diagram-js/lib/navigation/zoomscroll';

/**
 * @typedef { import('./BaseViewer').BaseViewerOptions } BaseViewerOptions
 */

/**
 * A viewer with mouse and keyboard navigation features.
 *
 * @template [ServiceMap=null]
 *
 * @extends Viewer<ServiceMap>
 *
 * @param {BaseViewerOptions} [options]
 */
export default function NavigatedViewer(options) {
  Viewer.call(this, options);
}

inherits(NavigatedViewer, Viewer);


NavigatedViewer.prototype._navigationModules = [
  KeyboardMoveModule,
  MoveCanvasModule,
  ZoomScrollModule
];

NavigatedViewer.prototype._modules = [].concat(
  Viewer.prototype._modules,
  NavigatedViewer.prototype._navigationModules
);

================================================
FILE: lib/NavigatedViewer.spec.ts
================================================
import Canvas from 'diagram-js/lib/core/Canvas';
import EventBus from 'diagram-js/lib/core/EventBus';

import NavigatedViewer from './NavigatedViewer';

import { testViewer } from './BaseViewer.spec';

const viewer = new NavigatedViewer({
  container: 'container'
});

testViewer(viewer);

const extendedViewer = new NavigatedViewer({
  container: 'container',
  alignToOrigin: false,
  propertiesPanel: {
    attachTo: '#properties-panel'
  }
});

// typed API usage

type FooEvent = {
  /**
   * Very cool field!
   */
  foo: string;
};

type EventMap = {

  foo: FooEvent
};

type TypeMap = {
  canvas: Canvas,
  eventBus: EventBus<EventMap>
};

const typedViewer = new NavigatedViewer<TypeMap>();

const bus = typedViewer.get('eventBus');

const canvas = typedViewer.get('canvas');

canvas.zoom('fit-viewport');

typedViewer.on('foo', event => {
  console.log(event.foo);
});

typedViewer.get('eventBus').on('foo', e => console.log(e.foo));

================================================
FILE: lib/Viewer.js
================================================
import inherits from 'inherits-browser';

import CoreModule from './core';
import DrilldownModdule from './features/drilldown';
import OverlaysModule from 'diagram-js/lib/features/overlays';
import SelectionModule from 'diagram-js/lib/features/selection';
import TranslateModule from 'diagram-js/lib/i18n/translate';

import BaseViewer from './BaseViewer';


/**
 * @typedef { import('./BaseViewer').BaseViewerOptions } BaseViewerOptions
 */

/**
 * A viewer for BPMN 2.0 diagrams.
 *
 * Have a look at {@link bpmn-js/lib/NavigatedViewer} or {@link bpmn-js/lib/Modeler} for bundles that include
 * additional features.
 *
 *
 * ## Extending the Viewer
 *
 * In order to extend the viewer pass extension modules to bootstrap via the
 * `additionalModules` option. An extension module is an object that exposes
 * named services.
 *
 * The following example depicts the integration of a simple
 * logging component that integrates with interaction events:
 *
 *
 * ```javascript
 *
 * // logging component
 * function InteractionLogger(eventBus) {
 *   eventBus.on('element.hover', function(event) {
 *     console.log()
 *   })
 * }
 *
 * InteractionLogger.$inject = [ 'eventBus' ]; // minification save
 *
 * // extension module
 * var extensionModule = {
 *   __init__: [ 'interactionLogger' ],
 *   interactionLogger: [ 'type', InteractionLogger ]
 * };
 *
 * // extend the viewer
 * var bpmnViewer = new Viewer({ additionalModules: [ extensionModule ] });
 * bpmnViewer.importXML(...);
 * ```
 *
 * @template [ServiceMap=null]
 *
 * @extends BaseViewer<ServiceMap>
 *
 * @param {BaseViewerOptions} [options] The options to configure the viewer.
 */
export default function Viewer(options) {
  BaseViewer.call(this, options);
}

inherits(Viewer, BaseViewer);

// modules the viewer is composed of
Viewer.prototype._modules = [
  CoreModule,
  DrilldownModdule,
  OverlaysModule,
  SelectionModule,
  TranslateModule
];

// default moddle extensions the viewer is composed of
Viewer.prototype._moddleExtensions = {};

================================================
FILE: lib/Viewer.spec.ts
================================================
import Canvas from 'diagram-js/lib/core/Canvas';
import EventBus from 'diagram-js/lib/core/EventBus';

import Viewer from './Viewer';

import { testViewer } from './BaseViewer.spec';

const viewer = new Viewer({
  container: 'container'
});

testViewer(viewer);

const extendedViewer = new Viewer({
  container: 'container',
  alignToOrigin: false,
  propertiesPanel: {
    attachTo: '#properties-panel'
  }
});


// typed API usage

type FooEvent = {
  /**
   * Very cool field!
   */
  foo: string;
};

type EventMap = {

  foo: FooEvent
};

type TypeMap = {
  canvas: Canvas,
  eventBus: EventBus<EventMap>
};

const typedViewer = new Viewer<TypeMap>();

const bus = typedViewer.get('eventBus');

const canvas = typedViewer.get('canvas');

canvas.zoom('fit-viewport');

typedViewer.on('foo', event => {
  console.log(event.foo);
});

typedViewer.get('eventBus').on('foo', e => console.log(e.foo));

================================================
FILE: lib/core/index.js
================================================
import DrawModule from '../draw';
import ImportModule from '../import';

export default {
  __depends__: [
    DrawModule,
    ImportModule
  ]
};

================================================
FILE: lib/draw/BpmnRenderUtil.js
================================================
import {
  has,
  some
} from 'min-dash';

import {
  getDi
} from '../util/ModelUtil';

import {
  componentsToPath
} from 'diagram-js/lib/util/RenderUtil';


/**
 * @typedef {import('../model').ModdleElement} ModdleElement
 * @typedef {import('../model').Element} Element
 *
 * @typedef {import('../model').ShapeLike} ShapeLike
 *
 * @typedef {import('diagram-js/lib/util/Types').Dimensions} Dimensions
 * @typedef {import('diagram-js/lib/util/Types').Rect} Rect
 */

// re-export for compatibility
export {
  getDi,
  getBusinessObject as getSemantic
} from '../util/ModelUtil';


export var black = 'hsl(225, 10%, 15%)';
export var white = 'white';

// element utils //////////////////////

/**
 * Checks if eventDefinition of the given element matches with semantic type.
 *
 * @param {ModdleElement} event
 * @param {string} eventDefinitionType
 *
 * @return {boolean}
 */
export function isTypedEvent(event, eventDefinitionType) {
  return some(event.eventDefinitions, function(definition) {
    return definition.$type === eventDefinitionType;
  });
}

/**
 * Check if element is a throw event.
 *
 * @param {ModdleElement} event
 *
 * @return {boolean}
 */
export function isThrowEvent(event) {
  return (event.$type === 'bpmn:IntermediateThrowEvent') || (event.$type === 'bpmn:EndEvent');
}

/**
 * Check if element is a throw event.
 *
 * @param {ModdleElement} element
 *
 * @return {boolean}
 */
export function isCollection(element) {
  var dataObject = element.dataObjectRef;

  return element.isCollection || (dataObject && dataObject.isCollection);
}


// color access //////////////////////

/**
 * @param {Element} element
 * @param {string} [defaultColor]
 * @param {string} [overrideColor]
 *
 * @return {string}
 */
export function getFillColor(element, defaultColor, overrideColor) {
  var di = getDi(element);

  return overrideColor || di.get('color:background-color') || di.get('bioc:fill') || defaultColor || white;
}

/**
 * @param {Element} element
 * @param {string} [defaultColor]
 * @param {string} [overrideColor]
 *
 * @return {string}
 */
export function getStrokeColor(element, defaultColor, overrideColor) {
  var di = getDi(element);

  return overrideColor || di.get('color:border-color') || di.get('bioc:stroke') || defaultColor || black;
}

/**
 * @param {Element} element
 * @param {string} [defaultColor]
 * @param {string} [defaultStrokeColor]
 * @param {string} [overrideColor]
 *
 * @return {string}
 */
export function getLabelColor(element, defaultColor, defaultStrokeColor, overrideColor) {
  var di = getDi(element),
      label = di.get('label');

  return overrideColor || (label && label.get('color:color')) || defaultColor ||
    getStrokeColor(element, defaultStrokeColor);
}

// cropping path customizations //////////////////////

/**
 * @param {ShapeLike} shape
 *
 * @return {string} path
 */
export function getCirclePath(shape) {

  var cx = shape.x + shape.width / 2,
      cy = shape.y + shape.height / 2,
      radius = shape.width / 2;

  var circlePath = [
    [ 'M', cx, cy ],
    [ 'm', 0, -radius ],
    [ 'a', radius, radius, 0, 1, 1, 0, 2 * radius ],
    [ 'a', radius, radius, 0, 1, 1, 0, -2 * radius ],
    [ 'z' ]
  ];

  return componentsToPath(circlePath);
}

/**
 * @param {ShapeLike} shape
 * @param {number} [borderRadius]
 *
 * @return {string} path
 */
export function getRoundRectPath(shape, borderRadius) {

  var x = shape.x,
      y = shape.y,
      width = shape.width,
      height = shape.height;

  var roundRectPath = [
    [ 'M', x + borderRadius, y ],
    [ 'l', width - borderRadius * 2, 0 ],
    [ 'a', borderRadius, borderRadius, 0, 0, 1, borderRadius, borderRadius ],
    [ 'l', 0, height - borderRadius * 2 ],
    [ 'a', borderRadius, borderRadius, 0, 0, 1, -borderRadius, borderRadius ],
    [ 'l', borderRadius * 2 - width, 0 ],
    [ 'a', borderRadius, borderRadius, 0, 0, 1, -borderRadius, -borderRadius ],
    [ 'l', 0, borderRadius * 2 - height ],
    [ 'a', borderRadius, borderRadius, 0, 0, 1, borderRadius, -borderRadius ],
    [ 'z' ]
  ];

  return componentsToPath(roundRectPath);
}

/**
 * @param {ShapeLike} shape
 *
 * @return {string} path
 */
export function getDiamondPath(shape) {

  var width = shape.width,
      height = shape.height,
      x = shape.x,
      y = shape.y,
      halfWidth = width / 2,
      halfHeight = height / 2;

  var diamondPath = [
    [ 'M', x + halfWidth, y ],
    [ 'l', halfWidth, halfHeight ],
    [ 'l', -halfWidth, halfHeight ],
    [ 'l', -halfWidth, -halfHeight ],
    [ 'z' ]
  ];

  return componentsToPath(diamondPath);
}

/**
 * @param {ShapeLike} shape
 *
 * @return {string} path
 */
export function getRectPath(shape) {
  var x = shape.x,
      y = shape.y,
      width = shape.width,
      height = shape.height;

  var rectPath = [
    [ 'M', x, y ],
    [ 'l', width, 0 ],
    [ 'l', 0, height ],
    [ 'l', -width, 0 ],
    [ 'z' ]
  ];

  return componentsToPath(rectPath);
}

/**
 * Get width and height from element or overrides.
 *
 * @param {Dimensions|Rect|ShapeLike} bounds
 * @param {Object} overrides
 *
 * @returns {Dimensions}
 */
export function getBounds(bounds, overrides = {}) {
  return {
    width: getWidth(bounds, overrides),
    height: getHeight(bounds, overrides)
  };
}

/**
 * Get width from element or overrides.
 *
 * @param {Dimensions|Rect|ShapeLike} bounds
 * @param {Object} overrides
 *
 * @returns {number}
 */
export function getWidth(bounds, overrides = {}) {
  return has(overrides, 'width') ? overrides.width : bounds.width;
}

/**
 * Get height from element or overrides.
 *
 * @param {Dimensions|Rect|ShapeLike} bounds
 * @param {Object} overrides
 *
 * @returns {number}
 */
export function getHeight(bounds, overrides = {}) {
  return has(overrides, 'height') ? overrides.height : bounds.height;
}

================================================
FILE: lib/draw/BpmnRenderer.js
================================================
import inherits from 'inherits-browser';

import {
  assign,
  forEach,
  isObject
} from 'min-dash';

import BaseRenderer from 'diagram-js/lib/draw/BaseRenderer';

import {
  isExpanded,
  isHorizontal,
  isEventSubProcess
} from '../util/DiUtil';

import {
  getLabel,
  isLabel
} from '../util/LabelUtil';

import {
  is
} from '../util/ModelUtil';

import {
  createLine
} from 'diagram-js/lib/util/RenderUtil';

import {
  isTypedEvent,
  isThrowEvent,
  isCollection,
  getBounds,
  getDi,
  getSemantic,
  getCirclePath,
  getRoundRectPath,
  getDiamondPath,
  getRectPath,
  getFillColor,
  getStrokeColor,
  getLabelColor,
  getHeight,
  getWidth
} from './BpmnRenderUtil';

import {
  query as domQuery
} from 'min-dom';

import {
  append as svgAppend,
  attr as svgAttr,
  create as svgCreate,
  classes as svgClasses
} from 'tiny-svg';

import {
  rotate,
  transform,
  translate
} from 'diagram-js/lib/util/SvgTransformUtil';

import { Ids } from 'ids';

import { black } from './BpmnRenderUtil';

var markerIds = new Ids();

var ELEMENT_LABEL_DISTANCE = 10,
    INNER_OUTER_DIST = 3,
    PARTICIPANT_STROKE_WIDTH = 1.5,
    TASK_BORDER_RADIUS = 10,
    EXTERNAL_LABEL_BORDER_RADIUS = 4;

var DEFAULT_OPACITY = 0.95,
    FULL_OPACITY = 1,
    LOW_OPACITY = 0.25;

/**
 * @typedef { Partial<{
 *   defaultFillColor: string,
 *   defaultStrokeColor: string,
 *   defaultLabelColor: string
 * }> } BpmnRendererConfig
 *
 * @typedef { Partial<{
 *   fill: string,
 *   stroke: string,
 *   width: string,
 *   height: string
 * }> } Attrs
 */

/**
 * @typedef { import('../model/Types').Element } Element
 * @typedef { import('../model/Types').Shape } Shape
 * @typedef { import('../model/Types').Connection } Connection
 */

/**
 * A renderer for BPMN elements
 *
 * @param {BpmnRendererConfig} config
 * @param {import('diagram-js/lib/core/EventBus').default} eventBus
 * @param {import('diagram-js/lib/draw/Styles').default} styles
 * @param {import('./PathMap').default} pathMap
 * @param {import('diagram-js/lib/core/Canvas').default} canvas
 * @param {import('./TextRenderer').default} textRenderer
 * @param {number} [priority]
 */
export default function BpmnRenderer(
    config, eventBus, styles, pathMap,
    canvas, textRenderer, priority) {

  BaseRenderer.call(this, eventBus, priority);

  var defaultFillColor = config && config.defaultFillColor,
      defaultStrokeColor = config && config.defaultStrokeColor,
      defaultLabelColor = config && config.defaultLabelColor;

  function shapeStyle(attrs) {
    return styles.computeStyle(attrs, {
      strokeLinecap: 'round',
      strokeLinejoin: 'round',
      stroke: black,
      strokeWidth: 2,
      fill: 'white'
    });
  }

  function lineStyle(attrs) {
    return styles.computeStyle(attrs, [ 'no-fill' ], {
      strokeLinecap: 'round',
      strokeLinejoin: 'round',
      stroke: black,
      strokeWidth: 2
    });
  }

  function addMarker(id, options) {
    var {
      ref = { x: 0, y: 0 },
      scale = 1,
      element,
      parentGfx = canvas._svg
    } = options;

    var marker = svgCreate('marker', {
      id: id,
      viewBox: '0 0 20 20',
      refX: ref.x,
      refY: ref.y,
      markerWidth: 20 * scale,
      markerHeight: 20 * scale,
      orient: 'auto'
    });

    svgAppend(marker, element);

    var defs = domQuery(':scope > defs', parentGfx);

    if (!defs) {
      defs = svgCreate('defs');

      svgAppend(parentGfx, defs);
    }

    svgAppend(defs, marker);
  }

  function marker(parentGfx, type, fill, stroke) {


    var id = markerIds.nextPrefixed('marker-');

    createMarker(parentGfx, id, type, fill, stroke);

    return 'url(#' + id + ')';
  }

  function createMarker(parentGfx, id, type, fill, stroke) {

    if (type === 'sequenceflow-end') {
      var sequenceflowEnd = svgCreate('path', {
        d: 'M 1 5 L 11 10 L 1 15 Z',
        ...shapeStyle({
          fill: stroke,
          stroke: stroke,
          strokeWidth: 1
        })
      });

      addMarker(id, {
        element: sequenceflowEnd,
        ref: { x: 11, y: 10 },
        scale: 0.5,
        parentGfx
      });
    }

    if (type === 'messageflow-start') {
      var messageflowStart = svgCreate('circle', {
        cx: 6,
        cy: 6,
        r: 3.5,
        ...shapeStyle({
          fill,
          stroke: stroke,
          strokeWidth: 1,

          // fix for safari / chrome / firefox bug not correctly
          // resetting stroke dash array
          strokeDasharray: [ 10000, 1 ]
        })
      });

      addMarker(id, {
        element: messageflowStart,
        ref: { x: 6, y: 6 },
        parentGfx
      });
    }

    if (type === 'messageflow-end') {
      var messageflowEnd = svgCreate('path', {
        d: 'm 1 5 l 0 -3 l 7 3 l -7 3 z',
        ...shapeStyle({
          fill,
          stroke: stroke,
          strokeWidth: 1,

          // fix for safari / chrome / firefox bug not correctly
          // resetting stroke dash array
          strokeDasharray: [ 10000, 1 ]
        })
      });

      addMarker(id, {
        element: messageflowEnd,
        ref: { x: 8.5, y: 5 },
        parentGfx
      });
    }

    if (type === 'association-start') {
      var associationStart = svgCreate('path', {
        d: 'M 11 5 L 1 10 L 11 15',
        ...lineStyle({
          fill: 'none',
          stroke,
          strokeWidth: 1.5,

          // fix for safari / chrome / firefox bug not correctly
          // resetting stroke dash array
          strokeDasharray: [ 10000, 1 ]
        })
      });

      addMarker(id, {
        element: associationStart,
        ref: { x: 1, y: 10 },
        scale: 0.5,
        parentGfx
      });
    }

    if (type === 'association-end') {
      var associationEnd = svgCreate('path', {
        d: 'M 1 5 L 11 10 L 1 15',
        ...lineStyle({
          fill: 'none',
          stroke,
          strokeWidth: 1.5,

          // fix for safari / chrome / firefox bug not correctly
          // resetting stroke dash array
          strokeDasharray: [ 10000, 1 ]
        })
      });

      addMarker(id, {
        element: associationEnd,
        ref: { x: 11, y: 10 },
        scale: 0.5,
        parentGfx
      });
    }

    if (type === 'conditional-flow-marker') {
      var conditionalFlowMarker = svgCreate('path', {
        d: 'M 0 10 L 8 6 L 16 10 L 8 14 Z',
        ...shapeStyle({
          fill,
          stroke: stroke
        })
      });

      addMarker(id, {
        element: conditionalFlowMarker,
        ref: { x: -1, y: 10 },
        scale: 0.5,
        parentGfx
      });
    }

    if (type === 'conditional-default-flow-marker') {
      var defaultFlowMarker = svgCreate('path', {
        d: 'M 6 4 L 10 16',
        ...shapeStyle({
          stroke: stroke,
          fill: 'none'
        })
      });

      addMarker(id, {
        element: defaultFlowMarker,
        ref: { x: 0, y: 10 },
        scale: 0.5,
        parentGfx
      });
    }
  }

  function drawCircle(parentGfx, width, height, offset, attrs = {}) {

    if (isObject(offset)) {
      attrs = offset;
      offset = 0;
    }

    offset = offset || 0;

    attrs = shapeStyle(attrs);

    var cx = width / 2,
        cy = height / 2;

    var circle = svgCreate('circle', {
      cx: cx,
      cy: cy,
      r: Math.round((width + height) / 4 - offset),
      ...attrs
    });

    svgAppend(parentGfx, circle);

    return circle;
  }

  function drawRect(parentGfx, width, height, r, offset, attrs) {

    if (isObject(offset)) {
      attrs = offset;
      offset = 0;
    }

    offset = offset || 0;

    attrs = shapeStyle(attrs);

    var rect = svgCreate('rect', {
      x: offset,
      y: offset,
      width: width - offset * 2,
      height: height - offset * 2,
      rx: r,
      ry: r,
      ...attrs
    });

    svgAppend(parentGfx, rect);

    return rect;
  }

  function drawDiamond(parentGfx, width, height, attrs) {

    var x_2 = width / 2;
    var y_2 = height / 2;

    var points = [
      { x: x_2, y: 0 },
      { x: width, y: y_2 },
      { x: x_2, y: height },
      { x: 0, y: y_2 }
    ];

    var pointsString = points.map(function(point) {
      return point.x + ',' + point.y;
    }).join(' ');

    attrs = shapeStyle(attrs);

    var polygon = svgCreate('polygon', {
      ...attrs,
      points: pointsString
    });

    svgAppend(parentGfx, polygon);

    return polygon;
  }

  /**
   * @param {SVGElement} parentGfx
   * @param {Point[]} waypoints
   * @param {any} attrs
   * @param {number} [radius]
   *
   * @return {SVGElement}
   */
  function drawLine(parentGfx, waypoints, attrs, radius) {
    attrs = lineStyle(attrs);

    var line = createLine(waypoints, attrs, radius);

    svgAppend(parentGfx, line);

    return line;
  }

  /**
   * @param {SVGElement} parentGfx
   * @param {Point[]} waypoints
   * @param {any} attrs
   *
   * @return {SVGElement}
   */
  function drawConnectionSegments(parentGfx, waypoints, attrs) {
    return drawLine(parentGfx, waypoints, attrs, 5);
  }

  function drawPath(parentGfx, d, attrs) {
    attrs = lineStyle(attrs);

    var path = svgCreate('path', {
      ...attrs,
      d
    });

    svgAppend(parentGfx, path);

    return path;
  }

  function drawMarker(type, parentGfx, path, attrs) {
    return drawPath(parentGfx, path, assign({ 'data-marker': type }, attrs));
  }

  function renderer(type) {
    return handlers[type];
  }

  function as(type) {
    return function(parentGfx, element, attrs) {
      return renderer(type)(parentGfx, element, attrs);
    };
  }

  var eventIconRenderers = {
    'bpmn:MessageEventDefinition': function(parentGfx, element, attrs = {}, isThrowing) {
      var pathData = pathMap.getScaledPath('EVENT_MESSAGE', {
        xScaleFactor: 0.9,
        yScaleFactor: 0.9,
        containerWidth: attrs.width || element.width,
        containerHeight: attrs.height || element.height,
        position: {
          mx: 0.235,
          my: 0.315
        }
      });

      var fill = isThrowing
        ? getStrokeColor(element, defaultStrokeColor, attrs.stroke)
        : getFillColor(element, defaultFillColor, attrs.fill);

      var stroke = isThrowing
        ? getFillColor(element, defaultFillColor, attrs.fill)
        : getStrokeColor(element, defaultStrokeColor, attrs.stroke);

      var messagePath = drawPath(parentGfx, pathData, {
        fill,
        stroke,
        strokeWidth: 1
      });

      return messagePath;
    },
    'bpmn:TimerEventDefinition': function(parentGfx, element, attrs = {}) {
      var baseWidth = attrs.width || element.width;
      var baseHeight = attrs.height || element.height;

      // use a lighter stroke for event suprocess icons
      var strokeWidth = attrs.width ? 1 : 2;

      var circle = drawCircle(parentGfx, baseWidth, baseHeight, 0.2 * baseHeight, {
        fill: getFillColor(element, defaultFillColor, attrs.fill),
        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),
        strokeWidth: strokeWidth
      });

      var pathData = pathMap.getScaledPath('EVENT_TIMER_WH', {
        xScaleFactor: 0.75,
        yScaleFactor: 0.75,
        containerWidth: baseWidth,
        containerHeight: baseHeight,
        position: {
          mx: 0.5,
          my: 0.5
        }
      });

      drawPath(parentGfx, pathData, {
        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),
        strokeWidth: strokeWidth
      });

      for (var i = 0; i < 12; i++) {
        var linePathData = pathMap.getScaledPath('EVENT_TIMER_LINE', {
          xScaleFactor: 0.75,
          yScaleFactor: 0.75,
          containerWidth: baseWidth,
          containerHeight: baseHeight,
          position: {
            mx: 0.5,
            my: 0.5
          }
        });

        var width = baseWidth / 2,
            height = baseHeight / 2;

        drawPath(parentGfx, linePathData, {
          strokeWidth: 1,
          stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),
          transform: 'rotate(' + (i * 30) + ',' + height + ',' + width + ')'
        });
      }

      return circle;
    },
    'bpmn:EscalationEventDefinition': function(parentGfx, event, attrs = {}, isThrowing) {
      var pathData = pathMap.getScaledPath('EVENT_ESCALATION', {
        xScaleFactor: 1,
        yScaleFactor: 1,
        containerWidth: attrs.width || event.width,
        containerHeight: attrs.height || event.height,
        position: {
          mx: 0.5,
          my: 0.2
        }
      });

      var fill = isThrowing
        ? getStrokeColor(event, defaultStrokeColor, attrs.stroke)
        : getFillColor(event, defaultFillColor, attrs.fill);

      return drawPath(parentGfx, pathData, {
        fill,
        stroke: getStrokeColor(event, defaultStrokeColor, attrs.stroke),
        strokeWidth: 1
      });
    },
    'bpmn:ConditionalEventDefinition': function(parentGfx, event, attrs = {}) {
      var pathData = pathMap.getScaledPath('EVENT_CONDITIONAL', {
        xScaleFactor: 1,
        yScaleFactor: 1,
        containerWidth: attrs.width || event.width,
        containerHeight: attrs.height || event.height,
        position: {
          mx: 0.5,
          my: 0.222
        }
      });

      return drawPath(parentGfx, pathData, {
        fill: getFillColor(event, defaultFillColor, attrs.fill),
        stroke: getStrokeColor(event, defaultStrokeColor, attrs.stroke),
        strokeWidth: 1
      });
    },
    'bpmn:LinkEventDefinition': function(parentGfx, event, attrs = {}, isThrowing) {
      var pathData = pathMap.getScaledPath('EVENT_LINK', {
        xScaleFactor: 1,
        yScaleFactor: 1,
        containerWidth: event.width,
        containerHeight: event.height,
        position: {
          mx: 0.57,
          my: 0.263
        }
      });

      var fill = isThrowing
        ? getStrokeColor(event, defaultStrokeColor, attrs.stroke)
        : getFillColor(event, defaultFillColor, attrs.fill);

      return drawPath(parentGfx, pathData, {
        fill,
        stroke: getStrokeColor(event, defaultStrokeColor, attrs.stroke),
        strokeWidth: 1
      });
    },
    'bpmn:ErrorEventDefinition': function(parentGfx, event, attrs = {}, isThrowing) {
      var pathData = pathMap.getScaledPath('EVENT_ERROR', {
        xScaleFactor: 1.1,
        yScaleFactor: 1.1,
        containerWidth: attrs.width || event.width,
        containerHeight: attrs.height || event.height,
        position: {
          mx: 0.2,
          my: 0.722
        }
      });

      var fill = isThrowing
        ? getStrokeColor(event, defaultStrokeColor, attrs.stroke)
        : getFillColor(event, defaultFillColor, attrs.fill);

      return drawPath(parentGfx, pathData, {
        fill,
        stroke: getStrokeColor(event, defaultStrokeColor, attrs.stroke),
        strokeWidth: 1
      });
    },
    'bpmn:CancelEventDefinition': function(parentGfx, event, attrs = {}, isThrowing) {
      var pathData = pathMap.getScaledPath('EVENT_CANCEL_45', {
        xScaleFactor: 1.0,
        yScaleFactor: 1.0,
        containerWidth: event.width,
        containerHeight: event.height,
        position: {
          mx: 0.638,
          my: -0.055
        }
      });

      var fill = isThrowing ? getStrokeColor(event, defaultStrokeColor, attrs.stroke) : 'none';

      var path = drawPath(parentGfx, pathData, {
        fill,
        stroke: getStrokeColor(event, defaultStrokeColor, attrs.stroke),
        strokeWidth: 1
      });

      rotate(path, 45);

      return path;
    },
    'bpmn:CompensateEventDefinition': function(parentGfx, event, attrs = {}, isThrowing) {
      var pathData = pathMap.getScaledPath('EVENT_COMPENSATION', {
        xScaleFactor: 1,
        yScaleFactor: 1,
        containerWidth: attrs.width || event.width,
        containerHeight: attrs.height || event.height,
        position: {
          mx: 0.22,
          my: 0.5
        }
      });

      var fill = isThrowing
        ? getStrokeColor(event, defaultStrokeColor, attrs.stroke)
        : getFillColor(event, defaultFillColor, attrs.fill);

      return drawPath(parentGfx, pathData, {
        fill,
        stroke: getStrokeColor(event, defaultStrokeColor, attrs.stroke),
        strokeWidth: 1
      });
    },
    'bpmn:SignalEventDefinition': function(parentGfx, event, attrs = {}, isThrowing) {
      var pathData = pathMap.getScaledPath('EVENT_SIGNAL', {
        xScaleFactor: 0.9,
        yScaleFactor: 0.9,
        containerWidth: attrs.width || event.width,
        containerHeight: attrs.height || event.height,
        position: {
          mx: 0.5,
          my: 0.2
        }
      });

      var fill = isThrowing
        ? getStrokeColor(event, defaultStrokeColor, attrs.stroke)
        : getFillColor(event, defaultFillColor, attrs.fill);

      return drawPath(parentGfx, pathData, {
        strokeWidth: 1,
        fill,
        stroke: getStrokeColor(event, defaultStrokeColor, attrs.stroke)
      });
    },
    'bpmn:MultipleEventDefinition': function(parentGfx, event, attrs = {}, isThrowing) {
      var pathData = pathMap.getScaledPath('EVENT_MULTIPLE', {
        xScaleFactor: 1.1,
        yScaleFactor: 1.1,
        containerWidth: attrs.width || event.width,
        containerHeight: attrs.height || event.height,
        position: {
          mx: 0.211,
          my: 0.36
        }
      });

      var fill = isThrowing
        ? getStrokeColor(event, defaultStrokeColor, attrs.stroke)
        : getFillColor(event, defaultFillColor, attrs.fill);

      return drawPath(parentGfx, pathData, {
        fill,
        stroke: getStrokeColor(event, defaultStrokeColor, attrs.stroke),
        strokeWidth: 1
      });
    },
    'bpmn:ParallelMultipleEventDefinition': function(parentGfx, event, attrs = {}) {
      var pathData = pathMap.getScaledPath('EVENT_PARALLEL_MULTIPLE', {
        xScaleFactor: 1.2,
        yScaleFactor: 1.2,
        containerWidth: attrs.width || event.width,
        containerHeight: attrs.height || event.height,
        position: {
          mx: 0.458,
          my: 0.194
        }
      });

      return drawPath(parentGfx, pathData, {
        fill: getFillColor(event, defaultFillColor, attrs.fill),
        stroke: getStrokeColor(event, defaultStrokeColor, attrs.stroke),
        strokeWidth: 1
      });
    },
    'bpmn:TerminateEventDefinition': function(parentGfx, element, attrs = {}) {
      var circle = drawCircle(parentGfx, element.width, element.height, 8, {
        fill: getStrokeColor(element, defaultStrokeColor, attrs.stroke),
        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),
        strokeWidth: 4
      });

      return circle;
    }
  };

  function renderEventIcon(element, parentGfx, attrs = {}, proxyElement) {
    var semantic = getSemantic(element),
        isThrowing = isThrowEvent(semantic);

    var nodeElement = proxyElement || element;

    if (semantic.get('eventDefinitions') && semantic.get('eventDefinitions').length > 1) {
      if (semantic.get('parallelMultiple')) {
        return eventIconRenderers[ 'bpmn:ParallelMultipleEventDefinition' ](parentGfx, nodeElement, attrs, isThrowing);
      }
      else {
        return eventIconRenderers[ 'bpmn:MultipleEventDefinition' ](parentGfx, nodeElement, attrs, isThrowing);
      }
    }

    if (isTypedEvent(semantic, 'bpmn:MessageEventDefinition')) {
      return eventIconRenderers[ 'bpmn:MessageEventDefinition' ](parentGfx, nodeElement, attrs, isThrowing);
    }

    if (isTypedEvent(semantic, 'bpmn:TimerEventDefinition')) {
      return eventIconRenderers[ 'bpmn:TimerEventDefinition' ](parentGfx, nodeElement, attrs, isThrowing);
    }

    if (isTypedEvent(semantic, 'bpmn:ConditionalEventDefinition')) {
      return eventIconRenderers[ 'bpmn:ConditionalEventDefinition' ](parentGfx, nodeElement, attrs, isThrowing);
    }

    if (isTypedEvent(semantic, 'bpmn:SignalEventDefinition')) {
      return eventIconRenderers[ 'bpmn:SignalEventDefinition' ](parentGfx, nodeElement, attrs, isThrowing);
    }

    if (isTypedEvent(semantic, 'bpmn:EscalationEventDefinition')) {
      return eventIconRenderers[ 'bpmn:EscalationEventDefinition' ](parentGfx, nodeElement, attrs, isThrowing);
    }

    if (isTypedEvent(semantic, 'bpmn:LinkEventDefinition')) {
      return eventIconRenderers[ 'bpmn:LinkEventDefinition' ](parentGfx, nodeElement, attrs, isThrowing);
    }

    if (isTypedEvent(semantic, 'bpmn:ErrorEventDefinition')) {
      return eventIconRenderers[ 'bpmn:ErrorEventDefinition' ](parentGfx, nodeElement, attrs, isThrowing);
    }

    if (isTypedEvent(semantic, 'bpmn:CancelEventDefinition')) {
      return eventIconRenderers[ 'bpmn:CancelEventDefinition' ](parentGfx, nodeElement, attrs, isThrowing);
    }

    if (isTypedEvent(semantic, 'bpmn:CompensateEventDefinition')) {
      return eventIconRenderers[ 'bpmn:CompensateEventDefinition' ](parentGfx, nodeElement, attrs, isThrowing);
    }

    if (isTypedEvent(semantic, 'bpmn:TerminateEventDefinition')) {
      return eventIconRenderers[ 'bpmn:TerminateEventDefinition' ](parentGfx, nodeElement, attrs, isThrowing);
    }

    return null;
  }

  var taskMarkerRenderers = {
    'ParticipantMultiplicityMarker': function(parentGfx, element, attrs = {}) {
      var width = getWidth(element, attrs),
          height = getHeight(element, attrs);

      var markerPath = pathMap.getScaledPath('MARKER_PARALLEL', {
        xScaleFactor: 1,
        yScaleFactor: 1,
        containerWidth: width,
        containerHeight: height,
        position: {
          mx: ((width / 2 - 6) / width),
          my: (height - 15) / height
        }
      });

      drawMarker('participant-multiplicity', parentGfx, markerPath, {
        strokeWidth: 2,
        fill: getFillColor(element, defaultFillColor, attrs.fill),
        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke)
      });
    },
    'SubProcessMarker': function(parentGfx, element, attrs = {}) {
      var markerRect = drawRect(parentGfx, 14, 14, 0, {
        strokeWidth: 1,
        fill: getFillColor(element, defaultFillColor, attrs.fill),
        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke)
      });

      translate(markerRect, element.width / 2 - 7.5, element.height - 20);

      var markerPath = pathMap.getScaledPath('MARKER_SUB_PROCESS', {
        xScaleFactor: 1.5,
        yScaleFactor: 1.5,
        containerWidth: element.width,
        containerHeight: element.height,
        position: {
          mx: (element.width / 2 - 7.5) / element.width,
          my: (element.height - 20) / element.height
        }
      });

      drawMarker('sub-process', parentGfx, markerPath, {
        fill: getFillColor(element, defaultFillColor, attrs.fill),
        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke)
      });
    },
    'ParallelMarker': function(parentGfx, element, attrs) {
      var width = getWidth(element, attrs),
          height = getHeight(element, attrs);

      var markerPath = pathMap.getScaledPath('MARKER_PARALLEL', {
        xScaleFactor: 1,
        yScaleFactor: 1,
        containerWidth: width,
        containerHeight: height,
        position: {
          mx: ((width / 2 + attrs.parallel) / width),
          my: (height - 20) / height
        }
      });

      drawMarker('parallel', parentGfx, markerPath, {
        fill: getFillColor(element, defaultFillColor, attrs.fill),
        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke)
      });
    },
    'SequentialMarker': function(parentGfx, element, attrs) {
      var markerPath = pathMap.getScaledPath('MARKER_SEQUENTIAL', {
        xScaleFactor: 1,
        yScaleFactor: 1,
        containerWidth: element.width,
        containerHeight: element.height,
        position: {
          mx: ((element.width / 2 + attrs.seq) / element.width),
          my: (element.height - 19) / element.height
        }
      });

      drawMarker('sequential', parentGfx, markerPath, {
        fill: getFillColor(element, defaultFillColor, attrs.fill),
        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke)
      });
    },
    'CompensationMarker': function(parentGfx, element, attrs) {
      var markerMath = pathMap.getScaledPath('MARKER_COMPENSATION', {
        xScaleFactor: 1,
        yScaleFactor: 1,
        containerWidth: element.width,
        containerHeight: element.height,
        position: {
          mx: ((element.width / 2 + attrs.compensation) / element.width),
          my: (element.height - 13) / element.height
        }
      });

      drawMarker('compensation', parentGfx, markerMath, {
        strokeWidth: 1,
        fill: getFillColor(element, defaultFillColor, attrs.fill),
        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke)
      });
    },
    'LoopMarker': function(parentGfx, element, attrs) {
      var width = getWidth(element, attrs),
          height = getHeight(element, attrs);

      var markerPath = pathMap.getScaledPath('MARKER_LOOP', {
        xScaleFactor: 1,
        yScaleFactor: 1,
        containerWidth: width,
        containerHeight: height,
        position: {
          mx: ((width / 2 + attrs.loop) / width),
          my: (height - 7) / height
        }
      });

      drawMarker('loop', parentGfx, markerPath, {
        strokeWidth: 1.5,
        fill: 'none',
        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),
        strokeMiterlimit: 0.5
      });
    },
    'AdhocMarker': function(parentGfx, element, attrs) {
      var width = getWidth(element, attrs),
          height = getHeight(element, attrs);

      var markerPath = pathMap.getScaledPath('MARKER_ADHOC', {
        xScaleFactor: 1,
        yScaleFactor: 1,
        containerWidth: width,
        containerHeight: height,
        position: {
          mx: ((width / 2 + attrs.adhoc) / width),
          my: (height - 15) / height
        }
      });

      drawMarker('adhoc', parentGfx, markerPath, {
        strokeWidth: 1,
        fill: getStrokeColor(element, defaultStrokeColor, attrs.stroke),
        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke)
      });
    }
  };

  function renderTaskMarker(type, parentGfx, element, attrs) {
    taskMarkerRenderers[ type ](parentGfx, element, attrs);
  }

  function renderTaskMarkers(parentGfx, element, taskMarkers = [], attrs = {}) {
    attrs = {
      fill: attrs.fill,
      stroke: attrs.stroke,
      width: getWidth(element, attrs),
      height: getHeight(element, attrs)
    };

    var semantic = getSemantic(element);

    var subprocess = taskMarkers.includes('SubProcessMarker');

    if (subprocess) {
      attrs = {
        ...attrs,
        seq: -21,
        parallel: -22,
        compensation: -25,
        loop: -18,
        adhoc: 10
      };
    } else {
      attrs = {
        ...attrs,
        seq: -5,
        parallel: -6,
        compensation: -7,
        loop: 0,
        adhoc: -8
      };
    }

    if (semantic.get('isForCompensation')) {
      taskMarkers.push('CompensationMarker');
    }

    if (is(semantic, 'bpmn:AdHocSubProcess')) {
      taskMarkers.push('AdhocMarker');

      if (!subprocess) {
        assign(attrs, { compensation: attrs.compensation - 18 });
      }
    }

    var loopCharacteristics = semantic.get('loopCharacteristics'),
        isSequential = loopCharacteristics && loopCharacteristics.get('isSequential');

    if (loopCharacteristics) {

      assign(attrs, {
        compensation: attrs.compensation - 18,
      });

      if (taskMarkers.includes('AdhocMarker')) {
        assign(attrs, {
          seq: -23,
          loop: -18,
          parallel: -24
        });
      }

      if (isSequential === undefined) {
        taskMarkers.push('LoopMarker');
      }

      if (isSequential === false) {
        taskMarkers.push('ParallelMarker');
      }

      if (isSequential === true) {
        taskMarkers.push('SequentialMarker');
      }
    }

    if (taskMarkers.includes('CompensationMarker') && taskMarkers.length === 1) {
      assign(attrs, {
        compensation: -8
      });
    }

    forEach(taskMarkers, function(marker) {
      renderTaskMarker(marker, parentGfx, element, attrs);
    });
  }

  function renderLabel(parentGfx, label, attrs = {}) {
    attrs = assign({
      size: {
        width: 100
      }
    }, attrs);

    var text = textRenderer.createText(label || '', attrs);

    svgClasses(text).add('djs-label');

    svgAppend(parentGfx, text);

    return text;
  }

  function renderEmbeddedLabel(parentGfx, element, align, attrs = {}) {
    var semantic = getSemantic(element);

    var box = getBounds({
      x: element.x,
      y: element.y,
      width: element.width,
      height: element.height
    }, attrs);

    return renderLabel(parentGfx, semantic.name, {
      align,
      box,
      padding: 7,
      style: {
        fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor, attrs.stroke)
      }
    });
  }

  function renderExternalLabel(parentGfx, element, attrs = {}) {
    var box = {
      width: 90,
      height: 30,
      x: element.width / 2 + element.x,
      y: element.height / 2 + element.y
    };

    return renderLabel(parentGfx, getLabel(element), {
      box: box,
      fitBox: true,
      style: assign(
        {},
        textRenderer.getExternalStyle(),
        {
          fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor, attrs.stroke)
        }
      )
    });
  }

  function renderLaneLabel(parentGfx, text, element, attrs = {}) {
    var isHorizontalLane = isHorizontal(element);

    var textBox = renderLabel(parentGfx, text, {
      box: {
        height: 30,
        width: isHorizontalLane ? getHeight(element, attrs) : getWidth(element, attrs),
      },
      align: 'center-middle',
      style: {
        fill: getLabelColor(element, defaultLabelColor, defaultStrokeColor, attrs.stroke)
      }
    });

    if (isHorizontalLane) {
      var top = -1 * getHeight(element, attrs);
      transform(textBox, 0, -top, 270);
    }
  }

  function renderActivity(parentGfx, element, attrs = {}) {
    var {
      width,
      height
    } = getBounds(element, attrs);

    return drawRect(parentGfx, width, height, TASK_BORDER_RADIUS, {
      ...attrs,
      fill: getFillColor(element, defaultFillColor, attrs.fill),
      fillOpacity: DEFAULT_OPACITY,
      stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke)
    });
  }

  function renderAssociation(parentGfx, element, attrs = {}) {
    var semantic = getSemantic(element);

    var fill = getFillColor(element, defaultFillColor, attrs.fill),
        stroke = getStrokeColor(element, defaultStrokeColor, attrs.stroke);

    if (semantic.get('associationDirection') === 'One' ||
        semantic.get('associationDirection') === 'Both') {
      attrs.markerEnd = marker(parentGfx, 'association-end', fill, stroke);
    }

    if (semantic.get('associationDirection') === 'Both') {
      attrs.markerStart = marker(parentGfx, 'association-start', fill, stroke);
    }

    attrs = pickAttrs(attrs, [
      'markerStart',
      'markerEnd'
    ]);

    return drawConnectionSegments(parentGfx, element.waypoints, {
      ...attrs,
      stroke,
      strokeDasharray: '0, 5'
    });
  }

  function renderDataObject(parentGfx, element, attrs = {}) {
    var fill = getFillColor(element, defaultFillColor, attrs.fill),
        stroke = getStrokeColor(element, defaultStrokeColor, attrs.stroke);

    var pathData = pathMap.getScaledPath('DATA_OBJECT_PATH', {
      xScaleFactor: 1,
      yScaleFactor: 1,
      containerWidth: element.width,
      containerHeight: element.height,
      position: {
        mx: 0.474,
        my: 0.296
      }
    });

    var dataObject = drawPath(parentGfx, pathData, {
      fill,
      fillOpacity: DEFAULT_OPACITY,
      stroke
    });

    var semantic = getSemantic(element);

    if (isCollection(semantic)) {
      var collectionPathData = pathMap.getScaledPath('DATA_OBJECT_COLLECTION_PATH', {
        xScaleFactor: 1,
        yScaleFactor: 1,
        containerWidth: element.width,
        containerHeight: element.height,
        position: {
          mx: 0.33,
          my: (element.height - 18) / element.height
        }
      });

      drawPath(parentGfx, collectionPathData, {
        strokeWidth: 2,
        fill,
        stroke
      });
    }

    return dataObject;
  }

  function renderEvent(parentGfx, element, attrs = {}) {
    return drawCircle(parentGfx, element.width, element.height, {
      fillOpacity: DEFAULT_OPACITY,
      ...attrs,
      fill: getFillColor(element, defaultFillColor, attrs.fill),
      stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke)
    });
  }

  function renderGateway(parentGfx, element, attrs = {}) {
    return drawDiamond(parentGfx, element.width, element.height, {
      fill: getFillColor(element, defaultFillColor, attrs.fill),
      fillOpacity: DEFAULT_OPACITY,
      stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke)
    });
  }

  function renderLane(parentGfx, element, attrs = {}) {
    var lane = drawRect(parentGfx, getWidth(element, attrs), getHeight(element, attrs), 0, {
      fill: getFillColor(element, defaultFillColor, attrs.fill),
      fillOpacity: attrs.fillOpacity || DEFAULT_OPACITY,
      stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),
      strokeWidth: 1.5
    });

    var semantic = getSemantic(element);

    if (is(semantic, 'bpmn:Lane')) {
      var text = semantic.get('name');

      renderLaneLabel(parentGfx, text, element, attrs);
    }

    return lane;
  }

  function renderSubProcess(parentGfx, element, attrs = {}) {
    var activity = renderActivity(parentGfx, element, attrs);

    var expanded = isExpanded(element);

    if (isEventSubProcess(element)) {
      svgAttr(activity, {
        strokeDasharray: '0, 5.5',
        strokeWidth: 2.5
      });

      if (!expanded) {
        var flowElements = getSemantic(element).flowElements || [];
        var startEvents = flowElements.filter(e => is(e, 'bpmn:StartEvent'));

        if (startEvents.length === 1) {
          renderEventSubProcessIcon(startEvents[0], parentGfx, attrs, element);
        }
      }
    }

    renderEmbeddedLabel(parentGfx, element, expanded ? 'center-top' : 'center-middle', attrs);

    if (expanded) {
      renderTaskMarkers(parentGfx, element, undefined, attrs);
    } else {
      renderTaskMarkers(parentGfx, element, [ 'SubProcessMarker' ], attrs);
    }

    return activity;
  }

  function renderEventSubProcessIcon(startEvent, parentGfx, attrs, proxyElement) {
    var iconSize = 22;

    // match the colors of the enclosing subprocess
    var proxyAttrs = {
      fill: getFillColor(proxyElement, defaultFillColor, attrs.fill),
      stroke: getStrokeColor(proxyElement, defaultStrokeColor, attrs.stroke),
      width: iconSize,
      height: iconSize
    };

    var interrupting = getSemantic(startEvent).isInterrupting;
    var strokeDasharray = interrupting ? 0 : 3;

    // better visibility for non-interrupting events
    var strokeWidth = interrupting ? 1 : 1.2;

    // make the icon look larger by drawing a smaller circle
    var circleSize = 20;
    var shift = (iconSize - circleSize) / 2;
    var transform = 'translate(' + shift + ',' + shift + ')';

    drawCircle(parentGfx, circleSize, circleSize, {
      fill: proxyAttrs.fill,
      stroke: proxyAttrs.stroke,
      strokeWidth,
      strokeDasharray,
      transform
    });

    renderEventIcon(startEvent, parentGfx, proxyAttrs, proxyElement);
  }

  function renderTask(parentGfx, element, attrs = {}) {
    var activity = renderActivity(parentGfx, element, attrs);

    renderEmbeddedLabel(parentGfx, element, 'center-middle', attrs);

    renderTaskMarkers(parentGfx, element, undefined, attrs);

    return activity;
  }

  var handlers = this.handlers = {
    'bpmn:AdHocSubProcess': function(parentGfx, element, attrs = {}) {
      if (isExpanded(element)) {
        attrs = pickAttrs(attrs, [
          'fill',
          'stroke',
          'width',
          'height'
        ]);
      } else {
        attrs = pickAttrs(attrs, [
          'fill',
          'stroke'
        ]);
      }

      return renderSubProcess(parentGfx, element, attrs);
    },
    'bpmn:Association': function(parentGfx, element, attrs = {}) {
      attrs = pickAttrs(attrs, [
        'fill',
        'stroke'
      ]);

      return renderAssociation(parentGfx, element, attrs);
    },
    'bpmn:BoundaryEvent': function(parentGfx, element, attrs = {}) {
      var { renderIcon = true } = attrs;

      attrs = pickAttrs(attrs, [
        'fill',
        'stroke'
      ]);

      var semantic = getSemantic(element),
          cancelActivity = semantic.get('cancelActivity');

      attrs = {
        strokeWidth: 1.5,
        fill: getFillColor(element, defaultFillColor, attrs.fill),
        fillOpacity: FULL_OPACITY,
        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke)
      };

      if (!cancelActivity) {
        attrs.strokeDasharray = '6';
      }

      var event = renderEvent(parentGfx, element, attrs);

      drawCircle(parentGfx, element.width, element.height, INNER_OUTER_DIST, {
        ...attrs,
        fill: 'none'
      });

      if (renderIcon) {
        renderEventIcon(element, parentGfx, attrs);
      }

      return event;
    },
    'bpmn:BusinessRuleTask': function(parentGfx, element, attrs = {}) {
      attrs = pickAttrs(attrs, [
        'fill',
        'stroke'
      ]);

      var task = renderTask(parentGfx, element, attrs);

      var headerData = pathMap.getScaledPath('TASK_TYPE_BUSINESS_RULE_MAIN', {
        abspos: {
          x: 8,
          y: 8
        }
      });

      var businessPath = drawPath(parentGfx, headerData);

      svgAttr(businessPath, {
        fill: getFillColor(element, defaultFillColor, attrs.fill),
        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),
        strokeWidth: 1
      });

      var headerPathData = pathMap.getScaledPath('TASK_TYPE_BUSINESS_RULE_HEADER', {
        abspos: {
          x: 8,
          y: 8
        }
      });

      var businessHeaderPath = drawPath(parentGfx, headerPathData);

      svgAttr(businessHeaderPath, {
        fill: getStrokeColor(element, defaultStrokeColor, attrs.stroke),
        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),
        strokeWidth: 1
      });

      return task;
    },
    'bpmn:CallActivity': function(parentGfx, element, attrs = {}) {
      attrs = pickAttrs(attrs, [
        'fill',
        'stroke'
      ]);

      return renderSubProcess(parentGfx, element, {
        strokeWidth: 5,
        ...attrs
      });
    },
    'bpmn:ComplexGateway': function(parentGfx, element, attrs = {}) {
      attrs = pickAttrs(attrs, [
        'fill',
        'stroke'
      ]);

      var gateway = renderGateway(parentGfx, element, attrs);

      var pathData = pathMap.getScaledPath('GATEWAY_COMPLEX', {
        xScaleFactor: 0.5,
        yScaleFactor:0.5,
        containerWidth: element.width,
        containerHeight: element.height,
        position: {
          mx: 0.46,
          my: 0.26
        }
      });

      drawPath(parentGfx, pathData, {
        fill: getStrokeColor(element, defaultStrokeColor, attrs.stroke),
        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),
        strokeWidth: 1
      });

      return gateway;
    },
    'bpmn:DataInput': function(parentGfx, element, attrs = {}) {
      attrs = pickAttrs(attrs, [
        'fill',
        'stroke'
      ]);

      var arrowPathData = pathMap.getRawPath('DATA_ARROW');

      var dataObject = renderDataObject(parentGfx, element, attrs);

      drawPath(parentGfx, arrowPathData, {
        fill: 'none',
        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),
        strokeWidth: 1
      });

      return dataObject;
    },
    'bpmn:DataInputAssociation': function(parentGfx, element, attrs = {}) {
      attrs = pickAttrs(attrs, [
        'fill',
        'stroke'
      ]);

      return renderAssociation(parentGfx, element, {
        ...attrs,
        markerEnd: marker(parentGfx, 'association-end', getFillColor(element, defaultFillColor, attrs.fill), getStrokeColor(element, defaultStrokeColor, attrs.stroke))
      });
    },
    'bpmn:DataObject': function(parentGfx, element, attrs = {}) {
      attrs = pickAttrs(attrs, [
        'fill',
        'stroke'
      ]);

      return renderDataObject(parentGfx, element, attrs);
    },
    'bpmn:DataObjectReference': as('bpmn:DataObject'),
    'bpmn:DataOutput': function(parentGfx, element, attrs = {}) {
      attrs = pickAttrs(attrs, [
        'fill',
        'stroke'
      ]);

      var arrowPathData = pathMap.getRawPath('DATA_ARROW');

      var dataObject = renderDataObject(parentGfx, element, attrs);

      drawPath(parentGfx, arrowPathData, {
        strokeWidth: 1,
        fill: getFillColor(element, defaultFillColor, attrs.fill),
        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke)
      });

      return dataObject;
    },
    'bpmn:DataOutputAssociation': function(parentGfx, element, attrs = {}) {
      attrs = pickAttrs(attrs, [
        'fill',
        'stroke'
      ]);

      return renderAssociation(parentGfx, element, {
        ...attrs,
        markerEnd: marker(parentGfx, 'association-end', getFillColor(element, defaultFillColor, attrs.fill), getStrokeColor(element, defaultStrokeColor, attrs.stroke))
      });
    },
    'bpmn:DataStoreReference': function(parentGfx, element, attrs = {}) {
      attrs = pickAttrs(attrs, [
        'fill',
        'stroke'
      ]);

      var dataStorePath = pathMap.getScaledPath('DATA_STORE', {
        xScaleFactor: 1,
        yScaleFactor: 1,
        containerWidth: element.width,
        containerHeight: element.height,
        position: {
          mx: 0,
          my: 0.133
        }
      });

      return drawPath(parentGfx, dataStorePath, {
        fill: getFillColor(element, defaultFillColor, attrs.fill),
        fillOpacity: DEFAULT_OPACITY,
        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),
        strokeWidth: 2
      });
    },
    'bpmn:EndEvent': function(parentGfx, element, attrs = {}) {
      var { renderIcon = true } = attrs;

      attrs = pickAttrs(attrs, [
        'fill',
        'stroke'
      ]);

      var event = renderEvent(parentGfx, element, {
        ...attrs,
        strokeWidth: 4
      });

      if (renderIcon) {
        renderEventIcon(element, parentGfx, attrs);
      }

      return event;
    },
    'bpmn:EventBasedGateway': function(parentGfx, element, attrs = {}) {
      attrs = pickAttrs(attrs, [
        'fill',
        'stroke'
      ]);

      var semantic = getSemantic(element);

      var diamond = renderGateway(parentGfx, element, attrs);

      drawCircle(parentGfx, element.width, element.height, element.height * 0.20, {
        fill: getFillColor(element, 'none', attrs.fill),
        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),
        strokeWidth: 1
      });

      var type = semantic.get('eventGatewayType'),
          instantiate = !!semantic.get('instantiate');

      function drawEvent() {

        var pathData = pathMap.getScaledPath('GATEWAY_EVENT_BASED', {
          xScaleFactor: 0.18,
          yScaleFactor: 0.18,
          containerWidth: element.width,
          containerHeight: element.height,
          position: {
            mx: 0.36,
            my: 0.44
          }
        });

        drawPath(parentGfx, pathData, {
          fill: 'none',
          stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),
          strokeWidth: 2
        });
      }

      if (type === 'Parallel') {
        var pathData = pathMap.getScaledPath('GATEWAY_PARALLEL', {
          xScaleFactor: 0.4,
          yScaleFactor: 0.4,
          containerWidth: element.width,
          containerHeight: element.height,
          position: {
            mx: 0.474,
            my: 0.296
          }
        });

        drawPath(parentGfx, pathData, {
          fill: 'none',
          stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),
          strokeWidth: 1
        });
      } else if (type === 'Exclusive') {
        if (!instantiate) {
          drawCircle(parentGfx, element.width, element.height, element.height * 0.26, {
            fill: 'none',
            stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),
            strokeWidth: 1
          });
        }

        drawEvent();
      }


      return diamond;
    },
    'bpmn:ExclusiveGateway': function(parentGfx, element, attrs = {}) {
      attrs = pickAttrs(attrs, [
        'fill',
        'stroke'
      ]);

      var gateway = renderGateway(parentGfx, element, attrs);

      var pathData = pathMap.getScaledPath('GATEWAY_EXCLUSIVE', {
        xScaleFactor: 0.4,
        yScaleFactor: 0.4,
        containerWidth: element.width,
        containerHeight: element.height,
        position: {
          mx: 0.32,
          my: 0.3
        }
      });

      var di = getDi(element);

      if (di.get('isMarkerVisible')) {
        drawPath(parentGfx, pathData, {
          fill: getStrokeColor(element, defaultStrokeColor, attrs.stroke),
          stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),
          strokeWidth: 1
        });
      }

      return gateway;
    },
    'bpmn:Gateway': function(parentGfx, element, attrs = {}) {
      attrs = pickAttrs(attrs, [
        'fill',
        'stroke'
      ]);

      return renderGateway(parentGfx, element, attrs);
    },
    'bpmn:Group': function(parentGfx, element, attrs = {}) {
      attrs = pickAttrs(attrs, [
        'fill',
        'stroke',
        'width',
        'height'
      ]);

      return drawRect(parentGfx, element.width, element.height, TASK_BORDER_RADIUS, {
        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),
        strokeWidth: 1.5,
        strokeDasharray: '10, 6, 0, 6',
        fill: 'none',
        pointerEvents: 'none',
        width: getWidth(element, attrs),
        height: getHeight(element, attrs)
      });
    },
    'bpmn:InclusiveGateway': function(parentGfx, element, attrs = {}) {
      attrs = pickAttrs(attrs, [
        'fill',
        'stroke'
      ]);

      var gateway = renderGateway(parentGfx, element, attrs);

      drawCircle(parentGfx, element.width, element.height, element.height * 0.24, {
        fill: getFillColor(element, defaultFillColor, attrs.fill),
        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),
        strokeWidth: 2.5
      });

      return gateway;
    },
    'bpmn:IntermediateEvent': function(parentGfx, element, attrs = {}) {
      var { renderIcon = true } = attrs;

      attrs = pickAttrs(attrs, [
        'fill',
        'stroke'
      ]);

      var outer = renderEvent(parentGfx, element, {
        ...attrs,
        strokeWidth: 1.5
      });

      drawCircle(parentGfx, element.width, element.height, INNER_OUTER_DIST, {
        fill: 'none',
        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),
        strokeWidth: 1.5
      });

      if (renderIcon) {
        renderEventIcon(element, parentGfx, attrs);
      }

      return outer;
    },
    'bpmn:IntermediateCatchEvent': as('bpmn:IntermediateEvent'),
    'bpmn:IntermediateThrowEvent': as('bpmn:IntermediateEvent'),
    'bpmn:Lane': function(parentGfx, element, attrs = {}) {
      attrs = pickAttrs(attrs, [
        'fill',
        'stroke',
        'width',
        'height'
      ]);

      return renderLane(parentGfx, element, {
        ...attrs,
        fillOpacity: LOW_OPACITY
      });
    },
    'bpmn:ManualTask': function(parentGfx, element, attrs = {}) {
      attrs = pickAttrs(attrs, [
        'fill',
        'stroke'
      ]);

      var task = renderTask(parentGfx, element, attrs);

      var pathData = pathMap.getScaledPath('TASK_TYPE_MANUAL', {
        abspos: {
          x: 17,
          y: 15
        }
      });

      drawPath(parentGfx, pathData, {
        fill: getFillColor(element, defaultFillColor, attrs.fill),
        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),
        strokeWidth: 0.5
      });

      return task;
    },
    'bpmn:MessageFlow': function(parentGfx, element, attrs = {}) {
      attrs = pickAttrs(attrs, [
        'fill',
        'stroke'
      ]);

      var semantic = getSemantic(element),
          di = getDi(element);

      var fill = getFillColor(element, defaultFillColor, attrs.fill),
          stroke = getStrokeColor(element, defaultStrokeColor, attrs.stroke);

      var path = drawConnectionSegments(parentGfx, element.waypoints, {
        markerEnd: marker(parentGfx, 'messageflow-end', fill, stroke),
        markerStart: marker(parentGfx, 'messageflow-start', fill, stroke),
        stroke,
        strokeDasharray: '10, 11',
        strokeWidth: 1.5
      });

      if (semantic.get('messageRef')) {
        var midPoint = path.getPointAtLength(path.getTotalLength() / 2);

        var markerPathData = pathMap.getScaledPath('MESSAGE_FLOW_MARKER', {
          abspos: {
            x: midPoint.x,
            y: midPoint.y
          }
        });

        var messageAttrs = {
          strokeWidth: 1
        };

        if (di.get('messageVisibleKind') === 'initiating') {
          messageAttrs.fill = fill;
          messageAttrs.stroke = stroke;
        } else {
          messageAttrs.fill = stroke;
          messageAttrs.stroke = fill;
        }

        var message = drawPath(parentGfx, markerPathData, messageAttrs);

        var messageRef = semantic.get('messageRef'),
            name = messageRef.get('name');

        var label = renderLabel(parentGfx, name, {
          align: 'center-top',
          fitBox: true,
          style: {
            fill: stroke
          }
        });

        var messageBounds = message.getBBox(),
            labelBounds = label.getBBox();

        var translateX = midPoint.x - labelBounds.width / 2,
            translateY = midPoint.y + messageBounds.height / 2 + ELEMENT_LABEL_DISTANCE;

        transform(label, translateX, translateY, 0);
      }

      return path;
    },
    'bpmn:ParallelGateway': function(parentGfx, element, attrs = {}) {
      attrs = pickAttrs(attrs, [
        'fill',
        'stroke'
      ]);

      var diamond = renderGateway(parentGfx, element, attrs);

      var pathData = pathMap.getScaledPath('GATEWAY_PARALLEL', {
        xScaleFactor: 0.6,
        yScaleFactor: 0.6,
        containerWidth: element.width,
        containerHeight: element.height,
        position: {
          mx: 0.46,
          my: 0.2
        }
      });

      drawPath(parentGfx, pathData, {
        fill: getStrokeColor(element, defaultStrokeColor, attrs.stroke),
        stroke: getStrokeColor(element, defaultStrokeColor, attrs.stroke),
        strokeWidth: 1
      });

      return diamond;
    },
    'bpmn:Participant': function(parentGfx, element, attrs = {}) {
      attrs = pickAttrs(attrs, [
        'fill',
        'stroke',
        'width',
        'height'
      ]);

      var participant = renderLane(parentGfx, element, attrs);

      var expandedParticipant = isExpanded(element);
      var horizontalParticipant = isHorizontal(element);

      var semantic = getSemantic(element),
          name = semantic.get('name');

      if (expandedParticipant) {
        var waypoints = horizontalParticipant ? [
          {
            x: 30,
            y: 0
          },
          {
            x: 30,
            y: getHeight(element, attrs)
          }
        ] : [
          {
            x: 0,
            y: 30
          },
          {
            x: getWidth(element, attrs),
            y: 30
          }
        ];

        drawLine(parentGfx, waypo
Download .txt
gitextract_zf5udxc2/

├── .github/
│   ├── CONTRIBUTING.md
│   ├── ISSUE_TEMPLATE/
│   │   ├── BUG_REPORT.md
│   │   ├── FEATURE_REQUEST.md
│   │   ├── TASK.md
│   │   └── config.yml
│   ├── merge-me.yml
│   └── workflows/
│       ├── CI.yml
│       ├── CODE_SCANNING.yml
│       ├── COMMENT_TARGETS_MAIN.yml
│       ├── MERGE_MAIN_TO_DEVELOP.yml
│       ├── POST_RELEASE.yml
│       └── RELEASE.yml
├── .gitignore
├── .release-please-manifest.json
├── CHANGELOG.md
├── LICENSE
├── README.md
├── assets/
│   └── bpmn-js.css
├── docs/
│   ├── project/
│   │   ├── SETUP.md
│   │   ├── setup-alternative.sh
│   │   ├── setup.bat
│   │   └── setup.sh
│   └── translations.json
├── eslint.config.mjs
├── lib/
│   ├── BaseModeler.js
│   ├── BaseModeler.spec.ts
│   ├── BaseViewer.js
│   ├── BaseViewer.spec.ts
│   ├── Modeler.js
│   ├── Modeler.spec.ts
│   ├── NavigatedViewer.js
│   ├── NavigatedViewer.spec.ts
│   ├── Viewer.js
│   ├── Viewer.spec.ts
│   ├── core/
│   │   └── index.js
│   ├── draw/
│   │   ├── BpmnRenderUtil.js
│   │   ├── BpmnRenderer.js
│   │   ├── PathMap.js
│   │   ├── TextRenderer.js
│   │   ├── TextRenderer.spec.ts
│   │   └── index.js
│   ├── features/
│   │   ├── align-elements/
│   │   │   ├── AlignElementsContextPadProvider.js
│   │   │   ├── AlignElementsIcons.js
│   │   │   ├── AlignElementsMenuProvider.js
│   │   │   ├── BpmnAlignElements.js
│   │   │   └── index.js
│   │   ├── append-preview/
│   │   │   ├── AppendPreview.js
│   │   │   └── index.js
│   │   ├── auto-place/
│   │   │   ├── BpmnAutoPlace.js
│   │   │   ├── BpmnAutoPlaceUtil.js
│   │   │   └── index.js
│   │   ├── auto-resize/
│   │   │   ├── BpmnAutoResize.js
│   │   │   ├── BpmnAutoResizeProvider.js
│   │   │   └── index.js
│   │   ├── context-pad/
│   │   │   ├── ContextPadProvider.js
│   │   │   └── index.js
│   │   ├── copy-paste/
│   │   │   ├── BpmnCopyPaste.js
│   │   │   ├── ModdleCopy.js
│   │   │   └── index.js
│   │   ├── di-ordering/
│   │   │   ├── BpmnDiOrdering.js
│   │   │   └── index.js
│   │   ├── distribute-elements/
│   │   │   ├── BpmnDistributeElements.js
│   │   │   ├── DistributeElementsIcons.js
│   │   │   ├── DistributeElementsMenuProvider.js
│   │   │   └── index.js
│   │   ├── drilldown/
│   │   │   ├── DrilldownBreadcrumbs.js
│   │   │   ├── DrilldownCentering.js
│   │   │   ├── DrilldownOverlayBehavior.js
│   │   │   ├── SubprocessCompatibility.js
│   │   │   └── index.js
│   │   ├── editor-actions/
│   │   │   ├── BpmnEditorActions.js
│   │   │   └── index.js
│   │   ├── grid-snapping/
│   │   │   ├── BpmnGridSnapping.js
│   │   │   ├── behavior/
│   │   │   │   ├── GridSnappingAutoPlaceBehavior.js
│   │   │   │   ├── GridSnappingLayoutConnectionBehavior.js
│   │   │   │   ├── GridSnappingParticipantBehavior.js
│   │   │   │   └── index.js
│   │   │   └── index.js
│   │   ├── interaction-events/
│   │   │   ├── BpmnInteractionEvents.js
│   │   │   └── index.js
│   │   ├── keyboard/
│   │   │   ├── BpmnKeyboardBindings.js
│   │   │   └── index.js
│   │   ├── label-editing/
│   │   │   ├── LabelEditingPreview.js
│   │   │   ├── LabelEditingProvider.js
│   │   │   ├── LabelUtil.js
│   │   │   ├── cmd/
│   │   │   │   └── UpdateLabelHandler.js
│   │   │   └── index.js
│   │   ├── label-link/
│   │   │   ├── LabelLink.js
│   │   │   └── index.js
│   │   ├── modeling/
│   │   │   ├── BpmnFactory.js
│   │   │   ├── BpmnLayouter.js
│   │   │   ├── BpmnUpdater.js
│   │   │   ├── ElementFactory.js
│   │   │   ├── ElementFactory.test.ts
│   │   │   ├── Modeling.js
│   │   │   ├── Modeling.test.ts
│   │   │   ├── behavior/
│   │   │   │   ├── AdaptiveLabelPositioningBehavior.js
│   │   │   │   ├── AppendBehavior.js
│   │   │   │   ├── AssociationBehavior.js
│   │   │   │   ├── AttachEventBehavior.js
│   │   │   │   ├── BoundaryEventBehavior.js
│   │   │   │   ├── CompensateBoundaryEventBehavior.js
│   │   │   │   ├── CreateBehavior.js
│   │   │   │   ├── CreateDataObjectBehavior.js
│   │   │   │   ├── CreateParticipantBehavior.js
│   │   │   │   ├── DataInputAssociationBehavior.js
│   │   │   │   ├── DataStoreBehavior.js
│   │   │   │   ├── DeleteLaneBehavior.js
│   │   │   │   ├── DetachEventBehavior.js
│   │   │   │   ├── DropOnFlowBehavior.js
│   │   │   │   ├── EventBasedGatewayBehavior.js
│   │   │   │   ├── FixHoverBehavior.js
│   │   │   │   ├── GroupBehavior.js
│   │   │   │   ├── ImportDockingFix.js
│   │   │   │   ├── IsHorizontalFix.js
│   │   │   │   ├── LabelBehavior.js
│   │   │   │   ├── LayoutConnectionBehavior.js
│   │   │   │   ├── MessageFlowBehavior.js
│   │   │   │   ├── NonInterruptingBehavior.js
│   │   │   │   ├── RemoveElementBehavior.js
│   │   │   │   ├── RemoveEmbeddedLabelBoundsBehavior.js
│   │   │   │   ├── RemoveParticipantBehavior.js
│   │   │   │   ├── ReplaceConnectionBehavior.js
│   │   │   │   ├── ReplaceElementBehaviour.js
│   │   │   │   ├── ResizeBehavior.js
│   │   │   │   ├── ResizeLaneBehavior.js
│   │   │   │   ├── RootElementReferenceBehavior.js
│   │   │   │   ├── SetCompensationActivityAfterPasteBehavior.js
│   │   │   │   ├── SpaceToolBehavior.js
│   │   │   │   ├── SubProcessPlaneBehavior.js
│   │   │   │   ├── SubProcessStartEventBehavior.js
│   │   │   │   ├── TextAnnotationBehavior.js
│   │   │   │   ├── ToggleCollapseConnectionBehaviour.js
│   │   │   │   ├── ToggleElementCollapseBehaviour.js
│   │   │   │   ├── UnclaimIdBehavior.js
│   │   │   │   ├── UnsetDefaultFlowBehavior.js
│   │   │   │   ├── UpdateFlowNodeRefsBehavior.js
│   │   │   │   ├── index.js
│   │   │   │   └── util/
│   │   │   │       ├── CategoryUtil.js
│   │   │   │       ├── ConnectionLayoutUtil.js
│   │   │   │       ├── GeometricUtil.js
│   │   │   │       ├── LabelLayoutUtil.js
│   │   │   │       ├── LayoutUtil.js
│   │   │   │       ├── LineAttachmentUtil.js
│   │   │   │       ├── LineIntersect.js
│   │   │   │       ├── NonInterruptingUtil.js
│   │   │   │       └── ResizeUtil.js
│   │   │   ├── cmd/
│   │   │   │   ├── AddLaneHandler.js
│   │   │   │   ├── IdClaimHandler.js
│   │   │   │   ├── ResizeLaneHandler.js
│   │   │   │   ├── SetColorHandler.js
│   │   │   │   ├── SplitLaneHandler.js
│   │   │   │   ├── UpdateCanvasRootHandler.js
│   │   │   │   ├── UpdateFlowNodeRefsHandler.js
│   │   │   │   ├── UpdateModdlePropertiesHandler.js
│   │   │   │   ├── UpdatePropertiesHandler.js
│   │   │   │   └── UpdateSemanticParentHandler.js
│   │   │   ├── index.js
│   │   │   └── util/
│   │   │       ├── LaneUtil.js
│   │   │       └── ModelingUtil.js
│   │   ├── modeling-feedback/
│   │   │   ├── ModelingFeedback.js
│   │   │   └── index.js
│   │   ├── ordering/
│   │   │   ├── BpmnOrderingProvider.js
│   │   │   └── index.js
│   │   ├── outline/
│   │   │   ├── OutlineProvider.js
│   │   │   ├── OutlineUtil.js
│   │   │   └── index.js
│   │   ├── palette/
│   │   │   ├── PaletteProvider.js
│   │   │   └── index.js
│   │   ├── popup-menu/
│   │   │   ├── ReplaceMenuProvider.js
│   │   │   ├── index.js
│   │   │   └── util/
│   │   │       ├── Icons.js
│   │   │       └── TypeUtil.js
│   │   ├── replace/
│   │   │   ├── BpmnReplace.js
│   │   │   ├── ReplaceOptions.js
│   │   │   └── index.js
│   │   ├── replace-preview/
│   │   │   ├── BpmnReplacePreview.js
│   │   │   └── index.js
│   │   ├── rules/
│   │   │   ├── BpmnRules.js
│   │   │   └── index.js
│   │   ├── search/
│   │   │   ├── BpmnSearchProvider.js
│   │   │   └── index.js
│   │   ├── snapping/
│   │   │   ├── BpmnConnectSnapping.js
│   │   │   ├── BpmnCreateMoveSnapping.js
│   │   │   ├── BpmnSnappingUtil.js
│   │   │   └── index.js
│   │   └── space-tool/
│   │       ├── BpmnSpaceTool.js
│   │       └── index.js
│   ├── import/
│   │   ├── BpmnImporter.js
│   │   ├── BpmnTreeWalker.js
│   │   ├── Importer.js
│   │   ├── Util.js
│   │   └── index.js
│   ├── index.js
│   ├── model/
│   │   └── Types.ts
│   └── util/
│       ├── AnnotationUtil.js
│       ├── CompatibilityUtil.js
│       ├── DiUtil.js
│       ├── DrilldownUtil.js
│       ├── LabelUtil.js
│       ├── ModelUtil.js
│       ├── PoweredByUtil.js
│       ├── Types.js
│       └── Types.ts
├── package.json
├── renovate.json
├── resources/
│   ├── banner-min.txt
│   ├── banner.txt
│   └── initial.bpmn
├── rollup.config.js
├── tasks/
│   ├── build-distro.mjs
│   ├── stages/
│   │   ├── await-published
│   │   ├── update-demo
│   │   ├── update-examples
│   │   ├── update-integration-test
│   │   ├── update-translations
│   │   └── update-website
│   └── test-distro.mjs
├── test/
│   ├── TestHelper.js
│   ├── config/
│   │   ├── karma.distro.js
│   │   ├── karma.unit.js
│   │   └── translation-reporter.js
│   ├── coverageBundle.js
│   ├── distro/
│   │   ├── bpmn-modeler.js
│   │   ├── bpmn-navigated-viewer.js
│   │   ├── bpmn-viewer.js
│   │   └── helper.js
│   ├── fixtures/
│   │   ├── bpmn/
│   │   │   ├── align-elements.bpmn
│   │   │   ├── basic.bpmn
│   │   │   ├── boundary-events.bpmn
│   │   │   ├── collaboration/
│   │   │   │   ├── collaboration-data-store.bpmn
│   │   │   │   ├── collaboration-empty-participant.bpmn
│   │   │   │   ├── collaboration-message-flows.bpmn
│   │   │   │   ├── collaboration-participant.bpmn
│   │   │   │   ├── process-empty.bpmn
│   │   │   │   └── process.bpmn
│   │   │   ├── collaboration-data-items.bpmn
│   │   │   ├── collaboration-message-flows.bpmn
│   │   │   ├── collaboration-sequence-flows.bpmn
│   │   │   ├── collaboration-vertical.bpmn
│   │   │   ├── collaboration.bpmn
│   │   │   ├── collapsed-sub-process-legacy.bpmn
│   │   │   ├── collapsed-sub-process.bpmn
│   │   │   ├── complex.bpmn
│   │   │   ├── conditions.bpmn
│   │   │   ├── containers.bpmn
│   │   │   ├── distribute-elements-filtering.bpmn
│   │   │   ├── distribute-elements-filtering.collaboration.bpmn
│   │   │   ├── distribute-elements.bpmn
│   │   │   ├── draw/
│   │   │   │   ├── activity-markers-combination.bpmn
│   │   │   │   ├── activity-markers-simple.bpmn
│   │   │   │   ├── activity-markers.bpmn
│   │   │   │   ├── associations.bpmn
│   │   │   │   ├── boundary-event-with-refnode.bpmn
│   │   │   │   ├── boundary-event-without-refnode.bpmn
│   │   │   │   ├── boundary-event-z-index.bpmn
│   │   │   │   ├── call-activity.bpmn
│   │   │   │   ├── conditional-flow-default.bpmn
│   │   │   │   ├── conditional-flow-gateways.bpmn
│   │   │   │   ├── conditional-flow-typed-task.bpmn
│   │   │   │   ├── conditional-flow.bpmn
│   │   │   │   ├── data-objects.bpmn
│   │   │   │   ├── event-subprocess-icons.bpmn
│   │   │   │   ├── event-subprocesses-collapsed.bpmn
│   │   │   │   ├── event-subprocesses-expanded.bpmn
│   │   │   │   ├── events-interrupting.bpmn
│   │   │   │   ├── events.bpmn
│   │   │   │   ├── gateway-type-default.bpmn
│   │   │   │   ├── gateways.bpmn
│   │   │   │   ├── group-name.bpmn
│   │   │   │   ├── group.bpmn
│   │   │   │   ├── message-label.bpmn
│   │   │   │   ├── message-marker.bpmn
│   │   │   │   ├── pools-with-collection-marker.bpmn
│   │   │   │   ├── pools.bpmn
│   │   │   │   ├── task-types.bpmn
│   │   │   │   ├── text-annotation.bpmn
│   │   │   │   ├── vertical-pools.bpmn
│   │   │   │   └── xor.bpmn
│   │   │   ├── empty-definitions.bpmn
│   │   │   ├── error/
│   │   │   │   ├── categoryValue.bpmn
│   │   │   │   ├── di-plane-no-bpmn-element.bpmn
│   │   │   │   ├── duplicate-ids.bpmn
│   │   │   │   ├── invalid-child.bpmn
│   │   │   │   ├── missing-namespace.bpmn
│   │   │   │   ├── no-process-collaboration.bpmn
│   │   │   │   └── no-xml.txt
│   │   │   ├── event-sub-processes.bpmn
│   │   │   ├── extension/
│   │   │   │   ├── camunda.bpmn
│   │   │   │   ├── custom-override.bpmn
│   │   │   │   └── custom.bpmn
│   │   │   ├── features/
│   │   │   │   ├── drop/
│   │   │   │   │   ├── drop.bpmn
│   │   │   │   │   └── recursive-task.bpmn
│   │   │   │   ├── replace/
│   │   │   │   │   ├── 01_replace.bpmn
│   │   │   │   │   ├── association-gateways.bpmn
│   │   │   │   │   ├── cancel-events.bpmn
│   │   │   │   │   ├── connection.bpmn
│   │   │   │   │   ├── copy-properties.bpmn
│   │   │   │   │   ├── data-elements.bpmn
│   │   │   │   │   ├── data-stores-positioned-against-participant.bpmn
│   │   │   │   │   └── participants.bpmn
│   │   │   │   └── rules/
│   │   │   │       ├── event-based-gateway-outgoing-edge.bpmn
│   │   │   │       ├── link-event.bpmn
│   │   │   │       └── text-annotation-association.bpmn
│   │   │   ├── flow-markers.bpmn
│   │   │   ├── import/
│   │   │   │   ├── boundaryEvent.bpmn
│   │   │   │   ├── collaboration.bpmn
│   │   │   │   ├── collapsed/
│   │   │   │   │   ├── collaboration.bpmn
│   │   │   │   │   ├── process.bpmn
│   │   │   │   │   └── processWithChildren.bpmn
│   │   │   │   ├── collapsed-subprocess.bpmn
│   │   │   │   ├── data-store.inside-participant.bpmn
│   │   │   │   ├── data-store.outside-participant.dangling.bpmn
│   │   │   │   ├── data-store.outside-participant.participant.bpmn
│   │   │   │   ├── data-store.outside-participant.subprocess.bpmn
│   │   │   │   ├── default-attrs.bpmn
│   │   │   │   ├── error/
│   │   │   │   │   ├── boundaryEvent-invalidAttachToRef.bpmn
│   │   │   │   │   ├── boundaryEvent-missingAttachToRef.bpmn
│   │   │   │   │   ├── dangling-process-message-flow.bpmn
│   │   │   │   │   ├── invalid-flow-element.bpmn
│   │   │   │   │   └── multiple-dis.bpmn
│   │   │   │   ├── groups.bpmn
│   │   │   │   ├── labels/
│   │   │   │   │   ├── collaboration-message-flows.bpmn
│   │   │   │   │   ├── collaboration.bpmn
│   │   │   │   │   ├── embedded.bpmn
│   │   │   │   │   ├── external-no-di.bpmn
│   │   │   │   │   └── external.bpmn
│   │   │   │   ├── multiple-diagrams.bpmn
│   │   │   │   ├── position/
│   │   │   │   │   └── position-testcase.bpmn
│   │   │   │   ├── process.bpmn
│   │   │   │   └── text-annotation-message-flow.bpmn
│   │   │   ├── kitchen-sink.bpmn
│   │   │   ├── multiple-diagrams-lanesets.bpmn
│   │   │   ├── multiple-diagrams-overlapping-di.bpmn
│   │   │   ├── multiple-diagrams.bpmn
│   │   │   ├── multiple-nested-processes.bpmn
│   │   │   ├── nested-subprocesses.bpmn
│   │   │   ├── sequence-flows.bpmn
│   │   │   ├── simple-resizable.bpmn
│   │   │   └── simple.bpmn
│   │   └── json/
│   │       └── model/
│   │           ├── camunda.json
│   │           ├── custom-override.json
│   │           └── custom.json
│   ├── helper/
│   │   ├── TranslationCollector.js
│   │   └── index.js
│   ├── integration/
│   │   ├── CustomElementsSpec.js
│   │   ├── ReimportSpec.js
│   │   ├── SimpleModelingSpec.js
│   │   ├── custom-elements/
│   │   │   ├── CustomElementFactory.js
│   │   │   ├── CustomRenderer.js
│   │   │   ├── CustomRules.js
│   │   │   ├── CustomUpdater.js
│   │   │   └── index.js
│   │   └── model/
│   │       └── BpmnModdleSpec.js
│   ├── matchers/
│   │   ├── BoundsMatchers.js
│   │   ├── ConnectionMatchers.js
│   │   └── JSONMatcher.js
│   ├── spec/
│   │   ├── BaseModelerSpec.js
│   │   ├── BaseViewerSpec.js
│   │   ├── Modeler.copy-paste.a.bpmn
│   │   ├── Modeler.copy-paste.b.bpmn
│   │   ├── Modeler.copy-paste.complex.bpmn
│   │   ├── Modeler.copy-paste.empty.bpmn
│   │   ├── ModelerSpec.js
│   │   ├── NavigatedViewerSpec.js
│   │   ├── ViewerSpec.js
│   │   ├── draw/
│   │   │   ├── BpmnRenderUtilSpec.js
│   │   │   ├── BpmnRenderer.colors.bpmn
│   │   │   ├── BpmnRenderer.connection-colors.bpmn
│   │   │   ├── BpmnRenderer.group-colors.bpmn
│   │   │   ├── BpmnRenderer.labels.bpmn
│   │   │   ├── BpmnRenderer.no-event-icons.bpmn
│   │   │   ├── BpmnRenderer.sequenceFlow-no-source.bpmn
│   │   │   ├── BpmnRenderer.simple-cropping.bpmn
│   │   │   ├── BpmnRendererSpec.js
│   │   │   ├── TextRenderer.bpmn
│   │   │   ├── TextRendererSpec.js
│   │   │   └── custom-renderer/
│   │   │       ├── CustomRenderer.js
│   │   │       └── index.js
│   │   ├── environment/
│   │   │   └── MockingSpec.js
│   │   ├── features/
│   │   │   ├── align-elements/
│   │   │   │   ├── AlignElementsContextPadProviderSpec.js
│   │   │   │   ├── AlignElementsMenuProviderSpec.js
│   │   │   │   └── BpmnAlignElementsSpec.js
│   │   │   ├── append-preview/
│   │   │   │   ├── AppendPreview.bpmn
│   │   │   │   └── AppendPreviewSpec.js
│   │   │   ├── auto-place/
│   │   │   │   ├── BpmnAutoPlace.boundary-events.bpmn
│   │   │   │   ├── BpmnAutoPlace.bpmn
│   │   │   │   ├── BpmnAutoPlace.multi-connection.bpmn
│   │   │   │   ├── BpmnAutoPlace.subprocess.bpmn
│   │   │   │   ├── BpmnAutoPlace.subprocess.horizontal.bpmn
│   │   │   │   ├── BpmnAutoPlace.subprocess.vertical.bpmn
│   │   │   │   ├── BpmnAutoPlace.vertical.boundary-events.bpmn
│   │   │   │   ├── BpmnAutoPlace.vertical.bpmn
│   │   │   │   ├── BpmnAutoPlace.vertical.multi-connection.bpmn
│   │   │   │   └── BpmnAutoPlaceSpec.js
│   │   │   ├── auto-resize/
│   │   │   │   ├── AutoResize.lanes.bpmn
│   │   │   │   ├── AutoResize.multi-selection.bpmn
│   │   │   │   ├── AutoResize.nested-sub-processes.bpmn
│   │   │   │   ├── AutoResize.participant.bpmn
│   │   │   │   ├── AutoResize.space-tool.bpmn
│   │   │   │   ├── AutoResize.sub-processes.bpmn
│   │   │   │   └── AutoResizeSpec.js
│   │   │   ├── context-pad/
│   │   │   │   ├── ContextPad.activation.bpmn
│   │   │   │   └── ContextPadProviderSpec.js
│   │   │   ├── copy-paste/
│   │   │   │   ├── BpmnCopyPasteSpec.js
│   │   │   │   ├── ModdleCopySpec.js
│   │   │   │   ├── basic.bpmn
│   │   │   │   ├── collaboration-multiple.bpmn
│   │   │   │   ├── collaboration.bpmn
│   │   │   │   ├── collapsed-subprocess.bpmn
│   │   │   │   ├── complex.bpmn
│   │   │   │   ├── copy-properties.bpmn
│   │   │   │   ├── data-associations.bpmn
│   │   │   │   ├── event-based-gateway.bpmn
│   │   │   │   ├── nested-subprocess-annotations.bpmn
│   │   │   │   └── properties.bpmn
│   │   │   ├── distribute-elements/
│   │   │   │   ├── BpmnDistributeElementsSpec.js
│   │   │   │   └── DistributeElementsMenuProviderSpec.js
│   │   │   ├── drilldown/
│   │   │   │   ├── DrilldownIntegrationSpec.js
│   │   │   │   ├── DrilldownOverlayBehaviorSpec.bpmn
│   │   │   │   ├── DrilldownOverlaysBehaviorSpec.js
│   │   │   │   ├── DrilldownSpec.js
│   │   │   │   ├── collaboration-subprocesses.bpmn
│   │   │   │   ├── diagram-missing-plane.bpmn
│   │   │   │   ├── legacy-subprocesses.bpmn
│   │   │   │   ├── nested-subprocesses.bpmn
│   │   │   │   ├── plane-missing-bpmnelement.bpmn
│   │   │   │   ├── process-missing-bpmndiagram.bpmn
│   │   │   │   ├── subprocess-missing-bpmndiagram.bpmn
│   │   │   │   └── subprocess-missing-di.bpmn
│   │   │   ├── editor-actions/
│   │   │   │   └── BpmnEditorActionsSpec.js
│   │   │   ├── grid-snapping/
│   │   │   │   ├── BpmnGridSnapping.bpmn
│   │   │   │   ├── BpmnGridSnappingSpec.js
│   │   │   │   ├── basic.bpmn
│   │   │   │   └── behavior/
│   │   │   │       ├── AutoPlaceBehavior.bpmn
│   │   │   │       ├── AutoPlaceBehaviorSpec.js
│   │   │   │       ├── AutoResizeBehavior.bpmn
│   │   │   │       ├── AutoResizeBehaviorSpec.js
│   │   │   │       ├── CreateParticipantBehavior.bpmn
│   │   │   │       ├── CreateParticipantBehaviorSpec.js
│   │   │   │       ├── LayoutConnectionBehavior.bpmn
│   │   │   │       └── LayoutConnectionBehaviorSpec.js
│   │   │   ├── interaction-events/
│   │   │   │   └── BpmnInteractionEventsSpec.js
│   │   │   ├── keyboard/
│   │   │   │   └── BpmnKeyboardBindingsSpec.js
│   │   │   ├── keyboard-move-selection/
│   │   │   │   ├── KeyboardMoveSelectionSpec.js
│   │   │   │   └── keyboard-move-selection.bpmn
│   │   │   ├── label-editing/
│   │   │   │   ├── LabelEditing.bpmn
│   │   │   │   ├── LabelEditingPreviewSpec.js
│   │   │   │   └── LabelEditingProviderSpec.js
│   │   │   ├── label-link/
│   │   │   │   ├── LabelLink.bpmn
│   │   │   │   └── LabelLinkSpec.js
│   │   │   ├── modeling/
│   │   │   │   ├── AppendShapeSpec.js
│   │   │   │   ├── BendpointsSpec.js
│   │   │   │   ├── BpmnFactorySpec.js
│   │   │   │   ├── BpmnUpdater.bpmn
│   │   │   │   ├── BpmnUpdater.incompleteDi.bpmn
│   │   │   │   ├── BpmnUpdaterSpec.js
│   │   │   │   ├── CreateConnectionSpec.js
│   │   │   │   ├── DeleteConnectionSpec.js
│   │   │   │   ├── DeleteParticipantSpec.js
│   │   │   │   ├── DeleteShape.cropping.bpmn
│   │   │   │   ├── DeleteShapeSpec.js
│   │   │   │   ├── DropSpec.js
│   │   │   │   ├── ElementFactory.bpmn
│   │   │   │   ├── ElementFactorySpec.js
│   │   │   │   ├── IdClaim.bpmn
│   │   │   │   ├── IdClaimSpec.js
│   │   │   │   ├── LabelBoundsSpec.js
│   │   │   │   ├── LabelBoundsSpec.simple.bpmn
│   │   │   │   ├── LabelLayouting.initial.bpmn
│   │   │   │   ├── LabelLayouting.integration.bpmn
│   │   │   │   ├── LabelLayouting.move.bpmn
│   │   │   │   ├── LabelLayoutingSpec.js
│   │   │   │   ├── LoggingCroppingConnectionDocking.js
│   │   │   │   ├── MoveConnectionSpec.js
│   │   │   │   ├── MoveElements.boundary-connection.bpmn
│   │   │   │   ├── MoveElements.centered-connection.bpmn
│   │   │   │   ├── MoveElements.collaboration-association.bpmn
│   │   │   │   ├── MoveElements.data-input-output.bpmn
│   │   │   │   ├── MoveElements.eventBasedTargets.bpmn
│   │   │   │   ├── MoveElements.flow-collaboration.bpmn
│   │   │   │   ├── MoveElementsSpec.js
│   │   │   │   ├── MoveRulesSpec.js
│   │   │   │   ├── MoveShapeSpec.js
│   │   │   │   ├── MoveStress.bpmn
│   │   │   │   ├── MoveStressSpec.js
│   │   │   │   ├── ResizeShapeSpec.js
│   │   │   │   ├── SetColor.bpmn
│   │   │   │   ├── SetColorSpec.js
│   │   │   │   ├── UpdateAttachmentSpec.js
│   │   │   │   ├── UpdateLabel.bpmn
│   │   │   │   ├── UpdateLabelSpec.js
│   │   │   │   ├── UpdateModdleProperties.dataObject.bpmn
│   │   │   │   ├── UpdateModdleProperties.error.bpmn
│   │   │   │   ├── UpdateModdlePropertiesSpec.js
│   │   │   │   ├── UpdatePropertiesSpec.js
│   │   │   │   ├── UpdateSemanticParent.bpmn
│   │   │   │   ├── UpdateSemanticParentSpec.js
│   │   │   │   ├── append/
│   │   │   │   │   └── TextAnnotationSpec.js
│   │   │   │   ├── behavior/
│   │   │   │   │   ├── AdaptiveLabelPositioningBehavior.basics.bpmn
│   │   │   │   │   ├── AdaptiveLabelPositioningBehavior.boundary-events.bpmn
│   │   │   │   │   ├── AdaptiveLabelPositioningBehaviorSpec.js
│   │   │   │   │   ├── AssociationBehavior.bpmn
│   │   │   │   │   ├── AssociationBehaviorSpec.js
│   │   │   │   │   ├── AttachEventBehavior.bpmn
│   │   │   │   │   ├── AttachEventBehaviorSpec.js
│   │   │   │   │   ├── BoundaryEvent.bpmn
│   │   │   │   │   ├── BoundaryEventBehaviorSpec.js
│   │   │   │   │   ├── CompensateBoundaryEventBehavior.bpmn
│   │   │   │   │   ├── CompensateBoundaryEventBehaviorSpec.js
│   │   │   │   │   ├── CompensationAssociationBehavior.bpmn
│   │   │   │   │   ├── CompensationAssociationBehaviorSpec.js
│   │   │   │   │   ├── CreateBehavior.bpmn
│   │   │   │   │   ├── CreateBehaviorSpec.js
│   │   │   │   │   ├── CreateParticipantBehaviorSpec.js
│   │   │   │   │   ├── DataInputAssociationBehavior.bpmn
│   │   │   │   │   ├── DataInputAssociationBehaviorSpec.js
│   │   │   │   │   ├── DataObjectBehavior.create-data-association.bpmn
│   │   │   │   │   ├── DataObjectBehavior.data-object-reference.bpmn
│   │   │   │   │   ├── DataObjectBehavior.remove-data-association.bpmn
│   │   │   │   │   ├── DataObjectBehaviorSpec.js
│   │   │   │   │   ├── DataStoreBehavior.bpmn
│   │   │   │   │   ├── DataStoreBehavior.collaboration.bpmn
│   │   │   │   │   ├── DataStoreBehavior.connect.bpmn
│   │   │   │   │   ├── DataStoreBehavior.empty-pool.bpmn
│   │   │   │   │   ├── DataStoreBehavior.process.bpmn
│   │   │   │   │   ├── DataStoreBehavior.remove-participant.bpmn
│   │   │   │   │   ├── DataStoreBehaviorSpec.js
│   │   │   │   │   ├── DetachEventBehavior.bpmn
│   │   │   │   │   ├── DetachEventBehaviorSpec.js
│   │   │   │   │   ├── DropOnFlowBehavior.bpmn
│   │   │   │   │   ├── DropOnFlowBehaviorSpec.js
│   │   │   │   │   ├── EventBasedGatewayBehavior.bpmn
│   │   │   │   │   ├── EventBasedGatewayBehaviorSpec.js
│   │   │   │   │   ├── FixHoverBehavior.annotation.bpmn
│   │   │   │   │   ├── FixHoverBehavior.group.bpmn
│   │   │   │   │   ├── FixHoverBehavior.label.bpmn
│   │   │   │   │   ├── FixHoverBehavior.lane-connect.bpmn
│   │   │   │   │   ├── FixHoverBehavior.participant.bpmn
│   │   │   │   │   ├── FixHoverBehaviorSpec.js
│   │   │   │   │   ├── GroupBehaviorSpec.bpmn
│   │   │   │   │   ├── GroupBehaviorSpec.js
│   │   │   │   │   ├── ImportDockingFix.bpmn
│   │   │   │   │   ├── ImportDockingFixSpec.js
│   │   │   │   │   ├── IsHorizontalFix.bpmn
│   │   │   │   │   ├── IsHorizontalFixSpec.js
│   │   │   │   │   ├── LabelBehavior.bpmn
│   │   │   │   │   ├── LabelBehavior.copyPaste.bpmn
│   │   │   │   │   ├── LabelBehaviorSpec.js
│   │   │   │   │   ├── LayoutConnectionBehavior.bpmn
│   │   │   │   │   ├── LayoutConnectionBehaviorSpec.js
│   │   │   │   │   ├── MessageFlowBehavior.bpmn
│   │   │   │   │   ├── MessageFlowBehaviorSpec.js
│   │   │   │   │   ├── NonInterruptingBehavior.bpmn
│   │   │   │   │   ├── NonInterruptingBehaviorSpec.js
│   │   │   │   │   ├── ReconnectConnection.data-association.bpmn
│   │   │   │   │   ├── ReconnectConnectionSpec.js
│   │   │   │   │   ├── RemoveElementBehavior.bpmn
│   │   │   │   │   ├── RemoveElementBehavior.diagonal.bpmn
│   │   │   │   │   ├── RemoveElementBehavior.perpendicular.bpmn
│   │   │   │   │   ├── RemoveElementBehavior.vertical.diagonal.bpmn
│   │   │   │   │   ├── RemoveElementBehaviorSpec.js
│   │   │   │   │   ├── RemoveEmbeddedLabelBoundsBehavior.bpmn
│   │   │   │   │   ├── RemoveEmbeddedLabelBoundsBehaviorSpec.js
│   │   │   │   │   ├── RemoveParticipantBehaviorSpec.js
│   │   │   │   │   ├── ReplaceConnectionBehavior.association.bpmn
│   │   │   │   │   ├── ReplaceConnectionBehavior.boundary-events.bpmn
│   │   │   │   │   ├── ReplaceConnectionBehavior.message-sequence-flow.bpmn
│   │   │   │   │   ├── ReplaceConnectionBehaviorSpec.js
│   │   │   │   │   ├── ReplaceElementBehaviourSpec.js
│   │   │   │   │   ├── ResizeBehavior.lanes.bpmn
│   │   │   │   │   ├── ResizeBehavior.lanes.vertical.bpmn
│   │   │   │   │   ├── ResizeBehavior.participant.bpmn
│   │   │   │   │   ├── ResizeBehavior.participant.vertical.bpmn
│   │   │   │   │   ├── ResizeBehavior.subProcess.bpmn
│   │   │   │   │   ├── ResizeBehavior.textAnnotation.bpmn
│   │   │   │   │   ├── ResizeBehavior.utility.lanes-flowNodes.bpmn
│   │   │   │   │   ├── ResizeBehavior.utility.lanes.bpmn
│   │   │   │   │   ├── ResizeBehavior.utility.lanes.vertical-flowNodes.bpmn
│   │   │   │   │   ├── ResizeBehavior.utility.lanes.vertical.bpmn
│   │   │   │   │   ├── ResizeBehaviorSpec.js
│   │   │   │   │   ├── RootElementReferenceBehavior.bpmn
│   │   │   │   │   ├── RootElementReferenceBehaviorSpec.js
│   │   │   │   │   ├── SetCompensationActivityAfterPasteBehaviorSpec.bpmn
│   │   │   │   │   ├── SetCompensationActivityAfterPasteBehaviorSpec.js
│   │   │   │   │   ├── SpaceToolBehaviorSpec.group.bpmn
│   │   │   │   │   ├── SpaceToolBehaviorSpec.js
│   │   │   │   │   ├── SpaceToolBehaviorSpec.participant.bpmn
│   │   │   │   │   ├── SpaceToolBehaviorSpec.participant.vertical.bpmn
│   │   │   │   │   ├── SpaceToolBehaviorSpec.subprocess.bpmn
│   │   │   │   │   ├── SubProcessBehavior.copy-paste.bpmn
│   │   │   │   │   ├── SubProcessBehavior.multiple-planes.bpmn
│   │   │   │   │   ├── SubProcessBehavior.nested-subprocess-annotations.bpmn
│   │   │   │   │   ├── SubProcessBehavior.planes.bpmn
│   │   │   │   │   ├── SubProcessBehavior.start-event.bpmn
│   │   │   │   │   ├── SubProcessPlaneBehaviorSpec.js
│   │   │   │   │   ├── SubProcessStartEventBehaviorSpec.js
│   │   │   │   │   ├── TextAnnotationBehaviorSpec.bpmn
│   │   │   │   │   ├── TextAnnotationBehaviorSpec.js
│   │   │   │   │   ├── ToggleCollapseConnectionBehaviourSpec.bpmn
│   │   │   │   │   ├── ToggleCollapseConnectionBehaviourSpec.js
│   │   │   │   │   ├── ToggleElementCollapseBehaviour.bpmn
│   │   │   │   │   ├── ToggleElementCollapseBehaviourSpec.js
│   │   │   │   │   ├── UnclaimIdBehaviorSpec.bpmn
│   │   │   │   │   ├── UnclaimIdBehaviorSpec.js
│   │   │   │   │   ├── UnsetDefaultFlowBehaviorSpec.bpmn
│   │   │   │   │   ├── UnsetDefaultFlowBehaviorSpec.js
│   │   │   │   │   └── util/
│   │   │   │   │       ├── GeometricUtilSpec.js
│   │   │   │   │       ├── LabelLayoutUtilSpec.js
│   │   │   │   │       ├── LineAttachmentUtilSpec.js
│   │   │   │   │       ├── LineIntersectSpec.js
│   │   │   │   │       └── ResizeUtilSpec.js
│   │   │   │   ├── input-output/
│   │   │   │   │   └── DataInputOutput.bpmn
│   │   │   │   ├── lanes/
│   │   │   │   │   ├── AddLaneSpec.js
│   │   │   │   │   ├── DeleteLaneSpec.js
│   │   │   │   │   ├── ResizeLaneSpec.js
│   │   │   │   │   ├── SplitLane.nested.bpmn
│   │   │   │   │   ├── SplitLane.nested.vertical.bpmn
│   │   │   │   │   ├── SplitLaneSpec.js
│   │   │   │   │   ├── UpdateFlowNodeRefs.basic.bpmn
│   │   │   │   │   ├── UpdateFlowNodeRefsSpec.js
│   │   │   │   │   ├── lanes-flow-nodes-vertical.bpmn
│   │   │   │   │   ├── lanes-flow-nodes.bpmn
│   │   │   │   │   ├── lanes.bpmn
│   │   │   │   │   ├── lanes.only.bpmn
│   │   │   │   │   ├── lanes.only.vertical.bpmn
│   │   │   │   │   ├── lanes.vertical.bpmn
│   │   │   │   │   ├── participant-lane-vertical.bpmn
│   │   │   │   │   ├── participant-lane.bpmn
│   │   │   │   │   ├── participant-no-lane-vertical.bpmn
│   │   │   │   │   ├── participant-no-lane.bpmn
│   │   │   │   │   └── participant-single-lane.bpmn
│   │   │   │   └── layout/
│   │   │   │       ├── Helper.js
│   │   │   │       ├── LayoutAssociationSpec.js
│   │   │   │       ├── LayoutConnectionSpec.js
│   │   │   │       ├── LayoutDataAssociationSpec.js
│   │   │   │       ├── LayoutMessageFlowSpec.bpmn
│   │   │   │       ├── LayoutMessageFlowSpec.js
│   │   │   │       ├── LayoutMessageFlowSpec.vertical.bpmn
│   │   │   │       ├── LayoutSequenceFlowSpec.boundaryEvents.bpmn
│   │   │   │       ├── LayoutSequenceFlowSpec.boundaryEventsLoops.bpmn
│   │   │   │       ├── LayoutSequenceFlowSpec.flowElements.bpmn
│   │   │   │       ├── LayoutSequenceFlowSpec.js
│   │   │   │       ├── LayoutSequenceFlowSpec.subProcess.bpmn
│   │   │   │       ├── LayoutSequenceFlowSpec.vertical.boundaryEvents.bpmn
│   │   │   │       ├── LayoutSequenceFlowSpec.vertical.boundaryEventsLoops.bpmn
│   │   │   │       ├── LayoutSequenceFlowSpec.vertical.flowElements.bpmn
│   │   │   │       └── LayoutSequenceFlowSpec.vertical.subProcess.bpmn
│   │   │   ├── modeling-feedback/
│   │   │   │   ├── ModelingFeedback.bpmn
│   │   │   │   └── ModelingFeedbackSpec.js
│   │   │   ├── ordering/
│   │   │   │   ├── BpmnDiOrderingSpec.js
│   │   │   │   ├── BpmnOrderingProviderSpec.js
│   │   │   │   ├── Helper.js
│   │   │   │   ├── collapsed-subprocess.bpmn
│   │   │   │   ├── data-association.bpmn
│   │   │   │   ├── groups.bpmn
│   │   │   │   ├── ordering-start-event.bpmn
│   │   │   │   ├── ordering-subprocesses.bpmn
│   │   │   │   ├── ordering.bpmn
│   │   │   │   └── wrong-di-order.bpmn
│   │   │   ├── outline/
│   │   │   │   ├── OutlineProvider.bpmn
│   │   │   │   └── OutlineProviderSpec.js
│   │   │   ├── palette/
│   │   │   │   └── PaletteProviderSpec.js
│   │   │   ├── popup-menu/
│   │   │   │   ├── ReplaceMenuProvider.collapsedSubProcess.bpmn
│   │   │   │   ├── ReplaceMenuProvider.compensation-activity.bpmn
│   │   │   │   ├── ReplaceMenuProvider.conditionalFlows.bpmn
│   │   │   │   ├── ReplaceMenuProvider.defaultFlows.bpmn
│   │   │   │   ├── ReplaceMenuProvider.defaultFlowsFromComplexGateways.bpmn
│   │   │   │   ├── ReplaceMenuProvider.defaultFlowsFromInclusiveGateways.bpmn
│   │   │   │   ├── ReplaceMenuProvider.events.bpmn
│   │   │   │   ├── ReplaceMenuProvider.pools.bpmn
│   │   │   │   ├── ReplaceMenuProvider.subProcesses.bpmn
│   │   │   │   └── ReplaceMenuProviderSpec.js
│   │   │   ├── replace/
│   │   │   │   ├── BpmnReplace.collaboration.bpmn
│   │   │   │   ├── BpmnReplace.collaboration.vertical.bpmn
│   │   │   │   ├── BpmnReplace.collapsedSubProcess.bpmn
│   │   │   │   ├── BpmnReplace.compensation.bpmn
│   │   │   │   ├── BpmnReplace.dataObjects.bpmn
│   │   │   │   ├── BpmnReplace.eventSubProcesses.bpmn
│   │   │   │   ├── BpmnReplace.poolMessageFlows.bpmn
│   │   │   │   ├── BpmnReplace.poolMessageFlows.vertical.bpmn
│   │   │   │   ├── BpmnReplaceSpec.js
│   │   │   │   ├── ReplaceRulesSpec.js
│   │   │   │   └── SubProcess-collapsed.bpmn
│   │   │   ├── replace-preview/
│   │   │   │   ├── BpmnReplacePreview.bpmn
│   │   │   │   └── BpmnReplacePreviewSpec.js
│   │   │   ├── rules/
│   │   │   │   ├── BpmnRules.attaching.bpmn
│   │   │   │   ├── BpmnRules.boundaryEvent.bpmn
│   │   │   │   ├── BpmnRules.collaboration-dataAssociation.bpmn
│   │   │   │   ├── BpmnRules.collaboration-empty.bpmn
│   │   │   │   ├── BpmnRules.collaboration-lanes.bpmn
│   │   │   │   ├── BpmnRules.collaboration.bpmn
│   │   │   │   ├── BpmnRules.collapsedPools.bpmn
│   │   │   │   ├── BpmnRules.compensation-collaboration.bpmn
│   │   │   │   ├── BpmnRules.compensation.bpmn
│   │   │   │   ├── BpmnRules.connectOnCreate.bpmn
│   │   │   │   ├── BpmnRules.dataAssociation.bpmn
│   │   │   │   ├── BpmnRules.dataInputOutput.collaboration.bpmn
│   │   │   │   ├── BpmnRules.dataInputOutput.process.bpmn
│   │   │   │   ├── BpmnRules.detaching.bpmn
│   │   │   │   ├── BpmnRules.eventBasedGatewayBasic.bpmn
│   │   │   │   ├── BpmnRules.groups.bpmn
│   │   │   │   ├── BpmnRules.insert.bpmn
│   │   │   │   ├── BpmnRules.messageFlow.bpmn
│   │   │   │   ├── BpmnRules.moveLane.bpmn
│   │   │   │   ├── BpmnRules.multiSelectionPools.bpmn
│   │   │   │   ├── BpmnRules.process.bpmn
│   │   │   │   ├── BpmnRules.subProcess-dataAssociation.bpmn
│   │   │   │   ├── BpmnRulesSpec.js
│   │   │   │   └── Helper.js
│   │   │   ├── search/
│   │   │   │   ├── BpmnSearchProviderSpec.js
│   │   │   │   ├── bpmn-search-collaboration.bpmn
│   │   │   │   ├── bpmn-search-sorting.bpmn
│   │   │   │   └── bpmn-search.bpmn
│   │   │   ├── snapping/
│   │   │   │   ├── BpmnConnectSnapping.bpmn
│   │   │   │   ├── BpmnConnectSnappingSpec.js
│   │   │   │   ├── BpmnCreateMoveSnapping.boundary-events.bpmn
│   │   │   │   ├── BpmnCreateMoveSnapping.collaboration.bpmn
│   │   │   │   ├── BpmnCreateMoveSnapping.docking-create-mode.bpmn
│   │   │   │   ├── BpmnCreateMoveSnapping.docking-points.bpmn
│   │   │   │   ├── BpmnCreateMoveSnapping.process.bpmn
│   │   │   │   ├── BpmnCreateMoveSnapping.sequence-flows.bpmn
│   │   │   │   ├── BpmnCreateMoveSnapping.trbl-snapping.bpmn
│   │   │   │   └── BpmnCreateMoveSnappingSpec.js
│   │   │   └── space-tool/
│   │   │       ├── BpmnSpaceTool.artifacts.bpmn
│   │   │       ├── BpmnSpaceTool.basics.bpmn
│   │   │       ├── BpmnSpaceTool.boundary-events.bpmn
│   │   │       ├── BpmnSpaceTool.participants.bpmn
│   │   │       ├── BpmnSpaceTool.text-annotations.bpmn
│   │   │       └── BpmnSpaceToolSpec.js
│   │   ├── helper/
│   │   │   └── InjectSpec.js
│   │   ├── i18n/
│   │   │   ├── custom-translate/
│   │   │   │   ├── custom-translate.js
│   │   │   │   └── index.js
│   │   │   └── translateSpec.js
│   │   ├── import/
│   │   │   ├── BpmnTreeWalkerSpec.js
│   │   │   ├── ImporterSpec.js
│   │   │   ├── ModelWiringSpec.js
│   │   │   ├── data-association.bpmn
│   │   │   ├── elements/
│   │   │   │   ├── AssociationSpec.collaboration.bpmn
│   │   │   │   ├── AssociationSpec.compensation.bpmn
│   │   │   │   ├── AssociationSpec.data-association.bpmn
│   │   │   │   ├── AssociationSpec.data-input-output.bpmn
│   │   │   │   ├── AssociationSpec.events.bpmn
│   │   │   │   ├── AssociationSpec.js
│   │   │   │   ├── AssociationSpec.text-annotation.bpmn
│   │   │   │   ├── CollapsedSpec.js
│   │   │   │   ├── DataInputOutput.bpmn
│   │   │   │   ├── DataInputOutputSpec.js
│   │   │   │   ├── Groups.bpmn
│   │   │   │   ├── GroupsSpec.js
│   │   │   │   └── LabelSpec.js
│   │   │   ├── lane-flowNodes.bpmn
│   │   │   ├── lane-missing-flowNodeRef.bpmn
│   │   │   ├── missing-di-plane-root-element.bpmn
│   │   │   ├── missing-di-plane.bpmn
│   │   │   ├── sequenceFlow-missingWaypoints.bpmn
│   │   │   └── sequenceFlow-ordering.bpmn
│   │   └── util/
│   │       ├── ModelUtilSpec.js
│   │       └── svgHelpersSpec.js
│   ├── testBundle.js
│   └── util/
│       ├── KeyEvents.js
│       ├── MockEvents.js
│       ├── custom-rules/
│       │   ├── CustomRules.js
│       │   └── index.js
│       └── svgHelpers.js
└── tsconfig.json
Download .txt
SYMBOL INDEX (706 symbols across 226 files)

FILE: lib/BaseModeler.js
  function BaseModeler (line 26) | function BaseModeler(options) {

FILE: lib/BaseModeler.spec.ts
  type FooEvent (line 30) | type FooEvent = {
  type EventMap (line 37) | type EventMap = {
  type TypeMap (line 42) | type TypeMap = {

FILE: lib/BaseViewer.js
  function BaseViewer (line 143) | function BaseViewer(options) {
  function ParseCompleteEvent (line 206) | function ParseCompleteEvent(data) {
  function addWarningsToError (line 750) | function addWarningsToError(err, warningsAry) {
  function checkValidationError (line 755) | function checkValidationError(err) {
  constant DEFAULT_OPTIONS (line 772) | const DEFAULT_OPTIONS = {
  function ensureUnit (line 782) | function ensureUnit(val) {
  function findBPMNDiagram (line 795) | function findBPMNDiagram(definitions, diagramId) {
  function addProjectLogo (line 827) | function addProjectLogo(container) {

FILE: lib/BaseViewer.spec.ts
  function testViewer (line 41) | function testViewer(viewer: BaseViewer) {
  type FooEvent (line 178) | type FooEvent = {
  type EventMap (line 185) | type EventMap = {
  type TypeMap (line 190) | type TypeMap = {

FILE: lib/Modeler.js
  function Modeler (line 135) | function Modeler(options) {

FILE: lib/Modeler.spec.ts
  type FooEvent (line 32) | type FooEvent = {
  type EventMap (line 39) | type EventMap = {
  type TypeMap (line 44) | type TypeMap = {

FILE: lib/NavigatedViewer.js
  function NavigatedViewer (line 22) | function NavigatedViewer(options) {

FILE: lib/NavigatedViewer.spec.ts
  type FooEvent (line 24) | type FooEvent = {
  type EventMap (line 31) | type EventMap = {
  type TypeMap (line 36) | type TypeMap = {

FILE: lib/Viewer.js
  function Viewer (line 61) | function Viewer(options) {

FILE: lib/Viewer.spec.ts
  type FooEvent (line 25) | type FooEvent = {
  type EventMap (line 32) | type EventMap = {
  type TypeMap (line 37) | type TypeMap = {

FILE: lib/draw/BpmnRenderUtil.js
  function isTypedEvent (line 45) | function isTypedEvent(event, eventDefinitionType) {
  function isThrowEvent (line 58) | function isThrowEvent(event) {
  function isCollection (line 69) | function isCollection(element) {
  function getFillColor (line 85) | function getFillColor(element, defaultColor, overrideColor) {
  function getStrokeColor (line 98) | function getStrokeColor(element, defaultColor, overrideColor) {
  function getLabelColor (line 112) | function getLabelColor(element, defaultColor, defaultStrokeColor, overri...
  function getCirclePath (line 127) | function getCirclePath(shape) {
  function getRoundRectPath (line 150) | function getRoundRectPath(shape, borderRadius) {
  function getDiamondPath (line 178) | function getDiamondPath(shape) {
  function getRectPath (line 203) | function getRectPath(shape) {
  function getBounds (line 228) | function getBounds(bounds, overrides = {}) {
  function getWidth (line 243) | function getWidth(bounds, overrides = {}) {
  function getHeight (line 255) | function getHeight(bounds, overrides = {}) {

FILE: lib/draw/BpmnRenderer.js
  function BpmnRenderer (line 113) | function BpmnRenderer(
  function pickAttrs (line 2412) | function pickAttrs(attrs, keys = []) {

FILE: lib/draw/PathMap.js
  function PathMap (line 4) | function PathMap() {
  function replacer (line 458) | function replacer(all, key, obj) {
  function format (line 474) | function format(str, obj) {

FILE: lib/draw/TextRenderer.js
  function TextRenderer (line 34) | function TextRenderer(config) {

FILE: lib/features/align-elements/AlignElementsContextPadProvider.js
  function AlignElementsContextPadProvider (line 30) | function AlignElementsContextPadProvider(contextPad, popupMenu, translat...

FILE: lib/features/align-elements/AlignElementsMenuProvider.js
  function AlignElementsMenuProvider (line 38) | function AlignElementsMenuProvider(popupMenu, alignElements, translate, ...

FILE: lib/features/align-elements/BpmnAlignElements.js
  function BpmnAlignElements (line 19) | function BpmnAlignElements(eventBus) {

FILE: lib/features/append-preview/AppendPreview.js
  function AppendPreview (line 29) | function AppendPreview(complexPreview, connectionDocking, elementFactory...

FILE: lib/features/auto-place/BpmnAutoPlace.js
  function AutoPlace (line 14) | function AutoPlace(eventBus, elementRegistry) {

FILE: lib/features/auto-place/BpmnAutoPlaceUtil.js
  function getNewShapePosition (line 40) | function getNewShapePosition(source, element, elementRegistry) {
  function getFlowNodePosition (line 67) | function getFlowNodePosition(source, element, placeHorizontally) {
  function getDistance (line 136) | function getDistance(orientation, minDistance, placement) {
  function getTextAnnotationPosition (line 157) | function getTextAnnotationPosition(source, element, placeHorizontally) {
  function getDataElementPosition (line 204) | function getDataElementPosition(source, element, placeHorizontally) {

FILE: lib/features/auto-resize/BpmnAutoResize.js
  function BpmnAutoResize (line 20) | function BpmnAutoResize(injector) {

FILE: lib/features/auto-resize/BpmnAutoResizeProvider.js
  function BpmnAutoResizeProvider (line 24) | function BpmnAutoResizeProvider(eventBus, modeling) {

FILE: lib/features/context-pad/ContextPadProvider.js
  function ContextPadProvider (line 73) | function ContextPadProvider(
  function startConnect (line 211) | function startConnect(event, element) {
  function removeElement (line 215) | function removeElement(e, element) {
  function deleteAction (line 219) | function deleteAction() {
  function getReplaceMenuPosition (line 232) | function getReplaceMenuPosition(element) {
  function appendAction (line 258) | function appendAction(type, className, title, options) {
  function splitLaneHandler (line 299) | function splitLaneHandler(count) {
  function isEventType (line 579) | function isEventType(businessObject, type, eventDefinitionType) {

FILE: lib/features/copy-paste/BpmnCopyPaste.js
  function copyProperties (line 25) | function copyProperties(source, target, properties) {
  function BpmnCopyPaste (line 46) | function BpmnCopyPaste(bpmnFactory, eventBus, moddleCopy) {

FILE: lib/features/copy-paste/ModdleCopy.js
  constant DISALLOWED_PROPERTIES (line 15) | const DISALLOWED_PROPERTIES = [
  constant ALLOWED_REFERENCES (line 27) | const ALLOWED_REFERENCES = [
  function ModdleCopy (line 50) | function ModdleCopy(eventBus, bpmnFactory, moddle) {
  function getPropertyNames (line 279) | function getPropertyNames(descriptor, keepDefaultProperties) {

FILE: lib/features/di-ordering/BpmnDiOrdering.js
  function BpmnDiOrdering (line 22) | function BpmnDiOrdering(eventBus, canvas) {

FILE: lib/features/distribute-elements/BpmnDistributeElements.js
  function BpmnDistributeElements (line 24) | function BpmnDistributeElements(eventBus) {

FILE: lib/features/distribute-elements/DistributeElementsMenuProvider.js
  function DistributeElementsMenuProvider (line 28) | function DistributeElementsMenuProvider(

FILE: lib/features/drilldown/DrilldownBreadcrumbs.js
  function DrilldownBreadcrumbs (line 29) | function DrilldownBreadcrumbs(eventBus, elementRegistry, canvas) {
  function getBusinessObjectParentChain (line 127) | function getBusinessObjectParentChain(child) {

FILE: lib/features/drilldown/DrilldownCentering.js
  function DrilldownCentering (line 16) | function DrilldownCentering(eventBus, canvas) {
  function Map (line 69) | function Map() {

FILE: lib/features/drilldown/DrilldownOverlayBehavior.js
  function DrilldownOverlayBehavior (line 32) | function DrilldownOverlayBehavior(

FILE: lib/features/drilldown/SubprocessCompatibility.js
  function SubprocessCompatibility (line 29) | function SubprocessCompatibility(eventBus, moddle) {
  function findRootDiagram (line 210) | function findRootDiagram(element) {
  function getPlaneBounds (line 223) | function getPlaneBounds(plane) {
  function shouldMoveToPlane (line 251) | function shouldMoveToPlane(businessObject, plane) {

FILE: lib/features/editor-actions/BpmnEditorActions.js
  function BpmnEditorActions (line 22) | function BpmnEditorActions(injector) {

FILE: lib/features/grid-snapping/BpmnGridSnapping.js
  function BpmnGridSnapping (line 10) | function BpmnGridSnapping(eventBus) {

FILE: lib/features/grid-snapping/behavior/GridSnappingAutoPlaceBehavior.js
  function GridSnappingAutoPlaceBehavior (line 21) | function GridSnappingAutoPlaceBehavior(eventBus, gridSnapping, elementRe...
  function isHorizontal (line 75) | function isHorizontal(axis) {

FILE: lib/features/grid-snapping/behavior/GridSnappingLayoutConnectionBehavior.js
  function GridSnappingLayoutConnectionBehavior (line 29) | function GridSnappingLayoutConnectionBehavior(eventBus, gridSnapping, mo...
  function hasMiddleSegments (line 99) | function hasMiddleSegments(waypoints) {
  function horizontallyAligned (line 110) | function horizontallyAligned(aligned) {
  function verticallyAligned (line 121) | function verticallyAligned(aligned) {
  function snapSegment (line 132) | function snapSegment(gridSnapping, segmentStart, segmentEnd) {

FILE: lib/features/grid-snapping/behavior/GridSnappingParticipantBehavior.js
  function GridSnappingParticipantBehavior (line 16) | function GridSnappingParticipantBehavior(canvas, eventBus, gridSnapping) {

FILE: lib/features/interaction-events/BpmnInteractionEvents.js
  function BpmnInteractionEvents (line 26) | function BpmnInteractionEvents(eventBus, interactionEvents) {

FILE: lib/features/keyboard/BpmnKeyboardBindings.js
  function BpmnKeyboardBindings (line 16) | function BpmnKeyboardBindings(injector) {
  function addListener (line 45) | function addListener(action, fn) {

FILE: lib/features/label-editing/LabelEditingPreview.js
  function LabelEditingPreview (line 31) | function LabelEditingPreview(eventBus, canvas, pathMap) {
  function getStrokeColor (line 142) | function getStrokeColor(element, defaultColor) {

FILE: lib/features/label-editing/LabelEditingProvider.js
  function LabelEditingProvider (line 62) | function LabelEditingProvider(
  function isCollapsedSubProcess (line 502) | function isCollapsedSubProcess(element) {
  function isExpandedSubProcess (line 506) | function isExpandedSubProcess(element) {
  function isCollapsedPool (line 510) | function isCollapsedPool(element) {
  function isExpandedPool (line 514) | function isExpandedPool(element) {
  function isEmptyText (line 518) | function isEmptyText(label) {

FILE: lib/features/label-editing/cmd/UpdateLabelHandler.js
  function UpdateLabelHandler (line 37) | function UpdateLabelHandler(modeling, textRenderer, bpmnFactory) {
  function isEmptyText (line 148) | function isEmptyText(label) {

FILE: lib/features/label-link/LabelLink.js
  constant ALLOWED_ELEMENTS (line 27) | const ALLOWED_ELEMENTS = [ 'bpmn:Event', 'bpmn:SequenceFlow', 'bpmn:Gate...
  constant LINE_STYLE (line 29) | const LINE_STYLE = {
  constant DISTANCE_THRESHOLD (line 35) | const DISTANCE_THRESHOLD = 15;
  constant PATH_OFFSET (line 36) | const PATH_OFFSET = 2;
  function LabelLink (line 47) | function LabelLink(eventBus, canvas, graphicsFactory, outline, selection) {
  function parseSvgNumAttr (line 204) | function parseSvgNumAttr(node, attr) {

FILE: lib/features/modeling-feedback/ModelingFeedback.js
  function ModelingFeedback (line 17) | function ModelingFeedback(eventBus, tooltips, translate) {

FILE: lib/features/modeling/BpmnFactory.js
  function BpmnFactory (line 27) | function BpmnFactory(moddle) {

FILE: lib/features/modeling/BpmnLayouter.js
  function BpmnLayouter (line 112) | function BpmnLayouter(elementRegistry) {
  function getAttachOrientation (line 210) | function getAttachOrientation(attachedElement) {
  function getMessageFlowManhattanOptions (line 216) | function getMessageFlowManhattanOptions(source, target, layout) {
  function getMessageFlowPreserveDocking (line 223) | function getMessageFlowPreserveDocking(source, target) {
  function getSubProcessPreserveDocking (line 255) | function getSubProcessPreserveDocking(source) {
  function getConnectionDocking (line 259) | function getConnectionDocking(point, shape) {
  function isCompensationAssociation (line 263) | function isCompensationAssociation(source, target) {
  function isExpandedSubProcess (line 269) | function isExpandedSubProcess(element) {
  function isSame (line 273) | function isSame(a, b) {
  function isAnyOrientation (line 277) | function isAnyOrientation(orientation, orientations) {
  function getHorizontalOrientation (line 281) | function getHorizontalOrientation(orientation) {
  function getVerticalOrientation (line 287) | function getVerticalOrientation(orientation) {
  function isOppositeOrientation (line 293) | function isOppositeOrientation(a, b) {
  function isOppositeHorizontalOrientation (line 297) | function isOppositeHorizontalOrientation(a, b) {
  function isOppositeVerticalOrientation (line 305) | function isOppositeVerticalOrientation(a, b) {
  function isHorizontalOrientation (line 313) | function isHorizontalOrientation(orientation) {
  function getLoopPreferredLayout (line 317) | function getLoopPreferredLayout(source, connection, layout) {
  function getBoundaryEventPreferredLayouts (line 333) | function getBoundaryEventPreferredLayouts(source, target, end, layout) {
  function getBoundaryEventLoopLayout (line 362) | function getBoundaryEventLoopLayout(attachOrientation, attachedToSide, s...
  function shouldConnectToSameSide (line 380) | function shouldConnectToSameSide(axis, source, target, end) {
  function areCloseOnAxis (line 393) | function areCloseOnAxis(axis, a, b, threshold) {
  function getBoundaryEventSourceLayout (line 397) | function getBoundaryEventSourceLayout(attachOrientation, targetOrientati...
  function getBoundaryEventTargetLayout (line 435) | function getBoundaryEventTargetLayout(attachOrientation, targetOrientati...

FILE: lib/features/modeling/BpmnUpdater.js
  function BpmnUpdater (line 53) | function BpmnUpdater(
  function getDefinitions (line 504) | function getDefinitions(element) {
  function ifBpmn (line 781) | function ifBpmn(fn) {
  function getEmbeddedLabelBounds (line 801) | function getEmbeddedLabelBounds(shape) {

FILE: lib/features/modeling/ElementFactory.js
  function ElementFactory (line 64) | function ElementFactory(bpmnFactory, moddle) {
  function applyAttributes (line 372) | function applyAttributes(element, attrs, attributeNames) {
  function applyAttribute (line 390) | function applyAttribute(element, attrs, attributeName) {
  function isModdleDi (line 405) | function isModdleDi(element) {

FILE: lib/features/modeling/ElementFactory.test.ts
  type CustomShape (line 123) | type CustomShape = {
  class CustomElementFactory (line 127) | class CustomElementFactory extends ElementFactory<Connection, Label, Roo...

FILE: lib/features/modeling/Modeling.js
  function Modeling (line 58) | function Modeling(

FILE: lib/features/modeling/Modeling.test.ts
  type CustomElement (line 126) | type CustomElement = {
  type CustomShape (line 130) | type CustomShape = {
  class CustomModeling (line 134) | class CustomModeling extends Modeling<Connection, CustomElement, Label, ...

FILE: lib/features/modeling/behavior/AdaptiveLabelPositioningBehavior.js
  function AdaptiveLabelPositioningBehavior (line 46) | function AdaptiveLabelPositioningBehavior(eventBus, modeling) {
  function getTakenHostAlignments (line 192) | function getTakenHostAlignments(element) {
  function getTakenConnectionAlignments (line 223) | function getTakenConnectionAlignments(element) {
  function getOptimalPosition (line 249) | function getOptimalPosition(element) {
  function getApproximateOrientation (line 282) | function getApproximateOrientation(p0, p1) {
  function isAligned (line 286) | function isAligned(orientation) {

FILE: lib/features/modeling/behavior/AppendBehavior.js
  function AppendBehavior (line 11) | function AppendBehavior(eventBus) {

FILE: lib/features/modeling/behavior/AssociationBehavior.js
  function AssociationBehavior (line 21) | function AssociationBehavior(injector, modeling) {

FILE: lib/features/modeling/behavior/AttachEventBehavior.js
  function AttachEventBehavior (line 25) | function AttachEventBehavior(bpmnReplace, injector) {
  function getEventDefinition (line 96) | function getEventDefinition(element) {
  function shouldReplace (line 103) | function shouldReplace(shape, host) {

FILE: lib/features/modeling/behavior/BoundaryEventBehavior.js
  function BoundaryEventBehavior (line 23) | function BoundaryEventBehavior(eventBus, modeling) {

FILE: lib/features/modeling/behavior/CompensateBoundaryEventBehavior.js
  function CompensateBoundaryEventBehavior (line 21) | function CompensateBoundaryEventBehavior(eventBus, modeling, bpmnRules) {
  function isForCompensation (line 210) | function isForCompensation(element) {
  function isCompensationBoundaryEvent (line 215) | function isCompensationBoundaryEvent(element) {
  function isForCompensationAllowed (line 220) | function isForCompensationAllowed(element) {

FILE: lib/features/modeling/behavior/CreateBehavior.js
  function CreateBehavior (line 16) | function CreateBehavior(injector) {

FILE: lib/features/modeling/behavior/CreateDataObjectBehavior.js
  function CreateDataObjectBehavior (line 18) | function CreateDataObjectBehavior(eventBus, bpmnFactory) {

FILE: lib/features/modeling/behavior/CreateParticipantBehavior.js
  function CreateParticipantBehavior (line 41) | function CreateParticipantBehavior(canvas, eventBus, modeling) {
  function getParticipantBounds (line 206) | function getParticipantBounds(shape, childrenBBox) {
  function getParticipantCreateConstraints (line 223) | function getParticipantCreateConstraints(shape, childrenBBox) {
  function findParticipant (line 234) | function findParticipant(elements) {

FILE: lib/features/modeling/behavior/DataInputAssociationBehavior.js
  function DataInputAssociationBehavior (line 38) | function DataInputAssociationBehavior(eventBus, bpmnFactory) {
  function ifDataInputAssociation (line 153) | function ifDataInputAssociation(fn) {

FILE: lib/features/modeling/behavior/DataStoreBehavior.js
  function DataStoreBehavior (line 30) | function DataStoreBehavior(
  function isDescendant (line 199) | function isDescendant(descendant, ancestor) {
  function getAncestor (line 214) | function getAncestor(element, type) {

FILE: lib/features/modeling/behavior/DeleteLaneBehavior.js
  function DeleteLaneBehavior (line 33) | function DeleteLaneBehavior(eventBus, spaceTool) {

FILE: lib/features/modeling/behavior/DetachEventBehavior.js
  function DetachEventBehavior (line 26) | function DetachEventBehavior(bpmnReplace, injector) {
  function getEventDefinition (line 89) | function getEventDefinition(element) {
  function shouldReplace (line 96) | function shouldReplace(shape, host) {
  function includes (line 100) | function includes(array, item) {

FILE: lib/features/modeling/behavior/DropOnFlowBehavior.js
  function DropOnFlowBehavior (line 29) | function DropOnFlowBehavior(eventBus, bpmnRules, modeling) {
  function isPointInsideBBox (line 208) | function isPointInsideBBox(bbox, point) {
  function copy (line 218) | function copy(obj) {

FILE: lib/features/modeling/behavior/EventBasedGatewayBehavior.js
  function EventBasedGatewayBehavior (line 16) | function EventBasedGatewayBehavior(eventBus, modeling) {
  function isSequenceFlow (line 109) | function isSequenceFlow(connection) {

FILE: lib/features/modeling/behavior/FixHoverBehavior.js
  function FixHoverBehavior (line 22) | function FixHoverBehavior(elementRegistry, eventBus, canvas) {

FILE: lib/features/modeling/behavior/GroupBehavior.js
  function GroupBehavior (line 45) | function GroupBehavior(

FILE: lib/features/modeling/behavior/ImportDockingFix.js
  function ImportDockingFix (line 16) | function ImportDockingFix(eventBus) {
  function getDistance (line 82) | function getDistance(p1, p2) {

FILE: lib/features/modeling/behavior/IsHorizontalFix.js
  function IsHorizontalFix (line 24) | function IsHorizontalFix(eventBus) {

FILE: lib/features/modeling/behavior/LabelBehavior.js
  function LabelBehavior (line 72) | function LabelBehavior(
  function getReferencePointDelta (line 266) | function getReferencePointDelta(referencePoint, oldBounds, newBounds) {
  function getReferencePoint (line 282) | function getReferencePoint(point, lines) {
  function asEdges (line 300) | function asEdges(bounds) {
  function getNearestLine (line 352) | function getNearestLine(point, lines) {

FILE: lib/features/modeling/behavior/LayoutConnectionBehavior.js
  function LayoutConnectionBehavior (line 23) | function LayoutConnectionBehavior(eventBus, modeling) {

FILE: lib/features/modeling/behavior/MessageFlowBehavior.js
  function MessageFlowBehavior (line 27) | function MessageFlowBehavior(eventBus, modeling) {
  function isParticipantCollapse (line 62) | function isParticipantCollapse(oldShape, newShape) {
  function getMessageFlows (line 69) | function getMessageFlows(parent) {

FILE: lib/features/modeling/behavior/NonInterruptingBehavior.js
  function NonInterruptingBehavior (line 7) | function NonInterruptingBehavior(injector, modeling) {

FILE: lib/features/modeling/behavior/RemoveElementBehavior.js
  function RemoveElementBehavior (line 20) | function RemoveElementBehavior(eventBus, bpmnRules, modeling) {
  function getDocking (line 68) | function getDocking(point) {
  function getNewWaypoints (line 73) | function getNewWaypoints(inWaypoints, outWaypoints) {

FILE: lib/features/modeling/behavior/RemoveEmbeddedLabelBoundsBehavior.js
  function RemoveEmbeddedLabelBoundsBehavior (line 19) | function RemoveEmbeddedLabelBoundsBehavior(eventBus, modeling) {

FILE: lib/features/modeling/behavior/RemoveParticipantBehavior.js
  function RemoveParticipantBehavior (line 18) | function RemoveParticipantBehavior(eventBus, modeling) {

FILE: lib/features/modeling/behavior/ReplaceConnectionBehavior.js
  function ReplaceConnectionBehavior (line 26) | function ReplaceConnectionBehavior(eventBus, modeling, bpmnRules, inject...

FILE: lib/features/modeling/behavior/ReplaceElementBehaviour.js
  function ReplaceElementBehaviour (line 28) | function ReplaceElementBehaviour(

FILE: lib/features/modeling/behavior/ResizeBehavior.js
  function ResizeBehavior (line 69) | function ResizeBehavior(eventBus) {
  function addToTrbl (line 98) | function addToTrbl(trbl, attr, value, choice) {
  function addMin (line 107) | function addMin(trbl, attr, value) {
  function addMax (line 111) | function addMax(trbl, attr, value) {
  function getParticipantResizeConstraints (line 128) | function getParticipantResizeConstraints(laneShape, resizeDirection, bal...

FILE: lib/features/modeling/behavior/ResizeLaneBehavior.js
  function ResizeLaneBehavior (line 26) | function ResizeLaneBehavior(eventBus, modeling) {

FILE: lib/features/modeling/behavior/RootElementReferenceBehavior.js
  function RootElementReferenceBehavior (line 52) | function RootElementReferenceBehavior(
  function hasAnyEventDefinition (line 203) | function hasAnyEventDefinition(element, types) {

FILE: lib/features/modeling/behavior/SetCompensationActivityAfterPasteBehavior.js
  function SetCompensationActivityAfterPasteBehavior (line 22) | function SetCompensationActivityAfterPasteBehavior(eventBus, modeling) {
  function isForCompensation (line 49) | function isForCompensation(element) {
  function isCompensationBoundaryEvent (line 54) | function isCompensationBoundaryEvent(element) {
  function isConnectedToCompensationBoundaryEvent (line 59) | function isConnectedToCompensationBoundaryEvent(element) {

FILE: lib/features/modeling/behavior/SpaceToolBehavior.js
  function SpaceToolBehavior (line 33) | function SpaceToolBehavior(eventBus) {
  function isHorizontalAxis (line 72) | function isHorizontalAxis(axis) {
  function getParticipantMinDimensions (line 85) | function getParticipantMinDimensions(participant, axis, start) {
  function getParticipantMinHeight (line 128) | function getParticipantMinHeight(participant, start, isHorizontalResize) {
  function getParticipantMinWidth (line 143) | function getParticipantMinWidth(participant, start, isHorizontalResize) {
  function hasChildLanes (line 149) | function hasChildLanes(element) {
  function getLanesMinHeight (line 153) | function getLanesMinHeight(participant, resizeStart, isHorizontalResize) {
  function getLanesMinWidth (line 165) | function getLanesMinWidth(participant, resizeStart, isHorizontalResize) {
  function findResizedLane (line 186) | function findResizedLane(lanes, resizeStart, isHorizontalResize) {

FILE: lib/features/modeling/behavior/SubProcessPlaneBehavior.js
  function SubProcessPlaneBehavior (line 60) | function SubProcessPlaneBehavior(
  function collectAnnotationElements (line 655) | function collectAnnotationElements(elements) {
  function getSubProcessChildren (line 675) | function getSubProcessChildren(element) {
  function getExternalLabels (line 689) | function getExternalLabels(element) {

FILE: lib/features/modeling/behavior/SubProcessStartEventBehavior.js
  function SubProcessStartEventBehavior (line 20) | function SubProcessStartEventBehavior(injector, modeling) {
  function getStartEventPosition (line 51) | function getStartEventPosition(shape) {

FILE: lib/features/modeling/behavior/TextAnnotationBehavior.js
  function TextAnnotationBehavior (line 11) | function TextAnnotationBehavior(eventBus) {

FILE: lib/features/modeling/behavior/ToggleCollapseConnectionBehaviour.js
  function ToggleCollapseConnectionBehaviour (line 31) | function ToggleCollapseConnectionBehaviour(

FILE: lib/features/modeling/behavior/ToggleElementCollapseBehaviour.js
  function ToggleElementCollapseBehaviour (line 27) | function ToggleElementCollapseBehaviour(
  function filterVisible (line 153) | function filterVisible(elements) {

FILE: lib/features/modeling/behavior/UnclaimIdBehavior.js
  function UnclaimIdBehavior (line 25) | function UnclaimIdBehavior(canvas, injector, moddle, modeling) {

FILE: lib/features/modeling/behavior/UnsetDefaultFlowBehavior.js
  function DeleteSequenceFlowBehavior (line 22) | function DeleteSequenceFlowBehavior(eventBus, modeling) {
  function isDefaultFlow (line 50) | function isDefaultFlow(connection, source) {

FILE: lib/features/modeling/behavior/UpdateFlowNodeRefsBehavior.js
  function UpdateFlowNodeRefsBehavior (line 24) | function UpdateFlowNodeRefsBehavior(eventBus, modeling) {
  function UpdateContext (line 134) | function UpdateContext() {

FILE: lib/features/modeling/behavior/util/CategoryUtil.js
  function createCategory (line 19) | function createCategory(bpmnFactory) {
  function createCategoryValue (line 30) | function createCategoryValue(bpmnFactory) {
  function linkCategoryValue (line 43) | function linkCategoryValue(categoryValue, category, definitions) {
  function unlinkCategoryValue (line 60) | function unlinkCategoryValue(categoryValue) {
  function unlinkCategory (line 78) | function unlinkCategory(category) {

FILE: lib/features/modeling/behavior/util/ConnectionLayoutUtil.js
  function getConnectionAdjustment (line 19) | function getConnectionAdjustment(position, newWaypoints, oldWaypoints, h...

FILE: lib/features/modeling/behavior/util/LabelLayoutUtil.js
  function findNewLabelLineStartIndex (line 23) | function findNewLabelLineStartIndex(oldWaypoints, newWaypoints, attachme...
  function getLabelAdjustment (line 38) | function getLabelAdjustment(label, newWaypoints, oldWaypoints, hints) {

FILE: lib/features/modeling/behavior/util/LayoutUtil.js
  function findNewLineStartIndex (line 47) | function findNewLineStartIndex(oldWaypoints, newWaypoints, attachment, h...
  function getAnchorPointAdjustment (line 138) | function getAnchorPointAdjustment(position, newWaypoints, oldWaypoints, ...
  function relativePositionMidWaypoint (line 233) | function relativePositionMidWaypoint(waypoints, idx) {
  function getAngleDelta (line 243) | function getAngleDelta(l1, l2) {
  function getLine (line 249) | function getLine(waypoints, idx) {
  function getRelativeFootPosition (line 253) | function getRelativeFootPosition(line, foot) {

FILE: lib/features/modeling/behavior/util/LineAttachmentUtil.js
  function sq (line 25) | function sq(n) {
  function getDistance (line 37) | function getDistance(p1, p2) {
  function getAttachment (line 67) | function getAttachment(point, line) {
  function getCircleSegmentIntersections (line 146) | function getCircleSegmentIntersections(s1, s2, cc, cr) {
  function isPointInSegment (line 199) | function isPointInSegment(p, segmentStart, segmentEnd) {
  function fenced (line 206) | function fenced(n, rangeStart, rangeEnd) {
  function mid (line 225) | function mid(p1, p2) {
  function pointsEqual (line 235) | function pointsEqual(p1, p2) {

FILE: lib/features/modeling/behavior/util/LineIntersect.js
  function lineIntersect (line 15) | function lineIntersect(l1s, l1e, l2s, l2e) {

FILE: lib/features/modeling/behavior/util/NonInterruptingUtil.js
  constant NON_INTERRUPTING_EVENT_TYPES (line 4) | const NON_INTERRUPTING_EVENT_TYPES = [
  function canBeNonInterrupting (line 12) | function canBeNonInterrupting(shape) {
  function getInterruptingProperty (line 31) | function getInterruptingProperty(shape) {

FILE: lib/features/modeling/cmd/AddLaneHandler.js
  function AddLaneHandler (line 35) | function AddLaneHandler(modeling, spaceTool) {

FILE: lib/features/modeling/cmd/IdClaimHandler.js
  function IdClaimHandler (line 12) | function IdClaimHandler(moddle) {

FILE: lib/features/modeling/cmd/ResizeLaneHandler.js
  function ResizeLaneHandler (line 39) | function ResizeLaneHandler(modeling, spaceTool) {

FILE: lib/features/modeling/cmd/SetColorHandler.js
  function SetColorHandler (line 37) | function SetColorHandler(commandStack) {
  function colorToHex (line 136) | function colorToHex(color) {
  function ensureLegacySupport (line 154) | function ensureLegacySupport(di) {

FILE: lib/features/modeling/cmd/SplitLaneHandler.js
  function SplitLaneHandler (line 24) | function SplitLaneHandler(modeling) {

FILE: lib/features/modeling/cmd/UpdateCanvasRootHandler.js
  function UpdateCanvasRootHandler (line 21) | function UpdateCanvasRootHandler(canvas, modeling) {

FILE: lib/features/modeling/cmd/UpdateFlowNodeRefsHandler.js
  function UpdateFlowNodeRefsHandler (line 38) | function UpdateFlowNodeRefsHandler(elementRegistry) {
  function isInLaneShape (line 66) | function isInLaneShape(element, laneShape) {
  function addFlowNodeShape (line 81) | function addFlowNodeShape(flowNodeShape) {
  function getAllLaneShapes (line 88) | function getAllLaneShapes(flowNodeShape) {
  function getNewLanes (line 99) | function getNewLanes(flowNodeShape) {

FILE: lib/features/modeling/cmd/UpdateModdlePropertiesHandler.js
  function UpdateModdlePropertiesHandler (line 26) | function UpdateModdlePropertiesHandler(elementRegistry) {
  function getModdleProperties (line 87) | function getModdleProperties(moddleElement, propertyNames) {
  function setModdleProperties (line 94) | function setModdleProperties(moddleElement, properties) {
  function getAllDataObjectReferences (line 100) | function getAllDataObjectReferences(dataObject, elementRegistry) {

FILE: lib/features/modeling/cmd/UpdatePropertiesHandler.js
  function UpdatePropertiesHandler (line 50) | function UpdatePropertiesHandler(
  function isIdChange (line 180) | function isIdChange(properties, businessObject) {
  function getProperties (line 185) | function getProperties(element, properties) {
  function getDiProperties (line 205) | function getDiProperties(di, propertyNames) {
  function setProperties (line 214) | function setProperties(element, properties) {
  function setDiProperties (line 233) | function setDiProperties(di, properties) {
  function unwrapBusinessObjects (line 250) | function unwrapBusinessObjects(properties) {

FILE: lib/features/modeling/cmd/UpdateSemanticParentHandler.js
  function UpdateSemanticParentHandler (line 12) | function UpdateSemanticParentHandler(bpmnUpdater) {

FILE: lib/features/modeling/util/LaneUtil.js
  function getTRBLResize (line 29) | function getTRBLResize(oldBounds, newBounds) {
  function collectLanes (line 51) | function collectLanes(shape, collectedShapes) {
  function getChildLanes (line 74) | function getChildLanes(shape) {
  function getLanesRoot (line 88) | function getLanesRoot(shape) {
  function computeLanesResize (line 106) | function computeLanesResize(shape, newBounds) {

FILE: lib/features/modeling/util/ModelingUtil.js
  function getParent (line 26) | function getParent(element, anyType) {
  function isDirectionHorizontal (line 49) | function isDirectionHorizontal(element, elementRegistry) {

FILE: lib/features/ordering/BpmnOrderingProvider.js
  function BpmnOrderingProvider (line 26) | function BpmnOrderingProvider(eventBus, canvas) {

FILE: lib/features/outline/OutlineProvider.js
  constant DEFAULT_OFFSET (line 33) | const DEFAULT_OFFSET = 5;
  function OutlineProvider (line 43) | function OutlineProvider(outline, styles) {
  function isStandardSize (line 193) | function isStandardSize(element, type) {

FILE: lib/features/outline/OutlineUtil.js
  constant DATA_OBJECT_REFERENCE_OUTLINE_PATH (line 5) | const DATA_OBJECT_REFERENCE_OUTLINE_PATH = 'M44.7648 11.3263L36.9892 2.6...
  constant DATA_STORE_REFERENCE_OUTLINE_PATH (line 6) | const DATA_STORE_REFERENCE_OUTLINE_PATH = 'M1.03845 48.1347C1.03845 49.3...
  constant DATA_OBJECT_REFERENCE_STANDARD_SIZE (line 15) | const DATA_OBJECT_REFERENCE_STANDARD_SIZE = { width: 36, height: 50 };
  constant DATA_STORE_REFERENCE_STANDARD_SIZE (line 20) | const DATA_STORE_REFERENCE_STANDARD_SIZE = { width: 50, height: 50 };
  function createPath (line 29) | function createPath(path, attrs, OUTLINE_STYLE) {

FILE: lib/features/palette/PaletteProvider.js
  function PaletteProvider (line 30) | function PaletteProvider(
  function createAction (line 72) | function createAction(type, group, className, title, options) {
  function createSubprocess (line 90) | function createSubprocess(event) {
  function createParticipant (line 112) | function createParticipant(event) {

FILE: lib/features/popup-menu/ReplaceMenuProvider.js
  function ReplaceMenuProvider (line 61) | function ReplaceMenuProvider(
  function toggleLoopCharacteristics (line 492) | function toggleLoopCharacteristics(event, entry) {
  function toggleIsCollection (line 577) | function toggleIsCollection(event, entry) {
  function toggleParticipantMultiplicity (line 609) | function toggleParticipantMultiplicity(event, entry) {

FILE: lib/features/popup-menu/util/TypeUtil.js
  function isDifferentType (line 25) | function isDifferentType(element) {

FILE: lib/features/replace-preview/BpmnReplacePreview.js
  function BpmnReplacePreview (line 37) | function BpmnReplacePreview(

FILE: lib/features/replace/BpmnReplace.js
  function copyProperties (line 60) | function copyProperties(source, target, properties) {
  function shouldToggleCollapsed (line 84) | function shouldToggleCollapsed(element, targetElement) {
  function BpmnReplace (line 122) | function BpmnReplace(
  function isSubProcess (line 361) | function isSubProcess(businessObject) {
  function hasEventDefinition (line 371) | function hasEventDefinition(element, type) {
  function intersection (line 387) | function intersection(a, b) {

FILE: lib/features/rules/BpmnRules.js
  function BpmnRules (line 68) | function BpmnRules(eventBus) {
  function canStartConnection (line 250) | function canStartConnection(element) {
  function nonExistingOrLabel (line 270) | function nonExistingOrLabel(element) {
  function getOrganizationalParent (line 279) | function getOrganizationalParent(element) {
  function isTextAnnotation (line 301) | function isTextAnnotation(element) {
  function isGroup (line 310) | function isGroup(element) {
  function isCompensationBoundary (line 319) | function isCompensationBoundary(element) {
  function isForCompensation (line 329) | function isForCompensation(element) {
  function isSameOrganization (line 339) | function isSameOrganization(a, b) {
  function isMessageFlowSource (line 351) | function isMessageFlowSource(element) {
  function isMessageFlowTarget (line 368) | function isMessageFlowTarget(element) {
  function getScopeParent (line 388) | function getScopeParent(element) {
  function isSameScope (line 412) | function isSameScope(a, b) {
  function hasEventDefinition (line 425) | function hasEventDefinition(element, eventDefinition) {
  function hasEventDefinitionOrNone (line 439) | function hasEventDefinitionOrNone(element, eventDefinition) {
  function isSequenceFlowSource (line 452) | function isSequenceFlowSource(element) {
  function isSequenceFlowTarget (line 470) | function isSequenceFlowTarget(element) {
  function isEventBasedTarget (line 488) | function isEventBasedTarget(element) {
  function getParents (line 506) | function getParents(element) {
  function isParent (line 527) | function isParent(possibleParent, element) {
  function canConnect (line 540) | function canConnect(source, target, connection) {
  function canDrop (line 588) | function canDrop(element, target) {
  function isDroppableBoundaryEvent (line 669) | function isDroppableBoundaryEvent(event) {
  function isBoundaryEvent (line 680) | function isBoundaryEvent(element) {
  function isLane (line 689) | function isLane(element) {
  function isBoundaryCandidate (line 700) | function isBoundaryCandidate(element) {
  function hasNoEventDefinition (line 720) | function hasNoEventDefinition(element) {
  function hasCommonBoundaryIntermediateEventDefinition (line 731) | function hasCommonBoundaryIntermediateEventDefinition(element) {
  function hasOneOfEventDefinitions (line 746) | function hasOneOfEventDefinitions(element, eventDefinitions) {
  function isReceiveTaskAfterEventBasedGateway (line 757) | function isReceiveTaskAfterEventBasedGateway(element) {
  function canAttach (line 776) | function canAttach(elements, target, source, position) {
  function canReplace (line 845) | function canReplace(elements, target, position) {
  function canMove (line 931) | function canMove(elements, target) {
  function canCreate (line 956) | function canCreate(shape, target, source, position) {
  function canResize (line 975) | function canResize(shape, newBounds) {
  function isOneTextAnnotation (line 1011) | function isOneTextAnnotation(source, target) {
  function canConnectAssociation (line 1028) | function canConnectAssociation(source, target) {
  function canConnectCompensationAssociation (line 1051) | function canConnectCompensationAssociation(source, target) {
  function canConnectMessageFlow (line 1067) | function canConnectMessageFlow(source, target) {
  function canConnectSequenceFlow (line 1088) | function canConnectSequenceFlow(source, target) {
  function canConnectDataAssociation (line 1101) | function canConnectDataAssociation(source, target) {
  function canInsert (line 1123) | function canInsert(shape, connection, position) {
  function includes (line 1156) | function includes(elements, element) {
  function canCopy (line 1166) | function canCopy(elements, element) {
  function getRootElement (line 1183) | function getRootElement(element) {
  function isHostOfElement (line 1187) | function isHostOfElement(potentialHost, element) {

FILE: lib/features/search/BpmnSearchProvider.js
  function BpmnSearchProvider (line 29) | function BpmnSearchProvider(elementRegistry, searchPad, canvas, search) {
  function toSearchPadResult (line 78) | function toSearchPadResult(result) {

FILE: lib/features/snapping/BpmnConnectSnapping.js
  function BpmnConnectSnapping (line 47) | function BpmnConnectSnapping(eventBus) {
  function snapToShape (line 131) | function snapToShape(event, target, padding) {
  function snapToTargetMid (line 149) | function snapToTargetMid(event, target) {
  function snapBoundaryEventLoop (line 164) | function snapBoundaryEventLoop(event) {
  function snapToPosition (line 205) | function snapToPosition(event, position) {
  function isType (line 210) | function isType(attrs, type) {
  function isAnyType (line 214) | function isAnyType(attrs, types) {
  function getDimensionForAxis (line 226) | function getDimensionForAxis(axis, element) {
  function getTargetBoundsPadding (line 235) | function getTargetBoundsPadding(target) {
  function isMid (line 250) | function isMid(event, target, axis) {
  function isReverse (line 255) | function isReverse(context) {

FILE: lib/features/snapping/BpmnCreateMoveSnapping.js
  function BpmnCreateMoveSnapping (line 47) | function BpmnCreateMoveSnapping(eventBus, injector) {
  function snapBoundaryEvent (line 198) | function snapBoundaryEvent(event, target) {
  function areAll (line 233) | function areAll(elements, type) {
  function isContainer (line 242) | function isContainer(element) {
  function setSnappedIfConstrained (line 253) | function setSnappedIfConstrained(event) {
  function includes (line 275) | function includes(array, value) {
  function getDockingSnapOrigin (line 279) | function getDockingSnapOrigin(docking, isMove, event) {

FILE: lib/features/snapping/BpmnSnappingUtil.js
  function getBoundaryAttachment (line 15) | function getBoundaryAttachment(position, targetBounds) {

FILE: lib/features/space-tool/BpmnSpaceTool.js
  function BpmnSpaceTool (line 26) | function BpmnSpaceTool(injector, canvas) {
  function isCollapsedPool (line 95) | function isCollapsedPool(shape) {

FILE: lib/import/BpmnImporter.js
  function elementData (line 48) | function elementData(semantic, di, attrs) {
  function getWaypoints (line 57) | function getWaypoints(di, source, target) {
  function notYetDrawn (line 70) | function notYetDrawn(semantic, refSemantic, property) {
  function BpmnImporter (line 86) | function BpmnImporter(
  function isPointInsideBBox (line 351) | function isPointInsideBBox(bbox, point) {
  function isFrameElement (line 361) | function isFrameElement(semantic) {

FILE: lib/import/BpmnTreeWalker.js
  function is (line 27) | function is(element, type) {
  function findDisplayCandidate (line 40) | function findDisplayCandidate(definitions) {
  function BpmnTreeWalker (line 49) | function BpmnTreeWalker(handler) {

FILE: lib/import/Importer.js
  function importBpmnDiagram (line 34) | function importBpmnDiagram(diagram, definitions, bpmnDiagram) {
  function getDiagramsToImport (line 127) | function getDiagramsToImport(definitions, bpmnDiagram) {
  function selfAndAllFlowElements (line 196) | function selfAndAllFlowElements(elements) {
  function findRootProcess (line 212) | function findRootProcess(element) {

FILE: lib/import/Util.js
  function elementToString (line 1) | function elementToString(e) {

FILE: lib/model/Types.ts
  type Moddle (line 9) | type Moddle = any;
  type ModdleElement (line 11) | type ModdleElement = any;
  type ModdleExtension (line 13) | type ModdleExtension = {};
  type BpmnAttributes (line 15) | type BpmnAttributes = {
  type Element (line 27) | type Element = {
  type Connection (line 33) | type Connection = BaseConnection & Element;
  type Label (line 35) | type Label = BaseLabel & Element;
  type Root (line 37) | type Root = BaseRoot & Element;
  type Shape (line 39) | type Shape = BaseShape & Element;
  type Parent (line 41) | type Parent = Root | Shape;

FILE: lib/util/AnnotationUtil.js
  function getElementAnnotations (line 16) | function getElementAnnotations(element) {
  function collectElementsAnnotations (line 42) | function collectElementsAnnotations(elements) {

FILE: lib/util/CompatibilityUtil.js
  function ensureCompatDiRef (line 19) | function ensureCompatDiRef(businessObject) {

FILE: lib/util/DiUtil.js
  function isExpanded (line 22) | function isExpanded(element, di) {
  function isHorizontal (line 50) | function isHorizontal(element) {
  function isInterrupting (line 70) | function isInterrupting(element) {
  function isEventSubProcess (line 79) | function isEventSubProcess(element) {
  function hasEventDefinition (line 89) | function hasEventDefinition(element, eventType) {
  function hasErrorEventDefinition (line 102) | function hasErrorEventDefinition(element) {
  function hasEscalationEventDefinition (line 111) | function hasEscalationEventDefinition(element) {
  function hasCompensateEventDefinition (line 120) | function hasCompensateEventDefinition(element) {

FILE: lib/util/DrilldownUtil.js
  function getShapeIdFromPlane (line 17) | function getShapeIdFromPlane(element) {
  function getPlaneIdFromShape (line 30) | function getPlaneIdFromShape(element) {
  function toPlaneId (line 47) | function toPlaneId(id) {
  function isPlane (line 58) | function isPlane(element) {
  function addPlaneSuffix (line 64) | function addPlaneSuffix(id) {
  function removePlaneSuffix (line 68) | function removePlaneSuffix(id) {

FILE: lib/util/LabelUtil.js
  function isLabelExternal (line 34) | function isLabelExternal(semantic) {
  function hasExternalLabel (line 53) | function hasExternalLabel(element) {
  function getFlowLabelPosition (line 64) | function getFlowLabelPosition(waypoints) {
  function getWaypointsMid (line 98) | function getWaypointsMid(waypoints) {
  function getExternalLabelMid (line 118) | function getExternalLabelMid(element) {
  function getExternalLabelBounds (line 145) | function getExternalLabelBounds(di, element) {
  function getLabelAttr (line 182) | function getLabelAttr(semantic) {
  function getCategoryValue (line 209) | function getCategoryValue(semantic) {
  function getLabel (line 225) | function getLabel(element) {
  function setLabel (line 247) | function setLabel(element, text) {
  function isExternalLabel (line 275) | function isExternalLabel(element) {

FILE: lib/util/ModelUtil.js
  function is (line 18) | function is(element, type) {
  function isAny (line 33) | function isAny(element, types) {
  function getBusinessObject (line 46) | function getBusinessObject(element) {
  function getDi (line 57) | function getDi(element) {

FILE: lib/util/PoweredByUtil.js
  function createLightbox (line 75) | function createLightbox() {
  function open (line 88) | function open() {

FILE: lib/util/Types.ts
  type Colors (line 1) | type Colors = {

FILE: rollup.config.js
  function banner (line 74) | function banner(bundleName, minified) {
  function pgl (line 95) | function pgl(plugins = [], env = 'production') {
  function pad (line 108) | function pad(n) {
  function today (line 116) | function today() {
  function processTemplate (line 126) | function processTemplate(str, args) {

FILE: tasks/build-distro.mjs
  function resolve (line 13) | function resolve(module, sub) {
  function run (line 20) | async function run() {

FILE: tasks/test-distro.mjs
  function runTest (line 8) | function runTest(variant, env) {
  function verifyAssets (line 32) | function verifyAssets() {
  function test (line 53) | function test() {

FILE: test/config/translation-reporter.js
  function TranslationReporter (line 10) | function TranslationReporter() {

FILE: test/distro/helper.js
  function testImport (line 2) | async function testImport(BpmnJS, done) {

FILE: test/helper/TranslationCollector.js
  function collectTranslations (line 3) | function collectTranslations(template, replacements) {

FILE: test/helper/index.js
  function bootstrapBpmnJS (line 57) | function bootstrapBpmnJS(BpmnJS, diagram, options, locals) {
  function bootstrapModeler (line 162) | function bootstrapModeler(diagram, options, locals) {
  function bootstrapViewer (line 190) | function bootstrapViewer(diagram, options, locals) {
  function inject (line 217) | function inject(fn) {
  function getBpmnJS (line 237) | function getBpmnJS() {
  function clearBpmnJS (line 241) | function clearBpmnJS() {
  function createViewer (line 253) | function createViewer(container, viewerInstance, xml, diagramId) {
  function logConfigured (line 268) | function logConfigured(type, force) {
  function enableLogging (line 282) | function enableLogging(modeler, force) {
  function setBpmnJS (line 293) | function setBpmnJS(instance) {
  function insertCSS (line 297) | function insertCSS(name, css) {

FILE: test/integration/ReimportSpec.js
  function delay (line 5) | function delay(fn) {
  function finish (line 54) | function finish(err) {
  function importNext (line 60) | function importNext() {

FILE: test/integration/custom-elements/CustomElementFactory.js
  function CustomElementFactory (line 14) | function CustomElementFactory(injector) {

FILE: test/integration/custom-elements/CustomRenderer.js
  function CustomRenderer (line 16) | function CustomRenderer(eventBus, styles) {

FILE: test/integration/custom-elements/CustomRules.js
  function CustomRules (line 13) | function CustomRules(eventBus) {
  function canConnect (line 72) | function canConnect(source, target) {
  function canCreate (line 76) | function canCreate(shape, target) {
  function canMove (line 93) | function canMove(shapes, target, position) {
  function isType (line 116) | function isType(element, type) {
  function isCustom (line 122) | function isCustom(element) {

FILE: test/integration/custom-elements/CustomUpdater.js
  function isCustom (line 10) | function isCustom(element, type) {
  function ifCustomElement (line 19) | function ifCustomElement(fn) {
  function CustomUpdater (line 34) | function CustomUpdater(eventBus, modeling) {

FILE: test/integration/model/BpmnModdleSpec.js
  function parse (line 6) | function parse(xml) {

FILE: test/matchers/BoundsMatchers.js
  function getBounds (line 13) | function getBounds(s) {
  function getDimensions (line 35) | function getDimensions(s) {
  function getPosition (line 39) | function getPosition(s) {
  function inspect (line 48) | function inspect(obj) {
  function assertBounds (line 182) | function assertBounds(self, desc, bounds, expectedBounds) {
  function assertDimensions (line 205) | function assertDimensions(self, desc, dimensions, expectedDimensions) {
  function assertPosition (line 228) | function assertPosition(self, desc, position, expectedPosition) {

FILE: test/matchers/ConnectionMatchers.js
  function getPoint (line 11) | function getPoint(point) {
  function getPoints (line 15) | function getPoints(waypoints) {
  function inspect (line 24) | function inspect(obj) {
  function assertWaypoints (line 143) | function assertWaypoints(self, desc, waypoints, expectedWaypoints) {

FILE: test/spec/BaseModelerSpec.js
  function SpecialModeler (line 40) | function SpecialModeler(options) {

FILE: test/spec/BaseViewerSpec.js
  function SpecialViewer (line 38) | function SpecialViewer(options) {

FILE: test/spec/ModelerSpec.js
  function createModeler (line 45) | function createModeler(xml) {
  function isNamedA (line 653) | function isNamedA(element) {
  function verifyDrilldown (line 865) | function verifyDrilldown() {
  function createReviver (line 967) | function createReviver(moddle) {

FILE: test/spec/ViewerSpec.js
  function expectMessage (line 159) | function expectMessage(e, expectedMessage) {
  function expectWarnings (line 170) | function expectWarnings(warnings, expected) {
  function verifyDrilldown (line 394) | function verifyDrilldown(xml) {
  function CustomViewer (line 550) | function CustomViewer(options) {
  function CustomViewer (line 605) | function CustomViewer(options) {
  function currentTime (line 1436) | function currentTime() {
  function validSVG (line 1440) | function validSVG(svg) {
  function appendTestRect (line 1534) | function appendTestRect(svgDoc) {
  function clearDiagram (line 1802) | function clearDiagram() {

FILE: test/spec/draw/BpmnRendererSpec.js
  function checkErrors (line 44) | function checkErrors(err, warnings) {
  function expectedColors (line 573) | function expectedColors(color) {
  function expectFillColor (line 603) | function expectFillColor(element, color) {
  function expectStrokeColor (line 607) | function expectStrokeColor(element, color) {
  function expectColors (line 619) | function expectColors(element, gfx, fillColor, strokeColor, labelColor) {
  class CustomColors (line 823) | class CustomColors {
    method constructor (line 824) | constructor(eventBus) {
  class CustomBounds (line 880) | class CustomBounds {
    method constructor (line 881) | constructor(eventBus) {
  function isCollapsedSubProcess (line 987) | function isCollapsedSubProcess(element) {
  function expectDistance (line 1005) | function expectDistance(element1, element2, distance, tolerance = 3) {

FILE: test/spec/draw/custom-renderer/CustomRenderer.js
  function CustomRenderer (line 18) | function CustomRenderer(

FILE: test/spec/features/align-elements/AlignElementsContextPadProviderSpec.js
  function getEntry (line 92) | function getEntry(target, actionName) {
  function padEntry (line 98) | function padEntry(element, name) {

FILE: test/spec/features/align-elements/AlignElementsMenuProviderSpec.js
  function getEntry (line 113) | function getEntry(actionName) {
  function padEntry (line 119) | function padEntry(element, name) {

FILE: test/spec/features/auto-place/BpmnAutoPlaceSpec.js
  function autoPlace (line 639) | function autoPlace(cfg) {

FILE: test/spec/features/auto-resize/AutoResizeSpec.js
  function getBounds (line 21) | function getBounds(shape) {

FILE: test/spec/features/context-pad/ContextPadProviderSpec.js
  function expectContextPadEntries (line 252) | function expectContextPadEntries(elementOrId, expectedEntries) {
  function padEntry (line 837) | function padEntry(element, name) {
  function padEvent (line 842) | function padEvent(entry) {
  function getPopupMenu (line 858) | function getPopupMenu() {

FILE: test/spec/features/copy-paste/BpmnCopyPasteSpec.js
  function copyPasteElement (line 510) | function copyPasteElement(element) {
  function expectEqual (line 732) | function expectEqual(copy, original) {
  function integrationTest (line 1069) | function integrationTest(elementIds) {
  function getPropertyForElements (line 1152) | function getPropertyForElements(elements, property) {
  function expectCollection (line 1158) | function expectCollection(collection1, collection2, contains) {
  function getAllElementsInTree (line 1174) | function getAllElementsInTree(tree, depth) {
  function findDescriptorInTree (line 1188) | function findDescriptorInTree(elements, tree, depth) {
  function _findDescriptorsInTree (line 1198) | function _findDescriptorsInTree(elements, tree, depth) {
  function copy (line 1233) | function copy(elements) {

FILE: test/spec/features/copy-paste/ModdleCopySpec.js
  function expectNoAttrs (line 1026) | function expectNoAttrs(element) {
  function getDefinitions (line 1030) | function getDefinitions(rootElement) {

FILE: test/spec/features/distribute-elements/BpmnDistributeElementsSpec.js
  function last (line 14) | function last(arr) {

FILE: test/spec/features/distribute-elements/DistributeElementsMenuProviderSpec.js
  function getEntry (line 87) | function getEntry(actionName) {
  function padEntry (line 93) | function padEntry(element, name) {

FILE: test/spec/features/drilldown/DrilldownIntegrationSpec.js
  function expectViewbox (line 182) | function expectViewbox(expectedViewbox) {
  function getBreadcrumbs (line 193) | function getBreadcrumbs() {
  function expectBreadcrumbs (line 199) | function expectBreadcrumbs(expected) {

FILE: test/spec/features/drilldown/DrilldownSpec.js
  function expectViewbox (line 247) | function expectViewbox(expectedViewbox) {
  function expectViewbox (line 468) | function expectViewbox(expectedViewbox) {
  function importXML (line 573) | async function importXML(xml) {
  function getBreadcrumbs (line 661) | function getBreadcrumbs() {
  function expectBreadcrumbs (line 667) | function expectBreadcrumbs(expected) {
  function clickBreadcrumb (line 677) | function clickBreadcrumb(index) {

FILE: test/spec/features/editor-actions/BpmnEditorActionsSpec.js
  function testMoveToOrigin (line 29) | function testMoveToOrigin(xml) {

FILE: test/spec/features/grid-snapping/BpmnGridSnappingSpec.js
  function recordEvents (line 361) | function recordEvents(eventBus, eventTypes) {
  function position (line 381) | function position(event) {
  function getBounds (line 422) | function getBounds(shape) {

FILE: test/spec/features/interaction-events/BpmnInteractionEventsSpec.js
  function expectToHaveChildren (line 221) | function expectToHaveChildren(className, expectedCount, element) {
  function getHitZones (line 236) | function getHitZones(element) {
  function expectSize (line 247) | function expectSize(element, expectedSize) {
  function getSize (line 254) | function getSize(element) {

FILE: test/spec/features/label-editing/LabelEditingPreviewSpec.js
  function bbox (line 159) | function bbox(el) {

FILE: test/spec/features/label-editing/LabelEditingProviderSpec.js
  function directEditActivate (line 281) | function directEditActivate(element) {
  function directEditUpdate (line 289) | function directEditUpdate(value) {
  function directEditComplete (line 293) | function directEditComplete(value) {
  function directEditCancel (line 298) | function directEditCancel(value) {
  function directEdit (line 429) | function directEdit(elementId) {
  function createTaskElement (line 576) | function createTaskElement(context) {
  function createParticipant (line 590) | function createParticipant() {
  function triggerKeyEvent (line 1173) | function triggerKeyEvent(element, event, code) {
  function expectBounds (line 1186) | function expectBounds(parent, bounds) {

FILE: test/spec/features/label-link/LabelLinkSpec.js
  function queryAllLinks (line 240) | function queryAllLinks() {
  function expectLinkWithPath (line 244) | function expectLinkWithPath(path) {

FILE: test/spec/features/modeling-feedback/ModelingFeedbackSpec.js
  function expectTooltip (line 70) | function expectTooltip(cls, message) {

FILE: test/spec/features/modeling/LabelBoundsSpec.js
  function createModeler (line 15) | function createModeler(xml) {

FILE: test/spec/features/modeling/LabelLayoutingSpec.js
  function getLabelPosition (line 555) | function getLabelPosition(connection) {
  function expectLabelMoved (line 568) | function expectLabelMoved(connection, oldPosition, expectedDelta) {

FILE: test/spec/features/modeling/LoggingCroppingConnectionDocking.js
  function LoggingCroppingConnectionDocking (line 10) | function LoggingCroppingConnectionDocking(injector) {

FILE: test/spec/features/modeling/MoveElementsSpec.js
  function moveWaypoint (line 298) | function moveWaypoint(p, delta) {
  function moveWaypoints (line 305) | function moveWaypoints(waypoints, delta) {

FILE: test/spec/features/modeling/MoveStressSpec.js
  function reconnect (line 35) | function reconnect(c) {
  function randomDocking (line 54) | function randomDocking() {
  function tick (line 62) | function tick() {
  function next (line 73) | function next() {

FILE: test/spec/features/modeling/ResizeShapeSpec.js
  function getPosition (line 157) | function getPosition(shape) {

FILE: test/spec/features/modeling/SetColorSpec.js
  function setColor (line 296) | function setColor() {
  function setColor (line 311) | function setColor() {

FILE: test/spec/features/modeling/behavior/AdaptiveLabelPositioningBehaviorSpec.js
  function expectLabelOrientation (line 21) | function expectLabelOrientation(element, expectedOrientation) {

FILE: test/spec/features/modeling/behavior/AttachEventBehaviorSpec.js
  function getDelta (line 175) | function getDelta(element, task) {
  function skipId (line 275) | function skipId(key, value) {

FILE: test/spec/features/modeling/behavior/BoundaryEventBehaviorSpec.js
  function getReferencedRootElement (line 188) | function getReferencedRootElement(element, propertyName) {

FILE: test/spec/features/modeling/behavior/CompensationAssociationBehaviorSpec.js
  function waypoints (line 58) | function waypoints(connection) {

FILE: test/spec/features/modeling/behavior/CreateParticipantBehaviorSpec.js
  function expectBoundsWithin (line 411) | function expectBoundsWithin(inner, outer, padding) {

FILE: test/spec/features/modeling/behavior/DataInputAssociationBehaviorSpec.js
  function getTargetRefProp (line 139) | function getTargetRefProp(element) {

FILE: test/spec/features/modeling/behavior/DetachEventBehaviorSpec.js
  function skipId (line 316) | function skipId(key, value) {

FILE: test/spec/features/modeling/behavior/LabelBehaviorSpec.js
  function copyWaypoint (line 895) | function copyWaypoint(waypoint) {
  function copyWaypoints (line 899) | function copyWaypoints(connection) {
  function getBounds (line 912) | function getBounds(element) {

FILE: test/spec/features/modeling/behavior/LayoutConnectionBehaviorSpec.js
  function copyWaypoint (line 327) | function copyWaypoint(waypoint) {
  function copyWaypoints (line 331) | function copyWaypoints(connection) {
  function expectApproximateWaypoints (line 344) | function expectApproximateWaypoints(connection, expectedWaypoints) {

FILE: test/spec/features/modeling/behavior/RemoveElementBehaviorSpec.js
  function point (line 344) | function point(p) {

FILE: test/spec/features/modeling/behavior/ReplaceConnectionBehaviorSpec.js
  function getConnection (line 28) | function getConnection(source, target, connectionOrType) {
  function expectConnected (line 35) | function expectConnected(source, target, connectionOrType, attrs) {
  function expectNotConnected (line 46) | function expectNotConnected(source, target, connectionOrType) {

FILE: test/spec/features/modeling/behavior/RootElementReferenceBehaviorSpec.js
  function getRootElementReferenced (line 813) | function getRootElementReferenced(eventDefinition) {
  function hasRootElement (line 825) | function hasRootElement(rootElement) {
  function capitalizeFirstChar (line 832) | function capitalizeFirstChar(string) {

FILE: test/spec/features/modeling/behavior/SubProcessPlaneBehaviorSpec.js
  function planeId (line 708) | function planeId(element) {

FILE: test/spec/features/modeling/behavior/SubProcessStartEventBehaviorSpec.js
  function isStartEvent (line 182) | function isStartEvent(element) {
  function getChildStartEvents (line 186) | function getChildStartEvents(element) {

FILE: test/spec/features/modeling/behavior/ToggleElementCollapseBehaviourSpec.js
  function allHidden (line 623) | function allHidden() {
  function allShown (line 627) | function allShown() {
  function childrenHidden (line 631) | function childrenHidden(hidden) {

FILE: test/spec/features/modeling/lanes/AddLaneSpec.js
  function getBounds (line 28) | function getBounds(element) {
  function addLaneAbove (line 805) | function addLaneAbove(laneId) {
  function addLaneBelow (line 816) | function addLaneBelow(laneId) {
  function addLaneLeft (line 943) | function addLaneLeft(laneId) {
  function addLaneRight (line 954) | function addLaneRight(laneId) {
  function padEntry (line 1112) | function padEntry(element, name) {
  function padEvent (line 1116) | function padEvent(entry) {
  function getPosition (line 1131) | function getPosition(element) {
  function moveWaypoints (line 1138) | function moveWaypoints(waypoints, deltaX, deltaY) {
  function movePosition (line 1144) | function movePosition(point, deltaX, deltaY) {

FILE: test/spec/features/modeling/lanes/DeleteLaneSpec.js
  function getBounds (line 240) | function getBounds(element) {

FILE: test/spec/features/modeling/lanes/ResizeLaneSpec.js
  function getBounds (line 17) | function getBounds(element) {

FILE: test/spec/features/modeling/lanes/SplitLaneSpec.js
  function getBounds (line 14) | function getBounds(element) {

FILE: test/spec/features/modeling/layout/Helper.js
  function connect (line 6) | function connect(source, target, attrs) {
  function reconnectEnd (line 22) | function reconnectEnd(connection, target, docking) {
  function element (line 38) | function element(id) {
  function move (line 43) | function move(shape, delta) {
  function inspect (line 59) | function inspect(element) {

FILE: test/spec/features/modeling/layout/LayoutConnectionSpec.js
  function toPoint (line 493) | function toPoint(p) {
  function areOnSameAxis (line 500) | function areOnSameAxis(a, b) {

FILE: test/spec/features/ordering/BpmnDiOrderingSpec.js
  function expectDiOrder (line 218) | function expectDiOrder(expectedOrder) {

FILE: test/spec/features/ordering/Helper.js
  function sign (line 10) | function sign(x) {
  function move (line 19) | function move(elementIds, delta, targetId, isAttach) {
  function add (line 63) | function add(attrs, position, target, isAttach) {
  function connect (line 87) | function connect(source, target) {
  function attach (line 113) | function attach(attrs, position, target) {
  function getAncestors (line 118) | function getAncestors(element) {
  function compareZOrder (line 131) | function compareZOrder(a, b) {
  function expectZOrder (line 196) | function expectZOrder() {

FILE: test/spec/features/palette/PaletteProviderSpec.js
  function triggerPaletteEntry (line 139) | function triggerPaletteEntry(id) {

FILE: test/spec/features/popup-menu/ReplaceMenuProviderSpec.js
  function openPopup (line 3066) | function openPopup(element, offset) {
  function queryEntry (line 3078) | function queryEntry(id) {
  function queryBodyEntries (line 3084) | function queryBodyEntries() {
  function queryEntryLabel (line 3090) | function queryEntryLabel(id) {
  function triggerAction (line 3096) | function triggerAction(id) {
  function getMenuContainer (line 3108) | function getMenuContainer() {
  function didSizeChange (line 3113) | function didSizeChange(element, newElement) {

FILE: test/spec/features/replace-preview/BpmnReplacePreviewSpec.js
  function skipCI (line 329) | function skipCI(userAgent) {

FILE: test/spec/features/replace/BpmnReplaceSpec.js
  function skipId (line 2100) | function skipId(key, value) {
  function getBounds (line 2109) | function getBounds(shape) {

FILE: test/spec/features/rules/Helper.js
  function expectCanConnect (line 16) | function expectCanConnect(source, target, rules) {
  function expectCanDrop (line 50) | function expectCanDrop(element, target, expectedResult) {
  function expectCanCreate (line 65) | function expectCanCreate(shape, target, expectedResult) {
  function expectCanCopy (line 86) | function expectCanCopy(element, elements, expectedResult) {
  function expectCanInsert (line 99) | function expectCanInsert(element, target, expectedResult) {
  function expectCanMove (line 109) | function expectCanMove(elements, target, rules) {
  function get (line 136) | function get(elementId) {

FILE: test/spec/features/search/BpmnSearchProviderSpec.js
  function expectTokens (line 238) | function expectTokens(tokens, expectedTokens) {

FILE: test/spec/features/snapping/BpmnCreateMoveSnappingSpec.js
  function get (line 611) | function get(element) {
  function absoluteMove (line 617) | function absoluteMove(element, toPosition) {
  function canvasEventTopLeft (line 720) | function canvasEventTopLeft(position, shape) {
  function getBoundaryEvent (line 727) | function getBoundaryEvent(element) {

FILE: test/spec/features/space-tool/BpmnSpaceToolSpec.js
  function makeSpace (line 722) | function makeSpace(start, delta, invert, target) {
  function $element (line 748) | function $element(id) {
  function leftOf (line 764) | function leftOf(element) {
  function rightOf (line 777) | function rightOf(element) {
  function getBounds (line 789) | function getBounds(shape) {

FILE: test/spec/helper/InjectSpec.js
  function onResolved (line 47) | function onResolved() {
  function onRejected (line 51) | function onRejected(error) {

FILE: test/spec/i18n/custom-translate/custom-translate.js
  function customTranslate (line 3) | function customTranslate(template, replacements) {

FILE: test/spec/import/BpmnTreeWalkerSpec.js
  function createModdle (line 159) | function createModdle(xml) {
  function createWalker (line 165) | function createWalker(listeners) {
  function findElementWithId (line 184) | function findElementWithId(definitions, id) {

FILE: test/spec/import/ImporterSpec.js
  function createDiagram (line 29) | function createDiagram(container, modules) {
  function runImport (line 43) | function runImport(diagram, xml, diagramId) {
  function expectChildren (line 1034) | function expectChildren(diagram, parent, children) {

FILE: test/spec/import/elements/AssociationSpec.js
  function expectRendered (line 63) | function expectRendered(elementIds) {

FILE: test/spec/import/elements/DataInputOutputSpec.js
  function getCenter (line 53) | function getCenter(element) {

FILE: test/spec/import/elements/LabelSpec.js
  function getCenter (line 88) | function getCenter(element) {

FILE: test/util/KeyEvents.js
  function createKeyEvent (line 14) | function createKeyEvent(key, attrs) {

FILE: test/util/MockEvents.js
  function createCanvasEvent (line 20) | function createCanvasEvent(position, data) {
  function createEvent (line 46) | function createEvent(target, position, data) {

FILE: test/util/custom-rules/CustomRules.js
  function CustomRules (line 6) | function CustomRules(eventBus) {

FILE: test/util/svgHelpers.js
  function expectSvgPath (line 8) | function expectSvgPath(actual, expected, tolerance = 2) {
  function compareSvgPaths (line 21) | function compareSvgPaths(pathA, pathB, tolerance = 2) {
  function pathToNumbers (line 47) | function pathToNumbers(path) {
Condensed preview — 766 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (4,547K chars).
[
  {
    "path": ".github/CONTRIBUTING.md",
    "chars": 4040,
    "preview": "# How to Contribute\n\nGreat to see you! Help us out by [filing bugs or feature requests](#work-with-issues), assisting ot"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/BUG_REPORT.md",
    "chars": 838,
    "preview": "---\nname: Bug report\nabout: Report a problem and help us fix it.\nlabels: \"bug\"\n---\n\n\n### Describe the Bug\n\n<!-- A clear "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/FEATURE_REQUEST.md",
    "chars": 595,
    "preview": "---\nname: Feature request\nabout: Suggest an idea or general improvement.\nlabels: \"enhancement\"\n---\n\n\n### Is your feature"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/TASK.md",
    "chars": 253,
    "preview": "---\nname: Task\nabout: Describe a generic activity we should carry out.\n---\n\n\n### What should we do?\n\n<!-- Clearly descri"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 176,
    "preview": "blank_issues_enabled: false\ncontact_links:\n  - name: Ask a question\n    url: https://forum.bpmn.io\n    about: Head over "
  },
  {
    "path": ".github/merge-me.yml",
    "chars": 46,
    "preview": "reviewTeams:\n- modeling-dev\n- modeling-design\n"
  },
  {
    "path": ".github/workflows/CI.yml",
    "chars": 1629,
    "preview": "name: CI\non: [ push, pull_request ]\njobs:\n  build_browsers:\n\n    strategy:\n      fail-fast: false\n      matrix:\n        "
  },
  {
    "path": ".github/workflows/CODE_SCANNING.yml",
    "chars": 762,
    "preview": "name: \"Code Scanning\"\n\non:\n  push:\n    branches: [ main, develop ]\n  pull_request:\n    branches: [ main, develop ]\n    p"
  },
  {
    "path": ".github/workflows/COMMENT_TARGETS_MAIN.yml",
    "chars": 677,
    "preview": "name: COMMENT_TARGETS_MAIN\non:\n  pull_request:\n    types:\n      - opened\n    branches:\n      - main\npermissions:\n  pull-"
  },
  {
    "path": ".github/workflows/MERGE_MAIN_TO_DEVELOP.yml",
    "chars": 1132,
    "preview": "name: MERGE_MAIN_TO_DEVELOP\non:\n  push:\n    branches:\n    - \"main\"\n\njobs:\n  merge_main_to_develop:\n    runs-on: ubuntu-l"
  },
  {
    "path": ".github/workflows/POST_RELEASE.yml",
    "chars": 2071,
    "preview": "name: POST_RELEASE\non:\n  push:\n    tags:\n      - 'v[0-9]+.[0-9]+.[0-9]+'\n\njobs:\n  post_release:\n\n    strategy:\n      mat"
  },
  {
    "path": ".github/workflows/RELEASE.yml",
    "chars": 1186,
    "preview": "name: RELEASE\non:\n  push:\n    branches:\n      - main\n      - develop\njobs:\n  release_please:\n    outputs:\n      release_"
  },
  {
    "path": ".gitignore",
    "chars": 65,
    "preview": "node_modules/\ndist/\ncoverage/\nlib/**/*.d.ts\n.idea\n*.iml\n.DS_Store"
  },
  {
    "path": ".release-please-manifest.json",
    "chars": 337,
    "preview": "{\n  \"pull-request-title-pattern\": \"chore: release v${version}\",\n  \"changelog-sections\": \"[{\\\"type\\\":\\\"feat\\\",\\\"section\\\""
  },
  {
    "path": "CHANGELOG.md",
    "chars": 67970,
    "preview": "# Changelog\n\nAll notable changes to [bpmn-js](https://github.com/bpmn-io/bpmn-js) are documented here. We use [semantic "
  },
  {
    "path": "LICENSE",
    "chars": 1390,
    "preview": "Copyright (c) 2014-present Camunda Services GmbH\n\nPermission is hereby granted, free of charge, to any person obtaining "
  },
  {
    "path": "README.md",
    "chars": 2251,
    "preview": "# bpmn-js - BPMN 2.0 for the web\n\n[![Build Status](https://github.com/bpmn-io/bpmn-js/workflows/CI/badge.svg)](https://g"
  },
  {
    "path": "assets/bpmn-js.css",
    "chars": 3528,
    "preview": ".bjs-container {\n  --bjs-font-family: Arial, sans-serif;\n\n  --color-grey-225-10-15: hsl(225, 10%, 15%);\n  --color-grey-2"
  },
  {
    "path": "docs/project/SETUP.md",
    "chars": 1775,
    "preview": "# Project Setup\n\nThis document describes the necessary steps to setup a `bpmn-js` development environment.\n\n## TLDR;\n\nOn"
  },
  {
    "path": "docs/project/setup-alternative.sh",
    "chars": 659,
    "preview": "#!/bin/bash\n\n###\n# Setup script to be executed in a bpmn.io project root (some empty folder chosen by YOU). Use if you d"
  },
  {
    "path": "docs/project/setup.bat",
    "chars": 717,
    "preview": "@echo off\n\nrem ###\nrem # Setup script to be executed in a bpmn.io project root (some empty folder chosen by YOU)\nrem ##\n"
  },
  {
    "path": "docs/project/setup.sh",
    "chars": 546,
    "preview": "#!/bin/bash\n\n###\n# Setup script to be executed in a bpmn.io project root (some empty folder chosen by YOU)\n###\n\nbase=`pw"
  },
  {
    "path": "docs/translations.json",
    "chars": 3692,
    "preview": "[\n  \"Activate create/remove space tool\",\n  \"Activate global connect tool\",\n  \"Activate hand tool\",\n  \"Activate lasso too"
  },
  {
    "path": "eslint.config.mjs",
    "chars": 812,
    "preview": "import bpmnIoPlugin from 'eslint-plugin-bpmn-io';\n\nconst files = {\n  ignored: [\n    'dist',\n    'coverage'\n  ],\n  build:"
  },
  {
    "path": "lib/BaseModeler.js",
    "chars": 1875,
    "preview": "import inherits from 'inherits-browser';\n\nimport { Ids } from 'ids';\n\nimport BaseViewer from './BaseViewer';\n\n\n/**\n * @t"
  },
  {
    "path": "lib/BaseModeler.spec.ts",
    "chars": 1003,
    "preview": "import Canvas from 'diagram-js/lib/core/Canvas';\nimport EventBus from 'diagram-js/lib/core/EventBus';\n\nimport BaseModele"
  },
  {
    "path": "lib/BaseViewer.js",
    "chars": 20754,
    "preview": "/**\n * The code in the <project-logo></project-logo> area\n * must not be changed.\n *\n * @see http://bpmn.io/license for "
  },
  {
    "path": "lib/BaseViewer.spec.ts",
    "chars": 4156,
    "preview": "import CommandStack from 'diagram-js/lib/command/CommandStack';\n\nimport EventBus, { Event } from 'diagram-js/lib/core/Ev"
  },
  {
    "path": "lib/Modeler.js",
    "chars": 6580,
    "preview": "import inherits from 'inherits-browser';\n\nimport BaseModeler from './BaseModeler';\n\nimport Viewer from './Viewer';\nimpor"
  },
  {
    "path": "lib/Modeler.spec.ts",
    "chars": 1000,
    "preview": "import Canvas from 'diagram-js/lib/core/Canvas';\nimport EventBus from 'diagram-js/lib/core/EventBus';\n\nimport Modeler fr"
  },
  {
    "path": "lib/NavigatedViewer.js",
    "chars": 908,
    "preview": "import inherits from 'inherits-browser';\n\nimport Viewer from './Viewer';\n\nimport KeyboardMoveModule from 'diagram-js/lib"
  },
  {
    "path": "lib/NavigatedViewer.spec.ts",
    "chars": 944,
    "preview": "import Canvas from 'diagram-js/lib/core/Canvas';\nimport EventBus from 'diagram-js/lib/core/EventBus';\n\nimport NavigatedV"
  },
  {
    "path": "lib/Viewer.js",
    "chars": 2017,
    "preview": "import inherits from 'inherits-browser';\n\nimport CoreModule from './core';\nimport DrilldownModdule from './features/dril"
  },
  {
    "path": "lib/Viewer.spec.ts",
    "chars": 900,
    "preview": "import Canvas from 'diagram-js/lib/core/Canvas';\nimport EventBus from 'diagram-js/lib/core/EventBus';\n\nimport Viewer fro"
  },
  {
    "path": "lib/core/index.js",
    "chars": 146,
    "preview": "import DrawModule from '../draw';\nimport ImportModule from '../import';\n\nexport default {\n  __depends__: [\n    DrawModul"
  },
  {
    "path": "lib/draw/BpmnRenderUtil.js",
    "chars": 5800,
    "preview": "import {\n  has,\n  some\n} from 'min-dash';\n\nimport {\n  getDi\n} from '../util/ModelUtil';\n\nimport {\n  componentsToPath\n} f"
  },
  {
    "path": "lib/draw/BpmnRenderer.js",
    "chars": 64719,
    "preview": "import inherits from 'inherits-browser';\n\nimport {\n  assign,\n  forEach,\n  isObject\n} from 'min-dash';\n\nimport BaseRender"
  },
  {
    "path": "lib/draw/PathMap.js",
    "chars": 18547,
    "preview": "/**\n * Map containing SVG paths needed by BpmnRenderer\n */\nexport default function PathMap() {\n\n  /**\n   * Contains a ma"
  },
  {
    "path": "lib/draw/TextRenderer.js",
    "chars": 2969,
    "preview": "import { assign } from 'min-dash';\n\nimport TextUtil from 'diagram-js/lib/util/Text';\n\nvar DEFAULT_FONT_SIZE = 12;\nvar LI"
  },
  {
    "path": "lib/draw/TextRenderer.spec.ts",
    "chars": 664,
    "preview": "import TextRenderer from './TextRenderer';\n\nnew TextRenderer({\n  defaultStyle: {\n    fontFamily: 'foo'\n  }\n});\n\nconst te"
  },
  {
    "path": "lib/draw/index.js",
    "chars": 288,
    "preview": "import BpmnRenderer from './BpmnRenderer';\nimport TextRenderer from './TextRenderer';\n\nimport PathMap from './PathMap';\n"
  },
  {
    "path": "lib/features/align-elements/AlignElementsContextPadProvider.js",
    "chars": 2682,
    "preview": "import {\n  assign\n} from 'min-dash';\n\nimport ICONS from './AlignElementsIcons';\n\n/**\n * @typedef {import('diagram-js/lib"
  },
  {
    "path": "lib/features/align-elements/AlignElementsIcons.js",
    "chars": 3749,
    "preview": "/**\n * To change the icons, modify the SVGs in `./resources`, execute `npx svgo -f resources --datauri enc -o dist`,\n * "
  },
  {
    "path": "lib/features/align-elements/AlignElementsMenuProvider.js",
    "chars": 2571,
    "preview": "import ICONS from './AlignElementsIcons';\n\nimport {\n  assign,\n  forEach,\n} from 'min-dash';\n\n/**\n * @typedef {import('di"
  },
  {
    "path": "lib/features/align-elements/BpmnAlignElements.js",
    "chars": 1132,
    "preview": "import inherits from 'inherits-browser';\n\nimport RuleProvider from 'diagram-js/lib/features/rules/RuleProvider';\nimport "
  },
  {
    "path": "lib/features/align-elements/index.js",
    "chars": 836,
    "preview": "import AlignElementsModule from 'diagram-js/lib/features/align-elements';\nimport ContextPadModule from 'diagram-js/lib/f"
  },
  {
    "path": "lib/features/append-preview/AppendPreview.js",
    "chars": 2840,
    "preview": "import {\n  assign,\n  isNil\n} from 'min-dash';\n\nconst round = Math.round;\n\n/**\n * @typedef {import('diagram-js/lib/featur"
  },
  {
    "path": "lib/features/append-preview/index.js",
    "chars": 394,
    "preview": "import AutoPlaceModule from '../auto-place';\nimport ComplexPreviewModule from 'diagram-js/lib/features/complex-preview';"
  },
  {
    "path": "lib/features/auto-place/BpmnAutoPlace.js",
    "chars": 639,
    "preview": "import { getNewShapePosition } from './BpmnAutoPlaceUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').defa"
  },
  {
    "path": "lib/features/auto-place/BpmnAutoPlaceUtil.js",
    "chars": 5895,
    "preview": "import { is } from '../../util/ModelUtil';\n\nimport {\n  isAny,\n  isDirectionHorizontal\n} from '../modeling/util/ModelingU"
  },
  {
    "path": "lib/features/auto-place/index.js",
    "chars": 244,
    "preview": "import AutoPlaceModule from 'diagram-js/lib/features/auto-place';\n\nimport BpmnAutoPlace from './BpmnAutoPlace';\n\nexport "
  },
  {
    "path": "lib/features/auto-resize/BpmnAutoResize.js",
    "chars": 1021,
    "preview": "import AutoResize from 'diagram-js/lib/features/auto-resize/AutoResize';\n\nimport inherits from 'inherits-browser';\n\nimpo"
  },
  {
    "path": "lib/features/auto-resize/BpmnAutoResizeProvider.js",
    "chars": 1544,
    "preview": "import { is } from '../../util/ModelUtil';\n\nimport { isLabel } from '../../util/LabelUtil';\n\nimport inherits from 'inher"
  },
  {
    "path": "lib/features/auto-resize/index.js",
    "chars": 309,
    "preview": "import BpmnAutoResize from './BpmnAutoResize';\nimport BpmnAutoResizeProvider from './BpmnAutoResizeProvider';\n\n\nexport d"
  },
  {
    "path": "lib/features/context-pad/ContextPadProvider.js",
    "chars": 15167,
    "preview": "import {\n  assign,\n  forEach,\n  isArray,\n  every\n} from 'min-dash';\n\nimport {\n  is\n} from '../../util/ModelUtil';\n\nimpor"
  },
  {
    "path": "lib/features/context-pad/index.js",
    "chars": 751,
    "preview": "import AppendPreviewModule from '../append-preview';\nimport DirectEditingModule from 'diagram-js-direct-editing';\nimport"
  },
  {
    "path": "lib/features/copy-paste/BpmnCopyPaste.js",
    "chars": 5337,
    "preview": "import {\n  getBusinessObject,\n  getDi,\n  is\n} from '../../util/ModelUtil';\n\nimport { collectElementsAnnotations } from '"
  },
  {
    "path": "lib/features/copy-paste/ModdleCopy.js",
    "chars": 6707,
    "preview": "import {\n  find,\n  forEach,\n  has,\n  isArray,\n  isDefined,\n  isObject,\n  matchPattern,\n  reduce,\n  sortBy\n} from 'min-da"
  },
  {
    "path": "lib/features/copy-paste/index.js",
    "chars": 342,
    "preview": "import CopyPasteModule from 'diagram-js/lib/features/copy-paste';\n\nimport BpmnCopyPaste from './BpmnCopyPaste';\nimport M"
  },
  {
    "path": "lib/features/di-ordering/BpmnDiOrdering.js",
    "chars": 1128,
    "preview": "import { getDi } from '../../util/ModelUtil';\n\nimport {\n  filter,\n  forEach,\n  map\n} from 'min-dash';\n\nimport { selfAndA"
  },
  {
    "path": "lib/features/di-ordering/index.js",
    "chars": 165,
    "preview": "import BpmnDiOrdering from '../di-ordering/BpmnDiOrdering';\n\nexport default {\n  __init__: [\n    'bpmnDiOrdering'\n  ],\n  "
  },
  {
    "path": "lib/features/distribute-elements/BpmnDistributeElements.js",
    "chars": 1453,
    "preview": "import inherits from 'inherits-browser';\n\nimport RuleProvider from 'diagram-js/lib/features/rules/RuleProvider';\nimport "
  },
  {
    "path": "lib/features/distribute-elements/DistributeElementsIcons.js",
    "chars": 1311,
    "preview": "/**\n * To change the icons, modify the SVGs in `./resources`, execute `npx svgo -f resources --datauri enc -o dist`,\n * "
  },
  {
    "path": "lib/features/distribute-elements/DistributeElementsMenuProvider.js",
    "chars": 2765,
    "preview": "import ICONS from './DistributeElementsIcons';\n\nimport { assign } from 'min-dash';\n\n/**\n * @typedef {import('diagram-js/"
  },
  {
    "path": "lib/features/distribute-elements/index.js",
    "chars": 612,
    "preview": "import DistributeElementsModule from 'diagram-js/lib/features/distribute-elements';\nimport PopupMenuModule from 'diagram"
  },
  {
    "path": "lib/features/drilldown/DrilldownBreadcrumbs.js",
    "chars": 3863,
    "preview": "import { domify, classes } from 'min-dom';\nimport { find } from 'min-dash';\n\nimport { escapeHTML } from 'diagram-js/lib/"
  },
  {
    "path": "lib/features/drilldown/DrilldownCentering.js",
    "chars": 2416,
    "preview": "import { is } from '../../util/ModelUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\n * @ty"
  },
  {
    "path": "lib/features/drilldown/DrilldownOverlayBehavior.js",
    "chars": 6262,
    "preview": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\nim"
  },
  {
    "path": "lib/features/drilldown/SubprocessCompatibility.js",
    "chars": 6548,
    "preview": "\nimport { asBounds, asTRBL } from 'diagram-js/lib/layout/LayoutUtil';\nimport { is, isAny } from '../../util/ModelUtil';\n"
  },
  {
    "path": "lib/features/drilldown/index.js",
    "chars": 910,
    "preview": "import OverlaysModule from 'diagram-js/lib/features/overlays';\nimport ChangeSupportModule from 'diagram-js/lib/features/"
  },
  {
    "path": "lib/features/editor-actions/BpmnEditorActions.js",
    "chars": 4780,
    "preview": "import inherits from 'inherits-browser';\n\nimport EditorActions from 'diagram-js/lib/features/editor-actions/EditorAction"
  },
  {
    "path": "lib/features/editor-actions/index.js",
    "chars": 242,
    "preview": "import EditorActionsModule from 'diagram-js/lib/features/editor-actions';\n\nimport BpmnEditorActions from './BpmnEditorAc"
  },
  {
    "path": "lib/features/grid-snapping/BpmnGridSnapping.js",
    "chars": 723,
    "preview": "import { isAny } from '../modeling/util/ModelingUtil';\r\n\r\n/**\r\n * @typedef {import('diagram-js/lib/core/EventBus').defau"
  },
  {
    "path": "lib/features/grid-snapping/behavior/GridSnappingAutoPlaceBehavior.js",
    "chars": 2000,
    "preview": "import { getNewShapePosition } from '../../auto-place/BpmnAutoPlaceUtil';\r\n\r\nimport { getMid } from 'diagram-js/lib/layo"
  },
  {
    "path": "lib/features/grid-snapping/behavior/GridSnappingLayoutConnectionBehavior.js",
    "chars": 3374,
    "preview": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\ni"
  },
  {
    "path": "lib/features/grid-snapping/behavior/GridSnappingParticipantBehavior.js",
    "chars": 1270,
    "preview": "import { is } from '../../../util/ModelUtil';\r\n\r\n/**\r\n * @typedef {import('diagram-js/lib/core/Canvas').default} Canvas\r"
  },
  {
    "path": "lib/features/grid-snapping/behavior/index.js",
    "chars": 666,
    "preview": "import GridSnappingAutoPlaceBehavior from './GridSnappingAutoPlaceBehavior';\r\nimport GridSnappingParticipantBehavior fro"
  },
  {
    "path": "lib/features/grid-snapping/index.js",
    "chars": 371,
    "preview": "import BpmnGridSnapping from './BpmnGridSnapping';\r\nimport GridSnappingModule from 'diagram-js/lib/features/grid-snappin"
  },
  {
    "path": "lib/features/interaction-events/BpmnInteractionEvents.js",
    "chars": 3352,
    "preview": "import { is } from '../../util/ModelUtil';\n\nimport {\n  isExpanded,\n  isHorizontal\n} from '../../util/DiUtil';\n\n/**\n * @t"
  },
  {
    "path": "lib/features/interaction-events/index.js",
    "chars": 181,
    "preview": "import BpmnInteractionEvents from './BpmnInteractionEvents';\n\nexport default {\n  __init__: [ 'bpmnInteractionEvents' ],\n"
  },
  {
    "path": "lib/features/keyboard/BpmnKeyboardBindings.js",
    "chars": 3653,
    "preview": "import inherits from 'inherits-browser';\n\nimport KeyboardBindings from 'diagram-js/lib/features/keyboard/KeyboardBinding"
  },
  {
    "path": "lib/features/keyboard/index.js",
    "chars": 274,
    "preview": "import KeyboardModule from 'diagram-js/lib/features/keyboard';\n\nimport BpmnKeyboardBindings from './BpmnKeyboardBindings"
  },
  {
    "path": "lib/features/label-editing/LabelEditingPreview.js",
    "chars": 3468,
    "preview": "import {\n  append as svgAppend,\n  attr as svgAttr,\n  create as svgCreate,\n  remove as svgRemove\n} from 'tiny-svg';\n\nimpo"
  },
  {
    "path": "lib/features/label-editing/LabelEditingProvider.js",
    "chars": 11944,
    "preview": "import {\n  assign\n} from 'min-dash';\n\nimport {\n  getLabel\n} from '../../util/LabelUtil';\n\nimport {\n  is\n} from '../../ut"
  },
  {
    "path": "lib/features/label-editing/LabelUtil.js",
    "chars": 63,
    "preview": "export {\n  getLabel,\n  setLabel\n} from '../../util/LabelUtil';\n"
  },
  {
    "path": "lib/features/label-editing/cmd/UpdateLabelHandler.js",
    "chars": 3388,
    "preview": "import {\n  setLabel,\n  getLabel\n} from '../../../util/LabelUtil';\n\nimport {\n  getExternalLabelMid,\n  isLabelExternal,\n  "
  },
  {
    "path": "lib/features/label-editing/index.js",
    "chars": 608,
    "preview": "import ChangeSupportModule from 'diagram-js/lib/features/change-support';\nimport ResizeModule from 'diagram-js/lib/featu"
  },
  {
    "path": "lib/features/label-link/LabelLink.js",
    "chars": 6174,
    "preview": "import { queryAll as domQueryAll } from 'min-dom';\n\nimport {\n  append as svgAppend,\n  attr as svgAttr,\n  remove as svgRe"
  },
  {
    "path": "lib/features/label-link/index.js",
    "chars": 316,
    "preview": "import SelectionModule from 'diagram-js/lib/features/selection';\nimport OutlineModule from 'diagram-js/lib/features/outl"
  },
  {
    "path": "lib/features/modeling/BpmnFactory.js",
    "chars": 3705,
    "preview": "import {\n  map,\n  assign,\n  pick\n} from 'min-dash';\n\nimport {\n  isAny\n} from './util/ModelingUtil';\n\nimport {\n  is\n} fro"
  },
  {
    "path": "lib/features/modeling/BpmnLayouter.js",
    "chars": 14472,
    "preview": "import inherits from 'inherits-browser';\n\nimport {\n  assign\n} from 'min-dash';\n\nimport BaseLayouter from 'diagram-js/lib"
  },
  {
    "path": "lib/features/modeling/BpmnUpdater.js",
    "chars": 20395,
    "preview": "import {\n  assign,\n  forEach\n} from 'min-dash';\n\nimport inherits from 'inherits-browser';\n\nimport {\n  add as collectionA"
  },
  {
    "path": "lib/features/modeling/ElementFactory.js",
    "chars": 9472,
    "preview": "import {\n  assign,\n  forEach,\n  has,\n  isDefined,\n  isObject,\n  omit\n} from 'min-dash';\n\nimport inherits from 'inherits-"
  },
  {
    "path": "lib/features/modeling/ElementFactory.test.ts",
    "chars": 2492,
    "preview": "import Modeler from '../../Modeler';\n\nimport ElementFactory from './ElementFactory';\n\nimport {\n  Connection,\n  Label,\n  "
  },
  {
    "path": "lib/features/modeling/Modeling.js",
    "chars": 8163,
    "preview": "import inherits from 'inherits-browser';\n\nimport BaseModeling from 'diagram-js/lib/features/modeling/Modeling';\n\nimport "
  },
  {
    "path": "lib/features/modeling/Modeling.test.ts",
    "chars": 3349,
    "preview": "import { expectType } from 'ts-expect';\n\nimport Modeler from '../../Modeler';\n\nimport {\n  Connection,\n  Element,\n  Label"
  },
  {
    "path": "lib/features/modeling/behavior/AdaptiveLabelPositioningBehavior.js",
    "chars": 6191,
    "preview": "import inherits from 'inherits-browser';\n\nimport {\n  getOrientation,\n  getMid,\n  asTRBL\n} from 'diagram-js/lib/layout/La"
  },
  {
    "path": "lib/features/modeling/behavior/AppendBehavior.js",
    "chars": 1001,
    "preview": "import inherits from 'inherits-browser';\n\nimport { is } from '../../../util/ModelUtil';\n\nimport CommandInterceptor from "
  },
  {
    "path": "lib/features/modeling/behavior/AssociationBehavior.js",
    "chars": 1077,
    "preview": "import inherits from 'inherits-browser';\r\n\r\nimport { is } from '../../../util/ModelUtil';\r\n\r\nimport CommandInterceptor f"
  },
  {
    "path": "lib/features/modeling/behavior/AttachEventBehavior.js",
    "chars": 2553,
    "preview": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\ni"
  },
  {
    "path": "lib/features/modeling/behavior/BoundaryEventBehavior.js",
    "chars": 1954,
    "preview": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\ni"
  },
  {
    "path": "lib/features/modeling/behavior/CompensateBoundaryEventBehavior.js",
    "chars": 6963,
    "preview": "import inherits from 'inherits-browser';\n\nimport { getBusinessObject, is } from '../../../util/ModelUtil';\n\nimport Comma"
  },
  {
    "path": "lib/features/modeling/behavior/CreateBehavior.js",
    "chars": 792,
    "preview": "import inherits from 'inherits-browser';\n\nimport { is } from '../../../util/ModelUtil';\n\nimport CommandInterceptor from "
  },
  {
    "path": "lib/features/modeling/behavior/CreateDataObjectBehavior.js",
    "chars": 1261,
    "preview": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\ni"
  },
  {
    "path": "lib/features/modeling/behavior/CreateParticipantBehavior.js",
    "chars": 7127,
    "preview": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\ni"
  },
  {
    "path": "lib/features/modeling/behavior/DataInputAssociationBehavior.js",
    "chars": 3966,
    "preview": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\ni"
  },
  {
    "path": "lib/features/modeling/behavior/DataStoreBehavior.js",
    "chars": 6010,
    "preview": "import inherits from 'inherits-browser';\r\n\r\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\r"
  },
  {
    "path": "lib/features/modeling/behavior/DeleteLaneBehavior.js",
    "chars": 3728,
    "preview": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\ni"
  },
  {
    "path": "lib/features/modeling/behavior/DetachEventBehavior.js",
    "chars": 2537,
    "preview": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\ni"
  },
  {
    "path": "lib/features/modeling/behavior/DropOnFlowBehavior.js",
    "chars": 5664,
    "preview": "import inherits from 'inherits-browser';\n\nimport {\n  assign,\n  filter,\n  find,\n  isNumber\n} from 'min-dash';\n\nimport { g"
  },
  {
    "path": "lib/features/modeling/behavior/EventBasedGatewayBehavior.js",
    "chars": 2989,
    "preview": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\ni"
  },
  {
    "path": "lib/features/modeling/behavior/FixHoverBehavior.js",
    "chars": 3698,
    "preview": "import { getLanesRoot } from '../util/LaneUtil';\r\n\r\nimport { is, isAny } from '../../../util/ModelUtil';\r\n\r\n/**\r\n * @typ"
  },
  {
    "path": "lib/features/modeling/behavior/GroupBehavior.js",
    "chars": 8299,
    "preview": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\ni"
  },
  {
    "path": "lib/features/modeling/behavior/ImportDockingFix.js",
    "chars": 1895,
    "preview": "import {\n  getMid\n} from 'diagram-js/lib/layout/LayoutUtil';\n\nimport lineIntersect from './util/LineIntersect';\n\n/**\n * "
  },
  {
    "path": "lib/features/modeling/behavior/IsHorizontalFix.js",
    "chars": 1249,
    "preview": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\ni"
  },
  {
    "path": "lib/features/modeling/behavior/LabelBehavior.js",
    "chars": 8305,
    "preview": "import {\n  assign\n} from 'min-dash';\n\nimport inherits from 'inherits-browser';\n\nimport {\n  is,\n  getBusinessObject\n} fro"
  },
  {
    "path": "lib/features/modeling/behavior/LayoutConnectionBehavior.js",
    "chars": 3307,
    "preview": "import {\n  assign\n} from 'min-dash';\n\nimport inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-"
  },
  {
    "path": "lib/features/modeling/behavior/MessageFlowBehavior.js",
    "chars": 2462,
    "preview": "import inherits from 'inherits-browser';\r\n\r\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\r"
  },
  {
    "path": "lib/features/modeling/behavior/NonInterruptingBehavior.js",
    "chars": 1286,
    "preview": "import CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\nimport inherits from 'inherits-browser';\n\nim"
  },
  {
    "path": "lib/features/modeling/behavior/RemoveElementBehavior.js",
    "chars": 2322,
    "preview": "import inherits from 'inherits-browser';\n\nimport { is } from '../../../util/ModelUtil';\n\nimport CommandInterceptor from "
  },
  {
    "path": "lib/features/modeling/behavior/RemoveEmbeddedLabelBoundsBehavior.js",
    "chars": 1069,
    "preview": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\ni"
  },
  {
    "path": "lib/features/modeling/behavior/RemoveParticipantBehavior.js",
    "chars": 1566,
    "preview": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\ni"
  },
  {
    "path": "lib/features/modeling/behavior/ReplaceConnectionBehavior.js",
    "chars": 5088,
    "preview": "import {\n  forEach,\n  find,\n  matchPattern\n} from 'min-dash';\n\nimport inherits from 'inherits-browser';\n\nimport CommandI"
  },
  {
    "path": "lib/features/modeling/behavior/ReplaceElementBehaviour.js",
    "chars": 4177,
    "preview": "import inherits from 'inherits-browser';\n\nimport { forEach, reduce } from 'min-dash';\n\nimport CommandInterceptor from 'd"
  },
  {
    "path": "lib/features/modeling/behavior/ResizeBehavior.js",
    "chars": 7553,
    "preview": "import { is } from '../../../util/ModelUtil';\n\nimport {\n  isExpanded,\n  isHorizontal\n} from '../../../util/DiUtil';\n\nimp"
  },
  {
    "path": "lib/features/modeling/behavior/ResizeLaneBehavior.js",
    "chars": 1782,
    "preview": "import { is } from '../../../util/ModelUtil';\n\nimport {\n  roundBounds\n} from 'diagram-js/lib/layout/LayoutUtil';\n\nimport"
  },
  {
    "path": "lib/features/modeling/behavior/RootElementReferenceBehavior.js",
    "chars": 6020,
    "preview": "import inherits from 'inherits-browser';\r\n\r\nimport {\r\n  find,\r\n  isArray,\r\n  matchPattern,\r\n  some\r\n} from 'min-dash';\r\n"
  },
  {
    "path": "lib/features/modeling/behavior/SetCompensationActivityAfterPasteBehavior.js",
    "chars": 1938,
    "preview": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\ni"
  },
  {
    "path": "lib/features/modeling/behavior/SpaceToolBehavior.js",
    "chars": 5574,
    "preview": "import { forEach } from 'min-dash';\n\nimport { is } from '../../../util/ModelUtil';\n\nimport {\n  isExpanded,\n  isHorizonta"
  },
  {
    "path": "lib/features/modeling/behavior/SubProcessPlaneBehavior.js",
    "chars": 17205,
    "preview": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\ni"
  },
  {
    "path": "lib/features/modeling/behavior/SubProcessStartEventBehavior.js",
    "chars": 1376,
    "preview": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\ni"
  },
  {
    "path": "lib/features/modeling/behavior/TextAnnotationBehavior.js",
    "chars": 1182,
    "preview": "import inherits from 'inherits-browser';\n\nimport { is } from '../../../util/ModelUtil';\n\nimport CommandInterceptor from "
  },
  {
    "path": "lib/features/modeling/behavior/ToggleCollapseConnectionBehaviour.js",
    "chars": 2377,
    "preview": "\nimport inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\n"
  },
  {
    "path": "lib/features/modeling/behavior/ToggleElementCollapseBehaviour.js",
    "chars": 3850,
    "preview": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\ni"
  },
  {
    "path": "lib/features/modeling/behavior/UnclaimIdBehavior.js",
    "chars": 1801,
    "preview": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\ni"
  },
  {
    "path": "lib/features/modeling/behavior/UnsetDefaultFlowBehavior.js",
    "chars": 1399,
    "preview": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\ni"
  },
  {
    "path": "lib/features/modeling/behavior/UpdateFlowNodeRefsBehavior.js",
    "chars": 2901,
    "preview": "import inherits from 'inherits-browser';\n\nimport CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\ni"
  },
  {
    "path": "lib/features/modeling/behavior/index.js",
    "chars": 6495,
    "preview": "import AdaptiveLabelPositioningBehavior from './AdaptiveLabelPositioningBehavior';\nimport AppendBehavior from './AppendB"
  },
  {
    "path": "lib/features/modeling/behavior/util/CategoryUtil.js",
    "chars": 1913,
    "preview": "import {\n  add as collectionAdd,\n  remove as collectionRemove\n} from 'diagram-js/lib/util/Collections';\n\n/**\n * @typedef"
  },
  {
    "path": "lib/features/modeling/behavior/util/ConnectionLayoutUtil.js",
    "chars": 641,
    "preview": "import { getAnchorPointAdjustment } from './LayoutUtil';\n\n/**\n * @typedef {import('diagram-js/lib/util/Types').Point} Po"
  },
  {
    "path": "lib/features/modeling/behavior/util/GeometricUtil.js",
    "chars": 65,
    "preview": "export * from 'diagram-js/lib/features/bendpoints/GeometricUtil';"
  },
  {
    "path": "lib/features/modeling/behavior/util/LabelLayoutUtil.js",
    "chars": 1283,
    "preview": "import { findNewLineStartIndex, getAnchorPointAdjustment } from './LayoutUtil';\n\nimport { getMid } from 'diagram-js/lib/"
  },
  {
    "path": "lib/features/modeling/behavior/util/LayoutUtil.js",
    "chars": 6634,
    "preview": "import {\n  getDistancePointPoint,\n  rotateVector,\n  getAngle\n} from './GeometricUtil';\n\nimport {\n  getAttachment\n} from "
  },
  {
    "path": "lib/features/modeling/behavior/util/LineAttachmentUtil.js",
    "chars": 5502,
    "preview": "/**\n * @typedef {import('diagram-js/lib/util/Types').Point} Point\n *\n * @typedef { {\n*   type: 'bendpoint' | 'segment';\n"
  },
  {
    "path": "lib/features/modeling/behavior/util/LineIntersect.js",
    "chars": 1032,
    "preview": "/**\n * @typedef {import('diagram-js/lib/util/Types').Point} Point\n */\n\n/**\n * Returns the intersection between two line "
  },
  {
    "path": "lib/features/modeling/behavior/util/NonInterruptingUtil.js",
    "chars": 985,
    "preview": "import { isEventSubProcess } from '../../../../util/DiUtil';\nimport { getBusinessObject, is } from '../../../../util/Mod"
  },
  {
    "path": "lib/features/modeling/behavior/util/ResizeUtil.js",
    "chars": 68,
    "preview": "export { getParticipantResizeConstraints } from '../ResizeBehavior';"
  },
  {
    "path": "lib/features/modeling/cmd/AddLaneHandler.js",
    "chars": 4253,
    "preview": "import {\n  filter\n} from 'min-dash';\n\nimport {\n  eachElement\n} from 'diagram-js/lib/util/Elements';\n\nimport {\n  getLanes"
  },
  {
    "path": "lib/features/modeling/cmd/IdClaimHandler.js",
    "chars": 938,
    "preview": "/**\n * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\n *\n * @typedef {import('../../."
  },
  {
    "path": "lib/features/modeling/cmd/ResizeLaneHandler.js",
    "chars": 3532,
    "preview": "import { is } from '../../../util/ModelUtil';\n\nimport {\n  getLanesRoot,\n  computeLanesResize\n} from '../util/LaneUtil';\n"
  },
  {
    "path": "lib/features/modeling/cmd/SetColorHandler.js",
    "chars": 3764,
    "preview": "import {\r\n  assign,\r\n  forEach,\r\n  isString,\r\n  pick\r\n} from 'min-dash';\r\n\r\nimport {\r\n  getDi,\r\n  isAny\r\n} from '../../."
  },
  {
    "path": "lib/features/modeling/cmd/SplitLaneHandler.js",
    "chars": 2361,
    "preview": "import {\n  getChildLanes,\n  LANE_INDENTATION\n} from '../util/LaneUtil';\n\nimport {\n  isHorizontal\n} from '../../../util/D"
  },
  {
    "path": "lib/features/modeling/cmd/UpdateCanvasRootHandler.js",
    "chars": 2580,
    "preview": "import {\n  add as collectionAdd,\n  remove as collectionRemove\n} from 'diagram-js/lib/util/Collections';\n\nimport { getDi "
  },
  {
    "path": "lib/features/modeling/cmd/UpdateFlowNodeRefsHandler.js",
    "chars": 4846,
    "preview": "import {\n  collectLanes,\n  getLanesRoot\n} from '../util/LaneUtil';\n\nimport {\n  is\n} from '../../../util/ModelUtil';\n\nimp"
  },
  {
    "path": "lib/features/modeling/cmd/UpdateModdlePropertiesHandler.js",
    "chars": 2778,
    "preview": "import {\n  reduce,\n  keys,\n  forEach\n} from 'min-dash';\n\nimport {\n  is,\n  getBusinessObject\n} from '../../../util/ModelU"
  },
  {
    "path": "lib/features/modeling/cmd/UpdatePropertiesHandler.js",
    "chars": 6046,
    "preview": "import {\n  reduce,\n  keys,\n  forEach,\n  assign\n} from 'min-dash';\n\nimport {\n  getBusinessObject,\n  getDi\n} from '../../."
  },
  {
    "path": "lib/features/modeling/cmd/UpdateSemanticParentHandler.js",
    "chars": 1446,
    "preview": "/**\r\n * @typedef {import('diagram-js/lib/command/CommandHandler').default} CommandHandler\r\n *\r\n * @typedef {import('../B"
  },
  {
    "path": "lib/features/modeling/index.js",
    "chars": 1471,
    "preview": "import BehaviorModule from './behavior';\nimport RulesModule from '../rules';\nimport DiOrderingModule from '../di-orderin"
  },
  {
    "path": "lib/features/modeling/util/LaneUtil.js",
    "chars": 4094,
    "preview": "import { is } from '../../../util/ModelUtil';\n\nimport {\n  getParent\n} from './ModelingUtil';\n\nimport {\n  isHorizontal\n} "
  },
  {
    "path": "lib/features/modeling/util/ModelingUtil.js",
    "chars": 2110,
    "preview": "import { isString } from 'min-dash';\n\nexport { is, isAny } from '../../../util/ModelUtil';\n\nimport {\n  is,\n  isAny,\n  ge"
  },
  {
    "path": "lib/features/modeling-feedback/ModelingFeedback.js",
    "chars": 1408,
    "preview": "import { is } from '../../util/ModelUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/EventBus').default} EventBus\n *"
  },
  {
    "path": "lib/features/modeling-feedback/index.js",
    "chars": 267,
    "preview": "import TooltipsModule from 'diagram-js/lib/features/tooltips';\n\nimport ModelingFeedback from './ModelingFeedback';\n\nexpo"
  },
  {
    "path": "lib/features/ordering/BpmnOrderingProvider.js",
    "chars": 4380,
    "preview": "import inherits from 'inherits-browser';\n\nimport OrderingProvider from 'diagram-js/lib/features/ordering/OrderingProvide"
  },
  {
    "path": "lib/features/ordering/index.js",
    "chars": 176,
    "preview": "import BpmnOrderingProvider from './BpmnOrderingProvider';\n\nexport default {\n  __init__: [ 'bpmnOrderingProvider' ],\n  b"
  },
  {
    "path": "lib/features/outline/OutlineProvider.js",
    "chars": 4662,
    "preview": "import { assign } from 'min-dash';\n\nimport {\n  attr as svgAttr,\n  create as svgCreate\n} from 'tiny-svg';\n\nimport {\n  is,"
  },
  {
    "path": "lib/features/outline/OutlineUtil.js",
    "chars": 1915,
    "preview": "import {\n  create as svgCreate\n} from 'tiny-svg';\n\nexport const DATA_OBJECT_REFERENCE_OUTLINE_PATH = 'M44.7648 11.3263L3"
  },
  {
    "path": "lib/features/outline/index.js",
    "chars": 241,
    "preview": "import Outline from 'diagram-js/lib/features/outline';\nimport OutlineProvider from './OutlineProvider';\n\nexport default "
  },
  {
    "path": "lib/features/palette/PaletteProvider.js",
    "chars": 5928,
    "preview": "import {\n  assign\n} from 'min-dash';\n\n/**\n * @typedef {import('diagram-js/lib/features/palette/Palette').default} Palett"
  },
  {
    "path": "lib/features/palette/index.js",
    "chars": 737,
    "preview": "import PaletteModule from 'diagram-js/lib/features/palette';\nimport CreateModule from 'diagram-js/lib/features/create';\n"
  },
  {
    "path": "lib/features/popup-menu/ReplaceMenuProvider.js",
    "chars": 19676,
    "preview": "import {\n  getBusinessObject,\n  is\n} from '../../util/ModelUtil';\n\nimport {\n  isEventSubProcess,\n  isExpanded\n} from '.."
  },
  {
    "path": "lib/features/popup-menu/index.js",
    "chars": 411,
    "preview": "import PopupMenuModule from 'diagram-js/lib/features/popup-menu';\nimport ReplaceModule from '../replace';\n\nimport Replac"
  },
  {
    "path": "lib/features/popup-menu/util/Icons.js",
    "chars": 972,
    "preview": "export default {\n  'start-event-non-interrupting': `\n  <svg viewBox=\"0 0 2048 2048\" xmlns=\"http://www.w3.org/2000/svg\">\n"
  },
  {
    "path": "lib/features/popup-menu/util/TypeUtil.js",
    "chars": 1426,
    "preview": "import {\n  getBusinessObject\n} from '../../../util/ModelUtil';\n\nimport {\n  isExpanded\n} from '../../../util/DiUtil';\n\n/*"
  },
  {
    "path": "lib/features/replace/BpmnReplace.js",
    "chars": 10516,
    "preview": "import {\n  pick,\n  assign,\n  filter,\n  forEach,\n  isArray,\n  isUndefined,\n  has\n} from 'min-dash';\n\nimport {\n  is,\n  get"
  },
  {
    "path": "lib/features/replace/ReplaceOptions.js",
    "chars": 31783,
    "preview": "/**\n * @typedef { () => string } LabelGetter\n *\n * @typedef { {\n *   label: string | LabelGetter;\n *   actionName: strin"
  },
  {
    "path": "lib/features/replace/index.js",
    "chars": 355,
    "preview": "import CopyPasteModule from '../copy-paste';\nimport ReplaceModule from 'diagram-js/lib/features/replace';\nimport Selecti"
  },
  {
    "path": "lib/features/replace-preview/BpmnReplacePreview.js",
    "chars": 3506,
    "preview": "import CommandInterceptor from 'diagram-js/lib/command/CommandInterceptor';\n\nimport inherits from 'inherits-browser';\n\ni"
  },
  {
    "path": "lib/features/replace-preview/index.js",
    "chars": 291,
    "preview": "import PreviewSupportModule from 'diagram-js/lib/features/preview-support';\n\nimport BpmnReplacePreview from './BpmnRepla"
  },
  {
    "path": "lib/features/rules/BpmnRules.js",
    "chars": 26686,
    "preview": "import {\n  every,\n  find,\n  forEach,\n  some\n} from 'min-dash';\n\nimport inherits from 'inherits-browser';\n\nimport {\n  is,"
  },
  {
    "path": "lib/features/rules/index.js",
    "chars": 218,
    "preview": "import RulesModule from 'diagram-js/lib/features/rules';\n\nimport BpmnRules from './BpmnRules';\n\nexport default {\n  __dep"
  },
  {
    "path": "lib/features/search/BpmnSearchProvider.js",
    "chars": 2259,
    "preview": "import {\n  getLabel,\n  isLabel\n} from '../../util/LabelUtil';\n\n/**\n * @typedef {import('diagram-js/lib/core/Canvas').def"
  },
  {
    "path": "lib/features/search/index.js",
    "chars": 338,
    "preview": "import SearchPadModule from 'diagram-js/lib/features/search-pad';\nimport SearchModule from 'diagram-js/lib/features/sear"
  },
  {
    "path": "lib/features/snapping/BpmnConnectSnapping.js",
    "chars": 6117,
    "preview": "import {\r\n  mid,\r\n  setSnapped\r\n} from 'diagram-js/lib/features/snapping/SnapUtil';\r\n\r\nimport { isCmd } from 'diagram-js"
  },
  {
    "path": "lib/features/snapping/BpmnCreateMoveSnapping.js",
    "chars": 7079,
    "preview": "import inherits from 'inherits-browser';\n\nimport CreateMoveSnapping from 'diagram-js/lib/features/snapping/CreateMoveSna"
  },
  {
    "path": "lib/features/snapping/BpmnSnappingUtil.js",
    "chars": 625,
    "preview": "import { getOrientation } from 'diagram-js/lib/layout/LayoutUtil';\r\n\r\n/**\r\n * @typedef {import('diagram-js/lib/util/Type"
  },
  {
    "path": "lib/features/snapping/index.js",
    "chars": 414,
    "preview": "import BpmnConnectSnapping from './BpmnConnectSnapping';\nimport BpmnCreateMoveSnapping from './BpmnCreateMoveSnapping';\n"
  },
  {
    "path": "lib/features/space-tool/BpmnSpaceTool.js",
    "chars": 2364,
    "preview": "import inherits from 'inherits-browser';\n\nimport SpaceTool from 'diagram-js/lib/features/space-tool/SpaceTool';\n\nimport "
  },
  {
    "path": "lib/features/space-tool/index.js",
    "chars": 207,
    "preview": "import SpaceToolModule from 'diagram-js/lib/features/space-tool';\n\nimport BpmnSpaceTool from './BpmnSpaceTool';\n\nexport "
  },
  {
    "path": "lib/import/BpmnImporter.js",
    "chars": 8964,
    "preview": "import {\n  assign\n} from 'min-dash';\n\nimport { is } from '../util/ModelUtil';\n\nimport {\n  isLabelExternal,\n  getExternal"
  },
  {
    "path": "lib/import/BpmnTreeWalker.js",
    "chars": 11252,
    "preview": "import {\n  filter,\n  find,\n  forEach\n} from 'min-dash';\n\nimport {\n  elementToString\n} from './Util';\n\nimport {\n  ensureC"
  },
  {
    "path": "lib/import/Importer.js",
    "chars": 5323,
    "preview": "import {\n  find,\n  forEach,\n  map\n} from 'min-dash';\n\nimport BpmnTreeWalker from './BpmnTreeWalker';\n\nimport { is } from"
  },
  {
    "path": "lib/import/Util.js",
    "chars": 140,
    "preview": "export function elementToString(e) {\n  if (!e) {\n    return '<null>';\n  }\n\n  return '<' + e.$type + (e.id ? ' id=\"' + e."
  },
  {
    "path": "lib/import/index.js",
    "chars": 196,
    "preview": "import translate from 'diagram-js/lib/i18n/translate';\n\nimport BpmnImporter from './BpmnImporter';\n\nexport default {\n  _"
  },
  {
    "path": "lib/index.js",
    "chars": 37,
    "preview": "export {\n  default\n} from './Viewer';"
  },
  {
    "path": "lib/model/Types.ts",
    "chars": 870,
    "preview": "import type {\n  Connection as BaseConnection,\n  Element as BaseElement,\n  Label as BaseLabel,\n  Root as BaseRoot,\n  Shap"
  },
  {
    "path": "lib/util/AnnotationUtil.js",
    "chars": 1664,
    "preview": "import { forEach } from 'min-dash';\nimport { selfAndChildren } from 'diagram-js/lib/util/Elements';\nimport { is } from '"
  },
  {
    "path": "lib/util/CompatibilityUtil.js",
    "chars": 729,
    "preview": "import {\n  has\n} from 'min-dash';\n\n/**\n * @typedef {import('../model/Types').ModdleElement} ModdleElement\n */\n\n\n// TODO("
  },
  {
    "path": "lib/util/DiUtil.js",
    "chars": 2288,
    "preview": "import {\n  is,\n  getBusinessObject,\n  getDi\n} from './ModelUtil';\n\nimport {\n  some\n} from 'min-dash';\n\n/**\n * @typedef {"
  },
  {
    "path": "lib/util/DrilldownUtil.js",
    "chars": 1229,
    "preview": "import { getDi, is } from './ModelUtil';\n\n/**\n * @typedef {import('../model/Types').Element} Element\n * @typedef {import"
  },
  {
    "path": "lib/util/LabelUtil.js",
    "chars": 5453,
    "preview": "import {\n  assign\n} from 'min-dash';\n\nimport { is } from './ModelUtil';\n\nimport { isLabel } from 'diagram-js/lib/util/Mo"
  }
]

// ... and 566 more files (download for full content)

About this extraction

This page contains the full source code of the bpmn-io/bpmn-js GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 766 files (4.1 MB), approximately 1.1M tokens, and a symbol index with 706 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!