@phcdevworks/spectre-components 1.5.0 → 1.7.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/README.md +291 -2
- package/dist/alert.cjs +10 -3
- package/dist/alert.cjs.map +1 -1
- package/dist/alert.d.cts +4 -5
- package/dist/alert.d.ts +4 -5
- package/dist/alert.js +10 -3
- package/dist/alert.js.map +1 -1
- package/dist/avatar.cjs +11 -3
- package/dist/avatar.cjs.map +1 -1
- package/dist/avatar.d.cts +4 -5
- package/dist/avatar.d.ts +4 -5
- package/dist/avatar.js +11 -3
- package/dist/avatar.js.map +1 -1
- package/dist/badge.cjs +11 -3
- package/dist/badge.cjs.map +1 -1
- package/dist/badge.d.cts +4 -5
- package/dist/badge.d.ts +4 -5
- package/dist/badge.js +11 -3
- package/dist/badge.js.map +1 -1
- package/dist/{base-BRQ7QAAr.d.cts → base-D0s95V2v.d.cts} +2 -0
- package/dist/{base-BRQ7QAAr.d.ts → base-D0s95V2v.d.ts} +2 -0
- package/dist/button.cjs +14 -5
- package/dist/button.cjs.map +1 -1
- package/dist/button.d.cts +4 -5
- package/dist/button.d.ts +4 -5
- package/dist/button.js +14 -5
- package/dist/button.js.map +1 -1
- package/dist/card.cjs +11 -3
- package/dist/card.cjs.map +1 -1
- package/dist/card.d.cts +4 -5
- package/dist/card.d.ts +4 -5
- package/dist/card.js +11 -3
- package/dist/card.js.map +1 -1
- package/dist/checkbox.cjs +16 -5
- package/dist/checkbox.cjs.map +1 -1
- package/dist/checkbox.d.cts +2 -3
- package/dist/checkbox.d.ts +2 -3
- package/dist/checkbox.js +17 -6
- package/dist/checkbox.js.map +1 -1
- package/dist/container.cjs +421 -0
- package/dist/container.cjs.map +1 -0
- package/dist/container.d.cts +37 -0
- package/dist/container.d.ts +37 -0
- package/dist/container.js +417 -0
- package/dist/container.js.map +1 -0
- package/dist/dropdown.cjs +486 -0
- package/dist/dropdown.cjs.map +1 -0
- package/dist/dropdown.d.cts +69 -0
- package/dist/dropdown.d.ts +69 -0
- package/dist/dropdown.js +482 -0
- package/dist/dropdown.js.map +1 -0
- package/dist/fieldset.cjs +16 -7
- package/dist/fieldset.cjs.map +1 -1
- package/dist/fieldset.d.cts +2 -3
- package/dist/fieldset.d.ts +2 -3
- package/dist/fieldset.js +18 -9
- package/dist/fieldset.js.map +1 -1
- package/dist/form-DgzRhNmg.d.cts +46 -0
- package/dist/form-DgzRhNmg.d.ts +46 -0
- package/dist/grid.cjs +437 -0
- package/dist/grid.cjs.map +1 -0
- package/dist/grid.d.cts +42 -0
- package/dist/grid.d.ts +42 -0
- package/dist/grid.js +432 -0
- package/dist/grid.js.map +1 -0
- package/dist/icon-box.cjs +11 -3
- package/dist/icon-box.cjs.map +1 -1
- package/dist/icon-box.d.cts +4 -5
- package/dist/icon-box.d.ts +4 -5
- package/dist/icon-box.js +11 -3
- package/dist/icon-box.js.map +1 -1
- package/dist/index.cjs +1286 -66
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +13 -3
- package/dist/index.d.ts +13 -3
- package/dist/index.js +1259 -68
- package/dist/index.js.map +1 -1
- package/dist/input.cjs +10 -3
- package/dist/input.cjs.map +1 -1
- package/dist/input.d.cts +3 -4
- package/dist/input.d.ts +3 -4
- package/dist/input.js +10 -3
- package/dist/input.js.map +1 -1
- package/dist/label.cjs +17 -2
- package/dist/label.cjs.map +1 -1
- package/dist/label.d.cts +9 -3
- package/dist/label.d.ts +9 -3
- package/dist/label.js +18 -3
- package/dist/label.js.map +1 -1
- package/dist/modal.cjs +519 -0
- package/dist/modal.cjs.map +1 -0
- package/dist/modal.d.cts +52 -0
- package/dist/modal.d.ts +52 -0
- package/dist/modal.js +516 -0
- package/dist/modal.js.map +1 -0
- package/dist/nav.cjs +424 -0
- package/dist/nav.cjs.map +1 -0
- package/dist/nav.d.cts +45 -0
- package/dist/nav.d.ts +45 -0
- package/dist/nav.js +421 -0
- package/dist/nav.js.map +1 -0
- package/dist/pricing-card.cjs +11 -3
- package/dist/pricing-card.cjs.map +1 -1
- package/dist/pricing-card.d.cts +2 -3
- package/dist/pricing-card.d.ts +2 -3
- package/dist/pricing-card.js +11 -3
- package/dist/pricing-card.js.map +1 -1
- package/dist/{projectable-D6IDeKfr.d.ts → projectable-D9YCo9NY.d.ts} +1 -1
- package/dist/{projectable-Bx-IVk0w.d.cts → projectable-DLOn6eaW.d.cts} +1 -1
- package/dist/radio.cjs +16 -5
- package/dist/radio.cjs.map +1 -1
- package/dist/radio.d.cts +2 -3
- package/dist/radio.d.ts +2 -3
- package/dist/radio.js +17 -6
- package/dist/radio.js.map +1 -1
- package/dist/rating.cjs +19 -5
- package/dist/rating.cjs.map +1 -1
- package/dist/rating.d.cts +3 -4
- package/dist/rating.d.ts +3 -4
- package/dist/rating.js +19 -5
- package/dist/rating.js.map +1 -1
- package/dist/section.cjs +400 -0
- package/dist/section.cjs.map +1 -0
- package/dist/section.d.cts +25 -0
- package/dist/section.d.ts +25 -0
- package/dist/section.js +397 -0
- package/dist/section.js.map +1 -0
- package/dist/select.cjs +14 -5
- package/dist/select.cjs.map +1 -1
- package/dist/select.d.cts +3 -4
- package/dist/select.d.ts +3 -4
- package/dist/select.js +15 -6
- package/dist/select.js.map +1 -1
- package/dist/sidebar.cjs +481 -0
- package/dist/sidebar.cjs.map +1 -0
- package/dist/sidebar.d.cts +50 -0
- package/dist/sidebar.d.ts +50 -0
- package/dist/sidebar.js +478 -0
- package/dist/sidebar.js.map +1 -0
- package/dist/spinner.cjs +10 -0
- package/dist/spinner.cjs.map +1 -1
- package/dist/spinner.d.cts +3 -3
- package/dist/spinner.d.ts +3 -3
- package/dist/spinner.js +10 -0
- package/dist/spinner.js.map +1 -1
- package/dist/stack.cjs +443 -0
- package/dist/stack.cjs.map +1 -0
- package/dist/stack.d.cts +48 -0
- package/dist/stack.d.ts +48 -0
- package/dist/stack.js +437 -0
- package/dist/stack.js.map +1 -0
- package/dist/tag.cjs +11 -3
- package/dist/tag.cjs.map +1 -1
- package/dist/tag.d.cts +4 -5
- package/dist/tag.d.ts +4 -5
- package/dist/tag.js +11 -3
- package/dist/tag.js.map +1 -1
- package/dist/testimonial.cjs +11 -3
- package/dist/testimonial.cjs.map +1 -1
- package/dist/testimonial.d.cts +4 -5
- package/dist/testimonial.d.ts +4 -5
- package/dist/testimonial.js +11 -3
- package/dist/testimonial.js.map +1 -1
- package/dist/textarea.cjs +14 -5
- package/dist/textarea.cjs.map +1 -1
- package/dist/textarea.d.cts +2 -3
- package/dist/textarea.d.ts +2 -3
- package/dist/textarea.js +15 -6
- package/dist/textarea.js.map +1 -1
- package/dist/toast.cjs +475 -0
- package/dist/toast.cjs.map +1 -0
- package/dist/toast.d.cts +68 -0
- package/dist/toast.d.ts +68 -0
- package/dist/toast.js +471 -0
- package/dist/toast.js.map +1 -0
- package/dist/tooltip.cjs +444 -0
- package/dist/tooltip.cjs.map +1 -0
- package/dist/tooltip.d.cts +50 -0
- package/dist/tooltip.d.ts +50 -0
- package/dist/tooltip.js +440 -0
- package/dist/tooltip.js.map +1 -0
- package/package.json +71 -16
- package/dist/form-BumNzIay.d.cts +0 -28
- package/dist/form-BumNzIay.d.ts +0 -28
package/dist/modal.cjs
ADDED
|
@@ -0,0 +1,519 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var lit = require('lit');
|
|
4
|
+
var ifDefined_js = require('lit/directives/if-defined.js');
|
|
5
|
+
var spectreUi = require('@phcdevworks/spectre-ui');
|
|
6
|
+
|
|
7
|
+
// src/components/modal/sp-modal.ts
|
|
8
|
+
var SpectreBaseElement = class extends lit.LitElement {
|
|
9
|
+
constructor() {
|
|
10
|
+
super(...arguments);
|
|
11
|
+
this._ariaLabel = null;
|
|
12
|
+
this._ariaLabelledBy = null;
|
|
13
|
+
this._ariaDescribedBy = null;
|
|
14
|
+
this._autocapitalize = "";
|
|
15
|
+
this._autofocus = false;
|
|
16
|
+
this._spellcheck = null;
|
|
17
|
+
this._title = "";
|
|
18
|
+
this._id = "";
|
|
19
|
+
}
|
|
20
|
+
get ariaLabel() {
|
|
21
|
+
return this._ariaLabel;
|
|
22
|
+
}
|
|
23
|
+
set ariaLabel(value) {
|
|
24
|
+
if (this._ariaLabel === value) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
this._ariaLabel = value;
|
|
28
|
+
this._removeHostAttribute("aria-label");
|
|
29
|
+
this.requestUpdate();
|
|
30
|
+
}
|
|
31
|
+
get ariaLabelledBy() {
|
|
32
|
+
return this._ariaLabelledBy;
|
|
33
|
+
}
|
|
34
|
+
set ariaLabelledBy(value) {
|
|
35
|
+
if (this._ariaLabelledBy === value) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
this._ariaLabelledBy = value;
|
|
39
|
+
this._removeHostAttribute("aria-labelledby");
|
|
40
|
+
this.requestUpdate();
|
|
41
|
+
}
|
|
42
|
+
get ariaDescribedBy() {
|
|
43
|
+
return this._ariaDescribedBy;
|
|
44
|
+
}
|
|
45
|
+
set ariaDescribedBy(value) {
|
|
46
|
+
if (this._ariaDescribedBy === value) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
this._ariaDescribedBy = value;
|
|
50
|
+
this._removeHostAttribute("aria-describedby");
|
|
51
|
+
this.requestUpdate();
|
|
52
|
+
}
|
|
53
|
+
get autocapitalize() {
|
|
54
|
+
return this._autocapitalize;
|
|
55
|
+
}
|
|
56
|
+
set autocapitalize(value) {
|
|
57
|
+
const normalizedValue = value ?? "";
|
|
58
|
+
if (this._autocapitalize === normalizedValue) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
this._autocapitalize = normalizedValue;
|
|
62
|
+
this._removeHostAttribute("autocapitalize");
|
|
63
|
+
this.requestUpdate();
|
|
64
|
+
}
|
|
65
|
+
get spellcheck() {
|
|
66
|
+
return this._spellcheck ?? super.spellcheck;
|
|
67
|
+
}
|
|
68
|
+
set spellcheck(value) {
|
|
69
|
+
if (this._spellcheck === value) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
this._spellcheck = value ?? null;
|
|
73
|
+
this._removeHostAttribute("spellcheck");
|
|
74
|
+
this.requestUpdate();
|
|
75
|
+
}
|
|
76
|
+
get title() {
|
|
77
|
+
return this._title;
|
|
78
|
+
}
|
|
79
|
+
set title(value) {
|
|
80
|
+
const normalizedValue = value ?? "";
|
|
81
|
+
if (this._title === normalizedValue) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
this._title = normalizedValue;
|
|
85
|
+
this._removeHostAttribute("title");
|
|
86
|
+
this.requestUpdate();
|
|
87
|
+
}
|
|
88
|
+
get id() {
|
|
89
|
+
return this._id;
|
|
90
|
+
}
|
|
91
|
+
set id(value) {
|
|
92
|
+
const normalizedValue = value ?? "";
|
|
93
|
+
if (this._id === normalizedValue) {
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
this._id = normalizedValue;
|
|
97
|
+
this._removeHostAttribute("id");
|
|
98
|
+
this.requestUpdate();
|
|
99
|
+
}
|
|
100
|
+
get autofocus() {
|
|
101
|
+
return this._autofocus;
|
|
102
|
+
}
|
|
103
|
+
set autofocus(value) {
|
|
104
|
+
const normalizedValue = !!value;
|
|
105
|
+
if (this._autofocus === normalizedValue) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
this._autofocus = normalizedValue;
|
|
109
|
+
this._removeHostAttribute("autofocus");
|
|
110
|
+
this.requestUpdate();
|
|
111
|
+
}
|
|
112
|
+
// Spectre components intentionally render in light DOM so the global
|
|
113
|
+
// `@phcdevworks/spectre-ui` styling contract can apply directly.
|
|
114
|
+
createRenderRoot() {
|
|
115
|
+
return this;
|
|
116
|
+
}
|
|
117
|
+
connectedCallback() {
|
|
118
|
+
super.connectedCallback();
|
|
119
|
+
const proxiedAttributes = [
|
|
120
|
+
"id",
|
|
121
|
+
"title",
|
|
122
|
+
"autocapitalize",
|
|
123
|
+
"autofocus",
|
|
124
|
+
"spellcheck",
|
|
125
|
+
"aria-label",
|
|
126
|
+
"aria-labelledby",
|
|
127
|
+
"aria-describedby"
|
|
128
|
+
];
|
|
129
|
+
proxiedAttributes.forEach((attr) => {
|
|
130
|
+
const value = super.getAttribute(attr);
|
|
131
|
+
if (value !== null) {
|
|
132
|
+
this.setAttribute(attr, value);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
getAttribute(qualifiedName) {
|
|
137
|
+
switch (qualifiedName) {
|
|
138
|
+
case "id":
|
|
139
|
+
return this.id || null;
|
|
140
|
+
case "title":
|
|
141
|
+
return this.title || null;
|
|
142
|
+
case "autocapitalize":
|
|
143
|
+
return this.autocapitalize || null;
|
|
144
|
+
case "autofocus":
|
|
145
|
+
return this.autofocus ? "" : null;
|
|
146
|
+
case "spellcheck":
|
|
147
|
+
return this._spellcheck !== null ? String(this._spellcheck) : null;
|
|
148
|
+
case "aria-label":
|
|
149
|
+
return this.ariaLabel;
|
|
150
|
+
case "aria-labelledby":
|
|
151
|
+
return this.ariaLabelledBy;
|
|
152
|
+
case "aria-describedby":
|
|
153
|
+
return this.ariaDescribedBy;
|
|
154
|
+
default:
|
|
155
|
+
return super.getAttribute(qualifiedName);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
hasAttribute(qualifiedName) {
|
|
159
|
+
switch (qualifiedName) {
|
|
160
|
+
case "id":
|
|
161
|
+
return this.id !== "";
|
|
162
|
+
case "title":
|
|
163
|
+
return this.title !== "";
|
|
164
|
+
case "autocapitalize":
|
|
165
|
+
return this.autocapitalize !== "";
|
|
166
|
+
case "autofocus":
|
|
167
|
+
return this.autofocus;
|
|
168
|
+
case "spellcheck":
|
|
169
|
+
return this._spellcheck !== null;
|
|
170
|
+
case "aria-label":
|
|
171
|
+
return this.ariaLabel !== null;
|
|
172
|
+
case "aria-labelledby":
|
|
173
|
+
return this.ariaLabelledBy !== null;
|
|
174
|
+
case "aria-describedby":
|
|
175
|
+
return this.ariaDescribedBy !== null;
|
|
176
|
+
default:
|
|
177
|
+
return super.hasAttribute(qualifiedName);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
setAttribute(qualifiedName, value) {
|
|
181
|
+
switch (qualifiedName) {
|
|
182
|
+
case "id":
|
|
183
|
+
this.id = value;
|
|
184
|
+
break;
|
|
185
|
+
case "title":
|
|
186
|
+
this.title = value;
|
|
187
|
+
break;
|
|
188
|
+
case "autocapitalize":
|
|
189
|
+
this.autocapitalize = value;
|
|
190
|
+
break;
|
|
191
|
+
case "autofocus":
|
|
192
|
+
this.autofocus = true;
|
|
193
|
+
break;
|
|
194
|
+
case "spellcheck":
|
|
195
|
+
this.spellcheck = value !== "false";
|
|
196
|
+
break;
|
|
197
|
+
case "aria-label":
|
|
198
|
+
this.ariaLabel = value;
|
|
199
|
+
break;
|
|
200
|
+
case "aria-labelledby":
|
|
201
|
+
this.ariaLabelledBy = value;
|
|
202
|
+
break;
|
|
203
|
+
case "aria-describedby":
|
|
204
|
+
this.ariaDescribedBy = value;
|
|
205
|
+
break;
|
|
206
|
+
default:
|
|
207
|
+
super.setAttribute(qualifiedName, value);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
removeAttribute(qualifiedName) {
|
|
211
|
+
switch (qualifiedName) {
|
|
212
|
+
case "id":
|
|
213
|
+
this.id = "";
|
|
214
|
+
break;
|
|
215
|
+
case "title":
|
|
216
|
+
this.title = "";
|
|
217
|
+
break;
|
|
218
|
+
case "autocapitalize":
|
|
219
|
+
this.autocapitalize = "";
|
|
220
|
+
break;
|
|
221
|
+
case "autofocus":
|
|
222
|
+
this.autofocus = false;
|
|
223
|
+
break;
|
|
224
|
+
case "spellcheck":
|
|
225
|
+
this.spellcheck = null;
|
|
226
|
+
break;
|
|
227
|
+
case "aria-label":
|
|
228
|
+
this.ariaLabel = null;
|
|
229
|
+
break;
|
|
230
|
+
case "aria-labelledby":
|
|
231
|
+
this.ariaLabelledBy = null;
|
|
232
|
+
break;
|
|
233
|
+
case "aria-describedby":
|
|
234
|
+
this.ariaDescribedBy = null;
|
|
235
|
+
break;
|
|
236
|
+
default:
|
|
237
|
+
super.removeAttribute(qualifiedName);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
_removeHostAttribute(name) {
|
|
241
|
+
const host = this;
|
|
242
|
+
if (HTMLElement.prototype.hasAttribute.call(host, name)) {
|
|
243
|
+
HTMLElement.prototype.removeAttribute.call(host, name);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
get forwardedAriaLabel() {
|
|
247
|
+
const value = this.ariaLabel?.trim();
|
|
248
|
+
return value ? value : void 0;
|
|
249
|
+
}
|
|
250
|
+
get forwardedAriaLabelledBy() {
|
|
251
|
+
const value = this.ariaLabelledBy?.trim();
|
|
252
|
+
return value ? value : void 0;
|
|
253
|
+
}
|
|
254
|
+
get forwardedAriaDescribedBy() {
|
|
255
|
+
const value = this.ariaDescribedBy?.trim();
|
|
256
|
+
return value ? value : void 0;
|
|
257
|
+
}
|
|
258
|
+
// Subclasses that expose `disabled`/`loading` properties get this disabled
|
|
259
|
+
// calculation for free instead of redeclaring it per component.
|
|
260
|
+
get isDisabled() {
|
|
261
|
+
const self = this;
|
|
262
|
+
return (self.disabled ?? false) || (self.loading ?? false);
|
|
263
|
+
}
|
|
264
|
+
// Subclasses get this for free instead of redeclaring it per component.
|
|
265
|
+
get hasForwardedLabel() {
|
|
266
|
+
return Boolean(this.forwardedAriaLabel || this.forwardedAriaLabelledBy);
|
|
267
|
+
}
|
|
268
|
+
};
|
|
269
|
+
SpectreBaseElement.properties = {};
|
|
270
|
+
|
|
271
|
+
// src/utils/dom.ts
|
|
272
|
+
function hasMeaningfulContent(nodes) {
|
|
273
|
+
return nodes.some((node) => {
|
|
274
|
+
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
275
|
+
return true;
|
|
276
|
+
}
|
|
277
|
+
if (node.nodeType === Node.TEXT_NODE) {
|
|
278
|
+
return (node.textContent?.trim().length ?? 0) > 0;
|
|
279
|
+
}
|
|
280
|
+
return false;
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
// src/utils/projectable.ts
|
|
285
|
+
var SpectreProjectableElement = class extends SpectreBaseElement {
|
|
286
|
+
constructor() {
|
|
287
|
+
super(...arguments);
|
|
288
|
+
this.projectedContent = [];
|
|
289
|
+
}
|
|
290
|
+
get hasProjectedContent() {
|
|
291
|
+
return hasMeaningfulContent(this.projectedContent);
|
|
292
|
+
}
|
|
293
|
+
connectedCallback() {
|
|
294
|
+
super.connectedCallback();
|
|
295
|
+
this.syncProjectedContent();
|
|
296
|
+
this.startContentObserver();
|
|
297
|
+
}
|
|
298
|
+
disconnectedCallback() {
|
|
299
|
+
this.stopContentObserver();
|
|
300
|
+
super.disconnectedCallback();
|
|
301
|
+
}
|
|
302
|
+
update(changedProperties) {
|
|
303
|
+
this.stopContentObserver();
|
|
304
|
+
super.update(changedProperties);
|
|
305
|
+
this.startContentObserver();
|
|
306
|
+
}
|
|
307
|
+
syncProjectedContent() {
|
|
308
|
+
const nextProjectedContent = [];
|
|
309
|
+
const sourceNodes = [
|
|
310
|
+
...this.childNodes,
|
|
311
|
+
...this.getContentContainer()?.childNodes ?? []
|
|
312
|
+
];
|
|
313
|
+
sourceNodes.forEach((node) => {
|
|
314
|
+
if (!this.isInternalNode(node) && !nextProjectedContent.includes(node)) {
|
|
315
|
+
nextProjectedContent.push(node);
|
|
316
|
+
}
|
|
317
|
+
});
|
|
318
|
+
const hasChanged = nextProjectedContent.length !== this.projectedContent.length || nextProjectedContent.some((node, index) => node !== this.projectedContent[index]);
|
|
319
|
+
if (hasChanged) {
|
|
320
|
+
this.projectedContent = nextProjectedContent;
|
|
321
|
+
}
|
|
322
|
+
return hasChanged;
|
|
323
|
+
}
|
|
324
|
+
startContentObserver() {
|
|
325
|
+
if (this.contentObserver) {
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
this.contentObserver = new MutationObserver((mutations) => {
|
|
329
|
+
const isInternalMovement = mutations.every(
|
|
330
|
+
(mutation) => [...mutation.removedNodes].every(
|
|
331
|
+
(node) => this.isInternalNode(node) || this.contains(node)
|
|
332
|
+
) && [...mutation.addedNodes].every((node) => this.isInternalNode(node))
|
|
333
|
+
);
|
|
334
|
+
if (isInternalMovement) {
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
337
|
+
if (this.syncProjectedContent()) {
|
|
338
|
+
this.requestUpdate();
|
|
339
|
+
}
|
|
340
|
+
});
|
|
341
|
+
this.contentObserver.observe(this, { childList: true });
|
|
342
|
+
}
|
|
343
|
+
stopContentObserver() {
|
|
344
|
+
this.contentObserver?.disconnect();
|
|
345
|
+
this.contentObserver = void 0;
|
|
346
|
+
}
|
|
347
|
+
};
|
|
348
|
+
var FOCUSABLE_SELECTOR = [
|
|
349
|
+
"a[href]",
|
|
350
|
+
"button:not([disabled])",
|
|
351
|
+
"input:not([disabled])",
|
|
352
|
+
"select:not([disabled])",
|
|
353
|
+
"textarea:not([disabled])",
|
|
354
|
+
'[tabindex]:not([tabindex="-1"])'
|
|
355
|
+
].join(",");
|
|
356
|
+
var SpectreModalElement = class extends SpectreProjectableElement {
|
|
357
|
+
constructor() {
|
|
358
|
+
super(...arguments);
|
|
359
|
+
this.fullWidth = false;
|
|
360
|
+
this.open = false;
|
|
361
|
+
this.previouslyFocusedElement = null;
|
|
362
|
+
this.handleDocumentKeydown = (event) => {
|
|
363
|
+
if (!this.open) {
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
if (event.key === "Escape") {
|
|
367
|
+
this.close();
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
if (event.key === "Tab") {
|
|
371
|
+
this.trapFocus(event);
|
|
372
|
+
}
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
get id() {
|
|
376
|
+
return super.id;
|
|
377
|
+
}
|
|
378
|
+
set id(value) {
|
|
379
|
+
super.id = value;
|
|
380
|
+
}
|
|
381
|
+
get title() {
|
|
382
|
+
return super.title;
|
|
383
|
+
}
|
|
384
|
+
set title(value) {
|
|
385
|
+
super.title = value;
|
|
386
|
+
}
|
|
387
|
+
getContentContainer() {
|
|
388
|
+
return this.querySelector("[data-sp-modal-native]");
|
|
389
|
+
}
|
|
390
|
+
isInternalNode(node) {
|
|
391
|
+
if (node.nodeType !== Node.ELEMENT_NODE) {
|
|
392
|
+
return false;
|
|
393
|
+
}
|
|
394
|
+
const el = node;
|
|
395
|
+
return el.hasAttribute("data-sp-modal-native") || el.hasAttribute("data-sp-modal-overlay");
|
|
396
|
+
}
|
|
397
|
+
willUpdate(changedProperties) {
|
|
398
|
+
if (changedProperties.has("fullWidth") && this.fullWidth == null) {
|
|
399
|
+
this.fullWidth = false;
|
|
400
|
+
}
|
|
401
|
+
if (changedProperties.has("open") && this.open == null) {
|
|
402
|
+
this.open = false;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
updated(changedProperties) {
|
|
406
|
+
super.updated(changedProperties);
|
|
407
|
+
if (!changedProperties.has("open")) {
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
410
|
+
if (this.open) {
|
|
411
|
+
this.previouslyFocusedElement = document.activeElement;
|
|
412
|
+
this.focusFirstElement();
|
|
413
|
+
} else if (this.previouslyFocusedElement) {
|
|
414
|
+
this.previouslyFocusedElement.focus();
|
|
415
|
+
this.previouslyFocusedElement = null;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
connectedCallback() {
|
|
419
|
+
super.connectedCallback();
|
|
420
|
+
document.addEventListener("keydown", this.handleDocumentKeydown);
|
|
421
|
+
}
|
|
422
|
+
disconnectedCallback() {
|
|
423
|
+
document.removeEventListener("keydown", this.handleDocumentKeydown);
|
|
424
|
+
super.disconnectedCallback();
|
|
425
|
+
}
|
|
426
|
+
get modalElement() {
|
|
427
|
+
return this.querySelector("[data-sp-modal-native]");
|
|
428
|
+
}
|
|
429
|
+
get focusableElements() {
|
|
430
|
+
const modal = this.modalElement;
|
|
431
|
+
if (!modal) {
|
|
432
|
+
return [];
|
|
433
|
+
}
|
|
434
|
+
return Array.from(modal.querySelectorAll(FOCUSABLE_SELECTOR));
|
|
435
|
+
}
|
|
436
|
+
focusFirstElement() {
|
|
437
|
+
const [first] = this.focusableElements;
|
|
438
|
+
(first ?? this.modalElement)?.focus();
|
|
439
|
+
}
|
|
440
|
+
trapFocus(event) {
|
|
441
|
+
const focusable = this.focusableElements;
|
|
442
|
+
if (focusable.length === 0) {
|
|
443
|
+
event.preventDefault();
|
|
444
|
+
return;
|
|
445
|
+
}
|
|
446
|
+
const first = focusable[0];
|
|
447
|
+
const last = focusable[focusable.length - 1];
|
|
448
|
+
const active = document.activeElement;
|
|
449
|
+
if (event.shiftKey && active === first) {
|
|
450
|
+
event.preventDefault();
|
|
451
|
+
last?.focus();
|
|
452
|
+
} else if (!event.shiftKey && active === last) {
|
|
453
|
+
event.preventDefault();
|
|
454
|
+
first?.focus();
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
close() {
|
|
458
|
+
if (!this.open) {
|
|
459
|
+
return;
|
|
460
|
+
}
|
|
461
|
+
this.open = false;
|
|
462
|
+
this.dispatchEvent(new CustomEvent("sp-close", { bubbles: true }));
|
|
463
|
+
}
|
|
464
|
+
get overlayClasses() {
|
|
465
|
+
return spectreUi.getModalOverlayClasses({ open: this.open ?? false });
|
|
466
|
+
}
|
|
467
|
+
get modalClasses() {
|
|
468
|
+
return spectreUi.getModalClasses({
|
|
469
|
+
open: this.open ?? false,
|
|
470
|
+
fullWidth: this.fullWidth ?? false
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
render() {
|
|
474
|
+
const isHidden = !this.open;
|
|
475
|
+
return lit.html`<div
|
|
476
|
+
aria-hidden="${ifDefined_js.ifDefined(isHidden ? "true" : void 0)}"
|
|
477
|
+
class="${this.overlayClasses}"
|
|
478
|
+
data-sp-modal-overlay
|
|
479
|
+
@click="${(event) => {
|
|
480
|
+
if (event.target === event.currentTarget) {
|
|
481
|
+
this.close();
|
|
482
|
+
}
|
|
483
|
+
}}"
|
|
484
|
+
>
|
|
485
|
+
<div
|
|
486
|
+
aria-describedby="${ifDefined_js.ifDefined(this.forwardedAriaDescribedBy)}"
|
|
487
|
+
aria-hidden="${ifDefined_js.ifDefined(isHidden ? "true" : void 0)}"
|
|
488
|
+
aria-label="${ifDefined_js.ifDefined(this.forwardedAriaLabel)}"
|
|
489
|
+
aria-labelledby="${ifDefined_js.ifDefined(this.forwardedAriaLabelledBy)}"
|
|
490
|
+
aria-modal="true"
|
|
491
|
+
class="${this.modalClasses}"
|
|
492
|
+
data-sp-modal-native
|
|
493
|
+
id="${ifDefined_js.ifDefined(this.id || void 0)}"
|
|
494
|
+
role="dialog"
|
|
495
|
+
tabindex="-1"
|
|
496
|
+
title="${ifDefined_js.ifDefined(this.title || void 0)}"
|
|
497
|
+
>
|
|
498
|
+
${this.hasProjectedContent ? this.projectedContent : lit.nothing}
|
|
499
|
+
</div>
|
|
500
|
+
</div>`;
|
|
501
|
+
}
|
|
502
|
+
};
|
|
503
|
+
SpectreModalElement.properties = {
|
|
504
|
+
fullWidth: { attribute: "full-width", type: Boolean, reflect: true },
|
|
505
|
+
open: { type: Boolean, reflect: true }
|
|
506
|
+
};
|
|
507
|
+
function defineSpectreModal(tagName = "sp-modal") {
|
|
508
|
+
const existingElement = customElements.get(tagName);
|
|
509
|
+
if (existingElement) {
|
|
510
|
+
return existingElement;
|
|
511
|
+
}
|
|
512
|
+
customElements.define(tagName, SpectreModalElement);
|
|
513
|
+
return SpectreModalElement;
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
exports.SpectreModalElement = SpectreModalElement;
|
|
517
|
+
exports.defineSpectreModal = defineSpectreModal;
|
|
518
|
+
//# sourceMappingURL=modal.cjs.map
|
|
519
|
+
//# sourceMappingURL=modal.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/utils/base.ts","../src/utils/dom.ts","../src/utils/projectable.ts","../src/components/modal/sp-modal.ts"],"names":["LitElement","getModalOverlayClasses","getModalClasses","html","ifDefined","nothing"],"mappings":"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","file":"modal.cjs","sourcesContent":["import { LitElement, type PropertyDeclarations } from 'lit'\n\nexport class SpectreBaseElement extends LitElement {\n static properties: PropertyDeclarations = {}\n\n private _ariaLabel: string | null = null\n private _ariaLabelledBy: string | null = null\n private _ariaDescribedBy: string | null = null\n private _autocapitalize = ''\n private _autofocus = false\n private _spellcheck: boolean | null = null\n private _title = ''\n private _id = ''\n\n get ariaLabel(): string | null {\n return this._ariaLabel\n }\n\n set ariaLabel(value: string | null) {\n if (this._ariaLabel === value) {\n return\n }\n this._ariaLabel = value\n this._removeHostAttribute('aria-label')\n this.requestUpdate()\n }\n\n get ariaLabelledBy(): string | null {\n return this._ariaLabelledBy\n }\n\n set ariaLabelledBy(value: string | null) {\n if (this._ariaLabelledBy === value) {\n return\n }\n this._ariaLabelledBy = value\n this._removeHostAttribute('aria-labelledby')\n this.requestUpdate()\n }\n\n get ariaDescribedBy(): string | null {\n return this._ariaDescribedBy\n }\n\n set ariaDescribedBy(value: string | null) {\n if (this._ariaDescribedBy === value) {\n return\n }\n this._ariaDescribedBy = value\n this._removeHostAttribute('aria-describedby')\n this.requestUpdate()\n }\n\n override get autocapitalize(): string {\n return this._autocapitalize\n }\n\n override set autocapitalize(value: string | undefined | null) {\n const normalizedValue = value ?? ''\n if (this._autocapitalize === normalizedValue) {\n return\n }\n this._autocapitalize = normalizedValue\n this._removeHostAttribute('autocapitalize')\n this.requestUpdate()\n }\n\n override get spellcheck(): boolean {\n return this._spellcheck ?? super.spellcheck\n }\n\n override set spellcheck(value: boolean | undefined | null) {\n if (this._spellcheck === value) {\n return\n }\n this._spellcheck = value ?? null\n this._removeHostAttribute('spellcheck')\n this.requestUpdate()\n }\n\n override get title(): string {\n return this._title\n }\n\n override set title(value: string | undefined | null) {\n const normalizedValue = value ?? ''\n if (this._title === normalizedValue) {\n return\n }\n this._title = normalizedValue\n this._removeHostAttribute('title')\n this.requestUpdate()\n }\n\n override get id(): string {\n return this._id\n }\n\n override set id(value: string | undefined | null) {\n const normalizedValue = value ?? ''\n if (this._id === normalizedValue) {\n return\n }\n this._id = normalizedValue\n this._removeHostAttribute('id')\n this.requestUpdate()\n }\n\n override get autofocus(): boolean {\n return this._autofocus\n }\n\n override set autofocus(value: boolean | undefined | null) {\n const normalizedValue = !!value\n if (this._autofocus === normalizedValue) {\n return\n }\n this._autofocus = normalizedValue\n this._removeHostAttribute('autofocus')\n this.requestUpdate()\n }\n\n // Spectre components intentionally render in light DOM so the global\n // `@phcdevworks/spectre-ui` styling contract can apply directly.\n createRenderRoot(): this {\n return this\n }\n\n override connectedCallback(): void {\n super.connectedCallback()\n\n const proxiedAttributes = [\n 'id',\n 'title',\n 'autocapitalize',\n 'autofocus',\n 'spellcheck',\n 'aria-label',\n 'aria-labelledby',\n 'aria-describedby'\n ]\n\n proxiedAttributes.forEach((attr) => {\n const value = super.getAttribute(attr)\n if (value !== null) {\n this.setAttribute(attr, value)\n }\n })\n }\n\n override getAttribute(qualifiedName: string): string | null {\n switch (qualifiedName) {\n case 'id':\n return this.id || null\n case 'title':\n return this.title || null\n case 'autocapitalize':\n return this.autocapitalize || null\n case 'autofocus':\n return this.autofocus ? '' : null\n case 'spellcheck':\n return this._spellcheck !== null ? String(this._spellcheck) : null\n case 'aria-label':\n return this.ariaLabel\n case 'aria-labelledby':\n return this.ariaLabelledBy\n case 'aria-describedby':\n return this.ariaDescribedBy\n default:\n return super.getAttribute(qualifiedName)\n }\n }\n\n override hasAttribute(qualifiedName: string): boolean {\n switch (qualifiedName) {\n case 'id':\n return this.id !== ''\n case 'title':\n return this.title !== ''\n case 'autocapitalize':\n return this.autocapitalize !== ''\n case 'autofocus':\n return this.autofocus\n case 'spellcheck':\n return this._spellcheck !== null\n case 'aria-label':\n return this.ariaLabel !== null\n case 'aria-labelledby':\n return this.ariaLabelledBy !== null\n case 'aria-describedby':\n return this.ariaDescribedBy !== null\n default:\n return super.hasAttribute(qualifiedName)\n }\n }\n\n override setAttribute(qualifiedName: string, value: string): void {\n switch (qualifiedName) {\n case 'id':\n this.id = value\n break\n case 'title':\n this.title = value\n break\n case 'autocapitalize':\n this.autocapitalize = value\n break\n case 'autofocus':\n this.autofocus = true\n break\n case 'spellcheck':\n this.spellcheck = value !== 'false'\n break\n case 'aria-label':\n this.ariaLabel = value\n break\n case 'aria-labelledby':\n this.ariaLabelledBy = value\n break\n case 'aria-describedby':\n this.ariaDescribedBy = value\n break\n default:\n super.setAttribute(qualifiedName, value)\n }\n }\n\n override removeAttribute(qualifiedName: string): void {\n switch (qualifiedName) {\n case 'id':\n this.id = ''\n break\n case 'title':\n this.title = ''\n break\n case 'autocapitalize':\n this.autocapitalize = ''\n break\n case 'autofocus':\n this.autofocus = false\n break\n case 'spellcheck':\n this.spellcheck = null\n break\n case 'aria-label':\n this.ariaLabel = null\n break\n case 'aria-labelledby':\n this.ariaLabelledBy = null\n break\n case 'aria-describedby':\n this.ariaDescribedBy = null\n break\n default:\n super.removeAttribute(qualifiedName)\n }\n }\n\n private _removeHostAttribute(name: string): void {\n const host = this as unknown as HTMLElement\n if (HTMLElement.prototype.hasAttribute.call(host, name)) {\n // Use the native removeAttribute to avoid our own overridden version\n // which would reset the internal state.\n HTMLElement.prototype.removeAttribute.call(host, name)\n }\n }\n\n protected get forwardedAriaLabel(): string | undefined {\n const value = this.ariaLabel?.trim()\n return value ? value : undefined\n }\n\n protected get forwardedAriaLabelledBy(): string | undefined {\n const value = this.ariaLabelledBy?.trim()\n return value ? value : undefined\n }\n\n protected get forwardedAriaDescribedBy(): string | undefined {\n const value = this.ariaDescribedBy?.trim()\n return value ? value : undefined\n }\n\n // Subclasses that expose `disabled`/`loading` properties get this disabled\n // calculation for free instead of redeclaring it per component.\n protected get isDisabled(): boolean {\n const self = this as unknown as { disabled?: boolean; loading?: boolean }\n return (self.disabled ?? false) || (self.loading ?? false)\n }\n\n // Subclasses get this for free instead of redeclaring it per component.\n protected get hasForwardedLabel(): boolean {\n return Boolean(this.forwardedAriaLabel || this.forwardedAriaLabelledBy)\n }\n}\n","export function hasMeaningfulContent(nodes: readonly Node[]): boolean {\n return nodes.some((node) => {\n if (node.nodeType === Node.ELEMENT_NODE) {\n return true;\n }\n\n if (node.nodeType === Node.TEXT_NODE) {\n return (node.textContent?.trim().length ?? 0) > 0;\n }\n\n return false;\n });\n}\n","import { SpectreBaseElement } from './base';\nimport { hasMeaningfulContent } from './dom';\n\nexport abstract class SpectreProjectableElement extends SpectreBaseElement {\n protected projectedContent: Node[] = [];\n private contentObserver?: MutationObserver | undefined;\n\n // Return the native container whose existing children are also treated as\n // projected content sources (e.g. the rendered <button>, <select>, <label>).\n protected abstract getContentContainer(): Element | null;\n\n // Return true if the node was rendered by this component and should not be\n // treated as external projected content.\n protected abstract isInternalNode(node: Node): boolean;\n\n protected get hasProjectedContent(): boolean {\n return hasMeaningfulContent(this.projectedContent);\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n this.syncProjectedContent();\n this.startContentObserver();\n }\n\n override disconnectedCallback(): void {\n this.stopContentObserver();\n super.disconnectedCallback();\n }\n\n protected override update(changedProperties: Map<PropertyKey, unknown>): void {\n this.stopContentObserver();\n super.update(changedProperties);\n this.startContentObserver();\n }\n\n protected syncProjectedContent(): boolean {\n const nextProjectedContent: Node[] = [];\n const sourceNodes = [\n ...this.childNodes,\n ...(this.getContentContainer()?.childNodes ?? []),\n ];\n\n sourceNodes.forEach((node) => {\n if (!this.isInternalNode(node) && !nextProjectedContent.includes(node)) {\n nextProjectedContent.push(node);\n }\n });\n\n const hasChanged =\n nextProjectedContent.length !== this.projectedContent.length ||\n nextProjectedContent.some((node, index) => node !== this.projectedContent[index]);\n\n if (hasChanged) {\n this.projectedContent = nextProjectedContent;\n }\n\n return hasChanged;\n }\n\n private startContentObserver(): void {\n if (this.contentObserver) {\n return;\n }\n\n this.contentObserver = new MutationObserver((mutations) => {\n const isInternalMovement = mutations.every((mutation) =>\n [...mutation.removedNodes].every(\n (node) => this.isInternalNode(node) || this.contains(node),\n ) &&\n [...mutation.addedNodes].every((node) => this.isInternalNode(node)),\n );\n\n if (isInternalMovement) {\n return;\n }\n\n if (this.syncProjectedContent()) {\n this.requestUpdate();\n }\n });\n\n this.contentObserver.observe(this, { childList: true });\n }\n\n private stopContentObserver(): void {\n this.contentObserver?.disconnect();\n this.contentObserver = undefined;\n }\n}\n","import { html, nothing } from 'lit'\nimport { ifDefined } from 'lit/directives/if-defined.js'\n\nimport { SpectreProjectableElement } from '../../utils/projectable'\n\nimport {\n getModalClasses,\n getModalOverlayClasses\n} from '@phcdevworks/spectre-ui'\n\nconst FOCUSABLE_SELECTOR = [\n 'a[href]',\n 'button:not([disabled])',\n 'input:not([disabled])',\n 'select:not([disabled])',\n 'textarea:not([disabled])',\n '[tabindex]:not([tabindex=\"-1\"])'\n].join(',')\n\nexport interface SpectreModalProps {\n ariaLabel?: string | null\n ariaLabelledBy?: string | null\n ariaDescribedBy?: string | null\n fullWidth?: boolean | undefined\n id?: string | null | undefined\n open?: boolean | undefined\n title?: string | null | undefined\n}\n\nexport class SpectreModalElement\n extends SpectreProjectableElement\n implements SpectreModalProps\n{\n static properties = {\n fullWidth: { attribute: 'full-width', type: Boolean, reflect: true },\n open: { type: Boolean, reflect: true }\n }\n\n fullWidth: boolean | undefined = false\n open: boolean | undefined = false\n\n private previouslyFocusedElement: HTMLElement | null = null\n\n override get id(): string {\n return super.id\n }\n\n override set id(value: string | null | undefined) {\n super.id = value\n }\n\n override get title(): string {\n return super.title\n }\n\n override set title(value: string | null | undefined) {\n super.title = value\n }\n\n protected override getContentContainer(): Element | null {\n return this.querySelector('[data-sp-modal-native]')\n }\n\n protected override isInternalNode(node: Node): boolean {\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return false\n }\n const el = node as Element\n return (\n el.hasAttribute('data-sp-modal-native') ||\n el.hasAttribute('data-sp-modal-overlay')\n )\n }\n\n protected override willUpdate(\n changedProperties: Map<PropertyKey, unknown>\n ): void {\n if (changedProperties.has('fullWidth') && this.fullWidth == null) {\n this.fullWidth = false\n }\n if (changedProperties.has('open') && this.open == null) {\n this.open = false\n }\n }\n\n protected override updated(\n changedProperties: Map<PropertyKey, unknown>\n ): void {\n super.updated(changedProperties)\n\n if (!changedProperties.has('open')) {\n return\n }\n\n if (this.open) {\n this.previouslyFocusedElement = document.activeElement as HTMLElement\n this.focusFirstElement()\n } else if (this.previouslyFocusedElement) {\n this.previouslyFocusedElement.focus()\n this.previouslyFocusedElement = null\n }\n }\n\n override connectedCallback(): void {\n super.connectedCallback()\n document.addEventListener('keydown', this.handleDocumentKeydown)\n }\n\n override disconnectedCallback(): void {\n document.removeEventListener('keydown', this.handleDocumentKeydown)\n super.disconnectedCallback()\n }\n\n private get modalElement(): HTMLElement | null {\n return this.querySelector('[data-sp-modal-native]')\n }\n\n private get focusableElements(): HTMLElement[] {\n const modal = this.modalElement\n if (!modal) {\n return []\n }\n return Array.from(modal.querySelectorAll<HTMLElement>(FOCUSABLE_SELECTOR))\n }\n\n private focusFirstElement(): void {\n const [first] = this.focusableElements\n ;(first ?? this.modalElement)?.focus()\n }\n\n private handleDocumentKeydown = (event: KeyboardEvent): void => {\n if (!this.open) {\n return\n }\n\n if (event.key === 'Escape') {\n this.close()\n return\n }\n\n if (event.key === 'Tab') {\n this.trapFocus(event)\n }\n }\n\n private trapFocus(event: KeyboardEvent): void {\n const focusable = this.focusableElements\n if (focusable.length === 0) {\n event.preventDefault()\n return\n }\n\n const first = focusable[0]\n const last = focusable[focusable.length - 1]\n const active = document.activeElement\n\n if (event.shiftKey && active === first) {\n event.preventDefault()\n last?.focus()\n } else if (!event.shiftKey && active === last) {\n event.preventDefault()\n first?.focus()\n }\n }\n\n private close(): void {\n if (!this.open) {\n return\n }\n this.open = false\n this.dispatchEvent(new CustomEvent('sp-close', { bubbles: true }))\n }\n\n private get overlayClasses(): string {\n return getModalOverlayClasses({ open: this.open ?? false })\n }\n\n private get modalClasses(): string {\n return getModalClasses({\n open: this.open ?? false,\n fullWidth: this.fullWidth ?? false\n })\n }\n\n override render() {\n const isHidden = !this.open\n\n return html`<div\n aria-hidden=\"${ifDefined(isHidden ? 'true' : undefined)}\"\n class=\"${this.overlayClasses}\"\n data-sp-modal-overlay\n @click=\"${(event: Event) => {\n if (event.target === event.currentTarget) {\n this.close()\n }\n }}\"\n >\n <div\n aria-describedby=\"${ifDefined(this.forwardedAriaDescribedBy)}\"\n aria-hidden=\"${ifDefined(isHidden ? 'true' : undefined)}\"\n aria-label=\"${ifDefined(this.forwardedAriaLabel)}\"\n aria-labelledby=\"${ifDefined(this.forwardedAriaLabelledBy)}\"\n aria-modal=\"true\"\n class=\"${this.modalClasses}\"\n data-sp-modal-native\n id=\"${ifDefined(this.id || undefined)}\"\n role=\"dialog\"\n tabindex=\"-1\"\n title=\"${ifDefined(this.title || undefined)}\"\n >\n ${this.hasProjectedContent ? this.projectedContent : nothing}\n </div>\n </div>`\n }\n}\n\nexport function defineSpectreModal(\n tagName = 'sp-modal'\n): typeof SpectreModalElement {\n const existingElement = customElements.get(tagName)\n\n if (existingElement) {\n return existingElement as unknown as typeof SpectreModalElement\n }\n\n customElements.define(tagName, SpectreModalElement)\n return SpectreModalElement\n}\n"]}
|
package/dist/modal.d.cts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import * as lit_html from 'lit-html';
|
|
2
|
+
import { S as SpectreProjectableElement } from './projectable-DLOn6eaW.cjs';
|
|
3
|
+
import './base-D0s95V2v.cjs';
|
|
4
|
+
import 'lit';
|
|
5
|
+
|
|
6
|
+
interface SpectreModalProps {
|
|
7
|
+
ariaLabel?: string | null;
|
|
8
|
+
ariaLabelledBy?: string | null;
|
|
9
|
+
ariaDescribedBy?: string | null;
|
|
10
|
+
fullWidth?: boolean | undefined;
|
|
11
|
+
id?: string | null | undefined;
|
|
12
|
+
open?: boolean | undefined;
|
|
13
|
+
title?: string | null | undefined;
|
|
14
|
+
}
|
|
15
|
+
declare class SpectreModalElement extends SpectreProjectableElement implements SpectreModalProps {
|
|
16
|
+
static properties: {
|
|
17
|
+
fullWidth: {
|
|
18
|
+
attribute: string;
|
|
19
|
+
type: BooleanConstructor;
|
|
20
|
+
reflect: boolean;
|
|
21
|
+
};
|
|
22
|
+
open: {
|
|
23
|
+
type: BooleanConstructor;
|
|
24
|
+
reflect: boolean;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
fullWidth: boolean | undefined;
|
|
28
|
+
open: boolean | undefined;
|
|
29
|
+
private previouslyFocusedElement;
|
|
30
|
+
get id(): string;
|
|
31
|
+
set id(value: string | null | undefined);
|
|
32
|
+
get title(): string;
|
|
33
|
+
set title(value: string | null | undefined);
|
|
34
|
+
protected getContentContainer(): Element | null;
|
|
35
|
+
protected isInternalNode(node: Node): boolean;
|
|
36
|
+
protected willUpdate(changedProperties: Map<PropertyKey, unknown>): void;
|
|
37
|
+
protected updated(changedProperties: Map<PropertyKey, unknown>): void;
|
|
38
|
+
connectedCallback(): void;
|
|
39
|
+
disconnectedCallback(): void;
|
|
40
|
+
private get modalElement();
|
|
41
|
+
private get focusableElements();
|
|
42
|
+
private focusFirstElement;
|
|
43
|
+
private handleDocumentKeydown;
|
|
44
|
+
private trapFocus;
|
|
45
|
+
private close;
|
|
46
|
+
private get overlayClasses();
|
|
47
|
+
private get modalClasses();
|
|
48
|
+
render(): lit_html.TemplateResult<1>;
|
|
49
|
+
}
|
|
50
|
+
declare function defineSpectreModal(tagName?: string): typeof SpectreModalElement;
|
|
51
|
+
|
|
52
|
+
export { SpectreModalElement, type SpectreModalProps, defineSpectreModal };
|
package/dist/modal.d.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import * as lit_html from 'lit-html';
|
|
2
|
+
import { S as SpectreProjectableElement } from './projectable-D9YCo9NY.js';
|
|
3
|
+
import './base-D0s95V2v.js';
|
|
4
|
+
import 'lit';
|
|
5
|
+
|
|
6
|
+
interface SpectreModalProps {
|
|
7
|
+
ariaLabel?: string | null;
|
|
8
|
+
ariaLabelledBy?: string | null;
|
|
9
|
+
ariaDescribedBy?: string | null;
|
|
10
|
+
fullWidth?: boolean | undefined;
|
|
11
|
+
id?: string | null | undefined;
|
|
12
|
+
open?: boolean | undefined;
|
|
13
|
+
title?: string | null | undefined;
|
|
14
|
+
}
|
|
15
|
+
declare class SpectreModalElement extends SpectreProjectableElement implements SpectreModalProps {
|
|
16
|
+
static properties: {
|
|
17
|
+
fullWidth: {
|
|
18
|
+
attribute: string;
|
|
19
|
+
type: BooleanConstructor;
|
|
20
|
+
reflect: boolean;
|
|
21
|
+
};
|
|
22
|
+
open: {
|
|
23
|
+
type: BooleanConstructor;
|
|
24
|
+
reflect: boolean;
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
fullWidth: boolean | undefined;
|
|
28
|
+
open: boolean | undefined;
|
|
29
|
+
private previouslyFocusedElement;
|
|
30
|
+
get id(): string;
|
|
31
|
+
set id(value: string | null | undefined);
|
|
32
|
+
get title(): string;
|
|
33
|
+
set title(value: string | null | undefined);
|
|
34
|
+
protected getContentContainer(): Element | null;
|
|
35
|
+
protected isInternalNode(node: Node): boolean;
|
|
36
|
+
protected willUpdate(changedProperties: Map<PropertyKey, unknown>): void;
|
|
37
|
+
protected updated(changedProperties: Map<PropertyKey, unknown>): void;
|
|
38
|
+
connectedCallback(): void;
|
|
39
|
+
disconnectedCallback(): void;
|
|
40
|
+
private get modalElement();
|
|
41
|
+
private get focusableElements();
|
|
42
|
+
private focusFirstElement;
|
|
43
|
+
private handleDocumentKeydown;
|
|
44
|
+
private trapFocus;
|
|
45
|
+
private close;
|
|
46
|
+
private get overlayClasses();
|
|
47
|
+
private get modalClasses();
|
|
48
|
+
render(): lit_html.TemplateResult<1>;
|
|
49
|
+
}
|
|
50
|
+
declare function defineSpectreModal(tagName?: string): typeof SpectreModalElement;
|
|
51
|
+
|
|
52
|
+
export { SpectreModalElement, type SpectreModalProps, defineSpectreModal };
|