@phcdevworks/spectre-components 1.12.0 → 1.15.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 (138) hide show
  1. package/README.md +240 -138
  2. package/dist/alert.cjs.map +1 -1
  3. package/dist/alert.d.cts +2 -2
  4. package/dist/alert.d.ts +2 -2
  5. package/dist/alert.js.map +1 -1
  6. package/dist/avatar.cjs.map +1 -1
  7. package/dist/avatar.d.cts +2 -2
  8. package/dist/avatar.d.ts +2 -2
  9. package/dist/avatar.js.map +1 -1
  10. package/dist/badge.cjs.map +1 -1
  11. package/dist/badge.d.cts +2 -2
  12. package/dist/badge.d.ts +2 -2
  13. package/dist/badge.js.map +1 -1
  14. package/dist/button.cjs +24 -0
  15. package/dist/button.cjs.map +1 -1
  16. package/dist/button.d.cts +21 -3
  17. package/dist/button.d.ts +21 -3
  18. package/dist/button.js +24 -0
  19. package/dist/button.js.map +1 -1
  20. package/dist/card.cjs.map +1 -1
  21. package/dist/card.d.cts +2 -2
  22. package/dist/card.d.ts +2 -2
  23. package/dist/card.js.map +1 -1
  24. package/dist/container.cjs +17 -1
  25. package/dist/container.cjs.map +1 -1
  26. package/dist/container.d.cts +9 -2
  27. package/dist/container.d.ts +9 -2
  28. package/dist/container.js +17 -1
  29. package/dist/container.js.map +1 -1
  30. package/dist/dropdown.cjs +10 -1
  31. package/dist/dropdown.cjs.map +1 -1
  32. package/dist/dropdown.d.cts +8 -2
  33. package/dist/dropdown.d.ts +8 -2
  34. package/dist/dropdown.js +10 -1
  35. package/dist/dropdown.js.map +1 -1
  36. package/dist/footer.cjs +18 -2
  37. package/dist/footer.cjs.map +1 -1
  38. package/dist/footer.d.cts +7 -0
  39. package/dist/footer.d.ts +7 -0
  40. package/dist/footer.js +18 -2
  41. package/dist/footer.js.map +1 -1
  42. package/dist/{form-JrKDonG4.d.cts → form-BGQjgJrL.d.cts} +10 -1
  43. package/dist/{form-JrKDonG4.d.ts → form-BGQjgJrL.d.ts} +10 -1
  44. package/dist/grid.cjs +53 -3
  45. package/dist/grid.cjs.map +1 -1
  46. package/dist/grid.d.cts +14 -2
  47. package/dist/grid.d.ts +14 -2
  48. package/dist/grid.js +53 -3
  49. package/dist/grid.js.map +1 -1
  50. package/dist/icon-box.cjs.map +1 -1
  51. package/dist/icon-box.d.cts +2 -2
  52. package/dist/icon-box.d.ts +2 -2
  53. package/dist/icon-box.js.map +1 -1
  54. package/dist/index.cjs +298 -22
  55. package/dist/index.cjs.map +1 -1
  56. package/dist/index.d.cts +3 -2
  57. package/dist/index.d.ts +3 -2
  58. package/dist/index.js +298 -24
  59. package/dist/index.js.map +1 -1
  60. package/dist/input.cjs.map +1 -1
  61. package/dist/input.d.cts +2 -2
  62. package/dist/input.d.ts +2 -2
  63. package/dist/input.js.map +1 -1
  64. package/dist/nav-item.cjs +7 -1
  65. package/dist/nav-item.cjs.map +1 -1
  66. package/dist/nav-item.d.cts +7 -1
  67. package/dist/nav-item.d.ts +7 -1
  68. package/dist/nav-item.js +7 -1
  69. package/dist/nav-item.js.map +1 -1
  70. package/dist/nav.cjs +17 -1
  71. package/dist/nav.cjs.map +1 -1
  72. package/dist/nav.d.cts +7 -0
  73. package/dist/nav.d.ts +7 -0
  74. package/dist/nav.js +17 -1
  75. package/dist/nav.js.map +1 -1
  76. package/dist/rating.cjs.map +1 -1
  77. package/dist/rating.d.cts +2 -2
  78. package/dist/rating.d.ts +2 -2
  79. package/dist/rating.js.map +1 -1
  80. package/dist/section.cjs +22 -1
  81. package/dist/section.cjs.map +1 -1
  82. package/dist/section.d.cts +9 -0
  83. package/dist/section.d.ts +9 -0
  84. package/dist/section.js +22 -1
  85. package/dist/section.js.map +1 -1
  86. package/dist/select.cjs.map +1 -1
  87. package/dist/select.d.cts +1 -1
  88. package/dist/select.d.ts +1 -1
  89. package/dist/select.js.map +1 -1
  90. package/dist/sidebar-toggle.cjs +465 -0
  91. package/dist/sidebar-toggle.cjs.map +1 -0
  92. package/dist/sidebar-toggle.d.cts +44 -0
  93. package/dist/sidebar-toggle.d.ts +44 -0
  94. package/dist/sidebar-toggle.js +462 -0
  95. package/dist/sidebar-toggle.js.map +1 -0
  96. package/dist/sidebar.cjs +15 -10
  97. package/dist/sidebar.cjs.map +1 -1
  98. package/dist/sidebar.d.cts +7 -0
  99. package/dist/sidebar.d.ts +7 -0
  100. package/dist/sidebar.js +15 -10
  101. package/dist/sidebar.js.map +1 -1
  102. package/dist/spinner.cjs.map +1 -1
  103. package/dist/spinner.d.cts +2 -2
  104. package/dist/spinner.d.ts +2 -2
  105. package/dist/spinner.js.map +1 -1
  106. package/dist/stack.cjs +18 -2
  107. package/dist/stack.cjs.map +1 -1
  108. package/dist/stack.d.cts +9 -2
  109. package/dist/stack.d.ts +9 -2
  110. package/dist/stack.js +18 -2
  111. package/dist/stack.js.map +1 -1
  112. package/dist/tag.cjs.map +1 -1
  113. package/dist/tag.d.cts +2 -2
  114. package/dist/tag.d.ts +2 -2
  115. package/dist/tag.js.map +1 -1
  116. package/dist/testimonial.cjs.map +1 -1
  117. package/dist/testimonial.d.cts +2 -2
  118. package/dist/testimonial.d.ts +2 -2
  119. package/dist/testimonial.js.map +1 -1
  120. package/dist/text.cjs +16 -0
  121. package/dist/text.cjs.map +1 -1
  122. package/dist/text.d.cts +8 -2
  123. package/dist/text.d.ts +8 -2
  124. package/dist/text.js +16 -0
  125. package/dist/text.js.map +1 -1
  126. package/dist/textarea.cjs.map +1 -1
  127. package/dist/textarea.d.cts +1 -1
  128. package/dist/textarea.d.ts +1 -1
  129. package/dist/textarea.js.map +1 -1
  130. package/dist/toast.cjs.map +1 -1
  131. package/dist/toast.d.cts +2 -2
  132. package/dist/toast.d.ts +2 -2
  133. package/dist/toast.js.map +1 -1
  134. package/dist/tooltip.cjs.map +1 -1
  135. package/dist/tooltip.d.cts +2 -2
  136. package/dist/tooltip.d.ts +2 -2
  137. package/dist/tooltip.js.map +1 -1
  138. package/package.json +21 -16
package/dist/index.cjs CHANGED
@@ -159,6 +159,33 @@ var spectreGridGaps = ["sm", "md", "lg"];
159
159
  function isGridGap(value) {
160
160
  return spectreGridGaps.includes(value);
161
161
  }
162
+ var spectreGridSpans = [
163
+ 1,
164
+ 2,
165
+ 3,
166
+ 4,
167
+ 5,
168
+ 6,
169
+ 7,
170
+ 8,
171
+ 9,
172
+ 10,
173
+ 11,
174
+ 12,
175
+ "full"
176
+ ];
177
+ function isGridSpan(value) {
178
+ return spectreGridSpans.includes(
179
+ value
180
+ );
181
+ }
182
+ function isGridSpanOptions(value) {
183
+ if (typeof value !== "object" || value === null) {
184
+ return false;
185
+ }
186
+ const candidate = value;
187
+ return (candidate.base === void 0 || isGridSpan(candidate.base)) && (candidate.md === void 0 || isGridSpan(candidate.md)) && (candidate.lg === void 0 || isGridSpan(candidate.lg));
188
+ }
162
189
  var spectreStackDirections = ["vertical", "horizontal"];
163
190
  function isStackDirection(value) {
164
191
  return spectreStackDirections.includes(
@@ -246,12 +273,30 @@ var spectreTextLevels = [
246
273
  function isTextLevel(value) {
247
274
  return spectreTextLevels.includes(value);
248
275
  }
276
+ var spectreTextTransforms = [
277
+ "none",
278
+ "uppercase",
279
+ "lowercase",
280
+ "capitalize"
281
+ ];
282
+ function isTextTransform(value) {
283
+ return spectreTextTransforms.includes(
284
+ value
285
+ );
286
+ }
249
287
  function normalizeInt(value, fallback, min = 0) {
250
288
  if (value == null || typeof value !== "number" || !Number.isInteger(value) || value < min) {
251
289
  return fallback;
252
290
  }
253
291
  return value;
254
292
  }
293
+ var spectreUtilityClassPattern = /^sp-[a-z0-9]+(?:-[a-z0-9]+)*$/;
294
+ function sanitizeUtilityClasses(value) {
295
+ if (!value) {
296
+ return "";
297
+ }
298
+ return value.split(/\s+/).filter((token) => spectreUtilityClassPattern.test(token)).join(" ");
299
+ }
255
300
  var SpectreBaseElement = class extends lit.LitElement {
256
301
  constructor() {
257
302
  super(...arguments);
@@ -624,6 +669,9 @@ var SpectreButtonElement = class extends SpectreProjectableElement {
624
669
  set autofocus(value) {
625
670
  super.autofocus = value;
626
671
  }
672
+ get isLink() {
673
+ return Boolean(this.href) && !this.isDisabled;
674
+ }
627
675
  getContentContainer() {
628
676
  return this.querySelector("[data-sp-button-native]");
629
677
  }
@@ -707,12 +755,30 @@ var SpectreButtonElement = class extends SpectreProjectableElement {
707
755
  >` : lit.nothing;
708
756
  }
709
757
  render() {
758
+ if (this.isLink) {
759
+ return lit.html`<a
760
+ aria-busy="${this.loading ? "true" : "false"}"
761
+ aria-describedby="${ifDefined_js.ifDefined(this.forwardedAriaDescribedBy)}"
762
+ aria-label="${ifDefined_js.ifDefined(this.forwardedAriaLabel)}"
763
+ aria-labelledby="${ifDefined_js.ifDefined(this.forwardedAriaLabelledBy)}"
764
+ class="${this.buttonClasses}"
765
+ data-sp-button-native
766
+ href="${ifDefined_js.ifDefined(this.href)}"
767
+ id="${ifDefined_js.ifDefined(this.id || void 0)}"
768
+ rel="${ifDefined_js.ifDefined(this.rel || void 0)}"
769
+ target="${ifDefined_js.ifDefined(this.target || void 0)}"
770
+ title="${ifDefined_js.ifDefined(this.title || void 0)}"
771
+ >
772
+ ${this.renderButtonContent()}
773
+ </a>`;
774
+ }
710
775
  return lit.html`<button
711
776
  aria-busy="${this.loading ? "true" : "false"}"
712
777
  aria-describedby="${ifDefined_js.ifDefined(this.forwardedAriaDescribedBy)}"
713
778
  aria-label="${ifDefined_js.ifDefined(this.forwardedAriaLabel)}"
714
779
  aria-labelledby="${ifDefined_js.ifDefined(this.forwardedAriaLabelledBy)}"
715
780
  ?autofocus="${this.autofocus}"
781
+ aria-disabled="${ifDefined_js.ifDefined(this.href && this.isDisabled ? "true" : void 0)}"
716
782
  class="${this.buttonClasses}"
717
783
  data-sp-button-native
718
784
  ?disabled="${this.isDisabled}"
@@ -731,13 +797,16 @@ SpectreButtonElement.properties = {
731
797
  disabled: { type: Boolean, reflect: true },
732
798
  form: { type: String },
733
799
  fullWidth: { attribute: "full-width", type: Boolean, reflect: true },
800
+ href: { type: String, reflect: true },
734
801
  iconOnly: { attribute: "icon-only", type: Boolean, reflect: true },
735
802
  label: { type: String, reflect: true },
736
803
  loading: { type: Boolean, reflect: true },
737
804
  loadingLabel: { attribute: "loading-label", type: String, reflect: true },
738
805
  name: { type: String, reflect: true },
739
806
  pill: { type: Boolean, reflect: true },
807
+ rel: { type: String },
740
808
  size: { type: String, reflect: true },
809
+ target: { type: String },
741
810
  type: { type: String, reflect: true },
742
811
  variant: { type: String, reflect: true },
743
812
  value: { type: String }
@@ -2710,6 +2779,7 @@ function defineSpectrePricingCard(tagName = "sp-pricing-card") {
2710
2779
  var SpectreContainerElement = class extends SpectreProjectableElement {
2711
2780
  constructor() {
2712
2781
  super(...arguments);
2782
+ this.innerClass = void 0;
2713
2783
  this.maxWidth = void 0;
2714
2784
  }
2715
2785
  get id() {
@@ -2724,6 +2794,11 @@ var SpectreContainerElement = class extends SpectreProjectableElement {
2724
2794
  set title(value) {
2725
2795
  super.title = value;
2726
2796
  }
2797
+ connectedCallback() {
2798
+ var _a;
2799
+ super.connectedCallback();
2800
+ (_a = this.style).display || (_a.display = "block");
2801
+ }
2727
2802
  getContentContainer() {
2728
2803
  return this.querySelector("[data-sp-container-native]");
2729
2804
  }
@@ -2740,9 +2815,11 @@ var SpectreContainerElement = class extends SpectreProjectableElement {
2740
2815
  }
2741
2816
  }
2742
2817
  get containerClasses() {
2743
- return spectreUi.getContainerClasses(
2818
+ const recipeClasses = spectreUi.getContainerClasses(
2744
2819
  this.maxWidth != null ? { maxWidth: this.maxWidth } : {}
2745
2820
  );
2821
+ const utilityClasses = sanitizeUtilityClasses(this.innerClass);
2822
+ return utilityClasses ? `${recipeClasses} ${utilityClasses}` : recipeClasses;
2746
2823
  }
2747
2824
  render() {
2748
2825
  return lit.html`<div
@@ -2759,6 +2836,7 @@ var SpectreContainerElement = class extends SpectreProjectableElement {
2759
2836
  }
2760
2837
  };
2761
2838
  SpectreContainerElement.properties = {
2839
+ innerClass: { attribute: "inner-class", type: String },
2762
2840
  maxWidth: { attribute: "max-width", type: String, reflect: true }
2763
2841
  };
2764
2842
  function defineSpectreContainer(tagName = "sp-container") {
@@ -2774,6 +2852,7 @@ var SpectreGridElement = class extends SpectreProjectableElement {
2774
2852
  super(...arguments);
2775
2853
  this.columns = 1;
2776
2854
  this.gap = "md";
2855
+ this.innerClass = void 0;
2777
2856
  }
2778
2857
  get id() {
2779
2858
  return super.id;
@@ -2787,6 +2866,11 @@ var SpectreGridElement = class extends SpectreProjectableElement {
2787
2866
  set title(value) {
2788
2867
  super.title = value;
2789
2868
  }
2869
+ connectedCallback() {
2870
+ var _a;
2871
+ super.connectedCallback();
2872
+ (_a = this.style).display || (_a.display = "block");
2873
+ }
2790
2874
  getContentContainer() {
2791
2875
  return this.querySelector("[data-sp-grid-native]");
2792
2876
  }
@@ -2805,12 +2889,20 @@ var SpectreGridElement = class extends SpectreProjectableElement {
2805
2889
  if (changedProperties.has("gap") && (this.gap == null || !isGridGap(this.gap))) {
2806
2890
  this.gap = "md";
2807
2891
  }
2892
+ if (changedProperties.has("span") && this.span !== void 0 && !isGridSpan(this.span) && !isGridSpanOptions(this.span)) {
2893
+ this.span = void 0;
2894
+ }
2808
2895
  }
2809
2896
  get gridClasses() {
2810
- return spectreUi.getGridClasses({
2897
+ const recipeClasses = spectreUi.getGridClasses({
2811
2898
  columns: this.columns,
2812
- gap: this.gap
2899
+ gap: this.gap,
2900
+ ...this.span !== void 0 && {
2901
+ span: this.span
2902
+ }
2813
2903
  });
2904
+ const utilityClasses = sanitizeUtilityClasses(this.innerClass);
2905
+ return utilityClasses ? `${recipeClasses} ${utilityClasses}` : recipeClasses;
2814
2906
  }
2815
2907
  render() {
2816
2908
  return lit.html`<div
@@ -2828,7 +2920,9 @@ var SpectreGridElement = class extends SpectreProjectableElement {
2828
2920
  };
2829
2921
  SpectreGridElement.properties = {
2830
2922
  columns: { type: Number, reflect: true },
2831
- gap: { type: String, reflect: true }
2923
+ gap: { type: String, reflect: true },
2924
+ innerClass: { attribute: "inner-class", type: String },
2925
+ span: { type: Object }
2832
2926
  };
2833
2927
  function defineSpectreGrid(tagName = "sp-grid") {
2834
2928
  const existingElement = customElements.get(tagName);
@@ -2839,6 +2933,10 @@ function defineSpectreGrid(tagName = "sp-grid") {
2839
2933
  return SpectreGridElement;
2840
2934
  }
2841
2935
  var SpectreSectionElement = class extends SpectreProjectableElement {
2936
+ constructor() {
2937
+ super(...arguments);
2938
+ this.innerClass = void 0;
2939
+ }
2842
2940
  get id() {
2843
2941
  return super.id;
2844
2942
  }
@@ -2851,6 +2949,11 @@ var SpectreSectionElement = class extends SpectreProjectableElement {
2851
2949
  set title(value) {
2852
2950
  super.title = value;
2853
2951
  }
2952
+ connectedCallback() {
2953
+ var _a;
2954
+ super.connectedCallback();
2955
+ (_a = this.style).display || (_a.display = "block");
2956
+ }
2854
2957
  getContentContainer() {
2855
2958
  return this.querySelector("[data-sp-section-native]");
2856
2959
  }
@@ -2862,7 +2965,9 @@ var SpectreSectionElement = class extends SpectreProjectableElement {
2862
2965
  return el.hasAttribute("data-sp-section-native");
2863
2966
  }
2864
2967
  get sectionClasses() {
2865
- return spectreUi.getSectionClasses({});
2968
+ const recipeClasses = spectreUi.getSectionClasses({});
2969
+ const utilityClasses = sanitizeUtilityClasses(this.innerClass);
2970
+ return utilityClasses ? `${recipeClasses} ${utilityClasses}` : recipeClasses;
2866
2971
  }
2867
2972
  render() {
2868
2973
  return lit.html`<section
@@ -2878,6 +2983,9 @@ var SpectreSectionElement = class extends SpectreProjectableElement {
2878
2983
  </section>`;
2879
2984
  }
2880
2985
  };
2986
+ SpectreSectionElement.properties = {
2987
+ innerClass: { attribute: "inner-class", type: String }
2988
+ };
2881
2989
  function defineSpectreSection(tagName = "sp-section") {
2882
2990
  const existingElement = customElements.get(tagName);
2883
2991
  if (existingElement) {
@@ -2892,6 +3000,7 @@ var SpectreStackElement = class extends SpectreProjectableElement {
2892
3000
  this.align = "center";
2893
3001
  this.basis = void 0;
2894
3002
  this.direction = "vertical";
3003
+ this.innerClass = void 0;
2895
3004
  }
2896
3005
  get id() {
2897
3006
  return super.id;
@@ -2905,6 +3014,11 @@ var SpectreStackElement = class extends SpectreProjectableElement {
2905
3014
  set title(value) {
2906
3015
  super.title = value;
2907
3016
  }
3017
+ connectedCallback() {
3018
+ var _a;
3019
+ super.connectedCallback();
3020
+ (_a = this.style).display || (_a.display = "block");
3021
+ }
2908
3022
  getContentContainer() {
2909
3023
  return this.querySelector("[data-sp-stack-native]");
2910
3024
  }
@@ -2927,11 +3041,13 @@ var SpectreStackElement = class extends SpectreProjectableElement {
2927
3041
  }
2928
3042
  }
2929
3043
  get stackClasses() {
2930
- return spectreUi.getStackClasses({
3044
+ const recipeClasses = spectreUi.getStackClasses({
2931
3045
  align: this.align,
2932
3046
  direction: this.direction,
2933
3047
  ...this.basis != null ? { basis: this.basis } : {}
2934
3048
  });
3049
+ const utilityClasses = sanitizeUtilityClasses(this.innerClass);
3050
+ return utilityClasses ? `${recipeClasses} ${utilityClasses}` : recipeClasses;
2935
3051
  }
2936
3052
  render() {
2937
3053
  return lit.html`<div
@@ -2950,7 +3066,8 @@ var SpectreStackElement = class extends SpectreProjectableElement {
2950
3066
  SpectreStackElement.properties = {
2951
3067
  align: { type: String, reflect: true },
2952
3068
  basis: { type: String, reflect: true },
2953
- direction: { type: String, reflect: true }
3069
+ direction: { type: String, reflect: true },
3070
+ innerClass: { attribute: "inner-class", type: String }
2954
3071
  };
2955
3072
  function defineSpectreStack(tagName = "sp-stack") {
2956
3073
  const existingElement = customElements.get(tagName);
@@ -2964,6 +3081,7 @@ var SpectreDropdownElement = class extends SpectreBaseElement {
2964
3081
  constructor() {
2965
3082
  super(...arguments);
2966
3083
  this.fullWidth = false;
3084
+ this.mega = false;
2967
3085
  this.open = false;
2968
3086
  this.placement = "bottom-start";
2969
3087
  this.triggerLabel = "Toggle menu";
@@ -3067,6 +3185,9 @@ var SpectreDropdownElement = class extends SpectreBaseElement {
3067
3185
  if (changedProperties.has("fullWidth") && this.fullWidth == null) {
3068
3186
  this.fullWidth = false;
3069
3187
  }
3188
+ if (changedProperties.has("mega") && this.mega == null) {
3189
+ this.mega = false;
3190
+ }
3070
3191
  if (changedProperties.has("open") && this.open == null) {
3071
3192
  this.open = false;
3072
3193
  }
@@ -3102,10 +3223,14 @@ var SpectreDropdownElement = class extends SpectreBaseElement {
3102
3223
  this.dispatchEvent(new CustomEvent("sp-close", { bubbles: true }));
3103
3224
  }
3104
3225
  get dropdownClasses() {
3105
- return spectreUi.getDropdownClasses({ fullWidth: this.fullWidth ?? false });
3226
+ return spectreUi.getDropdownClasses({
3227
+ fullWidth: this.fullWidth ?? false,
3228
+ mega: this.mega ?? false
3229
+ });
3106
3230
  }
3107
3231
  get menuClasses() {
3108
3232
  return spectreUi.getDropdownMenuClasses({
3233
+ mega: this.mega ?? false,
3109
3234
  open: this.open ?? false,
3110
3235
  placement: this.placement
3111
3236
  });
@@ -3135,6 +3260,7 @@ var SpectreDropdownElement = class extends SpectreBaseElement {
3135
3260
  };
3136
3261
  SpectreDropdownElement.properties = {
3137
3262
  fullWidth: { attribute: "full-width", type: Boolean, reflect: true },
3263
+ mega: { type: Boolean, reflect: true },
3138
3264
  open: { type: Boolean, reflect: true },
3139
3265
  placement: { type: String, reflect: true },
3140
3266
  triggerLabel: { attribute: "trigger-label", type: String }
@@ -3152,6 +3278,7 @@ var SpectreFooterElement = class extends SpectreProjectableElement {
3152
3278
  super(...arguments);
3153
3279
  this.bordered = false;
3154
3280
  this.fullWidth = false;
3281
+ this.innerClass = void 0;
3155
3282
  }
3156
3283
  get id() {
3157
3284
  return super.id;
@@ -3165,6 +3292,11 @@ var SpectreFooterElement = class extends SpectreProjectableElement {
3165
3292
  set title(value) {
3166
3293
  super.title = value;
3167
3294
  }
3295
+ connectedCallback() {
3296
+ var _a;
3297
+ super.connectedCallback();
3298
+ (_a = this.style).display || (_a.display = "block");
3299
+ }
3168
3300
  getContentContainer() {
3169
3301
  return this.querySelector("[data-sp-footer-native]");
3170
3302
  }
@@ -3184,10 +3316,12 @@ var SpectreFooterElement = class extends SpectreProjectableElement {
3184
3316
  }
3185
3317
  }
3186
3318
  get footerClasses() {
3187
- return spectreUi.getFooterClasses({
3319
+ const recipeClasses = spectreUi.getFooterClasses({
3188
3320
  bordered: this.bordered ?? false,
3189
3321
  fullWidth: this.fullWidth ?? false
3190
3322
  });
3323
+ const utilityClasses = sanitizeUtilityClasses(this.innerClass);
3324
+ return utilityClasses ? `${recipeClasses} ${utilityClasses}` : recipeClasses;
3191
3325
  }
3192
3326
  render() {
3193
3327
  return lit.html`<footer
@@ -3203,7 +3337,8 @@ var SpectreFooterElement = class extends SpectreProjectableElement {
3203
3337
  };
3204
3338
  SpectreFooterElement.properties = {
3205
3339
  bordered: { type: Boolean, reflect: true },
3206
- fullWidth: { attribute: "full-width", type: Boolean, reflect: true }
3340
+ fullWidth: { attribute: "full-width", type: Boolean, reflect: true },
3341
+ innerClass: { attribute: "inner-class", type: String }
3207
3342
  };
3208
3343
  function defineSpectreFooter(tagName = "sp-footer") {
3209
3344
  const existingElement = customElements.get(tagName);
@@ -3385,6 +3520,7 @@ var SpectreNavElement = class extends SpectreProjectableElement {
3385
3520
  super(...arguments);
3386
3521
  this.bordered = false;
3387
3522
  this.fullWidth = false;
3523
+ this.innerClass = void 0;
3388
3524
  this.sticky = false;
3389
3525
  }
3390
3526
  get id() {
@@ -3399,6 +3535,11 @@ var SpectreNavElement = class extends SpectreProjectableElement {
3399
3535
  set title(value) {
3400
3536
  super.title = value;
3401
3537
  }
3538
+ connectedCallback() {
3539
+ var _a;
3540
+ super.connectedCallback();
3541
+ (_a = this.style).display || (_a.display = "block");
3542
+ }
3402
3543
  getContentContainer() {
3403
3544
  return this.querySelector("[data-sp-nav-native]");
3404
3545
  }
@@ -3421,11 +3562,13 @@ var SpectreNavElement = class extends SpectreProjectableElement {
3421
3562
  }
3422
3563
  }
3423
3564
  get navClasses() {
3424
- return spectreUi.getNavClasses({
3565
+ const recipeClasses = spectreUi.getNavClasses({
3425
3566
  bordered: this.bordered ?? false,
3426
3567
  fullWidth: this.fullWidth ?? false,
3427
3568
  sticky: this.sticky ?? false
3428
3569
  });
3570
+ const utilityClasses = sanitizeUtilityClasses(this.innerClass);
3571
+ return utilityClasses ? `${recipeClasses} ${utilityClasses}` : recipeClasses;
3429
3572
  }
3430
3573
  render() {
3431
3574
  return lit.html`<nav
@@ -3442,6 +3585,7 @@ var SpectreNavElement = class extends SpectreProjectableElement {
3442
3585
  SpectreNavElement.properties = {
3443
3586
  bordered: { type: Boolean, reflect: true },
3444
3587
  fullWidth: { attribute: "full-width", type: Boolean, reflect: true },
3588
+ innerClass: { attribute: "inner-class", type: String },
3445
3589
  sticky: { type: Boolean, reflect: true }
3446
3590
  };
3447
3591
  function defineSpectreNav(tagName = "sp-nav") {
@@ -3458,6 +3602,7 @@ var SpectreNavItemElement = class extends SpectreBaseElement {
3458
3602
  this.dropdown = false;
3459
3603
  this.href = void 0;
3460
3604
  this.label = void 0;
3605
+ this.mega = false;
3461
3606
  this.open = false;
3462
3607
  this.placement = "bottom-start";
3463
3608
  this.triggerContent = [];
@@ -3560,6 +3705,9 @@ var SpectreNavItemElement = class extends SpectreBaseElement {
3560
3705
  if (changedProperties.has("dropdown") && this.dropdown == null) {
3561
3706
  this.dropdown = false;
3562
3707
  }
3708
+ if (changedProperties.has("mega") && this.mega == null) {
3709
+ this.mega = false;
3710
+ }
3563
3711
  if (changedProperties.has("open") && this.open == null) {
3564
3712
  this.open = false;
3565
3713
  }
@@ -3592,10 +3740,11 @@ var SpectreNavItemElement = class extends SpectreBaseElement {
3592
3740
  this.dispatchEvent(new CustomEvent("sp-close", { bubbles: true }));
3593
3741
  }
3594
3742
  get wrapperClasses() {
3595
- return spectreUi.getDropdownClasses();
3743
+ return spectreUi.getDropdownClasses({ mega: this.mega ?? false });
3596
3744
  }
3597
3745
  get menuClasses() {
3598
3746
  return spectreUi.getDropdownMenuClasses({
3747
+ mega: this.mega ?? false,
3599
3748
  open: this.open ?? false,
3600
3749
  placement: this.placement
3601
3750
  });
@@ -3643,6 +3792,7 @@ SpectreNavItemElement.properties = {
3643
3792
  dropdown: { type: Boolean, reflect: true },
3644
3793
  href: { type: String },
3645
3794
  label: { type: String },
3795
+ mega: { type: Boolean, reflect: true },
3646
3796
  open: { type: Boolean, reflect: true },
3647
3797
  placement: { type: String, reflect: true }
3648
3798
  };
@@ -3658,6 +3808,7 @@ var SpectreSidebarElement = class extends SpectreProjectableElement {
3658
3808
  constructor() {
3659
3809
  super(...arguments);
3660
3810
  this.bordered = false;
3811
+ this.hideToggle = false;
3661
3812
  this.open = false;
3662
3813
  this.toggleLabel = "Toggle sidebar";
3663
3814
  this.handleDocumentKeydown = (event) => {
@@ -3692,6 +3843,9 @@ var SpectreSidebarElement = class extends SpectreProjectableElement {
3692
3843
  if (changedProperties.has("bordered") && this.bordered == null) {
3693
3844
  this.bordered = false;
3694
3845
  }
3846
+ if (changedProperties.has("hideToggle") && this.hideToggle == null) {
3847
+ this.hideToggle = false;
3848
+ }
3695
3849
  if (changedProperties.has("open") && this.open == null) {
3696
3850
  this.open = false;
3697
3851
  }
@@ -3744,16 +3898,16 @@ var SpectreSidebarElement = class extends SpectreProjectableElement {
3744
3898
  return spectreUi.getSidebarClasses({ bordered: this.bordered ?? false });
3745
3899
  }
3746
3900
  render() {
3747
- return lit.html`<button
3748
- aria-expanded="${this.open ? "true" : "false"}"
3749
- aria-label="${ifDefined_js.ifDefined(this.toggleLabel)}"
3750
- class="${spectreUi.getSidebarToggleClasses()}"
3751
- data-sp-sidebar-toggle
3752
- type="button"
3753
- @click="${() => this.toggle()}"
3754
- >
3755
- &#9776;
3756
- </button>
3901
+ return lit.html`${this.hideToggle ? lit.nothing : lit.html`<button
3902
+ aria-expanded="${this.open ? "true" : "false"}"
3903
+ aria-label="${ifDefined_js.ifDefined(this.toggleLabel)}"
3904
+ class="${spectreUi.getSidebarToggleClasses()}"
3905
+ data-sp-sidebar-toggle
3906
+ type="button"
3907
+ @click="${() => this.toggle()}"
3908
+ >
3909
+ &#9776;
3910
+ </button>`}
3757
3911
  <div
3758
3912
  class="${spectreUi.getSidebarBackdropClasses()}"
3759
3913
  data-sp-sidebar-backdrop
@@ -3772,6 +3926,7 @@ var SpectreSidebarElement = class extends SpectreProjectableElement {
3772
3926
  };
3773
3927
  SpectreSidebarElement.properties = {
3774
3928
  bordered: { type: Boolean, reflect: true },
3929
+ hideToggle: { attribute: "hide-toggle", type: Boolean, reflect: true },
3775
3930
  open: { type: Boolean, reflect: false },
3776
3931
  toggleLabel: { attribute: "toggle-label", type: String }
3777
3932
  };
@@ -3783,6 +3938,119 @@ function defineSpectreSidebar(tagName = "sp-sidebar") {
3783
3938
  customElements.define(tagName, SpectreSidebarElement);
3784
3939
  return SpectreSidebarElement;
3785
3940
  }
3941
+ var SpectreSidebarToggleElement = class extends SpectreProjectableElement {
3942
+ constructor() {
3943
+ super(...arguments);
3944
+ this.for = void 0;
3945
+ this.label = "Toggle sidebar";
3946
+ this.expanded = false;
3947
+ this.handleTargetToggle = (event) => {
3948
+ if (event.target !== this.targetElement) {
3949
+ return;
3950
+ }
3951
+ this.syncExpanded();
3952
+ };
3953
+ }
3954
+ get id() {
3955
+ return super.id;
3956
+ }
3957
+ set id(value) {
3958
+ super.id = value;
3959
+ }
3960
+ get title() {
3961
+ return super.title;
3962
+ }
3963
+ set title(value) {
3964
+ super.title = value;
3965
+ }
3966
+ getContentContainer() {
3967
+ return this.querySelector("[data-sp-sidebar-toggle-native]");
3968
+ }
3969
+ isInternalNode(node) {
3970
+ if (node.nodeType !== Node.ELEMENT_NODE) {
3971
+ return false;
3972
+ }
3973
+ const el = node;
3974
+ return el.hasAttribute("data-sp-sidebar-toggle-native");
3975
+ }
3976
+ willUpdate(changedProperties) {
3977
+ if (changedProperties.has("label") && !this.label) {
3978
+ this.label = "Toggle sidebar";
3979
+ }
3980
+ }
3981
+ connectedCallback() {
3982
+ super.connectedCallback();
3983
+ document.addEventListener("sp-open", this.handleTargetToggle);
3984
+ document.addEventListener("sp-close", this.handleTargetToggle);
3985
+ this.syncExpanded();
3986
+ }
3987
+ disconnectedCallback() {
3988
+ document.removeEventListener("sp-open", this.handleTargetToggle);
3989
+ document.removeEventListener("sp-close", this.handleTargetToggle);
3990
+ super.disconnectedCallback();
3991
+ }
3992
+ updated(changedProperties) {
3993
+ super.updated(changedProperties);
3994
+ if (changedProperties.has("for")) {
3995
+ this.syncExpanded();
3996
+ }
3997
+ }
3998
+ get targetElement() {
3999
+ if (!this.for) {
4000
+ return null;
4001
+ }
4002
+ const native = document.getElementById(this.for);
4003
+ return native?.closest("sp-sidebar") ?? null;
4004
+ }
4005
+ syncExpanded() {
4006
+ const next = Boolean(this.targetElement?.open);
4007
+ if (next !== this.expanded) {
4008
+ this.expanded = next;
4009
+ this.requestUpdate();
4010
+ }
4011
+ }
4012
+ handleClick() {
4013
+ const target = this.targetElement;
4014
+ if (!target) {
4015
+ return;
4016
+ }
4017
+ const nextOpen = !target.open;
4018
+ target.open = nextOpen;
4019
+ target.dispatchEvent(
4020
+ new CustomEvent(nextOpen ? "sp-open" : "sp-close", { bubbles: true })
4021
+ );
4022
+ }
4023
+ get toggleClasses() {
4024
+ return spectreUi.getSidebarToggleClasses();
4025
+ }
4026
+ render() {
4027
+ return lit.html`<button
4028
+ aria-controls="${ifDefined_js.ifDefined(this.for)}"
4029
+ aria-expanded="${this.expanded ? "true" : "false"}"
4030
+ aria-label="${ifDefined_js.ifDefined(this.forwardedAriaLabel ?? this.label)}"
4031
+ class="${this.toggleClasses}"
4032
+ data-sp-sidebar-toggle-native
4033
+ id="${ifDefined_js.ifDefined(this.id || void 0)}"
4034
+ title="${ifDefined_js.ifDefined(this.title || void 0)}"
4035
+ type="button"
4036
+ @click="${() => this.handleClick()}"
4037
+ >
4038
+ ${this.hasProjectedContent ? this.projectedContent : lit.html`&#9776;`}
4039
+ </button>`;
4040
+ }
4041
+ };
4042
+ SpectreSidebarToggleElement.properties = {
4043
+ for: { type: String },
4044
+ label: { type: String }
4045
+ };
4046
+ function defineSpectreSidebarToggle(tagName = "sp-sidebar-toggle") {
4047
+ const existingElement = customElements.get(tagName);
4048
+ if (existingElement) {
4049
+ return existingElement;
4050
+ }
4051
+ customElements.define(tagName, SpectreSidebarToggleElement);
4052
+ return SpectreSidebarToggleElement;
4053
+ }
3786
4054
  var SpectreToastElement = class extends SpectreBaseElement {
3787
4055
  constructor() {
3788
4056
  super(...arguments);
@@ -4130,6 +4398,9 @@ var SpectreTextElement = class extends SpectreProjectableElement {
4130
4398
  if (changedProperties.has("variant") && !isTextVariant(this.variant)) {
4131
4399
  this.variant = "default";
4132
4400
  }
4401
+ if (changedProperties.has("transform") && this.transform !== void 0 && !isTextTransform(this.transform)) {
4402
+ this.transform = void 0;
4403
+ }
4133
4404
  }
4134
4405
  get id() {
4135
4406
  return super.id;
@@ -4158,6 +4429,7 @@ var SpectreTextElement = class extends SpectreProjectableElement {
4158
4429
  const textClasses = spectreUi.getTextClasses({
4159
4430
  ...this.family !== void 0 && { family: this.family },
4160
4431
  size: this.size ?? "md",
4432
+ ...this.transform !== void 0 && { transform: this.transform },
4161
4433
  variant: this.variant ?? "default"
4162
4434
  });
4163
4435
  return staticHtml_js.html`<${tag}
@@ -4175,6 +4447,7 @@ SpectreTextElement.properties = {
4175
4447
  family: { type: String, reflect: true },
4176
4448
  level: { type: String, reflect: true },
4177
4449
  size: { type: String, reflect: true },
4450
+ transform: { type: String, reflect: true },
4178
4451
  variant: { type: String, reflect: true }
4179
4452
  };
4180
4453
  function defineSpectreText(tagName = "sp-text") {
@@ -4216,6 +4489,7 @@ function defineSpectreComponents() {
4216
4489
  defineSpectreNav();
4217
4490
  defineSpectreNavItem();
4218
4491
  defineSpectreSidebar();
4492
+ defineSpectreSidebarToggle();
4219
4493
  defineSpectreToast();
4220
4494
  defineSpectreTooltip();
4221
4495
  defineSpectreText();
@@ -4244,6 +4518,7 @@ exports.SpectreRatingElement = SpectreRatingElement;
4244
4518
  exports.SpectreSectionElement = SpectreSectionElement;
4245
4519
  exports.SpectreSelectElement = SpectreSelectElement;
4246
4520
  exports.SpectreSidebarElement = SpectreSidebarElement;
4521
+ exports.SpectreSidebarToggleElement = SpectreSidebarToggleElement;
4247
4522
  exports.SpectreSpinnerElement = SpectreSpinnerElement;
4248
4523
  exports.SpectreStackElement = SpectreStackElement;
4249
4524
  exports.SpectreTagElement = SpectreTagElement;
@@ -4276,6 +4551,7 @@ exports.defineSpectreRating = defineSpectreRating;
4276
4551
  exports.defineSpectreSection = defineSpectreSection;
4277
4552
  exports.defineSpectreSelect = defineSpectreSelect;
4278
4553
  exports.defineSpectreSidebar = defineSpectreSidebar;
4554
+ exports.defineSpectreSidebarToggle = defineSpectreSidebarToggle;
4279
4555
  exports.defineSpectreSpinner = defineSpectreSpinner;
4280
4556
  exports.defineSpectreStack = defineSpectreStack;
4281
4557
  exports.defineSpectreTag = defineSpectreTag;