import { LitElement, html } from 'lit'; import { customElement, property, state, queryAssignedElements, } from 'lit/decorators.js'; import { classMap } from 'lit/directives/class-map.js'; import LocalNavLinkScss from './localNavLink.scss'; import '@kyndryl-design-system/shidoka-foundation/components/icon'; import chevDownIcon from '@carbon/icons/es/chevron--down/20'; /** * Link component for use in the global Side Navigation component. * @fires on-click - Captures the click event and emits the original event, level, and if default was prevented. * @slot unnamed - The default slot, for the link text. * @slot icon - Slot for an icon, level 1 links only. * @slot links - Slot for the next level of links, supports three levels. */ @customElement('kyn-local-nav-link') export class LocalNavLink extends LitElement { static override styles = LocalNavLinkScss; /** Link url. */ @property({ type: String }) href = ''; /** Expanded state. */ @property({ type: Boolean }) expanded = false; /** Active state. */ @property({ type: Boolean }) active = false; /** Disabled state. */ @property({ type: Boolean }) disabled = false; /** Link level, supports three levels. * @ignore */ @state() _level = 1; /** The local nav expanded state. * @internal */ @state() _navExpanded = false; /** The slotted text. * @internal */ @state() _text = ''; /** * Queries slotted links. * @ignore */ @queryAssignedElements({ slot: 'links', selector: 'kyn-local-nav-link' }) navLinks!: Array; override render() { const classes = { 'level--1': this._level == 1, 'level--2': this._level == 2, 'level--3': this._level == 3, 'nav-expanded': this._navExpanded, 'link-expanded': this.expanded, 'link-active': this.active, 'link-disabled': this.disabled, }; return html`
  • this.handleClick(e)}> ${this.navLinks.length ? html` ` : null}
  • `; } override firstUpdated() { this.determineLevel(); } override willUpdate(changedProps: any) { if (changedProps.has('_navExpanded')) { this.updateChildren(); } } private _handleSlotChange() { this.updateChildren(); this.requestUpdate(); } private updateChildren() { this.navLinks.forEach((link: any) => { link._navExpanded = this._navExpanded; }); } private determineLevel() { const parentNode = this.shadowRoot!.host.parentNode; if (parentNode!.nodeName === 'KYN-LOCAL-NAV') { this._level = 1; } else if (parentNode!.parentNode!.nodeName === 'KYN-LOCAL-NAV') { this._level = 2; } else { this._level = 3; } } private handleClick(e: Event) { let preventDefault = false; if (this.disabled) { preventDefault = true; } if (this.navLinks.length) { preventDefault = true; this.expanded = !this.expanded; } if (preventDefault) { e.preventDefault(); } this.requestUpdate(); const event = new CustomEvent('on-click', { detail: { origEvent: e, level: this._level, defaultPrevented: preventDefault, }, }); this.dispatchEvent(event); } } declare global { interface HTMLElementTagNameMap { 'kyn-local-nav-link': LocalNavLink; } }