@node-projects/web-component-designer 0.0.164 → 0.0.166

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 (39) hide show
  1. package/dist/elements/helper/contextMenu/ContextMenu.js +1 -0
  2. package/dist/elements/item/DesignItem.d.ts +2 -0
  3. package/dist/elements/item/DesignItem.js +1 -0
  4. package/dist/elements/item/IDesignItem.d.ts +2 -0
  5. package/dist/elements/services/DefaultServiceBootstrap.js +6 -6
  6. package/dist/elements/services/propertiesService/services/AbstractPropertiesService.js +16 -4
  7. package/dist/elements/services/propertiesService/services/CssPropertiesService.js +1 -1
  8. package/dist/elements/widgets/designerView/designerCanvas.js +1 -0
  9. package/dist/elements/widgets/designerView/extensions/ExtensionManager.d.ts +2 -0
  10. package/dist/elements/widgets/designerView/extensions/ExtensionManager.js +34 -0
  11. package/dist/elements/widgets/designerView/extensions/FlexboxExtensionDesignViewConfigButtons.js +1 -0
  12. package/dist/elements/widgets/designerView/extensions/FlexboxExtensionProvider.d.ts +2 -2
  13. package/dist/elements/widgets/designerView/extensions/FlexboxExtensionProvider.js +4 -4
  14. package/dist/elements/widgets/designerView/extensions/GridExtension.d.ts +3 -11
  15. package/dist/elements/widgets/designerView/extensions/GridExtension.js +50 -124
  16. package/dist/elements/widgets/designerView/extensions/GridExtensionDesignViewConfigButtons copy.d.ts +1 -1
  17. package/dist/elements/widgets/designerView/extensions/GridExtensionDesignViewConfigButtons.js +1 -0
  18. package/dist/elements/widgets/designerView/extensions/GridExtensionProvider.d.ts +2 -2
  19. package/dist/elements/widgets/designerView/extensions/GridExtensionProvider.js +5 -5
  20. package/dist/elements/widgets/designerView/extensions/HighlightElementExtension.d.ts +11 -0
  21. package/dist/elements/widgets/designerView/extensions/HighlightElementExtension.js +20 -0
  22. package/dist/elements/widgets/designerView/extensions/HighlightElementExtensionProvider.d.ts +10 -0
  23. package/dist/elements/widgets/designerView/extensions/HighlightElementExtensionProvider.js +13 -0
  24. package/dist/elements/widgets/designerView/extensions/IExtensionManger.d.ts +1 -0
  25. package/dist/elements/widgets/designerView/extensions/InvisibleDivExtensionDesignViewConfigButtons.d.ts +6 -0
  26. package/dist/elements/widgets/designerView/extensions/InvisibleDivExtensionDesignViewConfigButtons.js +22 -0
  27. package/dist/elements/widgets/designerView/extensions/InvisibleDivExtensionProvider.d.ts +1 -0
  28. package/dist/elements/widgets/designerView/extensions/InvisibleDivExtensionProvider.js +6 -3
  29. package/dist/elements/widgets/designerView/extensions/InvisibleElementExtension.d.ts +11 -0
  30. package/dist/elements/widgets/designerView/extensions/InvisibleElementExtension.js +19 -0
  31. package/dist/elements/widgets/designerView/extensions/InvisibleElementExtensionDesignViewConfigButtons.d.ts +6 -0
  32. package/dist/elements/widgets/designerView/extensions/InvisibleElementExtensionDesignViewConfigButtons.js +22 -0
  33. package/dist/elements/widgets/designerView/extensions/InvisibleElementExtensionProvider.d.ts +13 -0
  34. package/dist/elements/widgets/designerView/extensions/InvisibleElementExtensionProvider.js +24 -0
  35. package/dist/elements/widgets/designerView/extensions/TransformOriginExtensionProvider.d.ts +2 -0
  36. package/dist/elements/widgets/designerView/extensions/TransformOriginExtensionProvider.js +13 -2
  37. package/dist/index.d.ts +5 -4
  38. package/dist/index.js +5 -4
  39. package/package.json +1 -1
@@ -10,6 +10,7 @@ export class ContextMenu {
10
10
  transform-origin: top left;
11
11
  padding: 0;
12
12
  z-index: 2147483647;
13
+ color: black;
13
14
  }
14
15
 
15
16
  .context_menu.display {
@@ -6,6 +6,7 @@ import { NodeType } from './NodeType.js';
6
6
  import { ExtensionType } from '../widgets/designerView/extensions/ExtensionType.js';
7
7
  import { IDesignerExtension } from '../widgets/designerView/extensions/IDesignerExtension.js';
8
8
  import { ISize } from '../../interfaces/ISize.js';
9
+ import { IDesignerExtensionProvider } from '../widgets/designerView/extensions/IDesignerExtensionProvider.js';
9
10
  export declare class DesignItem implements IDesignItem {
10
11
  lastContainerSize: ISize;
11
12
  parsedNode: any;
@@ -13,6 +14,7 @@ export declare class DesignItem implements IDesignItem {
13
14
  serviceContainer: ServiceContainer;
14
15
  instanceServiceContainer: InstanceServiceContainer;
15
16
  appliedDesignerExtensions: Map<ExtensionType, IDesignerExtension[]>;
17
+ shouldAppliedDesignerExtensions: Map<ExtensionType, IDesignerExtensionProvider[]>;
16
18
  clone(): Promise<IDesignItem>;
17
19
  replaceNode(newNode: Node): void;
18
20
  get nodeType(): NodeType;
@@ -17,6 +17,7 @@ export class DesignItem {
17
17
  serviceContainer;
18
18
  instanceServiceContainer;
19
19
  appliedDesignerExtensions = new Map();
20
+ shouldAppliedDesignerExtensions = new Map();
20
21
  async clone() {
21
22
  const html = DomConverter.ConvertToString([this], null, false);
22
23
  const parsed = await this.serviceContainer.htmlParserService.parse(html, this.serviceContainer, this.instanceServiceContainer);
@@ -5,6 +5,7 @@ import { NodeType } from './NodeType.js';
5
5
  import { ExtensionType } from '../widgets/designerView/extensions/ExtensionType.js';
6
6
  import { IDesignerExtension } from '../widgets/designerView/extensions/IDesignerExtension.js';
7
7
  import { ISize } from "../../interfaces/ISize.js";
8
+ import { IDesignerExtensionProvider } from '../widgets/designerView/extensions/IDesignerExtensionProvider.js';
8
9
  export interface IDesignItem {
9
10
  lastContainerSize: ISize;
10
11
  replaceNode(newNode: Node): any;
@@ -44,6 +45,7 @@ export interface IDesignItem {
44
45
  serviceContainer: ServiceContainer;
45
46
  instanceServiceContainer: InstanceServiceContainer;
46
47
  appliedDesignerExtensions: Map<ExtensionType, IDesignerExtension[]>;
48
+ shouldAppliedDesignerExtensions: Map<ExtensionType, IDesignerExtensionProvider[]>;
47
49
  getOrCreateDesignItem(node: Node): any;
48
50
  openGroup(title: string): ChangeGroup;
49
51
  styles(): Iterable<[name: string, value: string]>;
@@ -16,7 +16,7 @@ import { TransformOriginExtensionProvider } from '../widgets/designerView/extens
16
16
  import { CanvasExtensionProvider } from '../widgets/designerView/extensions/CanvasExtensionProvider.js';
17
17
  import { PositionExtensionProvider } from '../widgets/designerView/extensions/PositionExtensionProvider.js';
18
18
  import { PathExtensionProvider } from '../widgets/designerView/extensions/svg/PathExtensionProvider.js';
19
- import { MouseOverExtensionProvider } from '../widgets/designerView/extensions/MouseOverExtensionProvider.js';
19
+ import { HighlightElementExtensionProvider } from '../widgets/designerView/extensions/HighlightElementExtensionProvider.js';
20
20
  import { NamedTools } from '../widgets/designerView/tools/NamedTools.js';
21
21
  import { PointerTool } from '../widgets/designerView/tools/PointerTool.js';
22
22
  import { DrawPathTool } from '../widgets/designerView/tools/DrawPathTool.js';
@@ -34,7 +34,7 @@ import { PickColorTool } from '../widgets/designerView/tools/PickColorTool.js';
34
34
  import { TextTool } from '../widgets/designerView/tools/TextTool.js';
35
35
  import { GrayOutExtensionProvider } from '../widgets/designerView/extensions/GrayOutExtensionProvider.js';
36
36
  import { AltToEnterContainerExtensionProvider } from '../widgets/designerView/extensions/AltToEnterContainerExtensionProvider.js';
37
- import { InvisibleDivExtensionProvider } from '../widgets/designerView/extensions/InvisibleDivExtensionProvider.js';
37
+ import { InvisibleElementExtensionProvider } from '../widgets/designerView/extensions/InvisibleElementExtensionProvider.js';
38
38
  import { ItemsBelowContextMenu } from '../widgets/designerView/extensions/contextMenu/ItemsBelowContextMenu.js';
39
39
  import { GridPlacementService } from './placementService/GridPlacementService.js';
40
40
  import { ElementAtPointService } from './elementAtPointService/ElementAtPointService.js';
@@ -47,7 +47,6 @@ import { DefaultModelCommandService } from './modelCommandService/DefaultModelCo
47
47
  import { ButtonSeperatorProvider } from '../widgets/designerView/ButtonSeperatorProvider.js';
48
48
  import { GridExtensionDesignViewConfigButtons } from '../widgets/designerView/extensions/GridExtensionDesignViewConfigButtons.js';
49
49
  import { DemoProviderService } from './demoProviderService/DemoProviderService.js';
50
- //import { CursorLinePointerExtensionProvider } from '../widgets/designerView/extensions/pointerExtensions/CursorLinePointerExtensionProvider.js';
51
50
  import { DrawRectTool } from '../widgets/designerView/tools/DrawRectTool.js';
52
51
  import { DrawEllipsisTool } from '../widgets/designerView/tools/DrawEllipsisTool.js';
53
52
  import { DrawLineTool } from '../widgets/designerView/tools/DrawLineTool.js';
@@ -72,6 +71,7 @@ import { PropertyGroupsService } from './propertiesService/PropertyGroupsService
72
71
  import { PlacementExtensionProvider } from '../widgets/designerView/extensions/PlacementExtensionProvider.js';
73
72
  import { FlexboxExtensionProvider } from '../widgets/designerView/extensions/FlexboxExtensionProvider.js';
74
73
  import { FlexboxExtensionDesignViewConfigButtons } from '../widgets/designerView/extensions/FlexboxExtensionDesignViewConfigButtons.js';
74
+ import { InvisibleElementExtensionDesignViewConfigButtons } from '../widgets/designerView/extensions/InvisibleElementExtensionDesignViewConfigButtons.js';
75
75
  export function createDefaultServiceContainer() {
76
76
  let serviceContainer = new ServiceContainer();
77
77
  serviceContainer.register("propertyService", new PolymerPropertiesService());
@@ -96,7 +96,7 @@ export function createDefaultServiceContainer() {
96
96
  serviceContainer.register("demoProviderService", new DemoProviderService());
97
97
  serviceContainer.designerExtensions.set(ExtensionType.Permanent, [
98
98
  // new ResizeExtensionProvider(false),
99
- new InvisibleDivExtensionProvider(),
99
+ new InvisibleElementExtensionProvider(),
100
100
  // new ElementDragTitleExtensionProvider(),
101
101
  ]);
102
102
  serviceContainer.designerExtensions.set(ExtensionType.PrimarySelection, [
@@ -121,7 +121,7 @@ export function createDefaultServiceContainer() {
121
121
  new FlexboxExtensionProvider()
122
122
  ]);
123
123
  serviceContainer.designerExtensions.set(ExtensionType.MouseOver, [
124
- new MouseOverExtensionProvider()
124
+ new HighlightElementExtensionProvider()
125
125
  ]);
126
126
  serviceContainer.designerExtensions.set(ExtensionType.Placement, [
127
127
  new PlacementExtensionProvider()
@@ -154,7 +154,7 @@ export function createDefaultServiceContainer() {
154
154
  serviceContainer.designerPointerExtensions.push(
155
155
  //new CursorLinePointerExtensionProvider()
156
156
  );
157
- serviceContainer.designViewConfigButtons.push(new ButtonSeperatorProvider(20), new GridExtensionDesignViewConfigButtons(), new FlexboxExtensionDesignViewConfigButtons());
157
+ serviceContainer.designViewConfigButtons.push(new ButtonSeperatorProvider(20), new GridExtensionDesignViewConfigButtons(), new FlexboxExtensionDesignViewConfigButtons(), new ButtonSeperatorProvider(10), new InvisibleElementExtensionDesignViewConfigButtons());
158
158
  serviceContainer.designViewToolbarButtons.push(new PointerToolButtonProvider(), new SeperatorToolProvider(22), new SelectorToolButtonProvider(), new SeperatorToolProvider(22), new ZoomToolButtonProvider(), new SeperatorToolProvider(22), new DrawToolButtonProvider(), new SeperatorToolProvider(5), new TextToolButtonProvider());
159
159
  serviceContainer.designerContextMenuExtensions = [
160
160
  new CopyPasteContextMenu(),
@@ -29,16 +29,28 @@ export class AbstractPropertiesService {
29
29
  attributeName = PropertiesHelper.camelToDashCase(property.name);
30
30
  if (property.type === 'object') {
31
31
  const json = JSON.stringify(value);
32
- d.setAttribute(attributeName, json);
32
+ if (property.propertyType == PropertyType.attribute || property.propertyType == PropertyType.propertyAndAttribute)
33
+ d.setAttribute(attributeName, json);
34
+ if (property.propertyType == PropertyType.property || property.propertyType == PropertyType.propertyAndAttribute)
35
+ d.element[property.name] = value;
33
36
  }
34
37
  else if (property.type == 'boolean' && !value) {
35
- d.removeAttribute(attributeName);
38
+ if (property.propertyType == PropertyType.attribute || property.propertyType == PropertyType.propertyAndAttribute)
39
+ d.removeAttribute(attributeName);
40
+ if (property.propertyType == PropertyType.property || property.propertyType == PropertyType.propertyAndAttribute)
41
+ d.element[property.name] = false;
36
42
  }
37
43
  else if (property.type == 'boolean' && value) {
38
- d.setAttribute(attributeName, "");
44
+ if (property.propertyType == PropertyType.attribute || property.propertyType == PropertyType.propertyAndAttribute)
45
+ d.setAttribute(attributeName, "");
46
+ if (property.propertyType == PropertyType.property || property.propertyType == PropertyType.propertyAndAttribute)
47
+ d.element[property.name] = true;
39
48
  }
40
49
  else {
41
- d.setAttribute(attributeName, value);
50
+ if (property.propertyType == PropertyType.attribute || property.propertyType == PropertyType.propertyAndAttribute)
51
+ d.setAttribute(attributeName, value);
52
+ if (property.propertyType == PropertyType.property || property.propertyType == PropertyType.propertyAndAttribute)
53
+ d.element[property.name] = value;
42
54
  }
43
55
  }
44
56
  this._notifyChangedProperty(d, property, value);
@@ -10,7 +10,7 @@ export class CssPropertiesService extends CommonPropertiesService {
10
10
  {
11
11
  name: "display",
12
12
  type: "list",
13
- values: ["block", "inline-block", "flex", "contents", "grid", "inherit", "initial", "none"],
13
+ values: ["block", "inline", "inline-block", "flex", "inline-flex", "contents", "grid", "inline-grid", "inherit", "initial", "none"],
14
14
  service: this,
15
15
  propertyType: PropertyType.cssValue
16
16
  },
@@ -520,6 +520,7 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
520
520
  this.addDesignItems(designItems);
521
521
  this.instanceServiceContainer.contentService.onContentChanged.emit({ changeType: 'parsed' });
522
522
  this.instanceServiceContainer.selectionService._withoutUndoSetSelectedElements(null);
523
+ setTimeout(() => this.extensionManager.refreshAllAppliedExtentions(), 50);
523
524
  }
524
525
  addDesignItems(designItems) {
525
526
  if (designItems) {
@@ -17,4 +17,6 @@ export declare class ExtensionManager implements IExtensionManager {
17
17
  refreshExtensions(designItems: IDesignItem[], extensionType?: ExtensionType, ignoredExtension?: any): void;
18
18
  refreshAllExtensions(designItems: IDesignItem[], ignoredExtension?: any): void;
19
19
  refreshAllAppliedExtentions(): void;
20
+ reapplyAllAppliedExtentions(): void;
21
+ private static getAllChildElements;
20
22
  }
@@ -50,6 +50,11 @@ export class ExtensionManager {
50
50
  let extensions = [];
51
51
  if (extProv) {
52
52
  for (let e of extProv) {
53
+ let shouldAppE = designItem.shouldAppliedDesignerExtensions.get(extensionType);
54
+ if (!shouldAppE)
55
+ shouldAppE = [];
56
+ shouldAppE.push(e);
57
+ designItem.shouldAppliedDesignerExtensions.set(extensionType, shouldAppE);
53
58
  if (e.shouldExtend(this, this.designerCanvas, designItem)) {
54
59
  let appE = designItem.appliedDesignerExtensions.get(extensionType);
55
60
  if (!appE)
@@ -83,6 +88,11 @@ export class ExtensionManager {
83
88
  if (extProv) {
84
89
  for (let e of extProv) {
85
90
  for (let i of designItems) {
91
+ let shouldAppE = i.shouldAppliedDesignerExtensions.get(extensionType);
92
+ if (!shouldAppE)
93
+ shouldAppE = [];
94
+ shouldAppE.push(e);
95
+ i.shouldAppliedDesignerExtensions.set(extensionType, shouldAppE);
86
96
  if (i.nodeType == NodeType.Element && e.shouldExtend(this, this.designerCanvas, i)) {
87
97
  let appE = i.appliedDesignerExtensions.get(extensionType);
88
98
  if (!appE)
@@ -111,6 +121,7 @@ export class ExtensionManager {
111
121
  removeExtension(designItem, extensionType) {
112
122
  if (designItem) {
113
123
  if (extensionType) {
124
+ designItem.shouldAppliedDesignerExtensions.delete(extensionType);
114
125
  let exts = designItem.appliedDesignerExtensions.get(extensionType);
115
126
  if (exts) {
116
127
  for (let e of exts) {
@@ -127,6 +138,7 @@ export class ExtensionManager {
127
138
  }
128
139
  }
129
140
  else {
141
+ designItem.shouldAppliedDesignerExtensions.clear();
130
142
  for (let appE of designItem.appliedDesignerExtensions) {
131
143
  for (let e of appE[1]) {
132
144
  try {
@@ -146,6 +158,7 @@ export class ExtensionManager {
146
158
  if (designItems) {
147
159
  if (extensionType) {
148
160
  for (let i of designItems) {
161
+ i.shouldAppliedDesignerExtensions.delete(extensionType);
149
162
  let exts = i.appliedDesignerExtensions.get(extensionType);
150
163
  if (exts) {
151
164
  for (let e of exts) {
@@ -164,6 +177,7 @@ export class ExtensionManager {
164
177
  }
165
178
  else {
166
179
  for (let i of designItems) {
180
+ i.shouldAppliedDesignerExtensions.clear();
167
181
  for (let appE of i.appliedDesignerExtensions) {
168
182
  for (let e of appE[1]) {
169
183
  try {
@@ -262,4 +276,24 @@ export class ExtensionManager {
262
276
  refreshAllAppliedExtentions() {
263
277
  this.refreshAllExtensions([...this.designItemsWithExtentions]);
264
278
  }
279
+ //todo does not work with permanant, when not applied... maybe we need to do in another way
280
+ //maybe store the "shouldAppliedExtensions??"
281
+ reapplyAllAppliedExtentions() {
282
+ for (let d of ExtensionManager.getAllChildElements(this.designerCanvas.rootDesignItem)) {
283
+ const keys = [...d.shouldAppliedDesignerExtensions.keys()];
284
+ for (let e of keys) {
285
+ this.removeExtension(d, e);
286
+ this.applyExtension(d, e);
287
+ }
288
+ }
289
+ }
290
+ static *getAllChildElements(designItem) {
291
+ if (designItem.nodeType == NodeType.Element)
292
+ yield designItem;
293
+ if (designItem.hasChildren) {
294
+ for (let c of designItem.children())
295
+ for (let di of ExtensionManager.getAllChildElements(c))
296
+ yield di;
297
+ }
298
+ }
265
299
  }
@@ -15,6 +15,7 @@ export class FlexboxExtensionDesignViewConfigButtons {
15
15
  btn.classList.add('selected');
16
16
  else
17
17
  btn.classList.remove('selected');
18
+ designerCanvas.extensionManager.reapplyAllAppliedExtentions();
18
19
  };
19
20
  return [btn];
20
21
  }
@@ -5,7 +5,7 @@ import { IDesignerExtension } from './IDesignerExtension.js';
5
5
  import { IExtensionManager } from './IExtensionManger.js';
6
6
  export declare const flexboxExtensionShowOverlayOptionName = "flexboxExtensionShowOverlay";
7
7
  export declare class FlexboxExtensionProvider implements IDesignerExtensionProvider {
8
- shouldExtend(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): boolean;
9
- getExtension(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
8
+ shouldExtend(extensionManager: IExtensionManager, designerCanvas: IDesignerCanvas, designItem: IDesignItem): boolean;
9
+ getExtension(extensionManager: IExtensionManager, designerCanvas: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
10
10
  readonly style: CSSStyleSheet;
11
11
  }
@@ -2,14 +2,14 @@ import { css } from "@node-projects/base-custom-webcomponent";
2
2
  import { FlexboxExtension } from './FlexboxExtension.js';
3
3
  export const flexboxExtensionShowOverlayOptionName = 'flexboxExtensionShowOverlay';
4
4
  export class FlexboxExtensionProvider {
5
- shouldExtend(extensionManager, designerView, designItem) {
5
+ shouldExtend(extensionManager, designerCanvas, designItem) {
6
6
  const display = getComputedStyle(designItem.element).display;
7
7
  if (display == 'flex' || display == 'inline-flex')
8
- return designerView.instanceServiceContainer.designContext.extensionOptions[flexboxExtensionShowOverlayOptionName] !== false;
8
+ return designerCanvas.instanceServiceContainer.designContext.extensionOptions[flexboxExtensionShowOverlayOptionName] !== false;
9
9
  return false;
10
10
  }
11
- getExtension(extensionManager, designerView, designItem) {
12
- return new FlexboxExtension(extensionManager, designerView, designItem);
11
+ getExtension(extensionManager, designerCanvas, designItem) {
12
+ return new FlexboxExtension(extensionManager, designerCanvas, designItem);
13
13
  }
14
14
  style = css `
15
15
  .svg-flexbox { stroke: orange; fill: #9a47ff22; }
@@ -8,21 +8,13 @@ export declare class GridExtension extends AbstractExtension {
8
8
  private _rects;
9
9
  private _gaps;
10
10
  private _resizeCircles;
11
+ private minPixelSize;
11
12
  constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
12
13
  extend(): void;
13
14
  refresh(): void;
14
15
  dispose(): void;
15
16
  _drawResizeCircles(gap: any, oldCircle?: SVGCircleElement): SVGCircleElement;
16
17
  _pointerActionTypeResize(event: PointerEvent, circle: SVGCircleElement, gapColumn: any, gapRow: any): void;
17
- _getInitialSizes(style: CSSStyleDeclaration): {
18
- x: any[];
19
- y: any[];
20
- xUnit: any[];
21
- yUnit: any[];
22
- };
23
- _parseInitValue(stringValue: string): {
24
- value: number;
25
- unit: string;
26
- };
27
- _calculateNewSize(iSizes: any, iUnits: any, diff: any, gapIndex: any, itemWidth?: number, itemHeight?: number): string;
18
+ _calculateNewSize(iSizes: any, diff: any, gapIndex: any, percentTarget: 'width' | 'heigth'): string;
19
+ _getCssUnit(cssValue: string): string;
28
20
  }
@@ -1,4 +1,5 @@
1
1
  import { EventNames } from "../../../../enums/EventNames.js";
2
+ import { convertCssUnit, convertCssUnitToPixel, getCssUnit } from "../../../helper/CssUnitConverter.js";
2
3
  import { CalculateGridInformation } from "../../../helper/GridHelper.js";
3
4
  import { AbstractExtension } from './AbstractExtension.js';
4
5
  import { OverlayLayer } from "./OverlayLayer.js";
@@ -8,11 +9,12 @@ export class GridExtension extends AbstractExtension {
8
9
  _rects;
9
10
  _gaps;
10
11
  _resizeCircles;
12
+ minPixelSize = 10;
11
13
  constructor(extensionManager, designerView, extendedItem) {
12
14
  super(extensionManager, designerView, extendedItem);
13
15
  }
14
16
  extend() {
15
- var gridInformation = CalculateGridInformation(this.extendedItem);
17
+ let gridInformation = CalculateGridInformation(this.extendedItem);
16
18
  this._rects = new Array(gridInformation.cells.length);
17
19
  gridInformation.cells.forEach((cellRow, i) => {
18
20
  this._rects[i] = new Array(cellRow.length);
@@ -22,7 +24,7 @@ export class GridExtension extends AbstractExtension {
22
24
  this.refresh();
23
25
  }
24
26
  refresh() {
25
- var gridInformation = CalculateGridInformation(this.extendedItem);
27
+ let gridInformation = CalculateGridInformation(this.extendedItem);
26
28
  gridInformation.gaps.forEach((gap, i) => {
27
29
  this._gaps[i] = this._drawRect(gap.x, gap.y, gap.width, gap.height, 'svg-grid-gap', this._gaps[i], OverlayLayer.Foregorund);
28
30
  this._resizeCircles[i] = this._drawResizeCircles(gap, this._resizeCircles[i]);
@@ -41,7 +43,7 @@ export class GridExtension extends AbstractExtension {
41
43
  this._removeAllOverlays();
42
44
  }
43
45
  _drawResizeCircles(gap, oldCircle) {
44
- var resizeCircle = this._drawCircle((gap.x + (gap.width / 2)), (gap.y + (gap.height / 2)), 1.5, 'svg-grid-reziser', oldCircle, OverlayLayer.Foregorund);
46
+ let resizeCircle = this._drawCircle((gap.x + (gap.width / 2)), (gap.y + (gap.height / 2)), 1.5, 'svg-grid-resizer', oldCircle, OverlayLayer.Foregorund);
45
47
  resizeCircle.style.pointerEvents = "all";
46
48
  resizeCircle.style.cursor = gap.width < gap.height ? "ew-resize" : "ns-resize";
47
49
  if (!oldCircle) {
@@ -57,18 +59,18 @@ export class GridExtension extends AbstractExtension {
57
59
  case EventNames.PointerDown:
58
60
  circle.setPointerCapture(event.pointerId);
59
61
  this._initialPoint = { x: event.clientX, y: event.clientY };
60
- this._initialSizes = this._getInitialSizes(this.extendedItem.element.style);
62
+ this._initialSizes = { x: this.extendedItem.element.style.gridTemplateColumns.split(' '), y: this.extendedItem.element.style.gridTemplateRows.split(' ') };
61
63
  break;
62
64
  case EventNames.PointerMove:
63
65
  if (this._initialPoint) {
64
- var elementStyle = this.extendedItem.element.style;
66
+ let elementStyle = this.extendedItem.element.style;
65
67
  this.extendedItem.element.getBoundingClientRect;
66
68
  switch (circle.style.cursor) {
67
69
  case "ew-resize":
68
- elementStyle.gridTemplateColumns = this._calculateNewSize(this._initialSizes.x, this._initialSizes.xUnit, (event.clientX - this._initialPoint.x) / this.designerCanvas.zoomFactor, gapColumn, parseFloat(elementStyle.width.substring(0, elementStyle.width.length - 2)), null);
70
+ elementStyle.gridTemplateColumns = this._calculateNewSize(this._initialSizes.x, (event.clientX - this._initialPoint.x) / this.designerCanvas.zoomFactor, gapColumn, "width");
69
71
  break;
70
72
  case "ns-resize":
71
- elementStyle.gridTemplateRows = this._calculateNewSize(this._initialSizes.y, this._initialSizes.yUnit, (event.clientY - this._initialPoint.y) / this.designerCanvas.zoomFactor, gapRow, null, parseFloat(elementStyle.height.substring(0, elementStyle.height.length - 2)));
73
+ elementStyle.gridTemplateRows = this._calculateNewSize(this._initialSizes.y, (event.clientY - this._initialPoint.y) / this.designerCanvas.zoomFactor, gapRow, "heigth");
72
74
  break;
73
75
  }
74
76
  this.refresh();
@@ -85,149 +87,73 @@ export class GridExtension extends AbstractExtension {
85
87
  break;
86
88
  }
87
89
  }
88
- _getInitialSizes(style) {
89
- var retX = [];
90
- var retY = [];
91
- var retXUnit = [];
92
- var retYUnit = [];
93
- var tmpX = style.gridTemplateColumns.split(' ');
94
- tmpX.forEach(x => {
95
- var r = this._parseInitValue(x);
96
- retX.push(r.value);
97
- retXUnit.push(r.unit);
98
- });
99
- var tmpY = style.gridTemplateRows.split(' ');
100
- tmpY.forEach(y => {
101
- var r = this._parseInitValue(y);
102
- retY.push(r.value);
103
- retYUnit.push(r.unit);
104
- });
105
- return { x: retX, y: retY, xUnit: retXUnit, yUnit: retYUnit };
106
- }
107
- _parseInitValue(stringValue) {
108
- var i = stringValue.length;
109
- while (isNaN(parseInt(stringValue.substring(i - 1, stringValue.length))))
110
- i--;
111
- return { value: parseFloat(stringValue.substring(0, i)), unit: stringValue.substring(i, stringValue.length) };
112
- }
113
- _calculateNewSize(iSizes, iUnits, diff, gapIndex, itemWidth, itemHeight) {
114
- var newSizes = [];
115
- var newUnits = [];
116
- var unitFactors = [];
117
- var edited = [];
118
- for (var i = 0; i < iSizes.length; i++) {
90
+ _calculateNewSize(iSizes, diff, gapIndex, percentTarget) {
91
+ let newSizes = [];
92
+ let edited = [];
93
+ for (let i = 0; i < iSizes.length; i++) {
119
94
  if (i + 1 == gapIndex || i == gapIndex) {
120
- if (iUnits[i] == "%") {
121
- var percentDiff = itemWidth ? (1 - ((itemWidth - diff) / itemWidth)) * 100 : itemHeight ? (1 - ((itemHeight - diff) / itemHeight)) * 100 : null;
122
- newSizes.push(i + 1 == gapIndex ? iSizes[i] + percentDiff : i == gapIndex ? iSizes[i] - percentDiff : null);
123
- unitFactors.push(null);
124
- edited.push(true);
125
- }
126
- else if (iUnits[i] == "fr") {
95
+ if (this._getCssUnit(iSizes[i]) == "fr") {
127
96
  newSizes.push(iSizes[i]);
128
- unitFactors.push(null);
129
97
  edited.push(true);
130
98
  }
131
99
  else {
132
- var unitFactor;
133
- switch (iUnits[i]) {
134
- case "mm":
135
- unitFactor = 1 / 3.78;
136
- break;
137
- case "cm":
138
- unitFactor = 1 / 37.8;
139
- break;
140
- case "in":
141
- unitFactor = 1 / 96;
142
- break;
143
- case "px":
144
- unitFactor = 1;
145
- break;
146
- case "pt":
147
- unitFactor = 3;
148
- break;
149
- case "pc":
150
- unitFactor = 16;
151
- break;
152
- }
153
- newSizes.push(i + 1 == gapIndex ? iSizes[i] + diff * unitFactor : i == gapIndex ? iSizes[i] - diff * unitFactor : null);
154
- unitFactors.push(unitFactor);
100
+ let convertedDiff = parseFloat(convertCssUnit(diff, this.extendedItem.element, percentTarget, this._getCssUnit(iSizes[i])).toString());
101
+ newSizes.push((i + 1 == gapIndex ? parseFloat(iSizes[i]) + convertedDiff : i == gapIndex ? parseFloat(iSizes[i]) - convertedDiff : null) + this._getCssUnit(iSizes[i]));
155
102
  edited.push(true);
156
103
  }
157
104
  }
158
105
  else {
159
106
  newSizes.push(iSizes[i]);
160
- unitFactors.push(null);
161
107
  edited.push(false);
162
108
  }
163
- newUnits.push(iUnits[i]);
164
109
  }
165
- var retVal = "";
166
- var minPixelSize = 10;
167
- var minPercentSize = itemHeight ? minPixelSize / itemHeight * 100 : itemWidth ? minPixelSize / itemWidth * 100 : null;
168
- for (var i = 0; i < newSizes.length; i++) {
169
- if (newUnits[i] == "%" && newSizes[i] < minPercentSize) {
170
- if (edited[i + 1] && newUnits[i + 1] == "%") {
171
- newSizes[i + 1] = iSizes[i] + iSizes[i + 1] - minPercentSize;
172
- newSizes[i] = minPercentSize;
173
- break;
174
- }
175
- else if (edited[i - 1] && newUnits[i - 1] == "%") {
176
- newSizes[i - 1] = iSizes[i] + iSizes[i - 1] - minPercentSize;
177
- newSizes[i] = minPercentSize;
178
- break;
179
- }
180
- }
181
- else if (newUnits[i] == "fr") {
182
- var editedIndex;
110
+ for (let i = 0; i < newSizes.length; i++) {
111
+ if (this._getCssUnit(newSizes[i]) == "fr") {
112
+ let editedIndex;
183
113
  if (edited[i + 1])
184
114
  editedIndex = i + 1;
185
115
  else if (edited[i - 1])
186
116
  editedIndex = i - 1;
187
117
  else
188
118
  continue;
189
- if (newUnits[editedIndex] == "px") {
190
- if (newSizes[editedIndex] < minPixelSize)
191
- newSizes[editedIndex] = minPixelSize;
192
- var totalSize = itemWidth ? itemWidth : itemHeight ? itemHeight : null;
193
- var totalSizeExceptFr = 0;
194
- newSizes.forEach(newSize => totalSizeExceptFr += newSize);
195
- var totalSizeExceptEdited = 0;
196
- newSizes.forEach((newSize, k) => { if (!edited[k])
197
- totalSizeExceptEdited += newSize; });
198
- if (totalSize - totalSizeExceptFr < minPixelSize)
199
- newSizes[editedIndex] = totalSize - totalSizeExceptEdited - minPixelSize;
119
+ //check if newSize smaller than minimum
120
+ if (convertCssUnitToPixel(newSizes[editedIndex], this.extendedItem.element, percentTarget) < this.minPixelSize) {
121
+ newSizes[editedIndex] = convertCssUnit(this.minPixelSize, this.extendedItem.element, percentTarget, this._getCssUnit(newSizes[editedIndex]));
200
122
  }
201
- else if (newUnits[editedIndex] == "%") {
202
- if (newSizes[editedIndex] < minPercentSize)
203
- newSizes[editedIndex] = minPercentSize;
204
- var totalSize = 100;
205
- var totalSizeExceptFr = 0;
206
- newSizes.forEach(newSize => totalSizeExceptFr += newSize);
207
- var totalSizeExceptEdited = 0;
208
- newSizes.forEach((newSize, k) => { if (!edited[k])
209
- totalSizeExceptEdited += newSize; });
210
- if (totalSize - totalSizeExceptFr < minPercentSize)
211
- newSizes[editedIndex] = totalSize - totalSizeExceptEdited - minPercentSize;
123
+ //check if fr is smaller than 10px
124
+ let totalSize = parseFloat(percentTarget == "width" ? this.extendedItem.element.style.width : this.extendedItem.element.style.height);
125
+ let totalGapSize = percentTarget == "width" ?
126
+ parseFloat(this.extendedItem.element.style.columnGap) * this.extendedItem.element.style.gridTemplateColumns.split(' ').length - 1 :
127
+ parseFloat(this.extendedItem.element.style.rowGap) * this.extendedItem.element.style.gridTemplateColumns.split(' ').length - 1;
128
+ let totalSizeExceptFr = 0;
129
+ newSizes.forEach(newSize => {
130
+ if (this._getCssUnit(newSize) != "fr")
131
+ totalSizeExceptFr += convertCssUnitToPixel(newSize, this.extendedItem.element, percentTarget);
132
+ });
133
+ let totalSizeExceptEdited = 0;
134
+ newSizes.forEach((newSize, k) => {
135
+ if (!edited[k])
136
+ totalSizeExceptEdited += convertCssUnitToPixel(newSize, this.extendedItem.element, percentTarget);
137
+ });
138
+ if (totalSize - totalSizeExceptFr - totalGapSize < this.minPixelSize) {
139
+ newSizes[editedIndex] = convertCssUnit(totalSize - totalSizeExceptEdited - totalGapSize - this.minPixelSize, this.extendedItem.element, percentTarget, this._getCssUnit(iSizes[editedIndex]));
212
140
  }
213
141
  }
214
142
  else {
215
- if (newSizes[i] / unitFactors[i] < minPixelSize) {
216
- if (edited[i + 1]) {
217
- newSizes[i + 1] = iSizes[i] + iSizes[i + 1] - minPixelSize * unitFactors[i + 1];
218
- newSizes[i] = minPixelSize * unitFactors[i];
219
- break;
220
- }
221
- else if (edited[i - 1]) {
222
- newSizes[i - 1] = iSizes[i] + iSizes[i - 1] - minPixelSize * unitFactors[i - 1];
223
- newSizes[i] = minPixelSize * unitFactors[i];
224
- break;
225
- }
143
+ if (convertCssUnitToPixel(newSizes[i], this.extendedItem.element, percentTarget) < this.minPixelSize) {
144
+ let index = edited[i + 1] ? i + 1 : edited[i - 1] ? i - 1 : null;
145
+ if (this._getCssUnit(newSizes[index]) != "fr")
146
+ newSizes[index] = convertCssUnit(convertCssUnitToPixel(newSizes[i], this.extendedItem.element, percentTarget) + convertCssUnitToPixel(newSizes[index], this.extendedItem.element, percentTarget) - this.minPixelSize, this.extendedItem.element, percentTarget, this._getCssUnit(newSizes[index]));
147
+ newSizes[i] = convertCssUnit(this.minPixelSize, this.extendedItem.element, percentTarget, this._getCssUnit(newSizes[i]));
148
+ break;
226
149
  }
227
150
  }
228
151
  }
229
- for (var i = 0; i < newSizes.length; i++)
230
- retVal += newSizes[i] + newUnits[i] + " ";
152
+ let retVal = "";
153
+ newSizes.forEach(newSize => retVal += newSize + ' ');
231
154
  return retVal;
232
155
  }
156
+ _getCssUnit(cssValue) {
157
+ return cssValue.substring(cssValue.length - 2, cssValue.length) == "fr" ? "fr" : getCssUnit(cssValue);
158
+ }
233
159
  }
@@ -1,5 +1,5 @@
1
1
  import { DesignerView } from "../designerView.js";
2
- import { IDesignerCanvas } from "../IDesignerCanvas";
2
+ import { IDesignerCanvas } from '../IDesignerCanvas.js';
3
3
  import { IDesignViewConfigButtonsProvider } from "../IDesignViewConfigButtonsProvider.js";
4
4
  export declare class GridExtensionDesignViewConfigButtons implements IDesignViewConfigButtonsProvider {
5
5
  provideButtons(designerView: DesignerView, designerCanvas: IDesignerCanvas): HTMLElement[];
@@ -15,6 +15,7 @@ export class GridExtensionDesignViewConfigButtons {
15
15
  btn.classList.add('selected');
16
16
  else
17
17
  btn.classList.remove('selected');
18
+ designerCanvas.extensionManager.reapplyAllAppliedExtentions();
18
19
  };
19
20
  return [btn];
20
21
  }
@@ -5,7 +5,7 @@ import { IDesignerExtension } from './IDesignerExtension.js';
5
5
  import { IExtensionManager } from './IExtensionManger.js';
6
6
  export declare const gridExtensionShowOverlayOptionName = "gridExtensionShowOverlay";
7
7
  export declare class GridExtensionProvider implements IDesignerExtensionProvider {
8
- shouldExtend(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): boolean;
9
- getExtension(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
8
+ shouldExtend(extensionManager: IExtensionManager, designerCanvas: IDesignerCanvas, designItem: IDesignItem): boolean;
9
+ getExtension(extensionManager: IExtensionManager, designerCanvas: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
10
10
  readonly style: CSSStyleSheet;
11
11
  }
@@ -2,19 +2,19 @@ import { GridExtension } from './GridExtension.js';
2
2
  import { css } from "@node-projects/base-custom-webcomponent";
3
3
  export const gridExtensionShowOverlayOptionName = 'gridExtensionShowOverlay';
4
4
  export class GridExtensionProvider {
5
- shouldExtend(extensionManager, designerView, designItem) {
5
+ shouldExtend(extensionManager, designerCanvas, designItem) {
6
6
  const display = getComputedStyle(designItem.element).display;
7
7
  if (display == 'grid' || display == 'inline-grid')
8
- return designerView.instanceServiceContainer.designContext.extensionOptions[gridExtensionShowOverlayOptionName] !== false;
8
+ return designerCanvas.instanceServiceContainer.designContext.extensionOptions[gridExtensionShowOverlayOptionName] !== false;
9
9
  return false;
10
10
  }
11
- getExtension(extensionManager, designerView, designItem) {
12
- return new GridExtension(extensionManager, designerView, designItem);
11
+ getExtension(extensionManager, designerCanvas, designItem) {
12
+ return new GridExtension(extensionManager, designerCanvas, designItem);
13
13
  }
14
14
  style = css `
15
15
  .svg-grid { stroke: orange; stroke-dasharray: 5; fill: #ff944722; }
16
16
  .svg-grid-area { font-size: 8px; }
17
17
  .svg-grid-gap { stroke: orange; stroke-dasharray: 5; fill: #0000ff22; }
18
- .svg-grid-reziser { background: white; border: 1px solid black; }
18
+ .svg-grid-resizer { fill: white; stroke: #3899ec }
19
19
  `;
20
20
  }
@@ -0,0 +1,11 @@
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 HighlightElementExtension extends AbstractExtension {
6
+ private _rect;
7
+ constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
8
+ extend(): void;
9
+ refresh(): void;
10
+ dispose(): void;
11
+ }
@@ -0,0 +1,20 @@
1
+ import { getDesignerCanvasNormalizedTransformedCornerDOMPoints } from '../../../helper/TransformHelper.js';
2
+ import { AbstractExtension } from './AbstractExtension.js';
3
+ const offset = 3;
4
+ export class HighlightElementExtension extends AbstractExtension {
5
+ _rect;
6
+ constructor(extensionManager, designerView, extendedItem) {
7
+ super(extensionManager, designerView, extendedItem);
8
+ }
9
+ extend() {
10
+ this.refresh();
11
+ }
12
+ refresh() {
13
+ let transformedCornerPoints = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, { x: offset, y: offset }, this.designerCanvas);
14
+ this._rect = this._drawTransformedRect(transformedCornerPoints, 'svg-hover', this._rect);
15
+ this._rect.style.strokeWidth = (2 / this.designerCanvas.zoomFactor).toString();
16
+ }
17
+ dispose() {
18
+ this._removeAllOverlays();
19
+ }
20
+ }
@@ -0,0 +1,10 @@
1
+ import { IDesignerExtensionProvider } from './IDesignerExtensionProvider.js';
2
+ import { IDesignItem } from '../../../item/IDesignItem.js';
3
+ import { IDesignerCanvas } from '../IDesignerCanvas.js';
4
+ import { IDesignerExtension } from './IDesignerExtension.js';
5
+ import { IExtensionManager } from './IExtensionManger.js';
6
+ export declare class HighlightElementExtensionProvider implements IDesignerExtensionProvider {
7
+ shouldExtend(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): boolean;
8
+ getExtension(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
9
+ readonly style: CSSStyleSheet;
10
+ }
@@ -0,0 +1,13 @@
1
+ import { HighlightElementExtension } from './HighlightElementExtension.js';
2
+ import { css } from "@node-projects/base-custom-webcomponent";
3
+ export class HighlightElementExtensionProvider {
4
+ shouldExtend(extensionManager, designerView, designItem) {
5
+ return true;
6
+ }
7
+ getExtension(extensionManager, designerView, designItem) {
8
+ return new HighlightElementExtension(extensionManager, designerView, designItem);
9
+ }
10
+ style = css `
11
+ .svg-hover { stroke: #90caf9; fill: none; }
12
+ `;
13
+ }
@@ -10,4 +10,5 @@ export interface IExtensionManager {
10
10
  refreshExtensions(designItems: IDesignItem[], extensionType?: ExtensionType): any;
11
11
  refreshAllExtensions(designItems: IDesignItem[], ignoredExtension?: any): any;
12
12
  refreshAllAppliedExtentions(): any;
13
+ reapplyAllAppliedExtentions(): any;
13
14
  }
@@ -0,0 +1,6 @@
1
+ import { DesignerView } from "../designerView.js";
2
+ import { IDesignerCanvas } from '../IDesignerCanvas.js';
3
+ import { IDesignViewConfigButtonsProvider } from "../IDesignViewConfigButtonsProvider.js";
4
+ export declare class InvisibleDivExtensionDesignViewConfigButtons implements IDesignViewConfigButtonsProvider {
5
+ provideButtons(designerView: DesignerView, designerCanvas: IDesignerCanvas): HTMLElement[];
6
+ }
@@ -0,0 +1,22 @@
1
+ import { invisibleDivExtensionShowOverlayOptionName } from "./InvisibleElementExtensionProvider.js";
2
+ export class InvisibleDivExtensionDesignViewConfigButtons {
3
+ provideButtons(designerView, designerCanvas) {
4
+ const extensionOptions = designerCanvas.instanceServiceContainer.designContext.extensionOptions;
5
+ const btn = document.createElement('div');
6
+ btn.innerText = 'I';
7
+ btn.title = 'show invisible div overlay';
8
+ btn.className = 'toolbar-control';
9
+ if (extensionOptions[invisibleDivExtensionShowOverlayOptionName] !== false)
10
+ btn.classList.add('selected');
11
+ btn.onclick = () => {
12
+ const val = extensionOptions[invisibleDivExtensionShowOverlayOptionName];
13
+ extensionOptions[invisibleDivExtensionShowOverlayOptionName] = val === false ? true : false;
14
+ if (extensionOptions[invisibleDivExtensionShowOverlayOptionName] !== false)
15
+ btn.classList.add('selected');
16
+ else
17
+ btn.classList.remove('selected');
18
+ designerCanvas.extensionManager.reapplyAllAppliedExtentions();
19
+ };
20
+ return [btn];
21
+ }
22
+ }
@@ -3,6 +3,7 @@ import { IDesignItem } from '../../../item/IDesignItem.js';
3
3
  import { IDesignerCanvas } from '../IDesignerCanvas.js';
4
4
  import { IDesignerExtension } from './IDesignerExtension.js';
5
5
  import { IExtensionManager } from './IExtensionManger.js';
6
+ export declare const invisibleDivExtensionShowOverlayOptionName = "invisibleDivExtensionShowOverlay";
6
7
  export declare class InvisibleDivExtensionProvider implements IDesignerExtensionProvider {
7
8
  shouldExtend(extensionManager: IExtensionManager, designerCanvas: IDesignerCanvas, designItem: IDesignItem): boolean;
8
9
  getExtension(extensionManager: IExtensionManager, designerCanvas: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
@@ -1,10 +1,13 @@
1
1
  import { InvisibleDivExtension } from './InvisibleDivExtension.js';
2
2
  import { css } from "@node-projects/base-custom-webcomponent";
3
+ export const invisibleDivExtensionShowOverlayOptionName = 'invisibleDivExtensionShowOverlay';
3
4
  export class InvisibleDivExtensionProvider {
4
5
  shouldExtend(extensionManager, designerCanvas, designItem) {
5
- if (designItem.name == 'div') {
6
- const st = window.getComputedStyle(designItem.element);
7
- return st.backgroundColor == 'rgba(0, 0, 0, 0)' && st.borderStyle == 'none';
6
+ if (designerCanvas.instanceServiceContainer.designContext.extensionOptions[invisibleDivExtensionShowOverlayOptionName] !== false) {
7
+ if (designItem.name == 'div') {
8
+ const st = window.getComputedStyle(designItem.element);
9
+ return st.backgroundColor == 'rgba(0, 0, 0, 0)' && st.borderStyle == 'none';
10
+ }
8
11
  }
9
12
  return false;
10
13
  }
@@ -0,0 +1,11 @@
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 InvisibleElementExtension extends AbstractExtension {
6
+ private _rect;
7
+ constructor(extensionManager: IExtensionManager, designerCanvas: IDesignerCanvas, extendedItem: IDesignItem);
8
+ extend(): void;
9
+ refresh(): void;
10
+ dispose(): void;
11
+ }
@@ -0,0 +1,19 @@
1
+ import { getDesignerCanvasNormalizedTransformedCornerDOMPoints } from '../../../helper/TransformHelper.js';
2
+ import { AbstractExtension } from './AbstractExtension.js';
3
+ import { OverlayLayer } from "./OverlayLayer.js";
4
+ export class InvisibleElementExtension extends AbstractExtension {
5
+ _rect;
6
+ constructor(extensionManager, designerCanvas, extendedItem) {
7
+ super(extensionManager, designerCanvas, extendedItem);
8
+ }
9
+ extend() {
10
+ this.refresh();
11
+ }
12
+ refresh() {
13
+ let transformedCornerPoints = getDesignerCanvasNormalizedTransformedCornerDOMPoints(this.extendedItem.element, null, this.designerCanvas);
14
+ this._rect = this._drawTransformedRect(transformedCornerPoints, 'svg-invisible-div', this._rect, OverlayLayer.Background);
15
+ }
16
+ dispose() {
17
+ this._removeAllOverlays();
18
+ }
19
+ }
@@ -0,0 +1,6 @@
1
+ import { DesignerView } from "../designerView.js";
2
+ import { IDesignerCanvas } from '../IDesignerCanvas.js';
3
+ import { IDesignViewConfigButtonsProvider } from "../IDesignViewConfigButtonsProvider.js";
4
+ export declare class InvisibleElementExtensionDesignViewConfigButtons implements IDesignViewConfigButtonsProvider {
5
+ provideButtons(designerView: DesignerView, designerCanvas: IDesignerCanvas): HTMLElement[];
6
+ }
@@ -0,0 +1,22 @@
1
+ import { invisibleElementExtensionShowOverlayOptionName } from "./InvisibleElementExtensionProvider.js";
2
+ export class InvisibleElementExtensionDesignViewConfigButtons {
3
+ provideButtons(designerView, designerCanvas) {
4
+ const extensionOptions = designerCanvas.instanceServiceContainer.designContext.extensionOptions;
5
+ const btn = document.createElement('div');
6
+ btn.innerText = 'I';
7
+ btn.title = 'show invisible div overlay';
8
+ btn.className = 'toolbar-control';
9
+ if (extensionOptions[invisibleElementExtensionShowOverlayOptionName] !== false)
10
+ btn.classList.add('selected');
11
+ btn.onclick = () => {
12
+ const val = extensionOptions[invisibleElementExtensionShowOverlayOptionName];
13
+ extensionOptions[invisibleElementExtensionShowOverlayOptionName] = val === false ? true : false;
14
+ if (extensionOptions[invisibleElementExtensionShowOverlayOptionName] !== false)
15
+ btn.classList.add('selected');
16
+ else
17
+ btn.classList.remove('selected');
18
+ designerCanvas.extensionManager.reapplyAllAppliedExtentions();
19
+ };
20
+ return [btn];
21
+ }
22
+ }
@@ -0,0 +1,13 @@
1
+ import { IDesignerExtensionProvider } from './IDesignerExtensionProvider.js';
2
+ import { IDesignItem } from '../../../item/IDesignItem.js';
3
+ import { IDesignerCanvas } from '../IDesignerCanvas.js';
4
+ import { IDesignerExtension } from './IDesignerExtension.js';
5
+ import { IExtensionManager } from './IExtensionManger.js';
6
+ export declare const invisibleElementExtensionShowOverlayOptionName = "invisibleElementExtensionShowOverlay";
7
+ export declare class InvisibleElementExtensionProvider implements IDesignerExtensionProvider {
8
+ elementFilter: (designItem: IDesignItem) => boolean;
9
+ constructor(elementFilter?: (designItem: IDesignItem) => boolean);
10
+ shouldExtend(extensionManager: IExtensionManager, designerCanvas: IDesignerCanvas, designItem: IDesignItem): boolean;
11
+ getExtension(extensionManager: IExtensionManager, designerCanvas: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
12
+ readonly style: CSSStyleSheet;
13
+ }
@@ -0,0 +1,24 @@
1
+ import { InvisibleElementExtension as InvisibleElementExtension } from './InvisibleElementExtension.js';
2
+ import { css } from "@node-projects/base-custom-webcomponent";
3
+ export const invisibleElementExtensionShowOverlayOptionName = 'invisibleElementExtensionShowOverlay';
4
+ export class InvisibleElementExtensionProvider {
5
+ elementFilter;
6
+ constructor(elementFilter = (d) => d.name == 'div' && window.getComputedStyle(d.element).display != 'inline') {
7
+ this.elementFilter = elementFilter;
8
+ }
9
+ shouldExtend(extensionManager, designerCanvas, designItem) {
10
+ if (designerCanvas.instanceServiceContainer.designContext.extensionOptions[invisibleElementExtensionShowOverlayOptionName] !== false) {
11
+ if (this.elementFilter(designItem)) {
12
+ const st = window.getComputedStyle(designItem.element);
13
+ return st.backgroundColor == 'rgba(0, 0, 0, 0)' && st.borderStyle == 'none';
14
+ }
15
+ }
16
+ return false;
17
+ }
18
+ getExtension(extensionManager, designerCanvas, designItem) {
19
+ return new InvisibleElementExtension(extensionManager, designerCanvas, designItem);
20
+ }
21
+ style = css `
22
+ .svg-invisible-div { stroke: lightgray; fill: transparent; stroke-width: 1;
23
+ `;
24
+ }
@@ -4,6 +4,8 @@ import { IDesignerCanvas } from '../IDesignerCanvas.js';
4
4
  import { IDesignerExtension } from './IDesignerExtension.js';
5
5
  import { IExtensionManager } from './IExtensionManger.js';
6
6
  export declare class TransformOriginExtensionProvider implements IDesignerExtensionProvider {
7
+ showOnlyWhenSet: boolean;
8
+ constructor(showOnlyWhenSet?: boolean);
7
9
  shouldExtend(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): boolean;
8
10
  getExtension(extensionManager: IExtensionManager, designerView: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
9
11
  readonly style: CSSStyleSheet;
@@ -1,10 +1,21 @@
1
1
  import { TransformOriginExtension } from './TransformOriginExtension.js';
2
2
  import { css } from "@node-projects/base-custom-webcomponent";
3
3
  export class TransformOriginExtensionProvider {
4
+ showOnlyWhenSet;
5
+ constructor(showOnlyWhenSet = true) {
6
+ this.showOnlyWhenSet = showOnlyWhenSet;
7
+ }
4
8
  shouldExtend(extensionManager, designerView, designItem) {
5
9
  if (designItem.node instanceof HTMLElement || (designItem.node instanceof SVGElement && designItem.node.localName === 'svg')) {
6
- let r = designItem.element.getBoundingClientRect();
7
- return r.width > 10 && r.height > 10;
10
+ if (!this.showOnlyWhenSet)
11
+ return true;
12
+ if (designItem.hasStyle('transformOrigin'))
13
+ return true;
14
+ if (getComputedStyle(designItem.element).display != 'inline' && designItem.element.getBoundingClientRect) {
15
+ const r = designItem.element.getBoundingClientRect();
16
+ if (getComputedStyle(designItem.element).transformOrigin != r.width / 2 + 'px ' + r.height / 2 + 'px')
17
+ return true;
18
+ }
8
19
  }
9
20
  return false;
10
21
  }
package/dist/index.d.ts CHANGED
@@ -168,10 +168,11 @@ export * from "./elements/widgets/designerView/extensions/GrayOutDragOverContain
168
168
  export * from "./elements/widgets/designerView/extensions/GrayOutDragOverContainerExtensionProvider.js";
169
169
  export * from "./elements/widgets/designerView/extensions/GridExtension.js";
170
170
  export * from "./elements/widgets/designerView/extensions/GridExtensionProvider.js";
171
- export * from "./elements/widgets/designerView/extensions/InvisibleDivExtension.js";
172
- export * from "./elements/widgets/designerView/extensions/InvisibleDivExtensionProvider.js";
173
- export * from "./elements/widgets/designerView/extensions/MouseOverExtension.js";
174
- export * from "./elements/widgets/designerView/extensions/MouseOverExtensionProvider.js";
171
+ export * from "./elements/widgets/designerView/extensions/InvisibleElementExtension.js";
172
+ export * from "./elements/widgets/designerView/extensions/InvisibleElementExtensionProvider.js";
173
+ export * from "./elements/widgets/designerView/extensions/InvisibleElementExtensionDesignViewConfigButtons.js";
174
+ export * from "./elements/widgets/designerView/extensions/HighlightElementExtension.js";
175
+ export * from "./elements/widgets/designerView/extensions/HighlightElementExtensionProvider.js";
175
176
  export * from "./elements/widgets/designerView/extensions/svg/PathExtension.js";
176
177
  export * from "./elements/widgets/designerView/extensions/svg/PathExtensionProvider.js";
177
178
  export * from "./elements/widgets/designerView/extensions/PositionExtension.js";
package/dist/index.js CHANGED
@@ -125,10 +125,11 @@ export * from "./elements/widgets/designerView/extensions/GrayOutDragOverContain
125
125
  export * from "./elements/widgets/designerView/extensions/GrayOutDragOverContainerExtensionProvider.js";
126
126
  export * from "./elements/widgets/designerView/extensions/GridExtension.js";
127
127
  export * from "./elements/widgets/designerView/extensions/GridExtensionProvider.js";
128
- export * from "./elements/widgets/designerView/extensions/InvisibleDivExtension.js";
129
- export * from "./elements/widgets/designerView/extensions/InvisibleDivExtensionProvider.js";
130
- export * from "./elements/widgets/designerView/extensions/MouseOverExtension.js";
131
- export * from "./elements/widgets/designerView/extensions/MouseOverExtensionProvider.js";
128
+ export * from "./elements/widgets/designerView/extensions/InvisibleElementExtension.js";
129
+ export * from "./elements/widgets/designerView/extensions/InvisibleElementExtensionProvider.js";
130
+ export * from "./elements/widgets/designerView/extensions/InvisibleElementExtensionDesignViewConfigButtons.js";
131
+ export * from "./elements/widgets/designerView/extensions/HighlightElementExtension.js";
132
+ export * from "./elements/widgets/designerView/extensions/HighlightElementExtensionProvider.js";
132
133
  export * from "./elements/widgets/designerView/extensions/svg/PathExtension.js";
133
134
  export * from "./elements/widgets/designerView/extensions/svg/PathExtensionProvider.js";
134
135
  export * from "./elements/widgets/designerView/extensions/PositionExtension.js";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "description": "A UI designer for Polymer apps",
3
3
  "name": "@node-projects/web-component-designer",
4
- "version": "0.0.164",
4
+ "version": "0.0.166",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "author": "",