@silexlabs/grapesjs-advanced-selector 1.0.7 → 1.0.8-0
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/dist/StylableElement.js +26 -0
- package/dist/StylableElement.js.map +1 -0
- package/dist/components/complex-selector.d.ts +0 -1
- package/dist/components/complex-selector.d.ts.map +1 -1
- package/dist/components/complex-selector.js +177 -0
- package/dist/components/complex-selector.js.map +1 -0
- package/dist/components/compound-selector.d.ts +0 -1
- package/dist/components/compound-selector.d.ts.map +1 -1
- package/dist/components/compound-selector.js +205 -0
- package/dist/components/compound-selector.js.map +1 -0
- package/dist/components/current-selector-display.js +266 -0
- package/dist/components/current-selector-display.js.map +1 -0
- package/dist/components/inline-select.js +201 -0
- package/dist/components/inline-select.js.map +1 -0
- package/dist/components/resize-input.js +17 -0
- package/dist/components/resize-input.js.map +1 -0
- package/dist/components/simple-selector.d.ts +0 -1
- package/dist/components/simple-selector.d.ts.map +1 -1
- package/dist/components/simple-selector.js +468 -0
- package/dist/components/simple-selector.js.map +1 -0
- package/dist/i18n/en.js +74 -0
- package/dist/i18n/en.js.map +1 -0
- package/dist/i18n/fr.js +74 -0
- package/dist/i18n/fr.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +109 -108
- package/dist/index.js.map +1 -1
- package/dist/model/ComplexSelector.js +137 -0
- package/dist/model/ComplexSelector.js.map +1 -0
- package/dist/model/ComplexSelector.test.js +308 -0
- package/dist/model/ComplexSelector.test.js.map +1 -0
- package/dist/model/CompoundSelector.js +113 -0
- package/dist/model/CompoundSelector.js.map +1 -0
- package/dist/model/CompoundSelector.test.js +193 -0
- package/dist/model/CompoundSelector.test.js.map +1 -0
- package/dist/model/GrapesJsSelectors.js +488 -0
- package/dist/model/GrapesJsSelectors.js.map +1 -0
- package/dist/model/GrapesJsSelectors.test.js +695 -0
- package/dist/model/GrapesJsSelectors.test.js.map +1 -0
- package/dist/model/Operator.js +116 -0
- package/dist/model/Operator.js.map +1 -0
- package/dist/model/Operator.test.js +42 -0
- package/dist/model/Operator.test.js.map +1 -0
- package/dist/model/PseudoClass.js +123 -0
- package/dist/model/PseudoClass.js.map +1 -0
- package/dist/model/PseudoClass.test.js +19 -0
- package/dist/model/PseudoClass.test.js.map +1 -0
- package/dist/model/SimpleSelector.js +295 -0
- package/dist/model/SimpleSelector.js.map +1 -0
- package/dist/model/SimpleSelector.test.js +143 -0
- package/dist/model/SimpleSelector.test.js.map +1 -0
- package/dist/plugin.js +187 -0
- package/dist/plugin.js.map +1 -0
- package/dist/styles.js +38 -0
- package/dist/styles.js.map +1 -0
- package/package.json +3 -4
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { LitElement } from 'lit';
|
|
8
|
+
import { property } from 'lit/decorators.js';
|
|
9
|
+
export default class StylableElement extends LitElement {
|
|
10
|
+
constructor() {
|
|
11
|
+
super(...arguments);
|
|
12
|
+
this.t = (key) => key;
|
|
13
|
+
}
|
|
14
|
+
connectedCallback() {
|
|
15
|
+
super.connectedCallback();
|
|
16
|
+
const styles = document.querySelectorAll('style, link[rel="stylesheet"]');
|
|
17
|
+
styles.forEach(style => {
|
|
18
|
+
var _a;
|
|
19
|
+
(_a = this.shadowRoot) === null || _a === void 0 ? void 0 : _a.appendChild(style.cloneNode(true));
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
__decorate([
|
|
24
|
+
property()
|
|
25
|
+
], StylableElement.prototype, "t", void 0);
|
|
26
|
+
//# sourceMappingURL=StylableElement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StylableElement.js","sourceRoot":"","sources":["../src/StylableElement.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE5C,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,UAAU;IAAvD;;QAEI,MAAC,GAA4B,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAA;IAS7C,CAAC;IAPU,iBAAiB;QACxB,KAAK,CAAC,iBAAiB,EAAE,CAAA;QACzB,MAAM,MAAM,GAAG,QAAQ,CAAC,gBAAgB,CAAC,+BAA+B,CAAC,CAAA;QACzE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;;YACrB,MAAA,IAAI,CAAC,UAAU,0CAAE,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAA;QACrD,CAAC,CAAC,CAAA;IACJ,CAAC;CACF;AATG;IADD,QAAQ,EAAE;0CACgC","sourcesContent":["import { LitElement } from 'lit'\nimport { property } from 'lit/decorators.js'\n\nexport default class StylableElement extends LitElement {\n @property()\n t: (key: string) => string = (key) => key\n\n override connectedCallback() {\n super.connectedCallback()\n const styles = document.querySelectorAll('style, link[rel=\"stylesheet\"]')\n styles.forEach(style => {\n this.shadowRoot?.appendChild(style.cloneNode(true))\n })\n }\n}\n"]}
|
|
@@ -29,7 +29,6 @@ export default class ComplexSelectorComponent extends StylableElement {
|
|
|
29
29
|
*/
|
|
30
30
|
relations: SimpleSelector[];
|
|
31
31
|
static styles: import("lit").CSSResult;
|
|
32
|
-
dispatchEvent(event: Event): boolean;
|
|
33
32
|
render(): TemplateResult;
|
|
34
33
|
private changeOperator;
|
|
35
34
|
private addOperator;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"complex-selector.d.ts","sourceRoot":"","sources":["../../src/components/complex-selector.ts"],"names":[],"mappings":"AACA,OAAO,eAAe,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAa,cAAc,EAAE,MAAM,KAAK,CAAA;AAC/C,OAAO,gBAAgB,CAAA;AACvB,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,eAAe,EAAY,MAAM,0BAA0B,CAAA;AAMpE,OAAO,iBAAiB,CAAA;AACxB,OAAO,qBAAqB,CAAA;AAE5B;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,wBAAyB,SAAQ,eAAe;IAGnE;;OAEG;IACH,IACW,KAAK,IAAI,eAAe,GAAG,SAAS,CAE9C;IACD,IAAW,KAAK,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,GAAG,SAAS,EAO3D;IACD,OAAO,CAAC,MAAM,CAA6B;IAE3C;;;OAGG;IAEI,WAAW,EAAE,cAAc,EAAE,CAAK;IAGzC;;;OAGG;IAEI,SAAS,EAAE,cAAc,EAAE,CAAK;IAQvC,OAAgB,MAAM,0BAiBrB;
|
|
1
|
+
{"version":3,"file":"complex-selector.d.ts","sourceRoot":"","sources":["../../src/components/complex-selector.ts"],"names":[],"mappings":"AACA,OAAO,eAAe,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAa,cAAc,EAAE,MAAM,KAAK,CAAA;AAC/C,OAAO,gBAAgB,CAAA;AACvB,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,EAAE,eAAe,EAAY,MAAM,0BAA0B,CAAA;AAMpE,OAAO,iBAAiB,CAAA;AACxB,OAAO,qBAAqB,CAAA;AAE5B;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,wBAAyB,SAAQ,eAAe;IAGnE;;OAEG;IACH,IACW,KAAK,IAAI,eAAe,GAAG,SAAS,CAE9C;IACD,IAAW,KAAK,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,GAAG,SAAS,EAO3D;IACD,OAAO,CAAC,MAAM,CAA6B;IAE3C;;;OAGG;IAEI,WAAW,EAAE,cAAc,EAAE,CAAK;IAGzC;;;OAGG;IAEI,SAAS,EAAE,cAAc,EAAE,CAAK;IAQvC,OAAgB,MAAM,0BAiBrB;IAOQ,MAAM,IAAI,cAAc;IA6CjC,OAAO,CAAC,cAAc;IAkBtB,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,qBAAqB;IAUpB,QAAQ,IAAI,MAAM;CAG5B"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { property } from 'lit/decorators.js';
|
|
8
|
+
import StylableElement from '../StylableElement';
|
|
9
|
+
import { css, html } from 'lit';
|
|
10
|
+
import './resize-input';
|
|
11
|
+
import { toString } from '../model/ComplexSelector';
|
|
12
|
+
import { OPERATORS } from '../model/Operator';
|
|
13
|
+
import { FOCUS_VISIBLE } from '../styles';
|
|
14
|
+
/**
|
|
15
|
+
* A component to display and edit a complex selector
|
|
16
|
+
* A complex selector is a main selector, an operator, and a related selector
|
|
17
|
+
* @emits change
|
|
18
|
+
* @emits rename (when a simple selector in the main compound selector is renamed)
|
|
19
|
+
*/
|
|
20
|
+
class ComplexSelectorComponent extends StylableElement {
|
|
21
|
+
constructor() {
|
|
22
|
+
super(...arguments);
|
|
23
|
+
/**
|
|
24
|
+
* A list of all the classes, IDs, tags, custom tags, attributes, custom attributes
|
|
25
|
+
* that are available in the document, applicable to the current selection
|
|
26
|
+
*/
|
|
27
|
+
this.suggestions = [];
|
|
28
|
+
/**
|
|
29
|
+
* A list of all the classes, IDs, tags, custom tags, attributes, custom attributes
|
|
30
|
+
* that are available to the related selector
|
|
31
|
+
*/
|
|
32
|
+
this.relations = [];
|
|
33
|
+
}
|
|
34
|
+
// /////////////////
|
|
35
|
+
// Attributes
|
|
36
|
+
/**
|
|
37
|
+
* The selector to display
|
|
38
|
+
*/
|
|
39
|
+
get value() {
|
|
40
|
+
return this._value;
|
|
41
|
+
}
|
|
42
|
+
set value(value) {
|
|
43
|
+
try {
|
|
44
|
+
this._value = typeof value === 'string' ? JSON.parse(value) : value;
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
console.error('Error parsing value for selector', { value, error });
|
|
48
|
+
}
|
|
49
|
+
this.requestUpdate();
|
|
50
|
+
}
|
|
51
|
+
dispatchEvent(event) {
|
|
52
|
+
console.info('[COMPLEX] Dispatching event', event);
|
|
53
|
+
return super.dispatchEvent(event);
|
|
54
|
+
}
|
|
55
|
+
render() {
|
|
56
|
+
var _a, _b, _c, _d, _e, _f;
|
|
57
|
+
return html `
|
|
58
|
+
<compound-selector
|
|
59
|
+
.t=${this.t}
|
|
60
|
+
.value=${(_a = this.value) === null || _a === void 0 ? void 0 : _a.mainSelector}
|
|
61
|
+
.suggestions=${this.suggestions}
|
|
62
|
+
@change=${(event) => {
|
|
63
|
+
const target = event.target;
|
|
64
|
+
this.value = {
|
|
65
|
+
...this.value,
|
|
66
|
+
mainSelector: target.value,
|
|
67
|
+
};
|
|
68
|
+
event.stopPropagation();
|
|
69
|
+
this.dispatchEvent(new CustomEvent('change', { detail: this.value }));
|
|
70
|
+
}}
|
|
71
|
+
@rename=${(event) => this.dispatchEvent(new CustomEvent('rename', { detail: event.detail }))}
|
|
72
|
+
></compound-selector>
|
|
73
|
+
${((_b = this.value) === null || _b === void 0 ? void 0 : _b.operator) ? html `
|
|
74
|
+
<inline-select
|
|
75
|
+
.t=${this.t}
|
|
76
|
+
.value=${(_c = this.value) === null || _c === void 0 ? void 0 : _c.operator}
|
|
77
|
+
.options=${OPERATORS}
|
|
78
|
+
placeholder=""
|
|
79
|
+
@change=${this.changeOperator}
|
|
80
|
+
></inline-select>
|
|
81
|
+
` : html `
|
|
82
|
+
<button
|
|
83
|
+
class="gjs-btn-prim asm__add-inline"
|
|
84
|
+
@click=${this.addOperator}
|
|
85
|
+
>\u2192 ${this.t('Relation')}</button>
|
|
86
|
+
`}
|
|
87
|
+
${((_d = this.value) === null || _d === void 0 ? void 0 : _d.operator) ? html `
|
|
88
|
+
<compound-selector
|
|
89
|
+
.t=${this.t}
|
|
90
|
+
.value=${(_e = this.value) === null || _e === void 0 ? void 0 : _e.relatedSelector}
|
|
91
|
+
.suggestions=${this.relations}
|
|
92
|
+
?disable-pseudo-class=${((_f = this.value) === null || _f === void 0 ? void 0 : _f.operator.isCombinator) === false}
|
|
93
|
+
@change=${this.changeRelatedSelector}
|
|
94
|
+
></compound-selector>
|
|
95
|
+
` : ''}
|
|
96
|
+
`;
|
|
97
|
+
}
|
|
98
|
+
// /////////////////
|
|
99
|
+
// Methods
|
|
100
|
+
changeOperator(event) {
|
|
101
|
+
var _a, _b, _c, _d, _e;
|
|
102
|
+
const target = event.target;
|
|
103
|
+
if (((_a = target.value) === null || _a === void 0 ? void 0 : _a.isCombinator) === false) {
|
|
104
|
+
// Make sure we don't have a pseudo class as a param of a pseudo class
|
|
105
|
+
(_c = (_b = this.value) === null || _b === void 0 ? void 0 : _b.relatedSelector) === null || _c === void 0 ? true : delete _c.pseudoClass;
|
|
106
|
+
}
|
|
107
|
+
this.value = {
|
|
108
|
+
...this.value,
|
|
109
|
+
operator: target.value,
|
|
110
|
+
};
|
|
111
|
+
if (!target.value) {
|
|
112
|
+
(_d = this.value) === null || _d === void 0 ? true : delete _d.relatedSelector;
|
|
113
|
+
(_e = this.value) === null || _e === void 0 ? true : delete _e.operator;
|
|
114
|
+
}
|
|
115
|
+
event.stopPropagation();
|
|
116
|
+
this.dispatchEvent(new CustomEvent('change', { detail: this.value }));
|
|
117
|
+
}
|
|
118
|
+
addOperator() {
|
|
119
|
+
this.requestUpdate();
|
|
120
|
+
this.value = {
|
|
121
|
+
...this.value,
|
|
122
|
+
operator: OPERATORS[0],
|
|
123
|
+
relatedSelector: {
|
|
124
|
+
selectors: [],
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
this.dispatchEvent(new CustomEvent('change', { detail: this.value }));
|
|
128
|
+
}
|
|
129
|
+
changeRelatedSelector(event) {
|
|
130
|
+
const target = event.target;
|
|
131
|
+
this.value = {
|
|
132
|
+
...this.value,
|
|
133
|
+
relatedSelector: target.value,
|
|
134
|
+
};
|
|
135
|
+
event.stopPropagation();
|
|
136
|
+
this.dispatchEvent(new CustomEvent('change', { detail: this.value }));
|
|
137
|
+
}
|
|
138
|
+
toString() {
|
|
139
|
+
return toString(this.value);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// /////////////////
|
|
143
|
+
// Properties
|
|
144
|
+
// /////////////////
|
|
145
|
+
// Element overrides
|
|
146
|
+
ComplexSelectorComponent.styles = css `
|
|
147
|
+
:host {
|
|
148
|
+
${FOCUS_VISIBLE}
|
|
149
|
+
& {
|
|
150
|
+
display: block;
|
|
151
|
+
text-align: left;
|
|
152
|
+
padding: 0.5rem 0;
|
|
153
|
+
}
|
|
154
|
+
button:hover, a:hover {
|
|
155
|
+
transform: translateX(1px);
|
|
156
|
+
font-weight: bold;
|
|
157
|
+
}
|
|
158
|
+
button.asm__add-inline {
|
|
159
|
+
font-size: 0.8rem;
|
|
160
|
+
background: transparent;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
`;
|
|
164
|
+
export default ComplexSelectorComponent;
|
|
165
|
+
__decorate([
|
|
166
|
+
property({ type: Object, attribute: true, reflect: false })
|
|
167
|
+
], ComplexSelectorComponent.prototype, "value", null);
|
|
168
|
+
__decorate([
|
|
169
|
+
property({ type: Array, attribute: true, reflect: false })
|
|
170
|
+
], ComplexSelectorComponent.prototype, "suggestions", void 0);
|
|
171
|
+
__decorate([
|
|
172
|
+
property({ type: Array, attribute: true, reflect: false })
|
|
173
|
+
], ComplexSelectorComponent.prototype, "relations", void 0);
|
|
174
|
+
if (!customElements.get('complex-selector')) {
|
|
175
|
+
customElements.define('complex-selector', ComplexSelectorComponent);
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=complex-selector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"complex-selector.js","sourceRoot":"","sources":["../../src/components/complex-selector.ts"],"names":[],"mappings":"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","sourcesContent":["import { property } from 'lit/decorators.js'\nimport StylableElement from '../StylableElement'\nimport { css, html, TemplateResult } from 'lit'\nimport './resize-input'\nimport { SimpleSelector } from '../model/SimpleSelector'\nimport { ComplexSelector, toString } from '../model/ComplexSelector'\nimport { Operator, OPERATORS } from '../model/Operator'\nimport InlineSelectComponent from './inline-select'\nimport CompoundSelectorComponent from './compound-selector'\nimport { CompoundSelector } from '../model/CompoundSelector'\nimport { FOCUS_VISIBLE } from '../styles'\n\n/**\n * A component to display and edit a complex selector\n * A complex selector is a main selector, an operator, and a related selector\n * @emits change\n * @emits rename (when a simple selector in the main compound selector is renamed)\n */\nexport default class ComplexSelectorComponent extends StylableElement {\n // /////////////////\n // Attributes\n /**\n * The selector to display\n */\n @property({ type: Object, attribute: true, reflect: false })\n public get value(): ComplexSelector | undefined {\n return this._value\n }\n public set value(value: ComplexSelector | string | undefined) {\n try {\n this._value = typeof value === 'string' ? JSON.parse(value) : value\n } catch (error) {\n console.error('Error parsing value for selector', { value, error })\n }\n this.requestUpdate()\n }\n private _value: ComplexSelector | undefined\n\n /**\n * A list of all the classes, IDs, tags, custom tags, attributes, custom attributes\n * that are available in the document, applicable to the current selection\n */\n @property({ type: Array, attribute: true, reflect: false })\n public suggestions: SimpleSelector[] = []\n\n\n /**\n * A list of all the classes, IDs, tags, custom tags, attributes, custom attributes\n * that are available to the related selector\n */\n @property({ type: Array, attribute: true, reflect: false })\n public relations: SimpleSelector[] = []\n\n\n // /////////////////\n // Properties\n\n // /////////////////\n // Element overrides\n static override styles = css`\n :host {\n ${ FOCUS_VISIBLE }\n & {\n display: block;\n text-align: left;\n padding: 0.5rem 0;\n }\n button:hover, a:hover {\n transform: translateX(1px);\n font-weight: bold;\n }\n button.asm__add-inline {\n font-size: 0.8rem;\n background: transparent;\n }\n }\n `\n\n override dispatchEvent(event: Event): boolean {\n console.info('[COMPLEX] Dispatching event', event)\n return super.dispatchEvent(event)\n }\n\n override render(): TemplateResult {\n return html`\n <compound-selector\n .t=${ this.t }\n .value=${ this.value?.mainSelector }\n .suggestions=${ this.suggestions }\n @change=${ (event: CustomEvent) => {\n const target = event.target as CompoundSelectorComponent\n this.value = {\n ...this.value!,\n mainSelector: target.value as CompoundSelector,\n }\n event.stopPropagation()\n this.dispatchEvent(new CustomEvent('change', { detail: this.value }))\n }}\n @rename=${ (event: CustomEvent) => this.dispatchEvent(new CustomEvent('rename', { detail: event.detail })) }\n ></compound-selector>\n ${ this.value?.operator ? html`\n <inline-select\n .t=${ this.t }\n .value=${ this.value?.operator }\n .options=${ OPERATORS }\n placeholder=\"\"\n @change=${ this.changeOperator }\n ></inline-select>\n ` : html`\n <button\n class=\"gjs-btn-prim asm__add-inline\"\n @click=${ this.addOperator }\n >\\u2192 ${ this.t('Relation') }</button>\n `}\n ${ this.value?.operator ? html`\n <compound-selector\n .t=${ this.t }\n .value=${ this.value?.relatedSelector }\n .suggestions=${ this.relations }\n ?disable-pseudo-class=${ this.value?.operator.isCombinator === false }\n @change=${ this.changeRelatedSelector }\n ></compound-selector>\n ` : ''}\n `\n }\n\n // /////////////////\n // Methods\n private changeOperator(event: CustomEvent<Operator>) {\n const target = event.target as InlineSelectComponent\n if ((target.value as Operator)?.isCombinator === false) {\n // Make sure we don't have a pseudo class as a param of a pseudo class\n delete this.value?.relatedSelector?.pseudoClass\n }\n this.value = {\n ...this.value!,\n operator: target.value as Operator,\n }\n if (!target.value) {\n delete this.value?.relatedSelector\n delete this.value?.operator\n }\n event.stopPropagation()\n this.dispatchEvent(new CustomEvent('change', { detail: this.value }))\n }\n\n private addOperator() {\n this.requestUpdate()\n this.value = {\n ...this.value!,\n operator: OPERATORS[0],\n relatedSelector: {\n selectors: [],\n },\n } as ComplexSelector\n this.dispatchEvent(new CustomEvent('change', { detail: this.value }))\n }\n\n private changeRelatedSelector(event: CustomEvent<CompoundSelector>) {\n const target = event.target as CompoundSelectorComponent\n this.value = {\n ...this.value!,\n relatedSelector: target.value as CompoundSelector,\n }\n event.stopPropagation()\n this.dispatchEvent(new CustomEvent('change', { detail: this.value }))\n }\n\n override toString(): string {\n return toString(this.value!)\n }\n}\n\nif (!customElements.get('complex-selector')) {\n customElements.define('complex-selector', ComplexSelectorComponent)\n}\n"]}
|
|
@@ -26,7 +26,6 @@ export default class CompoundSelectorComponent extends StylableElement {
|
|
|
26
26
|
suggestions: SimpleSelector[];
|
|
27
27
|
disablePseudoClass: boolean;
|
|
28
28
|
static styles: import("lit").CSSResult;
|
|
29
|
-
dispatchEvent(event: Event): boolean;
|
|
30
29
|
toString(): string;
|
|
31
30
|
render(): TemplateResult;
|
|
32
31
|
private changeSelector;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compound-selector.d.ts","sourceRoot":"","sources":["../../src/components/compound-selector.ts"],"names":[],"mappings":"AACA,OAAO,eAAe,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAY,MAAM,2BAA2B,CAAA;AACtE,OAAO,EAAkB,cAAc,EAAmC,MAAM,yBAAyB,CAAA;AACzG,OAAO,EAAa,cAAc,EAAE,MAAM,KAAK,CAAA;AAI/C,OAAO,iBAAiB,CAAA;AACxB,OAAO,mBAAmB,CAAA;AAE1B;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,OAAO,yBAA0B,SAAQ,eAAe;IAIpE;;OAEG;IACH,IACW,KAAK,IAAI,gBAAgB,GAAG,SAAS,CAE/C;IACD,IAAW,KAAK,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,GAAG,SAAS,EAO5D;IACD,OAAO,CAAC,MAAM,CAA8B;IAE5C;;;OAGG;IAEI,WAAW,EAAE,cAAc,EAAE,CAAK;IAGlC,kBAAkB,EAAE,OAAO,CAAQ;IAO1C,OAAgB,MAAM,0BAwBrB;
|
|
1
|
+
{"version":3,"file":"compound-selector.d.ts","sourceRoot":"","sources":["../../src/components/compound-selector.ts"],"names":[],"mappings":"AACA,OAAO,eAAe,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAY,MAAM,2BAA2B,CAAA;AACtE,OAAO,EAAkB,cAAc,EAAmC,MAAM,yBAAyB,CAAA;AACzG,OAAO,EAAa,cAAc,EAAE,MAAM,KAAK,CAAA;AAI/C,OAAO,iBAAiB,CAAA;AACxB,OAAO,mBAAmB,CAAA;AAE1B;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,OAAO,yBAA0B,SAAQ,eAAe;IAIpE;;OAEG;IACH,IACW,KAAK,IAAI,gBAAgB,GAAG,SAAS,CAE/C;IACD,IAAW,KAAK,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,GAAG,SAAS,EAO5D;IACD,OAAO,CAAC,MAAM,CAA8B;IAE5C;;;OAGG;IAEI,WAAW,EAAE,cAAc,EAAE,CAAK;IAGlC,kBAAkB,EAAE,OAAO,CAAQ;IAO1C,OAAgB,MAAM,0BAwBrB;IAOQ,QAAQ,IAAI,MAAM;IAGlB,MAAM,IAAI,cAAc;IAmDjC,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,iBAAiB;IAUzB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,iBAAiB;CAK1B"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { property } from 'lit/decorators.js';
|
|
8
|
+
import StylableElement from '../StylableElement';
|
|
9
|
+
import { toString } from '../model/CompoundSelector';
|
|
10
|
+
import { isSameSelector, SimpleSelectorType, specificity } from '../model/SimpleSelector';
|
|
11
|
+
import { css, html } from 'lit';
|
|
12
|
+
import { PSEUDO_CLASSES } from '../model/PseudoClass';
|
|
13
|
+
import { FOCUS_VISIBLE } from '../styles';
|
|
14
|
+
import './inline-select';
|
|
15
|
+
/**
|
|
16
|
+
* A component to display and edit a compound selector
|
|
17
|
+
* A compound selector is a list of simple selectors and a pseudo class
|
|
18
|
+
* @emits change
|
|
19
|
+
* @emits rename (when a simple selector in the selector is renamed)
|
|
20
|
+
* @emits delete
|
|
21
|
+
* @emits add
|
|
22
|
+
*/
|
|
23
|
+
class CompoundSelectorComponent extends StylableElement {
|
|
24
|
+
constructor() {
|
|
25
|
+
super(...arguments);
|
|
26
|
+
/**
|
|
27
|
+
* A list of all the classes, IDs, tags, custom tags, attributes, custom attributes
|
|
28
|
+
* that are available in the document, applicable to the current selection
|
|
29
|
+
*/
|
|
30
|
+
this.suggestions = [];
|
|
31
|
+
this.disablePseudoClass = false;
|
|
32
|
+
}
|
|
33
|
+
// /////////////////
|
|
34
|
+
// Attributes
|
|
35
|
+
/**
|
|
36
|
+
* The selector to display
|
|
37
|
+
*/
|
|
38
|
+
get value() {
|
|
39
|
+
return this._value;
|
|
40
|
+
}
|
|
41
|
+
set value(value) {
|
|
42
|
+
try {
|
|
43
|
+
this._value = typeof value === 'string' ? JSON.parse(value) : value;
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
console.error('Error parsing value for selector', { value, error });
|
|
47
|
+
}
|
|
48
|
+
this.requestUpdate();
|
|
49
|
+
}
|
|
50
|
+
dispatchEvent(event) {
|
|
51
|
+
console.info('[COMPOUND] Dispatching event', event);
|
|
52
|
+
return super.dispatchEvent(event);
|
|
53
|
+
}
|
|
54
|
+
toString() {
|
|
55
|
+
return toString(this.value);
|
|
56
|
+
}
|
|
57
|
+
render() {
|
|
58
|
+
var _a, _b, _c;
|
|
59
|
+
return html `
|
|
60
|
+
<section>
|
|
61
|
+
<div
|
|
62
|
+
class="asm-compound__selectors"
|
|
63
|
+
>
|
|
64
|
+
${(_a = this.value) === null || _a === void 0 ? void 0 : _a.selectors.sort((a, b) => specificity(b, true) - specificity(a, true)).map((selector, idx) => html `
|
|
65
|
+
<simple-selector
|
|
66
|
+
.t=${this.t}
|
|
67
|
+
.value=${selector}
|
|
68
|
+
.suggestions=${this.suggestions}
|
|
69
|
+
?readonly=${![SimpleSelectorType.CLASS, SimpleSelectorType.UNKNOWN].includes(selector.type)}
|
|
70
|
+
@change=${(event) => this.changeSelector(event, idx)}
|
|
71
|
+
@delete=${(event) => this.deleteSelector(event, idx)}
|
|
72
|
+
></simple-selector>
|
|
73
|
+
`)}
|
|
74
|
+
<button
|
|
75
|
+
id="gjs-clm-add-tag"
|
|
76
|
+
class="gjs-clm-tags-btn gjs-clm-tags-btn__add asm-compound__add"
|
|
77
|
+
.title=${this.t('Add a new selector')}
|
|
78
|
+
@click=${this.addSelector}
|
|
79
|
+
>
|
|
80
|
+
<svg viewBox="0 0 24 24"><path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"></path></svg>
|
|
81
|
+
</button>
|
|
82
|
+
</div>
|
|
83
|
+
${this.disablePseudoClass ? '' : html `
|
|
84
|
+
${((_b = this.value) === null || _b === void 0 ? void 0 : _b.pseudoClass) ? html `
|
|
85
|
+
<div>
|
|
86
|
+
<inline-select
|
|
87
|
+
.t=${this.t}
|
|
88
|
+
.value=${(_c = this.value) === null || _c === void 0 ? void 0 : _c.pseudoClass}
|
|
89
|
+
.options=${PSEUDO_CLASSES}
|
|
90
|
+
@change=${this.changePseudoClass}
|
|
91
|
+
placeholder=""
|
|
92
|
+
></inline-select>
|
|
93
|
+
</div>
|
|
94
|
+
` : html `
|
|
95
|
+
<button
|
|
96
|
+
class="gjs-btn-prim asm__add-inline"
|
|
97
|
+
@click=${this.addPseudoClass}
|
|
98
|
+
>\u2192 ${this.t('Pseudo Class')}</button>
|
|
99
|
+
`}
|
|
100
|
+
`}
|
|
101
|
+
</section>
|
|
102
|
+
`;
|
|
103
|
+
}
|
|
104
|
+
// /////////////////
|
|
105
|
+
// Methods
|
|
106
|
+
changeSelector(event, idx) {
|
|
107
|
+
const oldValue = this.value.selectors[idx];
|
|
108
|
+
const onlyId = event.detail.type === SimpleSelectorType.ID && event.detail.active;
|
|
109
|
+
this.value = {
|
|
110
|
+
...this.value,
|
|
111
|
+
selectors: this.value.selectors
|
|
112
|
+
// Replace the old value with the new one
|
|
113
|
+
.map((selector, i) => i === idx ? event.detail : selector)
|
|
114
|
+
.map(selector => onlyId && selector.type !== SimpleSelectorType.ID ? { ...selector, active: false } : selector),
|
|
115
|
+
};
|
|
116
|
+
if (!isSameSelector(oldValue, event.detail, false)) {
|
|
117
|
+
this.dispatchEvent(new CustomEvent('rename', { detail: {
|
|
118
|
+
oldValue,
|
|
119
|
+
value: event.detail,
|
|
120
|
+
} }));
|
|
121
|
+
this.dispatchEvent(new CustomEvent('change', { detail: this.value }));
|
|
122
|
+
}
|
|
123
|
+
event.stopPropagation();
|
|
124
|
+
this.requestUpdate();
|
|
125
|
+
}
|
|
126
|
+
addSelector(event) {
|
|
127
|
+
var _a;
|
|
128
|
+
this.value = (_a = this.value) !== null && _a !== void 0 ? _a : { selectors: [] };
|
|
129
|
+
this.value.selectors.push({ type: SimpleSelectorType.UNKNOWN, active: true });
|
|
130
|
+
event.stopPropagation();
|
|
131
|
+
this.requestUpdate();
|
|
132
|
+
// Make the last selector editable
|
|
133
|
+
requestAnimationFrame(() => this.focusLastSelector());
|
|
134
|
+
}
|
|
135
|
+
focusLastSelector() {
|
|
136
|
+
if (!this.value) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
const selector = this.shadowRoot.querySelectorAll('simple-selector')[this.value.selectors.length - 1];
|
|
140
|
+
selector.editing = true;
|
|
141
|
+
requestAnimationFrame(() => {
|
|
142
|
+
selector.focus();
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
deleteSelector(event, idx) {
|
|
146
|
+
var _a;
|
|
147
|
+
(_a = this.value) === null || _a === void 0 ? void 0 : _a.selectors.splice(idx, 1);
|
|
148
|
+
this.dispatchEvent(new CustomEvent('change', { detail: this.value }));
|
|
149
|
+
event.stopPropagation();
|
|
150
|
+
this.requestUpdate();
|
|
151
|
+
}
|
|
152
|
+
addPseudoClass(event) {
|
|
153
|
+
this.value = { ...this.value, pseudoClass: PSEUDO_CLASSES[0] };
|
|
154
|
+
this.dispatchEvent(new CustomEvent('change', { detail: this.value }));
|
|
155
|
+
event.stopPropagation();
|
|
156
|
+
}
|
|
157
|
+
changePseudoClass(event) {
|
|
158
|
+
this.value = { ...this.value, pseudoClass: event.detail };
|
|
159
|
+
this.dispatchEvent(new CustomEvent('change', { detail: this.value }));
|
|
160
|
+
event.stopPropagation();
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// /////////////////
|
|
164
|
+
// Properties
|
|
165
|
+
// /////////////////
|
|
166
|
+
// Element overrides
|
|
167
|
+
CompoundSelectorComponent.styles = css `
|
|
168
|
+
:host {
|
|
169
|
+
${FOCUS_VISIBLE}
|
|
170
|
+
button:hover, a:hover {
|
|
171
|
+
transform: translateX(1px);
|
|
172
|
+
font-weight: bold;
|
|
173
|
+
}
|
|
174
|
+
.asm-compound__selectors {
|
|
175
|
+
display: flex;
|
|
176
|
+
gap: 0.5rem;
|
|
177
|
+
align-items: center;
|
|
178
|
+
flex-wrap: wrap;
|
|
179
|
+
/* material design card style */
|
|
180
|
+
padding: 0.5rem;
|
|
181
|
+
background-color: var(--gjs-main-dark-color);
|
|
182
|
+
}
|
|
183
|
+
.asm-compound__add {
|
|
184
|
+
color: var(--gjs-secondary-color, #b9a5a6);
|
|
185
|
+
}
|
|
186
|
+
.asm__add-inline {
|
|
187
|
+
font-size: 0.8rem;
|
|
188
|
+
background: transparent;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
`;
|
|
192
|
+
export default CompoundSelectorComponent;
|
|
193
|
+
__decorate([
|
|
194
|
+
property({ type: Object, attribute: true, reflect: false })
|
|
195
|
+
], CompoundSelectorComponent.prototype, "value", null);
|
|
196
|
+
__decorate([
|
|
197
|
+
property({ type: Array, attribute: true, reflect: false })
|
|
198
|
+
], CompoundSelectorComponent.prototype, "suggestions", void 0);
|
|
199
|
+
__decorate([
|
|
200
|
+
property({ type: Boolean, attribute: 'disable-pseudo-class' })
|
|
201
|
+
], CompoundSelectorComponent.prototype, "disablePseudoClass", void 0);
|
|
202
|
+
if (!customElements.get('compound-selector')) {
|
|
203
|
+
customElements.define('compound-selector', CompoundSelectorComponent);
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=compound-selector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compound-selector.js","sourceRoot":"","sources":["../../src/components/compound-selector.ts"],"names":[],"mappings":"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","sourcesContent":["import { property } from 'lit/decorators.js'\nimport StylableElement from '../StylableElement'\nimport { CompoundSelector, toString } from '../model/CompoundSelector'\nimport { isSameSelector, SimpleSelector, SimpleSelectorType, specificity } from '../model/SimpleSelector'\nimport { css, html, TemplateResult } from 'lit'\nimport SimpleSelectorComponent from './simple-selector'\nimport { PSEUDO_CLASSES } from '../model/PseudoClass'\nimport { FOCUS_VISIBLE } from '../styles'\nimport './inline-select'\n\n/**\n * A component to display and edit a compound selector\n * A compound selector is a list of simple selectors and a pseudo class\n * @emits change\n * @emits rename (when a simple selector in the selector is renamed)\n * @emits delete\n * @emits add\n */\nexport default class CompoundSelectorComponent extends StylableElement {\n\n // /////////////////\n // Attributes\n /**\n * The selector to display\n */\n @property({ type: Object, attribute: true, reflect: false })\n public get value(): CompoundSelector | undefined {\n return this._value\n }\n public set value(value: CompoundSelector | string | undefined) {\n try {\n this._value = typeof value === 'string' ? JSON.parse(value) : value\n } catch (error) {\n console.error('Error parsing value for selector', { value, error })\n }\n this.requestUpdate()\n }\n private _value: CompoundSelector | undefined\n\n /**\n * A list of all the classes, IDs, tags, custom tags, attributes, custom attributes\n * that are available in the document, applicable to the current selection\n */\n @property({ type: Array, attribute: true, reflect: false })\n public suggestions: SimpleSelector[] = []\n\n @property({ type: Boolean, attribute: 'disable-pseudo-class' })\n public disablePseudoClass: boolean = false\n\n // /////////////////\n // Properties\n\n // /////////////////\n // Element overrides\n static override styles = css`\n :host {\n ${ FOCUS_VISIBLE }\n button:hover, a:hover {\n transform: translateX(1px);\n font-weight: bold;\n }\n .asm-compound__selectors {\n display: flex;\n gap: 0.5rem;\n align-items: center;\n flex-wrap: wrap;\n /* material design card style */\n padding: 0.5rem;\n background-color: var(--gjs-main-dark-color);\n }\n .asm-compound__add {\n color: var(--gjs-secondary-color, #b9a5a6);\n }\n .asm__add-inline {\n font-size: 0.8rem;\n background: transparent;\n }\n }\n `\n\n override dispatchEvent(event: Event): boolean {\n console.info('[COMPOUND] Dispatching event', event)\n return super.dispatchEvent(event)\n }\n\n override toString(): string {\n return toString(this.value!)\n }\n override render(): TemplateResult {\n return html`\n <section>\n <div\n class=\"asm-compound__selectors\"\n >\n ${ this.value?.selectors\n .sort((a, b) => specificity(b, true) - specificity(a, true))\n .map((selector, idx) => html`\n <simple-selector\n .t=${ this.t }\n .value=${ selector }\n .suggestions=${ this.suggestions }\n ?readonly=${ ![SimpleSelectorType.CLASS, SimpleSelectorType.UNKNOWN].includes(selector.type) }\n @change=${ (event: CustomEvent<SimpleSelector>) => this.changeSelector(event, idx) }\n @delete=${ (event: CustomEvent) => this.deleteSelector(event, idx) }\n ></simple-selector>\n `) }\n <button\n id=\"gjs-clm-add-tag\"\n class=\"gjs-clm-tags-btn gjs-clm-tags-btn__add asm-compound__add\"\n .title=${ this.t('Add a new selector') }\n @click=${ this.addSelector }\n >\n <svg viewBox=\"0 0 24 24\"><path d=\"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"></path></svg>\n </button>\n </div>\n ${ this.disablePseudoClass ? '' : html`\n ${ this.value?.pseudoClass ? html`\n <div>\n <inline-select\n .t=${ this.t }\n .value=${ this.value?.pseudoClass }\n .options=${ PSEUDO_CLASSES }\n @change=${ this.changePseudoClass }\n placeholder=\"\"\n ></inline-select>\n </div>\n ` : html`\n <button\n class=\"gjs-btn-prim asm__add-inline\"\n @click=${ this.addPseudoClass }\n >\\u2192 ${ this.t('Pseudo Class') }</button>\n ` }\n `}\n </section>\n `\n }\n\n // /////////////////\n // Methods\n private changeSelector(event: CustomEvent<SimpleSelector>, idx: number) {\n const oldValue: SimpleSelector = this.value!.selectors[idx]\n const onlyId = event.detail.type === SimpleSelectorType.ID && event.detail.active\n this.value = {\n ...this.value!,\n selectors: this.value!.selectors\n // Replace the old value with the new one\n .map((selector, i) => i === idx ? event.detail : selector)\n .map(selector => onlyId && selector.type !== SimpleSelectorType.ID ? { ...selector, active: false } : selector),\n }\n if(!isSameSelector(oldValue, event.detail, false)) {\n this.dispatchEvent(new CustomEvent('rename', { detail: {\n oldValue,\n value: event.detail,\n } }))\n this.dispatchEvent(new CustomEvent('change', { detail: this.value }))\n }\n event.stopPropagation()\n this.requestUpdate()\n }\n private addSelector(event: MouseEvent) {\n this.value = this.value ?? { selectors: [] }\n this.value.selectors.push({ type: SimpleSelectorType.UNKNOWN, active: true })\n event.stopPropagation()\n this.requestUpdate()\n // Make the last selector editable\n requestAnimationFrame(() => this.focusLastSelector())\n }\n private focusLastSelector() {\n if (!this.value) {\n return\n }\n const selector = this.shadowRoot!.querySelectorAll('simple-selector')[this.value!.selectors.length - 1] as SimpleSelectorComponent\n selector.editing = true\n requestAnimationFrame(() => {\n selector.focus()\n })\n }\n private deleteSelector(event: CustomEvent, idx: number) {\n this.value?.selectors.splice(idx, 1)\n this.dispatchEvent(new CustomEvent('change', { detail: this.value }))\n event.stopPropagation()\n this.requestUpdate()\n }\n private addPseudoClass(event: MouseEvent) {\n this.value = { ...this.value!, pseudoClass: PSEUDO_CLASSES[0] }\n this.dispatchEvent(new CustomEvent('change', { detail: this.value }))\n event.stopPropagation()\n }\n private changePseudoClass(event: CustomEvent) {\n this.value = { ...this.value!, pseudoClass: event.detail }\n this.dispatchEvent(new CustomEvent('change', { detail: this.value }))\n event.stopPropagation()\n }\n}\n\nif (!customElements.get('compound-selector')) {\n customElements.define('compound-selector', CompoundSelectorComponent)\n}\n"]}
|