@node-projects/web-component-designer 0.1.104 → 0.1.106

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 (103) hide show
  1. package/dist/elements/helper/Helper.d.ts +1 -0
  2. package/dist/elements/helper/Helper.js +13 -0
  3. package/dist/elements/item/DesignItem.d.ts +0 -5
  4. package/dist/elements/item/DesignItem.js +2 -3
  5. package/dist/elements/item/IDesignItem.d.ts +0 -5
  6. package/dist/elements/services/DefaultServiceBootstrap.js +18 -18
  7. package/dist/elements/services/dragDropService/DragDropService.js +1 -1
  8. package/dist/elements/services/selectionService/ISelectionChangedEvent copy.d.ts +6 -0
  9. package/dist/elements/services/selectionService/ISelectionChangedEvent copy.js +1 -0
  10. package/dist/elements/services/selectionService/ISelectionChangedEvent.d.ts +1 -0
  11. package/dist/elements/services/selectionService/ISelectionRefreshEvent.d.ts +5 -0
  12. package/dist/elements/services/selectionService/ISelectionRefreshEvent.js +1 -0
  13. package/dist/elements/services/selectionService/ISelectionService.d.ts +3 -1
  14. package/dist/elements/services/selectionService/SelectionService.d.ts +4 -2
  15. package/dist/elements/services/selectionService/SelectionService.js +10 -4
  16. package/dist/elements/widgets/designerView/extensions/AbstractExtension.d.ts +7 -0
  17. package/dist/elements/widgets/designerView/extensions/AbstractExtension.js +21 -0
  18. package/dist/elements/widgets/designerView/extensions/AbstractToolbarExtension.d.ts +9 -0
  19. package/dist/elements/widgets/designerView/extensions/AbstractToolbarExtension.js +30 -0
  20. package/dist/elements/widgets/designerView/extensions/ConditionExtensionProvider.d.ts +13 -0
  21. package/dist/elements/widgets/designerView/extensions/ConditionExtensionProvider.js +18 -0
  22. package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtension.d.ts +1 -0
  23. package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtension.js +7 -16
  24. package/dist/elements/widgets/designerView/extensions/EditTextExtension.d.ts +18 -0
  25. package/dist/elements/widgets/designerView/extensions/EditTextExtension.js +107 -0
  26. package/dist/elements/widgets/designerView/extensions/ExtensionManager.d.ts +10 -3
  27. package/dist/elements/widgets/designerView/extensions/ExtensionManager.js +100 -60
  28. package/dist/elements/widgets/designerView/extensions/ExtensionType.d.ts +5 -1
  29. package/dist/elements/widgets/designerView/extensions/ExtensionType.js +4 -0
  30. package/dist/elements/widgets/designerView/extensions/GridToolbarExtension.d.ts +12 -0
  31. package/dist/elements/widgets/designerView/extensions/GridToolbarExtension.js +58 -0
  32. package/dist/elements/widgets/designerView/extensions/IExtensionManger.d.ts +3 -3
  33. package/dist/elements/widgets/designerView/extensions/TransformOriginExtensionProvider.js +6 -2
  34. package/dist/elements/widgets/designerView/extensions/block/BlockToolbarExtension.d.ts +12 -0
  35. package/dist/elements/widgets/designerView/extensions/block/BlockToolbarExtension.js +35 -0
  36. package/dist/elements/widgets/designerView/extensions/block/BlockToolbarExtensionProvider.d.ts +9 -0
  37. package/dist/elements/widgets/designerView/extensions/block/BlockToolbarExtensionProvider.js +12 -0
  38. package/dist/elements/widgets/designerView/extensions/block/FlexToolbarExtension.d.ts +12 -0
  39. package/dist/elements/widgets/designerView/extensions/block/FlexToolbarExtension.js +34 -0
  40. package/dist/elements/widgets/designerView/extensions/block/FlexToolbarExtensionProvider.d.ts +9 -0
  41. package/dist/elements/widgets/designerView/extensions/block/FlexToolbarExtensionProvider.js +12 -0
  42. package/dist/elements/widgets/designerView/extensions/contextMenu/ChildContextMenu.d.ts +11 -0
  43. package/dist/elements/widgets/designerView/extensions/contextMenu/ChildContextMenu.js +14 -0
  44. package/dist/elements/widgets/designerView/extensions/contextMenu/CopyPasteContextMenu.js +3 -3
  45. package/dist/elements/widgets/designerView/extensions/contextMenu/JumpToElementContextMenu.js +1 -1
  46. package/dist/elements/widgets/designerView/extensions/contextMenu/MultipleItemsSelectedContextMenu.js +1 -1
  47. package/dist/elements/widgets/designerView/extensions/contextMenu/PathContextMenu.js +1 -1
  48. package/dist/elements/widgets/designerView/extensions/contextMenu/RectContextMenu.js +1 -1
  49. package/dist/elements/widgets/designerView/extensions/contextMenu/RotateLeftAndRightContextMenu.js +1 -1
  50. package/dist/elements/widgets/designerView/extensions/contextMenu/SelectAllChildrenContextMenu.js +1 -1
  51. package/dist/elements/widgets/designerView/extensions/contextMenu/ZMoveContextMenu.js +1 -1
  52. package/dist/elements/widgets/designerView/extensions/contextMenu/ZoomToElementContextMenu.js +1 -1
  53. package/dist/elements/widgets/designerView/extensions/flex/FlexToolbarExtension.d.ts +12 -0
  54. package/dist/elements/widgets/designerView/extensions/flex/FlexToolbarExtension.js +35 -0
  55. package/dist/elements/widgets/designerView/extensions/flex/FlexToolbarExtensionProvider.d.ts +9 -0
  56. package/dist/elements/widgets/designerView/extensions/flex/FlexToolbarExtensionProvider.js +12 -0
  57. package/dist/elements/widgets/designerView/extensions/flex/GridToolbarExtension.d.ts +12 -0
  58. package/dist/elements/widgets/designerView/extensions/flex/GridToolbarExtension.js +66 -0
  59. package/dist/elements/widgets/designerView/extensions/flex/GridToolbarExtensionProvider.d.ts +10 -0
  60. package/dist/elements/widgets/designerView/extensions/flex/GridToolbarExtensionProvider.js +17 -0
  61. package/dist/elements/widgets/designerView/extensions/grid/DisplayGridExtension.d.ts +1 -0
  62. package/dist/elements/widgets/designerView/extensions/grid/DisplayGridExtension.js +12 -8
  63. package/dist/elements/widgets/designerView/extensions/grid/GridChildResizeExtension.d.ts +27 -0
  64. package/dist/elements/widgets/designerView/extensions/grid/GridChildResizeExtension.js +259 -0
  65. package/dist/elements/widgets/designerView/extensions/grid/GridChildResizeExtensionProvider.d.ts +10 -0
  66. package/dist/elements/widgets/designerView/extensions/grid/GridChildResizeExtensionProvider.js +16 -0
  67. package/dist/elements/widgets/designerView/extensions/grid/GridChildToolbarExtension.d.ts +12 -0
  68. package/dist/elements/widgets/designerView/extensions/grid/GridChildToolbarExtension.js +66 -0
  69. package/dist/elements/widgets/designerView/extensions/grid/GridChildToolbarExtensionProvider.d.ts +10 -0
  70. package/dist/elements/widgets/designerView/extensions/grid/GridChildToolbarExtensionProvider.js +17 -0
  71. package/dist/elements/widgets/designerView/extensions/grid/GridToolbarExtension copy.d.ts +12 -0
  72. package/dist/elements/widgets/designerView/extensions/grid/GridToolbarExtension copy.js +66 -0
  73. package/dist/elements/widgets/designerView/extensions/grid/GridToolbarExtension.d.ts +12 -0
  74. package/dist/elements/widgets/designerView/extensions/grid/GridToolbarExtension.js +67 -0
  75. package/dist/elements/widgets/designerView/extensions/grid/GridToolbarExtensionProvider copy.d.ts +10 -0
  76. package/dist/elements/widgets/designerView/extensions/grid/GridToolbarExtensionProvider copy.js +17 -0
  77. package/dist/elements/widgets/designerView/extensions/grid/GridToolbarExtensionProvider.d.ts +9 -0
  78. package/dist/elements/widgets/designerView/extensions/grid/GridToolbarExtensionProvider.js +12 -0
  79. package/dist/elements/widgets/designerView/extensions/grid/ResizeExtension.d.ts +28 -0
  80. package/dist/elements/widgets/designerView/extensions/grid/ResizeExtension.js +355 -0
  81. package/dist/elements/widgets/designerView/extensions/grid/ResizeExtensionProvider.d.ts +12 -0
  82. package/dist/elements/widgets/designerView/extensions/grid/ResizeExtensionProvider.js +20 -0
  83. package/dist/elements/widgets/designerView/extensions/logic/ConditionExtensionProvider.d.ts +13 -0
  84. package/dist/elements/widgets/designerView/extensions/logic/ConditionExtensionProvider.js +18 -0
  85. package/dist/elements/widgets/designerView/extensions/svg/EllipsisExtension.js +8 -6
  86. package/dist/elements/widgets/designerView/extensions/svg/RectExtension.d.ts +2 -2
  87. package/dist/elements/widgets/designerView/extensions/svg/RectExtension.js +18 -15
  88. package/dist/elements/widgets/designerView/extensions/svg/RectExtensionProvider copy.d.ts +9 -0
  89. package/dist/elements/widgets/designerView/extensions/svg/RectExtensionProvider copy.js +14 -0
  90. package/dist/elements/widgets/designerView/extensions/svg/SvgBaseExtension.d.ts +30 -0
  91. package/dist/elements/widgets/designerView/extensions/svg/SvgBaseExtension.js +181 -0
  92. package/dist/elements/widgets/designerView/extensions/svg/SvgElementExtension.d.ts +26 -0
  93. package/dist/elements/widgets/designerView/extensions/svg/SvgElementExtension.js +144 -0
  94. package/dist/elements/widgets/designerView/extensions/svg/SvgElementExtensionProvider.d.ts +9 -0
  95. package/dist/elements/widgets/designerView/extensions/svg/SvgElementExtensionProvider.js +16 -0
  96. package/dist/elements/widgets/designerView/overlayLayerView.js +4 -1
  97. package/dist/elements/widgets/designerView/tools/DrawElementTool.js +1 -1
  98. package/dist/elements/widgets/designerView/tools/PointerTool.js +9 -9
  99. package/dist/elements/widgets/designerView/tools/RectangleSelectorTool.js +0 -1
  100. package/dist/elements/widgets/propertyGrid/PropertyGridWithHeader.js +1 -0
  101. package/dist/index.d.ts +15 -0
  102. package/dist/index.js +14 -0
  103. package/package.json +1 -1
@@ -7,3 +7,4 @@ export declare function pointInRect(point: IPoint, rect: IRect): boolean;
7
7
  export declare function removeTrailing(text: string, char: string): string;
8
8
  export declare function removeLeading(text: string, char: string): string;
9
9
  export declare function requestAnimationFramePromise(): Promise<unknown>;
10
+ export declare function arraysEqual<T>(a: T[], b: T[]): boolean;
@@ -37,3 +37,16 @@ export function removeLeading(text, char) {
37
37
  export function requestAnimationFramePromise() {
38
38
  return new Promise(resolve => requestAnimationFrame(resolve));
39
39
  }
40
+ export function arraysEqual(a, b) {
41
+ if (a === b)
42
+ return true;
43
+ if (a == null || b == null)
44
+ return false;
45
+ if (a.length !== b.length)
46
+ return false;
47
+ for (var i = 0; i < a.length; ++i) {
48
+ if (a[i] !== b[i])
49
+ return false;
50
+ }
51
+ return true;
52
+ }
@@ -4,10 +4,7 @@ import { IDesignItem } from './IDesignItem.js';
4
4
  import { InstanceServiceContainer } from '../services/InstanceServiceContainer.js';
5
5
  import { ChangeGroup } from '../services/undoService/ChangeGroup.js';
6
6
  import { NodeType } from './NodeType.js';
7
- import { ExtensionType } from '../widgets/designerView/extensions/ExtensionType.js';
8
- import { IDesignerExtension } from '../widgets/designerView/extensions/IDesignerExtension.js';
9
7
  import { ISize } from '../../interfaces/ISize.js';
10
- import { IDesignerExtensionProvider } from '../widgets/designerView/extensions/IDesignerExtensionProvider.js';
11
8
  import { IStyleRule } from '../services/stylesheetService/IStylesheetService.js';
12
9
  import { TypedEvent } from '@node-projects/base-custom-webcomponent';
13
10
  import { IPlacementService } from '../services/placementService/IPlacementService.js';
@@ -18,8 +15,6 @@ export declare class DesignItem implements IDesignItem {
18
15
  view: Node;
19
16
  serviceContainer: ServiceContainer;
20
17
  instanceServiceContainer: InstanceServiceContainer;
21
- appliedDesignerExtensions: Map<ExtensionType, IDesignerExtension[]>;
22
- shouldAppliedDesignerExtensions: Map<ExtensionType, IDesignerExtensionProvider[]>;
23
18
  nodeReplaced: TypedEvent<void>;
24
19
  clone(): Promise<IDesignItem>;
25
20
  allMatching(selectors: string): Generator<IDesignItem, void, undefined>;
@@ -20,8 +20,6 @@ export class DesignItem {
20
20
  view;
21
21
  serviceContainer;
22
22
  instanceServiceContainer;
23
- appliedDesignerExtensions = new Map();
24
- shouldAppliedDesignerExtensions = new Map();
25
23
  nodeReplaced = new TypedEvent;
26
24
  async clone() {
27
25
  try {
@@ -266,11 +264,12 @@ export class DesignItem {
266
264
  set innerHTML(value) {
267
265
  if (this.nodeType != NodeType.TextNode) {
268
266
  const grp = this.openGroup('set innerHTML');
267
+ this.clearChildren();
269
268
  const range = document.createRange();
270
269
  range.selectNode(document.body);
271
270
  const fragment = range.createContextualFragment(value);
272
271
  for (const n of fragment.childNodes) {
273
- let di = DesignItem.GetOrCreateDesignItem(n, n, this.serviceContainer, this.instanceServiceContainer);
272
+ let di = DesignItem.createDesignItemFromInstance(n, this.serviceContainer, this.instanceServiceContainer);
274
273
  this.insertChild(di);
275
274
  }
276
275
  grp.commit();
@@ -2,10 +2,7 @@ import { ServiceContainer } from '../services/ServiceContainer.js';
2
2
  import { InstanceServiceContainer } from '../services/InstanceServiceContainer.js';
3
3
  import { ChangeGroup } from '../services/undoService/ChangeGroup.js';
4
4
  import { NodeType } from './NodeType.js';
5
- import { ExtensionType } from '../widgets/designerView/extensions/ExtensionType.js';
6
- import { IDesignerExtension } from '../widgets/designerView/extensions/IDesignerExtension.js';
7
5
  import { ISize } from "../../interfaces/ISize.js";
8
- import { IDesignerExtensionProvider } from '../widgets/designerView/extensions/IDesignerExtensionProvider.js';
9
6
  import { IStyleRule } from '../services/stylesheetService/IStylesheetService.js';
10
7
  import { IPlacementService } from '../services/placementService/IPlacementService.js';
11
8
  import { TypedEvent } from '@node-projects/base-custom-webcomponent';
@@ -51,8 +48,6 @@ export interface IDesignItem {
51
48
  readonly element: Element;
52
49
  serviceContainer: ServiceContainer;
53
50
  instanceServiceContainer: InstanceServiceContainer;
54
- appliedDesignerExtensions: Map<ExtensionType, IDesignerExtension[]>;
55
- shouldAppliedDesignerExtensions: Map<ExtensionType, IDesignerExtensionProvider[]>;
56
51
  getOrCreateDesignItem(node: Node): any;
57
52
  openGroup(title: string): ChangeGroup;
58
53
  styles(): Iterable<[name: string, value: string]>;
@@ -14,7 +14,6 @@ import { ElementDragTitleExtensionProvider } from '../widgets/designerView/exten
14
14
  import { TransformOriginExtensionProvider } from '../widgets/designerView/extensions/TransformOriginExtensionProvider.js';
15
15
  import { CanvasExtensionProvider } from '../widgets/designerView/extensions/CanvasExtensionProvider.js';
16
16
  import { PositionExtensionProvider } from '../widgets/designerView/extensions/PositionExtensionProvider.js';
17
- import { PathExtensionProvider } from '../widgets/designerView/extensions/svg/PathExtensionProvider.js';
18
17
  import { HighlightElementExtensionProvider } from '../widgets/designerView/extensions/HighlightElementExtensionProvider.js';
19
18
  import { NamedTools } from '../widgets/designerView/tools/NamedTools.js';
20
19
  import { PointerTool } from '../widgets/designerView/tools/PointerTool.js';
@@ -62,9 +61,6 @@ import { DrawToolButtonProvider } from '../widgets/designerView/tools/toolBar/bu
62
61
  import { TextToolButtonProvider } from '../widgets/designerView/tools/toolBar/buttons/TextToolButtonProvider.js';
63
62
  import { SelectorToolButtonProvider } from '../widgets/designerView/tools/toolBar/buttons/SelectorToolButtonProvider.js';
64
63
  import { GrayOutDragOverContainerExtensionProvider } from '../widgets/designerView/extensions/GrayOutDragOverContainerExtensionProvider.js';
65
- import { LineExtensionProvider } from '../widgets/designerView/extensions/svg/LineExtensionProvider.js';
66
- import { RectExtentionProvider } from '../widgets/designerView/extensions/svg/RectExtensionProvider.js';
67
- import { EllipsisExtensionProvider } from '../widgets/designerView/extensions/svg/EllipsisExtensionProvider.js';
68
64
  import { PropertyGroupsService } from './propertiesService/PropertyGroupsService.js';
69
65
  import { PlacementExtensionProvider } from '../widgets/designerView/extensions/PlacementExtensionProvider.js';
70
66
  import { FlexboxExtensionProvider } from '../widgets/designerView/extensions/FlexboxExtensionProvider.js';
@@ -87,6 +83,12 @@ import { SimpleDemoProviderService } from './demoProviderService/SimpleDemoProvi
87
83
  import { DrawElementTool } from '../widgets/designerView/tools/DrawElementTool.js';
88
84
  import { RoundPixelsDesignViewConfigButton } from '../widgets/designerView/extensions/buttons/RoundPixelsDesignViewConfigButton.js';
89
85
  import { MathMLElementsPropertiesService } from './propertiesService/services/MathMLElementsPropertiesService.js';
86
+ import { SvgElementExtensionProvider } from '../widgets/designerView/extensions/svg/SvgElementExtensionProvider.js';
87
+ import { ConditionExtensionProvider } from '../widgets/designerView/extensions/logic/ConditionExtensionProvider.js';
88
+ import { GridToolbarExtensionProvider } from '../widgets/designerView/extensions/grid/GridToolbarExtensionProvider.js';
89
+ import { FlexToolbarExtensionProvider } from '../widgets/designerView/extensions/flex/FlexToolbarExtensionProvider.js';
90
+ import { BlockToolbarExtensionProvider } from '../widgets/designerView/extensions/block/BlockToolbarExtensionProvider.js';
91
+ import { ChildContextMenu } from '../widgets/designerView/extensions/contextMenu/ChildContextMenu.js';
90
92
  export function createDefaultServiceContainer() {
91
93
  let serviceContainer = new ServiceContainer();
92
94
  let defaultPlacementService = new DefaultPlacementService();
@@ -118,22 +120,22 @@ export function createDefaultServiceContainer() {
118
120
  serviceContainer.register("contentService", (designerCanvas) => new ContentService(designerCanvas.rootDesignItem));
119
121
  serviceContainer.register("designItemDocumentPositionService", (designerCanvas) => new DesignItemDocumentPositionService(designerCanvas));
120
122
  serviceContainer.designerExtensions.set(ExtensionType.Permanent, [
121
- // new ResizeExtensionProvider(false),
122
123
  new InvisibleElementExtensionProvider(),
123
- // new ElementDragTitleExtensionProvider(),
124
124
  ]);
125
125
  serviceContainer.designerExtensions.set(ExtensionType.PrimarySelection, [
126
- new ElementDragTitleExtensionProvider(),
126
+ new ConditionExtensionProvider(new ElementDragTitleExtensionProvider(), item => !(item.node instanceof SVGElement) || item.node instanceof SVGSVGElement),
127
127
  new TransformOriginExtensionProvider(true),
128
128
  new CanvasExtensionProvider(),
129
129
  new PositionExtensionProvider(),
130
- new EllipsisExtensionProvider(),
131
- new LineExtensionProvider(),
132
- new PathExtensionProvider(),
133
- new RectExtentionProvider(),
130
+ new SvgElementExtensionProvider(),
134
131
  new ResizeExtensionProvider(true),
135
132
  new RotateExtensionProvider(),
136
- new MultipleSelectionRectExtensionProvider(),
133
+ new ConditionExtensionProvider(new MultipleSelectionRectExtensionProvider(), item => !(item.node instanceof SVGElement) || item.node instanceof SVGSVGElement),
134
+ ]);
135
+ serviceContainer.designerExtensions.set(ExtensionType.PrimarySelectionRefreshed, [
136
+ new GridToolbarExtensionProvider(),
137
+ new FlexToolbarExtensionProvider(),
138
+ new BlockToolbarExtensionProvider(),
137
139
  ]);
138
140
  serviceContainer.designerExtensions.set(ExtensionType.PrimarySelectionAndCanBeEntered, [
139
141
  new DisplayGridExtensionProvider(),
@@ -141,7 +143,7 @@ export function createDefaultServiceContainer() {
141
143
  new FlexboxExtensionProvider(),
142
144
  ]);
143
145
  serviceContainer.designerExtensions.set(ExtensionType.Selection, [
144
- new SelectionDefaultExtensionProvider()
146
+ new ConditionExtensionProvider(new SelectionDefaultExtensionProvider(), item => !(item.node instanceof SVGElement) || item.node instanceof SVGSVGElement),
145
147
  ]);
146
148
  serviceContainer.designerExtensions.set(ExtensionType.PrimarySelectionContainerAndCanBeEntered, [
147
149
  new DisplayGridExtensionProvider(),
@@ -186,14 +188,12 @@ export function createDefaultServiceContainer() {
186
188
  serviceContainer.designViewConfigButtons.push(new ButtonSeperatorProvider(20), new GridExtensionDesignViewConfigButtons(), new FlexboxExtensionDesignViewConfigButtons(), new ButtonSeperatorProvider(10), new InvisibleElementExtensionDesignViewConfigButtons(), new ButtonSeperatorProvider(10), new StylesheetServiceDesignViewConfigButtons(), new ButtonSeperatorProvider(30), new RoundPixelsDesignViewConfigButton());
187
189
  serviceContainer.designViewToolbarButtons.push(new PointerToolButtonProvider(), new SeperatorToolProvider(22), new SelectorToolButtonProvider(), new SeperatorToolProvider(22), new ZoomToolButtonProvider(), new SeperatorToolProvider(22), new DrawToolButtonProvider(), new SeperatorToolProvider(22), new TextToolButtonProvider(), new SeperatorToolProvider(22), new TransformToolButtonProvider());
188
190
  serviceContainer.designerContextMenuExtensions = [
189
- new CopyPasteContextMenu(),
191
+ new ChildContextMenu('edit', new CopyPasteContextMenu()),
190
192
  new SeperatorContextMenu(),
191
- new RotateLeftAndRight(),
193
+ new ChildContextMenu('modify', new RotateLeftAndRight(), new SeperatorContextMenu(), new ZMoveContextMenu()),
192
194
  new SeperatorContextMenu(),
193
- new JumpToElementContextMenu(),
194
- new ZoomToElementContextMenu(),
195
+ new ChildContextMenu('view', new JumpToElementContextMenu(), new ZoomToElementContextMenu()),
195
196
  new SeperatorContextMenu(),
196
- new ZMoveContextMenu(),
197
197
  new MultipleItemsSelectedContextMenu(),
198
198
  new PathContextMenu(),
199
199
  new RectContextMenu(),
@@ -48,7 +48,7 @@ export class DragDropService {
48
48
  containerService.place(event, designerCanvas, newContainer, { x: 0, y: 0 }, { x: 0, y: 0 }, pos, [di]);
49
49
  containerService.finishPlace(event, designerCanvas, newContainer, { x: 0, y: 0 }, { x: 0, y: 0 }, pos, [di]);
50
50
  requestAnimationFrame(() => {
51
- designerCanvas.instanceServiceContainer.selectionService.setSelectedElements([di]);
51
+ designerCanvas.instanceServiceContainer.selectionService.setSelectedElements([di], event);
52
52
  grp.commit();
53
53
  });
54
54
  }
@@ -0,0 +1,6 @@
1
+ import { IDesignItem } from '../../item/IDesignItem.js';
2
+ export interface ISelectionChangedEvent {
3
+ oldSelectedElements: IDesignItem[];
4
+ selectedElements: IDesignItem[];
5
+ event?: Event;
6
+ }
@@ -2,4 +2,5 @@ import { IDesignItem } from '../../item/IDesignItem.js';
2
2
  export interface ISelectionChangedEvent {
3
3
  oldSelectedElements: IDesignItem[];
4
4
  selectedElements: IDesignItem[];
5
+ event?: Event;
5
6
  }
@@ -0,0 +1,5 @@
1
+ import { IDesignItem } from '../../item/IDesignItem.js';
2
+ export interface ISelectionRefreshEvent {
3
+ selectedElements: IDesignItem[];
4
+ event?: Event;
5
+ }
@@ -1,12 +1,14 @@
1
1
  import { TypedEvent } from '@node-projects/base-custom-webcomponent';
2
2
  import { IDesignItem } from '../../item/IDesignItem.js';
3
3
  import { ISelectionChangedEvent } from './ISelectionChangedEvent.js';
4
+ import { ISelectionRefreshEvent } from './ISelectionRefreshEvent.js';
4
5
  export interface ISelectionService {
5
6
  primarySelection: IDesignItem;
6
7
  selectedElements: IDesignItem[];
7
- setSelectedElements(designItems: IDesignItem[]): void;
8
+ setSelectedElements(designItems: IDesignItem[], even?: Event): void;
8
9
  setSelectionByTextRange(positionStart: number, positionEnd: number): any;
9
10
  clearSelectedElements(): void;
10
11
  isSelected(designItem: IDesignItem): boolean;
11
12
  readonly onSelectionChanged: TypedEvent<ISelectionChangedEvent>;
13
+ readonly onSelectionRefresh: TypedEvent<ISelectionRefreshEvent>;
12
14
  }
@@ -3,16 +3,18 @@ import { IDesignItem } from '../../item/IDesignItem.js';
3
3
  import { ISelectionChangedEvent } from './ISelectionChangedEvent.js';
4
4
  import { TypedEvent } from '@node-projects/base-custom-webcomponent';
5
5
  import { IDesignerCanvas } from '../../widgets/designerView/IDesignerCanvas.js';
6
+ import { ISelectionRefreshEvent } from './ISelectionRefreshEvent.js';
6
7
  export declare class SelectionService implements ISelectionService {
7
8
  primarySelection: IDesignItem;
8
9
  selectedElements: IDesignItem[];
9
10
  _designerCanvas: IDesignerCanvas;
10
11
  _undoSelectionChanges: boolean;
11
12
  constructor(designerCanvas: IDesignerCanvas, undoSelectionChanges: boolean);
12
- setSelectedElements(designItems: IDesignItem[]): void;
13
+ setSelectedElements(designItems: IDesignItem[], event?: Event): void;
13
14
  setSelectionByTextRange(positionStart: number, positionEnd: number): void;
14
- _withoutUndoSetSelectedElements(designItems: IDesignItem[]): void;
15
+ _withoutUndoSetSelectedElements(designItems: IDesignItem[], event?: Event): void;
15
16
  clearSelectedElements(): void;
16
17
  isSelected(designItem: IDesignItem): boolean;
17
18
  readonly onSelectionChanged: TypedEvent<ISelectionChangedEvent>;
19
+ readonly onSelectionRefresh: TypedEvent<ISelectionRefreshEvent>;
18
20
  }
@@ -1,5 +1,6 @@
1
1
  import { TypedEvent } from '@node-projects/base-custom-webcomponent';
2
2
  import { SelectionChangedAction } from '../undoService/transactionItems/SelectionChangedAction.js';
3
+ import { arraysEqual } from '../../helper/Helper.js';
3
4
  function findDesignItem(designItem, position) {
4
5
  let usedItem = null;
5
6
  if (designItem.hasChildren) {
@@ -25,14 +26,18 @@ export class SelectionService {
25
26
  this._designerCanvas = designerCanvas;
26
27
  this._undoSelectionChanges = undoSelectionChanges;
27
28
  }
28
- setSelectedElements(designItems) {
29
+ setSelectedElements(designItems, event) {
29
30
  if (this.selectedElements != designItems && !(this.selectedElements.length === 0 && (designItems == null || designItems.length === 0))) {
31
+ if (arraysEqual(designItems, this.selectedElements)) {
32
+ this.onSelectionRefresh.emit({ selectedElements: this.selectedElements, event });
33
+ return;
34
+ }
30
35
  if (this._undoSelectionChanges) {
31
36
  const action = new SelectionChangedAction(this.selectedElements, designItems, this);
32
37
  this._designerCanvas.instanceServiceContainer.undoService.execute(action);
33
38
  }
34
39
  else {
35
- this._withoutUndoSetSelectedElements(designItems);
40
+ this._withoutUndoSetSelectedElements(designItems, event);
36
41
  }
37
42
  }
38
43
  }
@@ -43,7 +48,7 @@ export class SelectionService {
43
48
  this.setSelectedElements([item]);
44
49
  }
45
50
  }
46
- _withoutUndoSetSelectedElements(designItems) {
51
+ _withoutUndoSetSelectedElements(designItems, event) {
47
52
  let oldSelectedElements = this.selectedElements;
48
53
  if (!designItems) {
49
54
  this.selectedElements = [];
@@ -61,7 +66,7 @@ export class SelectionService {
61
66
  else
62
67
  this.primarySelection = null;
63
68
  }
64
- this.onSelectionChanged.emit({ selectedElements: this.selectedElements, oldSelectedElements: oldSelectedElements });
69
+ this.onSelectionChanged.emit({ selectedElements: this.selectedElements, oldSelectedElements: oldSelectedElements, event });
65
70
  }
66
71
  clearSelectedElements() {
67
72
  this.setSelectedElements([]);
@@ -70,4 +75,5 @@ export class SelectionService {
70
75
  return this.selectedElements.indexOf(designItem) >= 0;
71
76
  }
72
77
  onSelectionChanged = new TypedEvent();
78
+ onSelectionRefresh = new TypedEvent();
73
79
  }
@@ -3,6 +3,12 @@ import { IDesignerCanvas } from '../IDesignerCanvas.js';
3
3
  import { IDesignerExtension } from './IDesignerExtension.js';
4
4
  import { IExtensionManager } from './IExtensionManger.js';
5
5
  import { AbstractExtensionBase } from "./AbstractExtensionBase.js";
6
+ import { OverlayLayer } from './OverlayLayer.js';
7
+ import { IPoint } from '../../../../interfaces/IPoint.js';
8
+ export type toolbarObject = SVGForeignObjectElement & {
9
+ updatePosition: (position: IPoint) => void;
10
+ getById: <T>(id: string) => T;
11
+ };
6
12
  export declare abstract class AbstractExtension extends AbstractExtensionBase implements IDesignerExtension {
7
13
  protected extendedItem: IDesignItem;
8
14
  constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
@@ -10,4 +16,5 @@ export declare abstract class AbstractExtension extends AbstractExtensionBase im
10
16
  abstract refresh(cache: Record<string | symbol, any>, event?: Event): any;
11
17
  abstract dispose(): any;
12
18
  remove(): void;
19
+ createToolbar(template: HTMLTemplateElement, width: number, height: number, overlayLayer?: OverlayLayer): toolbarObject;
13
20
  }
@@ -1,4 +1,5 @@
1
1
  import { AbstractExtensionBase } from "./AbstractExtensionBase.js";
2
+ import { OverlayLayer } from './OverlayLayer.js';
2
3
  export class AbstractExtension extends AbstractExtensionBase {
3
4
  extendedItem;
4
5
  constructor(extensionManager, designerView, extendedItem) {
@@ -8,4 +9,24 @@ export class AbstractExtension extends AbstractExtensionBase {
8
9
  remove() {
9
10
  this.extensionManager.removeExtensionInstance(this.extendedItem, this);
10
11
  }
12
+ createToolbar(template, width, height, overlayLayer = OverlayLayer.Foreground) {
13
+ const element = template.content.cloneNode(true);
14
+ element.querySelectorAll('*').forEach(x => x.onpointerdown = (e) => {
15
+ this.designerCanvas.ignoreEvent(e);
16
+ });
17
+ const foreignObject = document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject');
18
+ foreignObject.classList.add('svg-toolbar-container');
19
+ foreignObject.setAttribute('width', '' + width);
20
+ foreignObject.setAttribute('height', '' + height);
21
+ foreignObject.appendChild(element);
22
+ this._addOverlay(foreignObject, overlayLayer);
23
+ foreignObject.updatePosition = (position) => {
24
+ foreignObject.setAttribute('x', '' + position.x);
25
+ foreignObject.setAttribute('y', '' + position.y);
26
+ };
27
+ foreignObject.getById = (id) => {
28
+ return foreignObject.querySelector('#' + id);
29
+ };
30
+ return foreignObject;
31
+ }
11
32
  }
@@ -0,0 +1,9 @@
1
+ import { AbstractExtension } from "./AbstractExtension.js";
2
+ import { IPoint } from "../../../../interfaces/IPoint.js";
3
+ export declare abstract class AbstractToolbarExtension extends AbstractExtension {
4
+ abstract template: HTMLTemplateElement;
5
+ protected _toolbarContainer: SVGForeignObjectElement;
6
+ extend(cache: Record<string | symbol, any>, event: MouseEvent): void;
7
+ refresh(cache: Record<string | symbol, any>, event?: MouseEvent): void;
8
+ protected updateToolbarPosition(position: IPoint): void;
9
+ }
@@ -0,0 +1,30 @@
1
+ import { OverlayLayer } from "../OverlayLayer.js";
2
+ import { AbstractExtension } from "./AbstractExtension.js";
3
+ export class AbstractToolbarExtension extends AbstractExtension {
4
+ _toolbarContainer;
5
+ extend(cache, event) {
6
+ const element = this.template.content.cloneNode(true);
7
+ element.querySelectorAll('*').forEach(x => x.onpointerdown = (e) => {
8
+ this.designerCanvas.ignoreEvent(e);
9
+ });
10
+ const foreignObject = document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject');
11
+ this._toolbarContainer = foreignObject;
12
+ foreignObject.classList.add('svg-toolbar-container');
13
+ foreignObject.setAttribute('width', '1');
14
+ foreignObject.setAttribute('height', '1');
15
+ foreignObject.appendChild(element);
16
+ this.refresh(cache, event);
17
+ this._addOverlay(foreignObject, OverlayLayer.Foreground);
18
+ }
19
+ refresh(cache, event) {
20
+ if (event) {
21
+ const pos = this.designerCanvas.getNormalizedEventCoordinates(event);
22
+ this._toolbarContainer.setAttribute('x', '' + (pos.x - 16));
23
+ this._toolbarContainer.setAttribute('y', '' + (pos.y - 36));
24
+ }
25
+ }
26
+ updateToolbarPosition(position) {
27
+ this._toolbarContainer.setAttribute('x', '' + position.x);
28
+ this._toolbarContainer.setAttribute('y', '' + position.y);
29
+ }
30
+ }
@@ -0,0 +1,13 @@
1
+ import { IDesignerExtensionProvider } from './IDesignerExtensionProvider.js';
2
+ import { IDesignItem } from '../../../item/IDesignItem.js';
3
+ import { IDesignerCanvas } from '../IDesignerCanvas.js';
4
+ import { IDesignerExtension } from './IDesignerExtension.js';
5
+ import { IExtensionManager } from './IExtensionManger.js';
6
+ export declare class ConditionExtensionProvider implements IDesignerExtensionProvider {
7
+ constructor(extensionProvider: IDesignerExtensionProvider, condition: (designItem: IDesignItem) => boolean);
8
+ extensionProvider: IDesignerExtensionProvider;
9
+ condition: (designItem: IDesignItem) => boolean;
10
+ style: CSSStyleSheet;
11
+ shouldExtend(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): boolean;
12
+ getExtension(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
13
+ }
@@ -0,0 +1,18 @@
1
+ export class ConditionExtensionProvider {
2
+ constructor(extensionProvider, condition) {
3
+ this.extensionProvider = extensionProvider;
4
+ this.condition = condition;
5
+ this.style = extensionProvider.style;
6
+ }
7
+ extensionProvider;
8
+ condition;
9
+ style;
10
+ shouldExtend(extensionManager, designerView, designItem) {
11
+ if (!this.condition(designItem))
12
+ return false;
13
+ return this.extensionProvider.shouldExtend(extensionManager, designerView, designItem);
14
+ }
15
+ getExtension(extensionManager, designerView, designItem) {
16
+ return this.extensionProvider.getExtension(extensionManager, designerView, designItem);
17
+ }
18
+ }
@@ -9,6 +9,7 @@ export declare class EditTextExtension extends AbstractExtension implements hand
9
9
  private static template;
10
10
  private _foreignObject;
11
11
  private _path;
12
+ private _toolbar;
12
13
  constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
13
14
  extend(): void;
14
15
  refresh(): void;
@@ -6,7 +6,7 @@ import { shadowrootGetSelection, wrapSelectionInSpans } from "../../../../helper
6
6
  import { FontPropertyEditor } from "../../../../services/propertiesService/propertyEditors/FontPropertyEditor.js";
7
7
  export class EditTextExtension extends AbstractExtension {
8
8
  static template = html `
9
- <div style="height: 24px; display: flex; gap: 2px;">
9
+ <div style="height: 100%; display: flex; gap: 2px; width: 100%;">
10
10
  <button data-command="font-weight" data-command-parameter="800" style="pointer-events: all; height: 24px; width: 24px; padding: 0; font-weight: 900;">b</button>
11
11
  <button data-command="font-style" data-command-parameter="italic" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><em>i</em></button>
12
12
  <button data-command="text-decoration" data-command-parameter="underline" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><ins>u</ins></button>
@@ -34,6 +34,7 @@ export class EditTextExtension extends AbstractExtension {
34
34
  `;
35
35
  _foreignObject;
36
36
  _path;
37
+ _toolbar;
37
38
  constructor(extensionManager, designerView, extendedItem) {
38
39
  super(extensionManager, designerView, extendedItem);
39
40
  }
@@ -45,23 +46,13 @@ export class EditTextExtension extends AbstractExtension {
45
46
  this.extendedItem.element.setAttribute('contenteditable', '');
46
47
  this.extendedItem.element.focus();
47
48
  let itemRect = this.extendedItem.element.getBoundingClientRect();
48
- const elements = EditTextExtension.template.content.cloneNode(true);
49
- FontPropertyEditor.addFontsToSelect(elements.querySelector('#fontFamily'));
50
- elements.querySelectorAll('button').forEach(x => x.onpointerdown = (e) => {
51
- this.designerCanvas.ignoreEvent(e);
49
+ this._toolbar = this.createToolbar(EditTextExtension.template, 300, 24);
50
+ this._toolbar.updatePosition({ x: (itemRect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor, y: ((itemRect.y - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor - 36) });
51
+ FontPropertyEditor.addFontsToSelect(this._toolbar.getById('fontFamily'));
52
+ this._toolbar.querySelectorAll('button').forEach(x => x.onpointerdown = (e) => {
52
53
  this._formatSelection(x.dataset['command'], x.dataset['commandParameter']);
53
54
  });
54
- elements.querySelectorAll('select').forEach(x => x.onpointerdown = (e) => this.designerCanvas.ignoreEvent(e));
55
- elements.querySelectorAll('select').forEach(x => x.onchange = () => this._formatSelection(x.dataset['command'], x.value));
56
- //Button overlay
57
- const foreignObject = document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject');
58
- this._foreignObject = foreignObject;
59
- foreignObject.setAttribute('x', '' + (itemRect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor);
60
- foreignObject.setAttribute('y', '' + ((itemRect.y - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor - 30));
61
- foreignObject.setAttribute('width', '300');
62
- foreignObject.setAttribute('height', '24');
63
- foreignObject.appendChild(elements);
64
- this._addOverlay(foreignObject, OverlayLayer.Foreground);
55
+ this._toolbar.querySelectorAll('select').forEach(x => x.onchange = () => this._formatSelection(x.dataset['command'], x.value));
65
56
  //TODO - nice way to disable click overlay
66
57
  this.designerCanvas.clickOverlay.style.pointerEvents = 'none';
67
58
  //overlay to detect click outside
@@ -0,0 +1,18 @@
1
+ import { IDesignItem } from '../../../../item/IDesignItem.js';
2
+ import { IDesignerCanvas } from '../../IDesignerCanvas.js';
3
+ import { AbstractExtension } from "../AbstractExtension.js";
4
+ import { IExtensionManager } from '../IExtensionManger.js';
5
+ export type handlesPointerEvent = {
6
+ handlesPointerEvent(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): boolean;
7
+ };
8
+ export declare class EditTextExtension extends AbstractExtension implements handlesPointerEvent {
9
+ private static template;
10
+ private _foreignObject;
11
+ private _path;
12
+ constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
13
+ extend(): void;
14
+ refresh(): void;
15
+ dispose(): void;
16
+ handlesPointerEvent(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): boolean;
17
+ _formatSelection(type: string, value?: string): void;
18
+ }
@@ -0,0 +1,107 @@
1
+ import { html } from "@node-projects/base-custom-webcomponent";
2
+ import { AbstractExtension } from "../AbstractExtension.js";
3
+ import { OverlayLayer } from "../OverlayLayer.js";
4
+ import { getDesignerCanvasNormalizedTransformedCornerDOMPoints } from "../../../../helper/TransformHelper.js";
5
+ import { shadowrootGetSelection, wrapSelectionInSpans } from "../../../../helper/SelectionHelper.js";
6
+ import { FontPropertyEditor } from "../../../../services/propertiesService/propertyEditors/FontPropertyEditor.js";
7
+ export class EditTextExtension extends AbstractExtension {
8
+ static template = html `
9
+ <div style="height: 24px; display: flex; gap: 2px;">
10
+ <button data-command="font-weight" data-command-parameter="800" style="pointer-events: all; height: 24px; width: 24px; padding: 0; font-weight: 900;">b</button>
11
+ <button data-command="font-style" data-command-parameter="italic" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><em>i</em></button>
12
+ <button data-command="text-decoration" data-command-parameter="underline" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><ins>u</ins></button>
13
+ <button data-command="text-decoration" data-command-parameter="line-through" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><del>s</del></button>
14
+ <button data-command="text-decoration" data-command-parameter="overline" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><span style="text-decoration: overline">o</span></button>
15
+ <select data-command="fontSize" style="pointer-events: all; height: 24px; width: 60px; padding: 0;">
16
+ <option>8px</option>
17
+ <option>9px</option>
18
+ <option>10px</option>
19
+ <option>11px</option>
20
+ <option>12px</option>
21
+ <option>14px</option>
22
+ <option>16px</option>
23
+ <option>18px</option>
24
+ <option>20px</option>
25
+ <option>24px</option>
26
+ <option>28px</option>
27
+ <option>32px</option>
28
+ <option>36px</option>
29
+ </select>
30
+ <select id="fontFamily" data-command="font-family" style="pointer-events: all; height: 24px; width: 90px; padding: 0;">
31
+
32
+ </select>
33
+ </div>
34
+ `;
35
+ _foreignObject;
36
+ _path;
37
+ constructor(extensionManager, designerView, extendedItem) {
38
+ super(extensionManager, designerView, extendedItem);
39
+ }
40
+ extend() {
41
+ //TODO: -> check what to do with extensions, do not loose edit on mouse click,...
42
+ //maybe use a html edit framework
43
+ this.extendedItem.instanceServiceContainer.selectionService.clearSelectedElements();
44
+ this.extendedItem.removeDesignerAttributesAndStylesFromChildren();
45
+ this.extendedItem.element.setAttribute('contenteditable', '');
46
+ this.extendedItem.element.focus();
47
+ let itemRect = this.extendedItem.element.getBoundingClientRect();
48
+ const elements = EditTextExtension.template.content.cloneNode(true);
49
+ FontPropertyEditor.addFontsToSelect(elements.querySelector('#fontFamily'));
50
+ elements.querySelectorAll('button').forEach(x => x.onpointerdown = (e) => {
51
+ this.designerCanvas.ignoreEvent(e);
52
+ this._formatSelection(x.dataset['command'], x.dataset['commandParameter']);
53
+ });
54
+ elements.querySelectorAll('select').forEach(x => x.onpointerdown = (e) => this.designerCanvas.ignoreEvent(e));
55
+ elements.querySelectorAll('select').forEach(x => x.onchange = () => this._formatSelection(x.dataset['command'], x.value));
56
+ //Button overlay
57
+ const foreignObject = document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject');
58
+ this._foreignObject = foreignObject;
59
+ foreignObject.setAttribute('x', '' + (itemRect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor);
60
+ foreignObject.setAttribute('y', '' + ((itemRect.y - this.designerCanvas.containerBoundingRect.y) / this.designerCanvas.scaleFactor - 30));
61
+ foreignObject.setAttribute('width', '300');
62
+ foreignObject.setAttribute('height', '24');
63
+ foreignObject.appendChild(elements);
64
+ this._addOverlay(foreignObject, OverlayLayer.Foreground);
65
+ //TODO - nice way to disable click overlay
66
+ this.designerCanvas.clickOverlay.style.pointerEvents = 'none';
67
+ //overlay to detect click outside
68
+ this._path = document.createElementNS("http://www.w3.org/2000/svg", "path");
69
+ this._path.setAttribute('class', 'svg-edit-text-clickoutside');
70
+ this._path.setAttribute('fill-rule', 'evenodd');
71
+ this._path.style.pointerEvents = 'auto';
72
+ this._path.onpointerdown = (e) => {
73
+ this.extensionManager.removeExtensionInstance(this.extendedItem, this);
74
+ };
75
+ this._addOverlay(this._path, OverlayLayer.Background);
76
+ let points = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, null, this.designerCanvas);
77
+ let outsideRect = { width: this.designerCanvas.containerBoundingRect.width / this.designerCanvas.scaleFactor, height: this.designerCanvas.containerBoundingRect.height / this.designerCanvas.scaleFactor };
78
+ let data = "M0 0 L" + outsideRect.width + " 0 L" + outsideRect.width + ' ' + outsideRect.height + " L0 " + outsideRect.height + " Z ";
79
+ data += "M" + points[0].x + " " + points[0].y + " L" + points[1].x + " " + points[1].y + " L" + points[3].x + " " + points[3].y + " L" + points[2].x + " " + points[2].y + " Z";
80
+ this._path.setAttribute("d", data);
81
+ }
82
+ refresh() {
83
+ let points = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, null, this.designerCanvas);
84
+ let outsideRect = { width: this.designerCanvas.containerBoundingRect.width / this.designerCanvas.scaleFactor, height: this.designerCanvas.containerBoundingRect.height / this.designerCanvas.scaleFactor };
85
+ let data = "M0 0 L" + outsideRect.width + " 0 L" + outsideRect.width + ' ' + outsideRect.height + " L0 " + outsideRect.height + " Z ";
86
+ data += "M" + points[0].x + " " + points[0].y + " L" + points[1].x + " " + points[1].y + " L" + points[3].x + " " + points[3].y + " L" + points[2].x + " " + points[2].y + " Z";
87
+ this._path.setAttribute("d", data);
88
+ }
89
+ dispose() {
90
+ this._removeAllOverlays();
91
+ this.extendedItem.element.removeAttribute('contenteditable');
92
+ this.extendedItem.updateChildrenFromNodesChildren();
93
+ this.designerCanvas.clickOverlay.style.pointerEvents = 'auto';
94
+ }
95
+ handlesPointerEvent(designerCanvas, event, currentElement) {
96
+ const p = event.composedPath();
97
+ const stylo = this._foreignObject.querySelector('stylo-editor');
98
+ return p.indexOf(stylo) >= 0;
99
+ }
100
+ _formatSelection(type, value) {
101
+ const selection = shadowrootGetSelection(this.designerCanvas.rootDesignItem.element.shadowRoot);
102
+ const spans = wrapSelectionInSpans(selection);
103
+ for (const span of spans)
104
+ span.style[type] = value;
105
+ this.extendedItem.element.focus();
106
+ }
107
+ }