@phcdevworks/spectre-components 1.1.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 (64) hide show
  1. package/README.md +559 -153
  2. package/dist/{base-2rD8EmdC.d.cts → base-B_9DJkh2.d.cts} +6 -0
  3. package/dist/{base-2rD8EmdC.d.ts → base-B_9DJkh2.d.ts} +6 -0
  4. package/dist/button.cjs +95 -33
  5. package/dist/button.cjs.map +1 -1
  6. package/dist/button.d.cts +27 -19
  7. package/dist/button.d.ts +27 -19
  8. package/dist/button.js +95 -33
  9. package/dist/button.js.map +1 -1
  10. package/dist/checkbox.cjs +65 -4
  11. package/dist/checkbox.cjs.map +1 -1
  12. package/dist/checkbox.d.cts +12 -7
  13. package/dist/checkbox.d.ts +12 -7
  14. package/dist/checkbox.js +65 -4
  15. package/dist/checkbox.js.map +1 -1
  16. package/dist/fieldset.cjs +95 -5
  17. package/dist/fieldset.cjs.map +1 -1
  18. package/dist/fieldset.d.cts +33 -7
  19. package/dist/fieldset.d.ts +33 -7
  20. package/dist/fieldset.js +95 -5
  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 +340 -84
  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 +340 -84
  29. package/dist/index.js.map +1 -1
  30. package/dist/input.cjs +88 -5
  31. package/dist/input.cjs.map +1 -1
  32. package/dist/input.d.cts +47 -10
  33. package/dist/input.d.ts +47 -10
  34. package/dist/input.js +88 -5
  35. package/dist/input.js.map +1 -1
  36. package/dist/label.cjs +69 -3
  37. package/dist/label.cjs.map +1 -1
  38. package/dist/label.d.cts +18 -6
  39. package/dist/label.d.ts +18 -6
  40. package/dist/label.js +69 -3
  41. package/dist/label.js.map +1 -1
  42. package/dist/{projectable-BzDQ4xp_.d.cts → projectable-CIfxi7dv.d.cts} +1 -1
  43. package/dist/{projectable-s3SgvjGX.d.ts → projectable-Ksv9eoIr.d.ts} +1 -1
  44. package/dist/radio.cjs +85 -4
  45. package/dist/radio.cjs.map +1 -1
  46. package/dist/radio.d.cts +14 -7
  47. package/dist/radio.d.ts +14 -7
  48. package/dist/radio.js +85 -4
  49. package/dist/radio.js.map +1 -1
  50. package/dist/select.cjs +69 -6
  51. package/dist/select.cjs.map +1 -1
  52. package/dist/select.d.cts +14 -9
  53. package/dist/select.d.ts +14 -9
  54. package/dist/select.js +69 -6
  55. package/dist/select.js.map +1 -1
  56. package/dist/textarea.cjs +84 -5
  57. package/dist/textarea.cjs.map +1 -1
  58. package/dist/textarea.d.cts +35 -9
  59. package/dist/textarea.d.ts +35 -9
  60. package/dist/textarea.js +84 -5
  61. package/dist/textarea.js.map +1 -1
  62. package/package.json +21 -12
  63. package/dist/form-iI7vV-3W.d.cts +0 -6
  64. package/dist/form-iI7vV-3W.d.ts +0 -6
package/dist/index.cjs CHANGED
@@ -1,17 +1,62 @@
1
1
  'use strict';
2
2
 
3
+ var spectreUi = require('@phcdevworks/spectre-ui');
3
4
  var lit = require('lit');
4
5
  var ifDefined_js = require('lit/directives/if-defined.js');
5
- var spectreUi = require('@phcdevworks/spectre-ui');
6
6
  var live_js = require('lit/directives/live.js');
7
7
 
8
- // src/components/button/sp-button.ts
8
+ // src/utils/form.ts
9
+ var spectreInputSizes = ["sm", "md", "lg"];
10
+ function isInputSize(value) {
11
+ return spectreInputSizes.includes(value);
12
+ }
13
+ var spectreButtonVariants = [
14
+ "primary",
15
+ "secondary",
16
+ "ghost",
17
+ "danger",
18
+ "success",
19
+ "cta",
20
+ "accent"
21
+ ];
22
+ function isButtonVariant(value) {
23
+ return spectreButtonVariants.includes(value);
24
+ }
25
+ var spectreButtonTypes = ["button", "submit", "reset"];
26
+ function isButtonType(value) {
27
+ return spectreButtonTypes.includes(value);
28
+ }
29
+ var spectreInputTypes = [
30
+ "text",
31
+ "email",
32
+ "password",
33
+ "search",
34
+ "tel",
35
+ "url",
36
+ "number",
37
+ "date",
38
+ "datetime-local",
39
+ "month",
40
+ "time",
41
+ "week"
42
+ ];
43
+ function isInputType(value) {
44
+ return spectreInputTypes.includes(value);
45
+ }
46
+ function normalizeInt(value, fallback, min = 0) {
47
+ if (value == null || typeof value !== "number" || !Number.isInteger(value) || value < min) {
48
+ return fallback;
49
+ }
50
+ return value;
51
+ }
9
52
  var SpectreBaseElement = class extends lit.LitElement {
10
53
  constructor() {
11
54
  super(...arguments);
12
55
  this._ariaLabel = null;
13
56
  this._ariaLabelledBy = null;
14
57
  this._ariaDescribedBy = null;
58
+ this._autocapitalize = "";
59
+ this._spellcheck = null;
15
60
  this._title = "";
16
61
  this._id = "";
17
62
  }
@@ -48,6 +93,29 @@ var SpectreBaseElement = class extends lit.LitElement {
48
93
  this._removeHostAttribute("aria-describedby");
49
94
  this.requestUpdate();
50
95
  }
96
+ get autocapitalize() {
97
+ return this._autocapitalize;
98
+ }
99
+ set autocapitalize(value) {
100
+ const normalizedValue = value ?? "";
101
+ if (this._autocapitalize === normalizedValue) {
102
+ return;
103
+ }
104
+ this._autocapitalize = normalizedValue;
105
+ this._removeHostAttribute("autocapitalize");
106
+ this.requestUpdate();
107
+ }
108
+ get spellcheck() {
109
+ return this._spellcheck ?? super.spellcheck;
110
+ }
111
+ set spellcheck(value) {
112
+ if (this._spellcheck === value) {
113
+ return;
114
+ }
115
+ this._spellcheck = value ?? null;
116
+ this._removeHostAttribute("spellcheck");
117
+ this.requestUpdate();
118
+ }
51
119
  get title() {
52
120
  return this._title;
53
121
  }
@@ -82,6 +150,8 @@ var SpectreBaseElement = class extends lit.LitElement {
82
150
  const proxiedAttributes = [
83
151
  "id",
84
152
  "title",
153
+ "autocapitalize",
154
+ "spellcheck",
85
155
  "aria-label",
86
156
  "aria-labelledby",
87
157
  "aria-describedby"
@@ -99,6 +169,10 @@ var SpectreBaseElement = class extends lit.LitElement {
99
169
  return this.id || null;
100
170
  case "title":
101
171
  return this.title || null;
172
+ case "autocapitalize":
173
+ return this.autocapitalize || null;
174
+ case "spellcheck":
175
+ return this._spellcheck !== null ? String(this._spellcheck) : null;
102
176
  case "aria-label":
103
177
  return this.ariaLabel;
104
178
  case "aria-labelledby":
@@ -115,6 +189,10 @@ var SpectreBaseElement = class extends lit.LitElement {
115
189
  return this.id !== "";
116
190
  case "title":
117
191
  return this.title !== "";
192
+ case "autocapitalize":
193
+ return this.autocapitalize !== "";
194
+ case "spellcheck":
195
+ return this._spellcheck !== null;
118
196
  case "aria-label":
119
197
  return this.ariaLabel !== null;
120
198
  case "aria-labelledby":
@@ -133,6 +211,12 @@ var SpectreBaseElement = class extends lit.LitElement {
133
211
  case "title":
134
212
  this.title = value;
135
213
  break;
214
+ case "autocapitalize":
215
+ this.autocapitalize = value;
216
+ break;
217
+ case "spellcheck":
218
+ this.spellcheck = value !== "false";
219
+ break;
136
220
  case "aria-label":
137
221
  this.ariaLabel = value;
138
222
  break;
@@ -154,6 +238,12 @@ var SpectreBaseElement = class extends lit.LitElement {
154
238
  case "title":
155
239
  this.title = "";
156
240
  break;
241
+ case "autocapitalize":
242
+ this.autocapitalize = "";
243
+ break;
244
+ case "spellcheck":
245
+ this.spellcheck = null;
246
+ break;
157
247
  case "aria-label":
158
248
  this.ariaLabel = null;
159
249
  break;
@@ -265,32 +355,13 @@ var SpectreProjectableElement = class extends SpectreBaseElement {
265
355
  this.contentObserver = void 0;
266
356
  }
267
357
  };
268
- var spectreButtonVariants = [
269
- "primary",
270
- "secondary",
271
- "ghost",
272
- "danger",
273
- "success",
274
- "cta",
275
- "accent"
276
- ];
277
- var spectreButtonSizes = ["sm", "md", "lg"];
278
- var spectreButtonTypes = ["button", "submit", "reset"];
279
- function isButtonVariant(value) {
280
- return spectreButtonVariants.includes(value);
281
- }
282
- function isButtonSize(value) {
283
- return spectreButtonSizes.includes(value);
284
- }
285
- function isButtonType(value) {
286
- return spectreButtonTypes.includes(value);
287
- }
288
358
  var SpectreButtonElement = class extends SpectreProjectableElement {
289
359
  constructor() {
290
360
  super(...arguments);
291
361
  this.autofocus = false;
292
362
  this.disabled = false;
293
363
  this.fullWidth = false;
364
+ this.iconOnly = false;
294
365
  this.loading = false;
295
366
  this.loadingLabel = "Loading";
296
367
  this.pill = false;
@@ -299,6 +370,18 @@ var SpectreButtonElement = class extends SpectreProjectableElement {
299
370
  this.variant = "primary";
300
371
  this.value = "";
301
372
  }
373
+ get id() {
374
+ return super.id;
375
+ }
376
+ set id(value) {
377
+ super.id = value;
378
+ }
379
+ get title() {
380
+ return super.title;
381
+ }
382
+ set title(value) {
383
+ super.title = value;
384
+ }
302
385
  getContentContainer() {
303
386
  return this.querySelector("[data-sp-button-native]");
304
387
  }
@@ -310,13 +393,13 @@ var SpectreButtonElement = class extends SpectreProjectableElement {
310
393
  return el.hasAttribute("data-sp-button-native") || el.hasAttribute("data-sp-button-loading-label") || el.hasAttribute("data-sp-button-label-fallback");
311
394
  }
312
395
  willUpdate(changedProperties) {
313
- if (changedProperties.has("variant") && !isButtonVariant(this.variant)) {
396
+ if (changedProperties.has("variant") && (this.variant == null || !isButtonVariant(this.variant))) {
314
397
  this.variant = "primary";
315
398
  }
316
- if (changedProperties.has("size") && !isButtonSize(this.size)) {
399
+ if (changedProperties.has("size") && (this.size == null || !isInputSize(this.size))) {
317
400
  this.size = "md";
318
401
  }
319
- if (changedProperties.has("type") && !isButtonType(this.type)) {
402
+ if (changedProperties.has("type") && (this.type == null || !isButtonType(this.type))) {
320
403
  this.type = "button";
321
404
  }
322
405
  if (changedProperties.has("loadingLabel")) {
@@ -331,15 +414,16 @@ var SpectreButtonElement = class extends SpectreProjectableElement {
331
414
  get buttonClasses() {
332
415
  return spectreUi.getButtonClasses({
333
416
  disabled: this.isDisabled,
334
- fullWidth: this.fullWidth,
335
- loading: this.loading,
336
- pill: this.pill,
417
+ fullWidth: this.fullWidth ?? false,
418
+ iconOnly: this.iconOnly ?? false,
419
+ loading: this.loading ?? false,
420
+ pill: this.pill ?? false,
337
421
  size: this.size,
338
422
  variant: this.variant
339
423
  });
340
424
  }
341
425
  get isDisabled() {
342
- return this.disabled || this.loading;
426
+ return (this.disabled ?? false) || (this.loading ?? false);
343
427
  }
344
428
  get visibleLabelFallback() {
345
429
  const trimmedLabel = this.label?.trim();
@@ -353,12 +437,12 @@ var SpectreButtonElement = class extends SpectreProjectableElement {
353
437
  }
354
438
  renderButtonContent() {
355
439
  if (this.loading) {
356
- return lit.html`<span data-sp-button-loading-label>${this.loadingLabel}</span>`;
440
+ return lit.html`<span class="sp-label" data-sp-button-loading-label>${this.loadingLabel}</span>`;
357
441
  }
358
442
  if (this.hasProjectedContent) {
359
443
  return this.projectedContent;
360
444
  }
361
- return this.visibleLabelFallback ? lit.html`<span data-sp-button-label-fallback>${this.visibleLabelFallback}</span>` : lit.nothing;
445
+ return this.visibleLabelFallback ? lit.html`<span class="sp-label" data-sp-button-label-fallback>${this.visibleLabelFallback}</span>` : lit.nothing;
362
446
  }
363
447
  render() {
364
448
  return lit.html`<button
@@ -375,7 +459,7 @@ var SpectreButtonElement = class extends SpectreProjectableElement {
375
459
  name="${ifDefined_js.ifDefined(this.name || void 0)}"
376
460
  title="${ifDefined_js.ifDefined(this.title || void 0)}"
377
461
  type="${this.type}"
378
- value="${ifDefined_js.ifDefined(this.value || void 0)}"
462
+ value="${ifDefined_js.ifDefined(this.value)}"
379
463
  >
380
464
  ${this.renderButtonContent()}
381
465
  </button>`;
@@ -386,6 +470,7 @@ SpectreButtonElement.properties = {
386
470
  disabled: { type: Boolean, reflect: true },
387
471
  form: { type: String },
388
472
  fullWidth: { attribute: "full-width", type: Boolean, reflect: true },
473
+ iconOnly: { attribute: "icon-only", type: Boolean, reflect: true },
389
474
  label: { type: String, reflect: true },
390
475
  loading: { type: Boolean, reflect: true },
391
476
  loadingLabel: { attribute: "loading-label", type: String, reflect: true },
@@ -404,33 +489,6 @@ function defineSpectreButton(tagName = "sp-button") {
404
489
  customElements.define(tagName, SpectreButtonElement);
405
490
  return SpectreButtonElement;
406
491
  }
407
- var spectreInputSizes = ["sm", "md", "lg"];
408
- function isInputSize(value) {
409
- return spectreInputSizes.includes(value);
410
- }
411
- var spectreInputTypes = [
412
- "text",
413
- "email",
414
- "password",
415
- "search",
416
- "tel",
417
- "url",
418
- "number",
419
- "date",
420
- "datetime-local",
421
- "month",
422
- "time",
423
- "week"
424
- ];
425
- function isInputType(value) {
426
- return spectreInputTypes.includes(value);
427
- }
428
- function normalizeInt(value, fallback, min = 0) {
429
- if (value == null || typeof value !== "number" || !Number.isInteger(value) || value < min) {
430
- return fallback;
431
- }
432
- return value;
433
- }
434
492
  var SpectreInputElement = class extends SpectreBaseElement {
435
493
  constructor() {
436
494
  super(...arguments);
@@ -447,11 +505,35 @@ var SpectreInputElement = class extends SpectreBaseElement {
447
505
  this.type = "text";
448
506
  this.value = "";
449
507
  }
508
+ get autocapitalize() {
509
+ return super.autocapitalize;
510
+ }
511
+ set autocapitalize(value) {
512
+ super.autocapitalize = value;
513
+ }
514
+ get id() {
515
+ return super.id;
516
+ }
517
+ set id(value) {
518
+ super.id = value;
519
+ }
520
+ get spellcheck() {
521
+ return super.spellcheck;
522
+ }
523
+ set spellcheck(value) {
524
+ super.spellcheck = value;
525
+ }
526
+ get title() {
527
+ return super.title;
528
+ }
529
+ set title(value) {
530
+ super.title = value;
531
+ }
450
532
  willUpdate(changedProperties) {
451
- if (changedProperties.has("size") && !isInputSize(this.size)) {
533
+ if (changedProperties.has("size") && (this.size == null || !isInputSize(this.size))) {
452
534
  this.size = "md";
453
535
  }
454
- if (changedProperties.has("type") && !isInputType(this.type)) {
536
+ if (changedProperties.has("type") && (this.type == null || !isInputType(this.type))) {
455
537
  this.type = "text";
456
538
  }
457
539
  if (changedProperties.has("value") && this.value == null) {
@@ -466,14 +548,14 @@ var SpectreInputElement = class extends SpectreBaseElement {
466
548
  }
467
549
  get inputClasses() {
468
550
  return spectreUi.getInputClasses({
469
- fullWidth: this.fullWidth,
470
- pill: this.pill,
551
+ fullWidth: this.fullWidth ?? false,
552
+ pill: this.pill ?? false,
471
553
  size: this.size,
472
554
  state: this.isDisabled ? this.disabled ? "disabled" : "loading" : this.invalid ? "error" : this.success ? "success" : "default"
473
555
  });
474
556
  }
475
557
  get isDisabled() {
476
- return this.disabled || this.loading;
558
+ return (this.disabled ?? false) || (this.loading ?? false);
477
559
  }
478
560
  get nativeInput() {
479
561
  return this.querySelector("[data-sp-input-native]");
@@ -499,22 +581,29 @@ var SpectreInputElement = class extends SpectreBaseElement {
499
581
  aria-invalid="${ifDefined_js.ifDefined(this.invalid ? "true" : void 0)}"
500
582
  aria-label="${ifDefined_js.ifDefined(this.forwardedAriaLabel)}"
501
583
  aria-labelledby="${ifDefined_js.ifDefined(this.forwardedAriaLabelledBy)}"
584
+ autocapitalize="${ifDefined_js.ifDefined(this.autocapitalize || void 0)}"
502
585
  autocomplete="${ifDefined_js.ifDefined(this.autocomplete || void 0)}"
503
586
  ?autofocus="${this.autofocus}"
504
587
  class="${this.inputClasses}"
505
588
  data-sp-input-native
506
589
  ?disabled="${this.isDisabled}"
590
+ enterkeyhint="${ifDefined_js.ifDefined(this.enterkeyhint || void 0)}"
507
591
  form="${ifDefined_js.ifDefined(this.form || void 0)}"
508
592
  ?readonly="${this.readonly}"
509
593
  ?required="${this.required}"
510
594
  id="${ifDefined_js.ifDefined(this.id || void 0)}"
511
595
  inputmode="${ifDefined_js.ifDefined(this.inputmode || void 0)}"
596
+ list="${ifDefined_js.ifDefined(this.list || void 0)}"
512
597
  max="${ifDefined_js.ifDefined(this.max || void 0)}"
513
598
  maxlength="${ifDefined_js.ifDefined(this.maxlength)}"
514
599
  min="${ifDefined_js.ifDefined(this.min || void 0)}"
515
600
  minlength="${ifDefined_js.ifDefined(this.minlength)}"
516
601
  name="${ifDefined_js.ifDefined(this.name || void 0)}"
602
+ pattern="${ifDefined_js.ifDefined(this.pattern || void 0)}"
517
603
  placeholder="${ifDefined_js.ifDefined(this.placeholder || void 0)}"
604
+ spellcheck="${ifDefined_js.ifDefined(
605
+ this.spellcheck === void 0 ? void 0 : String(this.spellcheck)
606
+ )}"
518
607
  step="${ifDefined_js.ifDefined(this.step || void 0)}"
519
608
  title="${ifDefined_js.ifDefined(this.title || void 0)}"
520
609
  type="${this.type}"
@@ -525,24 +614,29 @@ var SpectreInputElement = class extends SpectreBaseElement {
525
614
  }
526
615
  };
527
616
  SpectreInputElement.properties = {
617
+ autocapitalize: { type: String, reflect: true },
528
618
  autocomplete: { type: String, reflect: true },
529
619
  autofocus: { type: Boolean, reflect: true },
530
620
  disabled: { type: Boolean, reflect: true },
621
+ enterkeyhint: { type: String, reflect: true },
531
622
  form: { type: String },
532
623
  fullWidth: { attribute: "full-width", type: Boolean, reflect: true },
533
624
  inputmode: { type: String, reflect: true },
534
625
  invalid: { type: Boolean, reflect: true },
626
+ list: { type: String, reflect: true },
535
627
  loading: { type: Boolean, reflect: true },
536
628
  max: { type: String, reflect: true },
537
629
  maxlength: { type: Number, reflect: true },
538
630
  min: { type: String, reflect: true },
539
631
  minlength: { type: Number, reflect: true },
540
632
  name: { type: String, reflect: true },
633
+ pattern: { type: String, reflect: true },
541
634
  pill: { type: Boolean, reflect: true },
542
635
  placeholder: { type: String, reflect: true },
543
636
  readonly: { type: Boolean, reflect: true },
544
637
  required: { type: Boolean, reflect: true },
545
638
  size: { type: String, reflect: true },
639
+ spellcheck: { type: Boolean, reflect: true },
546
640
  step: { type: String, reflect: true },
547
641
  success: { type: Boolean, reflect: true },
548
642
  type: { type: String, reflect: true },
@@ -573,8 +667,32 @@ var SpectreTextareaElement = class extends SpectreBaseElement {
573
667
  this.success = false;
574
668
  this.value = "";
575
669
  }
670
+ get autocapitalize() {
671
+ return super.autocapitalize;
672
+ }
673
+ set autocapitalize(value) {
674
+ super.autocapitalize = value;
675
+ }
676
+ get id() {
677
+ return super.id;
678
+ }
679
+ set id(value) {
680
+ super.id = value;
681
+ }
682
+ get spellcheck() {
683
+ return super.spellcheck;
684
+ }
685
+ set spellcheck(value) {
686
+ super.spellcheck = value;
687
+ }
688
+ get title() {
689
+ return super.title;
690
+ }
691
+ set title(value) {
692
+ super.title = value;
693
+ }
576
694
  willUpdate(changedProperties) {
577
- if (changedProperties.has("size") && !isInputSize(this.size)) {
695
+ if (changedProperties.has("size") && (this.size == null || !isInputSize(this.size))) {
578
696
  this.size = "md";
579
697
  }
580
698
  if (changedProperties.has("rows")) {
@@ -592,14 +710,14 @@ var SpectreTextareaElement = class extends SpectreBaseElement {
592
710
  }
593
711
  get textareaClasses() {
594
712
  return spectreUi.getInputClasses({
595
- fullWidth: this.fullWidth,
596
- pill: this.pill,
713
+ fullWidth: this.fullWidth ?? false,
714
+ pill: this.pill ?? false,
597
715
  size: this.size,
598
716
  state: this.isDisabled ? this.disabled ? "disabled" : "loading" : this.invalid ? "error" : this.success ? "success" : "default"
599
717
  });
600
718
  }
601
719
  get isDisabled() {
602
- return this.disabled || this.loading;
720
+ return (this.disabled ?? false) || (this.loading ?? false);
603
721
  }
604
722
  get nativeTextarea() {
605
723
  return this.querySelector("[data-sp-textarea-native]");
@@ -625,11 +743,13 @@ var SpectreTextareaElement = class extends SpectreBaseElement {
625
743
  aria-invalid="${ifDefined_js.ifDefined(this.invalid ? "true" : void 0)}"
626
744
  aria-label="${ifDefined_js.ifDefined(this.forwardedAriaLabel)}"
627
745
  aria-labelledby="${ifDefined_js.ifDefined(this.forwardedAriaLabelledBy)}"
746
+ autocapitalize="${ifDefined_js.ifDefined(this.autocapitalize || void 0)}"
628
747
  autocomplete="${ifDefined_js.ifDefined(this.autocomplete || void 0)}"
629
748
  ?autofocus="${this.autofocus}"
630
749
  class="${this.textareaClasses}"
631
750
  data-sp-textarea-native
632
751
  ?disabled="${this.isDisabled}"
752
+ enterkeyhint="${ifDefined_js.ifDefined(this.enterkeyhint || void 0)}"
633
753
  form="${ifDefined_js.ifDefined(this.form || void 0)}"
634
754
  inputmode="${ifDefined_js.ifDefined(this.inputmode || void 0)}"
635
755
  ?readonly="${this.readonly}"
@@ -640,6 +760,9 @@ var SpectreTextareaElement = class extends SpectreBaseElement {
640
760
  name="${ifDefined_js.ifDefined(this.name || void 0)}"
641
761
  placeholder="${ifDefined_js.ifDefined(this.placeholder || void 0)}"
642
762
  rows="${this.rows}"
763
+ spellcheck="${ifDefined_js.ifDefined(
764
+ this.spellcheck === void 0 ? void 0 : String(this.spellcheck)
765
+ )}"
643
766
  title="${ifDefined_js.ifDefined(this.title || void 0)}"
644
767
  .value="${live_js.live(this.value)}"
645
768
  @change="${this.handleChange}"
@@ -648,9 +771,11 @@ var SpectreTextareaElement = class extends SpectreBaseElement {
648
771
  }
649
772
  };
650
773
  SpectreTextareaElement.properties = {
774
+ autocapitalize: { type: String, reflect: true },
651
775
  autocomplete: { type: String, reflect: true },
652
776
  autofocus: { type: Boolean, reflect: true },
653
777
  disabled: { type: Boolean, reflect: true },
778
+ enterkeyhint: { type: String, reflect: true },
654
779
  form: { type: String },
655
780
  fullWidth: { attribute: "full-width", type: Boolean, reflect: true },
656
781
  inputmode: { type: String, reflect: true },
@@ -663,8 +788,9 @@ SpectreTextareaElement.properties = {
663
788
  placeholder: { type: String, reflect: true },
664
789
  readonly: { type: Boolean, reflect: true },
665
790
  required: { type: Boolean, reflect: true },
666
- rows: { type: Number },
791
+ rows: { type: Number, reflect: true },
667
792
  size: { type: String, reflect: true },
793
+ spellcheck: { type: Boolean, reflect: true },
668
794
  success: { type: Boolean, reflect: true },
669
795
  value: { type: String }
670
796
  };
@@ -690,6 +816,18 @@ var SpectreSelectElement = class extends SpectreProjectableElement {
690
816
  this.success = false;
691
817
  this.value = "";
692
818
  }
819
+ get id() {
820
+ return super.id;
821
+ }
822
+ set id(value) {
823
+ super.id = value;
824
+ }
825
+ get title() {
826
+ return super.title;
827
+ }
828
+ set title(value) {
829
+ super.title = value;
830
+ }
693
831
  getContentContainer() {
694
832
  return this.querySelector("[data-sp-select-native]");
695
833
  }
@@ -701,7 +839,7 @@ var SpectreSelectElement = class extends SpectreProjectableElement {
701
839
  return el.hasAttribute("data-sp-select-native");
702
840
  }
703
841
  willUpdate(changedProperties) {
704
- if (changedProperties.has("size") && !isInputSize(this.size)) {
842
+ if (changedProperties.has("size") && (this.size == null || !isInputSize(this.size))) {
705
843
  this.size = "md";
706
844
  }
707
845
  if (changedProperties.has("value") && this.value == null) {
@@ -714,8 +852,12 @@ var SpectreSelectElement = class extends SpectreProjectableElement {
714
852
  if (!nativeSelect) {
715
853
  return;
716
854
  }
717
- if (this.value !== "" && nativeSelect.value !== this.value) {
718
- nativeSelect.value = this.value;
855
+ const valueChanged = changedProperties.has("value");
856
+ const oldValue = changedProperties.get("value");
857
+ if (valueChanged && this.value !== void 0 && (this.value !== "" || oldValue !== void 0 || this.hasAttribute("value"))) {
858
+ if (nativeSelect.value !== this.value) {
859
+ nativeSelect.value = this.value;
860
+ }
719
861
  }
720
862
  if (this.value === "" && !this.hasAttribute("value")) {
721
863
  const nativeValue = nativeSelect.value ?? "";
@@ -730,14 +872,14 @@ var SpectreSelectElement = class extends SpectreProjectableElement {
730
872
  }
731
873
  get selectClasses() {
732
874
  return spectreUi.getInputClasses({
733
- fullWidth: this.fullWidth,
734
- pill: this.pill,
875
+ fullWidth: this.fullWidth ?? false,
876
+ pill: this.pill ?? false,
735
877
  size: this.size,
736
878
  state: this.isDisabled ? this.disabled ? "disabled" : "loading" : this.invalid ? "error" : this.success ? "success" : "default"
737
879
  });
738
880
  }
739
881
  get isDisabled() {
740
- return this.disabled || this.loading;
882
+ return (this.disabled ?? false) || (this.loading ?? false);
741
883
  }
742
884
  handleInput(event) {
743
885
  const select = event.currentTarget;
@@ -813,6 +955,18 @@ var SpectreCheckboxElement = class extends SpectreProjectableElement {
813
955
  this.success = false;
814
956
  this.value = "on";
815
957
  }
958
+ get id() {
959
+ return super.id;
960
+ }
961
+ set id(value) {
962
+ super.id = value;
963
+ }
964
+ get title() {
965
+ return super.title;
966
+ }
967
+ set title(value) {
968
+ super.title = value;
969
+ }
816
970
  getContentContainer() {
817
971
  return this.querySelector("[data-sp-checkbox-label]");
818
972
  }
@@ -832,7 +986,7 @@ var SpectreCheckboxElement = class extends SpectreProjectableElement {
832
986
  return this.querySelector("[data-sp-checkbox-native]");
833
987
  }
834
988
  get isDisabled() {
835
- return this.disabled || this.loading;
989
+ return (this.disabled ?? false) || (this.loading ?? false);
836
990
  }
837
991
  get visibleLabelFallback() {
838
992
  const trimmedLabel = this.label?.trim();
@@ -853,7 +1007,10 @@ var SpectreCheckboxElement = class extends SpectreProjectableElement {
853
1007
  this.nativeInput?.blur();
854
1008
  }
855
1009
  render() {
856
- const labelContent = this.hasProjectedContent ? this.projectedContent : this.visibleLabelFallback ? lit.html`<span class="sp-label" data-sp-checkbox-label-fallback>${this.visibleLabelFallback}</span>` : lit.nothing;
1010
+ const labelContent = this.hasProjectedContent ? this.projectedContent : this.visibleLabelFallback ? lit.html`<span
1011
+ class="${spectreUi.getInputLabelClasses({ disabled: this.isDisabled })}"
1012
+ data-sp-checkbox-label-fallback
1013
+ >${this.visibleLabelFallback}</span>` : lit.nothing;
857
1014
  return lit.html`<label data-sp-checkbox-label>
858
1015
  <input
859
1016
  aria-busy="${this.loading ? "true" : "false"}"
@@ -913,6 +1070,18 @@ var SpectreRadioElement = class extends SpectreProjectableElement {
913
1070
  this.success = false;
914
1071
  this.value = "on";
915
1072
  }
1073
+ get id() {
1074
+ return super.id;
1075
+ }
1076
+ set id(value) {
1077
+ super.id = value;
1078
+ }
1079
+ get title() {
1080
+ return super.title;
1081
+ }
1082
+ set title(value) {
1083
+ super.title = value;
1084
+ }
916
1085
  getContentContainer() {
917
1086
  return this.querySelector("[data-sp-radio-label]");
918
1087
  }
@@ -932,7 +1101,7 @@ var SpectreRadioElement = class extends SpectreProjectableElement {
932
1101
  return this.querySelector("[data-sp-radio-native]");
933
1102
  }
934
1103
  get isDisabled() {
935
- return this.disabled || this.loading;
1104
+ return (this.disabled ?? false) || (this.loading ?? false);
936
1105
  }
937
1106
  get visibleLabelFallback() {
938
1107
  const trimmedLabel = this.label?.trim();
@@ -946,6 +1115,26 @@ var SpectreRadioElement = class extends SpectreProjectableElement {
946
1115
  const input = event.currentTarget;
947
1116
  this.checked = input.checked;
948
1117
  }
1118
+ updated(changedProperties) {
1119
+ super.updated(changedProperties);
1120
+ if ((changedProperties.has("checked") || changedProperties.has("name")) && this.checked && this.name) {
1121
+ this.syncGroup();
1122
+ }
1123
+ }
1124
+ syncGroup() {
1125
+ if (!this.name || !this.checked) {
1126
+ return;
1127
+ }
1128
+ const root = this.getRootNode();
1129
+ const radios = root.querySelectorAll(
1130
+ `sp-radio[name="${this.name}"]`
1131
+ );
1132
+ radios.forEach((radio) => {
1133
+ if (radio !== this && radio.checked) {
1134
+ radio.checked = false;
1135
+ }
1136
+ });
1137
+ }
949
1138
  focus(options) {
950
1139
  this.nativeInput?.focus(options);
951
1140
  }
@@ -953,7 +1142,10 @@ var SpectreRadioElement = class extends SpectreProjectableElement {
953
1142
  this.nativeInput?.blur();
954
1143
  }
955
1144
  render() {
956
- const labelContent = this.hasProjectedContent ? this.projectedContent : this.visibleLabelFallback ? lit.html`<span class="sp-label" data-sp-radio-label-fallback>${this.visibleLabelFallback}</span>` : lit.nothing;
1145
+ const labelContent = this.hasProjectedContent ? this.projectedContent : this.visibleLabelFallback ? lit.html`<span
1146
+ class="${spectreUi.getInputLabelClasses({ disabled: this.isDisabled })}"
1147
+ data-sp-radio-label-fallback
1148
+ >${this.visibleLabelFallback}</span>` : lit.nothing;
957
1149
  return lit.html`<label data-sp-radio-label>
958
1150
  <input
959
1151
  aria-busy="${this.loading ? "true" : "false"}"
@@ -1002,6 +1194,25 @@ function defineSpectreRadio(tagName = "sp-radio") {
1002
1194
  return SpectreRadioElement;
1003
1195
  }
1004
1196
  var SpectreLabelElement = class extends SpectreProjectableElement {
1197
+ constructor() {
1198
+ super(...arguments);
1199
+ this.disabled = false;
1200
+ }
1201
+ get isDisabled() {
1202
+ return this.disabled ?? false;
1203
+ }
1204
+ get id() {
1205
+ return super.id;
1206
+ }
1207
+ set id(value) {
1208
+ super.id = value;
1209
+ }
1210
+ get title() {
1211
+ return super.title;
1212
+ }
1213
+ set title(value) {
1214
+ super.title = value;
1215
+ }
1005
1216
  getContentContainer() {
1006
1217
  return this.querySelector("[data-sp-label-native]");
1007
1218
  }
@@ -1023,7 +1234,7 @@ var SpectreLabelElement = class extends SpectreProjectableElement {
1023
1234
  aria-describedby="${ifDefined_js.ifDefined(this.forwardedAriaDescribedBy)}"
1024
1235
  aria-label="${ifDefined_js.ifDefined(this.forwardedAriaLabel)}"
1025
1236
  aria-labelledby="${ifDefined_js.ifDefined(this.forwardedAriaLabelledBy)}"
1026
- class="sp-label"
1237
+ class="${spectreUi.getInputLabelClasses({ disabled: this.isDisabled })}"
1027
1238
  data-sp-label-native
1028
1239
  for="${ifDefined_js.ifDefined(this.htmlFor || void 0)}"
1029
1240
  id="${ifDefined_js.ifDefined(this.id || void 0)}"
@@ -1034,6 +1245,7 @@ var SpectreLabelElement = class extends SpectreProjectableElement {
1034
1245
  }
1035
1246
  };
1036
1247
  SpectreLabelElement.properties = {
1248
+ disabled: { type: Boolean, reflect: true },
1037
1249
  htmlFor: { attribute: "for", type: String, reflect: true }
1038
1250
  };
1039
1251
  function defineSpectreLabel(tagName = "sp-label") {
@@ -1048,6 +1260,28 @@ var SpectreFieldsetElement = class extends SpectreProjectableElement {
1048
1260
  constructor() {
1049
1261
  super(...arguments);
1050
1262
  this.disabled = false;
1263
+ this.invalid = false;
1264
+ this.loading = false;
1265
+ this.success = false;
1266
+ }
1267
+ get id() {
1268
+ return super.id;
1269
+ }
1270
+ set id(value) {
1271
+ super.id = value;
1272
+ }
1273
+ get title() {
1274
+ return super.title;
1275
+ }
1276
+ set title(value) {
1277
+ super.title = value;
1278
+ }
1279
+ get visibleLegend() {
1280
+ const trimmedLegend = this.legend?.trim();
1281
+ return trimmedLegend ? trimmedLegend : void 0;
1282
+ }
1283
+ get isDisabled() {
1284
+ return (this.disabled ?? false) || (this.loading ?? false);
1051
1285
  }
1052
1286
  getContentContainer() {
1053
1287
  return this.querySelector("[data-sp-fieldset-native]");
@@ -1059,6 +1293,20 @@ var SpectreFieldsetElement = class extends SpectreProjectableElement {
1059
1293
  const el = node;
1060
1294
  return el.hasAttribute("data-sp-fieldset-native") || el.hasAttribute("data-sp-fieldset-legend");
1061
1295
  }
1296
+ willUpdate(changedProperties) {
1297
+ if (changedProperties.has("disabled") && this.disabled == null) {
1298
+ this.disabled = false;
1299
+ }
1300
+ if (changedProperties.has("invalid") && this.invalid == null) {
1301
+ this.invalid = false;
1302
+ }
1303
+ if (changedProperties.has("loading") && this.loading == null) {
1304
+ this.loading = false;
1305
+ }
1306
+ if (changedProperties.has("success") && this.success == null) {
1307
+ this.success = false;
1308
+ }
1309
+ }
1062
1310
  focus(options) {
1063
1311
  this.getContentContainer()?.focus(options);
1064
1312
  }
@@ -1067,17 +1315,22 @@ var SpectreFieldsetElement = class extends SpectreProjectableElement {
1067
1315
  }
1068
1316
  render() {
1069
1317
  return lit.html`<fieldset
1318
+ aria-busy="${this.loading ? "true" : "false"}"
1070
1319
  aria-describedby="${ifDefined_js.ifDefined(this.forwardedAriaDescribedBy)}"
1320
+ aria-invalid="${ifDefined_js.ifDefined(this.invalid ? "true" : void 0)}"
1071
1321
  aria-label="${ifDefined_js.ifDefined(this.forwardedAriaLabel)}"
1072
1322
  aria-labelledby="${ifDefined_js.ifDefined(this.forwardedAriaLabelledBy)}"
1073
1323
  data-sp-fieldset-native
1074
- ?disabled="${this.disabled}"
1324
+ ?disabled="${this.isDisabled}"
1075
1325
  form="${ifDefined_js.ifDefined(this.form || void 0)}"
1076
1326
  id="${ifDefined_js.ifDefined(this.id || void 0)}"
1077
1327
  name="${ifDefined_js.ifDefined(this.name || void 0)}"
1078
1328
  title="${ifDefined_js.ifDefined(this.title || void 0)}"
1079
1329
  >
1080
- ${this.legend ? lit.html`<legend class="sp-label" data-sp-fieldset-legend>${this.legend}</legend>` : lit.nothing}
1330
+ ${this.visibleLegend ? lit.html`<legend
1331
+ class="${spectreUi.getInputLabelClasses({ disabled: this.isDisabled })}"
1332
+ data-sp-fieldset-legend
1333
+ >${this.visibleLegend}</legend>` : lit.nothing}
1081
1334
  ${this.hasProjectedContent ? this.projectedContent : lit.nothing}
1082
1335
  </fieldset>`;
1083
1336
  }
@@ -1085,8 +1338,11 @@ var SpectreFieldsetElement = class extends SpectreProjectableElement {
1085
1338
  SpectreFieldsetElement.properties = {
1086
1339
  disabled: { type: Boolean, reflect: true },
1087
1340
  form: { type: String },
1341
+ invalid: { type: Boolean, reflect: true },
1088
1342
  legend: { type: String, reflect: true },
1089
- name: { type: String, reflect: true }
1343
+ loading: { type: Boolean, reflect: true },
1344
+ name: { type: String, reflect: true },
1345
+ success: { type: Boolean, reflect: true }
1090
1346
  };
1091
1347
  function defineSpectreFieldset(tagName = "sp-fieldset") {
1092
1348
  const existingElement = customElements.get(tagName);
@@ -1126,7 +1382,7 @@ exports.defineSpectreLabel = defineSpectreLabel;
1126
1382
  exports.defineSpectreRadio = defineSpectreRadio;
1127
1383
  exports.defineSpectreSelect = defineSpectreSelect;
1128
1384
  exports.defineSpectreTextarea = defineSpectreTextarea;
1129
- exports.spectreButtonSizes = spectreButtonSizes;
1385
+ exports.spectreButtonSizes = spectreInputSizes;
1130
1386
  exports.spectreButtonTypes = spectreButtonTypes;
1131
1387
  exports.spectreButtonVariants = spectreButtonVariants;
1132
1388
  exports.spectreInputSizes = spectreInputSizes;