@node-projects/web-component-designer 0.1.109 → 0.1.111

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 (34) hide show
  1. package/dist/elements/item/DesignItem.js +3 -4
  2. package/dist/elements/services/DefaultServiceBootstrap.js +2 -0
  3. package/dist/elements/services/dragDropService/DragDropService.js +1 -1
  4. package/dist/elements/services/placementService/DefaultPlacementService.d.ts +1 -1
  5. package/dist/elements/services/placementService/DefaultPlacementService.js +3 -1
  6. package/dist/elements/services/placementService/FlexBoxPlacementService.d.ts +1 -1
  7. package/dist/elements/services/placementService/FlexBoxPlacementService.js +5 -2
  8. package/dist/elements/services/placementService/GridPlacementService.d.ts +1 -1
  9. package/dist/elements/services/placementService/GridPlacementService.js +5 -2
  10. package/dist/elements/services/placementService/IPlacementService.d.ts +1 -1
  11. package/dist/elements/services/propertiesService/PropertyGroupsService.js +2 -2
  12. package/dist/elements/widgets/designerView/designerCanvas.js +10 -3
  13. package/dist/elements/widgets/designerView/extensions/AbstractExtension.js +12 -2
  14. package/dist/elements/widgets/designerView/extensions/BasicDisplayToolbarExtension.d.ts +1 -1
  15. package/dist/elements/widgets/designerView/extensions/BasicDisplayToolbarExtension.js +3 -3
  16. package/dist/elements/widgets/designerView/extensions/BasicStackedToolbarExtension.d.ts +21 -0
  17. package/dist/elements/widgets/designerView/extensions/BasicStackedToolbarExtension.js +81 -0
  18. package/dist/elements/widgets/designerView/extensions/block/BlockToolbarExtension.d.ts +2 -2
  19. package/dist/elements/widgets/designerView/extensions/block/BlockToolbarExtension.js +3 -3
  20. package/dist/elements/widgets/designerView/extensions/block/BlockToolbarExtensionProvider.d.ts +0 -1
  21. package/dist/elements/widgets/designerView/extensions/block/BlockToolbarExtensionProvider.js +0 -17
  22. package/dist/elements/widgets/designerView/extensions/flex/FlexToolbarExtension.d.ts +2 -2
  23. package/dist/elements/widgets/designerView/extensions/flex/FlexToolbarExtension.js +5 -5
  24. package/dist/elements/widgets/designerView/extensions/grid/GridChildToolbarExtension.d.ts +3 -6
  25. package/dist/elements/widgets/designerView/extensions/grid/GridChildToolbarExtension.js +45 -56
  26. package/dist/elements/widgets/designerView/extensions/grid/GridChildToolbarExtensionProvider.d.ts +0 -1
  27. package/dist/elements/widgets/designerView/extensions/grid/GridChildToolbarExtensionProvider.js +5 -7
  28. package/dist/elements/widgets/designerView/extensions/grid/GridToolbarExtension.d.ts +2 -2
  29. package/dist/elements/widgets/designerView/extensions/grid/GridToolbarExtension.js +12 -8
  30. package/dist/elements/widgets/designerView/overlayLayerView.js +16 -1
  31. package/dist/elements/widgets/designerView/tools/PointerTool.js +4 -4
  32. package/dist/index.d.ts +1 -1
  33. package/dist/index.js +1 -1
  34. package/package.json +1 -1
@@ -536,10 +536,9 @@ export class DesignItem {
536
536
  return value ?? fallback;
537
537
  }
538
538
  getComputedStyle() {
539
- /*if (this.isRootItem) {
540
- return window.getComputedStyle((<ShadowRoot>this.node).host);
541
- }*/
542
- return window.getComputedStyle(this.element);
539
+ if (this.nodeType == NodeType.Element)
540
+ return window.getComputedStyle(this.element);
541
+ return null;
543
542
  }
544
543
  _stylesCache = null;
545
544
  _cacheClearTimer;
@@ -89,6 +89,7 @@ import { GridToolbarExtensionProvider } from '../widgets/designerView/extensions
89
89
  import { FlexToolbarExtensionProvider } from '../widgets/designerView/extensions/flex/FlexToolbarExtensionProvider.js';
90
90
  import { BlockToolbarExtensionProvider } from '../widgets/designerView/extensions/block/BlockToolbarExtensionProvider.js';
91
91
  import { ChildContextMenu } from '../widgets/designerView/extensions/contextMenu/ChildContextMenu.js';
92
+ import { GridChildToolbarExtensionProvider } from '../widgets/designerView/extensions/grid/GridChildToolbarExtensionProvider.js';
92
93
  export function createDefaultServiceContainer() {
93
94
  let serviceContainer = new ServiceContainer();
94
95
  let defaultPlacementService = new DefaultPlacementService();
@@ -133,6 +134,7 @@ export function createDefaultServiceContainer() {
133
134
  new ConditionExtensionProvider(new MultipleSelectionRectExtensionProvider(), item => !(item.node instanceof SVGElement) || item.node instanceof SVGSVGElement),
134
135
  ]);
135
136
  serviceContainer.designerExtensions.set(ExtensionType.PrimarySelectionRefreshed, [
137
+ new GridChildToolbarExtensionProvider(),
136
138
  new GridToolbarExtensionProvider(),
137
139
  new FlexToolbarExtensionProvider(),
138
140
  new BlockToolbarExtensionProvider(),
@@ -42,7 +42,7 @@ export class DragDropService {
42
42
  const elementDefinition = JSON.parse(transferData);
43
43
  const di = await designerCanvas.serviceContainer.forSomeServicesTillResult("instanceService", (service) => service.getElement(elementDefinition, designerCanvas.serviceContainer, designerCanvas.instanceServiceContainer));
44
44
  const grp = di.openGroup("Insert of &lt;" + di.name + "&gt;");
45
- const containerService = designerCanvas.serviceContainer.getLastServiceWhere('containerService', x => x.serviceForContainer(newContainer, newContainer.getComputedStyle()));
45
+ const containerService = designerCanvas.serviceContainer.getLastServiceWhere('containerService', x => x.serviceForContainer(newContainer, newContainer.getComputedStyle(), di));
46
46
  containerService.enterContainer(newContainer, [di], 'drop');
47
47
  const containerPos = designerCanvas.getNormalizedElementCoordinates(newContainer.element);
48
48
  const evCoord = designerCanvas.getNormalizedEventCoordinates(event);
@@ -3,7 +3,7 @@ import type { IPlacementService } from './IPlacementService.js';
3
3
  import type { IDesignItem } from '../../item/IDesignItem.js';
4
4
  import { IPlacementView } from '../../widgets/designerView/IPlacementView.js';
5
5
  export declare class DefaultPlacementService implements IPlacementService {
6
- serviceForContainer(container: IDesignItem, containerStyle: CSSStyleDeclaration): boolean;
6
+ serviceForContainer(container: IDesignItem, containerStyle: CSSStyleDeclaration, item?: IDesignItem): boolean;
7
7
  isEnterableContainer(container: IDesignItem): boolean;
8
8
  canEnter(container: IDesignItem, items: IDesignItem[]): boolean;
9
9
  canLeave(container: IDesignItem, items: IDesignItem[]): boolean;
@@ -4,7 +4,9 @@ import { filterChildPlaceItems, getDesignItemCurrentPos, placeDesignItem } from
4
4
  import { ExtensionType } from '../../widgets/designerView/extensions/ExtensionType.js';
5
5
  import { straightenLine } from '../../helper/PathDataPolyfill.js';
6
6
  export class DefaultPlacementService {
7
- serviceForContainer(container, containerStyle) {
7
+ serviceForContainer(container, containerStyle, item) {
8
+ if (item != null && item.getComputedStyle()?.position == 'absolute')
9
+ return true;
8
10
  if (containerStyle.display === 'grid' || containerStyle.display === 'inline-grid' ||
9
11
  containerStyle.display === 'flex' || containerStyle.display === 'inline-flex')
10
12
  return false;
@@ -7,7 +7,7 @@ export declare class FlexBoxPlacementService implements IPlacementService {
7
7
  constructor(basePlacementService: IPlacementService);
8
8
  enterContainer(container: IDesignItem, items: IDesignItem[], mode: 'normal' | 'drop'): void;
9
9
  leaveContainer(container: IDesignItem, items: IDesignItem[]): void;
10
- serviceForContainer(container: IDesignItem, containerStyle: CSSStyleDeclaration): boolean;
10
+ serviceForContainer(container: IDesignItem, containerStyle: CSSStyleDeclaration, item?: IDesignItem): boolean;
11
11
  isEnterableContainer(container: IDesignItem): any;
12
12
  canEnter(container: IDesignItem, items: IDesignItem[]): any;
13
13
  canLeave(container: IDesignItem, items: IDesignItem[]): boolean;
@@ -22,9 +22,12 @@ export class FlexBoxPlacementService {
22
22
  }
23
23
  }
24
24
  }
25
- serviceForContainer(container, containerStyle) {
26
- if (containerStyle.display == 'flex' || containerStyle.display == 'inline-flex')
25
+ serviceForContainer(container, containerStyle, item) {
26
+ if (containerStyle.display == 'flex' || containerStyle.display == 'inline-flex') {
27
+ if (item != null && item.getComputedStyle()?.position == 'absolute')
28
+ return false;
27
29
  return true;
30
+ }
28
31
  return false;
29
32
  }
30
33
  isEnterableContainer(container) {
@@ -7,7 +7,7 @@ export declare class GridPlacementService implements IPlacementService {
7
7
  constructor(basePlacementService: IPlacementService);
8
8
  enterContainer(container: IDesignItem, items: IDesignItem[], mode: 'normal' | 'drop'): void;
9
9
  leaveContainer(container: IDesignItem, items: IDesignItem[]): void;
10
- serviceForContainer(container: IDesignItem, containerStyle: CSSStyleDeclaration): boolean;
10
+ serviceForContainer(container: IDesignItem, containerStyle: CSSStyleDeclaration, item?: IDesignItem): boolean;
11
11
  isEnterableContainer(container: IDesignItem): any;
12
12
  canEnter(container: IDesignItem, items: IDesignItem[]): any;
13
13
  canLeave(container: IDesignItem, items: IDesignItem[]): boolean;
@@ -26,9 +26,12 @@ export class GridPlacementService {
26
26
  }
27
27
  }
28
28
  }
29
- serviceForContainer(container, containerStyle) {
30
- if (containerStyle.display == 'grid' || containerStyle.display == 'inline-grid')
29
+ serviceForContainer(container, containerStyle, item) {
30
+ if (containerStyle.display == 'grid' || containerStyle.display == 'inline-grid') {
31
+ if (item != null && item.getComputedStyle()?.position == 'absolute')
32
+ return false;
31
33
  return true;
34
+ }
32
35
  return false;
33
36
  }
34
37
  isEnterableContainer(container) {
@@ -3,7 +3,7 @@ import { IDesignItem } from '../../item/IDesignItem.js';
3
3
  import { IPlacementView } from '../../widgets/designerView/IPlacementView.js';
4
4
  import { IPoint } from '../../../interfaces/IPoint.js';
5
5
  export interface IPlacementService extends IService {
6
- serviceForContainer(container: IDesignItem, containerStyle: CSSStyleDeclaration): boolean;
6
+ serviceForContainer(container: IDesignItem, containerStyle: CSSStyleDeclaration, item?: IDesignItem): boolean;
7
7
  isEnterableContainer(container: IDesignItem): boolean;
8
8
  canEnter(container: IDesignItem, items: IDesignItem[]): boolean;
9
9
  canLeave(container: IDesignItem, items: IDesignItem[]): boolean;
@@ -53,8 +53,8 @@ export class PropertyGroupsService {
53
53
  let lst = this._pgList;
54
54
  if (designItems[0].element instanceof SVGElement)
55
55
  lst = this._svgPgList;
56
- if (designItems[0].element.parentElement) {
57
- const parentStyle = getComputedStyle(designItems[0].element.parentElement);
56
+ if (designItems[0].parent) {
57
+ const parentStyle = designItems[0].parent.getComputedStyle();
58
58
  if (parentStyle.display.includes('grid'))
59
59
  lst = [...lst, this._gridChild[0]];
60
60
  else if (parentStyle.display.includes('flex'))
@@ -626,6 +626,8 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
626
626
  this._resizeBackgroundGrid();
627
627
  });
628
628
  }
629
+ if (this.isConnected)
630
+ this.extensionManager.connected();
629
631
  }
630
632
  connectedCallback() {
631
633
  if (!this._firstConnect) {
@@ -638,8 +640,8 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
638
640
  this.clickOverlay.addEventListener(EventNames.DragLeave, event => this._onDragLeave(event));
639
641
  this.clickOverlay.addEventListener(EventNames.DragOver, event => this._onDragOver(event));
640
642
  this.clickOverlay.addEventListener(EventNames.Drop, event => this._onDrop(event));
641
- this.clickOverlay.addEventListener(EventNames.KeyDown, this.onKeyDown, true);
642
- this.clickOverlay.addEventListener(EventNames.KeyUp, this.onKeyUp, true);
643
+ this.clickOverlay.addEventListener(EventNames.KeyDown, this.onKeyDown);
644
+ this.clickOverlay.addEventListener(EventNames.KeyUp, this.onKeyUp);
643
645
  this.clickOverlay.addEventListener(EventNames.DblClick, this._onDblClick, true);
644
646
  this.clickOverlay.addEventListener('zoom', (e) => {
645
647
  this.zoomFactor = this.zoomFactor + (e.detail.diff / 10);
@@ -652,7 +654,8 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
652
654
  this.canvasOffset = newCanvasOffset;
653
655
  });
654
656
  }
655
- this.extensionManager.connected();
657
+ if (this.extensionManager)
658
+ this.extensionManager.connected();
656
659
  }
657
660
  disconnectedCallback() {
658
661
  this.extensionManager.disconnected();
@@ -882,6 +885,8 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
882
885
  }
883
886
  }
884
887
  onKeyUp(event) {
888
+ if (this._ignoreEvent === event)
889
+ return;
885
890
  if (this._moveGroup) {
886
891
  this._moveGroup.commit();
887
892
  this._moveGroup = null;
@@ -889,6 +894,8 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
889
894
  event.preventDefault();
890
895
  }
891
896
  onKeyDown(event) {
897
+ if (this._ignoreEvent === event)
898
+ return;
892
899
  if ((event.ctrlKey || event.metaKey) && event.key === 'z' && !event.shiftKey)
893
900
  this.executeCommand({ type: CommandType.undo, ctrlKey: event.ctrlKey, altKey: event.altKey, shiftKey: event.shiftKey });
894
901
  else if ((event.ctrlKey || event.metaKey) && event.key === 'z' && event.shiftKey)
@@ -11,8 +11,18 @@ export class AbstractExtension extends AbstractExtensionBase {
11
11
  }
12
12
  createToolbar(template, width, height, overlayLayer = OverlayLayer.Foreground) {
13
13
  const element = template.content.cloneNode(true);
14
- element.querySelectorAll('*').forEach(x => x.onpointerdown = (e) => {
15
- this.designerCanvas.ignoreEvent(e);
14
+ element.querySelectorAll('*').forEach(x => {
15
+ x.onpointerdown = (e) => {
16
+ this.designerCanvas.ignoreEvent(e);
17
+ };
18
+ if (x instanceof HTMLInputElement) {
19
+ x.addEventListener('keydown', (e) => {
20
+ this.designerCanvas.ignoreEvent(e);
21
+ }, { capture: true });
22
+ x.addEventListener('keyup', (e) => {
23
+ this.designerCanvas.ignoreEvent(e);
24
+ }, { capture: true });
25
+ }
16
26
  });
17
27
  const foreignObject = document.createElementNS('http://www.w3.org/2000/svg', 'foreignObject');
18
28
  foreignObject.classList.add('svg-toolbar-container');
@@ -2,7 +2,7 @@ import { AbstractExtension, toolbarObject } from "./AbstractExtension.js";
2
2
  import { IExtensionManager } from "./IExtensionManger.js";
3
3
  import { IDesignerCanvas } from "../IDesignerCanvas.js";
4
4
  import { IDesignItem } from "../../../item/IDesignItem.js";
5
- export declare class BasicDisplayToolbarExtension extends AbstractExtension {
5
+ export declare class BasicStackedToolbarExtension extends AbstractExtension {
6
6
  protected static basicTemplate: string;
7
7
  protected _toolbar: toolbarObject;
8
8
  protected _size: {
@@ -1,6 +1,6 @@
1
1
  import { assetsPath } from "../../../../Constants.js";
2
2
  import { AbstractExtension } from "./AbstractExtension.js";
3
- export class BasicDisplayToolbarExtension extends AbstractExtension {
3
+ export class BasicStackedToolbarExtension extends AbstractExtension {
4
4
  static basicTemplate = `
5
5
  <node-projects-image-button-list-selector id="inline" no-value-in-header property="inline">
6
6
  <img data-value="block" title="block" src="${assetsPath}images/display/block.svg">
@@ -57,8 +57,8 @@ export class BasicDisplayToolbarExtension extends AbstractExtension {
57
57
  _addStyleButton(styleAndControlName) {
58
58
  const cs = getComputedStyle(this.extendedItem.element);
59
59
  const ctl = this._toolbar.getById(styleAndControlName);
60
- ctl.addEventListener('value-changed', () => {
61
- this.extendedItem.updateStyleInSheetOrLocal(styleAndControlName, ctl.value);
60
+ ctl.addEventListener('value-changed', async () => {
61
+ await this.extendedItem.updateStyleInSheetOrLocalAsync(styleAndControlName, ctl.value);
62
62
  });
63
63
  ctl.value = cs[styleAndControlName];
64
64
  }
@@ -0,0 +1,21 @@
1
+ import { AbstractExtension, toolbarObject } from "./AbstractExtension.js";
2
+ import { IExtensionManager } from "./IExtensionManger.js";
3
+ import { IDesignerCanvas } from "../IDesignerCanvas.js";
4
+ import { IDesignItem } from "../../../item/IDesignItem.js";
5
+ export declare class BasicStackedToolbarExtension extends AbstractExtension {
6
+ protected static basicTemplate: string;
7
+ protected static toolBars: toolbarObject[];
8
+ protected _toolbar: toolbarObject;
9
+ protected _size: {
10
+ width: number;
11
+ height: number;
12
+ };
13
+ protected _display: string;
14
+ protected _inline: string;
15
+ constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
16
+ extend(cache: Record<string | symbol, any>, event: MouseEvent): void;
17
+ updateDisplayValue(): Promise<void>;
18
+ refresh(cache: Record<string | symbol, any>, event?: MouseEvent): void;
19
+ protected _addStyleButton(styleAndControlName: string): void;
20
+ dispose(): void;
21
+ }
@@ -0,0 +1,81 @@
1
+ import { assetsPath } from "../../../../Constants.js";
2
+ import { AbstractExtension } from "./AbstractExtension.js";
3
+ export class BasicStackedToolbarExtension extends AbstractExtension {
4
+ static basicTemplate = `
5
+ <node-projects-image-button-list-selector id="inline" no-value-in-header property="inline">
6
+ <img data-value="block" title="block" src="${assetsPath}images/display/block.svg">
7
+ <img data-value="inline" title="inline" src="${assetsPath}images/display/inline.svg">
8
+ </node-projects-image-button-list-selector>
9
+ <select title="display" id="displayType" style="pointer-events: all; height: 24px; width: 70px; padding: 0; font-weight: 900; text-transform: uppercase; margin-left: 5px; margin-right: 10px;">
10
+ <option>block</option>
11
+ <option>flex</option>
12
+ <option>grid</option>
13
+ </select>
14
+ `;
15
+ static toolBars = [];
16
+ _toolbar;
17
+ _size = { width: 200, height: 30 };
18
+ _display;
19
+ _inline;
20
+ constructor(extensionManager, designerView, extendedItem) {
21
+ super(extensionManager, designerView, extendedItem);
22
+ }
23
+ extend(cache, event) {
24
+ const cs = getComputedStyle(this.extendedItem.element);
25
+ this._display = cs.display.replace('inline-', '').replace('inline', 'block');
26
+ this._inline = cs.display.startsWith('inline') ? 'inline' : 'block';
27
+ //@ts-ignore
28
+ this._toolbar = this.createToolbar(this.constructor.template, this._size.width, this._size.height);
29
+ BasicStackedToolbarExtension.toolBars.push(this._toolbar);
30
+ const displayTypeEl = this._toolbar.getById('displayType');
31
+ if (displayTypeEl) {
32
+ displayTypeEl.value = this._display;
33
+ displayTypeEl.onchange = async () => {
34
+ this._display = displayTypeEl.value;
35
+ await this.updateDisplayValue();
36
+ this.extensionManager.reapplyAllAppliedExtentions([this.extendedItem]);
37
+ };
38
+ }
39
+ const inlineEl = this._toolbar.getById('inline');
40
+ if (inlineEl) {
41
+ inlineEl.value = this._inline;
42
+ inlineEl.addEventListener('value-changed', async () => {
43
+ this._inline = inlineEl.value;
44
+ if (this._inline && cs.position === 'absolute')
45
+ this.extendedItem.setStyle('position', 'static');
46
+ await this.updateDisplayValue();
47
+ this.extensionManager.reapplyAllAppliedExtentions([this.extendedItem]);
48
+ });
49
+ }
50
+ }
51
+ async updateDisplayValue() {
52
+ let v = (this._inline == 'inline' ? 'inline ' : '') + this._display;
53
+ if (v === 'inline block')
54
+ v = 'inline';
55
+ await this.extendedItem.updateStyleInSheetOrLocalAsync('display', v);
56
+ }
57
+ refresh(cache, event) {
58
+ if (event) {
59
+ const pos = this.designerCanvas.getNormalizedEventCoordinates(event);
60
+ let tbOffset = 0;
61
+ for (let i = 0; i < BasicStackedToolbarExtension.toolBars.length - 1; i++) {
62
+ if (BasicStackedToolbarExtension.toolBars[i] === this._toolbar)
63
+ break;
64
+ tbOffset += this._toolbar.children[0].getBoundingClientRect().height + 4;
65
+ }
66
+ this._toolbar.updatePosition({ x: (pos.x - (16 / this.designerCanvas.zoomFactor)), y: (pos.y - tbOffset - ((this._size.height + 14) / this.designerCanvas.zoomFactor)) });
67
+ }
68
+ }
69
+ _addStyleButton(styleAndControlName) {
70
+ const cs = getComputedStyle(this.extendedItem.element);
71
+ const ctl = this._toolbar.getById(styleAndControlName);
72
+ ctl.addEventListener('value-changed', async () => {
73
+ await this.extendedItem.updateStyleInSheetOrLocalAsync(styleAndControlName, ctl.value);
74
+ });
75
+ ctl.value = cs[styleAndControlName];
76
+ }
77
+ dispose() {
78
+ BasicStackedToolbarExtension.toolBars.splice(BasicStackedToolbarExtension.toolBars.indexOf(this._toolbar), 1);
79
+ this._removeAllOverlays();
80
+ }
81
+ }
@@ -1,8 +1,8 @@
1
1
  import { IDesignItem } from '../../../../item/IDesignItem.js';
2
2
  import { IDesignerCanvas } from '../../IDesignerCanvas.js';
3
- import { BasicDisplayToolbarExtension } from "../BasicDisplayToolbarExtension.js";
3
+ import { BasicStackedToolbarExtension } from "../BasicStackedToolbarExtension.js";
4
4
  import { IExtensionManager } from "../IExtensionManger.js";
5
- export declare class BlockToolbarExtension extends BasicDisplayToolbarExtension {
5
+ export declare class BlockToolbarExtension extends BasicStackedToolbarExtension {
6
6
  protected static template: HTMLTemplateElement;
7
7
  constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
8
8
  extend(cache: Record<string | symbol, any>, event: MouseEvent): void;
@@ -1,9 +1,9 @@
1
1
  import { html } from "@node-projects/base-custom-webcomponent";
2
- import { BasicDisplayToolbarExtension } from "../BasicDisplayToolbarExtension.js";
3
- export class BlockToolbarExtension extends BasicDisplayToolbarExtension {
2
+ import { BasicStackedToolbarExtension } from "../BasicStackedToolbarExtension.js";
3
+ export class BlockToolbarExtension extends BasicStackedToolbarExtension {
4
4
  static template = html `
5
5
  <div style="height: 100%; width: 100%;">
6
- ${BasicDisplayToolbarExtension.basicTemplate}
6
+ ${BasicStackedToolbarExtension.basicTemplate}
7
7
  </div>
8
8
  `;
9
9
  constructor(extensionManager, designerView, extendedItem) {
@@ -6,5 +6,4 @@ import { IExtensionManager } from '../IExtensionManger.js';
6
6
  export declare class BlockToolbarExtensionProvider 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;
10
9
  }
@@ -1,6 +1,5 @@
1
1
  import { BlockToolbarExtension } from './BlockToolbarExtension.js';
2
2
  import { NodeType } from '../../../../item/NodeType.js';
3
- import { css } from '@node-projects/base-custom-webcomponent';
4
3
  export class BlockToolbarExtensionProvider {
5
4
  shouldExtend(extensionManager, designerView, designItem) {
6
5
  if (designItem.nodeType === NodeType.Element) {
@@ -12,20 +11,4 @@ export class BlockToolbarExtensionProvider {
12
11
  getExtension(extensionManager, designerView, designItem) {
13
12
  return new BlockToolbarExtension(extensionManager, designerView, designItem);
14
13
  }
15
- style = css `
16
- node-projects-image-button-list-selector img {
17
- height: 16px;
18
- border: 1px solid black;
19
- border-radius: 4px;
20
- box-sizing: border-box;
21
- pointer-events: auto;
22
- cursor: pointer;
23
- }
24
- node-projects-image-button-list-selector img:hover {
25
- background: lightgray;
26
- }
27
- node-projects-image-button-list-selector img:active {
28
- translate: 1px 1px
29
- }
30
- `;
31
14
  }
@@ -1,8 +1,8 @@
1
1
  import { IDesignItem } from '../../../../item/IDesignItem.js';
2
2
  import { IDesignerCanvas } from '../../IDesignerCanvas.js';
3
3
  import { IExtensionManager } from '../IExtensionManger.js';
4
- import { BasicDisplayToolbarExtension } from "../BasicDisplayToolbarExtension.js";
5
- export declare class FlexToolbarExtension extends BasicDisplayToolbarExtension {
4
+ import { BasicStackedToolbarExtension } from "../BasicStackedToolbarExtension.js";
5
+ export declare class FlexToolbarExtension extends BasicStackedToolbarExtension {
6
6
  protected static template: HTMLTemplateElement;
7
7
  constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
8
8
  extend(cache: Record<string | symbol, any>, event: MouseEvent): void;
@@ -1,10 +1,10 @@
1
1
  import { html } from "@node-projects/base-custom-webcomponent";
2
2
  import { assetsPath } from "../../../../../Constants.js";
3
- import { BasicDisplayToolbarExtension } from "../BasicDisplayToolbarExtension.js";
4
- export class FlexToolbarExtension extends BasicDisplayToolbarExtension {
3
+ import { BasicStackedToolbarExtension } from "../BasicStackedToolbarExtension.js";
4
+ export class FlexToolbarExtension extends BasicStackedToolbarExtension {
5
5
  static template = html `
6
6
  <div style="height: 100%; width: 100%;">
7
- ${BasicDisplayToolbarExtension.basicTemplate}
7
+ ${BasicStackedToolbarExtension.basicTemplate}
8
8
  <node-projects-image-button-list-selector property="direction" no-value-in-header id="flex-direction">
9
9
  <img data-value="row" src="${assetsPath}images/chromeDevtools/flex-direction-row-icon.svg">
10
10
  <img data-value="column" src="${assetsPath}images/chromeDevtools/flex-direction-column-icon.svg">
@@ -57,8 +57,8 @@ export class FlexToolbarExtension extends BasicDisplayToolbarExtension {
57
57
  _addFlexDirectionButton() {
58
58
  const cs = getComputedStyle(this.extendedItem.element);
59
59
  const ctl = this._toolbar.getById('flex-direction');
60
- ctl.addEventListener('value-changed', () => {
61
- this.extendedItem.updateStyleInSheetOrLocal('flex-direction', ctl.value);
60
+ ctl.addEventListener('value-changed', async () => {
61
+ await this.extendedItem.updateStyleInSheetOrLocalAsync('flex-direction', ctl.value);
62
62
  this.rotateImagesAcordingFlexDirection(ctl.value);
63
63
  });
64
64
  ctl.value = cs['flex-direction'];
@@ -1,12 +1,9 @@
1
1
  import { IDesignItem } from '../../../../item/IDesignItem.js';
2
2
  import { IDesignerCanvas } from '../../IDesignerCanvas.js';
3
- import { AbstractExtension } from "../AbstractExtension.js";
4
3
  import { IExtensionManager } from '../IExtensionManger.js';
5
- export declare class GridChildToolbarExtension extends AbstractExtension {
6
- private static template;
7
- private _toolbar;
4
+ import { BasicStackedToolbarExtension } from "../BasicStackedToolbarExtension.js";
5
+ export declare class GridChildToolbarExtension extends BasicStackedToolbarExtension {
6
+ protected static template: HTMLTemplateElement;
8
7
  constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
9
8
  extend(cache: Record<string | symbol, any>, event: MouseEvent): void;
10
- refresh(cache: Record<string | symbol, any>, event?: MouseEvent): void;
11
- dispose(): void;
12
9
  }
@@ -1,66 +1,55 @@
1
1
  import { html } from "@node-projects/base-custom-webcomponent";
2
- import { AbstractExtension } from "../AbstractExtension.js";
3
- export class GridChildToolbarExtension extends AbstractExtension {
2
+ import { assetsPath } from "../../../../../Constants.js";
3
+ import { BasicStackedToolbarExtension } from "../BasicStackedToolbarExtension.js";
4
+ export class GridChildToolbarExtension extends BasicStackedToolbarExtension {
4
5
  static template = html `
5
6
  <div style="height: 100%; width: 100%;">
6
- <select id="displayType" style="pointer-events: all; height: 24px; width: 70px; padding: 0; font-weight: 900; text-transform: uppercase; margin-right: 10px;">
7
- <option>block</option>
8
- <option>flex</option>
9
- <option selected>grid</option>
10
- </select>
11
- <select id="gridType" style="pointer-events: all; height: 24px; width: 60px; padding: 0;">
12
- <option>1x1</option>
13
- <option>1x16</option>
14
- <option>2x8</option>
15
- <option>4x4</option>
16
- <option>8x2</option>
17
- <option>16x1</option>
18
- <option>custom</option>
19
- </select>
20
- </div>
21
- `;
22
- _toolbar;
7
+ <div style="display: flex; flex-direction: column;">
8
+ <span style="font-size: 10px; color: #00aff0;">column:</span>
9
+ <input type="text" title="column" id="gridColumn" style="pointer-events: all; height: 12px; width: 45px; padding: 0; margin-right: 5px">
10
+ </div>
11
+ <div style="display: flex; flex-direction: column;">
12
+ <span style="font-size: 10px; color: #00aff0;">row:</span>
13
+ <input type="text" title="column" id="gridRow" style="pointer-events: all; height: 12px; width: 45px; padding: 0; margin-right: 10px">
14
+ </div>
15
+ <node-projects-image-button-list-selector property="align-self" no-value-in-header id="align-self">
16
+ <img data-value="start" src="${assetsPath}images/chromeDevtools/align-items-start-icon.svg">
17
+ <img data-value="center" src="${assetsPath}images/chromeDevtools/align-items-center-icon.svg">
18
+ <img data-value="end" src="${assetsPath}images/chromeDevtools/align-items-end-icon.svg">
19
+ <img data-value="stretch" src="${assetsPath}images/chromeDevtools/align-items-stretch-icon.svg">
20
+ </node-projects-image-button-list-selector>
21
+ <node-projects-image-button-list-selector property="justify-self" no-value-in-header id="justify-self">
22
+ <img data-value="start" src="${assetsPath}images/chromeDevtools/justify-items-start-icon.svg">
23
+ <img data-value="center" src="${assetsPath}images/chromeDevtools/justify-items-center-icon.svg">
24
+ <img data-value="end" src="${assetsPath}images/chromeDevtools/justify-items-end-icon.svg">
25
+ <img data-value="stretch" src="${assetsPath}images/chromeDevtools/justify-items-stretch-icon.svg">
26
+ </node-projects-image-button-list-selector>
27
+ </div>`;
23
28
  constructor(extensionManager, designerView, extendedItem) {
24
29
  super(extensionManager, designerView, extendedItem);
30
+ this._size.width = 250;
25
31
  }
26
32
  extend(cache, event) {
27
- const style = getComputedStyle(this.extendedItem.element);
28
- this._toolbar = this.createToolbar(GridChildToolbarExtension.template, 200, 30);
29
- const displayTypeEl = this._toolbar.getById('displayType');
30
- displayTypeEl.onchange = () => {
31
- this.extendedItem.updateStyleInSheetOrLocal('display', displayTypeEl.value);
32
- };
33
- const gridTypeEl = this._toolbar.getById('gridType');
34
- let op = document.createElement('option');
35
- op.innerText = style.gridTemplateColumns.split(' ').length + 'x' + style.gridTemplateRows.split(' ').length;
36
- gridTypeEl.insertAdjacentElement('afterbegin', op);
37
- gridTypeEl.selectedIndex = 0;
38
- gridTypeEl.onchange = () => {
39
- if (gridTypeEl.value == 'custom') {
40
- const columns = prompt("Number of columns?", '4');
41
- if (!columns)
42
- return;
43
- const rows = prompt("Number of rows?", '4');
44
- if (!rows)
45
- return;
46
- this.extendedItem.updateStyleInSheetOrLocal('grid-template-columns', '1fr '.repeat(parseInt(columns)).trim());
47
- this.extendedItem.updateStyleInSheetOrLocal('grid-template-rows', '1fr '.repeat(parseInt(rows)).trim());
48
- }
49
- else {
50
- const parts = gridTypeEl.value.split('x');
51
- this.extendedItem.updateStyleInSheetOrLocal('grid-template-columns', '1fr '.repeat(parseInt(parts[0])).trim());
52
- this.extendedItem.updateStyleInSheetOrLocal('grid-template-rows', '1fr '.repeat(parseInt(parts[1])).trim());
53
- }
54
- };
55
- this.refresh(cache, event);
56
- }
57
- refresh(cache, event) {
58
- if (event) {
59
- const pos = this.designerCanvas.getNormalizedEventCoordinates(event);
60
- this._toolbar.updatePosition({ x: (pos.x - 16), y: (pos.y - 44) });
33
+ super.extend(cache, event);
34
+ const cs = getComputedStyle(this.extendedItem.element);
35
+ const gridColumnEl = this._toolbar.getById('gridColumn');
36
+ if (gridColumnEl) {
37
+ gridColumnEl.value = cs.gridColumn;
38
+ gridColumnEl.onkeyup = async (e) => {
39
+ if (e.key === 'Enter')
40
+ await this.extendedItem.updateStyleInSheetOrLocalAsync('gridColumn', gridColumnEl.value);
41
+ };
61
42
  }
62
- }
63
- dispose() {
64
- this._removeAllOverlays();
43
+ const gridRowEl = this._toolbar.getById('gridRow');
44
+ if (gridRowEl) {
45
+ gridRowEl.value = cs.gridColumn;
46
+ gridRowEl.onkeyup = async (e) => {
47
+ if (e.key === 'Enter')
48
+ await this.extendedItem.updateStyleInSheetOrLocalAsync('gridRow', gridRowEl.value);
49
+ };
50
+ }
51
+ this._addStyleButton('align-self');
52
+ this._addStyleButton('justify-self');
53
+ this.refresh(cache, event);
65
54
  }
66
55
  }
@@ -6,5 +6,4 @@ import { IExtensionManager } from '../IExtensionManger.js';
6
6
  export declare class GridChildToolbarExtensionProvider 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;
10
9
  }
@@ -1,17 +1,15 @@
1
- import { css } from '@node-projects/base-custom-webcomponent';
2
1
  import { NodeType } from '../../../../item/NodeType.js';
3
2
  import { GridChildToolbarExtension } from './GridChildToolbarExtension.js';
4
3
  export class GridChildToolbarExtensionProvider {
5
4
  shouldExtend(extensionManager, designerView, designItem) {
6
- if (designItem.nodeType === NodeType.Element && getComputedStyle(designItem.parent.element).display === 'grid')
7
- return true;
5
+ if (designItem.nodeType === NodeType.Element && designItem.parent) {
6
+ const cs = designItem.parent?.getComputedStyle();
7
+ if (cs != null && (cs.display === 'grid' || cs.display === 'inline-grid'))
8
+ return true;
9
+ }
8
10
  return false;
9
11
  }
10
12
  getExtension(extensionManager, designerView, designItem) {
11
13
  return new GridChildToolbarExtension(extensionManager, designerView, designItem);
12
14
  }
13
- style = css `
14
- .svg-toolbar-container { overflow: visible }
15
- .svg-toolbar-container div { padding: 5px; display: flex; gap: 2px; background: white; border-radius: 4px; box-shadow: 0 2px 10px 0 rgba(19,23,32,.2); align-items: center; }
16
- `;
17
15
  }
@@ -1,8 +1,8 @@
1
1
  import { IDesignItem } from '../../../../item/IDesignItem.js';
2
2
  import { IDesignerCanvas } from '../../IDesignerCanvas.js';
3
3
  import { IExtensionManager } from '../IExtensionManger.js';
4
- import { BasicDisplayToolbarExtension } from "../BasicDisplayToolbarExtension.js";
5
- export declare class GridToolbarExtension extends BasicDisplayToolbarExtension {
4
+ import { BasicStackedToolbarExtension } from "../BasicStackedToolbarExtension.js";
5
+ export declare class GridToolbarExtension extends BasicStackedToolbarExtension {
6
6
  protected static template: HTMLTemplateElement;
7
7
  constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
8
8
  extend(cache: Record<string | symbol, any>, event: MouseEvent): void;
@@ -1,10 +1,10 @@
1
1
  import { html } from "@node-projects/base-custom-webcomponent";
2
- import { BasicDisplayToolbarExtension } from "../BasicDisplayToolbarExtension.js";
2
+ import { BasicStackedToolbarExtension } from "../BasicStackedToolbarExtension.js";
3
3
  import { assetsPath } from "../../../../../Constants.js";
4
- export class GridToolbarExtension extends BasicDisplayToolbarExtension {
4
+ export class GridToolbarExtension extends BasicStackedToolbarExtension {
5
5
  static template = html `
6
6
  <div style="height: 100%; width: 100%;">
7
- ${BasicDisplayToolbarExtension.basicTemplate}
7
+ ${BasicStackedToolbarExtension.basicTemplate}
8
8
  <select title="display" id="gridType" style="pointer-events: all; height: 24px; width: 60px; padding: 0; margin-right: 10px">
9
9
  <option>1x1</option>
10
10
  <option>1x16</option>
@@ -58,7 +58,7 @@ export class GridToolbarExtension extends BasicDisplayToolbarExtension {
58
58
  op.innerText = style.gridTemplateColumns.split(' ').length + 'x' + style.gridTemplateRows.split(' ').length;
59
59
  gridTypeEl.insertAdjacentElement('afterbegin', op);
60
60
  gridTypeEl.selectedIndex = 0;
61
- gridTypeEl.onchange = () => {
61
+ gridTypeEl.onchange = async () => {
62
62
  if (gridTypeEl.value == 'custom') {
63
63
  const columns = prompt("Number of columns?", '4');
64
64
  if (!columns)
@@ -66,13 +66,17 @@ export class GridToolbarExtension extends BasicDisplayToolbarExtension {
66
66
  const rows = prompt("Number of rows?", '4');
67
67
  if (!rows)
68
68
  return;
69
- this.extendedItem.updateStyleInSheetOrLocal('grid-template-columns', '1fr '.repeat(parseInt(columns)).trim());
70
- this.extendedItem.updateStyleInSheetOrLocal('grid-template-rows', '1fr '.repeat(parseInt(rows)).trim());
69
+ const cg = this.extendedItem.openGroup('change grid type');
70
+ await this.extendedItem.updateStyleInSheetOrLocalAsync('grid-template-columns', '1fr '.repeat(parseInt(columns)).trim());
71
+ await this.extendedItem.updateStyleInSheetOrLocalAsync('grid-template-rows', '1fr '.repeat(parseInt(rows)).trim());
72
+ cg.commit();
71
73
  }
72
74
  else {
73
75
  const parts = gridTypeEl.value.split('x');
74
- this.extendedItem.updateStyleInSheetOrLocal('grid-template-columns', '1fr '.repeat(parseInt(parts[0])).trim());
75
- this.extendedItem.updateStyleInSheetOrLocal('grid-template-rows', '1fr '.repeat(parseInt(parts[1])).trim());
76
+ const cg = this.extendedItem.openGroup('change grid type');
77
+ await this.extendedItem.updateStyleInSheetOrLocalAsync('grid-template-columns', '1fr '.repeat(parseInt(parts[0])).trim());
78
+ await this.extendedItem.updateStyleInSheetOrLocalAsync('grid-template-rows', '1fr '.repeat(parseInt(parts[1])).trim());
79
+ cg.commit();
76
80
  }
77
81
  };
78
82
  this._addStyleButton('align-content');
@@ -23,7 +23,22 @@ export class OverlayLayerView extends BaseCustomWebComponentConstructorAppend {
23
23
  .svg-path-line { stroke: #3899ec; stroke-dasharray: 2; }
24
24
  .svg-draw-new-element { stroke: black; fill: transparent; stroke-width: 1; }
25
25
  .svg-toolbar-container { overflow: visible }
26
- .svg-toolbar-container div { padding: 5px; display: flex; gap: 2px; background: white; border-radius: 4px; box-shadow: 0 2px 10px 0 rgba(19,23,32,.2); align-items: center; }
26
+ .svg-toolbar-container > div { padding: 5px; display: flex; gap: 2px; background: white; border-radius: 4px; box-shadow: 0 2px 10px 0 rgba(19,23,32,.2); align-items: center; }
27
+
28
+ node-projects-image-button-list-selector img {
29
+ height: 16px;
30
+ border: 1px solid black;
31
+ border-radius: 4px;
32
+ box-sizing: border-box;
33
+ pointer-events: auto;
34
+ cursor: pointer;
35
+ }
36
+ node-projects-image-button-list-selector img:hover {
37
+ background: lightgray;
38
+ }
39
+ node-projects-image-button-list-selector img:active {
40
+ translate: 1px 1px
41
+ }
27
42
  `;
28
43
  static is = 'node-projects-overlay-layer-view';
29
44
  _serviceContainer;
@@ -237,7 +237,7 @@ export class PointerTool {
237
237
  }
238
238
  if (this._movedSinceStartedAction) {
239
239
  const containerStyle = getComputedStyle(this._actionStartedDesignItem.parent.element);
240
- const currentContainerService = designerCanvas.serviceContainer.getLastServiceWhere('containerService', x => x.serviceForContainer(this._actionStartedDesignItem.parent, containerStyle));
240
+ const currentContainerService = designerCanvas.serviceContainer.getLastServiceWhere('containerService', x => x.serviceForContainer(this._actionStartedDesignItem.parent, containerStyle, this._actionStartedDesignItem));
241
241
  if (currentContainerService) {
242
242
  const dragItem = this._actionStartedDesignItem.parent;
243
243
  if (this._dragParentExtensionItem != dragItem) {
@@ -324,7 +324,7 @@ export class PointerTool {
324
324
  }
325
325
  if (this._movedSinceStartedAction) {
326
326
  const containerStyle = getComputedStyle(this._actionStartedDesignItem.parent.element);
327
- let containerService = designerCanvas.serviceContainer.getLastServiceWhere('containerService', x => x.serviceForContainer(this._actionStartedDesignItem.parent, containerStyle));
327
+ let containerService = designerCanvas.serviceContainer.getLastServiceWhere('containerService', x => x.serviceForContainer(this._actionStartedDesignItem.parent, containerStyle, this._actionStartedDesignItem));
328
328
  const cp = { x: currentPoint.x - this._moveItemsOffset.x, y: currentPoint.y - this._moveItemsOffset.y };
329
329
  if (containerService) {
330
330
  if (!this._changeGroup)
@@ -400,7 +400,7 @@ export class PointerTool {
400
400
  else if (e == designerCanvas.rootDesignItem.element) {
401
401
  newContainerElementDesignItem = designerCanvas.rootDesignItem;
402
402
  const containerStyle = getComputedStyle(newContainerElementDesignItem.element);
403
- newContainerService = designerCanvas.serviceContainer.getLastServiceWhere('containerService', x => x.serviceForContainer(newContainerElementDesignItem, containerStyle));
403
+ newContainerService = designerCanvas.serviceContainer.getLastServiceWhere('containerService', x => x.serviceForContainer(newContainerElementDesignItem, containerStyle, designItem));
404
404
  break;
405
405
  }
406
406
  else if (false) {
@@ -409,7 +409,7 @@ export class PointerTool {
409
409
  else {
410
410
  newContainerElementDesignItem = DesignItem.GetOrCreateDesignItem(e, e, designerCanvas.serviceContainer, designerCanvas.instanceServiceContainer);
411
411
  const containerStyle = getComputedStyle(newContainerElementDesignItem.element);
412
- newContainerService = designerCanvas.serviceContainer.getLastServiceWhere('containerService', x => x.serviceForContainer(newContainerElementDesignItem, containerStyle));
412
+ newContainerService = designerCanvas.serviceContainer.getLastServiceWhere('containerService', x => x.serviceForContainer(newContainerElementDesignItem, containerStyle, designItem));
413
413
  if (newContainerService) {
414
414
  if (newContainerService.canEnter(newContainerElementDesignItem, designItems)) {
415
415
  break;
package/dist/index.d.ts CHANGED
@@ -196,7 +196,7 @@ export * from "./elements/widgets/designerView/tools/ZoomTool.js";
196
196
  export type { IDesignerExtension } from "./elements/widgets/designerView/extensions/IDesignerExtension.js";
197
197
  export type { IDesignerExtensionProvider } from "./elements/widgets/designerView/extensions/IDesignerExtensionProvider.js";
198
198
  export type { IExtensionManager } from "./elements/widgets/designerView/extensions/IExtensionManger.js";
199
- export * from "./elements/widgets/designerView/extensions/BasicDisplayToolbarExtension.js";
199
+ export * from "./elements/widgets/designerView/extensions/BasicStackedToolbarExtension.js";
200
200
  export * from "./elements/widgets/designerView/extensions/OverlayLayer.js";
201
201
  export * from "./elements/widgets/designerView/extensions/ExtensionType.js";
202
202
  export * from "./elements/widgets/designerView/extensions/AbstractExtension.js";
package/dist/index.js CHANGED
@@ -137,7 +137,7 @@ export * from "./elements/widgets/designerView/tools/PointerTool.js";
137
137
  export * from "./elements/widgets/designerView/tools/RectangleSelectorTool.js";
138
138
  export * from "./elements/widgets/designerView/tools/TextTool.js";
139
139
  export * from "./elements/widgets/designerView/tools/ZoomTool.js";
140
- export * from "./elements/widgets/designerView/extensions/BasicDisplayToolbarExtension.js";
140
+ export * from "./elements/widgets/designerView/extensions/BasicStackedToolbarExtension.js";
141
141
  export * from "./elements/widgets/designerView/extensions/OverlayLayer.js";
142
142
  export * from "./elements/widgets/designerView/extensions/ExtensionType.js";
143
143
  export * from "./elements/widgets/designerView/extensions/AbstractExtension.js";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "description": "A WYSIWYG designer webcomponent for html components",
3
3
  "name": "@node-projects/web-component-designer",
4
- "version": "0.1.109",
4
+ "version": "0.1.111",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "author": "jochen.kuehner@gmx.de",