@node-projects/web-component-designer 0.1.108 → 0.1.110

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 (51) 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 +55 -8
  7. package/dist/elements/item/IDesignItem.d.ts +2 -0
  8. package/dist/elements/services/DefaultServiceBootstrap.js +2 -0
  9. package/dist/elements/services/dragDropService/DragDropService.js +3 -1
  10. package/dist/elements/services/placementService/DefaultPlacementService.d.ts +1 -1
  11. package/dist/elements/services/placementService/DefaultPlacementService.js +3 -1
  12. package/dist/elements/services/placementService/FlexBoxPlacementService.d.ts +1 -1
  13. package/dist/elements/services/placementService/FlexBoxPlacementService.js +5 -2
  14. package/dist/elements/services/placementService/GridPlacementService.d.ts +1 -1
  15. package/dist/elements/services/placementService/GridPlacementService.js +5 -2
  16. package/dist/elements/services/placementService/IPlacementService.d.ts +1 -1
  17. package/dist/elements/services/propertiesService/PropertyGroupsService.js +2 -2
  18. package/dist/elements/services/propertiesService/propertyEditors/ImageButtonListPropertyEditor.js +1 -1
  19. package/dist/elements/services/stylesheetService/AbstractStylesheetService.d.ts +3 -0
  20. package/dist/elements/services/stylesheetService/AbstractStylesheetService.js +23 -0
  21. package/dist/elements/services/stylesheetService/IStylesheetService.d.ts +4 -2
  22. package/dist/elements/widgets/designerView/designerCanvas.js +8 -2
  23. package/dist/elements/widgets/designerView/extensions/AbstractExtension.d.ts +1 -1
  24. package/dist/elements/widgets/designerView/extensions/AbstractExtension.js +23 -2
  25. package/dist/elements/widgets/designerView/extensions/BasicDisplayToolbarExtension.d.ts +20 -0
  26. package/dist/elements/widgets/designerView/extensions/BasicDisplayToolbarExtension.js +68 -0
  27. package/dist/elements/widgets/designerView/extensions/BasicStackedToolbarExtension.d.ts +21 -0
  28. package/dist/elements/widgets/designerView/extensions/BasicStackedToolbarExtension.js +81 -0
  29. package/dist/elements/widgets/designerView/extensions/BlockToolbarExtension.d.ts +12 -0
  30. package/dist/elements/widgets/designerView/extensions/BlockToolbarExtension.js +40 -0
  31. package/dist/elements/widgets/designerView/extensions/ExtensionManager.js +1 -0
  32. package/dist/elements/widgets/designerView/extensions/block/BlockToolbarExtension.d.ts +4 -7
  33. package/dist/elements/widgets/designerView/extensions/block/BlockToolbarExtension.js +7 -26
  34. package/dist/elements/widgets/designerView/extensions/block/BlockToolbarExtensionProvider.js +4 -2
  35. package/dist/elements/widgets/designerView/extensions/flex/FlexToolbarExtension.d.ts +5 -6
  36. package/dist/elements/widgets/designerView/extensions/flex/FlexToolbarExtension.js +63 -21
  37. package/dist/elements/widgets/designerView/extensions/flex/FlexToolbarExtensionProvider.js +4 -2
  38. package/dist/elements/widgets/designerView/extensions/grid/GridChildToolbarExtension.d.ts +3 -6
  39. package/dist/elements/widgets/designerView/extensions/grid/GridChildToolbarExtension.js +45 -56
  40. package/dist/elements/widgets/designerView/extensions/grid/GridChildToolbarExtensionProvider.d.ts +0 -1
  41. package/dist/elements/widgets/designerView/extensions/grid/GridChildToolbarExtensionProvider.js +5 -7
  42. package/dist/elements/widgets/designerView/extensions/grid/GridToolbarExtension.d.ts +3 -6
  43. package/dist/elements/widgets/designerView/extensions/grid/GridToolbarExtension.js +50 -29
  44. package/dist/elements/widgets/designerView/extensions/grid/GridToolbarExtensionProvider.js +4 -2
  45. package/dist/elements/widgets/designerView/overlayLayerView.js +16 -1
  46. package/dist/elements/widgets/designerView/tools/PointerTool.d.ts +1 -0
  47. package/dist/elements/widgets/designerView/tools/PointerTool.js +6 -5
  48. package/dist/elements/widgets/propertyGrid/PropertyGridWithHeader.js +1 -1
  49. package/dist/index.d.ts +1 -0
  50. package/dist/index.js +1 -0
  51. package/package.json +2 -2
@@ -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
+ }
@@ -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 { BasicStackedToolbarExtension } from "../BasicStackedToolbarExtension.js";
4
+ import { IExtensionManager } from "../IExtensionManger.js";
5
+ export declare class BlockToolbarExtension 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,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 { BasicStackedToolbarExtension } from "../BasicStackedToolbarExtension.js";
3
+ export class BlockToolbarExtension extends BasicStackedToolbarExtension {
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
+ ${BasicStackedToolbarExtension.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
  }
@@ -2,8 +2,10 @@ import { BlockToolbarExtension } from './BlockToolbarExtension.js';
2
2
  import { NodeType } from '../../../../item/NodeType.js';
3
3
  export class BlockToolbarExtensionProvider {
4
4
  shouldExtend(extensionManager, designerView, designItem) {
5
- if (designItem.nodeType === NodeType.Element && getComputedStyle(designItem.element).display === 'block')
6
- return true;
5
+ if (designItem.nodeType === NodeType.Element) {
6
+ const d = getComputedStyle(designItem.element).display;
7
+ return d === 'block' || d === 'inline';
8
+ }
7
9
  return false;
8
10
  }
9
11
  getExtension(extensionManager, designerView, designItem) {
@@ -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 { BasicStackedToolbarExtension } from "../BasicStackedToolbarExtension.js";
5
+ export declare class FlexToolbarExtension 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;
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 { BasicStackedToolbarExtension } from "../BasicStackedToolbarExtension.js";
4
+ export class FlexToolbarExtension 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 selected>flex</option>
9
- <option>grid</option>
10
- </select>
7
+ ${BasicStackedToolbarExtension.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', async () => {
61
+ await this.extendedItem.updateStyleInSheetOrLocalAsync('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 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,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 { BasicStackedToolbarExtension } from "../BasicStackedToolbarExtension.js";
5
+ export declare class GridToolbarExtension 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
  }