@phcdevworks/spectre-components 1.11.0 → 1.12.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.
package/dist/index.d.cts CHANGED
@@ -25,6 +25,7 @@ export { SpectreDropdownElement, SpectreDropdownProps, defineSpectreDropdown } f
25
25
  export { SpectreFooterElement, SpectreFooterProps, defineSpectreFooter } from './footer.cjs';
26
26
  export { SpectreModalElement, SpectreModalProps, defineSpectreModal } from './modal.cjs';
27
27
  export { SpectreNavElement, SpectreNavProps, defineSpectreNav } from './nav.cjs';
28
+ export { SpectreNavItemElement, SpectreNavItemProps, defineSpectreNavItem } from './nav-item.cjs';
28
29
  export { SpectreSidebarElement, SpectreSidebarProps, defineSpectreSidebar } from './sidebar.cjs';
29
30
  export { SpectreToastElement, SpectreToastProps, defineSpectreToast } from './toast.cjs';
30
31
  export { SpectreTooltipElement, SpectreTooltipProps, defineSpectreTooltip } from './tooltip.cjs';
package/dist/index.d.ts CHANGED
@@ -25,6 +25,7 @@ export { SpectreDropdownElement, SpectreDropdownProps, defineSpectreDropdown } f
25
25
  export { SpectreFooterElement, SpectreFooterProps, defineSpectreFooter } from './footer.js';
26
26
  export { SpectreModalElement, SpectreModalProps, defineSpectreModal } from './modal.js';
27
27
  export { SpectreNavElement, SpectreNavProps, defineSpectreNav } from './nav.js';
28
+ export { SpectreNavItemElement, SpectreNavItemProps, defineSpectreNavItem } from './nav-item.js';
28
29
  export { SpectreSidebarElement, SpectreSidebarProps, defineSpectreSidebar } from './sidebar.js';
29
30
  export { SpectreToastElement, SpectreToastProps, defineSpectreToast } from './toast.js';
30
31
  export { SpectreTooltipElement, SpectreTooltipProps, defineSpectreTooltip } from './tooltip.js';
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
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, getFooterClasses, getModalOverlayClasses, getModalClasses, getNavClasses, getSidebarClasses, getSidebarToggleClasses, getSidebarBackdropClasses, getToastClasses, getToastIconClasses, getTooltipClasses, getTextClasses, getSectionClasses } 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, getFooterClasses, getModalOverlayClasses, getModalClasses, getNavClasses, getNavLinkClasses, getSidebarClasses, getSidebarToggleClasses, getSidebarBackdropClasses, getToastClasses, getToastIconClasses, getTooltipClasses, getTextClasses, 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';
@@ -3450,6 +3450,208 @@ function defineSpectreNav(tagName = "sp-nav") {
3450
3450
  customElements.define(tagName, SpectreNavElement);
3451
3451
  return SpectreNavElement;
3452
3452
  }
3453
+ var SpectreNavItemElement = class extends SpectreBaseElement {
3454
+ constructor() {
3455
+ super(...arguments);
3456
+ this.dropdown = false;
3457
+ this.href = void 0;
3458
+ this.label = void 0;
3459
+ this.open = false;
3460
+ this.placement = "bottom-start";
3461
+ this.triggerContent = [];
3462
+ this.menuContent = [];
3463
+ this.handleDocumentClick = (event) => {
3464
+ if (!this.open) {
3465
+ return;
3466
+ }
3467
+ if (!event.composedPath().includes(this)) {
3468
+ this.close();
3469
+ }
3470
+ };
3471
+ this.handleDocumentKeydown = (event) => {
3472
+ if (event.key === "Escape" && this.open) {
3473
+ this.close();
3474
+ this.triggerElement?.focus();
3475
+ }
3476
+ };
3477
+ }
3478
+ get id() {
3479
+ return super.id;
3480
+ }
3481
+ set id(value) {
3482
+ super.id = value;
3483
+ }
3484
+ get title() {
3485
+ return super.title;
3486
+ }
3487
+ set title(value) {
3488
+ super.title = value;
3489
+ }
3490
+ isInternalNode(node) {
3491
+ if (node.nodeType !== Node.ELEMENT_NODE) {
3492
+ return false;
3493
+ }
3494
+ const el = node;
3495
+ return el.hasAttribute("data-sp-nav-item-menu") || el.hasAttribute("data-sp-nav-item-trigger");
3496
+ }
3497
+ syncProjectedContent() {
3498
+ const nextTriggerContent = [];
3499
+ const nextMenuContent = [];
3500
+ this.childNodes.forEach((node) => {
3501
+ if (this.isInternalNode(node)) {
3502
+ return;
3503
+ }
3504
+ const isTriggerSlot = node.nodeType === Node.ELEMENT_NODE && node.getAttribute("slot") === "trigger";
3505
+ if (isTriggerSlot) {
3506
+ nextTriggerContent.push(node);
3507
+ } else {
3508
+ nextMenuContent.push(node);
3509
+ }
3510
+ });
3511
+ 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]);
3512
+ if (changed) {
3513
+ this.triggerContent = nextTriggerContent;
3514
+ this.menuContent = nextMenuContent;
3515
+ }
3516
+ return changed;
3517
+ }
3518
+ get hasTriggerContent() {
3519
+ return hasMeaningfulContent(this.triggerContent);
3520
+ }
3521
+ get hasMenuContent() {
3522
+ return hasMeaningfulContent(this.menuContent);
3523
+ }
3524
+ connectedCallback() {
3525
+ super.connectedCallback();
3526
+ this.syncProjectedContent();
3527
+ this.startContentObserver();
3528
+ document.addEventListener("click", this.handleDocumentClick);
3529
+ document.addEventListener("keydown", this.handleDocumentKeydown);
3530
+ }
3531
+ disconnectedCallback() {
3532
+ this.stopContentObserver();
3533
+ document.removeEventListener("click", this.handleDocumentClick);
3534
+ document.removeEventListener("keydown", this.handleDocumentKeydown);
3535
+ super.disconnectedCallback();
3536
+ }
3537
+ update(changedProperties) {
3538
+ this.stopContentObserver();
3539
+ super.update(changedProperties);
3540
+ this.startContentObserver();
3541
+ }
3542
+ startContentObserver() {
3543
+ if (this.contentObserver) {
3544
+ return;
3545
+ }
3546
+ this.contentObserver = new MutationObserver(() => {
3547
+ if (this.syncProjectedContent()) {
3548
+ this.requestUpdate();
3549
+ }
3550
+ });
3551
+ this.contentObserver.observe(this, { childList: true });
3552
+ }
3553
+ stopContentObserver() {
3554
+ this.contentObserver?.disconnect();
3555
+ this.contentObserver = void 0;
3556
+ }
3557
+ willUpdate(changedProperties) {
3558
+ if (changedProperties.has("dropdown") && this.dropdown == null) {
3559
+ this.dropdown = false;
3560
+ }
3561
+ if (changedProperties.has("open") && this.open == null) {
3562
+ this.open = false;
3563
+ }
3564
+ if (changedProperties.has("placement") && (this.placement == null || !isDropdownPlacement(this.placement))) {
3565
+ this.placement = "bottom-start";
3566
+ }
3567
+ }
3568
+ get triggerElement() {
3569
+ return this.querySelector("[data-sp-nav-item-trigger]");
3570
+ }
3571
+ toggle() {
3572
+ if (this.open) {
3573
+ this.close();
3574
+ } else {
3575
+ this.openMenu();
3576
+ }
3577
+ }
3578
+ openMenu() {
3579
+ if (this.open) {
3580
+ return;
3581
+ }
3582
+ this.open = true;
3583
+ this.dispatchEvent(new CustomEvent("sp-open", { bubbles: true }));
3584
+ }
3585
+ close() {
3586
+ if (!this.open) {
3587
+ return;
3588
+ }
3589
+ this.open = false;
3590
+ this.dispatchEvent(new CustomEvent("sp-close", { bubbles: true }));
3591
+ }
3592
+ get wrapperClasses() {
3593
+ return getDropdownClasses();
3594
+ }
3595
+ get menuClasses() {
3596
+ return getDropdownMenuClasses({
3597
+ open: this.open ?? false,
3598
+ placement: this.placement
3599
+ });
3600
+ }
3601
+ get navLinkClasses() {
3602
+ return getNavLinkClasses();
3603
+ }
3604
+ renderLink() {
3605
+ return html`<a
3606
+ aria-label="${ifDefined(this.forwardedAriaLabel)}"
3607
+ class="${this.navLinkClasses}"
3608
+ href="${ifDefined(this.href)}"
3609
+ id="${ifDefined(this.id || void 0)}"
3610
+ title="${ifDefined(this.title || void 0)}"
3611
+ >${this.hasMenuContent ? this.menuContent : this.label}</a
3612
+ >`;
3613
+ }
3614
+ renderDropdown() {
3615
+ return html`<div
3616
+ class="${this.wrapperClasses}"
3617
+ id="${ifDefined(this.id || void 0)}"
3618
+ title="${ifDefined(this.title || void 0)}"
3619
+ >
3620
+ <button
3621
+ aria-expanded="${this.open ? "true" : "false"}"
3622
+ aria-haspopup="true"
3623
+ aria-label="${ifDefined(this.forwardedAriaLabel ?? this.label)}"
3624
+ class="${this.navLinkClasses}"
3625
+ data-sp-nav-item-trigger
3626
+ type="button"
3627
+ @click="${() => this.toggle()}"
3628
+ >
3629
+ ${this.hasTriggerContent ? this.triggerContent : this.label}
3630
+ </button>
3631
+ <div class="${this.menuClasses}" data-sp-nav-item-menu>
3632
+ ${this.hasMenuContent ? this.menuContent : nothing}
3633
+ </div>
3634
+ </div>`;
3635
+ }
3636
+ render() {
3637
+ return this.dropdown ? this.renderDropdown() : this.renderLink();
3638
+ }
3639
+ };
3640
+ SpectreNavItemElement.properties = {
3641
+ dropdown: { type: Boolean, reflect: true },
3642
+ href: { type: String },
3643
+ label: { type: String },
3644
+ open: { type: Boolean, reflect: true },
3645
+ placement: { type: String, reflect: true }
3646
+ };
3647
+ function defineSpectreNavItem(tagName = "sp-nav-item") {
3648
+ const existingElement = customElements.get(tagName);
3649
+ if (existingElement) {
3650
+ return existingElement;
3651
+ }
3652
+ customElements.define(tagName, SpectreNavItemElement);
3653
+ return SpectreNavItemElement;
3654
+ }
3453
3655
  var SpectreSidebarElement = class extends SpectreProjectableElement {
3454
3656
  constructor() {
3455
3657
  super(...arguments);
@@ -4010,12 +4212,13 @@ function defineSpectreComponents() {
4010
4212
  defineSpectreFooter();
4011
4213
  defineSpectreModal();
4012
4214
  defineSpectreNav();
4215
+ defineSpectreNavItem();
4013
4216
  defineSpectreSidebar();
4014
4217
  defineSpectreToast();
4015
4218
  defineSpectreTooltip();
4016
4219
  defineSpectreText();
4017
4220
  }
4018
4221
 
4019
- export { SpectreAlertElement, SpectreAvatarElement, SpectreBadgeElement, SpectreButtonElement, SpectreCardElement, SpectreCheckboxElement, SpectreContainerElement, SpectreDropdownElement, SpectreFieldsetElement, SpectreFooterElement, SpectreGridElement, SpectreIconBoxElement, SpectreInputElement, SpectreLabelElement, SpectreModalElement, SpectreNavElement, SpectrePricingCardElement, SpectreRadioElement, SpectreRatingElement, SpectreSectionElement, SpectreSelectElement, SpectreSidebarElement, SpectreSpinnerElement, SpectreStackElement, SpectreTagElement, SpectreTestimonialElement, SpectreTextElement, SpectreTextareaElement, SpectreToastElement, SpectreTooltipElement, defineSpectreAlert, defineSpectreAvatar, defineSpectreBadge, defineSpectreButton, defineSpectreCard, defineSpectreCheckbox, defineSpectreComponents, defineSpectreContainer, defineSpectreDropdown, defineSpectreFieldset, defineSpectreFooter, defineSpectreGrid, defineSpectreIconBox, defineSpectreInput, defineSpectreLabel, defineSpectreModal, defineSpectreNav, defineSpectrePricingCard, defineSpectreRadio, defineSpectreRating, defineSpectreSection, defineSpectreSelect, defineSpectreSidebar, defineSpectreSpinner, defineSpectreStack, defineSpectreTag, defineSpectreTestimonial, defineSpectreText, 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, spectreTextFamilies, spectreTextLevels, spectreTextSizes, spectreTextVariants, spectreToastVariants, spectreTooltipPlacements };
4222
+ export { SpectreAlertElement, SpectreAvatarElement, SpectreBadgeElement, SpectreButtonElement, SpectreCardElement, SpectreCheckboxElement, SpectreContainerElement, SpectreDropdownElement, SpectreFieldsetElement, SpectreFooterElement, SpectreGridElement, SpectreIconBoxElement, SpectreInputElement, SpectreLabelElement, SpectreModalElement, SpectreNavElement, SpectreNavItemElement, SpectrePricingCardElement, SpectreRadioElement, SpectreRatingElement, SpectreSectionElement, SpectreSelectElement, SpectreSidebarElement, SpectreSpinnerElement, SpectreStackElement, SpectreTagElement, SpectreTestimonialElement, SpectreTextElement, SpectreTextareaElement, SpectreToastElement, SpectreTooltipElement, defineSpectreAlert, defineSpectreAvatar, defineSpectreBadge, defineSpectreButton, defineSpectreCard, defineSpectreCheckbox, defineSpectreComponents, defineSpectreContainer, defineSpectreDropdown, defineSpectreFieldset, defineSpectreFooter, defineSpectreGrid, defineSpectreIconBox, defineSpectreInput, defineSpectreLabel, defineSpectreModal, defineSpectreNav, defineSpectreNavItem, defineSpectrePricingCard, defineSpectreRadio, defineSpectreRating, defineSpectreSection, defineSpectreSelect, defineSpectreSidebar, defineSpectreSpinner, defineSpectreStack, defineSpectreTag, defineSpectreTestimonial, defineSpectreText, 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, spectreTextFamilies, spectreTextLevels, spectreTextSizes, spectreTextVariants, spectreToastVariants, spectreTooltipPlacements };
4020
4223
  //# sourceMappingURL=index.js.map
4021
4224
  //# sourceMappingURL=index.js.map