@phcdevworks/spectre-components 1.5.0 → 1.6.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 (146) hide show
  1. package/README.md +118 -2
  2. package/dist/alert.cjs +10 -3
  3. package/dist/alert.cjs.map +1 -1
  4. package/dist/alert.d.cts +4 -5
  5. package/dist/alert.d.ts +4 -5
  6. package/dist/alert.js +10 -3
  7. package/dist/alert.js.map +1 -1
  8. package/dist/avatar.cjs +11 -3
  9. package/dist/avatar.cjs.map +1 -1
  10. package/dist/avatar.d.cts +4 -5
  11. package/dist/avatar.d.ts +4 -5
  12. package/dist/avatar.js +11 -3
  13. package/dist/avatar.js.map +1 -1
  14. package/dist/badge.cjs +11 -3
  15. package/dist/badge.cjs.map +1 -1
  16. package/dist/badge.d.cts +4 -5
  17. package/dist/badge.d.ts +4 -5
  18. package/dist/badge.js +11 -3
  19. package/dist/badge.js.map +1 -1
  20. package/dist/{base-BRQ7QAAr.d.cts → base-D0s95V2v.d.cts} +2 -0
  21. package/dist/{base-BRQ7QAAr.d.ts → base-D0s95V2v.d.ts} +2 -0
  22. package/dist/button.cjs +14 -5
  23. package/dist/button.cjs.map +1 -1
  24. package/dist/button.d.cts +4 -5
  25. package/dist/button.d.ts +4 -5
  26. package/dist/button.js +14 -5
  27. package/dist/button.js.map +1 -1
  28. package/dist/card.cjs +11 -3
  29. package/dist/card.cjs.map +1 -1
  30. package/dist/card.d.cts +4 -5
  31. package/dist/card.d.ts +4 -5
  32. package/dist/card.js +11 -3
  33. package/dist/card.js.map +1 -1
  34. package/dist/checkbox.cjs +16 -5
  35. package/dist/checkbox.cjs.map +1 -1
  36. package/dist/checkbox.d.cts +2 -3
  37. package/dist/checkbox.d.ts +2 -3
  38. package/dist/checkbox.js +17 -6
  39. package/dist/checkbox.js.map +1 -1
  40. package/dist/container.cjs +421 -0
  41. package/dist/container.cjs.map +1 -0
  42. package/dist/container.d.cts +37 -0
  43. package/dist/container.d.ts +37 -0
  44. package/dist/container.js +417 -0
  45. package/dist/container.js.map +1 -0
  46. package/dist/fieldset.cjs +16 -7
  47. package/dist/fieldset.cjs.map +1 -1
  48. package/dist/fieldset.d.cts +2 -3
  49. package/dist/fieldset.d.ts +2 -3
  50. package/dist/fieldset.js +18 -9
  51. package/dist/fieldset.js.map +1 -1
  52. package/dist/{form-BumNzIay.d.cts → form-8KZeQRgr.d.cts} +13 -1
  53. package/dist/{form-BumNzIay.d.ts → form-8KZeQRgr.d.ts} +13 -1
  54. package/dist/grid.cjs +437 -0
  55. package/dist/grid.cjs.map +1 -0
  56. package/dist/grid.d.cts +42 -0
  57. package/dist/grid.d.ts +42 -0
  58. package/dist/grid.js +432 -0
  59. package/dist/grid.js.map +1 -0
  60. package/dist/icon-box.cjs +11 -3
  61. package/dist/icon-box.cjs.map +1 -1
  62. package/dist/icon-box.d.cts +4 -5
  63. package/dist/icon-box.d.ts +4 -5
  64. package/dist/icon-box.js +11 -3
  65. package/dist/icon-box.js.map +1 -1
  66. package/dist/index.cjs +362 -66
  67. package/dist/index.cjs.map +1 -1
  68. package/dist/index.d.cts +7 -3
  69. package/dist/index.d.ts +7 -3
  70. package/dist/index.js +350 -68
  71. package/dist/index.js.map +1 -1
  72. package/dist/input.cjs +10 -3
  73. package/dist/input.cjs.map +1 -1
  74. package/dist/input.d.cts +3 -4
  75. package/dist/input.d.ts +3 -4
  76. package/dist/input.js +10 -3
  77. package/dist/input.js.map +1 -1
  78. package/dist/label.cjs +17 -2
  79. package/dist/label.cjs.map +1 -1
  80. package/dist/label.d.cts +9 -3
  81. package/dist/label.d.ts +9 -3
  82. package/dist/label.js +18 -3
  83. package/dist/label.js.map +1 -1
  84. package/dist/pricing-card.cjs +11 -3
  85. package/dist/pricing-card.cjs.map +1 -1
  86. package/dist/pricing-card.d.cts +2 -3
  87. package/dist/pricing-card.d.ts +2 -3
  88. package/dist/pricing-card.js +11 -3
  89. package/dist/pricing-card.js.map +1 -1
  90. package/dist/{projectable-D6IDeKfr.d.ts → projectable-D9YCo9NY.d.ts} +1 -1
  91. package/dist/{projectable-Bx-IVk0w.d.cts → projectable-DLOn6eaW.d.cts} +1 -1
  92. package/dist/radio.cjs +16 -5
  93. package/dist/radio.cjs.map +1 -1
  94. package/dist/radio.d.cts +2 -3
  95. package/dist/radio.d.ts +2 -3
  96. package/dist/radio.js +17 -6
  97. package/dist/radio.js.map +1 -1
  98. package/dist/rating.cjs +19 -5
  99. package/dist/rating.cjs.map +1 -1
  100. package/dist/rating.d.cts +3 -4
  101. package/dist/rating.d.ts +3 -4
  102. package/dist/rating.js +19 -5
  103. package/dist/rating.js.map +1 -1
  104. package/dist/section.cjs +400 -0
  105. package/dist/section.cjs.map +1 -0
  106. package/dist/section.d.cts +25 -0
  107. package/dist/section.d.ts +25 -0
  108. package/dist/section.js +397 -0
  109. package/dist/section.js.map +1 -0
  110. package/dist/select.cjs +14 -5
  111. package/dist/select.cjs.map +1 -1
  112. package/dist/select.d.cts +3 -4
  113. package/dist/select.d.ts +3 -4
  114. package/dist/select.js +15 -6
  115. package/dist/select.js.map +1 -1
  116. package/dist/spinner.cjs +10 -0
  117. package/dist/spinner.cjs.map +1 -1
  118. package/dist/spinner.d.cts +3 -3
  119. package/dist/spinner.d.ts +3 -3
  120. package/dist/spinner.js +10 -0
  121. package/dist/spinner.js.map +1 -1
  122. package/dist/stack.cjs +443 -0
  123. package/dist/stack.cjs.map +1 -0
  124. package/dist/stack.d.cts +48 -0
  125. package/dist/stack.d.ts +48 -0
  126. package/dist/stack.js +437 -0
  127. package/dist/stack.js.map +1 -0
  128. package/dist/tag.cjs +11 -3
  129. package/dist/tag.cjs.map +1 -1
  130. package/dist/tag.d.cts +4 -5
  131. package/dist/tag.d.ts +4 -5
  132. package/dist/tag.js +11 -3
  133. package/dist/tag.js.map +1 -1
  134. package/dist/testimonial.cjs +11 -3
  135. package/dist/testimonial.cjs.map +1 -1
  136. package/dist/testimonial.d.cts +4 -5
  137. package/dist/testimonial.d.ts +4 -5
  138. package/dist/testimonial.js +11 -3
  139. package/dist/testimonial.js.map +1 -1
  140. package/dist/textarea.cjs +14 -5
  141. package/dist/textarea.cjs.map +1 -1
  142. package/dist/textarea.d.cts +2 -3
  143. package/dist/textarea.d.ts +2 -3
  144. package/dist/textarea.js +15 -6
  145. package/dist/textarea.js.map +1 -1
  146. package/package.json +41 -16
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { getButtonClasses, getInputLabelClasses, getInputClasses, getBadgeClasses, getCardClasses, getIconBoxClasses, getRatingClasses, getRatingStarClasses, getRatingStarsClasses, getRatingTextClasses, getTestimonialClasses, getAlertClasses, getAvatarClasses, getSpinnerClasses, getTagClasses, getPricingCardClasses } from '@phcdevworks/spectre-ui';
1
+ import { getButtonClasses, getInputLabelClasses, getInputClasses, getTextareaClasses, getSelectClasses, getCheckboxClasses, getRadioClasses, getLabelClasses, getFieldsetLegendClasses, getFieldsetClasses, getBadgeClasses, getCardClasses, getIconBoxClasses, getRatingClasses, getRatingStarClasses, getRatingStarsClasses, getRatingTextClasses, getTestimonialClasses, getAlertClasses, getAvatarClasses, getSpinnerClasses, getTagClasses, getPricingCardClasses, getContainerClasses, getGridClasses, getStackClasses, getSectionClasses } from '@phcdevworks/spectre-ui';
2
2
  import { LitElement, html, nothing } from 'lit';
3
3
  import { ifDefined } from 'lit/directives/if-defined.js';
4
4
  import { live } from 'lit/directives/live.js';
@@ -142,6 +142,34 @@ var spectreAvatarShapes = ["circle", "square"];
142
142
  function isAvatarShape(value) {
143
143
  return spectreAvatarShapes.includes(value);
144
144
  }
145
+ var spectreContainerMaxWidths = ["prose"];
146
+ function isContainerMaxWidth(value) {
147
+ return spectreContainerMaxWidths.includes(
148
+ value
149
+ );
150
+ }
151
+ var spectreGridColumns = [1, 2, 3, 4, 6, 12];
152
+ function isGridColumns(value) {
153
+ return spectreGridColumns.includes(value);
154
+ }
155
+ var spectreGridGaps = ["sm", "md", "lg"];
156
+ function isGridGap(value) {
157
+ return spectreGridGaps.includes(value);
158
+ }
159
+ var spectreStackDirections = ["vertical", "horizontal"];
160
+ function isStackDirection(value) {
161
+ return spectreStackDirections.includes(
162
+ value
163
+ );
164
+ }
165
+ var spectreStackBases = ["sidebar"];
166
+ function isStackBasis(value) {
167
+ return spectreStackBases.includes(value);
168
+ }
169
+ var spectreStackAligns = ["center", "stretch"];
170
+ function isStackAlign(value) {
171
+ return spectreStackAligns.includes(value);
172
+ }
145
173
  function normalizeInt(value, fallback, min = 0) {
146
174
  if (value == null || typeof value !== "number" || !Number.isInteger(value) || value < min) {
147
175
  return fallback;
@@ -398,6 +426,16 @@ var SpectreBaseElement = class extends LitElement {
398
426
  const value = this.ariaDescribedBy?.trim();
399
427
  return value ? value : void 0;
400
428
  }
429
+ // Subclasses that expose `disabled`/`loading` properties get this disabled
430
+ // calculation for free instead of redeclaring it per component.
431
+ get isDisabled() {
432
+ const self = this;
433
+ return (self.disabled ?? false) || (self.loading ?? false);
434
+ }
435
+ // Subclasses get this for free instead of redeclaring it per component.
436
+ get hasForwardedLabel() {
437
+ return Boolean(this.forwardedAriaLabel || this.forwardedAriaLabelledBy);
438
+ }
401
439
  };
402
440
  SpectreBaseElement.properties = {};
403
441
 
@@ -565,9 +603,6 @@ var SpectreButtonElement = class extends SpectreProjectableElement {
565
603
  variant: this.variant
566
604
  });
567
605
  }
568
- get isDisabled() {
569
- return (this.disabled ?? false) || (this.loading ?? false);
570
- }
571
606
  get visibleLabelFallback() {
572
607
  const trimmedLabel = this.label?.trim();
573
608
  return trimmedLabel ? trimmedLabel : void 0;
@@ -583,7 +618,8 @@ var SpectreButtonElement = class extends SpectreProjectableElement {
583
618
  return html`<span
584
619
  class="${getInputLabelClasses({ disabled: this.isDisabled })}"
585
620
  data-sp-button-loading-label
586
- >${this.loadingLabel}</span>`;
621
+ >${this.loadingLabel}</span
622
+ >`;
587
623
  }
588
624
  if (this.hasProjectedContent) {
589
625
  return this.projectedContent;
@@ -591,7 +627,8 @@ var SpectreButtonElement = class extends SpectreProjectableElement {
591
627
  return this.visibleLabelFallback ? html`<span
592
628
  class="${getInputLabelClasses({ disabled: this.isDisabled })}"
593
629
  data-sp-button-label-fallback
594
- >${this.visibleLabelFallback}</span>` : nothing;
630
+ >${this.visibleLabelFallback}</span
631
+ >` : nothing;
595
632
  }
596
633
  render() {
597
634
  return html`<button
@@ -731,9 +768,6 @@ var SpectreInputElement = class extends SpectreBaseElement {
731
768
  state: this.isDisabled ? this.disabled ? "disabled" : "loading" : this.invalid ? "error" : this.success ? "success" : "default"
732
769
  });
733
770
  }
734
- get isDisabled() {
735
- return (this.disabled ?? false) || (this.loading ?? false);
736
- }
737
771
  get nativeInput() {
738
772
  return this.querySelector("[data-sp-input-native]");
739
773
  }
@@ -910,16 +944,15 @@ var SpectreTextareaElement = class extends SpectreBaseElement {
910
944
  }
911
945
  }
912
946
  get textareaClasses() {
913
- return getInputClasses({
947
+ return getTextareaClasses({
914
948
  fullWidth: this.fullWidth ?? false,
915
949
  pill: this.pill ?? false,
916
950
  size: this.size,
917
- state: this.isDisabled ? this.disabled ? "disabled" : "loading" : this.invalid ? "error" : this.success ? "success" : "default"
951
+ disabled: this.disabled ?? false,
952
+ loading: this.loading ?? false,
953
+ state: this.invalid ? "invalid" : this.success ? "success" : "default"
918
954
  });
919
955
  }
920
- get isDisabled() {
921
- return (this.disabled ?? false) || (this.loading ?? false);
922
- }
923
956
  get nativeTextarea() {
924
957
  return this.querySelector("[data-sp-textarea-native]");
925
958
  }
@@ -1105,16 +1138,15 @@ var SpectreSelectElement = class extends SpectreProjectableElement {
1105
1138
  }
1106
1139
  }
1107
1140
  get selectClasses() {
1108
- return getInputClasses({
1141
+ return getSelectClasses({
1109
1142
  fullWidth: this.fullWidth ?? false,
1110
1143
  pill: this.pill ?? false,
1111
1144
  size: this.size,
1112
- state: this.isDisabled ? this.disabled ? "disabled" : "loading" : this.invalid ? "error" : this.success ? "success" : "default"
1145
+ disabled: this.disabled ?? false,
1146
+ loading: this.loading ?? false,
1147
+ state: this.invalid ? "invalid" : this.success ? "success" : "default"
1113
1148
  });
1114
1149
  }
1115
- get isDisabled() {
1116
- return (this.disabled ?? false) || (this.loading ?? false);
1117
- }
1118
1150
  handleInput(event) {
1119
1151
  const select = event.currentTarget;
1120
1152
  this.value = select.value;
@@ -1243,9 +1275,6 @@ var SpectreCheckboxElement = class extends SpectreProjectableElement {
1243
1275
  get nativeInput() {
1244
1276
  return this.querySelector("[data-sp-checkbox-native]");
1245
1277
  }
1246
- get isDisabled() {
1247
- return (this.disabled ?? false) || (this.loading ?? false);
1248
- }
1249
1278
  get visibleLabelFallback() {
1250
1279
  const trimmedLabel = this.label?.trim();
1251
1280
  return trimmedLabel ? trimmedLabel : void 0;
@@ -1268,7 +1297,8 @@ var SpectreCheckboxElement = class extends SpectreProjectableElement {
1268
1297
  const labelContent = this.hasProjectedContent ? this.projectedContent : this.visibleLabelFallback ? html`<span
1269
1298
  class="${getInputLabelClasses({ disabled: this.isDisabled })}"
1270
1299
  data-sp-checkbox-label-fallback
1271
- >${this.visibleLabelFallback}</span>` : nothing;
1300
+ >${this.visibleLabelFallback}</span
1301
+ >` : nothing;
1272
1302
  return html`<label data-sp-checkbox-label>
1273
1303
  <input
1274
1304
  aria-busy="${this.loading ? "true" : "false"}"
@@ -1290,7 +1320,10 @@ var SpectreCheckboxElement = class extends SpectreProjectableElement {
1290
1320
  @change="${this.handleChange}"
1291
1321
  @input="${this.handleInput}"
1292
1322
  />
1293
- <span class="sp-checkbox-indicator" data-sp-checkbox-indicator></span>
1323
+ <span
1324
+ class="${getCheckboxClasses({ checked: this.checked ?? false, disabled: this.isDisabled })}"
1325
+ data-sp-checkbox-indicator
1326
+ ></span>
1294
1327
  ${labelContent}
1295
1328
  </label>`;
1296
1329
  }
@@ -1380,9 +1413,6 @@ var SpectreRadioElement = class extends SpectreProjectableElement {
1380
1413
  get nativeInput() {
1381
1414
  return this.querySelector("[data-sp-radio-native]");
1382
1415
  }
1383
- get isDisabled() {
1384
- return (this.disabled ?? false) || (this.loading ?? false);
1385
- }
1386
1416
  get visibleLabelFallback() {
1387
1417
  const trimmedLabel = this.label?.trim();
1388
1418
  return trimmedLabel ? trimmedLabel : void 0;
@@ -1425,7 +1455,8 @@ var SpectreRadioElement = class extends SpectreProjectableElement {
1425
1455
  const labelContent = this.hasProjectedContent ? this.projectedContent : this.visibleLabelFallback ? html`<span
1426
1456
  class="${getInputLabelClasses({ disabled: this.isDisabled })}"
1427
1457
  data-sp-radio-label-fallback
1428
- >${this.visibleLabelFallback}</span>` : nothing;
1458
+ >${this.visibleLabelFallback}</span
1459
+ >` : nothing;
1429
1460
  return html`<label data-sp-radio-label>
1430
1461
  <input
1431
1462
  aria-busy="${this.loading ? "true" : "false"}"
@@ -1447,7 +1478,10 @@ var SpectreRadioElement = class extends SpectreProjectableElement {
1447
1478
  @change="${this.handleChange}"
1448
1479
  @input="${this.handleInput}"
1449
1480
  />
1450
- <span class="sp-radio-indicator" data-sp-radio-indicator></span>
1481
+ <span
1482
+ class="${getRadioClasses({ checked: this.checked ?? false, disabled: this.isDisabled })}"
1483
+ data-sp-radio-indicator
1484
+ ></span>
1451
1485
  ${labelContent}
1452
1486
  </label>`;
1453
1487
  }
@@ -1476,11 +1510,15 @@ var SpectreLabelElement = class extends SpectreProjectableElement {
1476
1510
  constructor() {
1477
1511
  super(...arguments);
1478
1512
  this.disabled = false;
1513
+ this.required = false;
1479
1514
  }
1480
1515
  willUpdate(changedProperties) {
1481
1516
  if (changedProperties.has("disabled") && this.disabled == null) {
1482
1517
  this.disabled = false;
1483
1518
  }
1519
+ if (changedProperties.has("required") && this.required == null) {
1520
+ this.required = false;
1521
+ }
1484
1522
  }
1485
1523
  get isDisabled() {
1486
1524
  return this.disabled ?? false;
@@ -1518,7 +1556,7 @@ var SpectreLabelElement = class extends SpectreProjectableElement {
1518
1556
  aria-describedby="${ifDefined(this.forwardedAriaDescribedBy)}"
1519
1557
  aria-label="${ifDefined(this.forwardedAriaLabel)}"
1520
1558
  aria-labelledby="${ifDefined(this.forwardedAriaLabelledBy)}"
1521
- class="${getInputLabelClasses({ disabled: this.isDisabled })}"
1559
+ class="${getLabelClasses({ disabled: this.isDisabled, required: this.required ?? false })}"
1522
1560
  data-sp-label-native
1523
1561
  for="${ifDefined(this.htmlFor || void 0)}"
1524
1562
  id="${ifDefined(this.id || void 0)}"
@@ -1530,7 +1568,8 @@ var SpectreLabelElement = class extends SpectreProjectableElement {
1530
1568
  };
1531
1569
  SpectreLabelElement.properties = {
1532
1570
  disabled: { type: Boolean, reflect: true },
1533
- htmlFor: { attribute: "for", type: String, reflect: true }
1571
+ htmlFor: { attribute: "for", type: String, reflect: true },
1572
+ required: { type: Boolean, reflect: true }
1534
1573
  };
1535
1574
  function defineSpectreLabel(tagName = "sp-label") {
1536
1575
  const existingElement = customElements.get(tagName);
@@ -1582,9 +1621,6 @@ var SpectreFieldsetElement = class extends SpectreProjectableElement {
1582
1621
  const trimmedLegend = this.legend?.trim();
1583
1622
  return trimmedLegend ? trimmedLegend : void 0;
1584
1623
  }
1585
- get isDisabled() {
1586
- return (this.disabled ?? false) || (this.loading ?? false);
1587
- }
1588
1624
  getContentContainer() {
1589
1625
  return this.querySelector("[data-sp-fieldset-native]");
1590
1626
  }
@@ -1616,6 +1652,10 @@ var SpectreFieldsetElement = class extends SpectreProjectableElement {
1616
1652
  this.getContentContainer()?.blur();
1617
1653
  }
1618
1654
  render() {
1655
+ const legendClasses = getFieldsetLegendClasses();
1656
+ const legendContent = this.visibleLegend ? html`<legend class="${legendClasses}" data-sp-fieldset-legend>
1657
+ ${this.visibleLegend}
1658
+ </legend>` : nothing;
1619
1659
  return html`<fieldset
1620
1660
  aria-busy="${this.loading ? "true" : "false"}"
1621
1661
  aria-describedby="${ifDefined(this.forwardedAriaDescribedBy)}"
@@ -1624,6 +1664,7 @@ var SpectreFieldsetElement = class extends SpectreProjectableElement {
1624
1664
  aria-labelledby="${ifDefined(this.forwardedAriaLabelledBy)}"
1625
1665
  autocapitalize="${ifDefined(this.autocapitalize || void 0)}"
1626
1666
  ?autofocus="${this.autofocus}"
1667
+ class="${getFieldsetClasses({ disabled: this.isDisabled })}"
1627
1668
  data-sp-fieldset-native
1628
1669
  ?disabled="${this.isDisabled}"
1629
1670
  form="${ifDefined(this.form || void 0)}"
@@ -1632,10 +1673,7 @@ var SpectreFieldsetElement = class extends SpectreProjectableElement {
1632
1673
  spellcheck="${ifDefined(this.getAttribute("spellcheck") ?? void 0)}"
1633
1674
  title="${ifDefined(this.title || void 0)}"
1634
1675
  >
1635
- ${this.visibleLegend ? html`<legend
1636
- class="${getInputLabelClasses({ disabled: this.isDisabled })}"
1637
- data-sp-fieldset-legend
1638
- >${this.visibleLegend}</legend>` : nothing}
1676
+ ${legendContent}
1639
1677
  ${this.hasProjectedContent ? this.projectedContent : nothing}
1640
1678
  </fieldset>`;
1641
1679
  }
@@ -1714,9 +1752,6 @@ var SpectreBadgeElement = class extends SpectreProjectableElement {
1714
1752
  variant: this.variant
1715
1753
  });
1716
1754
  }
1717
- get isDisabled() {
1718
- return (this.disabled ?? false) || (this.loading ?? false);
1719
- }
1720
1755
  render() {
1721
1756
  return html`<span
1722
1757
  aria-busy="${this.loading ? "true" : "false"}"
@@ -1726,6 +1761,7 @@ var SpectreBadgeElement = class extends SpectreProjectableElement {
1726
1761
  class="${this.badgeClasses}"
1727
1762
  data-sp-badge-native
1728
1763
  id="${ifDefined(this.id || void 0)}"
1764
+ role="${ifDefined(this.hasForwardedLabel ? "group" : void 0)}"
1729
1765
  title="${ifDefined(this.title || void 0)}"
1730
1766
  >
1731
1767
  ${this.hasProjectedContent ? this.projectedContent : nothing}
@@ -1809,9 +1845,6 @@ var SpectreCardElement = class extends SpectreProjectableElement {
1809
1845
  variant: this.variant
1810
1846
  });
1811
1847
  }
1812
- get isDisabled() {
1813
- return (this.disabled ?? false) || (this.loading ?? false);
1814
- }
1815
1848
  render() {
1816
1849
  return html`<div
1817
1850
  aria-busy="${this.loading ? "true" : "false"}"
@@ -1821,6 +1854,7 @@ var SpectreCardElement = class extends SpectreProjectableElement {
1821
1854
  class="${this.cardClasses}"
1822
1855
  data-sp-card-native
1823
1856
  id="${ifDefined(this.id || void 0)}"
1857
+ role="${ifDefined(this.hasForwardedLabel ? "group" : void 0)}"
1824
1858
  title="${ifDefined(this.title || void 0)}"
1825
1859
  >
1826
1860
  ${this.hasProjectedContent ? this.projectedContent : nothing}
@@ -1910,9 +1944,6 @@ var SpectreIconBoxElement = class extends SpectreProjectableElement {
1910
1944
  variant: this.variant
1911
1945
  });
1912
1946
  }
1913
- get isDisabled() {
1914
- return (this.disabled ?? false) || (this.loading ?? false);
1915
- }
1916
1947
  render() {
1917
1948
  return html`<div
1918
1949
  aria-busy="${this.loading ? "true" : "false"}"
@@ -1922,6 +1953,7 @@ var SpectreIconBoxElement = class extends SpectreProjectableElement {
1922
1953
  class="${this.iconBoxClasses}"
1923
1954
  data-sp-icon-box-native
1924
1955
  id="${ifDefined(this.id || void 0)}"
1956
+ role="${ifDefined(this.hasForwardedLabel ? "group" : void 0)}"
1925
1957
  title="${ifDefined(this.title || void 0)}"
1926
1958
  >
1927
1959
  ${this.hasProjectedContent ? this.projectedContent : nothing}
@@ -1992,9 +2024,6 @@ var SpectreRatingElement = class extends SpectreBaseElement {
1992
2024
  size: this.size
1993
2025
  });
1994
2026
  }
1995
- get isDisabled() {
1996
- return (this.disabled ?? false) || (this.loading ?? false);
1997
- }
1998
2027
  get effectiveMax() {
1999
2028
  return this.max ?? 5;
2000
2029
  }
@@ -2009,7 +2038,11 @@ var SpectreRatingElement = class extends SpectreBaseElement {
2009
2038
  renderStars() {
2010
2039
  const stars = [];
2011
2040
  for (let i = 1; i <= this.effectiveMax; i++) {
2012
- stars.push(html`<span class="${getRatingStarClasses(i <= this.effectiveValue)}"></span>`);
2041
+ stars.push(
2042
+ html`<span
2043
+ class="${getRatingStarClasses(i <= this.effectiveValue)}"
2044
+ ></span>`
2045
+ );
2013
2046
  }
2014
2047
  return stars;
2015
2048
  }
@@ -2027,7 +2060,10 @@ var SpectreRatingElement = class extends SpectreBaseElement {
2027
2060
  title="${ifDefined(this.title || void 0)}"
2028
2061
  >
2029
2062
  <div class="${getRatingStarsClasses()}">${this.renderStars()}</div>
2030
- ${trimmedLabel ? html`<span class="${getRatingTextClasses({ disabled: this.isDisabled })}">${trimmedLabel}</span>` : nothing}
2063
+ ${trimmedLabel ? html`<span
2064
+ class="${getRatingTextClasses({ disabled: this.isDisabled })}"
2065
+ >${trimmedLabel}</span
2066
+ >` : nothing}
2031
2067
  </div>`;
2032
2068
  }
2033
2069
  };
@@ -2104,9 +2140,6 @@ var SpectreTestimonialElement = class extends SpectreProjectableElement {
2104
2140
  variant: this.variant
2105
2141
  });
2106
2142
  }
2107
- get isDisabled() {
2108
- return (this.disabled ?? false) || (this.loading ?? false);
2109
- }
2110
2143
  render() {
2111
2144
  return html`<div
2112
2145
  aria-busy="${this.loading ? "true" : "false"}"
@@ -2116,6 +2149,7 @@ var SpectreTestimonialElement = class extends SpectreProjectableElement {
2116
2149
  class="${this.testimonialClasses}"
2117
2150
  data-sp-testimonial-native
2118
2151
  id="${ifDefined(this.id || void 0)}"
2152
+ role="${ifDefined(this.hasForwardedLabel ? "group" : void 0)}"
2119
2153
  title="${ifDefined(this.title || void 0)}"
2120
2154
  >
2121
2155
  ${this.hasProjectedContent ? this.projectedContent : nothing}
@@ -2199,9 +2233,6 @@ var SpectreAlertElement = class extends SpectreProjectableElement {
2199
2233
  variant: this.variant
2200
2234
  });
2201
2235
  }
2202
- get isDisabled() {
2203
- return (this.disabled ?? false) || (this.loading ?? false);
2204
- }
2205
2236
  render() {
2206
2237
  return html`<div
2207
2238
  aria-busy="${this.loading ? "true" : "false"}"
@@ -2301,9 +2332,6 @@ var SpectreAvatarElement = class extends SpectreProjectableElement {
2301
2332
  size: this.size
2302
2333
  });
2303
2334
  }
2304
- get isDisabled() {
2305
- return (this.disabled ?? false) || (this.loading ?? false);
2306
- }
2307
2335
  render() {
2308
2336
  return html`<div
2309
2337
  aria-busy="${this.loading ? "true" : "false"}"
@@ -2313,6 +2341,7 @@ var SpectreAvatarElement = class extends SpectreProjectableElement {
2313
2341
  class="${this.avatarClasses}"
2314
2342
  data-sp-avatar-native
2315
2343
  id="${ifDefined(this.id || void 0)}"
2344
+ role="${ifDefined(this.hasForwardedLabel ? "group" : void 0)}"
2316
2345
  title="${ifDefined(this.title || void 0)}"
2317
2346
  >
2318
2347
  ${this.hasProjectedContent ? this.projectedContent : nothing}
@@ -2480,9 +2509,6 @@ var SpectreTagElement = class extends SpectreProjectableElement {
2480
2509
  variant: this.variant
2481
2510
  });
2482
2511
  }
2483
- get isDisabled() {
2484
- return (this.disabled ?? false) || (this.loading ?? false);
2485
- }
2486
2512
  render() {
2487
2513
  return html`<span
2488
2514
  aria-busy="${this.loading ? "true" : "false"}"
@@ -2492,6 +2518,7 @@ var SpectreTagElement = class extends SpectreProjectableElement {
2492
2518
  class="${this.tagClasses}"
2493
2519
  data-sp-tag-native
2494
2520
  id="${ifDefined(this.id || void 0)}"
2521
+ role="${ifDefined(this.hasForwardedLabel ? "group" : void 0)}"
2495
2522
  title="${ifDefined(this.title || void 0)}"
2496
2523
  >
2497
2524
  ${this.hasProjectedContent ? this.projectedContent : nothing}
@@ -2573,9 +2600,6 @@ var SpectrePricingCardElement = class extends SpectreProjectableElement {
2573
2600
  loading: this.loading ?? false
2574
2601
  });
2575
2602
  }
2576
- get isDisabled() {
2577
- return (this.disabled ?? false) || (this.loading ?? false);
2578
- }
2579
2603
  render() {
2580
2604
  return html`<div
2581
2605
  aria-busy="${this.loading ? "true" : "false"}"
@@ -2585,6 +2609,7 @@ var SpectrePricingCardElement = class extends SpectreProjectableElement {
2585
2609
  class="${this.pricingCardClasses}"
2586
2610
  data-sp-pricing-card-native
2587
2611
  id="${ifDefined(this.id || void 0)}"
2612
+ role="${ifDefined(this.hasForwardedLabel ? "group" : void 0)}"
2588
2613
  title="${ifDefined(this.title || void 0)}"
2589
2614
  >
2590
2615
  ${this.hasProjectedContent ? this.projectedContent : nothing}
@@ -2606,6 +2631,259 @@ function defineSpectrePricingCard(tagName = "sp-pricing-card") {
2606
2631
  customElements.define(tagName, SpectrePricingCardElement);
2607
2632
  return SpectrePricingCardElement;
2608
2633
  }
2634
+ var SpectreContainerElement = class extends SpectreProjectableElement {
2635
+ constructor() {
2636
+ super(...arguments);
2637
+ this.maxWidth = void 0;
2638
+ }
2639
+ get id() {
2640
+ return super.id;
2641
+ }
2642
+ set id(value) {
2643
+ super.id = value;
2644
+ }
2645
+ get title() {
2646
+ return super.title;
2647
+ }
2648
+ set title(value) {
2649
+ super.title = value;
2650
+ }
2651
+ getContentContainer() {
2652
+ return this.querySelector("[data-sp-container-native]");
2653
+ }
2654
+ isInternalNode(node) {
2655
+ if (node.nodeType !== Node.ELEMENT_NODE) {
2656
+ return false;
2657
+ }
2658
+ const el = node;
2659
+ return el.hasAttribute("data-sp-container-native");
2660
+ }
2661
+ willUpdate(changedProperties) {
2662
+ if (changedProperties.has("maxWidth") && this.maxWidth != null && !isContainerMaxWidth(this.maxWidth)) {
2663
+ this.maxWidth = void 0;
2664
+ }
2665
+ }
2666
+ get containerClasses() {
2667
+ return getContainerClasses(
2668
+ this.maxWidth != null ? { maxWidth: this.maxWidth } : {}
2669
+ );
2670
+ }
2671
+ render() {
2672
+ return html`<div
2673
+ aria-describedby="${ifDefined(this.forwardedAriaDescribedBy)}"
2674
+ aria-label="${ifDefined(this.forwardedAriaLabel)}"
2675
+ aria-labelledby="${ifDefined(this.forwardedAriaLabelledBy)}"
2676
+ class="${this.containerClasses}"
2677
+ data-sp-container-native
2678
+ id="${ifDefined(this.id || void 0)}"
2679
+ title="${ifDefined(this.title || void 0)}"
2680
+ >
2681
+ ${this.hasProjectedContent ? this.projectedContent : nothing}
2682
+ </div>`;
2683
+ }
2684
+ };
2685
+ SpectreContainerElement.properties = {
2686
+ maxWidth: { attribute: "max-width", type: String, reflect: true }
2687
+ };
2688
+ function defineSpectreContainer(tagName = "sp-container") {
2689
+ const existingElement = customElements.get(tagName);
2690
+ if (existingElement) {
2691
+ return existingElement;
2692
+ }
2693
+ customElements.define(tagName, SpectreContainerElement);
2694
+ return SpectreContainerElement;
2695
+ }
2696
+ var SpectreGridElement = class extends SpectreProjectableElement {
2697
+ constructor() {
2698
+ super(...arguments);
2699
+ this.columns = 1;
2700
+ this.gap = "md";
2701
+ }
2702
+ get id() {
2703
+ return super.id;
2704
+ }
2705
+ set id(value) {
2706
+ super.id = value;
2707
+ }
2708
+ get title() {
2709
+ return super.title;
2710
+ }
2711
+ set title(value) {
2712
+ super.title = value;
2713
+ }
2714
+ getContentContainer() {
2715
+ return this.querySelector("[data-sp-grid-native]");
2716
+ }
2717
+ isInternalNode(node) {
2718
+ if (node.nodeType !== Node.ELEMENT_NODE) {
2719
+ return false;
2720
+ }
2721
+ const el = node;
2722
+ return el.hasAttribute("data-sp-grid-native");
2723
+ }
2724
+ willUpdate(changedProperties) {
2725
+ if (changedProperties.has("columns")) {
2726
+ const normalized = normalizeInt(this.columns, void 0, 1);
2727
+ this.columns = normalized != null && isGridColumns(normalized) ? normalized : 1;
2728
+ }
2729
+ if (changedProperties.has("gap") && (this.gap == null || !isGridGap(this.gap))) {
2730
+ this.gap = "md";
2731
+ }
2732
+ }
2733
+ get gridClasses() {
2734
+ return getGridClasses({
2735
+ columns: this.columns,
2736
+ gap: this.gap
2737
+ });
2738
+ }
2739
+ render() {
2740
+ return html`<div
2741
+ aria-describedby="${ifDefined(this.forwardedAriaDescribedBy)}"
2742
+ aria-label="${ifDefined(this.forwardedAriaLabel)}"
2743
+ aria-labelledby="${ifDefined(this.forwardedAriaLabelledBy)}"
2744
+ class="${this.gridClasses}"
2745
+ data-sp-grid-native
2746
+ id="${ifDefined(this.id || void 0)}"
2747
+ title="${ifDefined(this.title || void 0)}"
2748
+ >
2749
+ ${this.hasProjectedContent ? this.projectedContent : nothing}
2750
+ </div>`;
2751
+ }
2752
+ };
2753
+ SpectreGridElement.properties = {
2754
+ columns: { type: Number, reflect: true },
2755
+ gap: { type: String, reflect: true }
2756
+ };
2757
+ function defineSpectreGrid(tagName = "sp-grid") {
2758
+ const existingElement = customElements.get(tagName);
2759
+ if (existingElement) {
2760
+ return existingElement;
2761
+ }
2762
+ customElements.define(tagName, SpectreGridElement);
2763
+ return SpectreGridElement;
2764
+ }
2765
+ var SpectreSectionElement = class extends SpectreProjectableElement {
2766
+ get id() {
2767
+ return super.id;
2768
+ }
2769
+ set id(value) {
2770
+ super.id = value;
2771
+ }
2772
+ get title() {
2773
+ return super.title;
2774
+ }
2775
+ set title(value) {
2776
+ super.title = value;
2777
+ }
2778
+ getContentContainer() {
2779
+ return this.querySelector("[data-sp-section-native]");
2780
+ }
2781
+ isInternalNode(node) {
2782
+ if (node.nodeType !== Node.ELEMENT_NODE) {
2783
+ return false;
2784
+ }
2785
+ const el = node;
2786
+ return el.hasAttribute("data-sp-section-native");
2787
+ }
2788
+ get sectionClasses() {
2789
+ return getSectionClasses({});
2790
+ }
2791
+ render() {
2792
+ return html`<section
2793
+ aria-describedby="${ifDefined(this.forwardedAriaDescribedBy)}"
2794
+ aria-label="${ifDefined(this.forwardedAriaLabel)}"
2795
+ aria-labelledby="${ifDefined(this.forwardedAriaLabelledBy)}"
2796
+ class="${this.sectionClasses}"
2797
+ data-sp-section-native
2798
+ id="${ifDefined(this.id || void 0)}"
2799
+ title="${ifDefined(this.title || void 0)}"
2800
+ >
2801
+ ${this.hasProjectedContent ? this.projectedContent : nothing}
2802
+ </section>`;
2803
+ }
2804
+ };
2805
+ function defineSpectreSection(tagName = "sp-section") {
2806
+ const existingElement = customElements.get(tagName);
2807
+ if (existingElement) {
2808
+ return existingElement;
2809
+ }
2810
+ customElements.define(tagName, SpectreSectionElement);
2811
+ return SpectreSectionElement;
2812
+ }
2813
+ var SpectreStackElement = class extends SpectreProjectableElement {
2814
+ constructor() {
2815
+ super(...arguments);
2816
+ this.align = "center";
2817
+ this.basis = void 0;
2818
+ this.direction = "vertical";
2819
+ }
2820
+ get id() {
2821
+ return super.id;
2822
+ }
2823
+ set id(value) {
2824
+ super.id = value;
2825
+ }
2826
+ get title() {
2827
+ return super.title;
2828
+ }
2829
+ set title(value) {
2830
+ super.title = value;
2831
+ }
2832
+ getContentContainer() {
2833
+ return this.querySelector("[data-sp-stack-native]");
2834
+ }
2835
+ isInternalNode(node) {
2836
+ if (node.nodeType !== Node.ELEMENT_NODE) {
2837
+ return false;
2838
+ }
2839
+ const el = node;
2840
+ return el.hasAttribute("data-sp-stack-native");
2841
+ }
2842
+ willUpdate(changedProperties) {
2843
+ if (changedProperties.has("direction") && (this.direction == null || !isStackDirection(this.direction))) {
2844
+ this.direction = "vertical";
2845
+ }
2846
+ if (changedProperties.has("basis") && this.basis != null && !isStackBasis(this.basis)) {
2847
+ this.basis = void 0;
2848
+ }
2849
+ if (changedProperties.has("align") && (this.align == null || !isStackAlign(this.align))) {
2850
+ this.align = "center";
2851
+ }
2852
+ }
2853
+ get stackClasses() {
2854
+ return getStackClasses({
2855
+ align: this.align,
2856
+ direction: this.direction,
2857
+ ...this.basis != null ? { basis: this.basis } : {}
2858
+ });
2859
+ }
2860
+ render() {
2861
+ return html`<div
2862
+ aria-describedby="${ifDefined(this.forwardedAriaDescribedBy)}"
2863
+ aria-label="${ifDefined(this.forwardedAriaLabel)}"
2864
+ aria-labelledby="${ifDefined(this.forwardedAriaLabelledBy)}"
2865
+ class="${this.stackClasses}"
2866
+ data-sp-stack-native
2867
+ id="${ifDefined(this.id || void 0)}"
2868
+ title="${ifDefined(this.title || void 0)}"
2869
+ >
2870
+ ${this.hasProjectedContent ? this.projectedContent : nothing}
2871
+ </div>`;
2872
+ }
2873
+ };
2874
+ SpectreStackElement.properties = {
2875
+ align: { type: String, reflect: true },
2876
+ basis: { type: String, reflect: true },
2877
+ direction: { type: String, reflect: true }
2878
+ };
2879
+ function defineSpectreStack(tagName = "sp-stack") {
2880
+ const existingElement = customElements.get(tagName);
2881
+ if (existingElement) {
2882
+ return existingElement;
2883
+ }
2884
+ customElements.define(tagName, SpectreStackElement);
2885
+ return SpectreStackElement;
2886
+ }
2609
2887
 
2610
2888
  // src/index.ts
2611
2889
  function defineSpectreComponents() {
@@ -2627,8 +2905,12 @@ function defineSpectreComponents() {
2627
2905
  defineSpectreSpinner();
2628
2906
  defineSpectreTag();
2629
2907
  defineSpectrePricingCard();
2908
+ defineSpectreContainer();
2909
+ defineSpectreGrid();
2910
+ defineSpectreSection();
2911
+ defineSpectreStack();
2630
2912
  }
2631
2913
 
2632
- export { SpectreAlertElement, SpectreAvatarElement, SpectreBadgeElement, SpectreButtonElement, SpectreCardElement, SpectreCheckboxElement, SpectreFieldsetElement, SpectreIconBoxElement, SpectreInputElement, SpectreLabelElement, SpectrePricingCardElement, SpectreRadioElement, SpectreRatingElement, SpectreSelectElement, SpectreSpinnerElement, SpectreTagElement, SpectreTestimonialElement, SpectreTextareaElement, defineSpectreAlert, defineSpectreAvatar, defineSpectreBadge, defineSpectreButton, defineSpectreCard, defineSpectreCheckbox, defineSpectreComponents, defineSpectreFieldset, defineSpectreIconBox, defineSpectreInput, defineSpectreLabel, defineSpectrePricingCard, defineSpectreRadio, defineSpectreRating, defineSpectreSelect, defineSpectreSpinner, defineSpectreTag, defineSpectreTestimonial, defineSpectreTextarea, spectreInputSizes as spectreAlertSizes, spectreAlertVariants, spectreAvatarShapes, spectreAvatarSizes, spectreInputSizes as spectreBadgeSizes, spectreBadgeVariants, spectreInputSizes as spectreButtonSizes, spectreButtonTypes, spectreButtonVariants, spectreCardVariants, spectreInputSizes as spectreIconBoxSizes, spectreIconBoxVariants, spectreInputSizes, spectreInputTypes, spectreInputSizes as spectreRatingSizes, spectreInputSizes as spectreSpinnerSizes, spectreSpinnerVariants, spectreInputSizes as spectreTagSizes, spectreTagVariants, spectreTestimonialVariants };
2914
+ export { SpectreAlertElement, SpectreAvatarElement, SpectreBadgeElement, SpectreButtonElement, SpectreCardElement, SpectreCheckboxElement, SpectreContainerElement, SpectreFieldsetElement, SpectreGridElement, SpectreIconBoxElement, SpectreInputElement, SpectreLabelElement, SpectrePricingCardElement, SpectreRadioElement, SpectreRatingElement, SpectreSectionElement, SpectreSelectElement, SpectreSpinnerElement, SpectreStackElement, SpectreTagElement, SpectreTestimonialElement, SpectreTextareaElement, defineSpectreAlert, defineSpectreAvatar, defineSpectreBadge, defineSpectreButton, defineSpectreCard, defineSpectreCheckbox, defineSpectreComponents, defineSpectreContainer, defineSpectreFieldset, defineSpectreGrid, defineSpectreIconBox, defineSpectreInput, defineSpectreLabel, defineSpectrePricingCard, defineSpectreRadio, defineSpectreRating, defineSpectreSection, defineSpectreSelect, defineSpectreSpinner, defineSpectreStack, defineSpectreTag, defineSpectreTestimonial, defineSpectreTextarea, spectreInputSizes as spectreAlertSizes, spectreAlertVariants, spectreAvatarShapes, spectreAvatarSizes, spectreInputSizes as spectreBadgeSizes, spectreBadgeVariants, spectreInputSizes as spectreButtonSizes, spectreButtonTypes, spectreButtonVariants, spectreCardVariants, spectreContainerMaxWidths, spectreGridColumns, spectreGridGaps, spectreInputSizes as spectreIconBoxSizes, spectreIconBoxVariants, spectreInputSizes, spectreInputTypes, spectreInputSizes as spectreRatingSizes, spectreInputSizes as spectreSpinnerSizes, spectreSpinnerVariants, spectreStackAligns, spectreStackBases, spectreStackDirections, spectreInputSizes as spectreTagSizes, spectreTagVariants, spectreTestimonialVariants };
2633
2915
  //# sourceMappingURL=index.js.map
2634
2916
  //# sourceMappingURL=index.js.map