@phcdevworks/spectre-components 1.5.0 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/README.md +291 -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/dropdown.cjs +486 -0
  47. package/dist/dropdown.cjs.map +1 -0
  48. package/dist/dropdown.d.cts +69 -0
  49. package/dist/dropdown.d.ts +69 -0
  50. package/dist/dropdown.js +482 -0
  51. package/dist/dropdown.js.map +1 -0
  52. package/dist/fieldset.cjs +16 -7
  53. package/dist/fieldset.cjs.map +1 -1
  54. package/dist/fieldset.d.cts +2 -3
  55. package/dist/fieldset.d.ts +2 -3
  56. package/dist/fieldset.js +18 -9
  57. package/dist/fieldset.js.map +1 -1
  58. package/dist/form-DgzRhNmg.d.cts +46 -0
  59. package/dist/form-DgzRhNmg.d.ts +46 -0
  60. package/dist/grid.cjs +437 -0
  61. package/dist/grid.cjs.map +1 -0
  62. package/dist/grid.d.cts +42 -0
  63. package/dist/grid.d.ts +42 -0
  64. package/dist/grid.js +432 -0
  65. package/dist/grid.js.map +1 -0
  66. package/dist/icon-box.cjs +11 -3
  67. package/dist/icon-box.cjs.map +1 -1
  68. package/dist/icon-box.d.cts +4 -5
  69. package/dist/icon-box.d.ts +4 -5
  70. package/dist/icon-box.js +11 -3
  71. package/dist/icon-box.js.map +1 -1
  72. package/dist/index.cjs +1286 -66
  73. package/dist/index.cjs.map +1 -1
  74. package/dist/index.d.cts +13 -3
  75. package/dist/index.d.ts +13 -3
  76. package/dist/index.js +1259 -68
  77. package/dist/index.js.map +1 -1
  78. package/dist/input.cjs +10 -3
  79. package/dist/input.cjs.map +1 -1
  80. package/dist/input.d.cts +3 -4
  81. package/dist/input.d.ts +3 -4
  82. package/dist/input.js +10 -3
  83. package/dist/input.js.map +1 -1
  84. package/dist/label.cjs +17 -2
  85. package/dist/label.cjs.map +1 -1
  86. package/dist/label.d.cts +9 -3
  87. package/dist/label.d.ts +9 -3
  88. package/dist/label.js +18 -3
  89. package/dist/label.js.map +1 -1
  90. package/dist/modal.cjs +519 -0
  91. package/dist/modal.cjs.map +1 -0
  92. package/dist/modal.d.cts +52 -0
  93. package/dist/modal.d.ts +52 -0
  94. package/dist/modal.js +516 -0
  95. package/dist/modal.js.map +1 -0
  96. package/dist/nav.cjs +424 -0
  97. package/dist/nav.cjs.map +1 -0
  98. package/dist/nav.d.cts +45 -0
  99. package/dist/nav.d.ts +45 -0
  100. package/dist/nav.js +421 -0
  101. package/dist/nav.js.map +1 -0
  102. package/dist/pricing-card.cjs +11 -3
  103. package/dist/pricing-card.cjs.map +1 -1
  104. package/dist/pricing-card.d.cts +2 -3
  105. package/dist/pricing-card.d.ts +2 -3
  106. package/dist/pricing-card.js +11 -3
  107. package/dist/pricing-card.js.map +1 -1
  108. package/dist/{projectable-D6IDeKfr.d.ts → projectable-D9YCo9NY.d.ts} +1 -1
  109. package/dist/{projectable-Bx-IVk0w.d.cts → projectable-DLOn6eaW.d.cts} +1 -1
  110. package/dist/radio.cjs +16 -5
  111. package/dist/radio.cjs.map +1 -1
  112. package/dist/radio.d.cts +2 -3
  113. package/dist/radio.d.ts +2 -3
  114. package/dist/radio.js +17 -6
  115. package/dist/radio.js.map +1 -1
  116. package/dist/rating.cjs +19 -5
  117. package/dist/rating.cjs.map +1 -1
  118. package/dist/rating.d.cts +3 -4
  119. package/dist/rating.d.ts +3 -4
  120. package/dist/rating.js +19 -5
  121. package/dist/rating.js.map +1 -1
  122. package/dist/section.cjs +400 -0
  123. package/dist/section.cjs.map +1 -0
  124. package/dist/section.d.cts +25 -0
  125. package/dist/section.d.ts +25 -0
  126. package/dist/section.js +397 -0
  127. package/dist/section.js.map +1 -0
  128. package/dist/select.cjs +14 -5
  129. package/dist/select.cjs.map +1 -1
  130. package/dist/select.d.cts +3 -4
  131. package/dist/select.d.ts +3 -4
  132. package/dist/select.js +15 -6
  133. package/dist/select.js.map +1 -1
  134. package/dist/sidebar.cjs +481 -0
  135. package/dist/sidebar.cjs.map +1 -0
  136. package/dist/sidebar.d.cts +50 -0
  137. package/dist/sidebar.d.ts +50 -0
  138. package/dist/sidebar.js +478 -0
  139. package/dist/sidebar.js.map +1 -0
  140. package/dist/spinner.cjs +10 -0
  141. package/dist/spinner.cjs.map +1 -1
  142. package/dist/spinner.d.cts +3 -3
  143. package/dist/spinner.d.ts +3 -3
  144. package/dist/spinner.js +10 -0
  145. package/dist/spinner.js.map +1 -1
  146. package/dist/stack.cjs +443 -0
  147. package/dist/stack.cjs.map +1 -0
  148. package/dist/stack.d.cts +48 -0
  149. package/dist/stack.d.ts +48 -0
  150. package/dist/stack.js +437 -0
  151. package/dist/stack.js.map +1 -0
  152. package/dist/tag.cjs +11 -3
  153. package/dist/tag.cjs.map +1 -1
  154. package/dist/tag.d.cts +4 -5
  155. package/dist/tag.d.ts +4 -5
  156. package/dist/tag.js +11 -3
  157. package/dist/tag.js.map +1 -1
  158. package/dist/testimonial.cjs +11 -3
  159. package/dist/testimonial.cjs.map +1 -1
  160. package/dist/testimonial.d.cts +4 -5
  161. package/dist/testimonial.d.ts +4 -5
  162. package/dist/testimonial.js +11 -3
  163. package/dist/testimonial.js.map +1 -1
  164. package/dist/textarea.cjs +14 -5
  165. package/dist/textarea.cjs.map +1 -1
  166. package/dist/textarea.d.cts +2 -3
  167. package/dist/textarea.d.ts +2 -3
  168. package/dist/textarea.js +15 -6
  169. package/dist/textarea.js.map +1 -1
  170. package/dist/toast.cjs +475 -0
  171. package/dist/toast.cjs.map +1 -0
  172. package/dist/toast.d.cts +68 -0
  173. package/dist/toast.d.ts +68 -0
  174. package/dist/toast.js +471 -0
  175. package/dist/toast.js.map +1 -0
  176. package/dist/tooltip.cjs +444 -0
  177. package/dist/tooltip.cjs.map +1 -0
  178. package/dist/tooltip.d.cts +50 -0
  179. package/dist/tooltip.d.ts +50 -0
  180. package/dist/tooltip.js +440 -0
  181. package/dist/tooltip.js.map +1 -0
  182. package/package.json +71 -16
  183. package/dist/form-BumNzIay.d.cts +0 -28
  184. package/dist/form-BumNzIay.d.ts +0 -28
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, getDropdownClasses, getDropdownMenuClasses, getModalOverlayClasses, getModalClasses, getNavClasses, getSidebarClasses, getSidebarToggleClasses, getSidebarBackdropClasses, getToastClasses, getToastIconClasses, getTooltipClasses, 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,65 @@ 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
+ }
173
+ var spectreDropdownPlacements = [
174
+ "bottom-start",
175
+ "bottom-end",
176
+ "top-start",
177
+ "top-end"
178
+ ];
179
+ function isDropdownPlacement(value) {
180
+ return spectreDropdownPlacements.includes(
181
+ value
182
+ );
183
+ }
184
+ var spectreToastVariants = [
185
+ "info",
186
+ "success",
187
+ "warning",
188
+ "danger"
189
+ ];
190
+ function isToastVariant(value) {
191
+ return spectreToastVariants.includes(value);
192
+ }
193
+ var spectreTooltipPlacements = [
194
+ "top",
195
+ "bottom",
196
+ "left",
197
+ "right"
198
+ ];
199
+ function isTooltipPlacement(value) {
200
+ return spectreTooltipPlacements.includes(
201
+ value
202
+ );
203
+ }
145
204
  function normalizeInt(value, fallback, min = 0) {
146
205
  if (value == null || typeof value !== "number" || !Number.isInteger(value) || value < min) {
147
206
  return fallback;
@@ -398,6 +457,16 @@ var SpectreBaseElement = class extends LitElement {
398
457
  const value = this.ariaDescribedBy?.trim();
399
458
  return value ? value : void 0;
400
459
  }
460
+ // Subclasses that expose `disabled`/`loading` properties get this disabled
461
+ // calculation for free instead of redeclaring it per component.
462
+ get isDisabled() {
463
+ const self = this;
464
+ return (self.disabled ?? false) || (self.loading ?? false);
465
+ }
466
+ // Subclasses get this for free instead of redeclaring it per component.
467
+ get hasForwardedLabel() {
468
+ return Boolean(this.forwardedAriaLabel || this.forwardedAriaLabelledBy);
469
+ }
401
470
  };
402
471
  SpectreBaseElement.properties = {};
403
472
 
@@ -565,9 +634,6 @@ var SpectreButtonElement = class extends SpectreProjectableElement {
565
634
  variant: this.variant
566
635
  });
567
636
  }
568
- get isDisabled() {
569
- return (this.disabled ?? false) || (this.loading ?? false);
570
- }
571
637
  get visibleLabelFallback() {
572
638
  const trimmedLabel = this.label?.trim();
573
639
  return trimmedLabel ? trimmedLabel : void 0;
@@ -583,7 +649,8 @@ var SpectreButtonElement = class extends SpectreProjectableElement {
583
649
  return html`<span
584
650
  class="${getInputLabelClasses({ disabled: this.isDisabled })}"
585
651
  data-sp-button-loading-label
586
- >${this.loadingLabel}</span>`;
652
+ >${this.loadingLabel}</span
653
+ >`;
587
654
  }
588
655
  if (this.hasProjectedContent) {
589
656
  return this.projectedContent;
@@ -591,7 +658,8 @@ var SpectreButtonElement = class extends SpectreProjectableElement {
591
658
  return this.visibleLabelFallback ? html`<span
592
659
  class="${getInputLabelClasses({ disabled: this.isDisabled })}"
593
660
  data-sp-button-label-fallback
594
- >${this.visibleLabelFallback}</span>` : nothing;
661
+ >${this.visibleLabelFallback}</span
662
+ >` : nothing;
595
663
  }
596
664
  render() {
597
665
  return html`<button
@@ -731,9 +799,6 @@ var SpectreInputElement = class extends SpectreBaseElement {
731
799
  state: this.isDisabled ? this.disabled ? "disabled" : "loading" : this.invalid ? "error" : this.success ? "success" : "default"
732
800
  });
733
801
  }
734
- get isDisabled() {
735
- return (this.disabled ?? false) || (this.loading ?? false);
736
- }
737
802
  get nativeInput() {
738
803
  return this.querySelector("[data-sp-input-native]");
739
804
  }
@@ -910,16 +975,15 @@ var SpectreTextareaElement = class extends SpectreBaseElement {
910
975
  }
911
976
  }
912
977
  get textareaClasses() {
913
- return getInputClasses({
978
+ return getTextareaClasses({
914
979
  fullWidth: this.fullWidth ?? false,
915
980
  pill: this.pill ?? false,
916
981
  size: this.size,
917
- state: this.isDisabled ? this.disabled ? "disabled" : "loading" : this.invalid ? "error" : this.success ? "success" : "default"
982
+ disabled: this.disabled ?? false,
983
+ loading: this.loading ?? false,
984
+ state: this.invalid ? "invalid" : this.success ? "success" : "default"
918
985
  });
919
986
  }
920
- get isDisabled() {
921
- return (this.disabled ?? false) || (this.loading ?? false);
922
- }
923
987
  get nativeTextarea() {
924
988
  return this.querySelector("[data-sp-textarea-native]");
925
989
  }
@@ -1105,16 +1169,15 @@ var SpectreSelectElement = class extends SpectreProjectableElement {
1105
1169
  }
1106
1170
  }
1107
1171
  get selectClasses() {
1108
- return getInputClasses({
1172
+ return getSelectClasses({
1109
1173
  fullWidth: this.fullWidth ?? false,
1110
1174
  pill: this.pill ?? false,
1111
1175
  size: this.size,
1112
- state: this.isDisabled ? this.disabled ? "disabled" : "loading" : this.invalid ? "error" : this.success ? "success" : "default"
1176
+ disabled: this.disabled ?? false,
1177
+ loading: this.loading ?? false,
1178
+ state: this.invalid ? "invalid" : this.success ? "success" : "default"
1113
1179
  });
1114
1180
  }
1115
- get isDisabled() {
1116
- return (this.disabled ?? false) || (this.loading ?? false);
1117
- }
1118
1181
  handleInput(event) {
1119
1182
  const select = event.currentTarget;
1120
1183
  this.value = select.value;
@@ -1243,9 +1306,6 @@ var SpectreCheckboxElement = class extends SpectreProjectableElement {
1243
1306
  get nativeInput() {
1244
1307
  return this.querySelector("[data-sp-checkbox-native]");
1245
1308
  }
1246
- get isDisabled() {
1247
- return (this.disabled ?? false) || (this.loading ?? false);
1248
- }
1249
1309
  get visibleLabelFallback() {
1250
1310
  const trimmedLabel = this.label?.trim();
1251
1311
  return trimmedLabel ? trimmedLabel : void 0;
@@ -1268,7 +1328,8 @@ var SpectreCheckboxElement = class extends SpectreProjectableElement {
1268
1328
  const labelContent = this.hasProjectedContent ? this.projectedContent : this.visibleLabelFallback ? html`<span
1269
1329
  class="${getInputLabelClasses({ disabled: this.isDisabled })}"
1270
1330
  data-sp-checkbox-label-fallback
1271
- >${this.visibleLabelFallback}</span>` : nothing;
1331
+ >${this.visibleLabelFallback}</span
1332
+ >` : nothing;
1272
1333
  return html`<label data-sp-checkbox-label>
1273
1334
  <input
1274
1335
  aria-busy="${this.loading ? "true" : "false"}"
@@ -1290,7 +1351,10 @@ var SpectreCheckboxElement = class extends SpectreProjectableElement {
1290
1351
  @change="${this.handleChange}"
1291
1352
  @input="${this.handleInput}"
1292
1353
  />
1293
- <span class="sp-checkbox-indicator" data-sp-checkbox-indicator></span>
1354
+ <span
1355
+ class="${getCheckboxClasses({ checked: this.checked ?? false, disabled: this.isDisabled })}"
1356
+ data-sp-checkbox-indicator
1357
+ ></span>
1294
1358
  ${labelContent}
1295
1359
  </label>`;
1296
1360
  }
@@ -1380,9 +1444,6 @@ var SpectreRadioElement = class extends SpectreProjectableElement {
1380
1444
  get nativeInput() {
1381
1445
  return this.querySelector("[data-sp-radio-native]");
1382
1446
  }
1383
- get isDisabled() {
1384
- return (this.disabled ?? false) || (this.loading ?? false);
1385
- }
1386
1447
  get visibleLabelFallback() {
1387
1448
  const trimmedLabel = this.label?.trim();
1388
1449
  return trimmedLabel ? trimmedLabel : void 0;
@@ -1425,7 +1486,8 @@ var SpectreRadioElement = class extends SpectreProjectableElement {
1425
1486
  const labelContent = this.hasProjectedContent ? this.projectedContent : this.visibleLabelFallback ? html`<span
1426
1487
  class="${getInputLabelClasses({ disabled: this.isDisabled })}"
1427
1488
  data-sp-radio-label-fallback
1428
- >${this.visibleLabelFallback}</span>` : nothing;
1489
+ >${this.visibleLabelFallback}</span
1490
+ >` : nothing;
1429
1491
  return html`<label data-sp-radio-label>
1430
1492
  <input
1431
1493
  aria-busy="${this.loading ? "true" : "false"}"
@@ -1447,7 +1509,10 @@ var SpectreRadioElement = class extends SpectreProjectableElement {
1447
1509
  @change="${this.handleChange}"
1448
1510
  @input="${this.handleInput}"
1449
1511
  />
1450
- <span class="sp-radio-indicator" data-sp-radio-indicator></span>
1512
+ <span
1513
+ class="${getRadioClasses({ checked: this.checked ?? false, disabled: this.isDisabled })}"
1514
+ data-sp-radio-indicator
1515
+ ></span>
1451
1516
  ${labelContent}
1452
1517
  </label>`;
1453
1518
  }
@@ -1476,11 +1541,15 @@ var SpectreLabelElement = class extends SpectreProjectableElement {
1476
1541
  constructor() {
1477
1542
  super(...arguments);
1478
1543
  this.disabled = false;
1544
+ this.required = false;
1479
1545
  }
1480
1546
  willUpdate(changedProperties) {
1481
1547
  if (changedProperties.has("disabled") && this.disabled == null) {
1482
1548
  this.disabled = false;
1483
1549
  }
1550
+ if (changedProperties.has("required") && this.required == null) {
1551
+ this.required = false;
1552
+ }
1484
1553
  }
1485
1554
  get isDisabled() {
1486
1555
  return this.disabled ?? false;
@@ -1518,7 +1587,7 @@ var SpectreLabelElement = class extends SpectreProjectableElement {
1518
1587
  aria-describedby="${ifDefined(this.forwardedAriaDescribedBy)}"
1519
1588
  aria-label="${ifDefined(this.forwardedAriaLabel)}"
1520
1589
  aria-labelledby="${ifDefined(this.forwardedAriaLabelledBy)}"
1521
- class="${getInputLabelClasses({ disabled: this.isDisabled })}"
1590
+ class="${getLabelClasses({ disabled: this.isDisabled, required: this.required ?? false })}"
1522
1591
  data-sp-label-native
1523
1592
  for="${ifDefined(this.htmlFor || void 0)}"
1524
1593
  id="${ifDefined(this.id || void 0)}"
@@ -1530,7 +1599,8 @@ var SpectreLabelElement = class extends SpectreProjectableElement {
1530
1599
  };
1531
1600
  SpectreLabelElement.properties = {
1532
1601
  disabled: { type: Boolean, reflect: true },
1533
- htmlFor: { attribute: "for", type: String, reflect: true }
1602
+ htmlFor: { attribute: "for", type: String, reflect: true },
1603
+ required: { type: Boolean, reflect: true }
1534
1604
  };
1535
1605
  function defineSpectreLabel(tagName = "sp-label") {
1536
1606
  const existingElement = customElements.get(tagName);
@@ -1582,9 +1652,6 @@ var SpectreFieldsetElement = class extends SpectreProjectableElement {
1582
1652
  const trimmedLegend = this.legend?.trim();
1583
1653
  return trimmedLegend ? trimmedLegend : void 0;
1584
1654
  }
1585
- get isDisabled() {
1586
- return (this.disabled ?? false) || (this.loading ?? false);
1587
- }
1588
1655
  getContentContainer() {
1589
1656
  return this.querySelector("[data-sp-fieldset-native]");
1590
1657
  }
@@ -1616,6 +1683,10 @@ var SpectreFieldsetElement = class extends SpectreProjectableElement {
1616
1683
  this.getContentContainer()?.blur();
1617
1684
  }
1618
1685
  render() {
1686
+ const legendClasses = getFieldsetLegendClasses();
1687
+ const legendContent = this.visibleLegend ? html`<legend class="${legendClasses}" data-sp-fieldset-legend>
1688
+ ${this.visibleLegend}
1689
+ </legend>` : nothing;
1619
1690
  return html`<fieldset
1620
1691
  aria-busy="${this.loading ? "true" : "false"}"
1621
1692
  aria-describedby="${ifDefined(this.forwardedAriaDescribedBy)}"
@@ -1624,6 +1695,7 @@ var SpectreFieldsetElement = class extends SpectreProjectableElement {
1624
1695
  aria-labelledby="${ifDefined(this.forwardedAriaLabelledBy)}"
1625
1696
  autocapitalize="${ifDefined(this.autocapitalize || void 0)}"
1626
1697
  ?autofocus="${this.autofocus}"
1698
+ class="${getFieldsetClasses({ disabled: this.isDisabled })}"
1627
1699
  data-sp-fieldset-native
1628
1700
  ?disabled="${this.isDisabled}"
1629
1701
  form="${ifDefined(this.form || void 0)}"
@@ -1632,10 +1704,7 @@ var SpectreFieldsetElement = class extends SpectreProjectableElement {
1632
1704
  spellcheck="${ifDefined(this.getAttribute("spellcheck") ?? void 0)}"
1633
1705
  title="${ifDefined(this.title || void 0)}"
1634
1706
  >
1635
- ${this.visibleLegend ? html`<legend
1636
- class="${getInputLabelClasses({ disabled: this.isDisabled })}"
1637
- data-sp-fieldset-legend
1638
- >${this.visibleLegend}</legend>` : nothing}
1707
+ ${legendContent}
1639
1708
  ${this.hasProjectedContent ? this.projectedContent : nothing}
1640
1709
  </fieldset>`;
1641
1710
  }
@@ -1714,9 +1783,6 @@ var SpectreBadgeElement = class extends SpectreProjectableElement {
1714
1783
  variant: this.variant
1715
1784
  });
1716
1785
  }
1717
- get isDisabled() {
1718
- return (this.disabled ?? false) || (this.loading ?? false);
1719
- }
1720
1786
  render() {
1721
1787
  return html`<span
1722
1788
  aria-busy="${this.loading ? "true" : "false"}"
@@ -1726,6 +1792,7 @@ var SpectreBadgeElement = class extends SpectreProjectableElement {
1726
1792
  class="${this.badgeClasses}"
1727
1793
  data-sp-badge-native
1728
1794
  id="${ifDefined(this.id || void 0)}"
1795
+ role="${ifDefined(this.hasForwardedLabel ? "group" : void 0)}"
1729
1796
  title="${ifDefined(this.title || void 0)}"
1730
1797
  >
1731
1798
  ${this.hasProjectedContent ? this.projectedContent : nothing}
@@ -1809,9 +1876,6 @@ var SpectreCardElement = class extends SpectreProjectableElement {
1809
1876
  variant: this.variant
1810
1877
  });
1811
1878
  }
1812
- get isDisabled() {
1813
- return (this.disabled ?? false) || (this.loading ?? false);
1814
- }
1815
1879
  render() {
1816
1880
  return html`<div
1817
1881
  aria-busy="${this.loading ? "true" : "false"}"
@@ -1821,6 +1885,7 @@ var SpectreCardElement = class extends SpectreProjectableElement {
1821
1885
  class="${this.cardClasses}"
1822
1886
  data-sp-card-native
1823
1887
  id="${ifDefined(this.id || void 0)}"
1888
+ role="${ifDefined(this.hasForwardedLabel ? "group" : void 0)}"
1824
1889
  title="${ifDefined(this.title || void 0)}"
1825
1890
  >
1826
1891
  ${this.hasProjectedContent ? this.projectedContent : nothing}
@@ -1910,9 +1975,6 @@ var SpectreIconBoxElement = class extends SpectreProjectableElement {
1910
1975
  variant: this.variant
1911
1976
  });
1912
1977
  }
1913
- get isDisabled() {
1914
- return (this.disabled ?? false) || (this.loading ?? false);
1915
- }
1916
1978
  render() {
1917
1979
  return html`<div
1918
1980
  aria-busy="${this.loading ? "true" : "false"}"
@@ -1922,6 +1984,7 @@ var SpectreIconBoxElement = class extends SpectreProjectableElement {
1922
1984
  class="${this.iconBoxClasses}"
1923
1985
  data-sp-icon-box-native
1924
1986
  id="${ifDefined(this.id || void 0)}"
1987
+ role="${ifDefined(this.hasForwardedLabel ? "group" : void 0)}"
1925
1988
  title="${ifDefined(this.title || void 0)}"
1926
1989
  >
1927
1990
  ${this.hasProjectedContent ? this.projectedContent : nothing}
@@ -1992,9 +2055,6 @@ var SpectreRatingElement = class extends SpectreBaseElement {
1992
2055
  size: this.size
1993
2056
  });
1994
2057
  }
1995
- get isDisabled() {
1996
- return (this.disabled ?? false) || (this.loading ?? false);
1997
- }
1998
2058
  get effectiveMax() {
1999
2059
  return this.max ?? 5;
2000
2060
  }
@@ -2009,7 +2069,11 @@ var SpectreRatingElement = class extends SpectreBaseElement {
2009
2069
  renderStars() {
2010
2070
  const stars = [];
2011
2071
  for (let i = 1; i <= this.effectiveMax; i++) {
2012
- stars.push(html`<span class="${getRatingStarClasses(i <= this.effectiveValue)}"></span>`);
2072
+ stars.push(
2073
+ html`<span
2074
+ class="${getRatingStarClasses(i <= this.effectiveValue)}"
2075
+ ></span>`
2076
+ );
2013
2077
  }
2014
2078
  return stars;
2015
2079
  }
@@ -2027,7 +2091,10 @@ var SpectreRatingElement = class extends SpectreBaseElement {
2027
2091
  title="${ifDefined(this.title || void 0)}"
2028
2092
  >
2029
2093
  <div class="${getRatingStarsClasses()}">${this.renderStars()}</div>
2030
- ${trimmedLabel ? html`<span class="${getRatingTextClasses({ disabled: this.isDisabled })}">${trimmedLabel}</span>` : nothing}
2094
+ ${trimmedLabel ? html`<span
2095
+ class="${getRatingTextClasses({ disabled: this.isDisabled })}"
2096
+ >${trimmedLabel}</span
2097
+ >` : nothing}
2031
2098
  </div>`;
2032
2099
  }
2033
2100
  };
@@ -2104,9 +2171,6 @@ var SpectreTestimonialElement = class extends SpectreProjectableElement {
2104
2171
  variant: this.variant
2105
2172
  });
2106
2173
  }
2107
- get isDisabled() {
2108
- return (this.disabled ?? false) || (this.loading ?? false);
2109
- }
2110
2174
  render() {
2111
2175
  return html`<div
2112
2176
  aria-busy="${this.loading ? "true" : "false"}"
@@ -2116,6 +2180,7 @@ var SpectreTestimonialElement = class extends SpectreProjectableElement {
2116
2180
  class="${this.testimonialClasses}"
2117
2181
  data-sp-testimonial-native
2118
2182
  id="${ifDefined(this.id || void 0)}"
2183
+ role="${ifDefined(this.hasForwardedLabel ? "group" : void 0)}"
2119
2184
  title="${ifDefined(this.title || void 0)}"
2120
2185
  >
2121
2186
  ${this.hasProjectedContent ? this.projectedContent : nothing}
@@ -2199,9 +2264,6 @@ var SpectreAlertElement = class extends SpectreProjectableElement {
2199
2264
  variant: this.variant
2200
2265
  });
2201
2266
  }
2202
- get isDisabled() {
2203
- return (this.disabled ?? false) || (this.loading ?? false);
2204
- }
2205
2267
  render() {
2206
2268
  return html`<div
2207
2269
  aria-busy="${this.loading ? "true" : "false"}"
@@ -2301,9 +2363,6 @@ var SpectreAvatarElement = class extends SpectreProjectableElement {
2301
2363
  size: this.size
2302
2364
  });
2303
2365
  }
2304
- get isDisabled() {
2305
- return (this.disabled ?? false) || (this.loading ?? false);
2306
- }
2307
2366
  render() {
2308
2367
  return html`<div
2309
2368
  aria-busy="${this.loading ? "true" : "false"}"
@@ -2313,6 +2372,7 @@ var SpectreAvatarElement = class extends SpectreProjectableElement {
2313
2372
  class="${this.avatarClasses}"
2314
2373
  data-sp-avatar-native
2315
2374
  id="${ifDefined(this.id || void 0)}"
2375
+ role="${ifDefined(this.hasForwardedLabel ? "group" : void 0)}"
2316
2376
  title="${ifDefined(this.title || void 0)}"
2317
2377
  >
2318
2378
  ${this.hasProjectedContent ? this.projectedContent : nothing}
@@ -2480,9 +2540,6 @@ var SpectreTagElement = class extends SpectreProjectableElement {
2480
2540
  variant: this.variant
2481
2541
  });
2482
2542
  }
2483
- get isDisabled() {
2484
- return (this.disabled ?? false) || (this.loading ?? false);
2485
- }
2486
2543
  render() {
2487
2544
  return html`<span
2488
2545
  aria-busy="${this.loading ? "true" : "false"}"
@@ -2492,6 +2549,7 @@ var SpectreTagElement = class extends SpectreProjectableElement {
2492
2549
  class="${this.tagClasses}"
2493
2550
  data-sp-tag-native
2494
2551
  id="${ifDefined(this.id || void 0)}"
2552
+ role="${ifDefined(this.hasForwardedLabel ? "group" : void 0)}"
2495
2553
  title="${ifDefined(this.title || void 0)}"
2496
2554
  >
2497
2555
  ${this.hasProjectedContent ? this.projectedContent : nothing}
@@ -2573,9 +2631,6 @@ var SpectrePricingCardElement = class extends SpectreProjectableElement {
2573
2631
  loading: this.loading ?? false
2574
2632
  });
2575
2633
  }
2576
- get isDisabled() {
2577
- return (this.disabled ?? false) || (this.loading ?? false);
2578
- }
2579
2634
  render() {
2580
2635
  return html`<div
2581
2636
  aria-busy="${this.loading ? "true" : "false"}"
@@ -2585,6 +2640,7 @@ var SpectrePricingCardElement = class extends SpectreProjectableElement {
2585
2640
  class="${this.pricingCardClasses}"
2586
2641
  data-sp-pricing-card-native
2587
2642
  id="${ifDefined(this.id || void 0)}"
2643
+ role="${ifDefined(this.hasForwardedLabel ? "group" : void 0)}"
2588
2644
  title="${ifDefined(this.title || void 0)}"
2589
2645
  >
2590
2646
  ${this.hasProjectedContent ? this.projectedContent : nothing}
@@ -2606,6 +2662,1131 @@ function defineSpectrePricingCard(tagName = "sp-pricing-card") {
2606
2662
  customElements.define(tagName, SpectrePricingCardElement);
2607
2663
  return SpectrePricingCardElement;
2608
2664
  }
2665
+ var SpectreContainerElement = class extends SpectreProjectableElement {
2666
+ constructor() {
2667
+ super(...arguments);
2668
+ this.maxWidth = void 0;
2669
+ }
2670
+ get id() {
2671
+ return super.id;
2672
+ }
2673
+ set id(value) {
2674
+ super.id = value;
2675
+ }
2676
+ get title() {
2677
+ return super.title;
2678
+ }
2679
+ set title(value) {
2680
+ super.title = value;
2681
+ }
2682
+ getContentContainer() {
2683
+ return this.querySelector("[data-sp-container-native]");
2684
+ }
2685
+ isInternalNode(node) {
2686
+ if (node.nodeType !== Node.ELEMENT_NODE) {
2687
+ return false;
2688
+ }
2689
+ const el = node;
2690
+ return el.hasAttribute("data-sp-container-native");
2691
+ }
2692
+ willUpdate(changedProperties) {
2693
+ if (changedProperties.has("maxWidth") && this.maxWidth != null && !isContainerMaxWidth(this.maxWidth)) {
2694
+ this.maxWidth = void 0;
2695
+ }
2696
+ }
2697
+ get containerClasses() {
2698
+ return getContainerClasses(
2699
+ this.maxWidth != null ? { maxWidth: this.maxWidth } : {}
2700
+ );
2701
+ }
2702
+ render() {
2703
+ return html`<div
2704
+ aria-describedby="${ifDefined(this.forwardedAriaDescribedBy)}"
2705
+ aria-label="${ifDefined(this.forwardedAriaLabel)}"
2706
+ aria-labelledby="${ifDefined(this.forwardedAriaLabelledBy)}"
2707
+ class="${this.containerClasses}"
2708
+ data-sp-container-native
2709
+ id="${ifDefined(this.id || void 0)}"
2710
+ title="${ifDefined(this.title || void 0)}"
2711
+ >
2712
+ ${this.hasProjectedContent ? this.projectedContent : nothing}
2713
+ </div>`;
2714
+ }
2715
+ };
2716
+ SpectreContainerElement.properties = {
2717
+ maxWidth: { attribute: "max-width", type: String, reflect: true }
2718
+ };
2719
+ function defineSpectreContainer(tagName = "sp-container") {
2720
+ const existingElement = customElements.get(tagName);
2721
+ if (existingElement) {
2722
+ return existingElement;
2723
+ }
2724
+ customElements.define(tagName, SpectreContainerElement);
2725
+ return SpectreContainerElement;
2726
+ }
2727
+ var SpectreGridElement = class extends SpectreProjectableElement {
2728
+ constructor() {
2729
+ super(...arguments);
2730
+ this.columns = 1;
2731
+ this.gap = "md";
2732
+ }
2733
+ get id() {
2734
+ return super.id;
2735
+ }
2736
+ set id(value) {
2737
+ super.id = value;
2738
+ }
2739
+ get title() {
2740
+ return super.title;
2741
+ }
2742
+ set title(value) {
2743
+ super.title = value;
2744
+ }
2745
+ getContentContainer() {
2746
+ return this.querySelector("[data-sp-grid-native]");
2747
+ }
2748
+ isInternalNode(node) {
2749
+ if (node.nodeType !== Node.ELEMENT_NODE) {
2750
+ return false;
2751
+ }
2752
+ const el = node;
2753
+ return el.hasAttribute("data-sp-grid-native");
2754
+ }
2755
+ willUpdate(changedProperties) {
2756
+ if (changedProperties.has("columns")) {
2757
+ const normalized = normalizeInt(this.columns, void 0, 1);
2758
+ this.columns = normalized != null && isGridColumns(normalized) ? normalized : 1;
2759
+ }
2760
+ if (changedProperties.has("gap") && (this.gap == null || !isGridGap(this.gap))) {
2761
+ this.gap = "md";
2762
+ }
2763
+ }
2764
+ get gridClasses() {
2765
+ return getGridClasses({
2766
+ columns: this.columns,
2767
+ gap: this.gap
2768
+ });
2769
+ }
2770
+ render() {
2771
+ return html`<div
2772
+ aria-describedby="${ifDefined(this.forwardedAriaDescribedBy)}"
2773
+ aria-label="${ifDefined(this.forwardedAriaLabel)}"
2774
+ aria-labelledby="${ifDefined(this.forwardedAriaLabelledBy)}"
2775
+ class="${this.gridClasses}"
2776
+ data-sp-grid-native
2777
+ id="${ifDefined(this.id || void 0)}"
2778
+ title="${ifDefined(this.title || void 0)}"
2779
+ >
2780
+ ${this.hasProjectedContent ? this.projectedContent : nothing}
2781
+ </div>`;
2782
+ }
2783
+ };
2784
+ SpectreGridElement.properties = {
2785
+ columns: { type: Number, reflect: true },
2786
+ gap: { type: String, reflect: true }
2787
+ };
2788
+ function defineSpectreGrid(tagName = "sp-grid") {
2789
+ const existingElement = customElements.get(tagName);
2790
+ if (existingElement) {
2791
+ return existingElement;
2792
+ }
2793
+ customElements.define(tagName, SpectreGridElement);
2794
+ return SpectreGridElement;
2795
+ }
2796
+ var SpectreSectionElement = class extends SpectreProjectableElement {
2797
+ get id() {
2798
+ return super.id;
2799
+ }
2800
+ set id(value) {
2801
+ super.id = value;
2802
+ }
2803
+ get title() {
2804
+ return super.title;
2805
+ }
2806
+ set title(value) {
2807
+ super.title = value;
2808
+ }
2809
+ getContentContainer() {
2810
+ return this.querySelector("[data-sp-section-native]");
2811
+ }
2812
+ isInternalNode(node) {
2813
+ if (node.nodeType !== Node.ELEMENT_NODE) {
2814
+ return false;
2815
+ }
2816
+ const el = node;
2817
+ return el.hasAttribute("data-sp-section-native");
2818
+ }
2819
+ get sectionClasses() {
2820
+ return getSectionClasses({});
2821
+ }
2822
+ render() {
2823
+ return html`<section
2824
+ aria-describedby="${ifDefined(this.forwardedAriaDescribedBy)}"
2825
+ aria-label="${ifDefined(this.forwardedAriaLabel)}"
2826
+ aria-labelledby="${ifDefined(this.forwardedAriaLabelledBy)}"
2827
+ class="${this.sectionClasses}"
2828
+ data-sp-section-native
2829
+ id="${ifDefined(this.id || void 0)}"
2830
+ title="${ifDefined(this.title || void 0)}"
2831
+ >
2832
+ ${this.hasProjectedContent ? this.projectedContent : nothing}
2833
+ </section>`;
2834
+ }
2835
+ };
2836
+ function defineSpectreSection(tagName = "sp-section") {
2837
+ const existingElement = customElements.get(tagName);
2838
+ if (existingElement) {
2839
+ return existingElement;
2840
+ }
2841
+ customElements.define(tagName, SpectreSectionElement);
2842
+ return SpectreSectionElement;
2843
+ }
2844
+ var SpectreStackElement = class extends SpectreProjectableElement {
2845
+ constructor() {
2846
+ super(...arguments);
2847
+ this.align = "center";
2848
+ this.basis = void 0;
2849
+ this.direction = "vertical";
2850
+ }
2851
+ get id() {
2852
+ return super.id;
2853
+ }
2854
+ set id(value) {
2855
+ super.id = value;
2856
+ }
2857
+ get title() {
2858
+ return super.title;
2859
+ }
2860
+ set title(value) {
2861
+ super.title = value;
2862
+ }
2863
+ getContentContainer() {
2864
+ return this.querySelector("[data-sp-stack-native]");
2865
+ }
2866
+ isInternalNode(node) {
2867
+ if (node.nodeType !== Node.ELEMENT_NODE) {
2868
+ return false;
2869
+ }
2870
+ const el = node;
2871
+ return el.hasAttribute("data-sp-stack-native");
2872
+ }
2873
+ willUpdate(changedProperties) {
2874
+ if (changedProperties.has("direction") && (this.direction == null || !isStackDirection(this.direction))) {
2875
+ this.direction = "vertical";
2876
+ }
2877
+ if (changedProperties.has("basis") && this.basis != null && !isStackBasis(this.basis)) {
2878
+ this.basis = void 0;
2879
+ }
2880
+ if (changedProperties.has("align") && (this.align == null || !isStackAlign(this.align))) {
2881
+ this.align = "center";
2882
+ }
2883
+ }
2884
+ get stackClasses() {
2885
+ return getStackClasses({
2886
+ align: this.align,
2887
+ direction: this.direction,
2888
+ ...this.basis != null ? { basis: this.basis } : {}
2889
+ });
2890
+ }
2891
+ render() {
2892
+ return html`<div
2893
+ aria-describedby="${ifDefined(this.forwardedAriaDescribedBy)}"
2894
+ aria-label="${ifDefined(this.forwardedAriaLabel)}"
2895
+ aria-labelledby="${ifDefined(this.forwardedAriaLabelledBy)}"
2896
+ class="${this.stackClasses}"
2897
+ data-sp-stack-native
2898
+ id="${ifDefined(this.id || void 0)}"
2899
+ title="${ifDefined(this.title || void 0)}"
2900
+ >
2901
+ ${this.hasProjectedContent ? this.projectedContent : nothing}
2902
+ </div>`;
2903
+ }
2904
+ };
2905
+ SpectreStackElement.properties = {
2906
+ align: { type: String, reflect: true },
2907
+ basis: { type: String, reflect: true },
2908
+ direction: { type: String, reflect: true }
2909
+ };
2910
+ function defineSpectreStack(tagName = "sp-stack") {
2911
+ const existingElement = customElements.get(tagName);
2912
+ if (existingElement) {
2913
+ return existingElement;
2914
+ }
2915
+ customElements.define(tagName, SpectreStackElement);
2916
+ return SpectreStackElement;
2917
+ }
2918
+ var SpectreDropdownElement = class extends SpectreBaseElement {
2919
+ constructor() {
2920
+ super(...arguments);
2921
+ this.fullWidth = false;
2922
+ this.open = false;
2923
+ this.placement = "bottom-start";
2924
+ this.triggerLabel = "Toggle menu";
2925
+ this.triggerContent = [];
2926
+ this.menuContent = [];
2927
+ this.handleDocumentClick = (event) => {
2928
+ if (!this.open) {
2929
+ return;
2930
+ }
2931
+ if (!event.composedPath().includes(this)) {
2932
+ this.close();
2933
+ }
2934
+ };
2935
+ this.handleDocumentKeydown = (event) => {
2936
+ if (event.key === "Escape" && this.open) {
2937
+ this.close();
2938
+ this.triggerElement?.focus();
2939
+ }
2940
+ };
2941
+ }
2942
+ get id() {
2943
+ return super.id;
2944
+ }
2945
+ set id(value) {
2946
+ super.id = value;
2947
+ }
2948
+ get title() {
2949
+ return super.title;
2950
+ }
2951
+ set title(value) {
2952
+ super.title = value;
2953
+ }
2954
+ isInternalNode(node) {
2955
+ if (node.nodeType !== Node.ELEMENT_NODE) {
2956
+ return false;
2957
+ }
2958
+ const el = node;
2959
+ return el.hasAttribute("data-sp-dropdown-menu") || el.hasAttribute("data-sp-dropdown-trigger");
2960
+ }
2961
+ syncProjectedContent() {
2962
+ const nextTriggerContent = [];
2963
+ const nextMenuContent = [];
2964
+ this.childNodes.forEach((node) => {
2965
+ if (this.isInternalNode(node)) {
2966
+ return;
2967
+ }
2968
+ const isTriggerSlot = node.nodeType === Node.ELEMENT_NODE && node.getAttribute("slot") === "trigger";
2969
+ if (isTriggerSlot) {
2970
+ nextTriggerContent.push(node);
2971
+ } else {
2972
+ nextMenuContent.push(node);
2973
+ }
2974
+ });
2975
+ const changed = nextTriggerContent.length !== this.triggerContent.length || nextTriggerContent.some((n, i) => n !== this.triggerContent[i]) || nextMenuContent.length !== this.menuContent.length || nextMenuContent.some((n, i) => n !== this.menuContent[i]);
2976
+ if (changed) {
2977
+ this.triggerContent = nextTriggerContent;
2978
+ this.menuContent = nextMenuContent;
2979
+ }
2980
+ return changed;
2981
+ }
2982
+ get hasTriggerContent() {
2983
+ return hasMeaningfulContent(this.triggerContent);
2984
+ }
2985
+ get hasMenuContent() {
2986
+ return hasMeaningfulContent(this.menuContent);
2987
+ }
2988
+ connectedCallback() {
2989
+ super.connectedCallback();
2990
+ this.syncProjectedContent();
2991
+ this.startContentObserver();
2992
+ document.addEventListener("click", this.handleDocumentClick);
2993
+ document.addEventListener("keydown", this.handleDocumentKeydown);
2994
+ }
2995
+ disconnectedCallback() {
2996
+ this.stopContentObserver();
2997
+ document.removeEventListener("click", this.handleDocumentClick);
2998
+ document.removeEventListener("keydown", this.handleDocumentKeydown);
2999
+ super.disconnectedCallback();
3000
+ }
3001
+ update(changedProperties) {
3002
+ this.stopContentObserver();
3003
+ super.update(changedProperties);
3004
+ this.startContentObserver();
3005
+ }
3006
+ startContentObserver() {
3007
+ if (this.contentObserver) {
3008
+ return;
3009
+ }
3010
+ this.contentObserver = new MutationObserver(() => {
3011
+ if (this.syncProjectedContent()) {
3012
+ this.requestUpdate();
3013
+ }
3014
+ });
3015
+ this.contentObserver.observe(this, { childList: true });
3016
+ }
3017
+ stopContentObserver() {
3018
+ this.contentObserver?.disconnect();
3019
+ this.contentObserver = void 0;
3020
+ }
3021
+ willUpdate(changedProperties) {
3022
+ if (changedProperties.has("fullWidth") && this.fullWidth == null) {
3023
+ this.fullWidth = false;
3024
+ }
3025
+ if (changedProperties.has("open") && this.open == null) {
3026
+ this.open = false;
3027
+ }
3028
+ if (changedProperties.has("placement") && (this.placement == null || !isDropdownPlacement(this.placement))) {
3029
+ this.placement = "bottom-start";
3030
+ }
3031
+ if (changedProperties.has("triggerLabel") && !this.triggerLabel) {
3032
+ this.triggerLabel = "Toggle menu";
3033
+ }
3034
+ }
3035
+ get triggerElement() {
3036
+ return this.querySelector("[data-sp-dropdown-trigger]");
3037
+ }
3038
+ toggle() {
3039
+ if (this.open) {
3040
+ this.close();
3041
+ } else {
3042
+ this.openMenu();
3043
+ }
3044
+ }
3045
+ openMenu() {
3046
+ if (this.open) {
3047
+ return;
3048
+ }
3049
+ this.open = true;
3050
+ this.dispatchEvent(new CustomEvent("sp-open", { bubbles: true }));
3051
+ }
3052
+ close() {
3053
+ if (!this.open) {
3054
+ return;
3055
+ }
3056
+ this.open = false;
3057
+ this.dispatchEvent(new CustomEvent("sp-close", { bubbles: true }));
3058
+ }
3059
+ get dropdownClasses() {
3060
+ return getDropdownClasses({ fullWidth: this.fullWidth ?? false });
3061
+ }
3062
+ get menuClasses() {
3063
+ return getDropdownMenuClasses({
3064
+ open: this.open ?? false,
3065
+ placement: this.placement
3066
+ });
3067
+ }
3068
+ render() {
3069
+ return html`<div
3070
+ class="${this.dropdownClasses}"
3071
+ id="${ifDefined(this.id || void 0)}"
3072
+ title="${ifDefined(this.title || void 0)}"
3073
+ >
3074
+ <button
3075
+ aria-expanded="${this.open ? "true" : "false"}"
3076
+ aria-haspopup="true"
3077
+ aria-label="${ifDefined(this.forwardedAriaLabel ?? this.triggerLabel)}"
3078
+ class="sp-dropdown__trigger"
3079
+ data-sp-dropdown-trigger
3080
+ type="button"
3081
+ @click="${() => this.toggle()}"
3082
+ >
3083
+ ${this.hasTriggerContent ? this.triggerContent : this.triggerLabel}
3084
+ </button>
3085
+ <div class="${this.menuClasses}" data-sp-dropdown-menu>
3086
+ ${this.hasMenuContent ? this.menuContent : nothing}
3087
+ </div>
3088
+ </div>`;
3089
+ }
3090
+ };
3091
+ SpectreDropdownElement.properties = {
3092
+ fullWidth: { attribute: "full-width", type: Boolean, reflect: true },
3093
+ open: { type: Boolean, reflect: true },
3094
+ placement: { type: String, reflect: true },
3095
+ triggerLabel: { attribute: "trigger-label", type: String }
3096
+ };
3097
+ function defineSpectreDropdown(tagName = "sp-dropdown") {
3098
+ const existingElement = customElements.get(tagName);
3099
+ if (existingElement) {
3100
+ return existingElement;
3101
+ }
3102
+ customElements.define(tagName, SpectreDropdownElement);
3103
+ return SpectreDropdownElement;
3104
+ }
3105
+ var FOCUSABLE_SELECTOR = [
3106
+ "a[href]",
3107
+ "button:not([disabled])",
3108
+ "input:not([disabled])",
3109
+ "select:not([disabled])",
3110
+ "textarea:not([disabled])",
3111
+ '[tabindex]:not([tabindex="-1"])'
3112
+ ].join(",");
3113
+ var SpectreModalElement = class extends SpectreProjectableElement {
3114
+ constructor() {
3115
+ super(...arguments);
3116
+ this.fullWidth = false;
3117
+ this.open = false;
3118
+ this.previouslyFocusedElement = null;
3119
+ this.handleDocumentKeydown = (event) => {
3120
+ if (!this.open) {
3121
+ return;
3122
+ }
3123
+ if (event.key === "Escape") {
3124
+ this.close();
3125
+ return;
3126
+ }
3127
+ if (event.key === "Tab") {
3128
+ this.trapFocus(event);
3129
+ }
3130
+ };
3131
+ }
3132
+ get id() {
3133
+ return super.id;
3134
+ }
3135
+ set id(value) {
3136
+ super.id = value;
3137
+ }
3138
+ get title() {
3139
+ return super.title;
3140
+ }
3141
+ set title(value) {
3142
+ super.title = value;
3143
+ }
3144
+ getContentContainer() {
3145
+ return this.querySelector("[data-sp-modal-native]");
3146
+ }
3147
+ isInternalNode(node) {
3148
+ if (node.nodeType !== Node.ELEMENT_NODE) {
3149
+ return false;
3150
+ }
3151
+ const el = node;
3152
+ return el.hasAttribute("data-sp-modal-native") || el.hasAttribute("data-sp-modal-overlay");
3153
+ }
3154
+ willUpdate(changedProperties) {
3155
+ if (changedProperties.has("fullWidth") && this.fullWidth == null) {
3156
+ this.fullWidth = false;
3157
+ }
3158
+ if (changedProperties.has("open") && this.open == null) {
3159
+ this.open = false;
3160
+ }
3161
+ }
3162
+ updated(changedProperties) {
3163
+ super.updated(changedProperties);
3164
+ if (!changedProperties.has("open")) {
3165
+ return;
3166
+ }
3167
+ if (this.open) {
3168
+ this.previouslyFocusedElement = document.activeElement;
3169
+ this.focusFirstElement();
3170
+ } else if (this.previouslyFocusedElement) {
3171
+ this.previouslyFocusedElement.focus();
3172
+ this.previouslyFocusedElement = null;
3173
+ }
3174
+ }
3175
+ connectedCallback() {
3176
+ super.connectedCallback();
3177
+ document.addEventListener("keydown", this.handleDocumentKeydown);
3178
+ }
3179
+ disconnectedCallback() {
3180
+ document.removeEventListener("keydown", this.handleDocumentKeydown);
3181
+ super.disconnectedCallback();
3182
+ }
3183
+ get modalElement() {
3184
+ return this.querySelector("[data-sp-modal-native]");
3185
+ }
3186
+ get focusableElements() {
3187
+ const modal = this.modalElement;
3188
+ if (!modal) {
3189
+ return [];
3190
+ }
3191
+ return Array.from(modal.querySelectorAll(FOCUSABLE_SELECTOR));
3192
+ }
3193
+ focusFirstElement() {
3194
+ const [first] = this.focusableElements;
3195
+ (first ?? this.modalElement)?.focus();
3196
+ }
3197
+ trapFocus(event) {
3198
+ const focusable = this.focusableElements;
3199
+ if (focusable.length === 0) {
3200
+ event.preventDefault();
3201
+ return;
3202
+ }
3203
+ const first = focusable[0];
3204
+ const last = focusable[focusable.length - 1];
3205
+ const active = document.activeElement;
3206
+ if (event.shiftKey && active === first) {
3207
+ event.preventDefault();
3208
+ last?.focus();
3209
+ } else if (!event.shiftKey && active === last) {
3210
+ event.preventDefault();
3211
+ first?.focus();
3212
+ }
3213
+ }
3214
+ close() {
3215
+ if (!this.open) {
3216
+ return;
3217
+ }
3218
+ this.open = false;
3219
+ this.dispatchEvent(new CustomEvent("sp-close", { bubbles: true }));
3220
+ }
3221
+ get overlayClasses() {
3222
+ return getModalOverlayClasses({ open: this.open ?? false });
3223
+ }
3224
+ get modalClasses() {
3225
+ return getModalClasses({
3226
+ open: this.open ?? false,
3227
+ fullWidth: this.fullWidth ?? false
3228
+ });
3229
+ }
3230
+ render() {
3231
+ const isHidden = !this.open;
3232
+ return html`<div
3233
+ aria-hidden="${ifDefined(isHidden ? "true" : void 0)}"
3234
+ class="${this.overlayClasses}"
3235
+ data-sp-modal-overlay
3236
+ @click="${(event) => {
3237
+ if (event.target === event.currentTarget) {
3238
+ this.close();
3239
+ }
3240
+ }}"
3241
+ >
3242
+ <div
3243
+ aria-describedby="${ifDefined(this.forwardedAriaDescribedBy)}"
3244
+ aria-hidden="${ifDefined(isHidden ? "true" : void 0)}"
3245
+ aria-label="${ifDefined(this.forwardedAriaLabel)}"
3246
+ aria-labelledby="${ifDefined(this.forwardedAriaLabelledBy)}"
3247
+ aria-modal="true"
3248
+ class="${this.modalClasses}"
3249
+ data-sp-modal-native
3250
+ id="${ifDefined(this.id || void 0)}"
3251
+ role="dialog"
3252
+ tabindex="-1"
3253
+ title="${ifDefined(this.title || void 0)}"
3254
+ >
3255
+ ${this.hasProjectedContent ? this.projectedContent : nothing}
3256
+ </div>
3257
+ </div>`;
3258
+ }
3259
+ };
3260
+ SpectreModalElement.properties = {
3261
+ fullWidth: { attribute: "full-width", type: Boolean, reflect: true },
3262
+ open: { type: Boolean, reflect: true }
3263
+ };
3264
+ function defineSpectreModal(tagName = "sp-modal") {
3265
+ const existingElement = customElements.get(tagName);
3266
+ if (existingElement) {
3267
+ return existingElement;
3268
+ }
3269
+ customElements.define(tagName, SpectreModalElement);
3270
+ return SpectreModalElement;
3271
+ }
3272
+ var SpectreNavElement = class extends SpectreProjectableElement {
3273
+ constructor() {
3274
+ super(...arguments);
3275
+ this.bordered = false;
3276
+ this.fullWidth = false;
3277
+ this.sticky = false;
3278
+ }
3279
+ get id() {
3280
+ return super.id;
3281
+ }
3282
+ set id(value) {
3283
+ super.id = value;
3284
+ }
3285
+ get title() {
3286
+ return super.title;
3287
+ }
3288
+ set title(value) {
3289
+ super.title = value;
3290
+ }
3291
+ getContentContainer() {
3292
+ return this.querySelector("[data-sp-nav-native]");
3293
+ }
3294
+ isInternalNode(node) {
3295
+ if (node.nodeType !== Node.ELEMENT_NODE) {
3296
+ return false;
3297
+ }
3298
+ const el = node;
3299
+ return el.hasAttribute("data-sp-nav-native");
3300
+ }
3301
+ willUpdate(changedProperties) {
3302
+ if (changedProperties.has("bordered") && this.bordered == null) {
3303
+ this.bordered = false;
3304
+ }
3305
+ if (changedProperties.has("fullWidth") && this.fullWidth == null) {
3306
+ this.fullWidth = false;
3307
+ }
3308
+ if (changedProperties.has("sticky") && this.sticky == null) {
3309
+ this.sticky = false;
3310
+ }
3311
+ }
3312
+ get navClasses() {
3313
+ return getNavClasses({
3314
+ bordered: this.bordered ?? false,
3315
+ fullWidth: this.fullWidth ?? false,
3316
+ sticky: this.sticky ?? false
3317
+ });
3318
+ }
3319
+ render() {
3320
+ return html`<nav
3321
+ aria-label="${ifDefined(this.forwardedAriaLabel)}"
3322
+ class="${this.navClasses}"
3323
+ data-sp-nav-native
3324
+ id="${ifDefined(this.id || void 0)}"
3325
+ title="${ifDefined(this.title || void 0)}"
3326
+ >
3327
+ ${this.hasProjectedContent ? this.projectedContent : nothing}
3328
+ </nav>`;
3329
+ }
3330
+ };
3331
+ SpectreNavElement.properties = {
3332
+ bordered: { type: Boolean, reflect: true },
3333
+ fullWidth: { attribute: "full-width", type: Boolean, reflect: true },
3334
+ sticky: { type: Boolean, reflect: true }
3335
+ };
3336
+ function defineSpectreNav(tagName = "sp-nav") {
3337
+ const existingElement = customElements.get(tagName);
3338
+ if (existingElement) {
3339
+ return existingElement;
3340
+ }
3341
+ customElements.define(tagName, SpectreNavElement);
3342
+ return SpectreNavElement;
3343
+ }
3344
+ var SpectreSidebarElement = class extends SpectreProjectableElement {
3345
+ constructor() {
3346
+ super(...arguments);
3347
+ this.bordered = false;
3348
+ this.open = false;
3349
+ this.toggleLabel = "Toggle sidebar";
3350
+ this.handleDocumentKeydown = (event) => {
3351
+ if (event.key === "Escape" && this.open) {
3352
+ this.close();
3353
+ }
3354
+ };
3355
+ }
3356
+ get id() {
3357
+ return super.id;
3358
+ }
3359
+ set id(value) {
3360
+ super.id = value;
3361
+ }
3362
+ get title() {
3363
+ return super.title;
3364
+ }
3365
+ set title(value) {
3366
+ super.title = value;
3367
+ }
3368
+ getContentContainer() {
3369
+ return this.querySelector("[data-sp-sidebar-native]");
3370
+ }
3371
+ isInternalNode(node) {
3372
+ if (node.nodeType !== Node.ELEMENT_NODE) {
3373
+ return false;
3374
+ }
3375
+ const el = node;
3376
+ return el.hasAttribute("data-sp-sidebar-native") || el.hasAttribute("data-sp-sidebar-toggle") || el.hasAttribute("data-sp-sidebar-backdrop");
3377
+ }
3378
+ willUpdate(changedProperties) {
3379
+ if (changedProperties.has("bordered") && this.bordered == null) {
3380
+ this.bordered = false;
3381
+ }
3382
+ if (changedProperties.has("open") && this.open == null) {
3383
+ this.open = false;
3384
+ }
3385
+ if (changedProperties.has("toggleLabel") && !this.toggleLabel) {
3386
+ this.toggleLabel = "Toggle sidebar";
3387
+ }
3388
+ if (changedProperties.has("open")) {
3389
+ HTMLElement.prototype.setAttribute.call(
3390
+ this,
3391
+ "data-sidebar-open",
3392
+ this.open ? "true" : "false"
3393
+ );
3394
+ }
3395
+ }
3396
+ connectedCallback() {
3397
+ super.connectedCallback();
3398
+ HTMLElement.prototype.setAttribute.call(
3399
+ this,
3400
+ "data-sidebar-open",
3401
+ this.open ? "true" : "false"
3402
+ );
3403
+ document.addEventListener("keydown", this.handleDocumentKeydown);
3404
+ }
3405
+ disconnectedCallback() {
3406
+ document.removeEventListener("keydown", this.handleDocumentKeydown);
3407
+ super.disconnectedCallback();
3408
+ }
3409
+ toggle() {
3410
+ if (this.open) {
3411
+ this.close();
3412
+ } else {
3413
+ this.openSidebar();
3414
+ }
3415
+ }
3416
+ openSidebar() {
3417
+ if (this.open) {
3418
+ return;
3419
+ }
3420
+ this.open = true;
3421
+ this.dispatchEvent(new CustomEvent("sp-open", { bubbles: true }));
3422
+ }
3423
+ close() {
3424
+ if (!this.open) {
3425
+ return;
3426
+ }
3427
+ this.open = false;
3428
+ this.dispatchEvent(new CustomEvent("sp-close", { bubbles: true }));
3429
+ }
3430
+ get sidebarClasses() {
3431
+ return getSidebarClasses({ bordered: this.bordered ?? false });
3432
+ }
3433
+ render() {
3434
+ return html`<button
3435
+ aria-expanded="${this.open ? "true" : "false"}"
3436
+ aria-label="${ifDefined(this.toggleLabel)}"
3437
+ class="${getSidebarToggleClasses()}"
3438
+ data-sp-sidebar-toggle
3439
+ type="button"
3440
+ @click="${() => this.toggle()}"
3441
+ >
3442
+ &#9776;
3443
+ </button>
3444
+ <div
3445
+ class="${getSidebarBackdropClasses()}"
3446
+ data-sp-sidebar-backdrop
3447
+ @click="${() => this.close()}"
3448
+ ></div>
3449
+ <aside
3450
+ aria-label="${ifDefined(this.forwardedAriaLabel)}"
3451
+ class="${this.sidebarClasses}"
3452
+ data-sp-sidebar-native
3453
+ id="${ifDefined(this.id || void 0)}"
3454
+ title="${ifDefined(this.title || void 0)}"
3455
+ >
3456
+ ${this.hasProjectedContent ? this.projectedContent : nothing}
3457
+ </aside>`;
3458
+ }
3459
+ };
3460
+ SpectreSidebarElement.properties = {
3461
+ bordered: { type: Boolean, reflect: true },
3462
+ open: { type: Boolean, reflect: false },
3463
+ toggleLabel: { attribute: "toggle-label", type: String }
3464
+ };
3465
+ function defineSpectreSidebar(tagName = "sp-sidebar") {
3466
+ const existingElement = customElements.get(tagName);
3467
+ if (existingElement) {
3468
+ return existingElement;
3469
+ }
3470
+ customElements.define(tagName, SpectreSidebarElement);
3471
+ return SpectreSidebarElement;
3472
+ }
3473
+ var SpectreToastElement = class extends SpectreBaseElement {
3474
+ constructor() {
3475
+ super(...arguments);
3476
+ this.dismissed = false;
3477
+ this.fullWidth = false;
3478
+ this.variant = "info";
3479
+ this.iconContent = [];
3480
+ this.bodyContent = [];
3481
+ }
3482
+ get id() {
3483
+ return super.id;
3484
+ }
3485
+ set id(value) {
3486
+ super.id = value;
3487
+ }
3488
+ get title() {
3489
+ return super.title;
3490
+ }
3491
+ set title(value) {
3492
+ super.title = value;
3493
+ }
3494
+ isInternalNode(node) {
3495
+ if (node.nodeType !== Node.ELEMENT_NODE) {
3496
+ return false;
3497
+ }
3498
+ const el = node;
3499
+ return el.hasAttribute("data-sp-toast-native") || el.hasAttribute("data-sp-toast-icon");
3500
+ }
3501
+ syncProjectedContent() {
3502
+ const nextIconContent = [];
3503
+ const nextBodyContent = [];
3504
+ this.childNodes.forEach((node) => {
3505
+ if (this.isInternalNode(node)) {
3506
+ return;
3507
+ }
3508
+ const isIconSlot = node.nodeType === Node.ELEMENT_NODE && node.getAttribute("slot") === "icon";
3509
+ if (isIconSlot) {
3510
+ nextIconContent.push(node);
3511
+ } else {
3512
+ nextBodyContent.push(node);
3513
+ }
3514
+ });
3515
+ const changed = nextIconContent.length !== this.iconContent.length || nextIconContent.some((n, i) => n !== this.iconContent[i]) || nextBodyContent.length !== this.bodyContent.length || nextBodyContent.some((n, i) => n !== this.bodyContent[i]);
3516
+ if (changed) {
3517
+ this.iconContent = nextIconContent;
3518
+ this.bodyContent = nextBodyContent;
3519
+ }
3520
+ return changed;
3521
+ }
3522
+ get hasIconContent() {
3523
+ return hasMeaningfulContent(this.iconContent);
3524
+ }
3525
+ get hasBodyContent() {
3526
+ return hasMeaningfulContent(this.bodyContent);
3527
+ }
3528
+ connectedCallback() {
3529
+ super.connectedCallback();
3530
+ this.syncProjectedContent();
3531
+ this.startContentObserver();
3532
+ }
3533
+ disconnectedCallback() {
3534
+ this.stopContentObserver();
3535
+ this.clearAutoDismissTimer();
3536
+ super.disconnectedCallback();
3537
+ }
3538
+ update(changedProperties) {
3539
+ this.stopContentObserver();
3540
+ super.update(changedProperties);
3541
+ this.startContentObserver();
3542
+ }
3543
+ startContentObserver() {
3544
+ if (this.contentObserver) {
3545
+ return;
3546
+ }
3547
+ this.contentObserver = new MutationObserver(() => {
3548
+ if (this.syncProjectedContent()) {
3549
+ this.requestUpdate();
3550
+ }
3551
+ });
3552
+ this.contentObserver.observe(this, { childList: true });
3553
+ }
3554
+ stopContentObserver() {
3555
+ this.contentObserver?.disconnect();
3556
+ this.contentObserver = void 0;
3557
+ }
3558
+ willUpdate(changedProperties) {
3559
+ if (changedProperties.has("dismissed") && this.dismissed == null) {
3560
+ this.dismissed = false;
3561
+ }
3562
+ if (changedProperties.has("fullWidth") && this.fullWidth == null) {
3563
+ this.fullWidth = false;
3564
+ }
3565
+ if (changedProperties.has("variant") && (this.variant == null || !isToastVariant(this.variant))) {
3566
+ this.variant = "info";
3567
+ }
3568
+ if (changedProperties.has("autoDismiss")) {
3569
+ this.autoDismiss = normalizeInt(this.autoDismiss, void 0, 0);
3570
+ }
3571
+ }
3572
+ updated(changedProperties) {
3573
+ super.updated(changedProperties);
3574
+ if (changedProperties.has("dismissed") || changedProperties.has("autoDismiss")) {
3575
+ this.clearAutoDismissTimer();
3576
+ if (!this.dismissed && this.autoDismiss) {
3577
+ this.autoDismissTimer = setTimeout(() => {
3578
+ this.dismiss();
3579
+ }, this.autoDismiss);
3580
+ }
3581
+ }
3582
+ }
3583
+ clearAutoDismissTimer() {
3584
+ if (this.autoDismissTimer) {
3585
+ clearTimeout(this.autoDismissTimer);
3586
+ this.autoDismissTimer = void 0;
3587
+ }
3588
+ }
3589
+ show() {
3590
+ if (!this.dismissed) {
3591
+ return;
3592
+ }
3593
+ this.dismissed = false;
3594
+ this.dispatchEvent(new CustomEvent("sp-show", { bubbles: true }));
3595
+ }
3596
+ dismiss() {
3597
+ if (this.dismissed) {
3598
+ return;
3599
+ }
3600
+ this.dismissed = true;
3601
+ this.dispatchEvent(new CustomEvent("sp-dismiss", { bubbles: true }));
3602
+ }
3603
+ get toastClasses() {
3604
+ return getToastClasses({
3605
+ variant: this.variant,
3606
+ dismissed: this.dismissed ?? false,
3607
+ fullWidth: this.fullWidth ?? false
3608
+ });
3609
+ }
3610
+ get iconClasses() {
3611
+ return getToastIconClasses({ variant: this.variant });
3612
+ }
3613
+ render() {
3614
+ return html`<div
3615
+ aria-atomic="true"
3616
+ aria-label="${ifDefined(this.forwardedAriaLabel)}"
3617
+ aria-live="polite"
3618
+ class="${this.toastClasses}"
3619
+ data-sp-toast-native
3620
+ id="${ifDefined(this.id || void 0)}"
3621
+ role="status"
3622
+ title="${ifDefined(this.title || void 0)}"
3623
+ >
3624
+ ${this.hasIconContent ? html`<div class="${this.iconClasses}" data-sp-toast-icon>
3625
+ ${this.iconContent}
3626
+ </div>` : nothing}
3627
+ ${this.hasBodyContent ? this.bodyContent : nothing}
3628
+ </div>`;
3629
+ }
3630
+ };
3631
+ SpectreToastElement.properties = {
3632
+ autoDismiss: { attribute: "auto-dismiss", type: Number },
3633
+ dismissed: { type: Boolean, reflect: true },
3634
+ fullWidth: { attribute: "full-width", type: Boolean, reflect: true },
3635
+ variant: { type: String, reflect: true }
3636
+ };
3637
+ function defineSpectreToast(tagName = "sp-toast") {
3638
+ const existingElement = customElements.get(tagName);
3639
+ if (existingElement) {
3640
+ return existingElement;
3641
+ }
3642
+ customElements.define(tagName, SpectreToastElement);
3643
+ return SpectreToastElement;
3644
+ }
3645
+ var SpectreTooltipElement = class extends SpectreBaseElement {
3646
+ constructor() {
3647
+ super(...arguments);
3648
+ this.placement = "top";
3649
+ this.visible = false;
3650
+ this.triggerContent = [];
3651
+ this.tooltipContent = [];
3652
+ }
3653
+ get id() {
3654
+ return super.id;
3655
+ }
3656
+ set id(value) {
3657
+ super.id = value;
3658
+ }
3659
+ get title() {
3660
+ return super.title;
3661
+ }
3662
+ set title(value) {
3663
+ super.title = value;
3664
+ }
3665
+ isInternalNode(node) {
3666
+ if (node.nodeType !== Node.ELEMENT_NODE) {
3667
+ return false;
3668
+ }
3669
+ const el = node;
3670
+ return el.hasAttribute("data-sp-tooltip-native") || el.hasAttribute("data-sp-tooltip-trigger");
3671
+ }
3672
+ syncProjectedContent() {
3673
+ const nextTooltipContent = [];
3674
+ const nextTriggerContent = [];
3675
+ this.childNodes.forEach((node) => {
3676
+ if (this.isInternalNode(node)) {
3677
+ return;
3678
+ }
3679
+ const isTooltipSlot = node.nodeType === Node.ELEMENT_NODE && node.getAttribute("slot") === "tooltip";
3680
+ if (isTooltipSlot) {
3681
+ nextTooltipContent.push(node);
3682
+ } else {
3683
+ nextTriggerContent.push(node);
3684
+ }
3685
+ });
3686
+ const changed = nextTooltipContent.length !== this.tooltipContent.length || nextTooltipContent.some((n, i) => n !== this.tooltipContent[i]) || nextTriggerContent.length !== this.triggerContent.length || nextTriggerContent.some((n, i) => n !== this.triggerContent[i]);
3687
+ if (changed) {
3688
+ this.tooltipContent = nextTooltipContent;
3689
+ this.triggerContent = nextTriggerContent;
3690
+ }
3691
+ return changed;
3692
+ }
3693
+ get hasTooltipContent() {
3694
+ return hasMeaningfulContent(this.tooltipContent);
3695
+ }
3696
+ connectedCallback() {
3697
+ var _a, _b;
3698
+ super.connectedCallback();
3699
+ this.syncProjectedContent();
3700
+ this.startContentObserver();
3701
+ (_a = this.style).position || (_a.position = "relative");
3702
+ (_b = this.style).display || (_b.display = "inline-block");
3703
+ }
3704
+ disconnectedCallback() {
3705
+ this.stopContentObserver();
3706
+ super.disconnectedCallback();
3707
+ }
3708
+ update(changedProperties) {
3709
+ this.stopContentObserver();
3710
+ super.update(changedProperties);
3711
+ this.startContentObserver();
3712
+ }
3713
+ startContentObserver() {
3714
+ if (this.contentObserver) {
3715
+ return;
3716
+ }
3717
+ this.contentObserver = new MutationObserver(() => {
3718
+ if (this.syncProjectedContent()) {
3719
+ this.requestUpdate();
3720
+ }
3721
+ });
3722
+ this.contentObserver.observe(this, { childList: true });
3723
+ }
3724
+ stopContentObserver() {
3725
+ this.contentObserver?.disconnect();
3726
+ this.contentObserver = void 0;
3727
+ }
3728
+ willUpdate(changedProperties) {
3729
+ if (changedProperties.has("placement") && (this.placement == null || !isTooltipPlacement(this.placement))) {
3730
+ this.placement = "top";
3731
+ }
3732
+ if (changedProperties.has("visible") && this.visible == null) {
3733
+ this.visible = false;
3734
+ }
3735
+ }
3736
+ show() {
3737
+ if (this.visible) {
3738
+ return;
3739
+ }
3740
+ this.visible = true;
3741
+ this.dispatchEvent(new CustomEvent("sp-show", { bubbles: true }));
3742
+ }
3743
+ hide() {
3744
+ if (!this.visible) {
3745
+ return;
3746
+ }
3747
+ this.visible = false;
3748
+ this.dispatchEvent(new CustomEvent("sp-hide", { bubbles: true }));
3749
+ }
3750
+ get tooltipClasses() {
3751
+ return getTooltipClasses({
3752
+ placement: this.placement,
3753
+ visible: this.visible ?? false
3754
+ });
3755
+ }
3756
+ render() {
3757
+ return html`<span
3758
+ data-sp-tooltip-trigger
3759
+ @focusin="${() => this.show()}"
3760
+ @focusout="${() => this.hide()}"
3761
+ @mouseenter="${() => this.show()}"
3762
+ @mouseleave="${() => this.hide()}"
3763
+ >
3764
+ ${this.triggerContent}
3765
+ </span>
3766
+ <span
3767
+ aria-label="${ifDefined(this.forwardedAriaLabel)}"
3768
+ class="${this.tooltipClasses}"
3769
+ data-sp-tooltip-native
3770
+ id="${ifDefined(this.id || void 0)}"
3771
+ role="tooltip"
3772
+ title="${ifDefined(this.title || void 0)}"
3773
+ >
3774
+ ${this.hasTooltipContent ? this.tooltipContent : nothing}
3775
+ </span>`;
3776
+ }
3777
+ };
3778
+ SpectreTooltipElement.properties = {
3779
+ placement: { type: String, reflect: true },
3780
+ visible: { type: Boolean, reflect: true }
3781
+ };
3782
+ function defineSpectreTooltip(tagName = "sp-tooltip") {
3783
+ const existingElement = customElements.get(tagName);
3784
+ if (existingElement) {
3785
+ return existingElement;
3786
+ }
3787
+ customElements.define(tagName, SpectreTooltipElement);
3788
+ return SpectreTooltipElement;
3789
+ }
2609
3790
 
2610
3791
  // src/index.ts
2611
3792
  function defineSpectreComponents() {
@@ -2627,8 +3808,18 @@ function defineSpectreComponents() {
2627
3808
  defineSpectreSpinner();
2628
3809
  defineSpectreTag();
2629
3810
  defineSpectrePricingCard();
3811
+ defineSpectreContainer();
3812
+ defineSpectreGrid();
3813
+ defineSpectreSection();
3814
+ defineSpectreStack();
3815
+ defineSpectreDropdown();
3816
+ defineSpectreModal();
3817
+ defineSpectreNav();
3818
+ defineSpectreSidebar();
3819
+ defineSpectreToast();
3820
+ defineSpectreTooltip();
2630
3821
  }
2631
3822
 
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 };
3823
+ export { SpectreAlertElement, SpectreAvatarElement, SpectreBadgeElement, SpectreButtonElement, SpectreCardElement, SpectreCheckboxElement, SpectreContainerElement, SpectreDropdownElement, SpectreFieldsetElement, SpectreGridElement, SpectreIconBoxElement, SpectreInputElement, SpectreLabelElement, SpectreModalElement, SpectreNavElement, SpectrePricingCardElement, SpectreRadioElement, SpectreRatingElement, SpectreSectionElement, SpectreSelectElement, SpectreSidebarElement, SpectreSpinnerElement, SpectreStackElement, SpectreTagElement, SpectreTestimonialElement, SpectreTextareaElement, SpectreToastElement, SpectreTooltipElement, defineSpectreAlert, defineSpectreAvatar, defineSpectreBadge, defineSpectreButton, defineSpectreCard, defineSpectreCheckbox, defineSpectreComponents, defineSpectreContainer, defineSpectreDropdown, defineSpectreFieldset, defineSpectreGrid, defineSpectreIconBox, defineSpectreInput, defineSpectreLabel, defineSpectreModal, defineSpectreNav, defineSpectrePricingCard, defineSpectreRadio, defineSpectreRating, defineSpectreSection, defineSpectreSelect, defineSpectreSidebar, defineSpectreSpinner, defineSpectreStack, defineSpectreTag, defineSpectreTestimonial, defineSpectreTextarea, defineSpectreToast, defineSpectreTooltip, spectreInputSizes as spectreAlertSizes, spectreAlertVariants, spectreAvatarShapes, spectreAvatarSizes, spectreInputSizes as spectreBadgeSizes, spectreBadgeVariants, spectreInputSizes as spectreButtonSizes, spectreButtonTypes, spectreButtonVariants, spectreCardVariants, spectreContainerMaxWidths, spectreDropdownPlacements, spectreGridColumns, spectreGridGaps, spectreInputSizes as spectreIconBoxSizes, spectreIconBoxVariants, spectreInputSizes, spectreInputTypes, spectreInputSizes as spectreRatingSizes, spectreInputSizes as spectreSpinnerSizes, spectreSpinnerVariants, spectreStackAligns, spectreStackBases, spectreStackDirections, spectreInputSizes as spectreTagSizes, spectreTagVariants, spectreTestimonialVariants, spectreToastVariants, spectreTooltipPlacements };
2633
3824
  //# sourceMappingURL=index.js.map
2634
3825
  //# sourceMappingURL=index.js.map