@node-projects/web-component-designer 0.0.193 → 0.0.196
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.
- package/README.md +1 -2
- package/dist/elements/helper/CssUnitConverter.js +1 -1
- package/dist/elements/services/DefaultServiceBootstrap.js +8 -5
- package/dist/elements/widgets/designerView/designerCanvas.js +8 -8
- package/dist/elements/widgets/designerView/extensions/buttons/GridExtensionDesignViewConfigButtons.js +1 -1
- package/dist/elements/widgets/designerView/extensions/grid/DisplayGridExtension.d.ts +14 -0
- package/dist/elements/widgets/designerView/extensions/grid/DisplayGridExtension.js +47 -0
- package/dist/elements/widgets/designerView/extensions/grid/DisplayGridExtensionProvider.d.ts +11 -0
- package/dist/elements/widgets/designerView/extensions/grid/DisplayGridExtensionProvider.js +22 -0
- package/dist/elements/widgets/designerView/extensions/grid/EditGridExtension.d.ts +51 -0
- package/dist/elements/widgets/designerView/extensions/grid/EditGridExtension.js +346 -0
- package/dist/elements/widgets/designerView/extensions/grid/EditGridExtensionProvider.d.ts +10 -0
- package/dist/elements/widgets/designerView/extensions/grid/EditGridExtensionProvider.js +22 -0
- package/dist/elements/widgets/designerView/extensions/grid/GridExtension copy.d.ts +51 -0
- package/dist/elements/widgets/designerView/extensions/grid/GridExtension copy.js +346 -0
- package/dist/elements/widgets/designerView/extensions/grid/GridExtension.d.ts +51 -0
- package/dist/elements/widgets/designerView/extensions/grid/GridExtension.js +346 -0
- package/dist/elements/widgets/designerView/extensions/grid/GridExtensionProvider copy.d.ts +11 -0
- package/dist/elements/widgets/designerView/extensions/grid/GridExtensionProvider copy.js +22 -0
- package/dist/elements/widgets/designerView/extensions/grid/GridExtensionProvider.d.ts +11 -0
- package/dist/elements/widgets/designerView/extensions/grid/GridExtensionProvider.js +22 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.js +4 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -72,12 +72,11 @@ We have 2 tree components. One independent and one feature rich which uses Fancy
|
|
|
72
72
|
|
|
73
73
|
## DragDrop
|
|
74
74
|
|
|
75
|
-
If you'd like to use the designer on mobile, you need the mobile-drag-drop npm library
|
|
75
|
+
If you'd like to use the designer on mobile, you need the mobile-drag-drop npm library.
|
|
76
76
|
Your index.html should be extended as follows:
|
|
77
77
|
|
|
78
78
|
<link rel="stylesheet" href="/node_modules/mobile-drag-drop/default.css">
|
|
79
79
|
<script src="/node_modules/mobile-drag-drop/index.js"></script>
|
|
80
|
-
<script src="/node_modules/@node-projects/web-component-designer/dist/polyfill/mobileDragDrop.js"></script>
|
|
81
80
|
|
|
82
81
|
## Copyright notice
|
|
83
82
|
|
|
@@ -24,7 +24,7 @@ export function convertCssUnitToPixel(cssValue, target, percentTarget) {
|
|
|
24
24
|
'rlh': value => value * parseFloat(getComputedStyle(document.documentElement).lineHeight),
|
|
25
25
|
'%': value => value / 100 * (percentTarget == 'height' ? target.getBoundingClientRect().height : target.getBoundingClientRect().width),
|
|
26
26
|
/* todo
|
|
27
|
-
//find parent with computed style where
|
|
27
|
+
//find parent with computed style where container-type is inline-size or size (regarding to query type)
|
|
28
28
|
//use this size for calculation
|
|
29
29
|
'cqw':
|
|
30
30
|
'cqh':
|
|
@@ -11,7 +11,6 @@ import { DefaultHtmlParserService } from './htmlParserService/DefaultHtmlParserS
|
|
|
11
11
|
import { Lit2PropertiesService } from './propertiesService/services/Lit2PropertiesService.js';
|
|
12
12
|
import { ExtensionType } from '../widgets/designerView/extensions/ExtensionType.js';
|
|
13
13
|
import { ElementDragTitleExtensionProvider } from '../widgets/designerView/extensions/ElementDragTitleExtensionProvider.js';
|
|
14
|
-
import { GridExtensionProvider } from '../widgets/designerView/extensions/GridExtensionProvider.js';
|
|
15
14
|
import { TransformOriginExtensionProvider } from '../widgets/designerView/extensions/TransformOriginExtensionProvider.js';
|
|
16
15
|
import { CanvasExtensionProvider } from '../widgets/designerView/extensions/CanvasExtensionProvider.js';
|
|
17
16
|
import { PositionExtensionProvider } from '../widgets/designerView/extensions/PositionExtensionProvider.js';
|
|
@@ -77,6 +76,8 @@ import { SelectionService } from './selectionService/SelectionService.js';
|
|
|
77
76
|
import { ContentService } from './contentService/ContentService.js';
|
|
78
77
|
import { StylesheetServiceDesignViewConfigButtons } from '../widgets/designerView/extensions/buttons/StylesheetServiceDesignViewConfigButtons.js';
|
|
79
78
|
import { JumpToElementContextMenu } from '../widgets/designerView/extensions/contextMenu/JumpToElementContextMenu.js';
|
|
79
|
+
import { EditGridExtensionProvider } from '../widgets/designerView/extensions/grid/EditGridExtensionProvider.js';
|
|
80
|
+
import { DisplayGridExtensionProvider } from '../widgets/designerView/extensions/grid/DisplayGridExtensionProvider.js';
|
|
80
81
|
export function createDefaultServiceContainer() {
|
|
81
82
|
let serviceContainer = new ServiceContainer();
|
|
82
83
|
serviceContainer.register("propertyService", new PolymerPropertiesService());
|
|
@@ -110,7 +111,7 @@ export function createDefaultServiceContainer() {
|
|
|
110
111
|
]);
|
|
111
112
|
serviceContainer.designerExtensions.set(ExtensionType.PrimarySelection, [
|
|
112
113
|
new ElementDragTitleExtensionProvider(),
|
|
113
|
-
new
|
|
114
|
+
new EditGridExtensionProvider(),
|
|
114
115
|
new FlexboxExtensionProvider(),
|
|
115
116
|
new TransformOriginExtensionProvider(),
|
|
116
117
|
new CanvasExtensionProvider(),
|
|
@@ -126,7 +127,7 @@ export function createDefaultServiceContainer() {
|
|
|
126
127
|
new SelectionDefaultExtensionProvider()
|
|
127
128
|
]);
|
|
128
129
|
serviceContainer.designerExtensions.set(ExtensionType.PrimarySelectionContainer, [
|
|
129
|
-
new
|
|
130
|
+
new EditGridExtensionProvider(),
|
|
130
131
|
new FlexboxExtensionProvider()
|
|
131
132
|
]);
|
|
132
133
|
serviceContainer.designerExtensions.set(ExtensionType.MouseOver, [
|
|
@@ -140,10 +141,12 @@ export function createDefaultServiceContainer() {
|
|
|
140
141
|
]);
|
|
141
142
|
serviceContainer.designerExtensions.set(ExtensionType.ContainerDragOver, [
|
|
142
143
|
new GrayOutDragOverContainerExtensionProvider(),
|
|
143
|
-
new AltToEnterContainerExtensionProvider()
|
|
144
|
+
new AltToEnterContainerExtensionProvider(),
|
|
145
|
+
new DisplayGridExtensionProvider()
|
|
144
146
|
]);
|
|
145
147
|
serviceContainer.designerExtensions.set(ExtensionType.ContainerExternalDragOver, [
|
|
146
|
-
new GrayOutDragOverContainerExtensionProvider()
|
|
148
|
+
new GrayOutDragOverContainerExtensionProvider(),
|
|
149
|
+
new DisplayGridExtensionProvider()
|
|
147
150
|
]);
|
|
148
151
|
serviceContainer.designerExtensions.set(ExtensionType.Doubleclick, [
|
|
149
152
|
new EditTextExtensionProvider()
|
|
@@ -677,19 +677,17 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
|
|
|
677
677
|
let [newContainer] = this._getPossibleContainerForDrop(event);
|
|
678
678
|
if (!newContainer)
|
|
679
679
|
newContainer = this.rootDesignItem;
|
|
680
|
-
let pos = this.getNormalizedElementCoordinates(newContainer.element);
|
|
681
680
|
this._fillCalculationrects();
|
|
682
|
-
const position = this.getNormalizedEventCoordinates(event);
|
|
683
681
|
//TODO : we need to use container service for adding to element, so also grid and flexbox work correct
|
|
684
682
|
const transferData = event.dataTransfer.getData(dragDropFormatNameElementDefinition);
|
|
685
683
|
const elementDefinition = JSON.parse(transferData);
|
|
686
684
|
const di = await this.serviceContainer.forSomeServicesTillResult("instanceService", (service) => service.getElement(elementDefinition, this.serviceContainer, this.instanceServiceContainer));
|
|
687
685
|
const grp = di.openGroup("Insert of <" + di.name + ">");
|
|
688
686
|
di.setStyle('position', 'absolute');
|
|
689
|
-
di.setStyle('left', (position.x - pos.x) + 'px');
|
|
690
|
-
di.setStyle('top', (position.y - pos.y) + 'px');
|
|
691
687
|
const containerService = this.serviceContainer.getLastServiceWhere('containerService', x => x.serviceForContainer(newContainer, getComputedStyle(newContainer.element)));
|
|
692
688
|
containerService.enterContainer(newContainer, [di]);
|
|
689
|
+
containerService.place(event, this, newContainer, { x: 0, y: 0 }, { x: 0, y: 0 }, this.getNormalizedEventCoordinates(event), [di]);
|
|
690
|
+
containerService.finishPlace(event, this, newContainer, { x: 0, y: 0 }, { x: 0, y: 0 }, this.getNormalizedEventCoordinates(event), [di]);
|
|
693
691
|
this.instanceServiceContainer.undoService.execute(new InsertAction(newContainer, newContainer.childCount, di));
|
|
694
692
|
requestAnimationFrame(() => {
|
|
695
693
|
this.instanceServiceContainer.selectionService.setSelectedElements([di]);
|
|
@@ -1017,15 +1015,17 @@ export class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
|
|
|
1017
1015
|
}
|
|
1018
1016
|
if (rule instanceof CSSStyleRule) {
|
|
1019
1017
|
let parts = rule.selectorText.split(',');
|
|
1018
|
+
let sel = "";
|
|
1020
1019
|
for (let p of parts) {
|
|
1021
1020
|
if (p.includes(this.cssprefixConstant)) {
|
|
1022
|
-
|
|
1021
|
+
sel += p;
|
|
1023
1022
|
continue;
|
|
1024
1023
|
}
|
|
1025
|
-
if (
|
|
1026
|
-
|
|
1027
|
-
|
|
1024
|
+
if (sel)
|
|
1025
|
+
sel += ',';
|
|
1026
|
+
sel += this.cssprefixConstant + p.trimStart();
|
|
1028
1027
|
}
|
|
1028
|
+
t += sel;
|
|
1029
1029
|
let cssText = rule.style.cssText;
|
|
1030
1030
|
//bugfix for chrome issue: https://bugs.chromium.org/p/chromium/issues/detail?id=1394353
|
|
1031
1031
|
if (rule.styleMap && rule.styleMap.get('grid-template') && rule.styleMap.get('grid-template').toString().includes('repeat(')) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { gridExtensionShowOverlayOptionName } from "../
|
|
1
|
+
import { gridExtensionShowOverlayOptionName } from "../grid/DisplayGridExtensionProvider.js";
|
|
2
2
|
import { AbstractDesignViewConfigButton } from "./AbstractDesignViewConfigButton.js";
|
|
3
3
|
export class GridExtensionDesignViewConfigButtons extends AbstractDesignViewConfigButton {
|
|
4
4
|
constructor() {
|
|
@@ -0,0 +1,14 @@
|
|
|
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 DisplayGridExtension extends AbstractExtension {
|
|
6
|
+
private _cells;
|
|
7
|
+
private _gaps;
|
|
8
|
+
private gridInformation;
|
|
9
|
+
constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
|
|
10
|
+
extend(): void;
|
|
11
|
+
refresh(): void;
|
|
12
|
+
dispose(): void;
|
|
13
|
+
_initSVGArrays(): void;
|
|
14
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { CalculateGridInformation } from "../../../../helper/GridHelper.js";
|
|
2
|
+
import { AbstractExtension } from '../AbstractExtension.js';
|
|
3
|
+
import { OverlayLayer } from "../OverlayLayer.js";
|
|
4
|
+
export class DisplayGridExtension extends AbstractExtension {
|
|
5
|
+
_cells;
|
|
6
|
+
_gaps;
|
|
7
|
+
gridInformation;
|
|
8
|
+
constructor(extensionManager, designerView, extendedItem) {
|
|
9
|
+
super(extensionManager, designerView, extendedItem);
|
|
10
|
+
}
|
|
11
|
+
extend() {
|
|
12
|
+
this._initSVGArrays();
|
|
13
|
+
this.refresh();
|
|
14
|
+
}
|
|
15
|
+
refresh() {
|
|
16
|
+
this.gridInformation = CalculateGridInformation(this.extendedItem);
|
|
17
|
+
let cells = this.gridInformation.cells;
|
|
18
|
+
if (cells[0][0] && !isNaN(cells[0][0].height) && !isNaN(cells[0][0].width)) {
|
|
19
|
+
if (this.gridInformation.cells.length != this._cells.length || this.gridInformation.cells[0].length != this._cells[0].length)
|
|
20
|
+
this._initSVGArrays();
|
|
21
|
+
//draw gaps
|
|
22
|
+
this.gridInformation.gaps.forEach((gap, i) => {
|
|
23
|
+
this._gaps[i] = this._drawRect(gap.x, gap.y, gap.width, gap.height, 'svg-grid-gap', this._gaps[i], OverlayLayer.Foregorund);
|
|
24
|
+
});
|
|
25
|
+
//draw cells
|
|
26
|
+
cells.forEach((row, i) => {
|
|
27
|
+
row.forEach((cell, j) => {
|
|
28
|
+
this._cells[i][j] = this._drawRect(cell.x, cell.y, cell.width, cell.height, 'svg-grid', this._cells[i][j], OverlayLayer.Background);
|
|
29
|
+
if (cell.name) {
|
|
30
|
+
const text = this._drawText(cell.name, cell.x, cell.y, 'svg-grid-area', null, OverlayLayer.Background);
|
|
31
|
+
text.setAttribute("dominant-baseline", "hanging");
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
dispose() {
|
|
38
|
+
this._removeAllOverlays();
|
|
39
|
+
}
|
|
40
|
+
_initSVGArrays() {
|
|
41
|
+
this._removeAllOverlays();
|
|
42
|
+
this.gridInformation = CalculateGridInformation(this.extendedItem);
|
|
43
|
+
this._cells = new Array(this.gridInformation.cells.length);
|
|
44
|
+
this.gridInformation.cells.forEach((row, i) => this._cells[i] = new Array(row.length));
|
|
45
|
+
this._gaps = new Array(this.gridInformation.gaps.length);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
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 gridExtensionShowOverlayOptionName = "gridExtensionShowOverlay";
|
|
7
|
+
export declare class DisplayGridExtensionProvider implements IDesignerExtensionProvider {
|
|
8
|
+
shouldExtend(extensionManager: IExtensionManager, designerCanvas: IDesignerCanvas, designItem: IDesignItem): boolean;
|
|
9
|
+
getExtension(extensionManager: IExtensionManager, designerCanvas: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
|
|
10
|
+
readonly style: CSSStyleSheet;
|
|
11
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { css } from "@node-projects/base-custom-webcomponent";
|
|
2
|
+
import { DisplayGridExtension } from './DisplayGridExtension.js';
|
|
3
|
+
export const gridExtensionShowOverlayOptionName = 'gridExtensionShowOverlay';
|
|
4
|
+
export class DisplayGridExtensionProvider {
|
|
5
|
+
shouldExtend(extensionManager, designerCanvas, designItem) {
|
|
6
|
+
const display = getComputedStyle(designItem.element).display;
|
|
7
|
+
if (display == 'grid' || display == 'inline-grid')
|
|
8
|
+
return designerCanvas.instanceServiceContainer.designContext.extensionOptions[gridExtensionShowOverlayOptionName] !== false;
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
getExtension(extensionManager, designerCanvas, designItem) {
|
|
12
|
+
return new DisplayGridExtension(extensionManager, designerCanvas, designItem);
|
|
13
|
+
}
|
|
14
|
+
style = css `
|
|
15
|
+
.svg-grid { stroke: orange; stroke-dasharray: 5; fill: #ff944722; }
|
|
16
|
+
.svg-grid-area { font-size: 8px; }
|
|
17
|
+
.svg-grid-gap { stroke: orange; stroke-dasharray: 5; fill: #0000ff22; }
|
|
18
|
+
.svg-grid-resizer { fill: white; stroke: #3899ec; }
|
|
19
|
+
.svg-grid-header { fill: #ff944722; stroke: orange; }
|
|
20
|
+
.svg-grid-plus-sign { stroke: black; }
|
|
21
|
+
`;
|
|
22
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
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 EditGridExtension extends AbstractExtension {
|
|
6
|
+
private _initialPoint;
|
|
7
|
+
private _initialSizes;
|
|
8
|
+
private _cells;
|
|
9
|
+
private _gaps;
|
|
10
|
+
private _headers;
|
|
11
|
+
private _headerTexts;
|
|
12
|
+
private _plusCircles;
|
|
13
|
+
private _resizeCircles;
|
|
14
|
+
private minPixelSize;
|
|
15
|
+
private gridInformation;
|
|
16
|
+
private defaultHeaderSize;
|
|
17
|
+
private defaultPlusSize;
|
|
18
|
+
private defaultDistanceToBox;
|
|
19
|
+
private defaultDistanceBetweenHeaders;
|
|
20
|
+
private defaultSizeOfNewRowOrColumn;
|
|
21
|
+
constructor(extensionManager: IExtensionManager, designerView: IDesignerCanvas, extendedItem: IDesignItem);
|
|
22
|
+
extend(): void;
|
|
23
|
+
refresh(): void;
|
|
24
|
+
dispose(): void;
|
|
25
|
+
_initSVGArrays(): void;
|
|
26
|
+
_drawResizeCircle(gap: any, oldCircle?: SVGCircleElement): SVGCircleElement;
|
|
27
|
+
_drawHeader(cell: any, oldHeader: any, index: any, alignment: "vertical" | "horizontal"): SVGRectElement;
|
|
28
|
+
_drawHeaderText(cell: any, oldHeaderText: any, alignment: "vertical" | "horizontal"): SVGTextElement;
|
|
29
|
+
_drawPlusCircle(x: any, y: any, oldPlusElement: {
|
|
30
|
+
circle: SVGCircleElement;
|
|
31
|
+
verticalLine: SVGLineElement;
|
|
32
|
+
horizontalLine: SVGLineElement;
|
|
33
|
+
}, index: any, alignment: "vertical" | "horizontal", final?: boolean): {
|
|
34
|
+
circle: any;
|
|
35
|
+
verticalLine: any;
|
|
36
|
+
horizontalLine: any;
|
|
37
|
+
};
|
|
38
|
+
_getHeaderText(size: number, unit: string, percentTarget: "width" | "height"): string;
|
|
39
|
+
_getInitialSizes(): {
|
|
40
|
+
x: any[];
|
|
41
|
+
xUnit: any[];
|
|
42
|
+
y: any[];
|
|
43
|
+
yUnit: any[];
|
|
44
|
+
};
|
|
45
|
+
_pointerActionTypeResize(event: PointerEvent, circle: SVGCircleElement, gapColumn: any, gapRow: any): void;
|
|
46
|
+
_calculateNewSize(iSizes: number[], iUnits: string[], diff: any, gapIndex: any, percentTarget: 'width' | 'height', pointerUp?: boolean): string;
|
|
47
|
+
_editGrid(pos: number, alignment: "vertical" | "horizontal", task: "add" | "del"): void;
|
|
48
|
+
_calculateNewElementSize(elementTarget: "width" | "height"): string;
|
|
49
|
+
_toggleDisplayPlusCircles(index: any, alignment: "vertical" | "horizontal", double?: boolean): void;
|
|
50
|
+
_convertCssUnit(cssValue: string | number, target: HTMLElement, percentTarget: 'width' | 'height', unit: string): string | number;
|
|
51
|
+
}
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
import { EventNames } from "../../../../../enums/EventNames.js";
|
|
2
|
+
import { convertCssUnit, convertCssUnitToPixel, getCssUnit } from "../../../../helper/CssUnitConverter.js";
|
|
3
|
+
import { CalculateGridInformation } from "../../../../helper/GridHelper.js";
|
|
4
|
+
import { AbstractExtension } from '../AbstractExtension.js';
|
|
5
|
+
import { OverlayLayer } from "../OverlayLayer.js";
|
|
6
|
+
export class EditGridExtension extends AbstractExtension {
|
|
7
|
+
_initialPoint;
|
|
8
|
+
_initialSizes;
|
|
9
|
+
_cells;
|
|
10
|
+
_gaps;
|
|
11
|
+
_headers;
|
|
12
|
+
_headerTexts;
|
|
13
|
+
_plusCircles;
|
|
14
|
+
_resizeCircles;
|
|
15
|
+
minPixelSize = 10;
|
|
16
|
+
gridInformation;
|
|
17
|
+
defaultHeaderSize = 20;
|
|
18
|
+
defaultPlusSize = this.defaultHeaderSize * 2 / 3;
|
|
19
|
+
defaultDistanceToBox = 5;
|
|
20
|
+
defaultDistanceBetweenHeaders = 10;
|
|
21
|
+
defaultSizeOfNewRowOrColumn = "50px";
|
|
22
|
+
constructor(extensionManager, designerView, extendedItem) {
|
|
23
|
+
super(extensionManager, designerView, extendedItem);
|
|
24
|
+
}
|
|
25
|
+
extend() {
|
|
26
|
+
this._initSVGArrays();
|
|
27
|
+
this.refresh();
|
|
28
|
+
}
|
|
29
|
+
refresh() {
|
|
30
|
+
this.gridInformation = CalculateGridInformation(this.extendedItem);
|
|
31
|
+
let cells = this.gridInformation.cells;
|
|
32
|
+
if (cells[0][0] && !isNaN(cells[0][0].height) && !isNaN(cells[0][0].width)) {
|
|
33
|
+
if (this.gridInformation.cells.length != this._cells.length || this.gridInformation.cells[0].length != this._cells[0].length)
|
|
34
|
+
this._initSVGArrays();
|
|
35
|
+
//draw gaps
|
|
36
|
+
this.gridInformation.gaps.forEach((gap, i) => {
|
|
37
|
+
this._gaps[i] = this._drawRect(gap.x, gap.y, gap.width, gap.height, 'svg-grid-gap', this._gaps[i], OverlayLayer.Foregorund);
|
|
38
|
+
this._resizeCircles[i] = this._drawResizeCircle(gap, this._resizeCircles[i]);
|
|
39
|
+
});
|
|
40
|
+
//draw cells
|
|
41
|
+
cells.forEach((row, i) => {
|
|
42
|
+
row.forEach((cell, j) => {
|
|
43
|
+
this._cells[i][j] = this._drawRect(cell.x, cell.y, cell.width, cell.height, 'svg-grid', this._cells[i][j], OverlayLayer.Background);
|
|
44
|
+
if (cell.name) {
|
|
45
|
+
const text = this._drawText(cell.name, cell.x, cell.y, 'svg-grid-area', null, OverlayLayer.Background);
|
|
46
|
+
text.setAttribute("dominant-baseline", "hanging");
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
//draw headers
|
|
51
|
+
cells.forEach((row, i) => {
|
|
52
|
+
this._headers[0][i] = this._drawHeader(row[0], this._headers[0][i], i, "vertical");
|
|
53
|
+
this._headerTexts[0][i] = this._drawHeaderText(row[0], this._headerTexts[0][i], "vertical");
|
|
54
|
+
});
|
|
55
|
+
cells[0].forEach((column, i) => {
|
|
56
|
+
this._headers[1][i] = this._drawHeader(column, this._headers[1][i], i, "horizontal");
|
|
57
|
+
this._headerTexts[1][i] = this._drawHeaderText(column, this._headerTexts[1][i], "horizontal");
|
|
58
|
+
});
|
|
59
|
+
//draw circles for adding rows/columns
|
|
60
|
+
for (let i = 0; i < this._plusCircles[0].length; i++)
|
|
61
|
+
if (i < this._plusCircles[0].length - 1)
|
|
62
|
+
this._plusCircles[0][i] = this._drawPlusCircle(cells[i][0].x, cells[i][0].y, this._plusCircles[0][i], i, "vertical");
|
|
63
|
+
else
|
|
64
|
+
this._plusCircles[0][i] = this._drawPlusCircle(cells[i - 1][0].x, cells[i - 1][0].y + cells[i - 1][0].height, this._plusCircles[0][i], i, "vertical", true);
|
|
65
|
+
for (let i = 0; i < this._plusCircles[1].length; i++)
|
|
66
|
+
if (i < this._plusCircles[1].length - 1)
|
|
67
|
+
this._plusCircles[1][i] = this._drawPlusCircle(cells[0][i].x, cells[0][i].y, this._plusCircles[1][i], i, "horizontal");
|
|
68
|
+
else
|
|
69
|
+
this._plusCircles[1][i] = this._drawPlusCircle(cells[0][i - 1].x + cells[0][i - 1].width, cells[0][i - 1].y, this._plusCircles[1][i], i, "horizontal", true);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
dispose() {
|
|
73
|
+
this._removeAllOverlays();
|
|
74
|
+
}
|
|
75
|
+
_initSVGArrays() {
|
|
76
|
+
this._removeAllOverlays();
|
|
77
|
+
this.gridInformation = CalculateGridInformation(this.extendedItem);
|
|
78
|
+
this._cells = new Array(this.gridInformation.cells.length);
|
|
79
|
+
this.gridInformation.cells.forEach((row, i) => this._cells[i] = new Array(row.length));
|
|
80
|
+
this._gaps = new Array(this.gridInformation.gaps.length);
|
|
81
|
+
this._headers = new Array(2);
|
|
82
|
+
this._headers[0] = new Array(this.gridInformation.cells.length + 1); //array for the headers of columns
|
|
83
|
+
this._headers[1] = new Array(this.gridInformation.cells[0].length + 1); //array for the headers of rows
|
|
84
|
+
this._headerTexts = new Array(2);
|
|
85
|
+
this._headerTexts[0] = new Array(this.gridInformation.cells.length + 1);
|
|
86
|
+
this._headerTexts[1] = new Array(this.gridInformation.cells[0].length + 1);
|
|
87
|
+
this._plusCircles = new Array(2);
|
|
88
|
+
this._plusCircles[0] = new Array(this.gridInformation.cells.length + 1);
|
|
89
|
+
this._plusCircles[1] = new Array(this.gridInformation.cells[0].length + 1);
|
|
90
|
+
this._resizeCircles = new Array(this.gridInformation.gaps.length);
|
|
91
|
+
}
|
|
92
|
+
_drawResizeCircle(gap, oldCircle) {
|
|
93
|
+
let resizeCircle = this._drawCircle((gap.x + (gap.width / 2)), (gap.y + (gap.height / 2)), 1.5, 'svg-grid-resizer', oldCircle, OverlayLayer.Foregorund);
|
|
94
|
+
resizeCircle.style.pointerEvents = "all";
|
|
95
|
+
resizeCircle.style.cursor = gap.width < gap.height ? "ew-resize" : "ns-resize";
|
|
96
|
+
if (!oldCircle) {
|
|
97
|
+
resizeCircle.addEventListener(EventNames.PointerDown, event => this._pointerActionTypeResize(event, resizeCircle, gap.column, gap.row));
|
|
98
|
+
resizeCircle.addEventListener(EventNames.PointerMove, event => this._pointerActionTypeResize(event, resizeCircle, gap.column, gap.row));
|
|
99
|
+
resizeCircle.addEventListener(EventNames.PointerUp, event => this._pointerActionTypeResize(event, resizeCircle, gap.column, gap.row));
|
|
100
|
+
}
|
|
101
|
+
return resizeCircle;
|
|
102
|
+
}
|
|
103
|
+
_drawHeader(cell, oldHeader, index, alignment) {
|
|
104
|
+
let xOffset;
|
|
105
|
+
let yOffset;
|
|
106
|
+
let width;
|
|
107
|
+
let height;
|
|
108
|
+
if (alignment == "vertical") {
|
|
109
|
+
xOffset = -(this.defaultHeaderSize + this.defaultDistanceToBox);
|
|
110
|
+
yOffset = this.defaultDistanceBetweenHeaders / 2;
|
|
111
|
+
width = this.defaultHeaderSize;
|
|
112
|
+
height = cell.height - this.defaultDistanceBetweenHeaders;
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
xOffset = this.defaultDistanceBetweenHeaders / 2;
|
|
116
|
+
yOffset = -(this.defaultHeaderSize + this.defaultDistanceToBox);
|
|
117
|
+
width = cell.width - this.defaultDistanceBetweenHeaders;
|
|
118
|
+
height = this.defaultHeaderSize;
|
|
119
|
+
}
|
|
120
|
+
let tmpHeader = this._drawRect(cell.x + xOffset, cell.y + yOffset, width, height, "svg-grid-header", oldHeader, OverlayLayer.Foregorund);
|
|
121
|
+
tmpHeader.style.pointerEvents = "all";
|
|
122
|
+
if (!oldHeader) {
|
|
123
|
+
tmpHeader.addEventListener(EventNames.PointerMove, event => {
|
|
124
|
+
this._toggleDisplayPlusCircles(index, alignment, true);
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return tmpHeader;
|
|
128
|
+
}
|
|
129
|
+
_drawHeaderText(cell, oldHeaderText, alignment) {
|
|
130
|
+
let text;
|
|
131
|
+
let xOffset;
|
|
132
|
+
let yOffset;
|
|
133
|
+
if (alignment == "vertical") {
|
|
134
|
+
text = this._getHeaderText(cell.height, cell.initHeightUnit, "height");
|
|
135
|
+
xOffset = -12.5;
|
|
136
|
+
yOffset = cell.height / 2;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
text = this._getHeaderText(cell.width, cell.initWidthUnit, "width");
|
|
140
|
+
xOffset = cell.width / 2;
|
|
141
|
+
yOffset = -12.5;
|
|
142
|
+
}
|
|
143
|
+
let rText = this._drawText(text, cell.x + xOffset, cell.y + yOffset, null, oldHeaderText, OverlayLayer.Background);
|
|
144
|
+
if (alignment == "vertical")
|
|
145
|
+
rText.setAttribute("transform", "rotate(-90, " + (cell.x + xOffset) + ", " + (cell.y + yOffset) + ")");
|
|
146
|
+
return rText;
|
|
147
|
+
}
|
|
148
|
+
_drawPlusCircle(x, y, oldPlusElement, index, alignment, final = false) {
|
|
149
|
+
let plusElement = { circle: null, verticalLine: null, horizontalLine: null };
|
|
150
|
+
let posX;
|
|
151
|
+
let posY;
|
|
152
|
+
let gapOffset = index == 0 || final ? 0 : -(convertCssUnitToPixel(this.extendedItem.getStyle(alignment == "vertical" ? "row-gap" : "column-gap"), this.extendedItem.element, alignment == "vertical" ? "height" : "width") / 2);
|
|
153
|
+
if (alignment == "vertical") {
|
|
154
|
+
posX = x - this.defaultDistanceToBox - this.defaultHeaderSize / 2;
|
|
155
|
+
posY = y + gapOffset;
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
posX = x + gapOffset;
|
|
159
|
+
posY = y - this.defaultDistanceToBox - this.defaultHeaderSize / 2;
|
|
160
|
+
}
|
|
161
|
+
plusElement.circle = this._drawCircle(posX, posY, this.defaultHeaderSize / 2, 'svg-grid-resizer', oldPlusElement ? oldPlusElement.circle : null, OverlayLayer.Foregorund);
|
|
162
|
+
plusElement.circle.style.pointerEvents = "all";
|
|
163
|
+
plusElement.circle.style.cursor = "pointer";
|
|
164
|
+
plusElement.circle.style.display = "none";
|
|
165
|
+
if (!oldPlusElement) {
|
|
166
|
+
plusElement.circle.addEventListener(EventNames.PointerMove, event => this._toggleDisplayPlusCircles(index, alignment));
|
|
167
|
+
plusElement.circle.addEventListener(EventNames.PointerDown, event => {
|
|
168
|
+
this._editGrid(index, alignment, "add");
|
|
169
|
+
event.stopPropagation();
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
plusElement.verticalLine = this._drawLine(posX, posY - this.defaultPlusSize / 2, posX, posY + this.defaultPlusSize / 2, "svg-grid-plus-sign", oldPlusElement ? oldPlusElement.verticalLine : null, OverlayLayer.Foregorund);
|
|
173
|
+
plusElement.verticalLine.style.display = "none";
|
|
174
|
+
plusElement.horizontalLine = this._drawLine(posX - this.defaultPlusSize / 2, posY, posX + this.defaultPlusSize / 2, posY, "svg-grid-plus-sign", oldPlusElement ? oldPlusElement.horizontalLine : null, OverlayLayer.Foregorund);
|
|
175
|
+
plusElement.horizontalLine.style.display = "none";
|
|
176
|
+
return plusElement;
|
|
177
|
+
}
|
|
178
|
+
_getHeaderText(size, unit, percentTarget) {
|
|
179
|
+
return Math.round(parseFloat(this._convertCssUnit(size, this.extendedItem.element, percentTarget, unit)) * 10) / 10 + unit;
|
|
180
|
+
}
|
|
181
|
+
_getInitialSizes() {
|
|
182
|
+
let rX = []; //in pixels
|
|
183
|
+
let rXUnit = []; //original unit
|
|
184
|
+
let rY = []; //in pixels
|
|
185
|
+
let rYUnit = []; //original unit
|
|
186
|
+
this.gridInformation.cells[0].forEach(row => {
|
|
187
|
+
rX.push(row.width);
|
|
188
|
+
rXUnit.push(row.initWidthUnit);
|
|
189
|
+
});
|
|
190
|
+
this.gridInformation.cells.forEach(column => {
|
|
191
|
+
rY.push(column[0].height);
|
|
192
|
+
rYUnit.push(column[0].initHeightUnit);
|
|
193
|
+
});
|
|
194
|
+
return { x: rX, xUnit: rXUnit, y: rY, yUnit: rYUnit };
|
|
195
|
+
}
|
|
196
|
+
_pointerActionTypeResize(event, circle, gapColumn, gapRow) {
|
|
197
|
+
event.stopPropagation();
|
|
198
|
+
switch (event.type) {
|
|
199
|
+
case EventNames.PointerDown:
|
|
200
|
+
circle.setPointerCapture(event.pointerId);
|
|
201
|
+
this._initialPoint = { x: event.clientX, y: event.clientY };
|
|
202
|
+
this._initialSizes = this._getInitialSizes();
|
|
203
|
+
break;
|
|
204
|
+
case EventNames.PointerMove:
|
|
205
|
+
if (this._initialPoint) {
|
|
206
|
+
let elementStyle = this.extendedItem.element.style;
|
|
207
|
+
this.extendedItem.element.getBoundingClientRect;
|
|
208
|
+
if (circle.style.cursor == "ew-resize")
|
|
209
|
+
elementStyle.gridTemplateColumns = this._calculateNewSize(this._initialSizes.x, this._initialSizes.xUnit, (event.clientX - this._initialPoint.x) / this.designerCanvas.zoomFactor, gapColumn, "width");
|
|
210
|
+
else if (circle.style.cursor == "ns-resize")
|
|
211
|
+
elementStyle.gridTemplateRows = this._calculateNewSize(this._initialSizes.y, this._initialSizes.yUnit, (event.clientY - this._initialPoint.y) / this.designerCanvas.zoomFactor, gapRow, "height");
|
|
212
|
+
this.refresh();
|
|
213
|
+
}
|
|
214
|
+
break;
|
|
215
|
+
case EventNames.PointerUp:
|
|
216
|
+
circle.releasePointerCapture(event.pointerId);
|
|
217
|
+
if (circle.style.cursor == "ew-resize")
|
|
218
|
+
this.extendedItem.setStyle("grid-template-columns", this._calculateNewSize(this._initialSizes.x, this._initialSizes.xUnit, (event.clientX - this._initialPoint.x) / this.designerCanvas.zoomFactor, gapColumn, "width", true));
|
|
219
|
+
else if (circle.style.cursor == "ns-resize")
|
|
220
|
+
this.extendedItem.setStyle("grid-template-rows", this._calculateNewSize(this._initialSizes.y, this._initialSizes.yUnit, (event.clientY - this._initialPoint.y) / this.designerCanvas.zoomFactor, gapRow, "height", true));
|
|
221
|
+
this._initialPoint = null;
|
|
222
|
+
this._initialSizes = null;
|
|
223
|
+
this.refresh();
|
|
224
|
+
break;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
_calculateNewSize(iSizes, iUnits, diff, gapIndex, percentTarget, pointerUp = false) {
|
|
228
|
+
let newSizes = [];
|
|
229
|
+
let edited = [];
|
|
230
|
+
for (let i = 0; i < iSizes.length; i++) {
|
|
231
|
+
newSizes.push(i + 1 == gapIndex ? iSizes[i] + diff : i == gapIndex ? iSizes[i] - diff : iSizes[i]);
|
|
232
|
+
edited.push(i + 1 == gapIndex || i == gapIndex);
|
|
233
|
+
}
|
|
234
|
+
for (let i = 0; i < newSizes.length; i++) {
|
|
235
|
+
let index = edited[i + 1] ? i + 1 : edited[i - 1] ? i - 1 : null;
|
|
236
|
+
if (newSizes[i] < 0 && pointerUp) {
|
|
237
|
+
if (confirm("Do you want to delete this " + (percentTarget == "width" ? "column" : "row") + "?")) {
|
|
238
|
+
this._editGrid(i, percentTarget == "width" ? "horizontal" : "vertical", "del");
|
|
239
|
+
newSizes[index] = iSizes[i] + iSizes[index];
|
|
240
|
+
newSizes.splice(i, 1);
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
if (newSizes[i] < this.minPixelSize) {
|
|
245
|
+
newSizes[index] = newSizes[i] + newSizes[index] - this.minPixelSize;
|
|
246
|
+
newSizes[i] = this.minPixelSize;
|
|
247
|
+
break;
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
let retVal = "";
|
|
251
|
+
newSizes.forEach((newSize, i) => retVal += this._convertCssUnit(newSize + "px", this.extendedItem.element, percentTarget, iUnits[i]) + ' ');
|
|
252
|
+
return retVal;
|
|
253
|
+
}
|
|
254
|
+
_editGrid(pos, alignment, task) {
|
|
255
|
+
let cellTarget;
|
|
256
|
+
let elementTarget;
|
|
257
|
+
if (alignment == "vertical") {
|
|
258
|
+
cellTarget = "grid-template-rows";
|
|
259
|
+
elementTarget = "height";
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
cellTarget = "grid-template-columns";
|
|
263
|
+
elementTarget = "width";
|
|
264
|
+
}
|
|
265
|
+
let sizes = this.extendedItem.getStyle(cellTarget).split(' ');
|
|
266
|
+
if (task == "add")
|
|
267
|
+
sizes.splice(pos, 0, this.defaultSizeOfNewRowOrColumn);
|
|
268
|
+
else
|
|
269
|
+
sizes.splice(pos, 1);
|
|
270
|
+
this.extendedItem.setStyle(cellTarget, sizes.join(' '));
|
|
271
|
+
if (task == "add") {
|
|
272
|
+
this.extendedItem.setStyle(elementTarget, convertCssUnit(this._calculateNewElementSize(elementTarget), this.designerCanvas.canvas, elementTarget, getCssUnit(this.extendedItem.getStyle(elementTarget))));
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
this.extendedItem.setStyle(elementTarget, convertCssUnit(convertCssUnitToPixel(this.extendedItem.getStyle(elementTarget), this.designerCanvas.canvas, elementTarget) - convertCssUnitToPixel(this.extendedItem.getStyle(alignment == "vertical" ? "row-gap" : "column-gap"), this.extendedItem.element, elementTarget), this.designerCanvas.canvas, elementTarget, getCssUnit(this.extendedItem.getStyle(elementTarget))));
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
_calculateNewElementSize(elementTarget) {
|
|
279
|
+
let gc = CalculateGridInformation(this.extendedItem);
|
|
280
|
+
let tmpSize = 0;
|
|
281
|
+
if (elementTarget == "width") {
|
|
282
|
+
gc.cells[0].forEach(cell => { tmpSize += cell.width; });
|
|
283
|
+
tmpSize += convertCssUnitToPixel(this.extendedItem.getStyle("column-gap"), this.extendedItem.element, elementTarget) * (gc.cells[0].length - 1);
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
gc.cells.forEach(row => { tmpSize += row[0].height; });
|
|
287
|
+
tmpSize += convertCssUnitToPixel(this.extendedItem.getStyle("row-gap"), this.extendedItem.element, elementTarget) * (gc.cells.length - 1);
|
|
288
|
+
}
|
|
289
|
+
return tmpSize + "px";
|
|
290
|
+
}
|
|
291
|
+
_toggleDisplayPlusCircles(index, alignment, double = false) {
|
|
292
|
+
this._plusCircles.forEach(alignment => {
|
|
293
|
+
alignment.forEach(element => {
|
|
294
|
+
element.circle.style.display = "none";
|
|
295
|
+
element.verticalLine.style.display = "none";
|
|
296
|
+
element.horizontalLine.style.display = "none";
|
|
297
|
+
});
|
|
298
|
+
});
|
|
299
|
+
if (index != -1) {
|
|
300
|
+
this._plusCircles[alignment == "vertical" ? 0 : 1][index].circle.style.display = "inline";
|
|
301
|
+
this._plusCircles[alignment == "vertical" ? 0 : 1][index].verticalLine.style.display = "inline";
|
|
302
|
+
this._plusCircles[alignment == "vertical" ? 0 : 1][index].horizontalLine.style.display = "inline";
|
|
303
|
+
if (double) {
|
|
304
|
+
this._plusCircles[alignment == "vertical" ? 0 : 1][index + 1].circle.style.display = "inline";
|
|
305
|
+
this._plusCircles[alignment == "vertical" ? 0 : 1][index + 1].verticalLine.style.display = "inline";
|
|
306
|
+
this._plusCircles[alignment == "vertical" ? 0 : 1][index + 1].horizontalLine.style.display = "inline";
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
_convertCssUnit(cssValue, target, percentTarget, unit) {
|
|
311
|
+
if (unit == "fr") {
|
|
312
|
+
let containerSize = convertCssUnitToPixel(target.style.width, target, percentTarget);
|
|
313
|
+
let amountGaps = percentTarget == "height" ? this.gridInformation.cells.length - 1 : this.gridInformation.cells[0].length - 1;
|
|
314
|
+
let gapSize = convertCssUnitToPixel(percentTarget == "width" ? target.style.columnGap : target.style.rowGap, target, percentTarget);
|
|
315
|
+
let containerSizeWithoutGaps = containerSize - gapSize * amountGaps;
|
|
316
|
+
let amountFrSizes = 0;
|
|
317
|
+
let leftOver = containerSizeWithoutGaps;
|
|
318
|
+
if (percentTarget == "width") {
|
|
319
|
+
this.gridInformation.cells[0].forEach((column, i) => {
|
|
320
|
+
if (column.initWidthUnit == "fr")
|
|
321
|
+
amountFrSizes++;
|
|
322
|
+
else
|
|
323
|
+
leftOver -= column.width;
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
else {
|
|
327
|
+
this.gridInformation.cells.forEach((row, i) => {
|
|
328
|
+
if (row[0].initHeightUnit == "fr")
|
|
329
|
+
amountFrSizes++;
|
|
330
|
+
else
|
|
331
|
+
leftOver -= row[0].height;
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
let frRatio = leftOver / amountFrSizes;
|
|
335
|
+
if (typeof cssValue == "number") {
|
|
336
|
+
//expected Value in Pixel
|
|
337
|
+
return (cssValue / frRatio) + "fr";
|
|
338
|
+
}
|
|
339
|
+
else {
|
|
340
|
+
return (convertCssUnitToPixel(cssValue, target, percentTarget) / frRatio) + "fr";
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
else
|
|
344
|
+
return convertCssUnit(cssValue, target, percentTarget, unit);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
@@ -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 EditGridExtensionProvider implements IDesignerExtensionProvider {
|
|
7
|
+
shouldExtend(extensionManager: IExtensionManager, designerCanvas: IDesignerCanvas, designItem: IDesignItem): boolean;
|
|
8
|
+
getExtension(extensionManager: IExtensionManager, designerCanvas: IDesignerCanvas, designItem: IDesignItem): IDesignerExtension;
|
|
9
|
+
readonly style: CSSStyleSheet;
|
|
10
|
+
}
|