@node-projects/web-component-designer 0.0.171 → 0.0.173

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 (35) hide show
  1. package/dist/elements/item/DesignItem.d.ts +3 -1
  2. package/dist/elements/item/DesignItem.js +27 -3
  3. package/dist/elements/item/IDesignItem.d.ts +2 -0
  4. package/dist/elements/services/DefaultServiceBootstrap.js +6 -5
  5. package/dist/elements/services/ServiceContainer.d.ts +1 -1
  6. package/dist/elements/services/copyPasteService/CopyPasteService.js +2 -2
  7. package/dist/elements/services/propertiesService/services/AbstractPropertiesService.js +2 -2
  8. package/dist/elements/services/propertiesService/services/CssCurrentPropertiesService.d.ts +13 -0
  9. package/dist/elements/services/propertiesService/services/CssCurrentPropertiesService.js +24 -1
  10. package/dist/elements/services/stylesheetService/CssToolsStylesheetService.js +1 -1
  11. package/dist/elements/services/stylesheetService/CssTreeStylesheetService.js +15 -11
  12. package/dist/elements/services/stylesheetService/IStylesheetService.d.ts +1 -1
  13. package/dist/elements/widgets/designerView/designerCanvas.d.ts +1 -0
  14. package/dist/elements/widgets/designerView/designerCanvas.js +9 -3
  15. package/dist/elements/widgets/designerView/extensions/GridExtension.js +1 -1
  16. package/dist/elements/widgets/designerView/extensions/TransformOriginExtension.js +6 -5
  17. package/dist/elements/widgets/designerView/extensions/buttons/AbstractDesignViewConfigButton.d.ts +12 -0
  18. package/dist/elements/widgets/designerView/extensions/buttons/AbstractDesignViewConfigButton.js +40 -0
  19. package/dist/elements/widgets/designerView/extensions/buttons/ButtonSeperatorProvider.d.ts +8 -0
  20. package/dist/elements/widgets/designerView/extensions/buttons/ButtonSeperatorProvider.js +11 -0
  21. package/dist/elements/widgets/designerView/extensions/buttons/FlexboxExtensionDesignViewConfigButtons.d.ts +6 -0
  22. package/dist/elements/widgets/designerView/extensions/buttons/FlexboxExtensionDesignViewConfigButtons.js +22 -0
  23. package/dist/elements/widgets/designerView/extensions/buttons/GridExtensionDesignViewConfigButtons.d.ts +6 -0
  24. package/dist/elements/widgets/designerView/extensions/buttons/GridExtensionDesignViewConfigButtons.js +22 -0
  25. package/dist/elements/widgets/designerView/extensions/buttons/IDesignViewConfigButtonsProvider.d.ts +5 -0
  26. package/dist/elements/widgets/designerView/extensions/buttons/IDesignViewConfigButtonsProvider.js +1 -0
  27. package/dist/elements/widgets/designerView/extensions/buttons/InvisibleElementExtensionDesignViewConfigButtons.d.ts +6 -0
  28. package/dist/elements/widgets/designerView/extensions/buttons/InvisibleElementExtensionDesignViewConfigButtons.js +22 -0
  29. package/dist/elements/widgets/designerView/extensions/buttons/StylesheetServiceDesignViewConfigButtons copy.d.ts +7 -0
  30. package/dist/elements/widgets/designerView/extensions/buttons/StylesheetServiceDesignViewConfigButtons copy.js +21 -0
  31. package/dist/elements/widgets/designerView/extensions/buttons/StylesheetServiceDesignViewConfigButtons.d.ts +5 -0
  32. package/dist/elements/widgets/designerView/extensions/buttons/StylesheetServiceDesignViewConfigButtons.js +7 -0
  33. package/dist/index.d.ts +7 -2
  34. package/dist/index.js +6 -2
  35. package/package.json +1 -1
@@ -76,7 +76,9 @@ export declare class DesignItem implements IDesignItem {
76
76
  setStyle(name: string, value?: string | null, important?: boolean): void;
77
77
  removeStyle(name: string): void;
78
78
  updateStyleInSheetOrLocal(name: string, value?: string | null, important?: boolean): void;
79
- getStyleFromSheetOrLocal(name: string): void;
79
+ getStyleFromSheetOrLocal(name: string, fallback?: string): string;
80
+ getStyleFromSheetOrLocalOrComputed(name: string, fallback?: string): string;
81
+ getComputedStyle(name: string, fallback?: string): string;
80
82
  getAllStyles(): IStyleRule[];
81
83
  setAttribute(name: string, value?: string | null): void;
82
84
  removeAttribute(name: string): void;
@@ -7,6 +7,7 @@ import { PropertiesHelper } from '../services/propertiesService/services/Propert
7
7
  import { InsertChildAction } from '../services/undoService/transactionItems/InsertChildAction.js';
8
8
  import { DomConverter } from '../widgets/designerView/DomConverter.js';
9
9
  import { DeleteAction } from '../services/undoService/transactionItems/DeleteAction.js';
10
+ import { enableStylesheetService } from '../widgets/designerView/extensions/buttons/StylesheetServiceDesignViewConfigButtons.js';
10
11
  const hideAtDesignTimeAttributeName = 'node-projects-hide-at-design-time';
11
12
  const hideAtRunTimeAttributeName = 'node-projects-hide-at-run-time';
12
13
  const lockAtDesignTimeAttributeName = 'node-projects-lock-at-design-time';
@@ -304,9 +305,9 @@ export class DesignItem {
304
305
  }
305
306
  updateStyleInSheetOrLocal(name, value, important) {
306
307
  let nm = PropertiesHelper.camelToDashCase(name);
307
- // Pre-sorted by priority
308
+ // Pre-sorted by specificity
308
309
  let declerations = this.instanceServiceContainer.stylesheetService?.getDeclarations(this, nm);
309
- if (this.hasStyle(name) || !declerations) {
310
+ if (this.hasStyle(name) || this.instanceServiceContainer.designContext.extensionOptions[enableStylesheetService] === false || !declerations) {
310
311
  // Set style locally
311
312
  if (this.getStyle(nm) != value) {
312
313
  this.setStyle(nm, value);
@@ -320,7 +321,30 @@ export class DesignItem {
320
321
  this.instanceServiceContainer.stylesheetService.updateDeclarationWithDeclaration(declerations[0], value, important);
321
322
  }
322
323
  }
323
- getStyleFromSheetOrLocal(name) {
324
+ getStyleFromSheetOrLocal(name, fallback = null) {
325
+ let nm = PropertiesHelper.camelToDashCase(name);
326
+ if (this.hasStyle(name))
327
+ // Get style locally
328
+ return this.getStyle(nm);
329
+ // Pre-sorted by specificity
330
+ let decls = this.instanceServiceContainer.stylesheetService?.getDeclarations(this, nm);
331
+ if (decls && decls.length > 0)
332
+ return decls[0].value;
333
+ return null;
334
+ }
335
+ getStyleFromSheetOrLocalOrComputed(name, fallback = null) {
336
+ let value = this.getStyleFromSheetOrLocal(name);
337
+ if (!value) {
338
+ value = getComputedStyle(this.element).getPropertyValue(name);
339
+ }
340
+ return value ?? fallback;
341
+ }
342
+ getComputedStyle(name, fallback = null) {
343
+ let value = this.getStyleFromSheetOrLocal(name);
344
+ if (!value) {
345
+ value = getComputedStyle(this.element).getPropertyValue(name);
346
+ }
347
+ return value ?? fallback;
324
348
  }
325
349
  getAllStyles() {
326
350
  const localStyles = [...this._styles.entries()].map(x => ({ name: x[0], value: x[1], important: false }));
@@ -55,6 +55,8 @@ export interface IDesignItem {
55
55
  setStyle(name: string, value?: string | null, important?: boolean): any;
56
56
  removeStyle(name: string): any;
57
57
  updateStyleInSheetOrLocal(name: string, value?: string | null, important?: boolean): any;
58
+ getStyleFromSheetOrLocal(name: string, fallback?: string): any;
59
+ getStyleFromSheetOrLocalOrComputed(name: string, fallback?: string): any;
58
60
  getAllStyles(): IStyleRule[];
59
61
  attributes(): Iterable<[name: string, value: string]>;
60
62
  getAttribute(name: string): any;
@@ -44,8 +44,8 @@ import { DragDropService } from './dragDropService/DragDropService.js';
44
44
  import { EditTextExtensionProvider } from '../widgets/designerView/extensions/EditText/EditTextExtensionProvider.js';
45
45
  import { CopyPasteService } from './copyPasteService/CopyPasteService.js';
46
46
  import { DefaultModelCommandService } from './modelCommandService/DefaultModelCommandService.js';
47
- import { ButtonSeperatorProvider } from '../widgets/designerView/ButtonSeperatorProvider.js';
48
- import { GridExtensionDesignViewConfigButtons } from '../widgets/designerView/extensions/GridExtensionDesignViewConfigButtons.js';
47
+ import { ButtonSeperatorProvider } from '../widgets/designerView/extensions/buttons/ButtonSeperatorProvider.js';
48
+ import { GridExtensionDesignViewConfigButtons } from '../widgets/designerView/extensions/buttons/GridExtensionDesignViewConfigButtons.js';
49
49
  import { DemoProviderService } from './demoProviderService/DemoProviderService.js';
50
50
  import { DrawRectTool } from '../widgets/designerView/tools/DrawRectTool.js';
51
51
  import { DrawEllipsisTool } from '../widgets/designerView/tools/DrawEllipsisTool.js';
@@ -70,11 +70,12 @@ import { EllipsisExtensionProvider } from '../widgets/designerView/extensions/sv
70
70
  import { PropertyTabsService } from './propertiesService/PropertyTabsService.js';
71
71
  import { PlacementExtensionProvider } from '../widgets/designerView/extensions/PlacementExtensionProvider.js';
72
72
  import { FlexboxExtensionProvider } from '../widgets/designerView/extensions/FlexboxExtensionProvider.js';
73
- import { FlexboxExtensionDesignViewConfigButtons } from '../widgets/designerView/extensions/FlexboxExtensionDesignViewConfigButtons.js';
74
- import { InvisibleElementExtensionDesignViewConfigButtons } from '../widgets/designerView/extensions/InvisibleElementExtensionDesignViewConfigButtons.js';
73
+ import { FlexboxExtensionDesignViewConfigButtons } from '../widgets/designerView/extensions/buttons/FlexboxExtensionDesignViewConfigButtons.js';
74
+ import { InvisibleElementExtensionDesignViewConfigButtons } from '../widgets/designerView/extensions/buttons/InvisibleElementExtensionDesignViewConfigButtons.js';
75
75
  import { UndoService } from './undoService/UndoService.js';
76
76
  import { SelectionService } from './selectionService/SelectionService.js';
77
77
  import { ContentService } from './contentService/ContentService.js';
78
+ import { StylesheetServiceDesignViewConfigButtons } from '../widgets/designerView/extensions/buttons/StylesheetServiceDesignViewConfigButtons.js';
78
79
  export function createDefaultServiceContainer() {
79
80
  let serviceContainer = new ServiceContainer();
80
81
  serviceContainer.register("propertyService", new PolymerPropertiesService());
@@ -161,7 +162,7 @@ export function createDefaultServiceContainer() {
161
162
  serviceContainer.designerPointerExtensions.push(
162
163
  //new CursorLinePointerExtensionProvider()
163
164
  );
164
- serviceContainer.designViewConfigButtons.push(new ButtonSeperatorProvider(20), new GridExtensionDesignViewConfigButtons(), new FlexboxExtensionDesignViewConfigButtons(), new ButtonSeperatorProvider(10), new InvisibleElementExtensionDesignViewConfigButtons());
165
+ serviceContainer.designViewConfigButtons.push(new ButtonSeperatorProvider(20), new GridExtensionDesignViewConfigButtons(), new FlexboxExtensionDesignViewConfigButtons(), new ButtonSeperatorProvider(10), new InvisibleElementExtensionDesignViewConfigButtons(), new ButtonSeperatorProvider(10), new StylesheetServiceDesignViewConfigButtons());
165
166
  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());
166
167
  serviceContainer.designerContextMenuExtensions = [
167
168
  new CopyPasteContextMenu(),
@@ -22,7 +22,7 @@ import { IDragDropService } from './dragDropService/IDragDropService.js';
22
22
  import { ICopyPasteService } from "./copyPasteService/ICopyPasteService.js";
23
23
  import { IDesignerPointerExtensionProvider } from "../widgets/designerView/extensions/pointerExtensions/IDesignerPointerExtensionProvider.js";
24
24
  import { IModelCommandService } from "./modelCommandService/IModelCommandService.js";
25
- import { IDesignViewConfigButtonsProvider } from "../widgets/designerView/IDesignViewConfigButtonsProvider.js";
25
+ import { IDesignViewConfigButtonsProvider } from "../widgets/designerView/extensions/buttons/IDesignViewConfigButtonsProvider.js";
26
26
  import { IDemoProviderService } from "./demoProviderService/IDemoProviderService.js";
27
27
  import { IBindableObjectsService } from "./bindableObjectsService/IBindableObjectsService.js";
28
28
  import { IBindableObjectDragDropService } from "./bindableObjectsService/IBindableObjectDragDropService.js";
@@ -3,9 +3,9 @@ export const positionsJsonMime = 'web text/positions';
3
3
  export class CopyPasteService {
4
4
  async copyItems(designItems) {
5
5
  const copyText = DomConverter.ConvertToString(designItems, null, false);
6
- const positions = designItems.map(x => x.instanceServiceContainer.designerCanvas.getNormalizedElementCoordinates(x.element));
7
- const data = [new ClipboardItem({ ["text/html"]: new Blob([copyText], { type: 'text/html' }), [positionsJsonMime]: new Blob([JSON.stringify(positions)], { type: positionsJsonMime }) })];
8
6
  try {
7
+ const positions = designItems.map(x => x.instanceServiceContainer.designerCanvas.getNormalizedElementCoordinates(x.element));
8
+ const data = [new ClipboardItem({ ["text/html"]: new Blob([copyText], { type: 'text/html' }), [positionsJsonMime]: new Blob([JSON.stringify(positions)], { type: positionsJsonMime }) })];
9
9
  await navigator.clipboard.write(data);
10
10
  }
11
11
  catch (err) {
@@ -116,8 +116,8 @@ export class AbstractPropertiesService {
116
116
  if (designItems != null && designItems.length !== 0) {
117
117
  if (property.propertyType == PropertyType.cssValue) {
118
118
  let lastValue = designItems[0].getStyle(property.name);
119
- for (const x of designItems) {
120
- let value = x.getStyle(property.name);
119
+ for (const d of designItems) {
120
+ let value = d.getStyle(property.name);
121
121
  if (value != lastValue) {
122
122
  lastValue = null;
123
123
  break;
@@ -4,6 +4,7 @@ import { RefreshMode } from '../IPropertiesService.js';
4
4
  import { IPropertyGroup } from '../IPropertyGroup.js';
5
5
  import { IStyleDeclaration, IStyleRule } from '../../stylesheetService/IStylesheetService.js';
6
6
  import { CommonPropertiesService } from './CommonPropertiesService.js';
7
+ import { ValueType } from '../ValueType.js';
7
8
  export declare class CssCurrentPropertiesService extends CommonPropertiesService {
8
9
  getRefreshMode(designItem: IDesignItem): RefreshMode;
9
10
  constructor();
@@ -14,4 +15,16 @@ export declare class CssCurrentPropertiesService extends CommonPropertiesService
14
15
  styleRule: IStyleRule;
15
16
  styleDeclaration: IStyleDeclaration;
16
17
  }), value: any): void;
18
+ clearValue(designItems: IDesignItem[], property: IProperty & {
19
+ styleRule: IStyleRule;
20
+ styleDeclaration: IStyleDeclaration;
21
+ }): void;
22
+ getValue(designItems: IDesignItem[], property: IProperty & {
23
+ styleRule: IStyleRule;
24
+ styleDeclaration: IStyleDeclaration;
25
+ }): any;
26
+ isSet(designItems: IDesignItem[], property: IProperty & {
27
+ styleRule: IStyleRule;
28
+ styleDeclaration: IStyleDeclaration;
29
+ }): ValueType;
17
30
  }
@@ -2,6 +2,8 @@ import { PropertyType } from '../PropertyType.js';
2
2
  import { RefreshMode } from '../IPropertiesService.js';
3
3
  import { CommonPropertiesService } from './CommonPropertiesService.js';
4
4
  import cssProperties from './CssProperties.json' assert { type: 'json' };
5
+ import { ValueType } from '../ValueType.js';
6
+ const localName = '&lt;local&gt;';
5
7
  export class CssCurrentPropertiesService extends CommonPropertiesService {
6
8
  getRefreshMode(designItem) {
7
9
  return RefreshMode.fullOnValueChange;
@@ -21,7 +23,7 @@ export class CssCurrentPropertiesService extends CommonPropertiesService {
21
23
  return [];
22
24
  let styles = designItem.getAllStyles();
23
25
  let arr = styles.map(x => ({
24
- name: x.selector ?? '&lt;local&gt;', description: x.stylesheetName ?? '', properties: [
26
+ name: x.selector ?? localName, description: x.stylesheetName ?? '', properties: [
25
27
  ...x.declarations.map(y => ({
26
28
  name: y.name,
27
29
  renamable: true,
@@ -50,4 +52,25 @@ export class CssCurrentPropertiesService extends CommonPropertiesService {
50
52
  // Local style
51
53
  super.setValue(designItems, { ...property, propertyType: PropertyType.cssValue }, value);
52
54
  }
55
+ clearValue(designItems, property) {
56
+ if (property.styleRule?.selector !== null && property.styleDeclaration) {
57
+ designItems[0].instanceServiceContainer.stylesheetService.removeDeclarationFromRule(property.styleRule, property.styleDeclaration);
58
+ return;
59
+ }
60
+ super.clearValue(designItems, property);
61
+ }
62
+ getValue(designItems, property) {
63
+ if (property.styleRule?.selector && property.styleDeclaration)
64
+ return property.styleDeclaration.value;
65
+ return super.getValue(designItems, property);
66
+ }
67
+ isSet(designItems, property) {
68
+ if (property.styleRule?.selector && property.styleDeclaration) {
69
+ if (designItems[0].hasStyle(property.name))
70
+ return ValueType.none;
71
+ //TODO: we need to check if this is the dec. with the highest specifity
72
+ return ValueType.all;
73
+ }
74
+ return super.isSet(designItems, property);
75
+ }
53
76
  }
@@ -10,7 +10,7 @@ export class CssToolsStylesheetService {
10
10
  for (let stylesheet of stylesheets) {
11
11
  this._stylesheets.set(stylesheet.name, {
12
12
  stylesheet: stylesheet,
13
- ast: tools.parse(stylesheet.stylesheet)
13
+ ast: tools.parse(stylesheet.content)
14
14
  });
15
15
  }
16
16
  this.stylesheetsChanged.emit();
@@ -11,7 +11,7 @@ export class CssTreeStylesheetService {
11
11
  for (let stylesheet of stylesheets) {
12
12
  this._stylesheets.set(stylesheet.name, {
13
13
  stylesheet: stylesheet,
14
- ast: window.csstree.toPlainObject((window.csstree.parse(stylesheet.stylesheet, { positions: true, parseValue: false })))
14
+ ast: window.csstree.toPlainObject((window.csstree.parse(stylesheet.content, { positions: true, parseValue: false })))
15
15
  });
16
16
  }
17
17
  this.stylesheetsChanged.emit();
@@ -34,7 +34,7 @@ export class CssTreeStylesheetService {
34
34
  for (let item of this._stylesheets) {
35
35
  if (!item[1].ast || !this.astHasChildren(item[1].ast))
36
36
  continue;
37
- styles = styles.concat(Array.from(this.rulesFromAST(item[1].ast, item[1].stylesheet.stylesheet, item[0], designItem)));
37
+ styles = styles.concat(Array.from(this.rulesFromAST(item[1].ast, item[1].stylesheet.content, item[0], designItem)));
38
38
  }
39
39
  ;
40
40
  return styles;
@@ -89,17 +89,21 @@ export class CssTreeStylesheetService {
89
89
  }
90
90
  /* Section covers the update of rules and declarations */
91
91
  updateDeclarationWithDeclaration(declaration, value, important) {
92
- declaration.ast.value = window.csstree.toPlainObject(window.csstree.parse(declaration.name + ": " + value, { context: 'declaration', parseValue: false })).value;
93
- this._stylesheets.get(declaration.parent.stylesheetName).stylesheet.stylesheet = window.csstree.generate(window.csstree.fromPlainObject(this._stylesheets.get(declaration.parent.stylesheetName).ast));
94
- this._stylesheets.get(declaration.parent.stylesheetName).ast = window.csstree.toPlainObject(window.csstree.fromPlainObject(this._stylesheets.get(declaration.parent.stylesheetName).ast));
95
- this.stylesheetChanged.emit({ stylesheet: this._stylesheets.get(declaration.parent.stylesheetName).stylesheet });
92
+ let sourceNode = this._stylesheets.get(declaration.parent.stylesheetName);
93
+ declaration.ast.value = window.csstree.toPlainObject(window.csstree.parse(declaration.name + ": " + value + (important ? " !important" : ""), { context: 'declaration', parseValue: false })).value;
94
+ sourceNode.stylesheet.content = window.csstree.generate(window.csstree.fromPlainObject(sourceNode.ast));
95
+ // After generating the stylesheet, the AST has to be transformed back into a plain object
96
+ sourceNode.ast = window.csstree.toPlainObject(sourceNode.ast);
97
+ this.stylesheetChanged.emit({ stylesheet: sourceNode.stylesheet });
96
98
  return true;
97
99
  }
98
100
  insertDeclarationIntoRule(rule, declaration, important) {
99
- rule.ast.block.children.push(window.csstree.toPlainObject(window.csstree.parse(declaration.name + ": " + declaration.value + (declaration.important ? "!important" : ""), { context: 'declaration', parseValue: false })));
100
- this._stylesheets.get(rule.stylesheetName).stylesheet.stylesheet = window.csstree.generate(window.csstree.fromPlainObject(this._stylesheets.get(rule.stylesheetName).ast));
101
- this._stylesheets.get(rule.stylesheetName).ast = window.csstree.toPlainObject(window.csstree.fromPlainObject(this._stylesheets.get(rule.stylesheetName).ast));
102
- this.stylesheetChanged.emit({ stylesheet: this._stylesheets.get(rule.stylesheetName).stylesheet });
101
+ let sourceNode = this._stylesheets.get(rule.stylesheetName);
102
+ rule.ast.block.children.push(window.csstree.toPlainObject(window.csstree.parse(declaration.name + ": " + declaration.value + (declaration.important ? " !important" : ""), { context: 'declaration', parseValue: false })));
103
+ sourceNode.stylesheet.content = window.csstree.generate(window.csstree.fromPlainObject(sourceNode.ast));
104
+ // After generating the stylesheet, the AST has to be transformed back into a plain object
105
+ sourceNode.ast = window.csstree.toPlainObject(sourceNode.ast);
106
+ this.stylesheetChanged.emit({ stylesheet: sourceNode.stylesheet });
103
107
  return true;
104
108
  }
105
109
  removeDeclarationFromRule(rule, declaration) {
@@ -107,7 +111,7 @@ export class CssTreeStylesheetService {
107
111
  if (index == -1)
108
112
  return false;
109
113
  rule.ast.block.children.splice(index, 1);
110
- this._stylesheets.get(rule.stylesheetName).stylesheet.stylesheet = window.csstree.generate(window.csstree.fromPlainObject(this._stylesheets.get(rule.stylesheetName).ast));
114
+ this._stylesheets.get(rule.stylesheetName).stylesheet.content = window.csstree.generate(window.csstree.fromPlainObject(this._stylesheets.get(rule.stylesheetName).ast));
111
115
  this._stylesheets.get(rule.stylesheetName).ast = window.csstree.toPlainObject(window.csstree.fromPlainObject(this._stylesheets.get(rule.stylesheetName).ast));
112
116
  this.stylesheetChanged.emit({ stylesheet: this._stylesheets.get(rule.stylesheetName).stylesheet });
113
117
  return true;
@@ -12,7 +12,7 @@ export interface IStyleDeclaration {
12
12
  important: boolean;
13
13
  }
14
14
  export interface IStylesheet {
15
- stylesheet: string;
15
+ content: string;
16
16
  name: string;
17
17
  }
18
18
  export interface IStylesheetService {
@@ -59,6 +59,7 @@ export declare class DesignerCanvas extends BaseCustomWebComponentLazyAppend imp
59
59
  extensionManager: IExtensionManager;
60
60
  private _pointerextensions;
61
61
  private _onDblClickBound;
62
+ private _lastCopiedPrimaryItem;
62
63
  constructor();
63
64
  get designerWidth(): string;
64
65
  set designerWidth(value: string);
@@ -163,6 +163,7 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
163
163
  extensionManager;
164
164
  _pointerextensions;
165
165
  _onDblClickBound;
166
+ _lastCopiedPrimaryItem;
166
167
  constructor() {
167
168
  super();
168
169
  this._restoreCachedInititalValues();
@@ -219,7 +220,7 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
219
220
  if (this.instanceServiceContainer.stylesheetService) {
220
221
  styles.push(...this.instanceServiceContainer.stylesheetService
221
222
  .getStylesheets()
222
- .map(x => cssFromString(this.buildPatchedStyleSheet([cssFromString(x.stylesheet)]))));
223
+ .map(x => cssFromString(this.buildPatchedStyleSheet([cssFromString(x.content)]))));
223
224
  }
224
225
  this.shadowRoot.adoptedStyleSheets = styles;
225
226
  }
@@ -365,13 +366,14 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
365
366
  this.instanceServiceContainer.selectionService.setSelectedElements(Array.from(this.rootDesignItem.children()));
366
367
  }
367
368
  async handleCopyCommand() {
369
+ this._lastCopiedPrimaryItem = this.instanceServiceContainer.selectionService.primarySelection;
368
370
  await this.serviceContainer.copyPasteService.copyItems(this.instanceServiceContainer.selectionService.selectedElements);
369
371
  }
370
372
  async handlePasteCommand(disableRestoreOfPositions) {
371
373
  const [designItems, positions] = await this.serviceContainer.copyPasteService.getPasteItems(this.serviceContainer, this.instanceServiceContainer);
372
374
  let grp = this.rootDesignItem.openGroup("Insert");
373
375
  let pasteContainer = this.rootDesignItem;
374
- let pCon = this.instanceServiceContainer.selectionService.primarySelection;
376
+ let pCon = this._lastCopiedPrimaryItem?.parent ?? this.instanceServiceContainer.selectionService.primarySelection;
375
377
  while (pCon != null) {
376
378
  const containerStyle = getComputedStyle(pCon.element);
377
379
  let newContainerService;
@@ -420,8 +422,12 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
420
422
  if (undoService)
421
423
  this.instanceServiceContainer.register("undoService", undoService(this));
422
424
  const selectionService = this.serviceContainer.getLastService('selectionService');
423
- if (selectionService)
425
+ if (selectionService) {
424
426
  this.instanceServiceContainer.register("selectionService", selectionService(this));
427
+ this.instanceServiceContainer.selectionService.onSelectionChanged.on(() => {
428
+ this._lastCopiedPrimaryItem = null;
429
+ });
430
+ }
425
431
  this.rootDesignItem = DesignItem.GetOrCreateDesignItem(this._canvas, this.serviceContainer, this.instanceServiceContainer);
426
432
  const contentService = this.serviceContainer.getLastService('contentService');
427
433
  if (contentService)
@@ -310,7 +310,7 @@ export class GridExtension extends AbstractExtension {
310
310
  _convertCssUnit(cssValue, target, percentTarget, unit) {
311
311
  if (unit == "fr") {
312
312
  let containerSize = convertCssUnitToPixel(target.style.width, target, percentTarget);
313
- let amountGaps = percentTarget == "width" ? this.gridInformation.cells.length - 1 : this.gridInformation.cells[0].length - 1;
313
+ let amountGaps = percentTarget == "height" ? this.gridInformation.cells.length - 1 : this.gridInformation.cells[0].length - 1;
314
314
  let gapSize = convertCssUnitToPixel(percentTarget == "width" ? target.style.columnGap : target.style.rowGap, target, percentTarget);
315
315
  let containerSizeWithoutGaps = containerSize - gapSize * amountGaps;
316
316
  let amountFrSizes = 0;
@@ -23,8 +23,9 @@ export class TransformOriginExtension extends AbstractExtension {
23
23
  this._circle.addEventListener(EventNames.PointerDown, event => this.pointerEvent(event));
24
24
  this._circle.addEventListener(EventNames.PointerMove, event => this.pointerEvent(event));
25
25
  this._circle.addEventListener(EventNames.PointerUp, event => this.pointerEvent(event)); //TODO: -> assign to window
26
- if (this.extendedItem.getStyle('transform-origin')) {
27
- this._oldValue = this.extendedItem.getStyle('transform-origin');
26
+ let old = this.extendedItem.getStyleFromSheetOrLocal('transform-origin');
27
+ if (old) {
28
+ this._oldValue = old;
28
29
  }
29
30
  }
30
31
  pointerEvent(event) {
@@ -69,14 +70,14 @@ export class TransformOriginExtension extends AbstractExtension {
69
70
  if (oldSplit.length > 1) {
70
71
  newYs = convertCssUnit(newY, this.extendedItem.element, 'height', getCssUnit(oldSplit[1]));
71
72
  }
72
- this.extendedItem.setStyle('transform-origin', newXs + ' ' + newYs);
73
+ this.extendedItem.updateStyleInSheetOrLocal('transform-origin', newXs + ' ' + newYs);
73
74
  }
74
75
  catch (err) {
75
- this.extendedItem.setStyle('transform-origin', newX + 'px' + ' ' + newY + 'px');
76
+ this.extendedItem.updateStyleInSheetOrLocal('transform-origin', newX + 'px' + ' ' + newY + 'px');
76
77
  }
77
78
  }
78
79
  else
79
- this.extendedItem.setStyle('transform-origin', newX + 'px' + ' ' + newY + 'px');
80
+ this.extendedItem.updateStyleInSheetOrLocal('transform-origin', newX + 'px' + ' ' + newY + 'px');
80
81
  this.refresh();
81
82
  this._startPos = null;
82
83
  }
@@ -0,0 +1,12 @@
1
+ import { IContextMenuItem } from "../../../../helper/contextMenu/IContextMenuItem.js";
2
+ import { DesignerView } from "../../designerView.js";
3
+ import { IDesignerCanvas } from '../../IDesignerCanvas.js';
4
+ import { IDesignViewConfigButtonsProvider } from "./IDesignViewConfigButtonsProvider.js";
5
+ export declare class AbstractDesignViewConfigButton implements IDesignViewConfigButtonsProvider {
6
+ protected settingName: any;
7
+ private content;
8
+ private tooltp;
9
+ private contextmenu;
10
+ constructor(settingName: string, content: string | HTMLElement, tooltip: string, contextmenu?: IContextMenuItem[]);
11
+ provideButtons(designerView: DesignerView, designerCanvas: IDesignerCanvas): HTMLElement[];
12
+ }
@@ -0,0 +1,40 @@
1
+ import { ContextMenu } from "../../../../helper/contextMenu/ContextMenu.js";
2
+ export class AbstractDesignViewConfigButton {
3
+ settingName;
4
+ content;
5
+ tooltp;
6
+ contextmenu;
7
+ constructor(settingName, content, tooltip, contextmenu) {
8
+ this.settingName = settingName;
9
+ this.content = content;
10
+ this.tooltp = tooltip;
11
+ this.contextmenu = contextmenu;
12
+ }
13
+ provideButtons(designerView, designerCanvas) {
14
+ const btn = document.createElement('div');
15
+ if (typeof this.content == 'string')
16
+ btn.innerHTML = this.content;
17
+ else
18
+ btn.appendChild(this.content);
19
+ btn.title = this.tooltp;
20
+ btn.className = 'toolbar-control';
21
+ const extensionOptions = designerCanvas.instanceServiceContainer.designContext.extensionOptions;
22
+ if (extensionOptions[this.settingName] !== false)
23
+ btn.classList.add('selected');
24
+ btn.onclick = () => {
25
+ const val = extensionOptions[this.settingName];
26
+ extensionOptions[this.settingName] = val === false ? true : false;
27
+ if (extensionOptions[this.settingName] !== false)
28
+ btn.classList.add('selected');
29
+ else
30
+ btn.classList.remove('selected');
31
+ };
32
+ btn.oncontextmenu = (e) => {
33
+ e.preventDefault();
34
+ if (this.contextmenu) {
35
+ ContextMenu.show(this.contextmenu, e);
36
+ }
37
+ };
38
+ return [btn];
39
+ }
40
+ }
@@ -0,0 +1,8 @@
1
+ import { DesignerView } from "../../designerView.js";
2
+ import { IDesignerCanvas } from "../../IDesignerCanvas.js";
3
+ import { IDesignViewConfigButtonsProvider } from "./IDesignViewConfigButtonsProvider.js";
4
+ export declare class ButtonSeperatorProvider implements IDesignViewConfigButtonsProvider {
5
+ _space: number;
6
+ constructor(space: number);
7
+ provideButtons(designerView: DesignerView, designerCanvas: IDesignerCanvas): HTMLElement[];
8
+ }
@@ -0,0 +1,11 @@
1
+ export class ButtonSeperatorProvider {
2
+ _space;
3
+ constructor(space) {
4
+ this._space = space;
5
+ }
6
+ provideButtons(designerView, designerCanvas) {
7
+ const div = document.createElement('div');
8
+ div.style.marginLeft = this._space + 'px';
9
+ return [div];
10
+ }
11
+ }
@@ -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 FlexboxExtensionDesignViewConfigButtons implements IDesignViewConfigButtonsProvider {
5
+ provideButtons(designerView: DesignerView, designerCanvas: IDesignerCanvas): HTMLElement[];
6
+ }
@@ -0,0 +1,22 @@
1
+ import { flexboxExtensionShowOverlayOptionName } from "../FlexboxExtensionProvider.js";
2
+ export class FlexboxExtensionDesignViewConfigButtons {
3
+ provideButtons(designerView, designerCanvas) {
4
+ const extensionOptions = designerCanvas.instanceServiceContainer.designContext.extensionOptions;
5
+ const btn = document.createElement('div');
6
+ btn.innerText = 'F';
7
+ btn.title = 'show flexbox overlay';
8
+ btn.className = 'toolbar-control';
9
+ if (extensionOptions[flexboxExtensionShowOverlayOptionName] !== false)
10
+ btn.classList.add('selected');
11
+ btn.onclick = () => {
12
+ const val = extensionOptions[flexboxExtensionShowOverlayOptionName];
13
+ extensionOptions[flexboxExtensionShowOverlayOptionName] = val === false ? true : false;
14
+ if (extensionOptions[flexboxExtensionShowOverlayOptionName] !== 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,6 @@
1
+ import { DesignerView } from "../../designerView.js";
2
+ import { IDesignerCanvas } from '../../IDesignerCanvas.js';
3
+ import { IDesignViewConfigButtonsProvider } from "./IDesignViewConfigButtonsProvider.js";
4
+ export declare class GridExtensionDesignViewConfigButtons implements IDesignViewConfigButtonsProvider {
5
+ provideButtons(designerView: DesignerView, designerCanvas: IDesignerCanvas): HTMLElement[];
6
+ }
@@ -0,0 +1,22 @@
1
+ import { gridExtensionShowOverlayOptionName } from "../GridExtensionProvider.js";
2
+ export class GridExtensionDesignViewConfigButtons {
3
+ provideButtons(designerView, designerCanvas) {
4
+ const extensionOptions = designerCanvas.instanceServiceContainer.designContext.extensionOptions;
5
+ const btn = document.createElement('div');
6
+ btn.innerText = 'G';
7
+ btn.title = 'show grid overlay';
8
+ btn.className = 'toolbar-control';
9
+ if (extensionOptions[gridExtensionShowOverlayOptionName] !== false)
10
+ btn.classList.add('selected');
11
+ btn.onclick = () => {
12
+ const val = extensionOptions[gridExtensionShowOverlayOptionName];
13
+ extensionOptions[gridExtensionShowOverlayOptionName] = val === false ? true : false;
14
+ if (extensionOptions[gridExtensionShowOverlayOptionName] !== 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,5 @@
1
+ import { DesignerView } from "../../designerView.js";
2
+ import { IDesignerCanvas } from "../../IDesignerCanvas.js";
3
+ export interface IDesignViewConfigButtonsProvider {
4
+ provideButtons(designerView: DesignerView, designerCanvas: IDesignerCanvas): HTMLElement[];
5
+ }
@@ -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,7 @@
1
+ import { DesignerView } from "../../designerView.js";
2
+ import { IDesignerCanvas } from '../../IDesignerCanvas.js';
3
+ import { IDesignViewConfigButtonsProvider } from "../../IDesignViewConfigButtonsProvider.js";
4
+ export declare const disableStylesheetService = "disableStylesheetService";
5
+ export declare class StylesheetServiceDesignViewConfigButtons implements IDesignViewConfigButtonsProvider {
6
+ provideButtons(designerView: DesignerView, designerCanvas: IDesignerCanvas): HTMLElement[];
7
+ }
@@ -0,0 +1,21 @@
1
+ export const disableStylesheetService = 'disableStylesheetService';
2
+ export class StylesheetServiceDesignViewConfigButtons {
3
+ provideButtons(designerView, designerCanvas) {
4
+ const extensionOptions = designerCanvas.instanceServiceContainer.designContext.extensionOptions;
5
+ const btn = document.createElement('div');
6
+ btn.innerText = 'G';
7
+ btn.title = 'show grid overlay';
8
+ btn.className = 'toolbar-control';
9
+ if (extensionOptions[disableStylesheetService] !== false)
10
+ btn.classList.add('selected');
11
+ btn.onclick = () => {
12
+ const val = extensionOptions[disableStylesheetService];
13
+ extensionOptions[disableStylesheetService] = val === false ? true : false;
14
+ if (extensionOptions[disableStylesheetService] !== false)
15
+ btn.classList.add('selected');
16
+ else
17
+ btn.classList.remove('selected');
18
+ };
19
+ return [btn];
20
+ }
21
+ }
@@ -0,0 +1,5 @@
1
+ import { AbstractDesignViewConfigButton } from "./AbstractDesignViewConfigButton.js";
2
+ export declare const enableStylesheetService = "enableStylesheetService";
3
+ export declare class StylesheetServiceDesignViewConfigButtons extends AbstractDesignViewConfigButton {
4
+ constructor();
5
+ }
@@ -0,0 +1,7 @@
1
+ import { AbstractDesignViewConfigButton } from "./AbstractDesignViewConfigButton.js";
2
+ export const enableStylesheetService = 'enableStylesheetService';
3
+ export class StylesheetServiceDesignViewConfigButtons extends AbstractDesignViewConfigButton {
4
+ constructor() {
5
+ super(enableStylesheetService, "ss", "modify Stylesheet");
6
+ }
7
+ }
package/dist/index.d.ts CHANGED
@@ -167,7 +167,6 @@ export * from "./elements/widgets/designerView/extensions/CanvasExtensionProvide
167
167
  export * from "./elements/widgets/designerView/extensions/ExtensionManager.js";
168
168
  export * from "./elements/widgets/designerView/extensions/FlexboxExtension.js";
169
169
  export * from "./elements/widgets/designerView/extensions/FlexboxExtensionProvider.js";
170
- export * from "./elements/widgets/designerView/extensions/FlexboxExtensionDesignViewConfigButtons.js";
171
170
  export * from "./elements/widgets/designerView/extensions/GrayOutExtension.js";
172
171
  export * from "./elements/widgets/designerView/extensions/GrayOutExtensionProvider.js";
173
172
  export * from "./elements/widgets/designerView/extensions/GrayOutDragOverContainerExtension.js";
@@ -176,7 +175,6 @@ export * from "./elements/widgets/designerView/extensions/GridExtension.js";
176
175
  export * from "./elements/widgets/designerView/extensions/GridExtensionProvider.js";
177
176
  export * from "./elements/widgets/designerView/extensions/InvisibleElementExtension.js";
178
177
  export * from "./elements/widgets/designerView/extensions/InvisibleElementExtensionProvider.js";
179
- export * from "./elements/widgets/designerView/extensions/InvisibleElementExtensionDesignViewConfigButtons.js";
180
178
  export * from "./elements/widgets/designerView/extensions/HighlightElementExtension.js";
181
179
  export * from "./elements/widgets/designerView/extensions/HighlightElementExtensionProvider.js";
182
180
  export * from "./elements/widgets/designerView/extensions/svg/PathExtension.js";
@@ -193,6 +191,13 @@ export * from "./elements/widgets/designerView/extensions/SelectionDefaultExtens
193
191
  export * from "./elements/widgets/designerView/extensions/SelectionDefaultExtensionProvider.js";
194
192
  export * from "./elements/widgets/designerView/extensions/TransformOriginExtension.js";
195
193
  export * from "./elements/widgets/designerView/extensions/TransformOriginExtensionProvider.js";
194
+ export * from "./elements/widgets/designerView/extensions/buttons/InvisibleElementExtensionDesignViewConfigButtons.js";
195
+ export * from "./elements/widgets/designerView/extensions/buttons/FlexboxExtensionDesignViewConfigButtons.js";
196
+ export * from "./elements/widgets/designerView/extensions/buttons/GridExtensionDesignViewConfigButtons.js";
197
+ export * from "./elements/widgets/designerView/extensions/buttons/AbstractDesignViewConfigButton.js";
198
+ export * from "./elements/widgets/designerView/extensions/buttons/ButtonSeperatorProvider.js";
199
+ export * from "./elements/widgets/designerView/extensions/buttons/StylesheetServiceDesignViewConfigButtons.js";
200
+ export type { IDesignViewConfigButtonsProvider } from "./elements/widgets/designerView/extensions/buttons/IDesignViewConfigButtonsProvider";
196
201
  export * from "./elements/widgets/designerView/extensions/EditText/EditTextExtension.js";
197
202
  export * from "./elements/widgets/designerView/extensions/EditText/EditTextExtensionProvider.js";
198
203
  export * from "./elements/widgets/designerView/extensions/EditText/EditTextWithStyloExtension.js";
package/dist/index.js CHANGED
@@ -122,7 +122,6 @@ export * from "./elements/widgets/designerView/extensions/CanvasExtensionProvide
122
122
  export * from "./elements/widgets/designerView/extensions/ExtensionManager.js";
123
123
  export * from "./elements/widgets/designerView/extensions/FlexboxExtension.js";
124
124
  export * from "./elements/widgets/designerView/extensions/FlexboxExtensionProvider.js";
125
- export * from "./elements/widgets/designerView/extensions/FlexboxExtensionDesignViewConfigButtons.js";
126
125
  export * from "./elements/widgets/designerView/extensions/GrayOutExtension.js";
127
126
  export * from "./elements/widgets/designerView/extensions/GrayOutExtensionProvider.js";
128
127
  export * from "./elements/widgets/designerView/extensions/GrayOutDragOverContainerExtension.js";
@@ -131,7 +130,6 @@ export * from "./elements/widgets/designerView/extensions/GridExtension.js";
131
130
  export * from "./elements/widgets/designerView/extensions/GridExtensionProvider.js";
132
131
  export * from "./elements/widgets/designerView/extensions/InvisibleElementExtension.js";
133
132
  export * from "./elements/widgets/designerView/extensions/InvisibleElementExtensionProvider.js";
134
- export * from "./elements/widgets/designerView/extensions/InvisibleElementExtensionDesignViewConfigButtons.js";
135
133
  export * from "./elements/widgets/designerView/extensions/HighlightElementExtension.js";
136
134
  export * from "./elements/widgets/designerView/extensions/HighlightElementExtensionProvider.js";
137
135
  export * from "./elements/widgets/designerView/extensions/svg/PathExtension.js";
@@ -148,6 +146,12 @@ export * from "./elements/widgets/designerView/extensions/SelectionDefaultExtens
148
146
  export * from "./elements/widgets/designerView/extensions/SelectionDefaultExtensionProvider.js";
149
147
  export * from "./elements/widgets/designerView/extensions/TransformOriginExtension.js";
150
148
  export * from "./elements/widgets/designerView/extensions/TransformOriginExtensionProvider.js";
149
+ export * from "./elements/widgets/designerView/extensions/buttons/InvisibleElementExtensionDesignViewConfigButtons.js";
150
+ export * from "./elements/widgets/designerView/extensions/buttons/FlexboxExtensionDesignViewConfigButtons.js";
151
+ export * from "./elements/widgets/designerView/extensions/buttons/GridExtensionDesignViewConfigButtons.js";
152
+ export * from "./elements/widgets/designerView/extensions/buttons/AbstractDesignViewConfigButton.js";
153
+ export * from "./elements/widgets/designerView/extensions/buttons/ButtonSeperatorProvider.js";
154
+ export * from "./elements/widgets/designerView/extensions/buttons/StylesheetServiceDesignViewConfigButtons.js";
151
155
  export * from "./elements/widgets/designerView/extensions/EditText/EditTextExtension.js";
152
156
  export * from "./elements/widgets/designerView/extensions/EditText/EditTextExtensionProvider.js";
153
157
  export * from "./elements/widgets/designerView/extensions/EditText/EditTextWithStyloExtension.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.171",
4
+ "version": "0.0.173",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "author": "",