@phcdevworks/spectre-components 1.0.0 → 1.2.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 (66) hide show
  1. package/README.md +586 -107
  2. package/dist/base-B_9DJkh2.d.cts +38 -0
  3. package/dist/base-B_9DJkh2.d.ts +38 -0
  4. package/dist/button.cjs +252 -90
  5. package/dist/button.cjs.map +1 -1
  6. package/dist/button.d.cts +39 -37
  7. package/dist/button.d.ts +39 -37
  8. package/dist/button.js +252 -90
  9. package/dist/button.js.map +1 -1
  10. package/dist/checkbox.cjs +228 -67
  11. package/dist/checkbox.cjs.map +1 -1
  12. package/dist/checkbox.d.cts +21 -21
  13. package/dist/checkbox.d.ts +21 -21
  14. package/dist/checkbox.js +228 -67
  15. package/dist/checkbox.js.map +1 -1
  16. package/dist/fieldset.cjs +245 -56
  17. package/dist/fieldset.cjs.map +1 -1
  18. package/dist/fieldset.d.cts +35 -14
  19. package/dist/fieldset.d.ts +35 -14
  20. package/dist/fieldset.js +245 -56
  21. package/dist/fieldset.js.map +1 -1
  22. package/dist/form-9cZG1E9P.d.cts +10 -0
  23. package/dist/form-9cZG1E9P.d.ts +10 -0
  24. package/dist/index.cjs +647 -328
  25. package/dist/index.cjs.map +1 -1
  26. package/dist/index.d.cts +4 -4
  27. package/dist/index.d.ts +4 -4
  28. package/dist/index.js +647 -328
  29. package/dist/index.js.map +1 -1
  30. package/dist/input.cjs +262 -77
  31. package/dist/input.cjs.map +1 -1
  32. package/dist/input.d.cts +72 -40
  33. package/dist/input.d.ts +72 -40
  34. package/dist/input.js +262 -77
  35. package/dist/input.js.map +1 -1
  36. package/dist/label.cjs +217 -55
  37. package/dist/label.cjs.map +1 -1
  38. package/dist/label.d.cts +17 -10
  39. package/dist/label.d.ts +17 -10
  40. package/dist/label.js +217 -55
  41. package/dist/label.js.map +1 -1
  42. package/dist/{projectable-DcnBRiko.d.cts → projectable-CIfxi7dv.d.cts} +1 -1
  43. package/dist/{projectable-SzbPvXfM.d.ts → projectable-Ksv9eoIr.d.ts} +1 -1
  44. package/dist/radio.cjs +248 -67
  45. package/dist/radio.cjs.map +1 -1
  46. package/dist/radio.d.cts +23 -21
  47. package/dist/radio.d.ts +23 -21
  48. package/dist/radio.js +248 -67
  49. package/dist/radio.js.map +1 -1
  50. package/dist/select.cjs +230 -67
  51. package/dist/select.cjs.map +1 -1
  52. package/dist/select.d.cts +27 -27
  53. package/dist/select.d.ts +27 -27
  54. package/dist/select.js +230 -67
  55. package/dist/select.js.map +1 -1
  56. package/dist/textarea.cjs +256 -77
  57. package/dist/textarea.cjs.map +1 -1
  58. package/dist/textarea.d.cts +53 -32
  59. package/dist/textarea.d.ts +53 -32
  60. package/dist/textarea.js +256 -77
  61. package/dist/textarea.js.map +1 -1
  62. package/package.json +22 -12
  63. package/dist/base-DQtCQ-dP.d.cts +0 -22
  64. package/dist/base-DQtCQ-dP.d.ts +0 -22
  65. package/dist/form-iI7vV-3W.d.cts +0 -6
  66. package/dist/form-iI7vV-3W.d.ts +0 -6
package/dist/textarea.js CHANGED
@@ -7,22 +7,92 @@ import { getInputClasses } from '@phcdevworks/spectre-ui';
7
7
  var SpectreBaseElement = class extends LitElement {
8
8
  constructor() {
9
9
  super(...arguments);
10
- this.ariaLabel = null;
11
- this.ariaLabelledBy = null;
12
- this.ariaDescribedBy = null;
10
+ this._ariaLabel = null;
11
+ this._ariaLabelledBy = null;
12
+ this._ariaDescribedBy = null;
13
+ this._autocapitalize = "";
14
+ this._spellcheck = null;
15
+ this._title = "";
16
+ this._id = "";
17
+ }
18
+ get ariaLabel() {
19
+ return this._ariaLabel;
20
+ }
21
+ set ariaLabel(value) {
22
+ if (this._ariaLabel === value) {
23
+ return;
24
+ }
25
+ this._ariaLabel = value;
26
+ this._removeHostAttribute("aria-label");
27
+ this.requestUpdate();
28
+ }
29
+ get ariaLabelledBy() {
30
+ return this._ariaLabelledBy;
31
+ }
32
+ set ariaLabelledBy(value) {
33
+ if (this._ariaLabelledBy === value) {
34
+ return;
35
+ }
36
+ this._ariaLabelledBy = value;
37
+ this._removeHostAttribute("aria-labelledby");
38
+ this.requestUpdate();
39
+ }
40
+ get ariaDescribedBy() {
41
+ return this._ariaDescribedBy;
42
+ }
43
+ set ariaDescribedBy(value) {
44
+ if (this._ariaDescribedBy === value) {
45
+ return;
46
+ }
47
+ this._ariaDescribedBy = value;
48
+ this._removeHostAttribute("aria-describedby");
49
+ this.requestUpdate();
50
+ }
51
+ get autocapitalize() {
52
+ return this._autocapitalize;
53
+ }
54
+ set autocapitalize(value) {
55
+ const normalizedValue = value ?? "";
56
+ if (this._autocapitalize === normalizedValue) {
57
+ return;
58
+ }
59
+ this._autocapitalize = normalizedValue;
60
+ this._removeHostAttribute("autocapitalize");
61
+ this.requestUpdate();
62
+ }
63
+ get spellcheck() {
64
+ return this._spellcheck ?? super.spellcheck;
65
+ }
66
+ set spellcheck(value) {
67
+ if (this._spellcheck === value) {
68
+ return;
69
+ }
70
+ this._spellcheck = value ?? null;
71
+ this._removeHostAttribute("spellcheck");
72
+ this.requestUpdate();
73
+ }
74
+ get title() {
75
+ return this._title;
76
+ }
77
+ set title(value) {
78
+ const normalizedValue = value ?? "";
79
+ if (this._title === normalizedValue) {
80
+ return;
81
+ }
82
+ this._title = normalizedValue;
83
+ this._removeHostAttribute("title");
84
+ this.requestUpdate();
13
85
  }
14
86
  get id() {
15
- return this._id ?? "";
87
+ return this._id;
16
88
  }
17
89
  set id(value) {
18
- if ((this._id ?? "") === value) {
90
+ const normalizedValue = value ?? "";
91
+ if (this._id === normalizedValue) {
19
92
  return;
20
93
  }
21
- this._id = value;
22
- const host = this;
23
- if (HTMLElement.prototype.hasAttribute.call(host, "id")) {
24
- HTMLElement.prototype.removeAttribute.call(host, "id");
25
- }
94
+ this._id = normalizedValue;
95
+ this._removeHostAttribute("id");
26
96
  this.requestUpdate();
27
97
  }
28
98
  // Spectre components intentionally render in light DOM so the global
@@ -32,36 +102,121 @@ var SpectreBaseElement = class extends LitElement {
32
102
  }
33
103
  connectedCallback() {
34
104
  super.connectedCallback();
35
- const hostId = super.getAttribute("id");
36
- if (hostId !== null) {
37
- this.id = hostId;
38
- }
105
+ const proxiedAttributes = [
106
+ "id",
107
+ "title",
108
+ "autocapitalize",
109
+ "spellcheck",
110
+ "aria-label",
111
+ "aria-labelledby",
112
+ "aria-describedby"
113
+ ];
114
+ proxiedAttributes.forEach((attr) => {
115
+ const value = super.getAttribute(attr);
116
+ if (value !== null) {
117
+ this.setAttribute(attr, value);
118
+ }
119
+ });
39
120
  }
40
121
  getAttribute(qualifiedName) {
41
- if (qualifiedName === "id") {
42
- return this.id || null;
122
+ switch (qualifiedName) {
123
+ case "id":
124
+ return this.id || null;
125
+ case "title":
126
+ return this.title || null;
127
+ case "autocapitalize":
128
+ return this.autocapitalize || null;
129
+ case "spellcheck":
130
+ return this._spellcheck !== null ? String(this._spellcheck) : null;
131
+ case "aria-label":
132
+ return this.ariaLabel;
133
+ case "aria-labelledby":
134
+ return this.ariaLabelledBy;
135
+ case "aria-describedby":
136
+ return this.ariaDescribedBy;
137
+ default:
138
+ return super.getAttribute(qualifiedName);
43
139
  }
44
- return super.getAttribute(qualifiedName);
45
140
  }
46
141
  hasAttribute(qualifiedName) {
47
- if (qualifiedName === "id") {
48
- return this.id !== "";
142
+ switch (qualifiedName) {
143
+ case "id":
144
+ return this.id !== "";
145
+ case "title":
146
+ return this.title !== "";
147
+ case "autocapitalize":
148
+ return this.autocapitalize !== "";
149
+ case "spellcheck":
150
+ return this._spellcheck !== null;
151
+ case "aria-label":
152
+ return this.ariaLabel !== null;
153
+ case "aria-labelledby":
154
+ return this.ariaLabelledBy !== null;
155
+ case "aria-describedby":
156
+ return this.ariaDescribedBy !== null;
157
+ default:
158
+ return super.hasAttribute(qualifiedName);
49
159
  }
50
- return super.hasAttribute(qualifiedName);
51
160
  }
52
161
  setAttribute(qualifiedName, value) {
53
- if (qualifiedName === "id") {
54
- this.id = value;
55
- return;
162
+ switch (qualifiedName) {
163
+ case "id":
164
+ this.id = value;
165
+ break;
166
+ case "title":
167
+ this.title = value;
168
+ break;
169
+ case "autocapitalize":
170
+ this.autocapitalize = value;
171
+ break;
172
+ case "spellcheck":
173
+ this.spellcheck = value !== "false";
174
+ break;
175
+ case "aria-label":
176
+ this.ariaLabel = value;
177
+ break;
178
+ case "aria-labelledby":
179
+ this.ariaLabelledBy = value;
180
+ break;
181
+ case "aria-describedby":
182
+ this.ariaDescribedBy = value;
183
+ break;
184
+ default:
185
+ super.setAttribute(qualifiedName, value);
56
186
  }
57
- super.setAttribute(qualifiedName, value);
58
187
  }
59
188
  removeAttribute(qualifiedName) {
60
- if (qualifiedName === "id") {
61
- this.id = "";
62
- return;
189
+ switch (qualifiedName) {
190
+ case "id":
191
+ this.id = "";
192
+ break;
193
+ case "title":
194
+ this.title = "";
195
+ break;
196
+ case "autocapitalize":
197
+ this.autocapitalize = "";
198
+ break;
199
+ case "spellcheck":
200
+ this.spellcheck = null;
201
+ break;
202
+ case "aria-label":
203
+ this.ariaLabel = null;
204
+ break;
205
+ case "aria-labelledby":
206
+ this.ariaLabelledBy = null;
207
+ break;
208
+ case "aria-describedby":
209
+ this.ariaDescribedBy = null;
210
+ break;
211
+ default:
212
+ super.removeAttribute(qualifiedName);
213
+ }
214
+ }
215
+ _removeHostAttribute(name) {
216
+ const host = this;
217
+ if (HTMLElement.prototype.hasAttribute.call(host, name)) {
218
+ HTMLElement.prototype.removeAttribute.call(host, name);
63
219
  }
64
- super.removeAttribute(qualifiedName);
65
220
  }
66
221
  get forwardedAriaLabel() {
67
222
  const value = this.ariaLabel?.trim();
@@ -76,15 +231,17 @@ var SpectreBaseElement = class extends LitElement {
76
231
  return value ? value : void 0;
77
232
  }
78
233
  };
79
- SpectreBaseElement.properties = {
80
- ariaLabel: { attribute: "aria-label", type: String },
81
- ariaLabelledBy: { attribute: "aria-labelledby", type: String },
82
- ariaDescribedBy: { attribute: "aria-describedby", type: String }
83
- };
234
+ SpectreBaseElement.properties = {};
84
235
  var spectreInputSizes = ["sm", "md", "lg"];
85
236
  function isInputSize(value) {
86
237
  return spectreInputSizes.includes(value);
87
238
  }
239
+ function normalizeInt(value, fallback, min = 0) {
240
+ if (value == null || typeof value !== "number" || !Number.isInteger(value) || value < min) {
241
+ return fallback;
242
+ }
243
+ return value;
244
+ }
88
245
  var DEFAULT_ROWS = 2;
89
246
  var SpectreTextareaElement = class extends SpectreBaseElement {
90
247
  constructor() {
@@ -100,42 +257,59 @@ var SpectreTextareaElement = class extends SpectreBaseElement {
100
257
  this.rows = DEFAULT_ROWS;
101
258
  this.size = "md";
102
259
  this.success = false;
103
- this.title = "";
104
260
  this.value = "";
105
261
  }
262
+ get autocapitalize() {
263
+ return super.autocapitalize;
264
+ }
265
+ set autocapitalize(value) {
266
+ super.autocapitalize = value;
267
+ }
268
+ get id() {
269
+ return super.id;
270
+ }
271
+ set id(value) {
272
+ super.id = value;
273
+ }
274
+ get spellcheck() {
275
+ return super.spellcheck;
276
+ }
277
+ set spellcheck(value) {
278
+ super.spellcheck = value;
279
+ }
280
+ get title() {
281
+ return super.title;
282
+ }
283
+ set title(value) {
284
+ super.title = value;
285
+ }
106
286
  willUpdate(changedProperties) {
107
- if (changedProperties.has("size") && !isInputSize(this.size)) {
287
+ if (changedProperties.has("size") && (this.size == null || !isInputSize(this.size))) {
108
288
  this.size = "md";
109
289
  }
110
290
  if (changedProperties.has("rows")) {
111
- if (this.rows == null || !Number.isInteger(this.rows) || this.rows < 1) {
112
- this.rows = DEFAULT_ROWS;
113
- }
291
+ this.rows = normalizeInt(this.rows, DEFAULT_ROWS, 1);
114
292
  }
115
293
  if (changedProperties.has("value") && this.value == null) {
116
294
  this.value = "";
117
295
  }
118
296
  if (changedProperties.has("maxlength")) {
119
- if (this.maxlength == null || !Number.isInteger(this.maxlength) || this.maxlength < 0) {
120
- this.maxlength = void 0;
121
- }
297
+ this.maxlength = normalizeInt(this.maxlength, void 0);
122
298
  }
123
299
  if (changedProperties.has("minlength")) {
124
- if (this.minlength == null || !Number.isInteger(this.minlength) || this.minlength < 0) {
125
- this.minlength = void 0;
126
- }
300
+ this.minlength = normalizeInt(this.minlength, void 0);
127
301
  }
128
302
  }
129
303
  get textareaClasses() {
130
304
  return getInputClasses({
131
- fullWidth: this.fullWidth,
132
- pill: this.pill,
305
+ fullWidth: this.fullWidth ?? false,
306
+ pill: this.pill ?? false,
133
307
  size: this.size,
134
308
  state: this.isDisabled ? this.disabled ? "disabled" : "loading" : this.invalid ? "error" : this.success ? "success" : "default"
135
309
  });
136
310
  }
137
311
  get isDisabled() {
138
- return this.disabled || this.loading;
312
+ return (this.disabled ?? false) || (this.loading ?? false);
139
313
  }
140
314
  get nativeTextarea() {
141
315
  return this.querySelector("[data-sp-textarea-native]");
@@ -155,40 +329,45 @@ var SpectreTextareaElement = class extends SpectreBaseElement {
155
329
  this.nativeTextarea?.blur();
156
330
  }
157
331
  render() {
158
- return html`
159
- <textarea
160
- aria-busy=${this.loading ? "true" : "false"}
161
- aria-describedby=${ifDefined(this.forwardedAriaDescribedBy)}
162
- aria-invalid=${ifDefined(this.invalid ? "true" : void 0)}
163
- aria-label=${ifDefined(this.forwardedAriaLabel)}
164
- aria-labelledby=${ifDefined(this.forwardedAriaLabelledBy)}
165
- autocomplete=${ifDefined(this.autocomplete)}
166
- ?autofocus=${this.autofocus}
167
- class=${this.textareaClasses}
168
- data-sp-textarea-native
169
- ?disabled=${this.isDisabled}
170
- form=${ifDefined(this.form)}
171
- inputmode=${ifDefined(this.inputmode)}
172
- ?readonly=${this.readonly}
173
- ?required=${this.required}
174
- id=${ifDefined(this.id || void 0)}
175
- maxlength=${ifDefined(this.maxlength)}
176
- minlength=${ifDefined(this.minlength)}
177
- name=${ifDefined(this.name)}
178
- placeholder=${ifDefined(this.placeholder)}
179
- rows=${this.rows}
180
- title=${ifDefined(this.title || void 0)}
181
- .value=${live(this.value)}
182
- @change=${this.handleChange}
183
- @input=${this.handleInput}
184
- ></textarea>
185
- `;
332
+ return html`<textarea
333
+ aria-busy="${this.loading ? "true" : "false"}"
334
+ aria-describedby="${ifDefined(this.forwardedAriaDescribedBy)}"
335
+ aria-invalid="${ifDefined(this.invalid ? "true" : void 0)}"
336
+ aria-label="${ifDefined(this.forwardedAriaLabel)}"
337
+ aria-labelledby="${ifDefined(this.forwardedAriaLabelledBy)}"
338
+ autocapitalize="${ifDefined(this.autocapitalize || void 0)}"
339
+ autocomplete="${ifDefined(this.autocomplete || void 0)}"
340
+ ?autofocus="${this.autofocus}"
341
+ class="${this.textareaClasses}"
342
+ data-sp-textarea-native
343
+ ?disabled="${this.isDisabled}"
344
+ enterkeyhint="${ifDefined(this.enterkeyhint || void 0)}"
345
+ form="${ifDefined(this.form || void 0)}"
346
+ inputmode="${ifDefined(this.inputmode || void 0)}"
347
+ ?readonly="${this.readonly}"
348
+ ?required="${this.required}"
349
+ id="${ifDefined(this.id || void 0)}"
350
+ maxlength="${ifDefined(this.maxlength)}"
351
+ minlength="${ifDefined(this.minlength)}"
352
+ name="${ifDefined(this.name || void 0)}"
353
+ placeholder="${ifDefined(this.placeholder || void 0)}"
354
+ rows="${this.rows}"
355
+ spellcheck="${ifDefined(
356
+ this.spellcheck === void 0 ? void 0 : String(this.spellcheck)
357
+ )}"
358
+ title="${ifDefined(this.title || void 0)}"
359
+ .value="${live(this.value)}"
360
+ @change="${this.handleChange}"
361
+ @input="${this.handleInput}"
362
+ ></textarea>`;
186
363
  }
187
364
  };
188
365
  SpectreTextareaElement.properties = {
366
+ autocapitalize: { type: String, reflect: true },
189
367
  autocomplete: { type: String, reflect: true },
190
368
  autofocus: { type: Boolean, reflect: true },
191
369
  disabled: { type: Boolean, reflect: true },
370
+ enterkeyhint: { type: String, reflect: true },
192
371
  form: { type: String },
193
372
  fullWidth: { attribute: "full-width", type: Boolean, reflect: true },
194
373
  inputmode: { type: String, reflect: true },
@@ -201,10 +380,10 @@ SpectreTextareaElement.properties = {
201
380
  placeholder: { type: String, reflect: true },
202
381
  readonly: { type: Boolean, reflect: true },
203
382
  required: { type: Boolean, reflect: true },
204
- rows: { type: Number },
383
+ rows: { type: Number, reflect: true },
205
384
  size: { type: String, reflect: true },
385
+ spellcheck: { type: Boolean, reflect: true },
206
386
  success: { type: Boolean, reflect: true },
207
- title: { type: String, reflect: true },
208
387
  value: { type: String }
209
388
  };
210
389
  function defineSpectreTextarea(tagName = "sp-textarea") {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/utils/base.ts","../src/utils/form.ts","../src/components/textarea/sp-textarea.ts"],"names":[],"mappings":"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","file":"textarea.js","sourcesContent":["import { LitElement, type PropertyDeclarations } from 'lit';\n\nexport class SpectreBaseElement extends LitElement {\n static properties: PropertyDeclarations = {\n ariaLabel: { attribute: 'aria-label', type: String },\n ariaLabelledBy: { attribute: 'aria-labelledby', type: String },\n ariaDescribedBy: { attribute: 'aria-describedby', type: String },\n };\n\n ariaLabel: string | null = null;\n ariaLabelledBy: string | null = null;\n ariaDescribedBy: string | null = null;\n\n private _id?: string;\n\n override get id(): string {\n return this._id ?? '';\n }\n\n override set id(value: string) {\n if ((this._id ?? '') === value) {\n return;\n }\n\n this._id = value;\n\n const host = this as unknown as HTMLElement;\n if (HTMLElement.prototype.hasAttribute.call(host, 'id')) {\n HTMLElement.prototype.removeAttribute.call(host, 'id');\n }\n\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 hostId = super.getAttribute('id');\n if (hostId !== null) {\n this.id = hostId;\n }\n }\n\n override getAttribute(qualifiedName: string): string | null {\n if (qualifiedName === 'id') {\n return this.id || null;\n }\n\n return super.getAttribute(qualifiedName);\n }\n\n override hasAttribute(qualifiedName: string): boolean {\n if (qualifiedName === 'id') {\n return this.id !== '';\n }\n\n return super.hasAttribute(qualifiedName);\n }\n\n override setAttribute(qualifiedName: string, value: string): void {\n if (qualifiedName === 'id') {\n this.id = value;\n return;\n }\n\n super.setAttribute(qualifiedName, value);\n }\n\n override removeAttribute(qualifiedName: string): void {\n if (qualifiedName === 'id') {\n this.id = '';\n return;\n }\n\n super.removeAttribute(qualifiedName);\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","import { type InputSize } from '@phcdevworks/spectre-ui';\n\nexport const spectreInputSizes = ['sm', 'md', 'lg'] as const;\nexport type SpectreInputSize = (typeof spectreInputSizes)[number];\n\nexport function isInputSize(value: string): value is InputSize {\n return (spectreInputSizes as readonly string[]).includes(value);\n}\n\nexport const spectreInputTypes = [\n 'text',\n 'email',\n 'password',\n 'search',\n 'tel',\n 'url',\n 'number',\n 'date',\n 'datetime-local',\n 'month',\n 'time',\n 'week',\n] as const;\n\nexport type SpectreInputType = (typeof spectreInputTypes)[number];\n\nexport function isInputType(value: string): value is SpectreInputType {\n return (spectreInputTypes as readonly string[]).includes(value);\n}\n","import { html } from 'lit';\nimport { live } from 'lit/directives/live.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\n\nimport { SpectreBaseElement } from '../../utils/base';\nimport { isInputSize, type SpectreInputSize } from '../../utils/form';\n\nimport { getInputClasses } from '@phcdevworks/spectre-ui';\n\nexport interface SpectreTextareaProps {\n ariaLabel?: string | null;\n ariaLabelledBy?: string | null;\n ariaDescribedBy?: string | null;\n autocomplete?: string;\n autofocus?: boolean;\n disabled?: boolean;\n form?: string;\n fullWidth?: boolean;\n inputmode?: string;\n invalid?: boolean;\n loading?: boolean;\n maxlength?: number | undefined;\n minlength?: number | undefined;\n name?: string | undefined;\n pill?: boolean;\n placeholder?: string | undefined;\n readonly?: boolean;\n required?: boolean;\n rows?: number;\n size?: SpectreInputSize;\n success?: boolean;\n title?: string;\n value?: string;\n}\n\nconst DEFAULT_ROWS = 2;\n\nexport class SpectreTextareaElement\n extends SpectreBaseElement\n implements SpectreTextareaProps {\n static properties = {\n autocomplete: { type: String, reflect: true },\n autofocus: { type: Boolean, reflect: true },\n disabled: { type: Boolean, reflect: true },\n form: { type: String },\n fullWidth: { attribute: 'full-width', type: Boolean, reflect: true },\n inputmode: { type: String, reflect: true },\n invalid: { type: Boolean, reflect: true },\n loading: { type: Boolean, reflect: true },\n maxlength: { type: Number, reflect: true },\n minlength: { type: Number, reflect: true },\n name: { type: String, reflect: true },\n pill: { type: Boolean, reflect: true },\n placeholder: { type: String, reflect: true },\n readonly: { type: Boolean, reflect: true },\n required: { type: Boolean, reflect: true },\n rows: { type: Number },\n size: { type: String, reflect: true },\n success: { type: Boolean, reflect: true },\n title: { type: String, reflect: true },\n value: { type: String },\n };\n\n autocomplete?: string;\n autofocus = false;\n disabled = false;\n form?: string;\n fullWidth = false;\n inputmode?: string;\n invalid = false;\n loading = false;\n maxlength?: number | undefined;\n minlength?: number | undefined;\n name?: string;\n pill = false;\n placeholder?: string;\n readonly = false;\n required = false;\n rows = DEFAULT_ROWS;\n size: SpectreInputSize = 'md';\n success = false;\n override title = '';\n value = '';\n\n protected override willUpdate(\n changedProperties: Map<PropertyKey, unknown>,\n ): void {\n if (changedProperties.has('size') && !isInputSize(this.size)) {\n this.size = 'md';\n }\n\n if (changedProperties.has('rows')) {\n if (\n this.rows == null ||\n !Number.isInteger(this.rows) ||\n this.rows < 1\n ) {\n this.rows = DEFAULT_ROWS;\n }\n }\n\n if (changedProperties.has('value') && this.value == null) {\n this.value = '';\n }\n\n if (changedProperties.has('maxlength')) {\n if (\n this.maxlength == null ||\n !Number.isInteger(this.maxlength) ||\n this.maxlength < 0\n ) {\n this.maxlength = undefined;\n }\n }\n\n if (changedProperties.has('minlength')) {\n if (\n this.minlength == null ||\n !Number.isInteger(this.minlength) ||\n this.minlength < 0\n ) {\n this.minlength = undefined;\n }\n }\n }\n\n private get textareaClasses(): string {\n return getInputClasses({\n fullWidth: this.fullWidth,\n pill: this.pill,\n size: this.size,\n state: this.isDisabled\n ? this.disabled\n ? 'disabled'\n : 'loading'\n : this.invalid\n ? 'error'\n : this.success\n ? 'success'\n : 'default',\n });\n }\n\n private get isDisabled(): boolean {\n return this.disabled || this.loading;\n }\n\n private get nativeTextarea(): HTMLTextAreaElement | null {\n return this.querySelector('[data-sp-textarea-native]');\n }\n\n private handleInput(event: Event): void {\n const textarea = event.currentTarget as HTMLTextAreaElement;\n this.value = textarea.value;\n }\n\n private handleChange(event: Event): void {\n const textarea = event.currentTarget as HTMLTextAreaElement;\n this.value = textarea.value;\n }\n\n override focus(options?: FocusOptions): void {\n this.nativeTextarea?.focus(options);\n }\n\n override blur(): void {\n this.nativeTextarea?.blur();\n }\n\n override render() {\n return html`\n <textarea\n aria-busy=${this.loading ? 'true' : 'false'}\n aria-describedby=${ifDefined(this.forwardedAriaDescribedBy)}\n aria-invalid=${ifDefined(this.invalid ? 'true' : undefined)}\n aria-label=${ifDefined(this.forwardedAriaLabel)}\n aria-labelledby=${ifDefined(this.forwardedAriaLabelledBy)}\n autocomplete=${ifDefined(this.autocomplete)}\n ?autofocus=${this.autofocus}\n class=${this.textareaClasses}\n data-sp-textarea-native\n ?disabled=${this.isDisabled}\n form=${ifDefined(this.form)}\n inputmode=${ifDefined(this.inputmode)}\n ?readonly=${this.readonly}\n ?required=${this.required}\n id=${ifDefined(this.id || undefined)}\n maxlength=${ifDefined(this.maxlength)}\n minlength=${ifDefined(this.minlength)}\n name=${ifDefined(this.name)}\n placeholder=${ifDefined(this.placeholder)}\n rows=${this.rows}\n title=${ifDefined(this.title || undefined)}\n .value=${live(this.value)}\n @change=${this.handleChange}\n @input=${this.handleInput}\n ></textarea>\n `;\n }\n}\n\nexport function defineSpectreTextarea(\n tagName = 'sp-textarea',\n): typeof SpectreTextareaElement {\n const existingElement = customElements.get(tagName);\n\n if (existingElement) {\n return existingElement as unknown as typeof SpectreTextareaElement;\n }\n\n customElements.define(tagName, SpectreTextareaElement);\n return SpectreTextareaElement;\n}\n"]}
1
+ {"version":3,"sources":["../src/utils/base.ts","../src/utils/form.ts","../src/components/textarea/sp-textarea.ts"],"names":[],"mappings":"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","file":"textarea.js","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 _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 // 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 '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 '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 '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 '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 '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","import {\n type ButtonSize,\n type ButtonVariant,\n type InputSize,\n} from '@phcdevworks/spectre-ui';\n\nexport const spectreInputSizes = ['sm', 'md', 'lg'] as const;\nexport type SpectreInputSize = (typeof spectreInputSizes)[number];\n\nexport function isInputSize(value: unknown): value is InputSize | ButtonSize {\n return (spectreInputSizes as readonly string[]).includes(value as string);\n}\n\nexport const spectreButtonVariants = [\n 'primary',\n 'secondary',\n 'ghost',\n 'danger',\n 'success',\n 'cta',\n 'accent',\n] as const;\n\nexport type SpectreButtonVariant = (typeof spectreButtonVariants)[number];\n\nexport function isButtonVariant(value: unknown): value is ButtonVariant {\n return (spectreButtonVariants as readonly string[]).includes(value as string);\n}\n\nexport const spectreButtonTypes = ['button', 'submit', 'reset'] as const;\n\nexport type SpectreButtonType = (typeof spectreButtonTypes)[number];\n\nexport function isButtonType(value: unknown): value is SpectreButtonType {\n return (spectreButtonTypes as readonly string[]).includes(value as string);\n}\n\nexport const spectreInputTypes = [\n 'text',\n 'email',\n 'password',\n 'search',\n 'tel',\n 'url',\n 'number',\n 'date',\n 'datetime-local',\n 'month',\n 'time',\n 'week',\n] as const;\n\nexport type SpectreInputType = (typeof spectreInputTypes)[number];\n\nexport function isInputType(value: unknown): value is SpectreInputType {\n return (spectreInputTypes as readonly string[]).includes(value as string);\n}\n\nexport function normalizeInt(\n value: unknown,\n fallback: number | undefined,\n min = 0,\n): number | undefined {\n if (\n value == null ||\n typeof value !== 'number' ||\n !Number.isInteger(value) ||\n value < min\n ) {\n return fallback;\n }\n return value;\n}\n","import { html } from 'lit';\nimport { live } from 'lit/directives/live.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\n\nimport { SpectreBaseElement } from '../../utils/base';\nimport {\n isInputSize,\n type SpectreInputSize,\n normalizeInt,\n} from '../../utils/form';\n\nimport { getInputClasses } from '@phcdevworks/spectre-ui';\n\nexport interface SpectreTextareaProps {\n ariaLabel?: string | null;\n ariaLabelledBy?: string | null;\n ariaDescribedBy?: string | null;\n autocapitalize?: string | undefined;\n autocomplete?: string | undefined;\n autofocus?: boolean | undefined;\n disabled?: boolean | undefined;\n enterkeyhint?: string | undefined;\n form?: string | undefined;\n fullWidth?: boolean | undefined;\n id?: string | null | undefined;\n inputmode?: string | undefined;\n invalid?: boolean | undefined;\n loading?: boolean | undefined;\n maxlength?: number | undefined;\n minlength?: number | undefined;\n name?: string | undefined;\n pill?: boolean | undefined;\n placeholder?: string | undefined;\n readonly?: boolean | undefined;\n required?: boolean | undefined;\n rows?: number | undefined;\n size?: SpectreInputSize | undefined;\n spellcheck?: boolean | undefined;\n success?: boolean | undefined;\n title?: string | null | undefined;\n value?: string | undefined;\n}\n\nconst DEFAULT_ROWS = 2;\n\nexport class SpectreTextareaElement\n extends SpectreBaseElement\n implements SpectreTextareaProps {\n static properties = {\n autocapitalize: { type: String, reflect: true },\n autocomplete: { type: String, reflect: true },\n autofocus: { type: Boolean, reflect: true },\n disabled: { type: Boolean, reflect: true },\n enterkeyhint: { type: String, reflect: true },\n form: { type: String },\n fullWidth: { attribute: 'full-width', type: Boolean, reflect: true },\n inputmode: { type: String, reflect: true },\n invalid: { type: Boolean, reflect: true },\n loading: { type: Boolean, reflect: true },\n maxlength: { type: Number, reflect: true },\n minlength: { type: Number, reflect: true },\n name: { type: String, reflect: true },\n pill: { type: Boolean, reflect: true },\n placeholder: { type: String, reflect: true },\n readonly: { type: Boolean, reflect: true },\n required: { type: Boolean, reflect: true },\n rows: { type: Number, reflect: true },\n size: { type: String, reflect: true },\n spellcheck: { type: Boolean, reflect: true },\n success: { type: Boolean, reflect: true },\n value: { type: String },\n };\n\n override get autocapitalize(): string {\n return super.autocapitalize;\n }\n\n override set autocapitalize(value: string | null | undefined) {\n super.autocapitalize = value;\n }\n\n autocomplete: string | undefined;\n autofocus = false;\n disabled = false;\n enterkeyhint: string | undefined;\n form: string | undefined;\n fullWidth = false;\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 inputmode: string | undefined;\n invalid = false;\n loading = false;\n maxlength: number | undefined;\n minlength: number | undefined;\n name: string | undefined;\n pill = false;\n placeholder: string | undefined;\n readonly = false;\n required = false;\n rows: number | undefined = DEFAULT_ROWS;\n size: SpectreInputSize | undefined = 'md';\n\n override get spellcheck(): boolean {\n return super.spellcheck;\n }\n\n override set spellcheck(value: boolean | null | undefined) {\n super.spellcheck = value;\n }\n\n success = false;\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 value: string | undefined = '';\n\n protected override willUpdate(\n changedProperties: Map<PropertyKey, unknown>,\n ): void {\n if (changedProperties.has('size') && (this.size == null || !isInputSize(this.size))) {\n this.size = 'md';\n }\n\n if (changedProperties.has('rows')) {\n this.rows = normalizeInt(this.rows, DEFAULT_ROWS, 1) as number;\n }\n\n if (changedProperties.has('value') && this.value == null) {\n this.value = '';\n }\n\n if (changedProperties.has('maxlength')) {\n this.maxlength = normalizeInt(this.maxlength, undefined);\n }\n\n if (changedProperties.has('minlength')) {\n this.minlength = normalizeInt(this.minlength, undefined);\n }\n }\n\n private get textareaClasses(): string {\n return getInputClasses({\n fullWidth: this.fullWidth ?? false,\n pill: this.pill ?? false,\n size: this.size as SpectreInputSize,\n state: this.isDisabled\n ? this.disabled\n ? 'disabled'\n : 'loading'\n : this.invalid\n ? 'error'\n : this.success\n ? 'success'\n : 'default',\n });\n }\n\n private get isDisabled(): boolean {\n return (this.disabled ?? false) || (this.loading ?? false);\n }\n\n private get nativeTextarea(): HTMLTextAreaElement | null {\n return this.querySelector('[data-sp-textarea-native]');\n }\n\n private handleInput(event: Event): void {\n const textarea = event.currentTarget as HTMLTextAreaElement;\n this.value = textarea.value;\n }\n\n private handleChange(event: Event): void {\n const textarea = event.currentTarget as HTMLTextAreaElement;\n this.value = textarea.value;\n }\n\n override focus(options?: FocusOptions): void {\n this.nativeTextarea?.focus(options);\n }\n\n override blur(): void {\n this.nativeTextarea?.blur();\n }\n\n override render() {\n return html`<textarea\n aria-busy=\"${this.loading ? 'true' : 'false'}\"\n aria-describedby=\"${ifDefined(this.forwardedAriaDescribedBy)}\"\n aria-invalid=\"${ifDefined(this.invalid ? 'true' : undefined)}\"\n aria-label=\"${ifDefined(this.forwardedAriaLabel)}\"\n aria-labelledby=\"${ifDefined(this.forwardedAriaLabelledBy)}\"\n autocapitalize=\"${ifDefined(this.autocapitalize || undefined)}\"\n autocomplete=\"${ifDefined(this.autocomplete || undefined)}\"\n ?autofocus=\"${this.autofocus}\"\n class=\"${this.textareaClasses}\"\n data-sp-textarea-native\n ?disabled=\"${this.isDisabled}\"\n enterkeyhint=\"${ifDefined(this.enterkeyhint || undefined)}\"\n form=\"${ifDefined(this.form || undefined)}\"\n inputmode=\"${ifDefined(this.inputmode || undefined)}\"\n ?readonly=\"${this.readonly}\"\n ?required=\"${this.required}\"\n id=\"${ifDefined(this.id || undefined)}\"\n maxlength=\"${ifDefined(this.maxlength)}\"\n minlength=\"${ifDefined(this.minlength)}\"\n name=\"${ifDefined(this.name || undefined)}\"\n placeholder=\"${ifDefined(this.placeholder || undefined)}\"\n rows=\"${this.rows}\"\n spellcheck=\"${ifDefined(\n this.spellcheck === undefined ? undefined : String(this.spellcheck),\n )}\"\n title=\"${ifDefined(this.title || undefined)}\"\n .value=\"${live(this.value)}\"\n @change=\"${this.handleChange}\"\n @input=\"${this.handleInput}\"\n ></textarea>`;\n }\n}\n\nexport function defineSpectreTextarea(\n tagName = 'sp-textarea',\n): typeof SpectreTextareaElement {\n const existingElement = customElements.get(tagName);\n\n if (existingElement) {\n return existingElement as unknown as typeof SpectreTextareaElement;\n }\n\n customElements.define(tagName, SpectreTextareaElement);\n return SpectreTextareaElement;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@phcdevworks/spectre-components",
3
- "version": "1.0.0",
3
+ "version": "1.2.0",
4
4
  "description": "@phcdevworks/spectre-components is the Lit-based component layer of the Spectre system for reusable, accessible, framework-agnostic web components.",
5
5
  "keywords": [
6
6
  "phcdevworks",
@@ -29,7 +29,11 @@
29
29
  "url": "https://github.com/phcdevworks/spectre-components/issues"
30
30
  },
31
31
  "homepage": "https://github.com/phcdevworks/spectre-components#readme",
32
+ "engines": {
33
+ "node": "^22.12.0 || >=24.0.0"
34
+ },
32
35
  "type": "module",
36
+ "packageManager": "npm@11.15.0",
33
37
  "main": "./dist/index.cjs",
34
38
  "module": "./dist/index.js",
35
39
  "types": "./dist/index.d.ts",
@@ -90,11 +94,14 @@
90
94
  "build": "tsup --config tsup.config.ts",
91
95
  "clean": "rm -rf dist coverage",
92
96
  "dev": "tsup --config tsup.config.ts --watch",
97
+ "typecheck": "tsc --noEmit",
98
+ "release:propose": "node --experimental-strip-types scripts/propose-version.ts",
93
99
  "lint": "eslint .",
94
100
  "format": "prettier --write .",
95
101
  "test": "vitest run",
96
102
  "test:watch": "vitest",
97
- "check": "npm run lint && npm run test && npm run build"
103
+ "check": "npm run lint && npm run typecheck && npm run test && npm run build && npm run check:exports",
104
+ "check:exports": "node --experimental-strip-types scripts/check-exports.ts"
98
105
  },
99
106
  "publishConfig": {
100
107
  "access": "public"
@@ -103,22 +110,25 @@
103
110
  "typescript": "^5.9 || ^6.0"
104
111
  },
105
112
  "dependencies": {
106
- "@phcdevworks/spectre-tokens": "^2.4.0",
107
- "@phcdevworks/spectre-ui": "^1.4.0",
108
- "lit": "^3.3.2"
113
+ "@phcdevworks/spectre-tokens": "^2.6.0",
114
+ "@phcdevworks/spectre-ui": "^1.6.0",
115
+ "lit": "^3.3.3"
109
116
  },
110
117
  "devDependencies": {
111
118
  "@eslint/js": "^10.0.1",
112
- "@types/node": "^25.6.0",
113
- "@typescript-eslint/eslint-plugin": "^8.59.0",
114
- "@typescript-eslint/parser": "^8.59.0",
115
- "eslint": "^10.2.1",
116
- "globals": "^17.5.0",
119
+ "@types/node": "^25.9.1",
120
+ "@typescript-eslint/eslint-plugin": "^8.59.4",
121
+ "@typescript-eslint/parser": "^8.59.4",
122
+ "eslint": "^10.4.0",
123
+ "globals": "^17.6.0",
117
124
  "happy-dom": "^20.9.0",
125
+ "jiti": "^2.7.0",
118
126
  "prettier": "^3.8.3",
127
+ "tailwindcss": "^4.3.0",
119
128
  "tsup": "^8.5.1",
120
129
  "typescript": "^6.0.3",
121
- "typescript-eslint": "^8.59.0",
122
- "vitest": "^4.1.5"
130
+ "typescript-eslint": "^8.59.4",
131
+ "vite": "^8.0.14",
132
+ "vitest": "^4.1.7"
123
133
  }
124
134
  }
@@ -1,22 +0,0 @@
1
- import { LitElement, PropertyDeclarations } from 'lit';
2
-
3
- declare class SpectreBaseElement extends LitElement {
4
- static properties: PropertyDeclarations;
5
- ariaLabel: string | null;
6
- ariaLabelledBy: string | null;
7
- ariaDescribedBy: string | null;
8
- private _id?;
9
- get id(): string;
10
- set id(value: string);
11
- createRenderRoot(): this;
12
- connectedCallback(): void;
13
- getAttribute(qualifiedName: string): string | null;
14
- hasAttribute(qualifiedName: string): boolean;
15
- setAttribute(qualifiedName: string, value: string): void;
16
- removeAttribute(qualifiedName: string): void;
17
- protected get forwardedAriaLabel(): string | undefined;
18
- protected get forwardedAriaLabelledBy(): string | undefined;
19
- protected get forwardedAriaDescribedBy(): string | undefined;
20
- }
21
-
22
- export { SpectreBaseElement as S };
@@ -1,22 +0,0 @@
1
- import { LitElement, PropertyDeclarations } from 'lit';
2
-
3
- declare class SpectreBaseElement extends LitElement {
4
- static properties: PropertyDeclarations;
5
- ariaLabel: string | null;
6
- ariaLabelledBy: string | null;
7
- ariaDescribedBy: string | null;
8
- private _id?;
9
- get id(): string;
10
- set id(value: string);
11
- createRenderRoot(): this;
12
- connectedCallback(): void;
13
- getAttribute(qualifiedName: string): string | null;
14
- hasAttribute(qualifiedName: string): boolean;
15
- setAttribute(qualifiedName: string, value: string): void;
16
- removeAttribute(qualifiedName: string): void;
17
- protected get forwardedAriaLabel(): string | undefined;
18
- protected get forwardedAriaLabelledBy(): string | undefined;
19
- protected get forwardedAriaDescribedBy(): string | undefined;
20
- }
21
-
22
- export { SpectreBaseElement as S };
@@ -1,6 +0,0 @@
1
- declare const spectreInputSizes: readonly ["sm", "md", "lg"];
2
- type SpectreInputSize = (typeof spectreInputSizes)[number];
3
- declare const spectreInputTypes: readonly ["text", "email", "password", "search", "tel", "url", "number", "date", "datetime-local", "month", "time", "week"];
4
- type SpectreInputType = (typeof spectreInputTypes)[number];
5
-
6
- export { type SpectreInputSize as S, type SpectreInputType as a, spectreInputTypes as b, spectreInputSizes as s };