@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.
Files changed (56) hide show
  1. package/dist/StylableElement.js +26 -0
  2. package/dist/StylableElement.js.map +1 -0
  3. package/dist/components/complex-selector.d.ts +0 -1
  4. package/dist/components/complex-selector.d.ts.map +1 -1
  5. package/dist/components/complex-selector.js +177 -0
  6. package/dist/components/complex-selector.js.map +1 -0
  7. package/dist/components/compound-selector.d.ts +0 -1
  8. package/dist/components/compound-selector.d.ts.map +1 -1
  9. package/dist/components/compound-selector.js +205 -0
  10. package/dist/components/compound-selector.js.map +1 -0
  11. package/dist/components/current-selector-display.js +266 -0
  12. package/dist/components/current-selector-display.js.map +1 -0
  13. package/dist/components/inline-select.js +201 -0
  14. package/dist/components/inline-select.js.map +1 -0
  15. package/dist/components/resize-input.js +17 -0
  16. package/dist/components/resize-input.js.map +1 -0
  17. package/dist/components/simple-selector.d.ts +0 -1
  18. package/dist/components/simple-selector.d.ts.map +1 -1
  19. package/dist/components/simple-selector.js +468 -0
  20. package/dist/components/simple-selector.js.map +1 -0
  21. package/dist/i18n/en.js +74 -0
  22. package/dist/i18n/en.js.map +1 -0
  23. package/dist/i18n/fr.js +74 -0
  24. package/dist/i18n/fr.js.map +1 -0
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +109 -108
  27. package/dist/index.js.map +1 -1
  28. package/dist/model/ComplexSelector.js +137 -0
  29. package/dist/model/ComplexSelector.js.map +1 -0
  30. package/dist/model/ComplexSelector.test.js +308 -0
  31. package/dist/model/ComplexSelector.test.js.map +1 -0
  32. package/dist/model/CompoundSelector.js +113 -0
  33. package/dist/model/CompoundSelector.js.map +1 -0
  34. package/dist/model/CompoundSelector.test.js +193 -0
  35. package/dist/model/CompoundSelector.test.js.map +1 -0
  36. package/dist/model/GrapesJsSelectors.js +488 -0
  37. package/dist/model/GrapesJsSelectors.js.map +1 -0
  38. package/dist/model/GrapesJsSelectors.test.js +695 -0
  39. package/dist/model/GrapesJsSelectors.test.js.map +1 -0
  40. package/dist/model/Operator.js +116 -0
  41. package/dist/model/Operator.js.map +1 -0
  42. package/dist/model/Operator.test.js +42 -0
  43. package/dist/model/Operator.test.js.map +1 -0
  44. package/dist/model/PseudoClass.js +123 -0
  45. package/dist/model/PseudoClass.js.map +1 -0
  46. package/dist/model/PseudoClass.test.js +19 -0
  47. package/dist/model/PseudoClass.test.js.map +1 -0
  48. package/dist/model/SimpleSelector.js +295 -0
  49. package/dist/model/SimpleSelector.js.map +1 -0
  50. package/dist/model/SimpleSelector.test.js +143 -0
  51. package/dist/model/SimpleSelector.test.js.map +1 -0
  52. package/dist/plugin.js +187 -0
  53. package/dist/plugin.js.map +1 -0
  54. package/dist/styles.js +38 -0
  55. package/dist/styles.js.map +1 -0
  56. 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;IAEQ,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAKpC,MAAM,IAAI,cAAc;IA6CjC,OAAO,CAAC,cAAc;IAkBtB,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,qBAAqB;IAUpB,QAAQ,IAAI,MAAM;CAG5B"}
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;IAEQ,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAKpC,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"}
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"]}