export interface MainMenu { label: string; url: string; menuLinkId: string; } import {Component, Host, h, Element, Prop, State, Watch, Listen} from '@stencil/core'; import {ColorVariant, SiteLogoSize} from '../../../utils/utils'; import {DonateLink} from '../../site-header/site-header'; @Component({ tag: 'hy-menu-main-group', styleUrl: 'hy-menu-main-group.scss', shadow: true, }) export class HyMenuMainGroup { @Element() el: HTMLElement; @Prop() dataMainMenu: MainMenu[] | string; @Prop() isMobile: boolean = false; @Prop() logoUrlGroup?: string; @Prop() logoSizeGroup?: any; @Prop() logoLabelGroup?: string; @Prop() siteLabel?: string; @Prop() siteUrl?: string; @State() isMenuOpen: boolean = false; private donateLink: DonateLink[]; private _dataMainMenu: MainMenu[]; @Watch('dataMainMenu') dataMainMenuWatcher(data: MainMenu[] | string) { this._dataMainMenu = typeof data === 'string' ? JSON.parse(data) : data; } @Listen('click') handleComponentClick(event) { this.isMenuOpen = !this.isMenuOpen; if (this.isMenuOpen) { let hyTopHeader = this.el.closest('.hy-site-header__content-top') as HTMLElement; if (hyTopHeader && hyTopHeader.hasAttribute('is-mobile')) { console.log('do mobile stuff'); } else { let mainMenuToggle = event.target.shadowRoot.querySelector('.menu--main-group__toggle') as HTMLElement; let mainMenuDropdown = event.target.shadowRoot.querySelector('.menu--main-group__dropdown') as HTMLElement; let mainMenuList = event.target.shadowRoot.querySelector('.list') as HTMLElement; if (mainMenuDropdown && mainMenuList && mainMenuToggle) { let rectHeader = hyTopHeader.getBoundingClientRect(); let rectMenuToggle = mainMenuToggle.getBoundingClientRect(); mainMenuDropdown.style.top = `${rectHeader.height}px`; mainMenuList.style.left = `${rectMenuToggle.left}px`; } } } event.stopPropagation(); } componentWillRender() { this.dataMainMenuWatcher(this.dataMainMenu); } render() { const white = 'var(--grayscale-white)'; const logoSizeGroup = this.isMobile ? SiteLogoSize.small : SiteLogoSize.small; const logoColorGroup = ColorVariant.white; return this.isMobile ? ( <Host class={{ 'menu--main-group--mobile': true, 'menu--main-group--mobile__is-open': this.isMenuOpen, }} > <button class={{ 'menu--main-group__mobile-toggle': true, 'is-open': this.isMenuOpen, }} > <hy-icon icon={'hy-icon-slim-hamburger-menu'} size={20} fill={white} /> </button> <nav role="navigation" aria-hidden={this.isMenuOpen ? 'false' : 'true'} class={{ 'menu--main-group__dropdown--mobile': true, 'is-open': this.isMenuOpen, }} > <div class="menu--main-group__dropdown__top"> <hy-site-logo is-group={true} size={logoSizeGroup} color={logoColorGroup} url={this.siteUrl} label={this.siteLabel} /> <button class="menu--main-group__dropdown__close" onClick={() => this.isMenuOpen == false}> CLOSE ME </button> </div> <div class="menu--main-group__dropdown__items"> {this._dataMainMenu.map((item) => { return ( <a href={item.url} class={{'menu-main-link': true}}> <span class="heading-icon"> <hy-icon icon={'hy-icon-caret-right'} size={10} fill={white} /> </span> <span class={'menu--main-group__label'}>{item.label}</span> </a> ); })} </div> <div class="menu--main-group__dropdown__donate"> {this.donateLink.map((i) => { return ( <a class={'menu--secondary__item hy-link__donate group'} href={i.url}> <hy-icon icon={'hy-icon-heart-support'} size={14} fill={logoColorGroup} /> <span class={'hy-link__donate__label group'}>{i.label}</span> </a> ); })} </div> </nav> </Host> ) : ( <Host class={{ 'menu--main-group': true, 'menu--main-group__is-open': this.isMenuOpen, }} > <button class={{ 'menu--main-group__toggle': true, 'is-open': this.isMenuOpen, }} //aria-label={this.isMenuOpen ? this._labels['close'] : this._labels['open']} > <hy-icon class={'menu--main-group__toggle__caret'} icon={'hy-icon-slim-hamburger-menu'} size={8} fill={white} /> <span>University main menu</span> </button> <div class={{ 'menu--main-group__dropdown': true, 'is-open': this.isMenuOpen, }} > <div class="list"> {this._dataMainMenu.map((item) => { return ( <a href={item.url} class={{'menu-main-link': true}}> <span class="heading-icon"> <hy-icon icon={'hy-icon-caret-right'} size={10} fill={white} /> </span> <span class={'menu--main-group__label'}>{item.label}</span> </a> ); })} </div> </div> </Host> ); } }