import { LitElement, html, css, unsafeCSS} from 'lit'; import { customElement, property } from 'lit/decorators.js'; import { breakpoints } from '../../breakpoints'; @customElement('iu-mobile-menu') export class MobileMenu extends LitElement { static override styles = css` :host { position: fixed; display: none; left: 0; height: calc(100dvh - 50px); width: 100%; max-width: 48rem; background: var(--iu-color-white); top: 50px; z-index: 50; overflow: auto; } @media ${unsafeCSS(breakpoints.md)} { :host{ width: calc((100% - var(--iu-grid-offset)) - var(--iu-grid-gutter)); } } :host([open]){ display: block; } /* fallback if event listener doesn't work */ @media ${unsafeCSS(breakpoints.xl)} { :host([open]){ display: none; } } ul{ list-style-type: none; padding: 0; margin: 0; } .secondary-nav{ background: var(--iu-color-black); ul{ padding-top: var(--iu-spacing-1); padding-bottom: var(--iu-spacing-2); } li:not(:last-child){ margin-bottom: var(--iu-spacing-0); } a{ color: var(--iu-color-white); text-decoration: none; padding: 0 var(--iu-grid-gutter); } } `; @property({ type: String }) label? = 'Menu principale'; @property({ type: Boolean, reflect: true }) open : boolean = false; @property({ type: Array, attribute: 'secondary-nav-items' }) secondaryNavItems: Array<{ text: string; href: string }> = []; @property({ type: String, attribute: 'secondary-nav-label' }) secondaryNavLabel: string = 'Menu secondario'; private handleMenuToggle = () => { this.open = !this.open; this.requestUpdate(); }; override connectedCallback() { super.connectedCallback(); window.addEventListener('toggle-mobile-menu', this.handleMenuToggle); } override disconnectedCallback() { window.removeEventListener('toggle-mobile-menu', this.handleMenuToggle); super.disconnectedCallback(); } override render() { return html` ${this.secondaryNavItems.length > 0 ? html` <nav aria-label="${this.secondaryNavLabel}" role="navigation" class="secondary-nav"> <ul> ${this.secondaryNavItems.map( item => html` <li><a href="${item.href}">${item.text}</a></li> `) } </ul> </nav> ` : '' } <nav aria-label="${this.label}" role="navigation"> <ul> <slot></slot> </ul> </nav> `; } } declare global { interface HTMLElementTagNameMap { 'iu-mobile-menu': MobileMenu; } }