@phcdevworks/spectre-components 1.14.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 (100) hide show
  1. package/README.md +165 -80
  2. package/dist/alert.cjs.map +1 -1
  3. package/dist/alert.js.map +1 -1
  4. package/dist/avatar.cjs.map +1 -1
  5. package/dist/avatar.js.map +1 -1
  6. package/dist/badge.cjs.map +1 -1
  7. package/dist/badge.js.map +1 -1
  8. package/dist/button.cjs.map +1 -1
  9. package/dist/button.js.map +1 -1
  10. package/dist/card.cjs.map +1 -1
  11. package/dist/card.js.map +1 -1
  12. package/dist/container.cjs +17 -1
  13. package/dist/container.cjs.map +1 -1
  14. package/dist/container.d.cts +7 -0
  15. package/dist/container.d.ts +7 -0
  16. package/dist/container.js +17 -1
  17. package/dist/container.js.map +1 -1
  18. package/dist/dropdown.cjs +10 -1
  19. package/dist/dropdown.cjs.map +1 -1
  20. package/dist/dropdown.d.cts +6 -0
  21. package/dist/dropdown.d.ts +6 -0
  22. package/dist/dropdown.js +10 -1
  23. package/dist/dropdown.js.map +1 -1
  24. package/dist/footer.cjs +18 -2
  25. package/dist/footer.cjs.map +1 -1
  26. package/dist/footer.d.cts +7 -0
  27. package/dist/footer.d.ts +7 -0
  28. package/dist/footer.js +18 -2
  29. package/dist/footer.js.map +1 -1
  30. package/dist/grid.cjs +17 -1
  31. package/dist/grid.cjs.map +1 -1
  32. package/dist/grid.d.cts +7 -0
  33. package/dist/grid.d.ts +7 -0
  34. package/dist/grid.js +17 -1
  35. package/dist/grid.js.map +1 -1
  36. package/dist/icon-box.cjs.map +1 -1
  37. package/dist/icon-box.js.map +1 -1
  38. package/dist/index.cjs +222 -20
  39. package/dist/index.cjs.map +1 -1
  40. package/dist/index.d.cts +1 -0
  41. package/dist/index.d.ts +1 -0
  42. package/dist/index.js +222 -22
  43. package/dist/index.js.map +1 -1
  44. package/dist/input.cjs.map +1 -1
  45. package/dist/input.js.map +1 -1
  46. package/dist/nav-item.cjs +7 -1
  47. package/dist/nav-item.cjs.map +1 -1
  48. package/dist/nav-item.d.cts +6 -0
  49. package/dist/nav-item.d.ts +6 -0
  50. package/dist/nav-item.js +7 -1
  51. package/dist/nav-item.js.map +1 -1
  52. package/dist/nav.cjs +17 -1
  53. package/dist/nav.cjs.map +1 -1
  54. package/dist/nav.d.cts +7 -0
  55. package/dist/nav.d.ts +7 -0
  56. package/dist/nav.js +17 -1
  57. package/dist/nav.js.map +1 -1
  58. package/dist/rating.cjs.map +1 -1
  59. package/dist/rating.js.map +1 -1
  60. package/dist/section.cjs +22 -1
  61. package/dist/section.cjs.map +1 -1
  62. package/dist/section.d.cts +9 -0
  63. package/dist/section.d.ts +9 -0
  64. package/dist/section.js +22 -1
  65. package/dist/section.js.map +1 -1
  66. package/dist/select.cjs.map +1 -1
  67. package/dist/select.js.map +1 -1
  68. package/dist/sidebar-toggle.cjs +465 -0
  69. package/dist/sidebar-toggle.cjs.map +1 -0
  70. package/dist/sidebar-toggle.d.cts +44 -0
  71. package/dist/sidebar-toggle.d.ts +44 -0
  72. package/dist/sidebar-toggle.js +462 -0
  73. package/dist/sidebar-toggle.js.map +1 -0
  74. package/dist/sidebar.cjs +15 -10
  75. package/dist/sidebar.cjs.map +1 -1
  76. package/dist/sidebar.d.cts +7 -0
  77. package/dist/sidebar.d.ts +7 -0
  78. package/dist/sidebar.js +15 -10
  79. package/dist/sidebar.js.map +1 -1
  80. package/dist/spinner.cjs.map +1 -1
  81. package/dist/spinner.js.map +1 -1
  82. package/dist/stack.cjs +18 -2
  83. package/dist/stack.cjs.map +1 -1
  84. package/dist/stack.d.cts +7 -0
  85. package/dist/stack.d.ts +7 -0
  86. package/dist/stack.js +18 -2
  87. package/dist/stack.js.map +1 -1
  88. package/dist/tag.cjs.map +1 -1
  89. package/dist/tag.js.map +1 -1
  90. package/dist/testimonial.cjs.map +1 -1
  91. package/dist/testimonial.js.map +1 -1
  92. package/dist/text.cjs.map +1 -1
  93. package/dist/text.js.map +1 -1
  94. package/dist/textarea.cjs.map +1 -1
  95. package/dist/textarea.js.map +1 -1
  96. package/dist/toast.cjs.map +1 -1
  97. package/dist/toast.js.map +1 -1
  98. package/dist/tooltip.cjs.map +1 -1
  99. package/dist/tooltip.js.map +1 -1
  100. package/package.json +14 -9
package/dist/index.cjs CHANGED
@@ -290,6 +290,13 @@ function normalizeInt(value, fallback, min = 0) {
290
290
  }
291
291
  return value;
292
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
+ }
293
300
  var SpectreBaseElement = class extends lit.LitElement {
294
301
  constructor() {
295
302
  super(...arguments);
@@ -2772,6 +2779,7 @@ function defineSpectrePricingCard(tagName = "sp-pricing-card") {
2772
2779
  var SpectreContainerElement = class extends SpectreProjectableElement {
2773
2780
  constructor() {
2774
2781
  super(...arguments);
2782
+ this.innerClass = void 0;
2775
2783
  this.maxWidth = void 0;
2776
2784
  }
2777
2785
  get id() {
@@ -2786,6 +2794,11 @@ var SpectreContainerElement = class extends SpectreProjectableElement {
2786
2794
  set title(value) {
2787
2795
  super.title = value;
2788
2796
  }
2797
+ connectedCallback() {
2798
+ var _a;
2799
+ super.connectedCallback();
2800
+ (_a = this.style).display || (_a.display = "block");
2801
+ }
2789
2802
  getContentContainer() {
2790
2803
  return this.querySelector("[data-sp-container-native]");
2791
2804
  }
@@ -2802,9 +2815,11 @@ var SpectreContainerElement = class extends SpectreProjectableElement {
2802
2815
  }
2803
2816
  }
2804
2817
  get containerClasses() {
2805
- return spectreUi.getContainerClasses(
2818
+ const recipeClasses = spectreUi.getContainerClasses(
2806
2819
  this.maxWidth != null ? { maxWidth: this.maxWidth } : {}
2807
2820
  );
2821
+ const utilityClasses = sanitizeUtilityClasses(this.innerClass);
2822
+ return utilityClasses ? `${recipeClasses} ${utilityClasses}` : recipeClasses;
2808
2823
  }
2809
2824
  render() {
2810
2825
  return lit.html`<div
@@ -2821,6 +2836,7 @@ var SpectreContainerElement = class extends SpectreProjectableElement {
2821
2836
  }
2822
2837
  };
2823
2838
  SpectreContainerElement.properties = {
2839
+ innerClass: { attribute: "inner-class", type: String },
2824
2840
  maxWidth: { attribute: "max-width", type: String, reflect: true }
2825
2841
  };
2826
2842
  function defineSpectreContainer(tagName = "sp-container") {
@@ -2836,6 +2852,7 @@ var SpectreGridElement = class extends SpectreProjectableElement {
2836
2852
  super(...arguments);
2837
2853
  this.columns = 1;
2838
2854
  this.gap = "md";
2855
+ this.innerClass = void 0;
2839
2856
  }
2840
2857
  get id() {
2841
2858
  return super.id;
@@ -2849,6 +2866,11 @@ var SpectreGridElement = class extends SpectreProjectableElement {
2849
2866
  set title(value) {
2850
2867
  super.title = value;
2851
2868
  }
2869
+ connectedCallback() {
2870
+ var _a;
2871
+ super.connectedCallback();
2872
+ (_a = this.style).display || (_a.display = "block");
2873
+ }
2852
2874
  getContentContainer() {
2853
2875
  return this.querySelector("[data-sp-grid-native]");
2854
2876
  }
@@ -2872,13 +2894,15 @@ var SpectreGridElement = class extends SpectreProjectableElement {
2872
2894
  }
2873
2895
  }
2874
2896
  get gridClasses() {
2875
- return spectreUi.getGridClasses({
2897
+ const recipeClasses = spectreUi.getGridClasses({
2876
2898
  columns: this.columns,
2877
2899
  gap: this.gap,
2878
2900
  ...this.span !== void 0 && {
2879
2901
  span: this.span
2880
2902
  }
2881
2903
  });
2904
+ const utilityClasses = sanitizeUtilityClasses(this.innerClass);
2905
+ return utilityClasses ? `${recipeClasses} ${utilityClasses}` : recipeClasses;
2882
2906
  }
2883
2907
  render() {
2884
2908
  return lit.html`<div
@@ -2897,6 +2921,7 @@ var SpectreGridElement = class extends SpectreProjectableElement {
2897
2921
  SpectreGridElement.properties = {
2898
2922
  columns: { type: Number, reflect: true },
2899
2923
  gap: { type: String, reflect: true },
2924
+ innerClass: { attribute: "inner-class", type: String },
2900
2925
  span: { type: Object }
2901
2926
  };
2902
2927
  function defineSpectreGrid(tagName = "sp-grid") {
@@ -2908,6 +2933,10 @@ function defineSpectreGrid(tagName = "sp-grid") {
2908
2933
  return SpectreGridElement;
2909
2934
  }
2910
2935
  var SpectreSectionElement = class extends SpectreProjectableElement {
2936
+ constructor() {
2937
+ super(...arguments);
2938
+ this.innerClass = void 0;
2939
+ }
2911
2940
  get id() {
2912
2941
  return super.id;
2913
2942
  }
@@ -2920,6 +2949,11 @@ var SpectreSectionElement = class extends SpectreProjectableElement {
2920
2949
  set title(value) {
2921
2950
  super.title = value;
2922
2951
  }
2952
+ connectedCallback() {
2953
+ var _a;
2954
+ super.connectedCallback();
2955
+ (_a = this.style).display || (_a.display = "block");
2956
+ }
2923
2957
  getContentContainer() {
2924
2958
  return this.querySelector("[data-sp-section-native]");
2925
2959
  }
@@ -2931,7 +2965,9 @@ var SpectreSectionElement = class extends SpectreProjectableElement {
2931
2965
  return el.hasAttribute("data-sp-section-native");
2932
2966
  }
2933
2967
  get sectionClasses() {
2934
- return spectreUi.getSectionClasses({});
2968
+ const recipeClasses = spectreUi.getSectionClasses({});
2969
+ const utilityClasses = sanitizeUtilityClasses(this.innerClass);
2970
+ return utilityClasses ? `${recipeClasses} ${utilityClasses}` : recipeClasses;
2935
2971
  }
2936
2972
  render() {
2937
2973
  return lit.html`<section
@@ -2947,6 +2983,9 @@ var SpectreSectionElement = class extends SpectreProjectableElement {
2947
2983
  </section>`;
2948
2984
  }
2949
2985
  };
2986
+ SpectreSectionElement.properties = {
2987
+ innerClass: { attribute: "inner-class", type: String }
2988
+ };
2950
2989
  function defineSpectreSection(tagName = "sp-section") {
2951
2990
  const existingElement = customElements.get(tagName);
2952
2991
  if (existingElement) {
@@ -2961,6 +3000,7 @@ var SpectreStackElement = class extends SpectreProjectableElement {
2961
3000
  this.align = "center";
2962
3001
  this.basis = void 0;
2963
3002
  this.direction = "vertical";
3003
+ this.innerClass = void 0;
2964
3004
  }
2965
3005
  get id() {
2966
3006
  return super.id;
@@ -2974,6 +3014,11 @@ var SpectreStackElement = class extends SpectreProjectableElement {
2974
3014
  set title(value) {
2975
3015
  super.title = value;
2976
3016
  }
3017
+ connectedCallback() {
3018
+ var _a;
3019
+ super.connectedCallback();
3020
+ (_a = this.style).display || (_a.display = "block");
3021
+ }
2977
3022
  getContentContainer() {
2978
3023
  return this.querySelector("[data-sp-stack-native]");
2979
3024
  }
@@ -2996,11 +3041,13 @@ var SpectreStackElement = class extends SpectreProjectableElement {
2996
3041
  }
2997
3042
  }
2998
3043
  get stackClasses() {
2999
- return spectreUi.getStackClasses({
3044
+ const recipeClasses = spectreUi.getStackClasses({
3000
3045
  align: this.align,
3001
3046
  direction: this.direction,
3002
3047
  ...this.basis != null ? { basis: this.basis } : {}
3003
3048
  });
3049
+ const utilityClasses = sanitizeUtilityClasses(this.innerClass);
3050
+ return utilityClasses ? `${recipeClasses} ${utilityClasses}` : recipeClasses;
3004
3051
  }
3005
3052
  render() {
3006
3053
  return lit.html`<div
@@ -3019,7 +3066,8 @@ var SpectreStackElement = class extends SpectreProjectableElement {
3019
3066
  SpectreStackElement.properties = {
3020
3067
  align: { type: String, reflect: true },
3021
3068
  basis: { type: String, reflect: true },
3022
- direction: { type: String, reflect: true }
3069
+ direction: { type: String, reflect: true },
3070
+ innerClass: { attribute: "inner-class", type: String }
3023
3071
  };
3024
3072
  function defineSpectreStack(tagName = "sp-stack") {
3025
3073
  const existingElement = customElements.get(tagName);
@@ -3033,6 +3081,7 @@ var SpectreDropdownElement = class extends SpectreBaseElement {
3033
3081
  constructor() {
3034
3082
  super(...arguments);
3035
3083
  this.fullWidth = false;
3084
+ this.mega = false;
3036
3085
  this.open = false;
3037
3086
  this.placement = "bottom-start";
3038
3087
  this.triggerLabel = "Toggle menu";
@@ -3136,6 +3185,9 @@ var SpectreDropdownElement = class extends SpectreBaseElement {
3136
3185
  if (changedProperties.has("fullWidth") && this.fullWidth == null) {
3137
3186
  this.fullWidth = false;
3138
3187
  }
3188
+ if (changedProperties.has("mega") && this.mega == null) {
3189
+ this.mega = false;
3190
+ }
3139
3191
  if (changedProperties.has("open") && this.open == null) {
3140
3192
  this.open = false;
3141
3193
  }
@@ -3171,10 +3223,14 @@ var SpectreDropdownElement = class extends SpectreBaseElement {
3171
3223
  this.dispatchEvent(new CustomEvent("sp-close", { bubbles: true }));
3172
3224
  }
3173
3225
  get dropdownClasses() {
3174
- return spectreUi.getDropdownClasses({ fullWidth: this.fullWidth ?? false });
3226
+ return spectreUi.getDropdownClasses({
3227
+ fullWidth: this.fullWidth ?? false,
3228
+ mega: this.mega ?? false
3229
+ });
3175
3230
  }
3176
3231
  get menuClasses() {
3177
3232
  return spectreUi.getDropdownMenuClasses({
3233
+ mega: this.mega ?? false,
3178
3234
  open: this.open ?? false,
3179
3235
  placement: this.placement
3180
3236
  });
@@ -3204,6 +3260,7 @@ var SpectreDropdownElement = class extends SpectreBaseElement {
3204
3260
  };
3205
3261
  SpectreDropdownElement.properties = {
3206
3262
  fullWidth: { attribute: "full-width", type: Boolean, reflect: true },
3263
+ mega: { type: Boolean, reflect: true },
3207
3264
  open: { type: Boolean, reflect: true },
3208
3265
  placement: { type: String, reflect: true },
3209
3266
  triggerLabel: { attribute: "trigger-label", type: String }
@@ -3221,6 +3278,7 @@ var SpectreFooterElement = class extends SpectreProjectableElement {
3221
3278
  super(...arguments);
3222
3279
  this.bordered = false;
3223
3280
  this.fullWidth = false;
3281
+ this.innerClass = void 0;
3224
3282
  }
3225
3283
  get id() {
3226
3284
  return super.id;
@@ -3234,6 +3292,11 @@ var SpectreFooterElement = class extends SpectreProjectableElement {
3234
3292
  set title(value) {
3235
3293
  super.title = value;
3236
3294
  }
3295
+ connectedCallback() {
3296
+ var _a;
3297
+ super.connectedCallback();
3298
+ (_a = this.style).display || (_a.display = "block");
3299
+ }
3237
3300
  getContentContainer() {
3238
3301
  return this.querySelector("[data-sp-footer-native]");
3239
3302
  }
@@ -3253,10 +3316,12 @@ var SpectreFooterElement = class extends SpectreProjectableElement {
3253
3316
  }
3254
3317
  }
3255
3318
  get footerClasses() {
3256
- return spectreUi.getFooterClasses({
3319
+ const recipeClasses = spectreUi.getFooterClasses({
3257
3320
  bordered: this.bordered ?? false,
3258
3321
  fullWidth: this.fullWidth ?? false
3259
3322
  });
3323
+ const utilityClasses = sanitizeUtilityClasses(this.innerClass);
3324
+ return utilityClasses ? `${recipeClasses} ${utilityClasses}` : recipeClasses;
3260
3325
  }
3261
3326
  render() {
3262
3327
  return lit.html`<footer
@@ -3272,7 +3337,8 @@ var SpectreFooterElement = class extends SpectreProjectableElement {
3272
3337
  };
3273
3338
  SpectreFooterElement.properties = {
3274
3339
  bordered: { type: Boolean, reflect: true },
3275
- fullWidth: { attribute: "full-width", type: Boolean, reflect: true }
3340
+ fullWidth: { attribute: "full-width", type: Boolean, reflect: true },
3341
+ innerClass: { attribute: "inner-class", type: String }
3276
3342
  };
3277
3343
  function defineSpectreFooter(tagName = "sp-footer") {
3278
3344
  const existingElement = customElements.get(tagName);
@@ -3454,6 +3520,7 @@ var SpectreNavElement = class extends SpectreProjectableElement {
3454
3520
  super(...arguments);
3455
3521
  this.bordered = false;
3456
3522
  this.fullWidth = false;
3523
+ this.innerClass = void 0;
3457
3524
  this.sticky = false;
3458
3525
  }
3459
3526
  get id() {
@@ -3468,6 +3535,11 @@ var SpectreNavElement = class extends SpectreProjectableElement {
3468
3535
  set title(value) {
3469
3536
  super.title = value;
3470
3537
  }
3538
+ connectedCallback() {
3539
+ var _a;
3540
+ super.connectedCallback();
3541
+ (_a = this.style).display || (_a.display = "block");
3542
+ }
3471
3543
  getContentContainer() {
3472
3544
  return this.querySelector("[data-sp-nav-native]");
3473
3545
  }
@@ -3490,11 +3562,13 @@ var SpectreNavElement = class extends SpectreProjectableElement {
3490
3562
  }
3491
3563
  }
3492
3564
  get navClasses() {
3493
- return spectreUi.getNavClasses({
3565
+ const recipeClasses = spectreUi.getNavClasses({
3494
3566
  bordered: this.bordered ?? false,
3495
3567
  fullWidth: this.fullWidth ?? false,
3496
3568
  sticky: this.sticky ?? false
3497
3569
  });
3570
+ const utilityClasses = sanitizeUtilityClasses(this.innerClass);
3571
+ return utilityClasses ? `${recipeClasses} ${utilityClasses}` : recipeClasses;
3498
3572
  }
3499
3573
  render() {
3500
3574
  return lit.html`<nav
@@ -3511,6 +3585,7 @@ var SpectreNavElement = class extends SpectreProjectableElement {
3511
3585
  SpectreNavElement.properties = {
3512
3586
  bordered: { type: Boolean, reflect: true },
3513
3587
  fullWidth: { attribute: "full-width", type: Boolean, reflect: true },
3588
+ innerClass: { attribute: "inner-class", type: String },
3514
3589
  sticky: { type: Boolean, reflect: true }
3515
3590
  };
3516
3591
  function defineSpectreNav(tagName = "sp-nav") {
@@ -3527,6 +3602,7 @@ var SpectreNavItemElement = class extends SpectreBaseElement {
3527
3602
  this.dropdown = false;
3528
3603
  this.href = void 0;
3529
3604
  this.label = void 0;
3605
+ this.mega = false;
3530
3606
  this.open = false;
3531
3607
  this.placement = "bottom-start";
3532
3608
  this.triggerContent = [];
@@ -3629,6 +3705,9 @@ var SpectreNavItemElement = class extends SpectreBaseElement {
3629
3705
  if (changedProperties.has("dropdown") && this.dropdown == null) {
3630
3706
  this.dropdown = false;
3631
3707
  }
3708
+ if (changedProperties.has("mega") && this.mega == null) {
3709
+ this.mega = false;
3710
+ }
3632
3711
  if (changedProperties.has("open") && this.open == null) {
3633
3712
  this.open = false;
3634
3713
  }
@@ -3661,10 +3740,11 @@ var SpectreNavItemElement = class extends SpectreBaseElement {
3661
3740
  this.dispatchEvent(new CustomEvent("sp-close", { bubbles: true }));
3662
3741
  }
3663
3742
  get wrapperClasses() {
3664
- return spectreUi.getDropdownClasses();
3743
+ return spectreUi.getDropdownClasses({ mega: this.mega ?? false });
3665
3744
  }
3666
3745
  get menuClasses() {
3667
3746
  return spectreUi.getDropdownMenuClasses({
3747
+ mega: this.mega ?? false,
3668
3748
  open: this.open ?? false,
3669
3749
  placement: this.placement
3670
3750
  });
@@ -3712,6 +3792,7 @@ SpectreNavItemElement.properties = {
3712
3792
  dropdown: { type: Boolean, reflect: true },
3713
3793
  href: { type: String },
3714
3794
  label: { type: String },
3795
+ mega: { type: Boolean, reflect: true },
3715
3796
  open: { type: Boolean, reflect: true },
3716
3797
  placement: { type: String, reflect: true }
3717
3798
  };
@@ -3727,6 +3808,7 @@ var SpectreSidebarElement = class extends SpectreProjectableElement {
3727
3808
  constructor() {
3728
3809
  super(...arguments);
3729
3810
  this.bordered = false;
3811
+ this.hideToggle = false;
3730
3812
  this.open = false;
3731
3813
  this.toggleLabel = "Toggle sidebar";
3732
3814
  this.handleDocumentKeydown = (event) => {
@@ -3761,6 +3843,9 @@ var SpectreSidebarElement = class extends SpectreProjectableElement {
3761
3843
  if (changedProperties.has("bordered") && this.bordered == null) {
3762
3844
  this.bordered = false;
3763
3845
  }
3846
+ if (changedProperties.has("hideToggle") && this.hideToggle == null) {
3847
+ this.hideToggle = false;
3848
+ }
3764
3849
  if (changedProperties.has("open") && this.open == null) {
3765
3850
  this.open = false;
3766
3851
  }
@@ -3813,16 +3898,16 @@ var SpectreSidebarElement = class extends SpectreProjectableElement {
3813
3898
  return spectreUi.getSidebarClasses({ bordered: this.bordered ?? false });
3814
3899
  }
3815
3900
  render() {
3816
- return lit.html`<button
3817
- aria-expanded="${this.open ? "true" : "false"}"
3818
- aria-label="${ifDefined_js.ifDefined(this.toggleLabel)}"
3819
- class="${spectreUi.getSidebarToggleClasses()}"
3820
- data-sp-sidebar-toggle
3821
- type="button"
3822
- @click="${() => this.toggle()}"
3823
- >
3824
- &#9776;
3825
- </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>`}
3826
3911
  <div
3827
3912
  class="${spectreUi.getSidebarBackdropClasses()}"
3828
3913
  data-sp-sidebar-backdrop
@@ -3841,6 +3926,7 @@ var SpectreSidebarElement = class extends SpectreProjectableElement {
3841
3926
  };
3842
3927
  SpectreSidebarElement.properties = {
3843
3928
  bordered: { type: Boolean, reflect: true },
3929
+ hideToggle: { attribute: "hide-toggle", type: Boolean, reflect: true },
3844
3930
  open: { type: Boolean, reflect: false },
3845
3931
  toggleLabel: { attribute: "toggle-label", type: String }
3846
3932
  };
@@ -3852,6 +3938,119 @@ function defineSpectreSidebar(tagName = "sp-sidebar") {
3852
3938
  customElements.define(tagName, SpectreSidebarElement);
3853
3939
  return SpectreSidebarElement;
3854
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
+ }
3855
4054
  var SpectreToastElement = class extends SpectreBaseElement {
3856
4055
  constructor() {
3857
4056
  super(...arguments);
@@ -4290,6 +4489,7 @@ function defineSpectreComponents() {
4290
4489
  defineSpectreNav();
4291
4490
  defineSpectreNavItem();
4292
4491
  defineSpectreSidebar();
4492
+ defineSpectreSidebarToggle();
4293
4493
  defineSpectreToast();
4294
4494
  defineSpectreTooltip();
4295
4495
  defineSpectreText();
@@ -4318,6 +4518,7 @@ exports.SpectreRatingElement = SpectreRatingElement;
4318
4518
  exports.SpectreSectionElement = SpectreSectionElement;
4319
4519
  exports.SpectreSelectElement = SpectreSelectElement;
4320
4520
  exports.SpectreSidebarElement = SpectreSidebarElement;
4521
+ exports.SpectreSidebarToggleElement = SpectreSidebarToggleElement;
4321
4522
  exports.SpectreSpinnerElement = SpectreSpinnerElement;
4322
4523
  exports.SpectreStackElement = SpectreStackElement;
4323
4524
  exports.SpectreTagElement = SpectreTagElement;
@@ -4350,6 +4551,7 @@ exports.defineSpectreRating = defineSpectreRating;
4350
4551
  exports.defineSpectreSection = defineSpectreSection;
4351
4552
  exports.defineSpectreSelect = defineSpectreSelect;
4352
4553
  exports.defineSpectreSidebar = defineSpectreSidebar;
4554
+ exports.defineSpectreSidebarToggle = defineSpectreSidebarToggle;
4353
4555
  exports.defineSpectreSpinner = defineSpectreSpinner;
4354
4556
  exports.defineSpectreStack = defineSpectreStack;
4355
4557
  exports.defineSpectreTag = defineSpectreTag;