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