import {ComponentLabels} from '../../site-header/site-header'; export interface MenuLanguage { langCode: string; url: string; abbr: string; label: string; isActive?: boolean; isDisabled?: boolean; } import {Component, h, Prop, Host, Watch, Element, Listen, State, Event, EventEmitter} from '@stencil/core'; @Component({ tag: 'hy-menu-language', styleUrl: 'menu-language.scss', shadow: true, }) export class MenuLanguage { @Element() el: HTMLElement; @Prop() dataMenuLanguage: MenuLanguage[] | string; @Prop() isMobile: boolean = false; @Prop() labels?: ComponentLabels[] | string; @State() isMenuOpen: boolean = false; @Event() menuLanguageToggled: EventEmitter; private _dataMenuLanguage: MenuLanguage[]; private _labels: ComponentLabels[]; @Watch('dataMenuLanguage') dataMenuLanguageWatcher(data: MenuLanguage[] | string) { this._dataMenuLanguage = typeof data === 'string' ? JSON.parse(data) : data; } @Watch('labels') labelsWatcher(data: ComponentLabels[] | string) { this._labels = typeof data === 'string' ? JSON.parse(data) : data; } // Close the language menu if user clicks anywhere outside the Menu language component. @Listen('click', {target: 'window'}) handleOutsideMenuClick(event) { this.isMenuOpen = false; event.stopPropagation(); } // CLose the language menu if user opens the desktop menu panel. @Listen('menuDesktopToggled', {target: 'document'}) desktopMenuToggled() { this.isMenuOpen = false; } @Listen('focus') handleComponentFocus(event) { // Close desktop menu panel if it's open. this.menuLanguageToggled.emit(); event.stopPropagation(); } @Listen('click') handleComponentClick(event) { this.isMenuOpen = !this.isMenuOpen; const languageMenuSelector = event.target as HTMLElement; if (this.isMenuOpen) { // Close desktop menu panel if it's open. this.menuLanguageToggled.emit(); let hyHeader = this.el.closest('.hy-site-header') as HTMLElement; const headerHeight = `${ languageMenuSelector.offsetHeight + hyHeader.offsetTop + hyHeader.offsetHeight + 8 - languageMenuSelector.offsetTop - languageMenuSelector.offsetHeight }px`; const languagePanel = languageMenuSelector.shadowRoot.querySelectorAll( `.menu--language__dropdown` )[0] as HTMLElement; languagePanel.style.top = headerHeight; } event.stopPropagation(); } componentWillRender() { this.dataMenuLanguageWatcher(this.dataMenuLanguage); this.labelsWatcher(this.labels); } render() { const black = 'var(--brand-main-nearly-black)'; return this.isMobile ? ( <Host class={'menu--language'}> {this._dataMenuLanguage.map((item) => { return ( <hy-menu-language-item lang-code={item.langCode} url={item.url} label={item.label} abbr={item.abbr} is-active={item.isActive} is-disabled={item.isDisabled} is-mobile={this.isMobile} /> ); })} </Host> ) : ( <Host class={{ 'menu--language': true, 'menu--language__is-open': this.isMenuOpen, }} > <button class={{ 'menu--language__toggle': true, 'is-open': this.isMenuOpen, }} aria-label={this.isMenuOpen ? this._labels['close'] : this._labels['open']} > <hy-icon class={'menu--language__globe-icon'} icon={'hy-icon-globe'} size={14} fill={black} /> <span> {this._dataMenuLanguage.map((item) => { if (item.isActive) { return item.langCode; } })} </span> <hy-icon class={'menu--language__toggle__caret'} icon={'hy-icon-caret-down'} size={8} fill={black} /> </button> <div class={{ 'menu--language__dropdown': true, 'is-open': this.isMenuOpen, }} > {this._dataMenuLanguage.map((item) => { return ( <hy-menu-language-item lang-code={item.langCode} url={item.url} label={item.label} abbr={item.abbr} is-active={item.isActive} is-disabled={item.isDisabled} is-mobile={this.isMobile} /> ); })} </div> </Host> ); } }