@phcdevworks/spectre-components 1.11.0 → 1.14.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 (102) hide show
  1. package/README.md +111 -51
  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.map +1 -1
  25. package/dist/container.d.cts +2 -2
  26. package/dist/container.d.ts +2 -2
  27. package/dist/container.js.map +1 -1
  28. package/dist/dropdown.cjs.map +1 -1
  29. package/dist/dropdown.d.cts +2 -2
  30. package/dist/dropdown.d.ts +2 -2
  31. package/dist/dropdown.js.map +1 -1
  32. package/dist/{form-JrKDonG4.d.cts → form-BGQjgJrL.d.cts} +10 -1
  33. package/dist/{form-JrKDonG4.d.ts → form-BGQjgJrL.d.ts} +10 -1
  34. package/dist/grid.cjs +36 -2
  35. package/dist/grid.cjs.map +1 -1
  36. package/dist/grid.d.cts +7 -2
  37. package/dist/grid.d.ts +7 -2
  38. package/dist/grid.js +36 -2
  39. package/dist/grid.js.map +1 -1
  40. package/dist/icon-box.cjs.map +1 -1
  41. package/dist/icon-box.d.cts +2 -2
  42. package/dist/icon-box.d.ts +2 -2
  43. package/dist/icon-box.js.map +1 -1
  44. package/dist/index.cjs +281 -2
  45. package/dist/index.cjs.map +1 -1
  46. package/dist/index.d.cts +3 -2
  47. package/dist/index.d.ts +3 -2
  48. package/dist/index.js +281 -4
  49. package/dist/index.js.map +1 -1
  50. package/dist/input.cjs.map +1 -1
  51. package/dist/input.d.cts +2 -2
  52. package/dist/input.d.ts +2 -2
  53. package/dist/input.js.map +1 -1
  54. package/dist/nav-item.cjs +500 -0
  55. package/dist/nav-item.cjs.map +1 -0
  56. package/dist/nav-item.d.cts +74 -0
  57. package/dist/nav-item.d.ts +74 -0
  58. package/dist/nav-item.js +497 -0
  59. package/dist/nav-item.js.map +1 -0
  60. package/dist/rating.cjs.map +1 -1
  61. package/dist/rating.d.cts +2 -2
  62. package/dist/rating.d.ts +2 -2
  63. package/dist/rating.js.map +1 -1
  64. package/dist/select.cjs.map +1 -1
  65. package/dist/select.d.cts +1 -1
  66. package/dist/select.d.ts +1 -1
  67. package/dist/select.js.map +1 -1
  68. package/dist/spinner.cjs.map +1 -1
  69. package/dist/spinner.d.cts +2 -2
  70. package/dist/spinner.d.ts +2 -2
  71. package/dist/spinner.js.map +1 -1
  72. package/dist/stack.cjs.map +1 -1
  73. package/dist/stack.d.cts +2 -2
  74. package/dist/stack.d.ts +2 -2
  75. package/dist/stack.js.map +1 -1
  76. package/dist/tag.cjs.map +1 -1
  77. package/dist/tag.d.cts +2 -2
  78. package/dist/tag.d.ts +2 -2
  79. package/dist/tag.js.map +1 -1
  80. package/dist/testimonial.cjs.map +1 -1
  81. package/dist/testimonial.d.cts +2 -2
  82. package/dist/testimonial.d.ts +2 -2
  83. package/dist/testimonial.js.map +1 -1
  84. package/dist/text.cjs +16 -0
  85. package/dist/text.cjs.map +1 -1
  86. package/dist/text.d.cts +8 -2
  87. package/dist/text.d.ts +8 -2
  88. package/dist/text.js +16 -0
  89. package/dist/text.js.map +1 -1
  90. package/dist/textarea.cjs.map +1 -1
  91. package/dist/textarea.d.cts +1 -1
  92. package/dist/textarea.d.ts +1 -1
  93. package/dist/textarea.js.map +1 -1
  94. package/dist/toast.cjs.map +1 -1
  95. package/dist/toast.d.cts +2 -2
  96. package/dist/toast.d.ts +2 -2
  97. package/dist/toast.js.map +1 -1
  98. package/dist/tooltip.cjs.map +1 -1
  99. package/dist/tooltip.d.cts +2 -2
  100. package/dist/tooltip.d.ts +2 -2
  101. package/dist/tooltip.js.map +1 -1
  102. package/package.json +16 -11
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,6 +273,17 @@ 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;
@@ -624,6 +662,9 @@ var SpectreButtonElement = class extends SpectreProjectableElement {
624
662
  set autofocus(value) {
625
663
  super.autofocus = value;
626
664
  }
665
+ get isLink() {
666
+ return Boolean(this.href) && !this.isDisabled;
667
+ }
627
668
  getContentContainer() {
628
669
  return this.querySelector("[data-sp-button-native]");
629
670
  }
@@ -707,12 +748,30 @@ var SpectreButtonElement = class extends SpectreProjectableElement {
707
748
  >` : lit.nothing;
708
749
  }
709
750
  render() {
751
+ if (this.isLink) {
752
+ return lit.html`<a
753
+ aria-busy="${this.loading ? "true" : "false"}"
754
+ aria-describedby="${ifDefined_js.ifDefined(this.forwardedAriaDescribedBy)}"
755
+ aria-label="${ifDefined_js.ifDefined(this.forwardedAriaLabel)}"
756
+ aria-labelledby="${ifDefined_js.ifDefined(this.forwardedAriaLabelledBy)}"
757
+ class="${this.buttonClasses}"
758
+ data-sp-button-native
759
+ href="${ifDefined_js.ifDefined(this.href)}"
760
+ id="${ifDefined_js.ifDefined(this.id || void 0)}"
761
+ rel="${ifDefined_js.ifDefined(this.rel || void 0)}"
762
+ target="${ifDefined_js.ifDefined(this.target || void 0)}"
763
+ title="${ifDefined_js.ifDefined(this.title || void 0)}"
764
+ >
765
+ ${this.renderButtonContent()}
766
+ </a>`;
767
+ }
710
768
  return lit.html`<button
711
769
  aria-busy="${this.loading ? "true" : "false"}"
712
770
  aria-describedby="${ifDefined_js.ifDefined(this.forwardedAriaDescribedBy)}"
713
771
  aria-label="${ifDefined_js.ifDefined(this.forwardedAriaLabel)}"
714
772
  aria-labelledby="${ifDefined_js.ifDefined(this.forwardedAriaLabelledBy)}"
715
773
  ?autofocus="${this.autofocus}"
774
+ aria-disabled="${ifDefined_js.ifDefined(this.href && this.isDisabled ? "true" : void 0)}"
716
775
  class="${this.buttonClasses}"
717
776
  data-sp-button-native
718
777
  ?disabled="${this.isDisabled}"
@@ -731,13 +790,16 @@ SpectreButtonElement.properties = {
731
790
  disabled: { type: Boolean, reflect: true },
732
791
  form: { type: String },
733
792
  fullWidth: { attribute: "full-width", type: Boolean, reflect: true },
793
+ href: { type: String, reflect: true },
734
794
  iconOnly: { attribute: "icon-only", type: Boolean, reflect: true },
735
795
  label: { type: String, reflect: true },
736
796
  loading: { type: Boolean, reflect: true },
737
797
  loadingLabel: { attribute: "loading-label", type: String, reflect: true },
738
798
  name: { type: String, reflect: true },
739
799
  pill: { type: Boolean, reflect: true },
800
+ rel: { type: String },
740
801
  size: { type: String, reflect: true },
802
+ target: { type: String },
741
803
  type: { type: String, reflect: true },
742
804
  variant: { type: String, reflect: true },
743
805
  value: { type: String }
@@ -2805,11 +2867,17 @@ var SpectreGridElement = class extends SpectreProjectableElement {
2805
2867
  if (changedProperties.has("gap") && (this.gap == null || !isGridGap(this.gap))) {
2806
2868
  this.gap = "md";
2807
2869
  }
2870
+ if (changedProperties.has("span") && this.span !== void 0 && !isGridSpan(this.span) && !isGridSpanOptions(this.span)) {
2871
+ this.span = void 0;
2872
+ }
2808
2873
  }
2809
2874
  get gridClasses() {
2810
2875
  return spectreUi.getGridClasses({
2811
2876
  columns: this.columns,
2812
- gap: this.gap
2877
+ gap: this.gap,
2878
+ ...this.span !== void 0 && {
2879
+ span: this.span
2880
+ }
2813
2881
  });
2814
2882
  }
2815
2883
  render() {
@@ -2828,7 +2896,8 @@ var SpectreGridElement = class extends SpectreProjectableElement {
2828
2896
  };
2829
2897
  SpectreGridElement.properties = {
2830
2898
  columns: { type: Number, reflect: true },
2831
- gap: { type: String, reflect: true }
2899
+ gap: { type: String, reflect: true },
2900
+ span: { type: Object }
2832
2901
  };
2833
2902
  function defineSpectreGrid(tagName = "sp-grid") {
2834
2903
  const existingElement = customElements.get(tagName);
@@ -3452,6 +3521,208 @@ function defineSpectreNav(tagName = "sp-nav") {
3452
3521
  customElements.define(tagName, SpectreNavElement);
3453
3522
  return SpectreNavElement;
3454
3523
  }
3524
+ var SpectreNavItemElement = class extends SpectreBaseElement {
3525
+ constructor() {
3526
+ super(...arguments);
3527
+ this.dropdown = false;
3528
+ this.href = void 0;
3529
+ this.label = void 0;
3530
+ this.open = false;
3531
+ this.placement = "bottom-start";
3532
+ this.triggerContent = [];
3533
+ this.menuContent = [];
3534
+ this.handleDocumentClick = (event) => {
3535
+ if (!this.open) {
3536
+ return;
3537
+ }
3538
+ if (!event.composedPath().includes(this)) {
3539
+ this.close();
3540
+ }
3541
+ };
3542
+ this.handleDocumentKeydown = (event) => {
3543
+ if (event.key === "Escape" && this.open) {
3544
+ this.close();
3545
+ this.triggerElement?.focus();
3546
+ }
3547
+ };
3548
+ }
3549
+ get id() {
3550
+ return super.id;
3551
+ }
3552
+ set id(value) {
3553
+ super.id = value;
3554
+ }
3555
+ get title() {
3556
+ return super.title;
3557
+ }
3558
+ set title(value) {
3559
+ super.title = value;
3560
+ }
3561
+ isInternalNode(node) {
3562
+ if (node.nodeType !== Node.ELEMENT_NODE) {
3563
+ return false;
3564
+ }
3565
+ const el = node;
3566
+ return el.hasAttribute("data-sp-nav-item-menu") || el.hasAttribute("data-sp-nav-item-trigger");
3567
+ }
3568
+ syncProjectedContent() {
3569
+ const nextTriggerContent = [];
3570
+ const nextMenuContent = [];
3571
+ this.childNodes.forEach((node) => {
3572
+ if (this.isInternalNode(node)) {
3573
+ return;
3574
+ }
3575
+ const isTriggerSlot = node.nodeType === Node.ELEMENT_NODE && node.getAttribute("slot") === "trigger";
3576
+ if (isTriggerSlot) {
3577
+ nextTriggerContent.push(node);
3578
+ } else {
3579
+ nextMenuContent.push(node);
3580
+ }
3581
+ });
3582
+ 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]);
3583
+ if (changed) {
3584
+ this.triggerContent = nextTriggerContent;
3585
+ this.menuContent = nextMenuContent;
3586
+ }
3587
+ return changed;
3588
+ }
3589
+ get hasTriggerContent() {
3590
+ return hasMeaningfulContent(this.triggerContent);
3591
+ }
3592
+ get hasMenuContent() {
3593
+ return hasMeaningfulContent(this.menuContent);
3594
+ }
3595
+ connectedCallback() {
3596
+ super.connectedCallback();
3597
+ this.syncProjectedContent();
3598
+ this.startContentObserver();
3599
+ document.addEventListener("click", this.handleDocumentClick);
3600
+ document.addEventListener("keydown", this.handleDocumentKeydown);
3601
+ }
3602
+ disconnectedCallback() {
3603
+ this.stopContentObserver();
3604
+ document.removeEventListener("click", this.handleDocumentClick);
3605
+ document.removeEventListener("keydown", this.handleDocumentKeydown);
3606
+ super.disconnectedCallback();
3607
+ }
3608
+ update(changedProperties) {
3609
+ this.stopContentObserver();
3610
+ super.update(changedProperties);
3611
+ this.startContentObserver();
3612
+ }
3613
+ startContentObserver() {
3614
+ if (this.contentObserver) {
3615
+ return;
3616
+ }
3617
+ this.contentObserver = new MutationObserver(() => {
3618
+ if (this.syncProjectedContent()) {
3619
+ this.requestUpdate();
3620
+ }
3621
+ });
3622
+ this.contentObserver.observe(this, { childList: true });
3623
+ }
3624
+ stopContentObserver() {
3625
+ this.contentObserver?.disconnect();
3626
+ this.contentObserver = void 0;
3627
+ }
3628
+ willUpdate(changedProperties) {
3629
+ if (changedProperties.has("dropdown") && this.dropdown == null) {
3630
+ this.dropdown = false;
3631
+ }
3632
+ if (changedProperties.has("open") && this.open == null) {
3633
+ this.open = false;
3634
+ }
3635
+ if (changedProperties.has("placement") && (this.placement == null || !isDropdownPlacement(this.placement))) {
3636
+ this.placement = "bottom-start";
3637
+ }
3638
+ }
3639
+ get triggerElement() {
3640
+ return this.querySelector("[data-sp-nav-item-trigger]");
3641
+ }
3642
+ toggle() {
3643
+ if (this.open) {
3644
+ this.close();
3645
+ } else {
3646
+ this.openMenu();
3647
+ }
3648
+ }
3649
+ openMenu() {
3650
+ if (this.open) {
3651
+ return;
3652
+ }
3653
+ this.open = true;
3654
+ this.dispatchEvent(new CustomEvent("sp-open", { bubbles: true }));
3655
+ }
3656
+ close() {
3657
+ if (!this.open) {
3658
+ return;
3659
+ }
3660
+ this.open = false;
3661
+ this.dispatchEvent(new CustomEvent("sp-close", { bubbles: true }));
3662
+ }
3663
+ get wrapperClasses() {
3664
+ return spectreUi.getDropdownClasses();
3665
+ }
3666
+ get menuClasses() {
3667
+ return spectreUi.getDropdownMenuClasses({
3668
+ open: this.open ?? false,
3669
+ placement: this.placement
3670
+ });
3671
+ }
3672
+ get navLinkClasses() {
3673
+ return spectreUi.getNavLinkClasses();
3674
+ }
3675
+ renderLink() {
3676
+ return lit.html`<a
3677
+ aria-label="${ifDefined_js.ifDefined(this.forwardedAriaLabel)}"
3678
+ class="${this.navLinkClasses}"
3679
+ href="${ifDefined_js.ifDefined(this.href)}"
3680
+ id="${ifDefined_js.ifDefined(this.id || void 0)}"
3681
+ title="${ifDefined_js.ifDefined(this.title || void 0)}"
3682
+ >${this.hasMenuContent ? this.menuContent : this.label}</a
3683
+ >`;
3684
+ }
3685
+ renderDropdown() {
3686
+ return lit.html`<div
3687
+ class="${this.wrapperClasses}"
3688
+ id="${ifDefined_js.ifDefined(this.id || void 0)}"
3689
+ title="${ifDefined_js.ifDefined(this.title || void 0)}"
3690
+ >
3691
+ <button
3692
+ aria-expanded="${this.open ? "true" : "false"}"
3693
+ aria-haspopup="true"
3694
+ aria-label="${ifDefined_js.ifDefined(this.forwardedAriaLabel ?? this.label)}"
3695
+ class="${this.navLinkClasses}"
3696
+ data-sp-nav-item-trigger
3697
+ type="button"
3698
+ @click="${() => this.toggle()}"
3699
+ >
3700
+ ${this.hasTriggerContent ? this.triggerContent : this.label}
3701
+ </button>
3702
+ <div class="${this.menuClasses}" data-sp-nav-item-menu>
3703
+ ${this.hasMenuContent ? this.menuContent : lit.nothing}
3704
+ </div>
3705
+ </div>`;
3706
+ }
3707
+ render() {
3708
+ return this.dropdown ? this.renderDropdown() : this.renderLink();
3709
+ }
3710
+ };
3711
+ SpectreNavItemElement.properties = {
3712
+ dropdown: { type: Boolean, reflect: true },
3713
+ href: { type: String },
3714
+ label: { type: String },
3715
+ open: { type: Boolean, reflect: true },
3716
+ placement: { type: String, reflect: true }
3717
+ };
3718
+ function defineSpectreNavItem(tagName = "sp-nav-item") {
3719
+ const existingElement = customElements.get(tagName);
3720
+ if (existingElement) {
3721
+ return existingElement;
3722
+ }
3723
+ customElements.define(tagName, SpectreNavItemElement);
3724
+ return SpectreNavItemElement;
3725
+ }
3455
3726
  var SpectreSidebarElement = class extends SpectreProjectableElement {
3456
3727
  constructor() {
3457
3728
  super(...arguments);
@@ -3928,6 +4199,9 @@ var SpectreTextElement = class extends SpectreProjectableElement {
3928
4199
  if (changedProperties.has("variant") && !isTextVariant(this.variant)) {
3929
4200
  this.variant = "default";
3930
4201
  }
4202
+ if (changedProperties.has("transform") && this.transform !== void 0 && !isTextTransform(this.transform)) {
4203
+ this.transform = void 0;
4204
+ }
3931
4205
  }
3932
4206
  get id() {
3933
4207
  return super.id;
@@ -3956,6 +4230,7 @@ var SpectreTextElement = class extends SpectreProjectableElement {
3956
4230
  const textClasses = spectreUi.getTextClasses({
3957
4231
  ...this.family !== void 0 && { family: this.family },
3958
4232
  size: this.size ?? "md",
4233
+ ...this.transform !== void 0 && { transform: this.transform },
3959
4234
  variant: this.variant ?? "default"
3960
4235
  });
3961
4236
  return staticHtml_js.html`<${tag}
@@ -3973,6 +4248,7 @@ SpectreTextElement.properties = {
3973
4248
  family: { type: String, reflect: true },
3974
4249
  level: { type: String, reflect: true },
3975
4250
  size: { type: String, reflect: true },
4251
+ transform: { type: String, reflect: true },
3976
4252
  variant: { type: String, reflect: true }
3977
4253
  };
3978
4254
  function defineSpectreText(tagName = "sp-text") {
@@ -4012,6 +4288,7 @@ function defineSpectreComponents() {
4012
4288
  defineSpectreFooter();
4013
4289
  defineSpectreModal();
4014
4290
  defineSpectreNav();
4291
+ defineSpectreNavItem();
4015
4292
  defineSpectreSidebar();
4016
4293
  defineSpectreToast();
4017
4294
  defineSpectreTooltip();
@@ -4034,6 +4311,7 @@ exports.SpectreInputElement = SpectreInputElement;
4034
4311
  exports.SpectreLabelElement = SpectreLabelElement;
4035
4312
  exports.SpectreModalElement = SpectreModalElement;
4036
4313
  exports.SpectreNavElement = SpectreNavElement;
4314
+ exports.SpectreNavItemElement = SpectreNavItemElement;
4037
4315
  exports.SpectrePricingCardElement = SpectrePricingCardElement;
4038
4316
  exports.SpectreRadioElement = SpectreRadioElement;
4039
4317
  exports.SpectreRatingElement = SpectreRatingElement;
@@ -4065,6 +4343,7 @@ exports.defineSpectreInput = defineSpectreInput;
4065
4343
  exports.defineSpectreLabel = defineSpectreLabel;
4066
4344
  exports.defineSpectreModal = defineSpectreModal;
4067
4345
  exports.defineSpectreNav = defineSpectreNav;
4346
+ exports.defineSpectreNavItem = defineSpectreNavItem;
4068
4347
  exports.defineSpectrePricingCard = defineSpectrePricingCard;
4069
4348
  exports.defineSpectreRadio = defineSpectreRadio;
4070
4349
  exports.defineSpectreRating = defineSpectreRating;