import { LitElement, html } from 'lit';
import {
customElement,
property,
state,
queryAssignedElements,
} from 'lit/decorators.js';
import { classMap } from 'lit/directives/class-map.js';
import LocalNavScss from './localNav.scss';
import '@kyndryl-design-system/shidoka-foundation/components/icon';
import openIcon from '@carbon/icons/es/side-panel--open/24';
import closeIcon from '@carbon/icons/es/side-panel--close/24';
import menuIcon from '@carbon/icons/es/menu/20';
import xIcon from '@carbon/icons/es/close/20';
/**
* The global Side Navigation component.
* @slot unnamed - The default slot, for local nav links.
* @fires on-toggle - Captures the click event and emits the pinned state and original event details.
*/
@customElement('kyn-local-nav')
export class LocalNav extends LitElement {
static override styles = LocalNavScss;
/** Local nav pinned state. */
@property({ type: Boolean })
pinned = false;
/** Pin open button assistive text. */
@property({ type: String })
pinText = 'Pin open';
/** Unpin button assistive text. */
@property({ type: String })
unpinText = 'Unpin';
/** Local nav expanded state.
* @internal
*/
@state()
_expanded = false;
/** Queries top-level slotted links links.
* @internal
*/
@queryAssignedElements({ selector: 'kyn-local-nav-link' })
_navLinks!: any;
override render() {
return html`
`;
}
private onNavToggle(e: Event) {
this.pinned = !this.pinned;
const event = new CustomEvent('on-toggle', {
detail: { pinned: this.pinned, origEvent: e },
});
this.dispatchEvent(event);
}
private handleMouseenter() {
this._expanded = true;
}
private handleMouseleave() {
this._expanded = false;
}
private updateChildren() {
this._navLinks.forEach((link: any) => {
link._navExpanded = this._expanded || this.pinned;
});
}
private handleSlotChange() {
this.updateChildren();
this.requestUpdate();
}
override willUpdate(changedProps: any) {
if (changedProps.has('_expanded') || changedProps.has('pinned')) {
this.updateChildren();
}
}
}
declare global {
interface HTMLElementTagNameMap {
'kyn-local-nav': LocalNav;
}
}