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

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 (36) hide show
  1. package/assets/images/display/block.svg +1 -0
  2. package/assets/images/display/inline.svg +1 -0
  3. package/dist/elements/controls/ImageButtonListSelector.d.ts +9 -6
  4. package/dist/elements/controls/ImageButtonListSelector.js +25 -6
  5. package/dist/elements/item/DesignItem.d.ts +2 -0
  6. package/dist/elements/item/DesignItem.js +52 -4
  7. package/dist/elements/item/IDesignItem.d.ts +2 -0
  8. package/dist/elements/services/dragDropService/DragDropService.js +2 -0
  9. package/dist/elements/services/propertiesService/propertyEditors/ImageButtonListPropertyEditor.js +1 -1
  10. package/dist/elements/services/stylesheetService/AbstractStylesheetService.d.ts +3 -0
  11. package/dist/elements/services/stylesheetService/AbstractStylesheetService.js +23 -0
  12. package/dist/elements/services/stylesheetService/IStylesheetService.d.ts +4 -2
  13. package/dist/elements/widgets/designerView/designerCanvas.js +2 -0
  14. package/dist/elements/widgets/designerView/extensions/AbstractExtension.d.ts +1 -1
  15. package/dist/elements/widgets/designerView/extensions/AbstractExtension.js +11 -0
  16. package/dist/elements/widgets/designerView/extensions/BasicDisplayToolbarExtension.d.ts +20 -0
  17. package/dist/elements/widgets/designerView/extensions/BasicDisplayToolbarExtension.js +68 -0
  18. package/dist/elements/widgets/designerView/extensions/BlockToolbarExtension.d.ts +12 -0
  19. package/dist/elements/widgets/designerView/extensions/BlockToolbarExtension.js +40 -0
  20. package/dist/elements/widgets/designerView/extensions/ExtensionManager.js +1 -0
  21. package/dist/elements/widgets/designerView/extensions/block/BlockToolbarExtension.d.ts +4 -7
  22. package/dist/elements/widgets/designerView/extensions/block/BlockToolbarExtension.js +7 -26
  23. package/dist/elements/widgets/designerView/extensions/block/BlockToolbarExtensionProvider.d.ts +1 -0
  24. package/dist/elements/widgets/designerView/extensions/block/BlockToolbarExtensionProvider.js +21 -2
  25. package/dist/elements/widgets/designerView/extensions/flex/FlexToolbarExtension.d.ts +5 -6
  26. package/dist/elements/widgets/designerView/extensions/flex/FlexToolbarExtension.js +63 -21
  27. package/dist/elements/widgets/designerView/extensions/flex/FlexToolbarExtensionProvider.js +4 -2
  28. package/dist/elements/widgets/designerView/extensions/grid/GridToolbarExtension.d.ts +3 -6
  29. package/dist/elements/widgets/designerView/extensions/grid/GridToolbarExtension.js +41 -24
  30. package/dist/elements/widgets/designerView/extensions/grid/GridToolbarExtensionProvider.js +4 -2
  31. package/dist/elements/widgets/designerView/tools/PointerTool.d.ts +1 -0
  32. package/dist/elements/widgets/designerView/tools/PointerTool.js +2 -1
  33. package/dist/elements/widgets/propertyGrid/PropertyGridWithHeader.js +3 -1
  34. package/dist/index.d.ts +1 -0
  35. package/dist/index.js +1 -0
  36. package/package.json +2 -2
@@ -0,0 +1 @@
1
+ <svg width="24" height="24" xmlns="http://www.w3.org/2000/svg"><rect x="5" y="5" width="14" height="14" fill="black"/></svg>
@@ -0,0 +1 @@
1
+ <svg width="24" height="24" xmlns="http://www.w3.org/2000/svg"><line x1="5" y1="12" x2="19" y2="12" stroke="black" stroke-width="2"/></svg>
@@ -1,17 +1,20 @@
1
- import { BaseCustomWebComponentConstructorAppend, TypedEvent } from '@node-projects/base-custom-webcomponent';
2
- export type ImageButtonListSelectorValueChangedEventArgs = {
3
- newValue?: string;
4
- oldValue?: string;
5
- };
1
+ import { BaseCustomWebComponentConstructorAppend } from '@node-projects/base-custom-webcomponent';
6
2
  export declare class ImageButtonListSelector extends BaseCustomWebComponentConstructorAppend {
7
3
  static readonly style: CSSStyleSheet;
8
4
  static readonly template: HTMLTemplateElement;
5
+ static properties: {
6
+ value: StringConstructor;
7
+ property: StringConstructor;
8
+ unsetValue: StringConstructor;
9
+ noValueInHeader: BooleanConstructor;
10
+ };
11
+ constructor();
9
12
  private _value;
10
13
  get value(): string;
11
14
  set value(value: string);
12
- valueChanged: TypedEvent<ImageButtonListSelectorValueChangedEventArgs>;
13
15
  property: string;
14
16
  unsetValue: string;
17
+ noValueInHeader: boolean;
15
18
  _updateValue(): void;
16
19
  ready(): void;
17
20
  }
@@ -1,4 +1,4 @@
1
- import { BaseCustomWebComponentConstructorAppend, css, html, TypedEvent } from '@node-projects/base-custom-webcomponent';
1
+ import { BaseCustomWebComponentConstructorAppend, css, html } from '@node-projects/base-custom-webcomponent';
2
2
  export class ImageButtonListSelector extends BaseCustomWebComponentConstructorAppend {
3
3
  static style = css `
4
4
  div {
@@ -29,23 +29,31 @@ export class ImageButtonListSelector extends BaseCustomWebComponentConstructorAp
29
29
  `;
30
30
  static template = html `
31
31
  <div>
32
- <div><span id="property"></span>: <span id="value"></span></div>
33
- <div class="container"><slot id="slot"></slot></div>
32
+ <div id="header" style="display: none"><span id="property"></span><span id="vhd">: <span id="value"></span></span></div>
33
+ <div part="container" class="container"><slot id="slot"></slot></div>
34
34
  </div>
35
35
  `;
36
+ static properties = {
37
+ value: String,
38
+ property: String,
39
+ unsetValue: String,
40
+ noValueInHeader: Boolean
41
+ };
42
+ constructor() {
43
+ super();
44
+ this._restoreCachedInititalValues();
45
+ }
36
46
  _value;
37
47
  get value() {
38
48
  return this._value;
39
49
  }
40
50
  set value(value) {
41
- const oldValue = this._value;
42
51
  this._value = value;
43
52
  this._updateValue();
44
- this.valueChanged.emit({ newValue: this._value, oldValue: oldValue });
45
53
  }
46
- valueChanged = new TypedEvent();
47
54
  property;
48
55
  unsetValue;
56
+ noValueInHeader;
49
57
  _updateValue() {
50
58
  if (this.value) {
51
59
  this._getDomElement('value').innerText = this.value;
@@ -64,12 +72,23 @@ export class ImageButtonListSelector extends BaseCustomWebComponentConstructorAp
64
72
  }
65
73
  ready() {
66
74
  this._parseAttributesToProperties();
75
+ if (this.property)
76
+ this._getDomElement('header').style.display = 'block';
77
+ if (this.noValueInHeader)
78
+ this._getDomElement('vhd').style.display = 'none';
67
79
  const slot = this._getDomElement('slot');
68
80
  slot.onclick = (e) => {
69
81
  const path = e.composedPath();
70
82
  for (let e of slot.assignedElements()) {
71
83
  if (path.indexOf(e) >= 0) {
84
+ const oldValue = this._value;
72
85
  this.value = e.dataset.value;
86
+ const valueChangedEvent = new CustomEvent('value-changed', {
87
+ detail: {
88
+ newValue: this._value, oldValue: oldValue
89
+ }
90
+ });
91
+ this.dispatchEvent(valueChangedEvent);
73
92
  }
74
93
  }
75
94
  };
@@ -78,8 +78,10 @@ export declare class DesignItem implements IDesignItem {
78
78
  static GetOrCreateDesignItem(node: Node, parsedNode: any, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer): IDesignItem;
79
79
  static GetDesignItem(node: Node): IDesignItem;
80
80
  setStyle(name: string, value?: string | null, important?: boolean): void;
81
+ setStyleAsync(name: string, value?: string | null, important?: boolean): Promise<void>;
81
82
  removeStyle(name: string): void;
82
83
  updateStyleInSheetOrLocal(name: string, value?: string | null, important?: boolean, forceSet?: boolean): void;
84
+ updateStyleInSheetOrLocalAsync(name: string, value?: string | null, important?: boolean, forceSet?: boolean): Promise<void>;
83
85
  getStyleFromSheetOrLocal(name: string, fallback?: string): string;
84
86
  getStyleFromSheetOrLocalOrComputed(name: string, fallback?: string): string;
85
87
  getComputedStyleProperty(name: string, fallback?: string): string;
@@ -423,10 +423,39 @@ export class DesignItem {
423
423
  let nm = name;
424
424
  if (!nm.startsWith('--'))
425
425
  nm = PropertiesHelper.camelToDashCase(name);
426
- if (this.isRootItem)
427
- throw 'not allowed to set style on root item';
428
- const action = new CssStyleChangeAction(this, nm, value, this._styles.get(nm));
429
- this.instanceServiceContainer.undoService.execute(action);
426
+ if (this.isRootItem) {
427
+ throw 'not allowed to set style on root item or use async setStyle';
428
+ }
429
+ else {
430
+ const action = new CssStyleChangeAction(this, nm, value, this._styles.get(nm));
431
+ this.instanceServiceContainer.undoService.execute(action);
432
+ }
433
+ }
434
+ async setStyleAsync(name, value, important) {
435
+ let nm = name;
436
+ if (!nm.startsWith('--'))
437
+ nm = PropertiesHelper.camelToDashCase(name);
438
+ if (this.isRootItem) {
439
+ if (!this.instanceServiceContainer.stylesheetService)
440
+ throw 'not allowed to set style on root item';
441
+ else {
442
+ let rules = this.instanceServiceContainer.stylesheetService.getRules(':host');
443
+ if (rules === null || rules.length === 0) {
444
+ const cg = this.openGroup('add rule and set style: ' + name);
445
+ const sheets = this.instanceServiceContainer.stylesheetService.getStylesheets();
446
+ const rule = await this.instanceServiceContainer.stylesheetService.addRule(sheets[0], ':host');
447
+ this.instanceServiceContainer.stylesheetService.insertDeclarationIntoRule(rule, name, value, important);
448
+ cg.commit();
449
+ }
450
+ else {
451
+ this.instanceServiceContainer.stylesheetService.insertDeclarationIntoRule(rules[0], name, value, important);
452
+ }
453
+ }
454
+ }
455
+ else {
456
+ const action = new CssStyleChangeAction(this, nm, value, this._styles.get(nm));
457
+ this.instanceServiceContainer.undoService.execute(action);
458
+ }
430
459
  }
431
460
  removeStyle(name) {
432
461
  let nm = name;
@@ -454,6 +483,25 @@ export class DesignItem {
454
483
  this.instanceServiceContainer.stylesheetService.updateDeclarationValue(declarations[0], value, false);
455
484
  }
456
485
  }
486
+ async updateStyleInSheetOrLocalAsync(name, value, important, forceSet) {
487
+ let nm = name;
488
+ if (!nm.startsWith('--'))
489
+ nm = PropertiesHelper.camelToDashCase(name);
490
+ // Pre-sorted by specificity
491
+ let declarations = this.instanceServiceContainer.stylesheetService?.getDeclarations(this, nm);
492
+ if (this.hasStyle(name) || this.instanceServiceContainer.designContext.extensionOptions[enableStylesheetService] === false || !declarations?.length) {
493
+ // Set style locally
494
+ if (this.getStyle(nm) != value || forceSet) {
495
+ await this.setStyleAsync(nm, value);
496
+ }
497
+ else if (value == null) {
498
+ this.removeStyle(nm);
499
+ }
500
+ }
501
+ else {
502
+ this.instanceServiceContainer.stylesheetService.updateDeclarationValue(declarations[0], value, false);
503
+ }
504
+ }
457
505
  getStyleFromSheetOrLocal(name, fallback = null) {
458
506
  let nm = name;
459
507
  if (!nm.startsWith('--'))
@@ -54,8 +54,10 @@ export interface IDesignItem {
54
54
  getStyle(name: string): string;
55
55
  hasStyle(name: string): boolean;
56
56
  setStyle(name: string, value?: string | null, important?: boolean): any;
57
+ setStyleAsync(name: string, value?: string | null, important?: boolean): Promise<void>;
57
58
  removeStyle(name: string): any;
58
59
  updateStyleInSheetOrLocal(name: string, value?: string | null, important?: boolean, forceSet?: boolean): any;
60
+ updateStyleInSheetOrLocalAsync(name: string, value?: string | null, important?: boolean, forceSet?: boolean): Promise<void>;
59
61
  getStyleFromSheetOrLocal(name: string, fallback?: string): any;
60
62
  getStyleFromSheetOrLocalOrComputed(name: string, fallback?: string): any;
61
63
  getAllStyles(): IStyleRule[];
@@ -15,6 +15,8 @@ export class DragDropService {
15
15
  }
16
16
  dragOver(designerCanvas, event) {
17
17
  let [newContainer] = this.getPossibleContainerForDragDrop(designerCanvas, event);
18
+ if (!newContainer)
19
+ newContainer = designerCanvas.rootDesignItem;
18
20
  if (this._dragOverExtensionItem != newContainer) {
19
21
  designerCanvas.extensionManager.removeExtension(this._dragOverExtensionItem, ExtensionType.ContainerExternalDragOverAndCanBeEntered);
20
22
  designerCanvas.extensionManager.applyExtension(newContainer, ExtensionType.ContainerExternalDragOverAndCanBeEntered, event);
@@ -31,7 +31,7 @@ export class ImageButtonListPropertyEditor extends BasePropertyEditor {
31
31
  selector.appendChild(button);
32
32
  }
33
33
  }
34
- selector.valueChanged.on((e) => this._valueChanged(e.newValue));
34
+ selector.addEventListener('value-changed', (e) => this._valueChanged(selector.value));
35
35
  this.element = selector;
36
36
  }
37
37
  refreshValue(valueType, value) {
@@ -18,12 +18,15 @@ export declare abstract class AbstractStylesheetService implements IStylesheetSe
18
18
  }>;
19
19
  protected _instanceServiceContainer: InstanceServiceContainer;
20
20
  constructor(designerCanvas: IDesignerCanvas);
21
+ abstract getRules(rule: string): IStyleRule[];
22
+ abstract addRule(stylesheet: IStylesheet, rule: string): Promise<IStyleRule>;
21
23
  setStylesheets(stylesheets: IStylesheet[]): Promise<void>;
22
24
  setDocumentStylesheets(stylesheets: IDocumentStylesheet[]): Promise<void>;
23
25
  internalSetStylesheets(stylesheets: IStylesheet[], targetMap: Map<string, {
24
26
  stylesheet: IStylesheet;
25
27
  ast: any;
26
28
  }>): Promise<void>;
29
+ protected internalReparseStylesheet(name: string): Promise<void>;
27
30
  protected abstract internalParse(style: string): Promise<any>;
28
31
  getStylesheets(): IStylesheet[];
29
32
  abstract getAppliedRules(designItem: IDesignItem): IStyleRule[];
@@ -62,6 +62,27 @@ export class AbstractStylesheetService {
62
62
  this._allStylesheets.set(s[0], s[1]);
63
63
  }
64
64
  }
65
+ async internalReparseStylesheet(name) {
66
+ let lst = this._allStylesheets;
67
+ if (this._documentStylesheets.has(name))
68
+ lst = this._documentStylesheets;
69
+ if (this._stylesheets.has(name))
70
+ lst = this._stylesheets;
71
+ const ss = lst.get(name);
72
+ let ast = null;
73
+ try {
74
+ ast = await this.internalParse(ss.stylesheet.content);
75
+ }
76
+ catch (err) {
77
+ console.warn("error parsing stylesheet", name, err);
78
+ }
79
+ const v = {
80
+ stylesheet: ss.stylesheet,
81
+ ast: ast
82
+ };
83
+ this._stylesheets.set(name, v);
84
+ this._allStylesheets.set(name, v);
85
+ }
65
86
  //TODO: rename to externalStylesheets
66
87
  getStylesheets() {
67
88
  let stylesheets = [];
@@ -80,6 +101,8 @@ export class AbstractStylesheetService {
80
101
  stylesheetChanged = new TypedEvent();
81
102
  stylesheetsChanged = new TypedEvent();
82
103
  elementMatchesASelector(designItem, selectors) {
104
+ if (designItem == null)
105
+ return true;
83
106
  for (let selector of selectors) {
84
107
  if (selector == ':host') {
85
108
  selector = DesignerCanvas.cssprefixConstant;
@@ -23,6 +23,7 @@ export interface IDocumentStylesheet extends IStylesheet {
23
23
  export interface IStylesheetService {
24
24
  setStylesheets(stylesheets: IStylesheet[]): Promise<void>;
25
25
  getStylesheets(): IStylesheet[];
26
+ getRules(selector: string): IStyleRule[];
26
27
  setDocumentStylesheets(stylesheets: IDocumentStylesheet[]): Promise<void>;
27
28
  getAppliedRules(designItem: IDesignItem): IStyleRule[];
28
29
  getDeclarations(designItem: IDesignItem, styleName: string): IStyleDeclaration[];
@@ -30,8 +31,9 @@ export interface IStylesheetService {
30
31
  updateDeclarationValueWithoutUndo(declaration: IStyleDeclaration, value: string, important: boolean): any;
31
32
  insertDeclarationIntoRule(rule: IStyleRule, property: string, value: string, important: boolean): boolean;
32
33
  removeDeclarationFromRule(rule: IStyleRule, property: string): boolean;
33
- updateCompleteStylesheet(name: string, newStyle: string): void;
34
- updateCompleteStylesheetWithoutUndo(name: string, newStyle: string): void;
34
+ updateCompleteStylesheet(name: string, newStyle: string): Promise<void>;
35
+ updateCompleteStylesheetWithoutUndo(name: string, newStyle: string): Promise<void>;
36
+ addRule(stylesheet: IStylesheet, selector: string): Promise<IStyleRule>;
35
37
  stylesheetChanged: TypedEvent<{
36
38
  name: string;
37
39
  newStyle: string;
@@ -849,6 +849,8 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
849
849
  }
850
850
  _onDblClick(event) {
851
851
  event.preventDefault();
852
+ if (event.target === this.overlayLayer)
853
+ return;
852
854
  if (this.serviceContainer.globalContext.tool == null || this.serviceContainer.globalContext.tool === this.serviceContainer.designerTools.get(NamedTools.Pointer)) {
853
855
  this.extensionManager.removeExtension(this.instanceServiceContainer.selectionService.primarySelection, ExtensionType.PrimarySelectionRefreshed);
854
856
  this.extensionManager.applyExtension(this.instanceServiceContainer.selectionService.primarySelection, ExtensionType.Doubleclick, event);
@@ -7,7 +7,7 @@ import { OverlayLayer } from './OverlayLayer.js';
7
7
  import { IPoint } from '../../../../interfaces/IPoint.js';
8
8
  export type toolbarObject = SVGForeignObjectElement & {
9
9
  updatePosition: (position: IPoint) => void;
10
- getById: <T>(id: string) => T;
10
+ getById: <T extends HTMLElement>(id: string) => T;
11
11
  };
12
12
  export declare abstract class AbstractExtension extends AbstractExtensionBase implements IDesignerExtension {
13
13
  protected extendedItem: IDesignItem;
@@ -23,6 +23,17 @@ export class AbstractExtension extends AbstractExtensionBase {
23
23
  foreignObject.style.transformBox = 'fill-box';
24
24
  this._addOverlay(foreignObject, overlayLayer);
25
25
  foreignObject.updatePosition = (position) => {
26
+ foreignObject.style.scale = '' + 1 / this.designerCanvas.zoomFactor;
27
+ const rect = this.overlayLayerView.getBoundingClientRect();
28
+ const innerRect = foreignObject.children[0].getBoundingClientRect();
29
+ const scaleFactor = this.designerCanvas.scaleFactor;
30
+ const effectiveRectWidth = (rect.width / scaleFactor) - this.designerCanvas.canvasOffset.x * scaleFactor;
31
+ if (innerRect.width + (position.x * scaleFactor) > effectiveRectWidth) {
32
+ position.x = (effectiveRectWidth - innerRect.width) / scaleFactor;
33
+ }
34
+ if (position.x < -this.designerCanvas.canvasOffset.x) {
35
+ position.x = -this.designerCanvas.canvasOffset.x;
36
+ }
26
37
  foreignObject.setAttribute('x', '' + position.x);
27
38
  foreignObject.setAttribute('y', '' + position.y);
28
39
  };
@@ -0,0 +1,20 @@
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 BasicDisplayToolbarExtension extends AbstractExtension {
6
+ protected static basicTemplate: string;
7
+ protected _toolbar: toolbarObject;
8
+ protected _size: {
9
+ width: number;
10
+ height: number;
11
+ };
12
+ protected _display: string;
13
+ protected _inline: string;
14
+ constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
15
+ extend(cache: Record<string | symbol, any>, event: MouseEvent): void;
16
+ updateDisplayValue(): Promise<void>;
17
+ refresh(cache: Record<string | symbol, any>, event?: MouseEvent): void;
18
+ protected _addStyleButton(styleAndControlName: string): void;
19
+ dispose(): void;
20
+ }
@@ -0,0 +1,68 @@
1
+ import { assetsPath } from "../../../../Constants.js";
2
+ import { AbstractExtension } from "./AbstractExtension.js";
3
+ export class BasicDisplayToolbarExtension 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
+ _toolbar;
16
+ _size = { width: 200, height: 30 };
17
+ _display;
18
+ _inline;
19
+ constructor(extensionManager, designerView, extendedItem) {
20
+ super(extensionManager, designerView, extendedItem);
21
+ }
22
+ extend(cache, event) {
23
+ const cs = getComputedStyle(this.extendedItem.element);
24
+ this._display = cs.display.replace('inline-', '').replace('inline', 'block');
25
+ this._inline = cs.display.startsWith('inline') ? 'inline' : 'block';
26
+ //@ts-ignore
27
+ this._toolbar = this.createToolbar(this.constructor.template, this._size.width, this._size.height);
28
+ const displayTypeEl = this._toolbar.getById('displayType');
29
+ displayTypeEl.value = this._display;
30
+ displayTypeEl.onchange = async () => {
31
+ this._display = displayTypeEl.value;
32
+ await this.updateDisplayValue();
33
+ this.extensionManager.reapplyAllAppliedExtentions([this.extendedItem]);
34
+ };
35
+ const inlineEl = this._toolbar.getById('inline');
36
+ inlineEl.value = this._inline;
37
+ inlineEl.addEventListener('value-changed', async () => {
38
+ this._inline = inlineEl.value;
39
+ if (this._inline && cs.position === 'absolute')
40
+ this.extendedItem.setStyle('position', 'static');
41
+ await this.updateDisplayValue();
42
+ this.extensionManager.reapplyAllAppliedExtentions([this.extendedItem]);
43
+ });
44
+ }
45
+ async updateDisplayValue() {
46
+ let v = (this._inline == 'inline' ? 'inline ' : '') + this._display;
47
+ if (v === 'inline block')
48
+ v = 'inline';
49
+ await this.extendedItem.updateStyleInSheetOrLocalAsync('display', v);
50
+ }
51
+ refresh(cache, event) {
52
+ if (event) {
53
+ const pos = this.designerCanvas.getNormalizedEventCoordinates(event);
54
+ this._toolbar.updatePosition({ x: (pos.x - (16 / this.designerCanvas.zoomFactor)), y: (pos.y - (44 / this.designerCanvas.zoomFactor)) });
55
+ }
56
+ }
57
+ _addStyleButton(styleAndControlName) {
58
+ const cs = getComputedStyle(this.extendedItem.element);
59
+ const ctl = this._toolbar.getById(styleAndControlName);
60
+ ctl.addEventListener('value-changed', () => {
61
+ this.extendedItem.updateStyleInSheetOrLocal(styleAndControlName, ctl.value);
62
+ });
63
+ ctl.value = cs[styleAndControlName];
64
+ }
65
+ dispose() {
66
+ this._removeAllOverlays();
67
+ }
68
+ }
@@ -0,0 +1,12 @@
1
+ import { IDesignItem } from '../../../../item/IDesignItem.js';
2
+ import { IDesignerCanvas } from '../../IDesignerCanvas.js';
3
+ import { AbstractExtension } from "../AbstractExtension.js";
4
+ import { IExtensionManager } from '../IExtensionManger.js';
5
+ export declare class BlockToolbarExtension extends AbstractExtension {
6
+ private static template;
7
+ private _toolbar;
8
+ constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
9
+ extend(cache: Record<string | symbol, any>, event: MouseEvent): void;
10
+ refresh(cache: Record<string | symbol, any>, event?: MouseEvent): void;
11
+ dispose(): void;
12
+ }
@@ -0,0 +1,40 @@
1
+ import { html } from "@node-projects/base-custom-webcomponent";
2
+ import { AbstractExtension } from "../AbstractExtension.js";
3
+ import { assetsPath } from "../../../../../Constants.js";
4
+ export class BlockToolbarExtension extends AbstractExtension {
5
+ static template = html `
6
+ <div style="height: 100%; width: 100%;">
7
+ <node-projects-image-button-list-selector>
8
+ <img data-value="block" title="block" src="${assetsPath}images/display/block.svg">
9
+ <img data-value="inline" title="inline" src="${assetsPath}images/display/inline.svg">
10
+ </node-projects-image-button-list-selector>
11
+ <select title="display" id="displayType" style="pointer-events: all; height: 24px; width: 70px; padding: 0; font-weight: 900; text-transform: uppercase; margin-right: 10px;">
12
+ <option selected>block</option>
13
+ <option>flex</option>
14
+ <option>grid</option>
15
+ </select>
16
+ </div>
17
+ `;
18
+ _toolbar;
19
+ constructor(extensionManager, designerView, extendedItem) {
20
+ super(extensionManager, designerView, extendedItem);
21
+ }
22
+ extend(cache, event) {
23
+ this._toolbar = this.createToolbar(BlockToolbarExtension.template, 200, 30);
24
+ const displayTypeEl = this._toolbar.getById('displayType');
25
+ displayTypeEl.onchange = () => {
26
+ this.extendedItem.updateStyleInSheetOrLocal('display', displayTypeEl.value);
27
+ this.extensionManager.reapplyAllAppliedExtentions([this.extendedItem]);
28
+ };
29
+ this.refresh(cache, event);
30
+ }
31
+ refresh(cache, event) {
32
+ if (event) {
33
+ const pos = this.designerCanvas.getNormalizedEventCoordinates(event);
34
+ this._toolbar.updatePosition({ x: (pos.x - (16 / this.designerCanvas.zoomFactor)), y: (pos.y - (44 / this.designerCanvas.zoomFactor)) });
35
+ }
36
+ }
37
+ dispose() {
38
+ this._removeAllOverlays();
39
+ }
40
+ }
@@ -24,6 +24,7 @@ export class ExtensionManager {
24
24
  designerCanvas.instanceServiceContainer.contentService.onContentChanged.on(this._contentChanged.bind(this));
25
25
  designerCanvas.serviceContainer.globalContext.onToolChanged.on(() => {
26
26
  this.removeExtension(designerCanvas.instanceServiceContainer.selectionService.primarySelection, ExtensionType.PrimarySelectionRefreshed);
27
+ this._lastPrimarySelectionRefreshItem = null;
27
28
  });
28
29
  }
29
30
  connected() {
@@ -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
- import { IExtensionManager } from '../IExtensionManger.js';
5
- export declare class BlockToolbarExtension extends AbstractExtension {
6
- private static template;
7
- private _toolbar;
3
+ import { BasicDisplayToolbarExtension } from "../BasicDisplayToolbarExtension.js";
4
+ import { IExtensionManager } from "../IExtensionManger.js";
5
+ export declare class BlockToolbarExtension extends BasicDisplayToolbarExtension {
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,35 +1,16 @@
1
1
  import { html } from "@node-projects/base-custom-webcomponent";
2
- import { AbstractExtension } from "../AbstractExtension.js";
3
- export class BlockToolbarExtension extends AbstractExtension {
2
+ import { BasicDisplayToolbarExtension } from "../BasicDisplayToolbarExtension.js";
3
+ export class BlockToolbarExtension extends BasicDisplayToolbarExtension {
4
4
  static template = html `
5
- <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 selected>block</option>
8
- <option>flex</option>
9
- <option>grid</option>
10
- </select>
11
- </div>
12
- `;
13
- _toolbar;
5
+ <div style="height: 100%; width: 100%;">
6
+ ${BasicDisplayToolbarExtension.basicTemplate}
7
+ </div>
8
+ `;
14
9
  constructor(extensionManager, designerView, extendedItem) {
15
10
  super(extensionManager, designerView, extendedItem);
16
11
  }
17
12
  extend(cache, event) {
18
- this._toolbar = this.createToolbar(BlockToolbarExtension.template, 200, 30);
19
- const displayTypeEl = this._toolbar.getById('displayType');
20
- displayTypeEl.onchange = () => {
21
- this.extendedItem.updateStyleInSheetOrLocal('display', displayTypeEl.value);
22
- this.extensionManager.reapplyAllAppliedExtentions([this.extendedItem]);
23
- };
13
+ super.extend(cache, event);
24
14
  this.refresh(cache, event);
25
15
  }
26
- refresh(cache, event) {
27
- if (event) {
28
- const pos = this.designerCanvas.getNormalizedEventCoordinates(event);
29
- this._toolbar.updatePosition({ x: (pos.x - (16 / this.designerCanvas.zoomFactor)), y: (pos.y - (44 / this.designerCanvas.zoomFactor)) });
30
- }
31
- }
32
- dispose() {
33
- this._removeAllOverlays();
34
- }
35
16
  }
@@ -6,4 +6,5 @@ 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;
9
10
  }
@@ -1,12 +1,31 @@
1
1
  import { BlockToolbarExtension } from './BlockToolbarExtension.js';
2
2
  import { NodeType } from '../../../../item/NodeType.js';
3
+ import { css } from '@node-projects/base-custom-webcomponent';
3
4
  export class BlockToolbarExtensionProvider {
4
5
  shouldExtend(extensionManager, designerView, designItem) {
5
- if (designItem.nodeType === NodeType.Element && getComputedStyle(designItem.element).display === 'block')
6
- return true;
6
+ if (designItem.nodeType === NodeType.Element) {
7
+ const d = getComputedStyle(designItem.element).display;
8
+ return d === 'block' || d === 'inline';
9
+ }
7
10
  return false;
8
11
  }
9
12
  getExtension(extensionManager, designerView, designItem) {
10
13
  return new BlockToolbarExtension(extensionManager, designerView, designItem);
11
14
  }
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
+ `;
12
31
  }
@@ -1,12 +1,11 @@
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 FlexToolbarExtension extends AbstractExtension {
6
- private static template;
7
- private _toolbar;
4
+ import { BasicDisplayToolbarExtension } from "../BasicDisplayToolbarExtension.js";
5
+ export declare class FlexToolbarExtension extends BasicDisplayToolbarExtension {
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;
9
+ protected _addFlexDirectionButton(): void;
10
+ rotateImagesAcordingFlexDirection(direction: string): void;
12
11
  }
@@ -1,35 +1,77 @@
1
1
  import { html } from "@node-projects/base-custom-webcomponent";
2
- import { AbstractExtension } from "../AbstractExtension.js";
3
- export class FlexToolbarExtension extends AbstractExtension {
2
+ import { assetsPath } from "../../../../../Constants.js";
3
+ import { BasicDisplayToolbarExtension } from "../BasicDisplayToolbarExtension.js";
4
+ export class FlexToolbarExtension extends BasicDisplayToolbarExtension {
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 selected>flex</option>
9
- <option>grid</option>
10
- </select>
7
+ ${BasicDisplayToolbarExtension.basicTemplate}
8
+ <node-projects-image-button-list-selector property="direction" no-value-in-header id="flex-direction">
9
+ <img data-value="row" src="${assetsPath}images/chromeDevtools/flex-direction-row-icon.svg">
10
+ <img data-value="column" src="${assetsPath}images/chromeDevtools/flex-direction-column-icon.svg">
11
+ <img data-value="row-reverse" style="transform: scaleX(-1);" src="${assetsPath}images/chromeDevtools/flex-direction-row-icon.svg">
12
+ <img data-value="column-reverse" style="transform: scaleY(-1);" src="${assetsPath}images/chromeDevtools/flex-direction-column-icon.svg">
13
+ </node-projects-image-button-list-selector>
14
+ <node-projects-image-button-list-selector property="wrap" no-value-in-header id="flex-wrap">
15
+ <img data-value="nowrap" src="${assetsPath}images/chromeDevtools/flex-wrap-nowrap-icon.svg">
16
+ <img data-value="wrap" src="${assetsPath}images/chromeDevtools/flex-wrap-wrap-icon.svg">
17
+ </node-projects-image-button-list-selector>
18
+ <node-projects-image-button-list-selector property="align-content" no-value-in-header id="align-content">
19
+ <img data-value="start" src="${assetsPath}images/chromeDevtools/align-content-flex-start-icon.svg">
20
+ <img data-value="center" src="${assetsPath}images/chromeDevtools/align-content-center-icon.svg">
21
+ <img data-value="end" src="${assetsPath}images/chromeDevtools/align-content-flex-end-icon.svg">
22
+ <img data-value="space-around" src="${assetsPath}images/chromeDevtools/align-content-space-around-icon.svg">
23
+ <img data-value="space-evenly" src="${assetsPath}images/chromeDevtools/align-content-space-evenly-icon.svg">
24
+ <img data-value="space-between" src="${assetsPath}images/chromeDevtools/align-content-space-between-icon.svg">
25
+ <img data-value="stretch" src="${assetsPath}images/chromeDevtools/align-content-stretch-icon.svg">
26
+ </node-projects-image-button-list-selector>
27
+ <node-projects-image-button-list-selector property="justify-content" no-value-in-header id="justify-content">
28
+ <img data-value="start" src="${assetsPath}images/chromeDevtools/justify-content-start-icon.svg">
29
+ <img data-value="center" src="${assetsPath}images/chromeDevtools/justify-content-center-icon.svg">
30
+ <img data-value="end" src="${assetsPath}images/chromeDevtools/justify-content-end-icon.svg">
31
+ <img data-value="space-around" src="${assetsPath}images/chromeDevtools/justify-content-space-around-icon.svg">
32
+ <img data-value="space-evenly" src="${assetsPath}images/chromeDevtools/justify-content-space-evenly-icon.svg">
33
+ <img data-value="space-between" src="${assetsPath}images/chromeDevtools/justify-content-space-between-icon.svg">
34
+ </node-projects-image-button-list-selector>
35
+ <node-projects-image-button-list-selector property="align-items" no-value-in-header id="align-items">
36
+ <img data-value="start" src="${assetsPath}images/chromeDevtools/align-items-start-icon.svg">
37
+ <img data-value="center" src="${assetsPath}images/chromeDevtools/align-items-center-icon.svg">
38
+ <img data-value="end" src="${assetsPath}images/chromeDevtools/align-items-end-icon.svg">
39
+ <img data-value="stretch" src="${assetsPath}images/chromeDevtools/align-items-stretch-icon.svg">
40
+ <img data-value="space-evenly" src="${assetsPath}images/chromeDevtools/align-items-baseline-icon.svg">
41
+ </node-projects-image-button-list-selector>
11
42
  </div>
12
43
  `;
13
- _toolbar;
14
44
  constructor(extensionManager, designerView, extendedItem) {
15
45
  super(extensionManager, designerView, extendedItem);
46
+ this._size.width = 515;
16
47
  }
17
48
  extend(cache, event) {
18
- this._toolbar = this.createToolbar(FlexToolbarExtension.template, 200, 30);
19
- const displayTypeEl = this._toolbar.getById('displayType');
20
- displayTypeEl.onchange = () => {
21
- this.extendedItem.updateStyleInSheetOrLocal('display', displayTypeEl.value);
22
- this.extensionManager.reapplyAllAppliedExtentions([this.extendedItem]);
23
- };
49
+ super.extend(cache, event);
50
+ this._addFlexDirectionButton();
51
+ this._addStyleButton('flex-wrap');
52
+ this._addStyleButton('align-content');
53
+ this._addStyleButton('justify-content');
54
+ this._addStyleButton('align-items');
24
55
  this.refresh(cache, event);
25
56
  }
26
- refresh(cache, event) {
27
- if (event) {
28
- const pos = this.designerCanvas.getNormalizedEventCoordinates(event);
29
- this._toolbar.updatePosition({ x: (pos.x - (16 / this.designerCanvas.zoomFactor)), y: (pos.y - (44 / this.designerCanvas.zoomFactor)) });
30
- }
57
+ _addFlexDirectionButton() {
58
+ const cs = getComputedStyle(this.extendedItem.element);
59
+ const ctl = this._toolbar.getById('flex-direction');
60
+ ctl.addEventListener('value-changed', () => {
61
+ this.extendedItem.updateStyleInSheetOrLocal('flex-direction', ctl.value);
62
+ this.rotateImagesAcordingFlexDirection(ctl.value);
63
+ });
64
+ ctl.value = cs['flex-direction'];
65
+ this.rotateImagesAcordingFlexDirection(ctl.value);
31
66
  }
32
- dispose() {
33
- this._removeAllOverlays();
67
+ rotateImagesAcordingFlexDirection(direction) {
68
+ let angle = 0;
69
+ if (direction == 'column' || direction == 'column-reverse')
70
+ angle = -90;
71
+ this._toolbar.getById('flex-wrap').querySelectorAll('img').forEach(x => x.style.rotate = angle + 'deg');
72
+ this._toolbar.getById('align-content').querySelectorAll('img').forEach(x => x.style.rotate = angle + 'deg');
73
+ this._toolbar.getById('justify-content').querySelectorAll('img').forEach(x => x.style.rotate = angle + 'deg');
74
+ //@ts-ignore
75
+ this._toolbar.getById('align-items').querySelectorAll('img:nth-child(-n+4)').forEach(x => x.style.rotate = angle + 'deg');
34
76
  }
35
77
  }
@@ -2,8 +2,10 @@ import { FlexToolbarExtension } from './FlexToolbarExtension.js';
2
2
  import { NodeType } from '../../../../item/NodeType.js';
3
3
  export class FlexToolbarExtensionProvider {
4
4
  shouldExtend(extensionManager, designerView, designItem) {
5
- if (designItem.nodeType === NodeType.Element && getComputedStyle(designItem.element).display === 'flex')
6
- return true;
5
+ if (designItem.nodeType === NodeType.Element) {
6
+ const d = getComputedStyle(designItem.element).display;
7
+ return d === 'flex' || d === 'inline-flex';
8
+ }
7
9
  return false;
8
10
  }
9
11
  getExtension(extensionManager, designerView, designItem) {
@@ -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 GridToolbarExtension extends AbstractExtension {
6
- private static template;
7
- private _toolbar;
4
+ import { BasicDisplayToolbarExtension } from "../BasicDisplayToolbarExtension.js";
5
+ export declare class GridToolbarExtension extends BasicDisplayToolbarExtension {
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,14 +1,11 @@
1
1
  import { html } from "@node-projects/base-custom-webcomponent";
2
- import { AbstractExtension } from "../AbstractExtension.js";
3
- export class GridToolbarExtension extends AbstractExtension {
2
+ import { BasicDisplayToolbarExtension } from "../BasicDisplayToolbarExtension.js";
3
+ import { assetsPath } from "../../../../../Constants.js";
4
+ export class GridToolbarExtension extends BasicDisplayToolbarExtension {
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;">
7
+ ${BasicDisplayToolbarExtension.basicTemplate}
8
+ <select title="display" id="gridType" style="pointer-events: all; height: 24px; width: 60px; padding: 0; margin-right: 10px">
12
9
  <option>1x1</option>
13
10
  <option>1x16</option>
14
11
  <option>2x8</option>
@@ -17,20 +14,45 @@ export class GridToolbarExtension extends AbstractExtension {
17
14
  <option>16x1</option>
18
15
  <option>custom</option>
19
16
  </select>
17
+ <node-projects-image-button-list-selector property="align-content" no-value-in-header id="align-content">
18
+ <img data-value="start" src="${assetsPath}images/chromeDevtools/align-content-flex-start-icon.svg">
19
+ <img data-value="center" src="${assetsPath}images/chromeDevtools/align-content-center-icon.svg">
20
+ <img data-value="end" src="${assetsPath}images/chromeDevtools/align-content-flex-end-icon.svg">
21
+ <img data-value="space-around" src="${assetsPath}images/chromeDevtools/align-content-space-around-icon.svg">
22
+ <img data-value="space-evenly" src="${assetsPath}images/chromeDevtools/align-content-space-evenly-icon.svg">
23
+ <img data-value="space-between" src="${assetsPath}images/chromeDevtools/align-content-space-between-icon.svg">
24
+ <img data-value="stretch" src="${assetsPath}images/chromeDevtools/align-content-stretch-icon.svg">
25
+ </node-projects-image-button-list-selector>
26
+ <node-projects-image-button-list-selector property="justify-content" no-value-in-header id="justify-content">
27
+ <img data-value="start" src="${assetsPath}images/chromeDevtools/justify-content-start-icon.svg">
28
+ <img data-value="center" src="${assetsPath}images/chromeDevtools/justify-content-center-icon.svg">
29
+ <img data-value="end" src="${assetsPath}images/chromeDevtools/justify-content-end-icon.svg">
30
+ <img data-value="space-around" src="${assetsPath}images/chromeDevtools/justify-content-space-around-icon.svg">
31
+ <img data-value="space-evenly" src="${assetsPath}images/chromeDevtools/justify-content-space-evenly-icon.svg">
32
+ <img data-value="space-between" src="${assetsPath}images/chromeDevtools/justify-content-space-between-icon.svg">
33
+ </node-projects-image-button-list-selector>
34
+ <node-projects-image-button-list-selector property="align-items" no-value-in-header id="align-items">
35
+ <img data-value="start" src="${assetsPath}images/chromeDevtools/align-items-start-icon.svg">
36
+ <img data-value="center" src="${assetsPath}images/chromeDevtools/align-items-center-icon.svg">
37
+ <img data-value="end" src="${assetsPath}images/chromeDevtools/align-items-end-icon.svg">
38
+ <img data-value="stretch" src="${assetsPath}images/chromeDevtools/align-items-stretch-icon.svg">
39
+ <img data-value="space-evenly" src="${assetsPath}images/chromeDevtools/align-items-baseline-icon.svg">
40
+ </node-projects-image-button-list-selector>
41
+ <node-projects-image-button-list-selector property="justify-items" no-value-in-header id="justify-items">
42
+ <img data-value="start" src="${assetsPath}images/chromeDevtools/justify-items-start-icon.svg">
43
+ <img data-value="center" src="${assetsPath}images/chromeDevtools/justify-items-center-icon.svg">
44
+ <img data-value="end" src="${assetsPath}images/chromeDevtools/justify-items-end-icon.svg">
45
+ <img data-value="stretch" src="${assetsPath}images/chromeDevtools/justify-items-stretch-icon.svg">
46
+ </node-projects-image-button-list-selector>
20
47
  </div>
21
48
  `;
22
- _toolbar;
23
49
  constructor(extensionManager, designerView, extendedItem) {
24
50
  super(extensionManager, designerView, extendedItem);
51
+ this._size.width = 560;
25
52
  }
26
53
  extend(cache, event) {
54
+ super.extend(cache, event);
27
55
  const style = getComputedStyle(this.extendedItem.element);
28
- this._toolbar = this.createToolbar(GridToolbarExtension.template, 200, 30);
29
- const displayTypeEl = this._toolbar.getById('displayType');
30
- displayTypeEl.onchange = () => {
31
- this.extendedItem.updateStyleInSheetOrLocal('display', displayTypeEl.value);
32
- this.extensionManager.reapplyAllAppliedExtentions([this.extendedItem]);
33
- };
34
56
  const gridTypeEl = this._toolbar.getById('gridType');
35
57
  let op = document.createElement('option');
36
58
  op.innerText = style.gridTemplateColumns.split(' ').length + 'x' + style.gridTemplateRows.split(' ').length;
@@ -53,15 +75,10 @@ export class GridToolbarExtension extends AbstractExtension {
53
75
  this.extendedItem.updateStyleInSheetOrLocal('grid-template-rows', '1fr '.repeat(parseInt(parts[1])).trim());
54
76
  }
55
77
  };
78
+ this._addStyleButton('align-content');
79
+ this._addStyleButton('justify-content');
80
+ this._addStyleButton('align-items');
81
+ this._addStyleButton('justify-items');
56
82
  this.refresh(cache, event);
57
83
  }
58
- refresh(cache, event) {
59
- if (event) {
60
- const pos = this.designerCanvas.getNormalizedEventCoordinates(event);
61
- this._toolbar.updatePosition({ x: (pos.x - (16 / this.designerCanvas.zoomFactor)), y: (pos.y - (44 / this.designerCanvas.zoomFactor)) });
62
- }
63
- }
64
- dispose() {
65
- this._removeAllOverlays();
66
- }
67
84
  }
@@ -2,8 +2,10 @@ import { GridToolbarExtension } from './GridToolbarExtension.js';
2
2
  import { NodeType } from '../../../../item/NodeType.js';
3
3
  export class GridToolbarExtensionProvider {
4
4
  shouldExtend(extensionManager, designerView, designItem) {
5
- if (designItem.nodeType === NodeType.Element && getComputedStyle(designItem.element).display === 'grid')
6
- return true;
5
+ if (designItem.nodeType === NodeType.Element) {
6
+ const d = getComputedStyle(designItem.element).display;
7
+ return d === 'grid' || d === 'inline-grid';
8
+ }
7
9
  return false;
8
10
  }
9
11
  getExtension(extensionManager, designerView, designItem) {
@@ -6,6 +6,7 @@ import { ITool } from './ITool.js';
6
6
  import { ServiceContainer } from "../../../services/ServiceContainer.js";
7
7
  export declare class PointerTool implements ITool {
8
8
  cursor: string;
9
+ private _minMoveOffset;
9
10
  private _movedSinceStartedAction;
10
11
  private _initialPoint;
11
12
  private _actionType?;
@@ -5,6 +5,7 @@ import { ExtensionType } from '../extensions/ExtensionType.js';
5
5
  import { NamedTools } from './NamedTools.js';
6
6
  export class PointerTool {
7
7
  cursor = 'default';
8
+ _minMoveOffset = 5;
8
9
  _movedSinceStartedAction = false;
9
10
  _initialPoint;
10
11
  _actionType;
@@ -120,7 +121,7 @@ export class PointerTool {
120
121
  }
121
122
  }
122
123
  if (event.type === EventNames.PointerMove) {
123
- this._movedSinceStartedAction = this._movedSinceStartedAction || currentPoint.x != this._initialPoint.x || currentPoint.y != this._initialPoint.y;
124
+ this._movedSinceStartedAction = this._movedSinceStartedAction || Math.abs(currentPoint.x - this._initialPoint.x) > this._minMoveOffset || Math.abs(currentPoint.y - this._initialPoint.y) > this._minMoveOffset;
124
125
  if (this._actionType == PointerActionType.DrawSelection)
125
126
  this._actionType = PointerActionType.DrawingSelection;
126
127
  }
@@ -140,7 +140,7 @@ export class PropertyGridWithHeader extends BaseCustomWebComponentLazyAppend {
140
140
  this._selectionChangedHandler = this._instanceServiceContainer.selectionService.onSelectionChanged.on(async (e) => {
141
141
  this._pg.instanceServiceContainer = value;
142
142
  await sleep(20); // delay assignment a little bit, so onblur above could still set the value.
143
- if (this._instanceServiceContainer.selectionService.primarySelection.isRootItem) {
143
+ if (this._instanceServiceContainer.selectionService?.primarySelection?.isRootItem) {
144
144
  this._configButton.style.display = 'none';
145
145
  this._id.value = '';
146
146
  this._content.value = '';
@@ -152,6 +152,8 @@ export class PropertyGridWithHeader extends BaseCustomWebComponentLazyAppend {
152
152
  this._type.value = ":host";
153
153
  }
154
154
  else {
155
+ this._id.disabled = false;
156
+ this._content.disabled = false;
155
157
  const srv = await this.serviceContainer?.getLastServiceWhereAsync('configUiService', x => x.hasConfigUi(this._instanceServiceContainer.selectionService.primarySelection));
156
158
  if (srv) {
157
159
  this._configButton.style.display = 'block';
package/dist/index.d.ts CHANGED
@@ -196,6 +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
200
  export * from "./elements/widgets/designerView/extensions/OverlayLayer.js";
200
201
  export * from "./elements/widgets/designerView/extensions/ExtensionType.js";
201
202
  export * from "./elements/widgets/designerView/extensions/AbstractExtension.js";
package/dist/index.js CHANGED
@@ -137,6 +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
141
  export * from "./elements/widgets/designerView/extensions/OverlayLayer.js";
141
142
  export * from "./elements/widgets/designerView/extensions/ExtensionType.js";
142
143
  export * from "./elements/widgets/designerView/extensions/AbstractExtension.js";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
- "description": "A UI designer for Polymer apps",
2
+ "description": "A WYSIWYG designer webcomponent for html components",
3
3
  "name": "@node-projects/web-component-designer",
4
- "version": "0.1.107",
4
+ "version": "0.1.109",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "author": "jochen.kuehner@gmx.de",