@node-projects/web-component-designer 0.1.90 → 0.1.91

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 (40) hide show
  1. package/assets/images/tools/PanTool.svg +5 -0
  2. package/config/elements-native.json +1 -0
  3. package/dist/elements/helper/ElementHelper.js +4 -4
  4. package/dist/elements/item/DesignItem.d.ts +1 -0
  5. package/dist/elements/item/DesignItem.js +10 -0
  6. package/dist/elements/item/IDesignItem.d.ts +1 -0
  7. package/dist/elements/widgets/designerView/IDesignerCanvas.d.ts +0 -1
  8. package/dist/elements/widgets/designerView/designerCanvas.d.ts +0 -1
  9. package/dist/elements/widgets/designerView/designerCanvas.js +0 -9
  10. package/dist/elements/widgets/designerView/extensions/AltToEnterContainerExtension.js +1 -1
  11. package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtension.d.ts +1 -7
  12. package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtension.js +26 -45
  13. package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtensionProvider.d.ts +1 -0
  14. package/dist/elements/widgets/designerView/extensions/EditText/EditTextExtensionProvider.js +5 -1
  15. package/dist/elements/widgets/designerView/extensions/ExtensionManager.d.ts +1 -0
  16. package/dist/elements/widgets/designerView/extensions/ExtensionManager.js +15 -0
  17. package/dist/elements/widgets/designerView/extensions/ExtensionType.d.ts +2 -1
  18. package/dist/elements/widgets/designerView/extensions/ExtensionType.js +2 -1
  19. package/dist/elements/widgets/designerView/extensions/GrayOutExtension.d.ts +0 -2
  20. package/dist/elements/widgets/designerView/extensions/GrayOutExtension.js +6 -9
  21. package/dist/elements/widgets/designerView/extensions/IExtensionManger.d.ts +1 -0
  22. package/dist/elements/widgets/designerView/tools/PointerTool.d.ts +2 -1
  23. package/dist/elements/widgets/designerView/tools/PointerTool.js +25 -9
  24. package/dist/elements/widgets/designerView/tools/TextTool.js +3 -5
  25. package/dist/elements/widgets/designerView/tools/toolBar/buttons/PointerToolButtonProvider.js +4 -1
  26. package/dist/elements/widgets/designerView/tools/toolBar/popups/AbstractBaseToolPopup.d.ts +5 -0
  27. package/dist/elements/widgets/designerView/tools/toolBar/popups/AbstractBaseToolPopup.js +37 -0
  28. package/dist/elements/widgets/designerView/tools/toolBar/popups/DrawToolPopup.d.ts +3 -3
  29. package/dist/elements/widgets/designerView/tools/toolBar/popups/DrawToolPopup.js +5 -36
  30. package/dist/elements/widgets/designerView/tools/toolBar/popups/PointerToolPopup copy.d.ts +6 -0
  31. package/dist/elements/widgets/designerView/tools/toolBar/popups/PointerToolPopup copy.js +49 -0
  32. package/dist/elements/widgets/designerView/tools/toolBar/popups/PointerToolPopup.d.ts +4 -0
  33. package/dist/elements/widgets/designerView/tools/toolBar/popups/PointerToolPopup.js +16 -0
  34. package/dist/elements/widgets/designerView/tools/toolBar/popups/SelectionToolPopup copy.d.ts +6 -0
  35. package/dist/elements/widgets/designerView/tools/toolBar/popups/SelectionToolPopup copy.js +49 -0
  36. package/dist/elements/widgets/designerView/tools/toolBar/popups/SelectionToolPopup.d.ts +2 -4
  37. package/dist/elements/widgets/designerView/tools/toolBar/popups/SelectionToolPopup.js +3 -36
  38. package/dist/index.d.ts +3 -0
  39. package/dist/index.js +3 -0
  40. package/package.json +24 -24
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <svg width="800px" height="800px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
3
+ <path d="M20.206 21.427l.185.573h-.566l-.187-.603-.063-.171c-.203-.545-.433-.775-.433-1.265a44.468 44.468 0 0 0 .195-4.722c-.056-.762-.025-1.491-.1-2.076-.062-.495-.112-.885-.112-1.09a7.746 7.746 0 0 0-.405-2.233 1.544 1.544 0 0 0-.805-1.014 2.121 2.121 0 0 0-.68-.12c-.396 0-.408.084-.3.764.047.293.108.66.118.703.198.872.3 1.204.07 1.204-.146 0-.47-.172-.5-.372-.012-.086-.331-1.839-.371-2.08A2.883 2.883 0 0 0 15.8 7.8a1.195 1.195 0 0 0-.841-.503.712.712 0 0 0-.646.198 1.77 1.77 0 0 0-.169.283c.014.003.118.535.214.852.097.319.271 1.548.357 1.676a.994.994 0 0 1 .15.645.147.147 0 0 1-.099.061 1.18 1.18 0 0 1-.53-.364c-.122-.156-.273-1.43-.426-1.89-.04-.12-.085-.272-.134-.435a5.147 5.147 0 0 0-.444-1.185 1.394 1.394 0 0 0-.835-.432.869.869 0 0 0-.829.344 1.363 1.363 0 0 0-.246.834 8.518 8.518 0 0 0 .164 1.391l.045.202a6.999 6.999 0 0 0 .401 1.204.174.174 0 0 1 .015.13c-.056.112-.275.116-.299.116a.301.301 0 0 1-.205-.062 7.393 7.393 0 0 1-.473-1.383c-.12-.533-.304-1.681-.645-1.748a1.285 1.285 0 0 0-.254-.025 1.023 1.023 0 0 0-.654.212 2.389 2.389 0 0 0-.742.998 5.79 5.79 0 0 0 .1 1.77c.712 2.656.774 2.617.796 2.788a2.123 2.123 0 0 0 .1.67c.07.203.233.645.251.696a1.967 1.967 0 0 1-.119.753l-.038.154a5.276 5.276 0 0 0-.114.624.082.082 0 0 1-.147.065 1.197 1.197 0 0 1-.241-.65 1.413 1.413 0 0 1 .071-.297.772.772 0 0 0 .043-.522 4.079 4.079 0 0 0-.163-.39 3.069 3.069 0 0 1-.145-.354 1.953 1.953 0 0 1-.067-.336 2.628 2.628 0 0 0-.16-.64 7.251 7.251 0 0 1-.229-.869 12.474 12.474 0 0 0-.287-1.431.685.685 0 0 0-.5-.282.642.642 0 0 0-.23.047.372.372 0 0 0-.205.377 36.57 36.57 0 0 0-.127 1.393.365.365 0 0 1-.071.192.407.407 0 0 0-.06.13 34.4 34.4 0 0 1-.385 1.269l-.08.256c-.032.105-.08.224-.129.347-.135.34-.303.761-.186.977a9.522 9.522 0 0 0 1.087 1.495 6.62 6.62 0 0 1 .57.65c.137.17.273.337.386.46a4.675 4.675 0 0 0 1.004.664c.131.074.252.14.342.196.112.069.265.178.442.305a11.3 11.3 0 0 0 .994.662c.124.071.188.101.376.196.569.28 1.336.705 1.609.85A3.88 3.88 0 0 1 14 22h-.717s-.341-.272-.756-.573a10.113 10.113 0 0 0-1.21-.658l-.18-.088a9.9 9.9 0 0 1-1.25-.8c-.185-.133-.325-.235-.43-.3-.06-.037-.32-.183-.32-.183a4.96 4.96 0 0 1-1.139-.77 8.711 8.711 0 0 1-.367-.434 7.55 7.55 0 0 0-.554-.64 9.849 9.849 0 0 1-1.202-1.64 1.73 1.73 0 0 1 .16-1.431 5.91 5.91 0 0 0 .115-.312l.061-.194c.1-.32.367-1.169.39-1.278a.976.976 0 0 1 .127-.302c.011-.164.069-.876.12-1.311a.913.913 0 0 1 .547-.874 1.185 1.185 0 0 1 .429-.086 1.043 1.043 0 0 1 .34.057 5.276 5.276 0 0 1-.03-1.314 2.742 2.742 0 0 1 .94-1.367 1.609 1.609 0 0 1 .988-.365 1.117 1.117 0 0 1 .47.097.84.84 0 0 1 .283.232 2.171 2.171 0 0 1 .283-.684 1.372 1.372 0 0 1 1.299-.617 1.872 1.872 0 0 1 1.258.634 1.617 1.617 0 0 1 .214.392 1.234 1.234 0 0 1 1.165-.43 1.741 1.741 0 0 1 1.218.74 4.562 4.562 0 0 1 .343.756.98.98 0 0 1 .64-.192 2.63 2.63 0 0 1 .905.17 2.235 2.235 0 0 1 1.087 1.413 8.22 8.22 0 0 1 .44 2.423c0 .17.048.55.11 1.026.08.631.045 1.349.1 2.103a41.59 41.59 0 0 1-.196 4.81 7.328 7.328 0 0 0 .502 1.353l.023.064z"/>
4
+ <path fill="none" d="M0 0h24v24H0z"/>
5
+ </svg>
@@ -2,6 +2,7 @@
2
2
  "elements":
3
3
  [
4
4
  "div",
5
+ "label",
5
6
  "input",
6
7
  "textarea",
7
8
  "select",
@@ -76,12 +76,12 @@ export function getElementsWindowOffsetWithoutSelfAndParentTransformations(eleme
76
76
  break;
77
77
  }
78
78
  let nextParent = element.offsetParent ? element.offsetParent : element.getRootNode().host;
79
- if (element instanceof SVGGraphicsElement) {
80
- nextParent = element.ownerSVGElement;
81
- }
82
- else if (element instanceof HTMLBodyElement || element instanceof HTMLHtmlElement) {
79
+ if (element instanceof SVGSVGElement || element instanceof HTMLBodyElement || element instanceof HTMLHtmlElement) {
83
80
  nextParent = element.parentElement ? element.parentElement : element.getRootNode().host;
84
81
  }
82
+ else if (element instanceof SVGGraphicsElement) {
83
+ nextParent = element.ownerSVGElement;
84
+ }
85
85
  let scrollLeft = 0;
86
86
  let scrollTop = 0;
87
87
  if (nextParent) {
@@ -74,6 +74,7 @@ export declare class DesignItem implements IDesignItem {
74
74
  set lockAtDesignTime(value: boolean);
75
75
  static createDesignItemFromInstance(node: Node, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer): DesignItem;
76
76
  querySelectorAll(selectors: string): NodeListOf<HTMLElement>;
77
+ removeDesignerAttributesAndStylesFromChildren(): void;
77
78
  updateChildrenFromNodesChildren(): void;
78
79
  constructor(node: Node, parsedNode: any, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer);
79
80
  setView(node: Element): void;
@@ -351,6 +351,16 @@ export class DesignItem {
351
351
  return this.element.querySelectorAll(selectors);
352
352
  }
353
353
  }
354
+ removeDesignerAttributesAndStylesFromChildren() {
355
+ const els = this.querySelectorAll('*');
356
+ for (let e of els) {
357
+ const di = DesignItem.GetDesignItem(e);
358
+ if (!di.hasAttribute("draggable"))
359
+ e.removeAttribute("draggable");
360
+ if (!di.hasStyle("pointer-events"))
361
+ e.style.pointerEvents = '';
362
+ }
363
+ }
354
364
  updateChildrenFromNodesChildren() {
355
365
  this._childArray = [];
356
366
  if (this.nodeType == NodeType.Element) {
@@ -39,6 +39,7 @@ export interface IDesignItem {
39
39
  removeChild(designItem: IDesignItem): any;
40
40
  remove(): any;
41
41
  clearChildren(): any;
42
+ removeDesignerAttributesAndStylesFromChildren(): any;
42
43
  updateChildrenFromNodesChildren(): any;
43
44
  readonly hasContent: boolean;
44
45
  content: string;
@@ -32,7 +32,6 @@ export interface IDesignerCanvas extends IPlacementView, IUiCommandHandler {
32
32
  canvasOffset: IPoint;
33
33
  canvas: HTMLElement;
34
34
  additionalStyles: CSSStyleSheet[];
35
- eatEvents: Element;
36
35
  initialize(serviceContainer: ServiceContainer): any;
37
36
  getNormalizedEventCoordinates(event: MouseEvent): IPoint;
38
37
  getViewportCoordinates(event: MouseEvent): IPoint;
@@ -31,7 +31,6 @@ export declare class DesignerCanvas extends BaseCustomWebComponentLazyAppend imp
31
31
  snapLines: Snaplines;
32
32
  overlayLayer: OverlayLayerView;
33
33
  rootDesignItem: IDesignItem;
34
- eatEvents: Element;
35
34
  private _currentPasteOffset;
36
35
  private _zoomFactor;
37
36
  private _scaleFactor;
@@ -58,7 +58,6 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
58
58
  snapLines;
59
59
  overlayLayer;
60
60
  rootDesignItem;
61
- eatEvents;
62
61
  _currentPasteOffset = this.pasteOffset;
63
62
  _zoomFactor = 1; //if scale or zoom css property is used this needs to be the value
64
63
  _scaleFactor = 1; //if scale css property is used this need to be the scale value
@@ -869,8 +868,6 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
869
868
  }
870
869
  }
871
870
  onKeyUp(event) {
872
- if (event.composedPath().indexOf(this.eatEvents) >= 0)
873
- return;
874
871
  if (this._moveGroup) {
875
872
  this._moveGroup.commit();
876
873
  this._moveGroup = null;
@@ -878,8 +875,6 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
878
875
  event.preventDefault();
879
876
  }
880
877
  onKeyDown(event) {
881
- if (event.composedPath().indexOf(this.eatEvents) >= 0)
882
- return;
883
878
  if ((event.ctrlKey || event.metaKey) && event.key === 'z' && !event.shiftKey)
884
879
  this.executeCommand({ type: CommandType.undo, ctrlKey: event.ctrlKey, altKey: event.altKey, shiftKey: event.shiftKey });
885
880
  else if ((event.ctrlKey || event.metaKey) && event.key === 'z' && event.shiftKey)
@@ -1040,8 +1035,6 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
1040
1035
  for (let pe of this._pointerextensions)
1041
1036
  pe.refresh(event);
1042
1037
  }
1043
- if (event.composedPath().indexOf(this.eatEvents) >= 0)
1044
- return;
1045
1038
  let currentElement;
1046
1039
  if (forceElement)
1047
1040
  currentElement = forceElement;
@@ -1072,8 +1065,6 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
1072
1065
  this.showHoverExtension(currentDesignItem.element, event);
1073
1066
  //TODO: needed ??
1074
1067
  if (currentElement && DomHelper.getHost(currentElement.parentNode) === this.overlayLayer) {
1075
- if (this.eatEvents)
1076
- return;
1077
1068
  currentElement = this.instanceServiceContainer.selectionService.primarySelection?.element ?? this._canvas;
1078
1069
  }
1079
1070
  let tool = this.serviceContainer.globalContext.tool ?? this.serviceContainer.designerTools.get(NamedTools.Pointer);
@@ -10,7 +10,7 @@ export class AltToEnterContainerExtension extends AbstractExtension {
10
10
  }
11
11
  refresh() {
12
12
  const itemRect = this.designerCanvas.getNormalizedElementCoordinates(this.extendedItem.element);
13
- this._text = this._drawText("Press ALT to enter container", itemRect.x + 5, itemRect.y + 12, 'svg-text-enter-container', this._text, OverlayLayer.Foreground);
13
+ this._text = this._drawText("Press ALT (or hold) to enter container", itemRect.x + 5, itemRect.y + 12, 'svg-text-enter-container', this._text, OverlayLayer.Foreground);
14
14
  this._text.style.fontSize = (14 / this.designerCanvas.scaleFactor) + 'px';
15
15
  this._text.setAttribute('x', '' + (itemRect.x + 5 / this.designerCanvas.scaleFactor));
16
16
  this._text.setAttribute('y', '' + (itemRect.y + 12 / this.designerCanvas.scaleFactor));
@@ -7,18 +7,12 @@ export type handlesPointerEvent = {
7
7
  };
8
8
  export declare class EditTextExtension extends AbstractExtension implements handlesPointerEvent {
9
9
  private static template;
10
- private _contentEditedBound;
11
- private _blurBound;
12
- private _blurTimeout;
13
10
  private _foreignObject;
14
- private _focusBound;
11
+ private _path;
15
12
  constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
16
13
  extend(): void;
17
14
  refresh(): void;
18
15
  dispose(): void;
19
16
  handlesPointerEvent(designerCanvas: IDesignerCanvas, event: PointerEvent, currentElement: Element): boolean;
20
- _contentEdited(): void;
21
- _blur(): void;
22
- _focus(): void;
23
17
  _formatSelection(type: string): void;
24
18
  }
@@ -1,41 +1,32 @@
1
1
  import { html } from "@node-projects/base-custom-webcomponent";
2
2
  import { AbstractExtension } from "../AbstractExtension.js";
3
- import { ExtensionType } from "../ExtensionType.js";
4
3
  import { OverlayLayer } from "../OverlayLayer.js";
4
+ import { getDesignerCanvasNormalizedTransformedCornerDOMPoints } from "../../../../helper/TransformHelper.js";
5
5
  export class EditTextExtension extends AbstractExtension {
6
6
  static template = html `
7
- <div style="height: 24px; display: flex;">
7
+ <div style="height: 24px; display: flex; gap: 2px;">
8
8
  <button data-command="bold" style="pointer-events: all; height: 24px; width: 24px; padding: 0; font-weight: 900;">b</button>
9
9
  <button data-command="italic" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><em>i</em></button>
10
10
  <button data-command="underline" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><ins>u</ins></button>
11
11
  <button data-command="strikeThrough" style="pointer-events: all; height: 24px; width: 24px; padding: 0;"><del>s</del></button>
12
12
  </div>
13
13
  `;
14
- _contentEditedBound;
15
- _blurBound;
16
- _blurTimeout;
17
14
  _foreignObject;
18
- _focusBound;
15
+ _path;
19
16
  constructor(extensionManager, designerView, extendedItem) {
20
17
  super(extensionManager, designerView, extendedItem);
21
- this._contentEditedBound = this._contentEdited.bind(this);
22
- this._blurBound = this._blur.bind(this);
23
- this._focusBound = this._focus.bind(this);
24
18
  }
25
19
  extend() {
26
20
  //TODO: -> check what to do with extensions, do not loose edit on mouse click,...
27
21
  //maybe use a html edit framework
28
22
  this.extendedItem.instanceServiceContainer.selectionService.clearSelectedElements();
29
- //this.extensionManager.removeExtension(this.extendedItem, ExtensionType.PrimarySelection);
30
- //this.extensionManager.removeExtension(this.extendedItem, ExtensionType.PrimarySelectionAndCanBeEntered);
31
- //this.extensionManager.removeExtension(this.extendedItem, ExtensionType.Selection);
23
+ this.extendedItem.removeDesignerAttributesAndStylesFromChildren();
32
24
  this.extendedItem.element.setAttribute('contenteditable', '');
33
- this.extendedItem.element.addEventListener('input', this._contentEditedBound);
34
25
  this.extendedItem.element.focus();
35
- this.designerCanvas.eatEvents = this.extendedItem.element;
36
26
  let itemRect = this.extendedItem.element.getBoundingClientRect();
37
27
  const elements = EditTextExtension.template.content.cloneNode(true);
38
- elements.querySelectorAll('button').forEach(x => x.onclick = () => this._formatSelection(x.dataset['command']));
28
+ elements.querySelectorAll('button').forEach(x => x.onpointerdown = () => this._formatSelection(x.dataset['command']));
29
+ //Button overlay
39
30
  const foreignObject = document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject');
40
31
  this._foreignObject = foreignObject;
41
32
  foreignObject.setAttribute('x', '' + (itemRect.x - this.designerCanvas.containerBoundingRect.x) / this.designerCanvas.scaleFactor);
@@ -44,19 +35,33 @@ export class EditTextExtension extends AbstractExtension {
44
35
  foreignObject.setAttribute('height', '24');
45
36
  foreignObject.appendChild(elements);
46
37
  this._addOverlay(foreignObject, OverlayLayer.Foreground);
38
+ //TODO - nice way to disable click overlay
47
39
  this.designerCanvas.clickOverlay.style.pointerEvents = 'none';
48
- this.extendedItem.element.addEventListener('blur', this._blurBound);
49
- this.extendedItem.element.addEventListener('focus', this._focusBound);
40
+ //overlay to detect click outside
41
+ this._path = document.createElementNS("http://www.w3.org/2000/svg", "path");
42
+ this._path.setAttribute('class', 'svg-edit-text-clickoutside');
43
+ this._path.setAttribute('fill-rule', 'evenodd');
44
+ this._path.style.pointerEvents = 'auto';
45
+ this._path.onpointerdown = (e) => {
46
+ this.extensionManager.removeExtensionInstance(this.extendedItem, this);
47
+ };
48
+ this._addOverlay(this._path, OverlayLayer.Background);
49
+ let points = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, null, this.designerCanvas);
50
+ let outsideRect = { width: this.designerCanvas.containerBoundingRect.width / this.designerCanvas.scaleFactor, height: this.designerCanvas.containerBoundingRect.height / this.designerCanvas.scaleFactor };
51
+ let data = "M0 0 L" + outsideRect.width + " 0 L" + outsideRect.width + ' ' + outsideRect.height + " L0 " + outsideRect.height + " Z ";
52
+ 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";
53
+ this._path.setAttribute("d", data);
50
54
  }
51
55
  refresh() {
52
- this.dispose();
56
+ let points = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, null, this.designerCanvas);
57
+ let outsideRect = { width: this.designerCanvas.containerBoundingRect.width / this.designerCanvas.scaleFactor, height: this.designerCanvas.containerBoundingRect.height / this.designerCanvas.scaleFactor };
58
+ let data = "M0 0 L" + outsideRect.width + " 0 L" + outsideRect.width + ' ' + outsideRect.height + " L0 " + outsideRect.height + " Z ";
59
+ 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";
60
+ this._path.setAttribute("d", data);
53
61
  }
54
62
  dispose() {
55
63
  this._removeAllOverlays();
56
64
  this.extendedItem.element.removeAttribute('contenteditable');
57
- this.extendedItem.element.removeEventListener('input', this._contentEditedBound);
58
- this.extendedItem.element.removeEventListener('blur', this._blurBound);
59
- this.designerCanvas.eatEvents = null;
60
65
  this.extendedItem.updateChildrenFromNodesChildren();
61
66
  this.designerCanvas.clickOverlay.style.pointerEvents = 'auto';
62
67
  }
@@ -65,31 +70,7 @@ export class EditTextExtension extends AbstractExtension {
65
70
  const stylo = this._foreignObject.querySelector('stylo-editor');
66
71
  return p.indexOf(stylo) >= 0;
67
72
  }
68
- _contentEdited() {
69
- //TODO: -> save???
70
- //this.extendedItem.content = this.extendedItem.element.innerHTML;
71
- //console.log(this.extendedItem.element.innerHTML)
72
- }
73
- _blur() {
74
- if (!this._blurTimeout) {
75
- this._blurTimeout = setTimeout(() => {
76
- //TODO: don't remove doubleclick extension (another type could be used), remove extension itself
77
- //maybe also configureable when when to remove the extension
78
- this.extensionManager.removeExtension(this.extendedItem, ExtensionType.Doubleclick);
79
- }, 150);
80
- }
81
- }
82
- _focus() {
83
- if (this._blurTimeout) {
84
- clearTimeout(this._blurTimeout);
85
- this._blurTimeout = null;
86
- }
87
- }
88
73
  _formatSelection(type) {
89
- if (this._blurTimeout)
90
- clearTimeout(this._blurTimeout);
91
- this._blurTimeout = null;
92
- //const selection = <Selection>(<any>this.designerView.shadowRoot).getSelection()
93
74
  document.execCommand(type, false, null);
94
75
  this.extendedItem.element.focus();
95
76
  }
@@ -6,4 +6,5 @@ import { IExtensionManager } from '../IExtensionManger.js';
6
6
  export declare class EditTextExtensionProvider implements IDesignerExtensionProvider {
7
7
  shouldExtend(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): boolean;
8
8
  getExtension(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
9
+ readonly style: CSSStyleSheet;
9
10
  }
@@ -1,11 +1,15 @@
1
1
  import { EditTextExtension } from "./EditTextExtension.js";
2
+ import { css } from '@node-projects/base-custom-webcomponent';
2
3
  export class EditTextExtensionProvider {
3
4
  shouldExtend(extensionManager, designerView, designItem) {
4
- if (designItem.name === 'button' || designItem.name === 'input')
5
+ if (designItem.name === 'input')
5
6
  return false;
6
7
  return true;
7
8
  }
8
9
  getExtension(extensionManager, designerView, designItem) {
9
10
  return new EditTextExtension(extensionManager, designerView, designItem);
10
11
  }
12
+ style = css `
13
+ .svg-edit-text-clickoutside { stroke: transparent; fill: lightgray; opacity: 0.7 }
14
+ `;
11
15
  }
@@ -15,6 +15,7 @@ export declare class ExtensionManager implements IExtensionManager {
15
15
  private _selectedElementsChanged;
16
16
  applyExtension(designItem: IDesignItem, extensionType: ExtensionType, event?: Event, recursive?: boolean): IDesignerExtension[];
17
17
  applyExtensions(designItems: IDesignItem[], extensionType: ExtensionType, event?: Event, recursive?: boolean): void;
18
+ applyExtensionInstance(designItem: IDesignItem, extension: IDesignerExtension): void;
18
19
  removeExtensionInstance(designItem: IDesignItem, extension: IDesignerExtension): void;
19
20
  removeExtension(designItem: IDesignItem, extensionType?: ExtensionType): void;
20
21
  removeExtensions(designItems: IDesignItem[], recursive: boolean, extensionType?: ExtensionType): void;
@@ -142,6 +142,20 @@ export class ExtensionManager {
142
142
  }
143
143
  this.designerCanvas.overlayLayer.endBatch();
144
144
  }
145
+ applyExtensionInstance(designItem, extension) {
146
+ let appE = designItem.appliedDesignerExtensions.get(ExtensionType.Directly);
147
+ if (!appE)
148
+ appE = [];
149
+ try {
150
+ extension.extend(null, null);
151
+ }
152
+ catch (err) {
153
+ console.error(err);
154
+ }
155
+ appE.push(extension);
156
+ designItem.appliedDesignerExtensions.set(ExtensionType.Directly, appE);
157
+ this.designItemsWithExtentions.add(designItem);
158
+ }
145
159
  removeExtensionInstance(designItem, extension) {
146
160
  for (let e of designItem.appliedDesignerExtensions) {
147
161
  const idx = e[1].indexOf(extension);
@@ -341,6 +355,7 @@ export class ExtensionManager {
341
355
  refreshAllExtensions(designItems, ignoredExtension) {
342
356
  this.designerCanvas.overlayLayer.startBatch();
343
357
  if (designItems) {
358
+ this.refreshExtensions(designItems, ExtensionType.Directly, null, ignoredExtension);
344
359
  this.refreshExtensions(designItems, ExtensionType.Permanent, null, ignoredExtension);
345
360
  this.refreshExtensions(designItems, ExtensionType.Selection, null, ignoredExtension);
346
361
  this.refreshExtensions(designItems, ExtensionType.PrimarySelection, null, ignoredExtension);
@@ -1,4 +1,5 @@
1
1
  export declare enum ExtensionType {
2
+ Directly = 0,//Extensions wich are applied directly, for example from Text Edit Tool
2
3
  Permanent = 1,
3
4
  Selection = 2,
4
5
  PrimarySelection = 3,
@@ -22,7 +23,7 @@ export declare enum ExtensionType {
22
23
  Placement = 12,
23
24
  /**
24
25
  * Extensions only when the container can be Entered.
25
- * So for Example on a custome webcomponent wich uses a grid layout for it's root, but can not show children,
26
+ * So for Example on a custom webcomponent wich uses a grid layout for it's root, but can not show children,
26
27
  * do not display grid extension.
27
28
  */
28
29
  PrimarySelectionAndCanBeEntered = 13,
@@ -1,5 +1,6 @@
1
1
  export var ExtensionType;
2
2
  (function (ExtensionType) {
3
+ ExtensionType[ExtensionType["Directly"] = 0] = "Directly";
3
4
  ExtensionType[ExtensionType["Permanent"] = 1] = "Permanent";
4
5
  ExtensionType[ExtensionType["Selection"] = 2] = "Selection";
5
6
  ExtensionType[ExtensionType["PrimarySelection"] = 3] = "PrimarySelection";
@@ -23,7 +24,7 @@ export var ExtensionType;
23
24
  ExtensionType[ExtensionType["Placement"] = 12] = "Placement";
24
25
  /**
25
26
  * Extensions only when the container can be Entered.
26
- * So for Example on a custome webcomponent wich uses a grid layout for it's root, but can not show children,
27
+ * So for Example on a custom webcomponent wich uses a grid layout for it's root, but can not show children,
27
28
  * do not display grid extension.
28
29
  */
29
30
  ExtensionType[ExtensionType["PrimarySelectionAndCanBeEntered"] = 13] = "PrimarySelectionAndCanBeEntered";
@@ -1,4 +1,3 @@
1
- import { IRect } from '../../../../interfaces/IRect.js';
2
1
  import { IDesignItem } from '../../../item/IDesignItem.js';
3
2
  import { IDesignerCanvas } from '../IDesignerCanvas.js';
4
3
  import { AbstractExtension } from './AbstractExtension.js';
@@ -8,6 +7,5 @@ export declare class GrayOutExtension extends AbstractExtension {
8
7
  constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
9
8
  extend(): void;
10
9
  refresh(): void;
11
- drawGrayOut(r: IRect): void;
12
10
  dispose(): void;
13
11
  }
@@ -1,3 +1,4 @@
1
+ import { getDesignerCanvasNormalizedTransformedCornerDOMPoints } from '../../../helper/TransformHelper.js';
1
2
  import { AbstractExtension } from './AbstractExtension.js';
2
3
  import { OverlayLayer } from "./OverlayLayer.js";
3
4
  export class GrayOutExtension extends AbstractExtension {
@@ -12,18 +13,14 @@ export class GrayOutExtension extends AbstractExtension {
12
13
  if (!this._path) {
13
14
  this._path = document.createElementNS("http://www.w3.org/2000/svg", "path");
14
15
  this._path.setAttribute('class', 'svg-gray-out');
16
+ this._path.setAttribute('fill-rule', 'evenodd');
15
17
  this._addOverlay(this._path, OverlayLayer.Background);
16
18
  }
17
- let normalizedRect = this.designerCanvas.getNormalizedElementCoordinates(this.extendedItem.element);
18
- this.drawGrayOut(normalizedRect);
19
- }
20
- drawGrayOut(r) {
19
+ let points = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, null, this.designerCanvas);
21
20
  let outsideRect = { width: this.designerCanvas.containerBoundingRect.width / this.designerCanvas.scaleFactor, height: this.designerCanvas.containerBoundingRect.height / this.designerCanvas.scaleFactor };
22
- const pathPoints = "M0 0 L0 " + outsideRect.height + "L" + r.x + " " + outsideRect.height + "L" + r.x + " 0" + " L0 0" +
23
- "M" + r.x + " 0 L" + r.x + " " + r.y + "L" + outsideRect.width + " " + r.y + "L" + outsideRect.width + " 0" + "L" + r.x + " 0" +
24
- "M" + r.x + " " + (r.y + r.height) + "L" + r.x + " " + outsideRect.height + "L" + outsideRect.width + " " + outsideRect.height + "L" + outsideRect.width + " " + (r.y + r.height) + "L" + r.x + " " + (r.y + r.height) +
25
- "M" + (r.x + r.width) + " " + r.y + "L" + (r.x + r.width) + " " + (r.y + r.height) + "L" + outsideRect.width + " " + (r.y + r.height) + "L" + outsideRect.width + " " + (r.y) + "L" + (r.x + r.width) + " " + r.y;
26
- this._path.setAttribute("d", pathPoints);
21
+ let data = "M0 0 L" + outsideRect.width + " 0 L" + outsideRect.width + ' ' + outsideRect.height + " L0 " + outsideRect.height + " Z ";
22
+ 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";
23
+ this._path.setAttribute("d", data);
27
24
  }
28
25
  dispose() {
29
26
  this._removeAllOverlays();
@@ -4,6 +4,7 @@ import { IDesignerExtension } from './IDesignerExtension.js';
4
4
  export interface IExtensionManager {
5
5
  applyExtension(designItem: IDesignItem, extensionType: ExtensionType, event?: Event, recursive?: boolean): IDesignerExtension[];
6
6
  applyExtensions(designItems: IDesignItem[], extensionType: ExtensionType, event?: Event, recursive?: boolean): any;
7
+ applyExtensionInstance(designItem: IDesignItem, extension: IDesignerExtension): any;
7
8
  removeExtension(designItem: IDesignItem, extensionType?: ExtensionType): any;
8
9
  removeExtensions(designItems: IDesignItem[], recursive: boolean, extensionType?: ExtensionType): any;
9
10
  removeExtensionInstance(designItem: IDesignItem, extension: IDesignerExtension): any;
@@ -15,10 +15,11 @@ export declare class PointerTool implements ITool {
15
15
  private _copiedItemsInserted;
16
16
  private _previousEventName;
17
17
  private _dragOverExtensionItem;
18
- private _dragExtensionItem;
18
+ private _dragParentExtensionItem;
19
19
  private _moveItemsOffset;
20
20
  private _initialOffset;
21
21
  private _started;
22
+ private _holdTimeout;
22
23
  private _firstTimeInMove;
23
24
  private _secondTimeInMove;
24
25
  private _changeGroup;
@@ -14,11 +14,11 @@ export class PointerTool {
14
14
  _copiedItemsInserted = false;
15
15
  _previousEventName;
16
16
  _dragOverExtensionItem;
17
- _dragExtensionItem;
17
+ _dragParentExtensionItem;
18
18
  _moveItemsOffset = { x: 0, y: 0 };
19
19
  _initialOffset;
20
20
  _started = false;
21
- ;
21
+ _holdTimeout;
22
22
  _firstTimeInMove;
23
23
  _secondTimeInMove;
24
24
  _changeGroup;
@@ -154,7 +154,11 @@ export class PointerTool {
154
154
  drawSelectionTool.pointerEventHandler(designerView, event, currentElement);
155
155
  }
156
156
  }
157
- async _pointerActionTypeDragOrSelect(designerCanvas, event, currentDesignItem, currentPoint) {
157
+ async _pointerActionTypeDragOrSelect(designerCanvas, event, currentDesignItem, currentPoint, raisedFromHold = false) {
158
+ if (this._holdTimeout) {
159
+ clearTimeout(this._holdTimeout);
160
+ this._holdTimeout = null;
161
+ }
158
162
  if (event.altKey) {
159
163
  if (event.type == EventNames.PointerDown) {
160
164
  const currentSelection = designerCanvas.instanceServiceContainer.selectionService.primarySelection;
@@ -235,10 +239,10 @@ export class PointerTool {
235
239
  const currentContainerService = designerCanvas.serviceContainer.getLastServiceWhere('containerService', x => x.serviceForContainer(this._actionStartedDesignItem.parent, containerStyle));
236
240
  if (currentContainerService) {
237
241
  const dragItem = this._actionStartedDesignItem.parent;
238
- if (this._dragExtensionItem != dragItem) {
239
- designerCanvas.extensionManager.removeExtension(this._dragExtensionItem, ExtensionType.ContainerDrag);
242
+ if (this._dragParentExtensionItem != dragItem) {
243
+ designerCanvas.extensionManager.removeExtension(this._dragParentExtensionItem, ExtensionType.ContainerDrag);
240
244
  designerCanvas.extensionManager.applyExtension(dragItem, ExtensionType.ContainerDrag, event);
241
- this._dragExtensionItem = dragItem;
245
+ this._dragParentExtensionItem = dragItem;
242
246
  }
243
247
  else {
244
248
  designerCanvas.extensionManager.refreshExtension(dragItem, ExtensionType.ContainerDrag);
@@ -266,7 +270,12 @@ export class PointerTool {
266
270
  }
267
271
  }
268
272
  }
269
- if (newContainerService && event.altKey) {
273
+ if (newContainerService) {
274
+ this._holdTimeout = setTimeout(() => {
275
+ this._pointerActionTypeDragOrSelect(designerCanvas, event, currentDesignItem, currentPoint, true);
276
+ }, 1000);
277
+ }
278
+ if (newContainerService && (event.altKey || raisedFromHold)) {
270
279
  //TODO: all items, fix position
271
280
  const oldOffset = currentContainerService.getElementOffset(this._actionStartedDesignItem.parent, this._actionStartedDesignItem);
272
281
  const newOffset = newContainerService.getElementOffset(newContainerElementDesignItem, this._actionStartedDesignItem);
@@ -275,6 +284,12 @@ export class PointerTool {
275
284
  const cp = { x: currentPoint.x - this._moveItemsOffset.x, y: currentPoint.y - this._moveItemsOffset.y };
276
285
  newContainerService.enterContainer(newContainerElementDesignItem, this._actionStartedDesignItems);
277
286
  newContainerService.place(event, designerCanvas, this._actionStartedDesignItem.parent, this._initialPoint, this._initialOffset, cp, this._actionStartedDesignItems);
287
+ designerCanvas.extensionManager.removeExtension(this._dragParentExtensionItem, ExtensionType.ContainerDrag);
288
+ designerCanvas.extensionManager.applyExtension(newContainerElementDesignItem, ExtensionType.ContainerDrag, event);
289
+ this._dragParentExtensionItem = newContainerElementDesignItem;
290
+ designerCanvas.extensionManager.removeExtension(this._dragOverExtensionItem, ExtensionType.ContainerDragOverAndCanBeEntered);
291
+ this._dragOverExtensionItem = null;
292
+ designerCanvas.extensionManager.refreshAllAppliedExtentions();
278
293
  }
279
294
  else {
280
295
  const cp = { x: currentPoint.x - this._moveItemsOffset.x, y: currentPoint.y - this._moveItemsOffset.y };
@@ -334,8 +349,8 @@ export class PointerTool {
334
349
  this._changeGroup.abort();
335
350
  this._changeGroup = null;
336
351
  }
337
- designerCanvas.extensionManager.removeExtension(this._dragExtensionItem, ExtensionType.ContainerDrag);
338
- this._dragExtensionItem = null;
352
+ designerCanvas.extensionManager.removeExtension(this._dragParentExtensionItem, ExtensionType.ContainerDrag);
353
+ this._dragParentExtensionItem = null;
339
354
  designerCanvas.extensionManager.removeExtension(this._dragOverExtensionItem, ExtensionType.ContainerDragOverAndCanBeEntered);
340
355
  this._dragOverExtensionItem = null;
341
356
  this._moveItemsOffset = { x: 0, y: 0 };
@@ -373,6 +388,7 @@ export class PointerTool {
373
388
  let newContainerService = null;
374
389
  const designerCanvas = designItem.instanceServiceContainer.designerCanvas;
375
390
  const elementsFromPoint = designerCanvas.elementsFromPoint(event.x, event.y);
391
+ elementsFromPoint.push(designerCanvas.rootDesignItem.element);
376
392
  for (let e of elementsFromPoint) {
377
393
  if (e == designItem.element) {
378
394
  continue;
@@ -1,7 +1,7 @@
1
1
  import { EventNames } from '../../../../enums/EventNames.js';
2
2
  import { DesignItem } from '../../../item/DesignItem.js';
3
3
  import { InsertAction } from '../../../services/undoService/transactionItems/InsertAction.js';
4
- import { ExtensionType } from '../extensions/ExtensionType.js';
4
+ import { EditTextExtension } from '../extensions/EditText/EditTextExtension.js';
5
5
  export class TextTool {
6
6
  _textEditExtensions;
7
7
  constructor(editExistingText) {
@@ -28,10 +28,8 @@ export class TextTool {
28
28
  di.setStyle('left', currentPoint.x + 'px');
29
29
  di.setStyle('top', currentPoint.y + 'px');
30
30
  designerCanvas.instanceServiceContainer.undoService.execute(new InsertAction(designerCanvas.rootDesignItem, designerCanvas.rootDesignItem.childCount, di));
31
- //TODO: Maybe we could also remove the eatEvents property
32
- //TODO - don't apply doubleclick extension (maybe it is not the doubleclick one) - apply edit text extesion directly
33
- //should we configure the editTextExtension anywhere??
34
- this._textEditExtensions = designerCanvas.extensionManager.applyExtension(di, ExtensionType.Doubleclick, event);
31
+ designerCanvas.extensionManager.applyExtensionInstance(di, new EditTextExtension(designerCanvas.extensionManager, designerCanvas, di));
32
+ designerCanvas.serviceContainer.globalContext.finishedWithTool(this);
35
33
  setTimeout(() => { span.focus(); }, 50);
36
34
  }
37
35
  else {
@@ -1,7 +1,10 @@
1
1
  import { DesignerToolbarButton } from '../DesignerToolbarButton.js';
2
2
  import { assetsPath } from "../../../../../../Constants.js";
3
+ import { PointerToolPopup } from "../popups/PointerToolPopup.js";
3
4
  export class PointerToolButtonProvider {
4
5
  provideButton(designerCanvas) {
5
- return new DesignerToolbarButton(designerCanvas, { 'Pointer': { icon: assetsPath + 'images/tools/PointerTool.svg' } });
6
+ const button = new DesignerToolbarButton(designerCanvas, { 'Pointer': { icon: assetsPath + 'images/tools/PointerTool.svg' } });
7
+ button.popup = PointerToolPopup;
8
+ return button;
6
9
  }
7
10
  }
@@ -0,0 +1,5 @@
1
+ import { BaseCustomWebComponentConstructorAppend } from '@node-projects/base-custom-webcomponent';
2
+ export declare abstract class AbstractBaseToolPopup extends BaseCustomWebComponentConstructorAppend {
3
+ static style: CSSStyleSheet | CSSStyleSheet[];
4
+ constructor();
5
+ }
@@ -0,0 +1,37 @@
1
+ import { BaseCustomWebComponentConstructorAppend, css } from '@node-projects/base-custom-webcomponent';
2
+ export class AbstractBaseToolPopup extends BaseCustomWebComponentConstructorAppend {
3
+ static style = css `
4
+ .container {
5
+ width: 120px;
6
+ min-height: 100px;
7
+ color: white;
8
+ background-color: rgb(64, 64, 64);
9
+ border: 1px solid black;
10
+ }
11
+ header {
12
+ text-align: center;
13
+ }
14
+ .tool {
15
+ height: 32px;
16
+ width: 32px;
17
+ background-color: rgb(255, 255, 255);
18
+ background-size: 65%;
19
+ background-repeat: no-repeat;
20
+ background-position: center center;
21
+ flex-shrink: 0;
22
+ border-bottom: 1px solid black;
23
+ }
24
+ .tools {
25
+ display: flex;
26
+ flex-wrap: wrap;
27
+ margin-bottom: 5px;
28
+ gap: 3px;
29
+ }`;
30
+ constructor() {
31
+ super();
32
+ for (let e of [...this.shadowRoot.querySelectorAll("div.tool")]) {
33
+ let div = e;
34
+ div.onclick = () => this.getRootNode().host.setTool(div.dataset['commandParameter']);
35
+ }
36
+ }
37
+ }
@@ -1,6 +1,6 @@
1
- import { BaseCustomWebComponentConstructorAppend } from '@node-projects/base-custom-webcomponent';
2
- export declare class DrawToolPopup extends BaseCustomWebComponentConstructorAppend {
3
- static style: CSSStyleSheet;
1
+ import { AbstractBaseToolPopup } from './AbstractBaseToolPopup.js';
2
+ export declare class DrawToolPopup extends AbstractBaseToolPopup {
3
+ static style: CSSStyleSheet[];
4
4
  static template: HTMLTemplateElement;
5
5
  constructor();
6
6
  }
@@ -1,33 +1,8 @@
1
- import { html, BaseCustomWebComponentConstructorAppend, css } from '@node-projects/base-custom-webcomponent';
1
+ import { html, css } from '@node-projects/base-custom-webcomponent';
2
2
  import { assetsPath } from "../../../../../../Constants.js";
3
- export class DrawToolPopup extends BaseCustomWebComponentConstructorAppend {
4
- static style = css `
5
- .container {
6
- width: 220px;
7
- min-height: 200px;
8
- color: white;
9
- background-color: rgb(64, 64, 64);
10
- border: 1px solid black;
11
- }
12
- header {
13
- text-align: center;
14
- }
15
- .tool {
16
- height: 32px;
17
- width: 32px;
18
- background-color: rgb(255, 255, 255);
19
- background-size: 65%;
20
- background-repeat: no-repeat;
21
- background-position: center center;
22
- flex-shrink: 0;
23
- border-bottom: 1px solid black;
24
- }
25
- .tools {
26
- display: flex;
27
- flex-wrap: wrap;
28
- margin-bottom: 5px;
29
- gap: 3px;
30
- }
3
+ import { AbstractBaseToolPopup } from './AbstractBaseToolPopup.js';
4
+ export class DrawToolPopup extends AbstractBaseToolPopup {
5
+ static style = [super.style, css `
31
6
  .inputs{
32
7
  float: left;
33
8
  margin-top: 5px;
@@ -50,9 +25,7 @@ export class DrawToolPopup extends BaseCustomWebComponentConstructorAppend {
50
25
  }
51
26
  .strokethickness{
52
27
  float: both;
53
- }
54
-
55
- `;
28
+ }`];
56
29
  static template = html `
57
30
  <div class="container">
58
31
  <header><h2 id="title" style="margin: 0;">Draw</h2></header>
@@ -82,10 +55,6 @@ export class DrawToolPopup extends BaseCustomWebComponentConstructorAppend {
82
55
  </div>`;
83
56
  constructor() {
84
57
  super();
85
- for (let e of [...this.shadowRoot.querySelectorAll("div.tool")]) {
86
- let div = e;
87
- div.onclick = () => this.getRootNode().host.setTool(div.dataset['commandParameter']);
88
- }
89
58
  if (this.shadowRoot.querySelector("input.strokecolor")) {
90
59
  let input = this._getDomElement("strokecolor");
91
60
  input.onchange = () => this.getRootNode().host.setStrokeColor(input.value);
@@ -0,0 +1,6 @@
1
+ import { BaseCustomWebComponentConstructorAppend } from '@node-projects/base-custom-webcomponent';
2
+ export declare class PointerToolPopup extends BaseCustomWebComponentConstructorAppend {
3
+ static style: CSSStyleSheet;
4
+ static template: HTMLTemplateElement;
5
+ constructor();
6
+ }
@@ -0,0 +1,49 @@
1
+ import { html, BaseCustomWebComponentConstructorAppend, css } from '@node-projects/base-custom-webcomponent';
2
+ import { assetsPath } from "../../../../../../Constants.js";
3
+ export class PointerToolPopup extends BaseCustomWebComponentConstructorAppend {
4
+ static style = css `
5
+ .container {
6
+ width: 120px;
7
+ min-height: 100px;
8
+ color: white;
9
+ background-color: rgb(64, 64, 64);
10
+ border: 1px solid black;
11
+ }
12
+ header {
13
+ text-align: center;
14
+ }
15
+ .tool {
16
+ height: 32px;
17
+ width: 32px;
18
+ background-color: rgb(255, 255, 255);
19
+ background-size: 65%;
20
+ background-repeat: no-repeat;
21
+ background-position: center center;
22
+ flex-shrink: 0;
23
+ border-bottom: 1px solid black;
24
+ }
25
+ .tools {
26
+ display: flex;
27
+ flex-wrap: wrap;
28
+ margin-bottom: 5px;
29
+ gap: 3px;
30
+ }`;
31
+ static template = html `
32
+ <div class="container">
33
+ <header><h2 id="title" style="margin: 0;">Selection</h2></header>
34
+ <main id="content-area">
35
+ <div class="tools">
36
+ <div class="tool" data-command="setTool" data-command-parameter="RectangleSelector" title="Rectangle Selector" style="background-image: url('${assetsPath}images/tools/SelectRectTool.svg');"></div>
37
+ <div class="tool" data-command="setTool" data-command-parameter="MagicWandSelector" title="Magic Wand Selector" style="background-image: url('${assetsPath}images/tools/MagicWandTool.svg');"></div>
38
+ </div>
39
+ </main>
40
+ </div>`;
41
+ constructor() {
42
+ super();
43
+ for (let e of [...this.shadowRoot.querySelectorAll("div.tool")]) {
44
+ let div = e;
45
+ div.onclick = () => this.getRootNode().host.setTool(div.dataset['commandParameter']);
46
+ }
47
+ }
48
+ }
49
+ customElements.define('node-projects-designer-selection-tool-popup', SelectionToolPopup);
@@ -0,0 +1,4 @@
1
+ import { AbstractBaseToolPopup } from './AbstractBaseToolPopup.js';
2
+ export declare class PointerToolPopup extends AbstractBaseToolPopup {
3
+ static template: HTMLTemplateElement;
4
+ }
@@ -0,0 +1,16 @@
1
+ import { html } from '@node-projects/base-custom-webcomponent';
2
+ import { assetsPath } from "../../../../../../Constants.js";
3
+ import { AbstractBaseToolPopup } from './AbstractBaseToolPopup.js';
4
+ export class PointerToolPopup extends AbstractBaseToolPopup {
5
+ static template = html `
6
+ <div class="container">
7
+ <header><h2 id="title" style="margin: 0;">Selection</h2></header>
8
+ <main id="content-area">
9
+ <div class="tools">
10
+ <div class="tool" data-command="setTool" data-command-parameter="Pointer" title="Pointer" style="background-image: url('${assetsPath}images/tools/PointerTool.svg');"></div>
11
+ <div class="tool" data-command="setTool" data-command-parameter="Pan" title="Pan" style="background-image: url('${assetsPath}images/tools/PanTool.svg');"></div>
12
+ </div>
13
+ </main>
14
+ </div>`;
15
+ }
16
+ customElements.define('node-projects-designer-pointer-tool-popup', PointerToolPopup);
@@ -0,0 +1,6 @@
1
+ import { BaseCustomWebComponentConstructorAppend } from '@node-projects/base-custom-webcomponent';
2
+ export declare class SelectionToolPopup extends BaseCustomWebComponentConstructorAppend {
3
+ static style: CSSStyleSheet;
4
+ static template: HTMLTemplateElement;
5
+ constructor();
6
+ }
@@ -0,0 +1,49 @@
1
+ import { html, BaseCustomWebComponentConstructorAppend, css } from '@node-projects/base-custom-webcomponent';
2
+ import { assetsPath } from "../../../../../../Constants.js";
3
+ export class SelectionToolPopup extends BaseCustomWebComponentConstructorAppend {
4
+ static style = css `
5
+ .container {
6
+ width: 120px;
7
+ min-height: 100px;
8
+ color: white;
9
+ background-color: rgb(64, 64, 64);
10
+ border: 1px solid black;
11
+ }
12
+ header {
13
+ text-align: center;
14
+ }
15
+ .tool {
16
+ height: 32px;
17
+ width: 32px;
18
+ background-color: rgb(255, 255, 255);
19
+ background-size: 65%;
20
+ background-repeat: no-repeat;
21
+ background-position: center center;
22
+ flex-shrink: 0;
23
+ border-bottom: 1px solid black;
24
+ }
25
+ .tools {
26
+ display: flex;
27
+ flex-wrap: wrap;
28
+ margin-bottom: 5px;
29
+ gap: 3px;
30
+ }`;
31
+ static template = html `
32
+ <div class="container">
33
+ <header><h2 id="title" style="margin: 0;">Selection</h2></header>
34
+ <main id="content-area">
35
+ <div class="tools">
36
+ <div class="tool" data-command="setTool" data-command-parameter="RectangleSelector" title="Rectangle Selector" style="background-image: url('${assetsPath}images/tools/SelectRectTool.svg');"></div>
37
+ <div class="tool" data-command="setTool" data-command-parameter="MagicWandSelector" title="Magic Wand Selector" style="background-image: url('${assetsPath}images/tools/MagicWandTool.svg');"></div>
38
+ </div>
39
+ </main>
40
+ </div>`;
41
+ constructor() {
42
+ super();
43
+ for (let e of [...this.shadowRoot.querySelectorAll("div.tool")]) {
44
+ let div = e;
45
+ div.onclick = () => this.getRootNode().host.setTool(div.dataset['commandParameter']);
46
+ }
47
+ }
48
+ }
49
+ customElements.define('node-projects-designer-selection-tool-popup', SelectionToolPopup);
@@ -1,6 +1,4 @@
1
- import { BaseCustomWebComponentConstructorAppend } from '@node-projects/base-custom-webcomponent';
2
- export declare class SelectionToolPopup extends BaseCustomWebComponentConstructorAppend {
3
- static style: CSSStyleSheet;
1
+ import { AbstractBaseToolPopup } from './AbstractBaseToolPopup.js';
2
+ export declare class SelectionToolPopup extends AbstractBaseToolPopup {
4
3
  static template: HTMLTemplateElement;
5
- constructor();
6
4
  }
@@ -1,33 +1,7 @@
1
- import { html, BaseCustomWebComponentConstructorAppend, css } from '@node-projects/base-custom-webcomponent';
1
+ import { html } from '@node-projects/base-custom-webcomponent';
2
2
  import { assetsPath } from "../../../../../../Constants.js";
3
- export class SelectionToolPopup extends BaseCustomWebComponentConstructorAppend {
4
- static style = css `
5
- .container {
6
- width: 120px;
7
- min-height: 100px;
8
- color: white;
9
- background-color: rgb(64, 64, 64);
10
- border: 1px solid black;
11
- }
12
- header {
13
- text-align: center;
14
- }
15
- .tool {
16
- height: 32px;
17
- width: 32px;
18
- background-color: rgb(255, 255, 255);
19
- background-size: 65%;
20
- background-repeat: no-repeat;
21
- background-position: center center;
22
- flex-shrink: 0;
23
- border-bottom: 1px solid black;
24
- }
25
- .tools {
26
- display: flex;
27
- flex-wrap: wrap;
28
- margin-bottom: 5px;
29
- gap: 3px;
30
- }`;
3
+ import { AbstractBaseToolPopup } from './AbstractBaseToolPopup.js';
4
+ export class SelectionToolPopup extends AbstractBaseToolPopup {
31
5
  static template = html `
32
6
  <div class="container">
33
7
  <header><h2 id="title" style="margin: 0;">Selection</h2></header>
@@ -38,12 +12,5 @@ export class SelectionToolPopup extends BaseCustomWebComponentConstructorAppend
38
12
  </div>
39
13
  </main>
40
14
  </div>`;
41
- constructor() {
42
- super();
43
- for (let e of [...this.shadowRoot.querySelectorAll("div.tool")]) {
44
- let div = e;
45
- div.onclick = () => this.getRootNode().host.setTool(div.dataset['commandParameter']);
46
- }
47
- }
48
15
  }
49
16
  customElements.define('node-projects-designer-selection-tool-popup', SelectionToolPopup);
package/dist/index.d.ts CHANGED
@@ -166,8 +166,11 @@ export * from "./elements/widgets/designerView/tools/toolBar/buttons/SeperatorTo
166
166
  export * from "./elements/widgets/designerView/tools/toolBar/buttons/TextToolButtonProvider.js";
167
167
  export * from "./elements/widgets/designerView/tools/toolBar/buttons/ZoomToolButtonProvider.js";
168
168
  export * from "./elements/widgets/designerView/tools/toolBar/buttons/TransformToolButtonProvider.js";
169
+ export * from "./elements/widgets/designerView/tools/toolBar/popups/AbstractBaseToolPopup.js";
169
170
  export * from "./elements/widgets/designerView/tools/toolBar/popups/DrawToolPopup.js";
171
+ export * from "./elements/widgets/designerView/tools/toolBar/popups/PointerToolPopup.js";
170
172
  export * from "./elements/widgets/designerView/tools/toolBar/popups/SelectionToolPopup.js";
173
+ export * from "./elements/widgets/designerView/tools/toolBar/popups/TransformToolPopup.js";
171
174
  export * from "./elements/widgets/designerView/tools/toolBar/DesignerToolbar.js";
172
175
  export * from "./elements/widgets/designerView/tools/toolBar/DesignerToolbarButton.js";
173
176
  export type { IDesignViewToolbarButtonProvider } from "./elements/widgets/designerView/tools/toolBar/IDesignViewToolbarButtonProvider.js";
package/dist/index.js CHANGED
@@ -113,8 +113,11 @@ export * from "./elements/widgets/designerView/tools/toolBar/buttons/SeperatorTo
113
113
  export * from "./elements/widgets/designerView/tools/toolBar/buttons/TextToolButtonProvider.js";
114
114
  export * from "./elements/widgets/designerView/tools/toolBar/buttons/ZoomToolButtonProvider.js";
115
115
  export * from "./elements/widgets/designerView/tools/toolBar/buttons/TransformToolButtonProvider.js";
116
+ export * from "./elements/widgets/designerView/tools/toolBar/popups/AbstractBaseToolPopup.js";
116
117
  export * from "./elements/widgets/designerView/tools/toolBar/popups/DrawToolPopup.js";
118
+ export * from "./elements/widgets/designerView/tools/toolBar/popups/PointerToolPopup.js";
117
119
  export * from "./elements/widgets/designerView/tools/toolBar/popups/SelectionToolPopup.js";
120
+ export * from "./elements/widgets/designerView/tools/toolBar/popups/TransformToolPopup.js";
118
121
  export * from "./elements/widgets/designerView/tools/toolBar/DesignerToolbar.js";
119
122
  export * from "./elements/widgets/designerView/tools/toolBar/DesignerToolbarButton.js";
120
123
  export * from "./elements/widgets/designerView/tools/toolBar/DesignerToolbar.js";
package/package.json CHANGED
@@ -1,24 +1,24 @@
1
- {
2
- "description": "A UI designer for Polymer apps",
3
- "name": "@node-projects/web-component-designer",
4
- "version": "0.1.90",
5
- "type": "module",
6
- "main": "./dist/index.js",
7
- "author": "jochen.kuehner@gmx.de",
8
- "license": "MIT",
9
- "scripts": {
10
- "tsc": "tsc",
11
- "build": "tsc",
12
- "prepublishOnly": "npm run build"
13
- },
14
- "dependencies": {
15
- "@node-projects/base-custom-webcomponent": ">=0.21.2"
16
- },
17
- "devDependencies": {
18
- "mdn-data": "^2.3.0"
19
- },
20
- "repository": {
21
- "type": "git",
22
- "url": "git+https://github.com/node-projects/web-component-designer.git"
23
- }
24
- }
1
+ {
2
+ "description": "A UI designer for Polymer apps",
3
+ "name": "@node-projects/web-component-designer",
4
+ "version": "0.1.91",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "author": "jochen.kuehner@gmx.de",
8
+ "license": "MIT",
9
+ "scripts": {
10
+ "tsc": "tsc",
11
+ "build": "tsc",
12
+ "prepublishOnly": "npm run build"
13
+ },
14
+ "dependencies": {
15
+ "@node-projects/base-custom-webcomponent": ">=0.23.0"
16
+ },
17
+ "devDependencies": {
18
+ "mdn-data": "^2.4.2"
19
+ },
20
+ "repository": {
21
+ "type": "git",
22
+ "url": "git+https://github.com/node-projects/web-component-designer.git"
23
+ }
24
+ }