@eclipse-glsp/client 2.2.0-next.332 → 2.2.0-next.334

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/css/change-bounds.css +36 -2
  2. package/css/glsp-sprotty.css +18 -2
  3. package/css/helper-lines.css +3 -3
  4. package/lib/base/default.module.d.ts.map +1 -1
  5. package/lib/base/default.module.js +3 -0
  6. package/lib/base/default.module.js.map +1 -1
  7. package/lib/base/feedback/css-feedback.d.ts +7 -2
  8. package/lib/base/feedback/css-feedback.d.ts.map +1 -1
  9. package/lib/base/feedback/css-feedback.js +10 -2
  10. package/lib/base/feedback/css-feedback.js.map +1 -1
  11. package/lib/base/feedback/feeback-emitter.d.ts +2 -2
  12. package/lib/base/feedback/feeback-emitter.d.ts.map +1 -1
  13. package/lib/base/feedback/feeback-emitter.js +5 -2
  14. package/lib/base/feedback/feeback-emitter.js.map +1 -1
  15. package/lib/base/index.d.ts +1 -0
  16. package/lib/base/index.d.ts.map +1 -1
  17. package/lib/base/index.js +1 -0
  18. package/lib/base/index.js.map +1 -1
  19. package/lib/base/model/diagram-loader.d.ts.map +1 -1
  20. package/lib/base/model/diagram-loader.js +6 -1
  21. package/lib/base/model/diagram-loader.js.map +1 -1
  22. package/lib/base/mouse-position-tracker.d.ts +22 -0
  23. package/lib/base/mouse-position-tracker.d.ts.map +1 -0
  24. package/lib/base/mouse-position-tracker.js +40 -0
  25. package/lib/base/mouse-position-tracker.js.map +1 -0
  26. package/lib/features/accessibility/view-key-tools/movement-key-tool.d.ts +2 -0
  27. package/lib/features/accessibility/view-key-tools/movement-key-tool.d.ts.map +1 -1
  28. package/lib/features/accessibility/view-key-tools/movement-key-tool.js +15 -7
  29. package/lib/features/accessibility/view-key-tools/movement-key-tool.js.map +1 -1
  30. package/lib/features/bounds/bounds-module.d.ts.map +1 -1
  31. package/lib/features/bounds/bounds-module.js +2 -0
  32. package/lib/features/bounds/bounds-module.js.map +1 -1
  33. package/lib/features/bounds/freeform-layout.d.ts +17 -1
  34. package/lib/features/bounds/freeform-layout.d.ts.map +1 -1
  35. package/lib/features/bounds/freeform-layout.js +14 -5
  36. package/lib/features/bounds/freeform-layout.js.map +1 -1
  37. package/lib/features/bounds/glsp-hidden-bounds-updater.d.ts +5 -4
  38. package/lib/features/bounds/glsp-hidden-bounds-updater.d.ts.map +1 -1
  39. package/lib/features/bounds/glsp-hidden-bounds-updater.js +51 -39
  40. package/lib/features/bounds/glsp-hidden-bounds-updater.js.map +1 -1
  41. package/lib/features/bounds/hbox-layout.d.ts +18 -2
  42. package/lib/features/bounds/hbox-layout.d.ts.map +1 -1
  43. package/lib/features/bounds/hbox-layout.js +14 -5
  44. package/lib/features/bounds/hbox-layout.js.map +1 -1
  45. package/lib/features/bounds/index.d.ts +1 -0
  46. package/lib/features/bounds/index.d.ts.map +1 -1
  47. package/lib/features/bounds/index.js +1 -0
  48. package/lib/features/bounds/index.js.map +1 -1
  49. package/lib/features/bounds/layout-data.d.ts +27 -0
  50. package/lib/features/bounds/layout-data.d.ts.map +1 -0
  51. package/lib/features/bounds/layout-data.js +48 -0
  52. package/lib/features/bounds/layout-data.js.map +1 -0
  53. package/lib/features/bounds/local-bounds.d.ts +3 -1
  54. package/lib/features/bounds/local-bounds.d.ts.map +1 -1
  55. package/lib/features/bounds/local-bounds.js +14 -0
  56. package/lib/features/bounds/local-bounds.js.map +1 -1
  57. package/lib/features/bounds/vbox-layout.d.ts +18 -2
  58. package/lib/features/bounds/vbox-layout.d.ts.map +1 -1
  59. package/lib/features/bounds/vbox-layout.js +14 -5
  60. package/lib/features/bounds/vbox-layout.js.map +1 -1
  61. package/lib/features/change-bounds/index.d.ts +1 -0
  62. package/lib/features/change-bounds/index.d.ts.map +1 -1
  63. package/lib/features/change-bounds/index.js +1 -0
  64. package/lib/features/change-bounds/index.js.map +1 -1
  65. package/lib/features/change-bounds/model.d.ts +19 -3
  66. package/lib/features/change-bounds/model.d.ts.map +1 -1
  67. package/lib/features/change-bounds/model.js +92 -4
  68. package/lib/features/change-bounds/model.js.map +1 -1
  69. package/lib/features/change-bounds/movement-restrictor.d.ts +1 -0
  70. package/lib/features/change-bounds/movement-restrictor.d.ts.map +1 -1
  71. package/lib/features/change-bounds/movement-restrictor.js +7 -1
  72. package/lib/features/change-bounds/movement-restrictor.js.map +1 -1
  73. package/lib/features/change-bounds/point-position-updater.d.ts +3 -0
  74. package/lib/features/change-bounds/point-position-updater.d.ts.map +1 -1
  75. package/lib/features/change-bounds/point-position-updater.js +7 -2
  76. package/lib/features/change-bounds/point-position-updater.js.map +1 -1
  77. package/lib/features/change-bounds/position-snapper.d.ts +4 -0
  78. package/lib/features/change-bounds/position-snapper.d.ts.map +1 -1
  79. package/lib/features/change-bounds/position-snapper.js +4 -0
  80. package/lib/features/change-bounds/position-snapper.js.map +1 -1
  81. package/lib/features/change-bounds/snap.d.ts +6 -0
  82. package/lib/features/change-bounds/snap.d.ts.map +1 -1
  83. package/lib/features/change-bounds/snap.js +6 -0
  84. package/lib/features/change-bounds/snap.js.map +1 -1
  85. package/lib/features/change-bounds/tracker.d.ts +32 -0
  86. package/lib/features/change-bounds/tracker.d.ts.map +1 -0
  87. package/lib/features/change-bounds/tracker.js +60 -0
  88. package/lib/features/change-bounds/tracker.js.map +1 -0
  89. package/lib/features/debug/debug-bounds-decorator.d.ts +4 -1
  90. package/lib/features/debug/debug-bounds-decorator.d.ts.map +1 -1
  91. package/lib/features/debug/debug-bounds-decorator.js +14 -7
  92. package/lib/features/debug/debug-bounds-decorator.js.map +1 -1
  93. package/lib/features/element-template/mouse-tracking-element-position-listener.d.ts +9 -22
  94. package/lib/features/element-template/mouse-tracking-element-position-listener.d.ts.map +1 -1
  95. package/lib/features/element-template/mouse-tracking-element-position-listener.js +30 -46
  96. package/lib/features/element-template/mouse-tracking-element-position-listener.js.map +1 -1
  97. package/lib/features/helper-lines/helper-line-feedback.d.ts +2 -2
  98. package/lib/features/helper-lines/helper-line-feedback.d.ts.map +1 -1
  99. package/lib/features/helper-lines/helper-line-feedback.js +1 -1
  100. package/lib/features/helper-lines/helper-line-feedback.js.map +1 -1
  101. package/lib/features/helper-lines/helper-line-manager-default.d.ts +2 -1
  102. package/lib/features/helper-lines/helper-line-manager-default.d.ts.map +1 -1
  103. package/lib/features/helper-lines/helper-line-manager-default.js +23 -0
  104. package/lib/features/helper-lines/helper-line-manager-default.js.map +1 -1
  105. package/lib/features/helper-lines/helper-line-manager.d.ts +10 -2
  106. package/lib/features/helper-lines/helper-line-manager.d.ts.map +1 -1
  107. package/lib/features/routing/edge-router.d.ts +4 -0
  108. package/lib/features/routing/edge-router.d.ts.map +1 -1
  109. package/lib/features/routing/edge-router.js +37 -0
  110. package/lib/features/routing/edge-router.js.map +1 -1
  111. package/lib/features/select/select-mouse-listener.d.ts +3 -0
  112. package/lib/features/select/select-mouse-listener.d.ts.map +1 -1
  113. package/lib/features/select/select-mouse-listener.js +30 -2
  114. package/lib/features/select/select-mouse-listener.js.map +1 -1
  115. package/lib/features/tools/base-tools.d.ts +24 -15
  116. package/lib/features/tools/base-tools.d.ts.map +1 -1
  117. package/lib/features/tools/base-tools.js +0 -18
  118. package/lib/features/tools/base-tools.js.map +1 -1
  119. package/lib/features/tools/change-bounds/change-bounds-manager.d.ts +42 -0
  120. package/lib/features/tools/change-bounds/change-bounds-manager.d.ts.map +1 -0
  121. package/lib/features/tools/change-bounds/change-bounds-manager.js +136 -0
  122. package/lib/features/tools/change-bounds/change-bounds-manager.js.map +1 -0
  123. package/lib/features/tools/change-bounds/change-bounds-tool-feedback.d.ts +6 -0
  124. package/lib/features/tools/change-bounds/change-bounds-tool-feedback.d.ts.map +1 -1
  125. package/lib/features/tools/change-bounds/change-bounds-tool-feedback.js +14 -8
  126. package/lib/features/tools/change-bounds/change-bounds-tool-feedback.js.map +1 -1
  127. package/lib/features/tools/change-bounds/change-bounds-tool-module.d.ts.map +1 -1
  128. package/lib/features/tools/change-bounds/change-bounds-tool-module.js +2 -0
  129. package/lib/features/tools/change-bounds/change-bounds-tool-module.js.map +1 -1
  130. package/lib/features/tools/change-bounds/change-bounds-tool-move-feedback.d.ts +6 -15
  131. package/lib/features/tools/change-bounds/change-bounds-tool-move-feedback.d.ts.map +1 -1
  132. package/lib/features/tools/change-bounds/change-bounds-tool-move-feedback.js +24 -72
  133. package/lib/features/tools/change-bounds/change-bounds-tool-move-feedback.js.map +1 -1
  134. package/lib/features/tools/change-bounds/change-bounds-tool.d.ts +14 -25
  135. package/lib/features/tools/change-bounds/change-bounds-tool.d.ts.map +1 -1
  136. package/lib/features/tools/change-bounds/change-bounds-tool.js +63 -109
  137. package/lib/features/tools/change-bounds/change-bounds-tool.js.map +1 -1
  138. package/lib/features/tools/change-bounds/change-bounds-tracker.d.ts +136 -0
  139. package/lib/features/tools/change-bounds/change-bounds-tracker.d.ts.map +1 -0
  140. package/lib/features/tools/change-bounds/change-bounds-tracker.js +301 -0
  141. package/lib/features/tools/change-bounds/change-bounds-tracker.js.map +1 -0
  142. package/lib/features/tools/change-bounds/index.d.ts +2 -0
  143. package/lib/features/tools/change-bounds/index.d.ts.map +1 -1
  144. package/lib/features/tools/change-bounds/index.js +2 -0
  145. package/lib/features/tools/change-bounds/index.js.map +1 -1
  146. package/lib/features/tools/change-bounds/view.d.ts.map +1 -1
  147. package/lib/features/tools/change-bounds/view.js +1 -16
  148. package/lib/features/tools/change-bounds/view.js.map +1 -1
  149. package/lib/features/tools/edge-edit/edge-edit-tool-feedback.d.ts +7 -9
  150. package/lib/features/tools/edge-edit/edge-edit-tool-feedback.d.ts.map +1 -1
  151. package/lib/features/tools/edge-edit/edge-edit-tool-feedback.js +27 -47
  152. package/lib/features/tools/edge-edit/edge-edit-tool-feedback.js.map +1 -1
  153. package/lib/features/tools/edge-edit/edge-edit-tool.d.ts +2 -2
  154. package/lib/features/tools/edge-edit/edge-edit-tool.d.ts.map +1 -1
  155. package/lib/features/tools/edge-edit/edge-edit-tool.js +5 -5
  156. package/lib/features/tools/edge-edit/edge-edit-tool.js.map +1 -1
  157. package/lib/features/tools/marquee-selection/marquee-mouse-tool.d.ts +1 -0
  158. package/lib/features/tools/marquee-selection/marquee-mouse-tool.d.ts.map +1 -1
  159. package/lib/features/tools/marquee-selection/marquee-mouse-tool.js +3 -0
  160. package/lib/features/tools/marquee-selection/marquee-mouse-tool.js.map +1 -1
  161. package/lib/features/tools/node-creation/node-creation-tool.d.ts +2 -4
  162. package/lib/features/tools/node-creation/node-creation-tool.d.ts.map +1 -1
  163. package/lib/features/tools/node-creation/node-creation-tool.js +8 -11
  164. package/lib/features/tools/node-creation/node-creation-tool.js.map +1 -1
  165. package/lib/features/viewport/viewport-handler.d.ts +6 -4
  166. package/lib/features/viewport/viewport-handler.d.ts.map +1 -1
  167. package/lib/features/viewport/viewport-handler.js +13 -8
  168. package/lib/features/viewport/viewport-handler.js.map +1 -1
  169. package/lib/utils/gmodel-util.d.ts +20 -1
  170. package/lib/utils/gmodel-util.d.ts.map +1 -1
  171. package/lib/utils/gmodel-util.js +38 -16
  172. package/lib/utils/gmodel-util.js.map +1 -1
  173. package/lib/utils/layout-utils.d.ts +1 -0
  174. package/lib/utils/layout-utils.d.ts.map +1 -1
  175. package/lib/utils/layout-utils.js +5 -1
  176. package/lib/utils/layout-utils.js.map +1 -1
  177. package/package.json +3 -3
  178. package/src/base/default.module.ts +4 -1
  179. package/src/base/feedback/css-feedback.ts +10 -2
  180. package/src/base/feedback/feeback-emitter.ts +6 -3
  181. package/src/base/index.ts +1 -0
  182. package/src/base/model/diagram-loader.ts +5 -1
  183. package/src/base/mouse-position-tracker.ts +25 -0
  184. package/src/features/accessibility/view-key-tools/movement-key-tool.ts +12 -7
  185. package/src/features/bounds/bounds-module.ts +2 -0
  186. package/src/features/bounds/freeform-layout.ts +16 -6
  187. package/src/features/bounds/glsp-hidden-bounds-updater.ts +63 -46
  188. package/src/features/bounds/hbox-layout.ts +18 -9
  189. package/src/features/bounds/index.ts +1 -0
  190. package/src/features/bounds/layout-data.ts +48 -0
  191. package/src/features/bounds/local-bounds.ts +20 -4
  192. package/src/features/bounds/vbox-layout.ts +18 -10
  193. package/src/features/change-bounds/index.ts +1 -0
  194. package/src/features/change-bounds/model.ts +104 -4
  195. package/src/features/change-bounds/movement-restrictor.ts +10 -0
  196. package/src/features/change-bounds/point-position-updater.spec.ts +2 -0
  197. package/src/features/change-bounds/point-position-updater.ts +6 -0
  198. package/src/features/change-bounds/position-snapper.ts +4 -0
  199. package/src/features/change-bounds/snap.ts +6 -0
  200. package/src/features/change-bounds/tracker.ts +63 -0
  201. package/src/features/debug/debug-bounds-decorator.tsx +17 -7
  202. package/src/features/element-template/mouse-tracking-element-position-listener.ts +49 -71
  203. package/src/features/helper-lines/helper-line-feedback.ts +2 -1
  204. package/src/features/helper-lines/helper-line-manager-default.ts +37 -2
  205. package/src/features/helper-lines/helper-line-manager.ts +11 -2
  206. package/src/features/routing/edge-router.ts +42 -0
  207. package/src/features/select/select-mouse-listener.ts +15 -1
  208. package/src/features/tools/base-tools.ts +31 -19
  209. package/src/features/tools/change-bounds/change-bounds-manager.ts +145 -0
  210. package/src/features/tools/change-bounds/change-bounds-tool-feedback.ts +17 -6
  211. package/src/features/tools/change-bounds/change-bounds-tool-module.ts +2 -0
  212. package/src/features/tools/change-bounds/change-bounds-tool-move-feedback.ts +31 -81
  213. package/src/features/tools/change-bounds/change-bounds-tool.ts +89 -148
  214. package/src/features/tools/change-bounds/change-bounds-tracker.ts +455 -0
  215. package/src/features/tools/change-bounds/index.ts +2 -0
  216. package/src/features/tools/change-bounds/view.tsx +2 -14
  217. package/src/features/tools/edge-edit/edge-edit-tool-feedback.ts +34 -52
  218. package/src/features/tools/edge-edit/edge-edit-tool.ts +4 -3
  219. package/src/features/tools/marquee-selection/marquee-mouse-tool.ts +4 -0
  220. package/src/features/tools/node-creation/node-creation-tool.ts +7 -7
  221. package/src/features/viewport/viewport-handler.ts +13 -7
  222. package/src/utils/gmodel-util.ts +41 -5
  223. package/src/utils/layout-utils.ts +4 -0
@@ -56,6 +56,10 @@ export class MarqueeMouseTool extends BaseEditTool {
56
56
  this.createFeedbackEmitter().add(cursorFeedbackAction(CursorCSS.MARQUEE), cursorFeedbackAction()).submit()
57
57
  );
58
58
  }
59
+
60
+ override get isEditTool(): boolean {
61
+ return false;
62
+ }
59
63
  }
60
64
 
61
65
  export class MarqueeMouseListener extends DragAwareMouseListener {
@@ -26,7 +26,7 @@ import {
26
26
  isCtrlOrCmd,
27
27
  isMoveable
28
28
  } from '@eclipse-glsp/sprotty';
29
- import { inject, injectable, optional } from 'inversify';
29
+ import { inject, injectable } from 'inversify';
30
30
  import '../../../../css/ghost-element.css';
31
31
  import { FeedbackEmitter } from '../../../base';
32
32
  import { DragAwareMouseListener } from '../../../base/drag-aware-mouse-listener';
@@ -34,13 +34,12 @@ import { CSS_GHOST_ELEMENT, CSS_HIDDEN, CursorCSS, cursorFeedbackAction } from '
34
34
  import { EnableDefaultToolsAction } from '../../../base/tool-manager/tool';
35
35
  import { MoveableElement, isValidMove } from '../../../utils';
36
36
  import { getAbsolutePosition } from '../../../utils/viewpoint-util';
37
- import { IMovementRestrictor } from '../../change-bounds/movement-restrictor';
38
- import { PositionSnapper } from '../../change-bounds/position-snapper';
39
37
  import { RemoveTemplateElementsAction } from '../../element-template';
40
38
  import { AddTemplateElementsAction, getTemplateElementId } from '../../element-template/add-template-element';
41
39
  import { MouseTrackingElementPositionListener, PositioningTool } from '../../element-template/mouse-tracking-element-position-listener';
42
40
  import { Containable, isContainable } from '../../hints/model';
43
41
  import { BaseCreationTool } from '../base-tools';
42
+ import { ChangeBoundsManager } from '../change-bounds';
44
43
 
45
44
  @injectable()
46
45
  export class NodeCreationTool extends BaseCreationTool<TriggerNodeCreationAction> implements PositioningTool {
@@ -48,8 +47,7 @@ export class NodeCreationTool extends BaseCreationTool<TriggerNodeCreationAction
48
47
 
49
48
  protected isTriggerAction = TriggerNodeCreationAction.is;
50
49
 
51
- @inject(TYPES.IMovementRestrictor) @optional() readonly movementRestrictor?: IMovementRestrictor;
52
- @inject(PositionSnapper) readonly positionSnapper: PositionSnapper;
50
+ @inject(TYPES.IChangeBoundsManager) readonly changeBoundsManager: ChangeBoundsManager;
53
51
 
54
52
  get id(): string {
55
53
  return NodeCreationTool.ID;
@@ -149,14 +147,16 @@ export class NodeCreationToolMouseListener extends DragAwareMouseListener {
149
147
  protected getValidInsertPosition(target: GModelElement, event: MouseEvent): Point | undefined {
150
148
  const ghostElement = this.getGhostElement();
151
149
  if (ghostElement) {
152
- return isValidMove(ghostElement, ghostElement.position, this.tool.movementRestrictor) ? ghostElement.position : undefined;
150
+ return isValidMove(ghostElement, ghostElement.position, this.tool.changeBoundsManager.movementRestrictor)
151
+ ? ghostElement.position
152
+ : undefined;
153
153
  }
154
154
  const location = getAbsolutePosition(target, event);
155
155
 
156
156
  // Create a 0-bounds proxy element for snapping
157
157
  const elementProxy = new GNode();
158
158
  elementProxy.size = { width: 0, height: 0 };
159
- return this.tool.positionSnapper.snapPosition(location, elementProxy);
159
+ return this.tool.changeBoundsManager.snapPosition(elementProxy, location);
160
160
  }
161
161
 
162
162
  override mouseOver(target: GModelElement, event: MouseEvent): Action[] {
@@ -1,5 +1,5 @@
1
1
  /********************************************************************************
2
- * Copyright (c) 2023 Business Informatics Group (TU Wien) and others.
2
+ * Copyright (c) 2023-2024 Business Informatics Group (TU Wien) and others.
3
3
  *
4
4
  * This program and the accompanying materials are made available under the
5
5
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -13,8 +13,9 @@
13
13
  *
14
14
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15
15
  ********************************************************************************/
16
- import { Action, IActionHandler, TYPES, ViewerOptions } from '@eclipse-glsp/sprotty';
16
+ import { Action, DOMHelper, IActionHandler, TYPES } from '@eclipse-glsp/sprotty';
17
17
  import { inject, injectable } from 'inversify';
18
+ import { EditorContextService } from '../../base';
18
19
  import { FocusTracker } from '../../base/focus/focus-tracker';
19
20
  import { IDiagramStartup } from '../../base/model/diagram-loader';
20
21
  import { EnableDefaultToolsAction } from '../../base/tool-manager/tool';
@@ -25,20 +26,26 @@ import { FocusDomAction } from '../accessibility/actions';
25
26
  */
26
27
  @injectable()
27
28
  export class RestoreViewportHandler implements IActionHandler, IDiagramStartup {
28
- protected readonly graphSelector = '[data-svg-metadata-type="graph"]';
29
-
30
- @inject(TYPES.ViewerOptions)
31
- protected options: ViewerOptions;
29
+ @inject(TYPES.DOMHelper)
30
+ protected domHelper: DOMHelper;
32
31
 
33
32
  @inject(FocusTracker)
34
33
  protected focusTracker: FocusTracker;
35
34
 
35
+ @inject(EditorContextService)
36
+ protected editorContext: EditorContextService;
37
+
36
38
  handle(action: Action): void | Action {
37
39
  if (EnableDefaultToolsAction.is(action) || (FocusDomAction.is(action) && action.id === 'graph')) {
38
40
  this.focusGraph();
39
41
  }
40
42
  }
41
43
 
44
+ get graphSelector(): string {
45
+ const rootId = this.domHelper.createUniqueDOMElementId(this.editorContext.modelRoot);
46
+ return `#${rootId}`;
47
+ }
48
+
42
49
  async postRequestModel(): Promise<void> {
43
50
  await this.waitForElement(this.graphSelector);
44
51
  this.focusGraph();
@@ -51,7 +58,6 @@ export class RestoreViewportHandler implements IActionHandler, IDiagramStartup {
51
58
  }
52
59
  }
53
60
 
54
- // https://stackoverflow.com/questions/5525071/how-to-wait-until-an-element-exists
55
61
  protected waitForElement(selector: string): Promise<Element | null> {
56
62
  return new Promise(resolve => {
57
63
  if (document.querySelector(selector)) {
@@ -137,9 +137,12 @@ export function isNotUndefined<T>(element: T | undefined): element is T {
137
137
  * @param element The element to which the css classes should be added.
138
138
  * @param cssClasses The set of css classes as string array.
139
139
  */
140
- export function addCssClasses(element: GModelElement, cssClasses: string[]): void {
140
+ export function addCssClasses(element: GModelElement, cssClasses: string[]): void;
141
+ export function addCssClasses(element: GModelElement, ...cssClasses: string[]): void;
142
+ export function addCssClasses(element: GModelElement, ...cssClasses: string[] | [string[]]): void {
143
+ const classes = Array.isArray(cssClasses[0]) ? cssClasses[0] : cssClasses;
141
144
  const elementCssClasses: string[] = element.cssClasses ?? [];
142
- distinctAdd(elementCssClasses, ...cssClasses);
145
+ distinctAdd(elementCssClasses, ...classes);
143
146
  element.cssClasses = elementCssClasses;
144
147
  }
145
148
 
@@ -148,11 +151,44 @@ export function addCssClasses(element: GModelElement, cssClasses: string[]): voi
148
151
  * @param element The element from which the css classes should be removed.
149
152
  * @param cssClasses The set of css classes as string array.
150
153
  */
151
- export function removeCssClasses(root: GModelElement, cssClasses: string[]): void {
152
- if (!root.cssClasses || root.cssClasses.length === 0) {
154
+ export function removeCssClasses(element: GModelElement, cssClasses: string[]): void;
155
+ export function removeCssClasses(element: GModelElement, ...cssClasses: string[]): void;
156
+ export function removeCssClasses(element: GModelElement, ...cssClasses: string[] | [string[]]): void {
157
+ if (!element.cssClasses || element.cssClasses.length === 0) {
153
158
  return;
154
159
  }
155
- remove(root.cssClasses, ...cssClasses);
160
+ const classes = Array.isArray(cssClasses[0]) ? cssClasses[0] : cssClasses;
161
+ remove(element.cssClasses, ...classes);
162
+ }
163
+
164
+ /**
165
+ * Adds a css classs to a set of {@link GModelElement}s.
166
+ *
167
+ * @param elements The elements to which the css class should be added.
168
+ * @param cssClass The css class to add.
169
+ */
170
+ export function addCssClassToElements(elements: GModelElement[], ...cssClasses: string[]): void {
171
+ for (const element of elements) {
172
+ addCssClasses(element, cssClasses);
173
+ }
174
+ }
175
+
176
+ /**
177
+ * Removes a css class from a set of {@link GModelElement}s.
178
+ * @param elements The elements from which the css class should be removed.
179
+ * @param cssClass The css class to remove.
180
+ */
181
+ export function removeCssClassOfElements(elements: GModelElement[], ...cssClasses: string[]): void {
182
+ for (const element of elements) {
183
+ removeCssClasses(element, cssClasses);
184
+ }
185
+ }
186
+
187
+ /**
188
+ * Toggles a css class on a {@link GModelElement} based on the given toggle flag.
189
+ */
190
+ export function toggleCssClass(element: GModelElement, cssClass: string, toggle: boolean): void {
191
+ return toggle ? addCssClasses(element, cssClass) : removeCssClasses(element, cssClass);
156
192
  }
157
193
 
158
194
  export function isNonRoutableSelectedMovableBoundsAware(element: GModelElement): element is SelectableBoundsAware {
@@ -33,6 +33,10 @@ export function minHeight(element: BoundsAwareModelElement): number {
33
33
  return 1;
34
34
  }
35
35
 
36
+ export function minDimensions(element: BoundsAwareModelElement): Dimension {
37
+ return { width: minWidth(element), height: minHeight(element) };
38
+ }
39
+
36
40
  export function getLayoutOptions(element: GModelElement): ModelLayoutOptions | undefined {
37
41
  const layoutOptions = (element as any).layoutOptions;
38
42
  if (layoutOptions !== undefined) {