diff --git a/src/components.d.ts b/src/components.d.ts index ba226ddfca5158ab761e8fdf963478063a049924..e42969d12a7c361e4099ddf8770109e29bf900bb 100644 --- a/src/components.d.ts +++ b/src/components.d.ts @@ -2017,6 +2017,7 @@ declare namespace LocalJSX { logoLabelGroup?: string; logoSizeGroup?: any; logoUrlGroup?: string; + onUniversityMainMenuToggled?: (event: CustomEvent<any>) => void; siteLabel?: string; siteUrl?: string; } diff --git a/src/components/navigation/hy-menu-main-group/hy-menu-main-group.scss b/src/components/navigation/hy-menu-main-group/hy-menu-main-group.scss index 2624eceae572d62e3d1a62726a1e39e8f9933e6a..5fbcb1d68c5b66d82f875e6aa0a4b4f50ea7b7d5 100644 --- a/src/components/navigation/hy-menu-main-group/hy-menu-main-group.scss +++ b/src/components/navigation/hy-menu-main-group/hy-menu-main-group.scss @@ -28,27 +28,62 @@ letter-spacing: -0.44px; margin: 0 -4px; padding: 0; + position: relative; &:focus { + outline: none; } &:hover { + cursor: pointer; + span { + color: var(--grayscale-medium); + } + svg { + fill: var(--grayscale-medium); + } } - svg { - @include breakpoint($wide) { - height: 15.27px; - width: 3px; - } - @include breakpoint($extrawide) { - height: 14px; - width: 3px; + .toggle__caret { + svg { + @include breakpoint($wide) { + height: 15.27px; + width: 3px; + } + @include breakpoint($extrawide) { + height: 14px; + width: 3px; + } } } + span { @include breakpoint($wide) { margin-left: 17px; } } + + &.is-open { + &:after { + border-bottom: 3px solid white; + bottom: -10px; + content: ' '; + position: absolute; + width: 100%; + } + + .toggle__close { + @include breakpoint($wide) { + height: 12px; + width: 12px; + } + } + + span { + @include breakpoint($wide) { + margin-left: 10px; + } + } + } } .menu--main-group__dropdown { @@ -68,7 +103,7 @@ top: 0; visibility: visible; width: 100%; - z-index: 100; + z-index: 511; .list { display: flex; @@ -76,6 +111,43 @@ justify-items: center; position: relative; } + + .panel-toggle { + background-color: transparent; + border: none; + position: absolute; + right: 0; + top: 0; + + @include breakpoint($wide) { + padding: 26px 32px; + } + + &__label { + @include font-size(16px, 20px); + @include font-weight($bold); + color: var(--grayscale-white); + display: flex; + font-family: var(--main-font-family); + letter-spacing: -0.5px; + text-transform: uppercase; + + &__title { + padding-right: 12px; + } + + &:hover { + cursor: pointer; + span { + color: var(--grayscale-medium); + } + svg { + fill: var(--grayscale-medium); + } + } + } + } + .menu-main-link { @include font-size(16px, 20px); align-items: center; @@ -83,6 +155,15 @@ flex-direction: row; margin-bottom: 20px; text-decoration: none; + + &:hover { + span { + color: var(--grayscale-medium); + } + svg { + fill: var(--grayscale-medium); + } + } } .menu--main-group__label { color: var(--grayscale-white); diff --git a/src/components/navigation/hy-menu-main-group/hy-menu-main-group.tsx b/src/components/navigation/hy-menu-main-group/hy-menu-main-group.tsx index 22f8a35848d788f66ea72d0a71dc894188377d5b..66f1dd2416e9afdca420ca48cdff2689f9980e3e 100644 --- a/src/components/navigation/hy-menu-main-group/hy-menu-main-group.tsx +++ b/src/components/navigation/hy-menu-main-group/hy-menu-main-group.tsx @@ -4,10 +4,14 @@ export interface MainMenu { menuLinkId: string; } -import {Component, Host, h, Element, Prop, State, Watch, Listen} from '@stencil/core'; +import {Component, Host, h, Element, Prop, State, Watch, Listen, Event, EventEmitter} from '@stencil/core'; import {ColorVariant, SiteLogoSize} from '../../../utils/utils'; import {DonateLink} from '../../site-header/site-header'; +let keys = { + enter: 'Enter', +}; + @Component({ tag: 'hy-menu-main-group', styleUrl: 'hy-menu-main-group.scss', @@ -25,6 +29,8 @@ export class HyMenuMainGroup { @State() isMenuOpen: boolean = false; private donateLink: DonateLink[]; + @Event() universityMainMenuToggled: EventEmitter; + private _dataMainMenu: MainMenu[]; @Watch('dataMainMenu') @@ -37,31 +43,88 @@ export class HyMenuMainGroup { 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`; - } - } + this.emitEvent(); + this.adjustMainMenuPosition(event.target); } event.stopPropagation(); } + @Listen('keydown') + handleComponentKeyDown(event: KeyboardEvent) { + const key = event.code; + let target = event.target as HTMLButtonElement; + + if (target && [keys.enter].includes(key)) { + this.isMenuOpen = !this.isMenuOpen; + + if (this.isMenuOpen) { + this.emitEvent(); + this.adjustMainMenuPosition(target); + + event.preventDefault(); + } + } + } + + emitEvent() { + // Close other panels if they are open (lang menu, search, main menu, ..). + this.universityMainMenuToggled.emit(); + } + + adjustMainMenuPosition(target) { + 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 = target.shadowRoot.querySelector('.menu--main-group__toggle') as HTMLElement; + let mainMenuDropdown = target.shadowRoot.querySelector('.menu--main-group__dropdown') as HTMLElement; + let mainMenuList = 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`; + } + } + } + componentWillRender() { this.dataMainMenuWatcher(this.dataMainMenu); } + handleMainMenuClose(event) { + this.isMenuOpen = false; + event.stopPropagation(); + } + + // Close the University main menu if user clicks anywhere outside the component. + @Listen('click', {target: 'window'}) + handleOutsideMenuClick(event) { + this.isMenuOpen = false; + event.stopPropagation(); + } + + // CLose the University main menu if user opens the desktop menu panel. + @Listen('menuDesktopToggled', {target: 'document'}) + desktopMenuToggled() { + this.isMenuOpen = false; + } + + // CLose the University main menu if user opens the search panel + @Listen('searchPanelToggled', {target: 'document'}) + searchPanelToggled() { + this.isMenuOpen = false; + } + + // CLose the University main menu if user opens the language menu panel. + @Listen('menuLanguageToggled', {target: 'document'}) + languageMenuToggled() { + this.isMenuOpen = false; + } + render() { const white = 'var(--grayscale-white)'; const logoSizeGroup = this.isMobile ? SiteLogoSize.small : SiteLogoSize.small; @@ -140,12 +203,11 @@ export class HyMenuMainGroup { }} //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} - /> + {this.isMenuOpen ? ( + <hy-icon class={'toggle__close'} icon={'hy-icon-remove'} size={8} fill={white} /> + ) : ( + <hy-icon class={'toggle__caret'} icon={'hy-icon-slim-hamburger-menu'} size={8} fill={white} /> + )} <span>University main menu</span> </button> <div @@ -166,6 +228,18 @@ export class HyMenuMainGroup { ); })} </div> + <button + onClick={(e) => this.handleMainMenuClose(e)} + class={{ + 'panel-toggle': true, + }} + aria-label="Close menu" + > + <span class="panel-toggle__label"> + <span class="panel-toggle__label__title">Close</span> + <hy-icon icon={'hy-icon-remove'} size={20} fill={ColorVariant.white} /> + </span> + </button> </div> </Host> ); diff --git a/src/components/navigation/hy-menu-main-group/readme.md b/src/components/navigation/hy-menu-main-group/readme.md index 6a5e71e743246734fa8f47a6b67ff8af2eff1d6b..dd21c99c3c616ba06e29a09dc2ee3519f0dab473 100644 --- a/src/components/navigation/hy-menu-main-group/readme.md +++ b/src/components/navigation/hy-menu-main-group/readme.md @@ -14,6 +14,12 @@ | `siteLabel` | `site-label` | | `string` | `undefined` | | `siteUrl` | `site-url` | | `string` | `undefined` | +## Events + +| Event | Description | Type | +| --------------------------- | ----------- | ------------------ | +| `universityMainMenuToggled` | | `CustomEvent<any>` | + ## Dependencies ### Used by diff --git a/src/components/navigation/menu-language/menu-language.scss b/src/components/navigation/menu-language/menu-language.scss index 2d5db36dff25d659425653bc244cba15b789182a..1ef48a5e47e842c6028a26631b6609b3a2be068c 100644 --- a/src/components/navigation/menu-language/menu-language.scss +++ b/src/components/navigation/menu-language/menu-language.scss @@ -35,36 +35,35 @@ } .menu--language__toggle { - @include font-size(14px, 24px); align-items: center; - background: var(--grayscale-white); border: 0 none; - color: var(--brand-main-nearly-black); display: flex; flex-flow: row; font-family: var(--main-font-family); - font-weight: 600; - letter-spacing: -0.4px; margin: 0 -4px; padding: 0; text-transform: uppercase; - @include breakpoint($extrawide) { - @include font-size(12px, 12px); - font-weight: 400; - letter-spacing: -0.6px; + &:focus { + outline: solid 2px var(--additional-yellow); + outline-offset: 2px; } - @include breakpoint($xlarge) { - @include font-size(14px, 24px); - letter-spacing: -0.5px; + &.is-open { + .menu--language__toggle__caret { + transform: rotate(180deg); + } } - &:focus { - outline: solid 2px var(--additional-yellow); - outline-offset: 2px; + > * { + padding: 0 4px; } + span { + padding: 0; + } +} +.menu--language__toggle:not(.group) { &:hover { color: var(--brand-main); cursor: pointer; @@ -76,35 +75,43 @@ } } - &.is-group { - background: var(--grayscale-black); - border: 0 none; - color: var(--grayscale-white); + @include font-size(14px, 24px); + @include font-weight($semibold); + background: var(--grayscale-white); + color: var(--brand-main-nearly-black); + letter-spacing: -0.4px; + + @include breakpoint($extrawide) { + @include font-size(12px, 12px); + @include font-weight($regular); + letter-spacing: -0.6px; + } + + @include breakpoint($xlarge) { + @include font-size(14px, 24px); + letter-spacing: -0.5px; + } +} - &:hover { +.menu--language__toggle.group { + &:hover { + color: var(--grayscale-medium); + cursor: pointer; + span { color: var(--grayscale-medium); - cursor: pointer; - span { - color: var(--grayscale-medium); - } - svg { - fill: var(--grayscale-medium); - } } - } - - &.is-open { - .menu--language__toggle__caret { - transform: rotate(180deg); + svg { + fill: var(--grayscale-medium); } } - > * { - padding: 0 4px; - } - span { - padding: 0; - } + background: var(--grayscale-black); + //border: 0 none; + color: var(--grayscale-white); + + @include font-size(14px, 24px); + @include font-weight($semibold); + letter-spacing: -0.5px; } .menu--language__dropdown { @@ -143,7 +150,7 @@ } } -.menu--language__globe-icon svg { +.menu--language__globe-icon:not(.group) svg { @include breakpoint($wide) { height: 16px; width: 16px; diff --git a/src/components/navigation/menu-language/menu-language.tsx b/src/components/navigation/menu-language/menu-language.tsx index 1acc32546143f410f8c6e0c5d4aa0cff9aa0aaf9..8223824f875c5537aefd7161ee837c29475d253b 100644 --- a/src/components/navigation/menu-language/menu-language.tsx +++ b/src/components/navigation/menu-language/menu-language.tsx @@ -56,6 +56,12 @@ export class MenuLanguage { this.isMenuOpen = false; } + // Close the language menu if user opens University main menu + @Listen('universityMainMenuToggled', {target: 'document'}) + universityMainMenuPanelToggled() { + this.isMenuOpen = false; + } + @Listen('focus') handleComponentFocus(event) { // Close desktop menu panel if it's open. @@ -67,24 +73,35 @@ export class MenuLanguage { @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 languageMenuSelector = event.target as HTMLElement; + this.adjustPosition(languageMenuSelector, this.el); + } + + event.stopPropagation(); + } + + adjustPosition(languageMenuSelector, target) { + const languagePanel = languageMenuSelector.shadowRoot.querySelectorAll( + `.menu--language__dropdown` + )[0] as HTMLElement; + let headerHeight = '0'; + let hyHeader = this.isGroup + ? (target.closest('.hy-site-header__content-top') as HTMLElement) + : (target.closest('.hy-site-header') as HTMLElement); + + if (hyHeader) { let rectHeader = hyHeader.getBoundingClientRect(); let rectLangMenu = languageMenuSelector.getBoundingClientRect(); - const headerHeight = `${languageMenuSelector.offsetHeight + rectHeader.bottom + 8 - rectLangMenu.bottom}px`; - const languagePanel = languageMenuSelector.shadowRoot.querySelectorAll( - `.menu--language__dropdown` - )[0] as HTMLElement; - languagePanel.style.top = headerHeight; + headerHeight = `${languageMenuSelector.offsetHeight + rectHeader.bottom + 8 - rectLangMenu.bottom}px`; } - event.stopPropagation(); + languagePanel.style.top = headerHeight; } componentWillRender() { @@ -96,6 +113,7 @@ export class MenuLanguage { const black = 'var(--brand-main-nearly-black)'; const white = 'var(--grayscale-white)'; const svgColor = this.isGroup ? white : black; + const globeIconSize = this.isGroup ? 16 : 14; return this.isMobile ? ( <Host class={'menu--language'}> @@ -124,12 +142,17 @@ export class MenuLanguage { class={{ 'menu--language__toggle': true, 'is-open': this.isMenuOpen, - 'is-group': this.isGroup, + group: this.isGroup, }} aria-label={this.isMenuOpen ? this._labels['close'] : this._labels['open']} > - <hy-icon class={'menu--language__globe-icon'} icon={'hy-icon-globe'} size={14} fill={svgColor} /> - <span> + <hy-icon + class={{'menu--language__globe-icon': true, group: this.isGroup}} + icon={'hy-icon-globe'} + size={globeIconSize} + fill={svgColor} + /> + <span class={{group: this.isGroup}}> {this._dataMenuLanguage.map((item) => { if (item.isActive) { return item.langCode; diff --git a/src/components/site-header/hy-desktop-menu-links/hy-desktop-menu-links.tsx b/src/components/site-header/hy-desktop-menu-links/hy-desktop-menu-links.tsx index 405849de63b0784311cfeba394e6f4e386e50d99..1d41aa0bbc54de7dbb2f7a019a7654d8635468f5 100644 --- a/src/components/site-header/hy-desktop-menu-links/hy-desktop-menu-links.tsx +++ b/src/components/site-header/hy-desktop-menu-links/hy-desktop-menu-links.tsx @@ -271,6 +271,13 @@ export class HyDesktopMenuLinks { this.closePanel(fadeOut); } + // Close the desktop menu panel if user opens University main menu + @Listen('universityMainMenuToggled', {target: 'document'}) + universityMainMenuPanelToggled() { + let fadeOut = true; + this.closePanel(fadeOut); + } + // Close the desktop menu panel if user opens search panel @Listen('searchPanelToggled', {target: 'document'}) searchPanelToggled() { diff --git a/src/components/site-header/site-header.scss b/src/components/site-header/site-header.scss index b19990f751fa2d7cc2af63bd934e6b1f7bc1e2a6..a47d29312237e6c51cef9050500d07531169986b 100644 --- a/src/components/site-header/site-header.scss +++ b/src/components/site-header/site-header.scss @@ -74,6 +74,7 @@ flex-flow: row; place-content: center space-between; position: relative; + z-index: 100; @include breakpoint($narrow) { margin: 0 auto; @@ -309,6 +310,8 @@ } .hy-link__donate { + font-family: var(--main-font-family); + @include breakpoint($wide) { padding: 0; text-decoration: none; @@ -324,19 +327,39 @@ } &__label { + font-family: var(--main-font-family); + margin-left: 4px; + text-decoration: none; + } +} + +.hy-link__donate:not(.group) { + svg { + @include breakpoint($wide) { + height: 16px; + width: 13.64px; + } + @include breakpoint($extrawide) { + height: 12px; + width: 10.23px; + } + @include breakpoint($xlarge) { + height: 16px; + width: 13.64px; + } + } + + .hy-link__donate__label { @include breakpoint($wide) { @include font-size(14px, 24px); + @include font-weight($semibold); color: var(--brand-main-nearly-black); - font-family: var(--main-font-family); - font-weight: 600; letter-spacing: -0.5px; - margin-left: 4px; - text-decoration: none; } @include breakpoint($extrawide) { @include font-size(12px, 12px); - font-weight: 400; + @include font-weight($regular); letter-spacing: -0.6px; } @@ -344,36 +367,26 @@ @include font-size(14px, 24px); letter-spacing: -0.5px; } - - &.group { - color: var(--grayscale-white); - } } +} - svg { +.hy-link__donate.group { + .hy-link__donate__label { @include breakpoint($wide) { - height: 16px; - width: 13.64px; - } - @include breakpoint($extrawide) { - height: 12px; - width: 10.23px; - } - @include breakpoint($xlarge) { - height: 16px; - width: 13.64px; + @include font-size(14px, 24px); + @include font-weight($semibold); + color: var(--grayscale-white); + letter-spacing: -0.5px; } } - &.group { - &:hover { + &:hover { + color: var(--grayscale-medium); + span { color: var(--grayscale-medium); - span { - color: var(--grayscale-medium); - } - svg { - fill: var(--grayscale-medium); - } + } + svg { + fill: var(--grayscale-medium); } } } diff --git a/src/components/site-header/site-header.tsx b/src/components/site-header/site-header.tsx index a4bf9ff3473b58043d02cb78508f9c1475aaf776..cf04fdf4b43d79fb7b07ea3867f4c820d6c68170 100644 --- a/src/components/site-header/site-header.tsx +++ b/src/components/site-header/site-header.tsx @@ -230,7 +230,7 @@ export class SiteHeader { <div class={{'hy-backdrop': true, 'is-active': this.isMenuOpen}} /> {this.isGroup && ( <div class="hy-site-header__content-top"> - <div class={'hy-site-header__logo-container group '}> + <div class={'hy-site-header__logo-container group '} role="navigation"> <hy-site-logo is-group={true} size={logoSizeGroup} @@ -238,7 +238,7 @@ export class SiteHeader { url={this.siteUrl} label={this.siteLabel} /> - <hy-menu-main-group is-mobile={false} data-main-menu={this.dataMainMenuLinks} /> + <hy-menu-main-group tabindex="0" is-mobile={false} data-main-menu={this.dataMainMenuLinks} /> </div> <div class={'menu--secondary menu--secondary--group'}> @@ -251,7 +251,7 @@ export class SiteHeader { /> <hy-site-search class={'menu--secondary__item group'} - size={14} + size={16} color={logoColorGroup} is-group={true} show-label={true} @@ -262,7 +262,7 @@ export class SiteHeader { {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} /> + <hy-icon icon={'hy-icon-heart-support'} size={16} fill={logoColorGroup} /> <span class={'hy-link__donate__label group'}>{i.label}</span> </a> ); @@ -320,7 +320,7 @@ export class SiteHeader { <div class={{'hy-backdrop': true, 'is-active': this.isMenuOpen}} /> {this.isGroup && ( <div class="hy-site-header__content-top"> - <div class={'hy-site-header__logo-container group '}> + <div class={'hy-site-header__logo-container group '} role="navigation"> <hy-site-logo is-group={true} size={logoSizeGroup} @@ -341,7 +341,7 @@ export class SiteHeader { /> <hy-site-search class={'menu--secondary__item group'} - size={14} + size={16} color={logoColorGroup} show-label={true} is-group={true} @@ -352,7 +352,7 @@ export class SiteHeader { {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} /> + <hy-icon icon={'hy-icon-heart-support'} size={16} fill={logoColorGroup} /> <span class={'hy-link__donate__label group'}>{i.label}</span> </a> ); diff --git a/src/components/site-header/site-search/site-search.scss b/src/components/site-header/site-search/site-search.scss index 8487920123a1eb5fc6871785d93d6c0b3f394af1..177a4028728de21aec8676b2169d67ffee18d7f5 100644 --- a/src/components/site-header/site-search/site-search.scss +++ b/src/components/site-header/site-search/site-search.scss @@ -5,6 +5,7 @@ display: flex; padding: 12px; flex-direction: row; + font-family: var(--main-font-family); @include breakpoint($narrow) { padding: 15px 5px; @@ -28,13 +29,48 @@ } &__label { + font-family: var(--main-font-family); + margin-left: 4px; + } +} + +.button--search:not(.group) { + &:hover { + color: var(--brand-main); + cursor: pointer; + + span { + color: var(--brand-main); + } + svg { + fill: var(--brand-main); + } + } + + svg { + height: 20px; + width: 20px; + + @include breakpoint($wide) { + height: 16px; + width: 16px; + } + @include breakpoint($extrawide) { + height: 12px; + width: 12px; + } + @include breakpoint($xlarge) { + height: 16px; + width: 16px; + } + } + + .button--search__label { @include font-size(14px, 14px); @include font-weight($bold); color: var(--site-logo-color); display: none; - font-family: var(--main-font-family); letter-spacing: -0.9px; - margin-left: 4px; visibility: hidden; @include breakpoint($narrow) { @@ -45,8 +81,8 @@ @include breakpoint($wide) { @include font-size(14px, 24px); + @include font-weight($semibold); display: block; - font-weight: 600; letter-spacing: -0.5px; text-transform: none; visibility: visible; @@ -54,7 +90,7 @@ @include breakpoint($extrawide) { @include font-size(12px, 12px); - font-weight: 400; + @include font-weight($regular); letter-spacing: -0.6px; } @@ -62,52 +98,30 @@ @include font-size(14px, 24px); letter-spacing: -0.5px; } - - &__group { - color: var(--grayscale-white); - } - } - - svg { - height: 20px; - width: 20px; - - @include breakpoint($wide) { - height: 16px; - width: 16px; - } - @include breakpoint($extrawide) { - height: 12px; - width: 12px; - } - @include breakpoint($xlarge) { - height: 16px; - width: 16px; - } } +} +.button--search.group { &:hover { - color: var(--brand-main); + color: var(--grayscale-medium); cursor: pointer; span { - color: var(--brand-main); + color: var(--grayscale-medium); } + svg { - fill: var(--brand-main); + fill: var(--grayscale-medium); } } - &--group { - &:hover { - color: var(--grayscale-medium); - span { - color: var(--grayscale-medium); - } + .button--search__label { + color: var(--grayscale-white); - svg { - fill: var(--grayscale-medium); - } + @include breakpoint($wide) { + @include font-size(14px, 24px); + @include font-weight($semibold); + letter-spacing: -0.5px; } } } diff --git a/src/components/site-header/site-search/site-search.tsx b/src/components/site-header/site-search/site-search.tsx index a4df30221a16a4b5e2fa82985ff25ac92a36e27c..05a1f295cda39e66b5e9f8a83aa33034f12f19bf 100644 --- a/src/components/site-header/site-search/site-search.tsx +++ b/src/components/site-header/site-search/site-search.tsx @@ -93,6 +93,12 @@ export class SiteSearch { this.closeSearchPanel(); } + // Close the search panel if user opens University main menu + @Listen('universityMainMenuToggled', {target: 'document'}) + universityMainMenuPanelToggled() { + this.closeSearchPanel(); + } + // CLose the search panel on Scroll down. @Listen('headerScrollDown', {target: 'document'}) headerScrollDown() { @@ -122,12 +128,7 @@ export class SiteSearch { // Close desktop menu panel and lang menu panel if they are open. this.searchPanelToggled.emit(); - let hyHeader = this.el.closest('.hy-site-header') as HTMLElement; - const headerHeight = hyHeader.classList.contains('hy-site-header--sticky-active') - ? `${hyHeader.offsetHeight}px` - : `${hyHeader.offsetTop + hyHeader.offsetHeight}px`; - const searchPanel = this.el.shadowRoot.querySelectorAll(`.site-search__panel`)[0] as HTMLElement; - searchPanel.style.top = headerHeight; + this.adjustPosition(this.el); // Remove hidden class from cludo suggestions let cludoSayt = document.querySelectorAll('stencil-cludo-sayt')[0] as HTMLElement; @@ -135,14 +136,6 @@ export class SiteSearch { cludoSayt.classList.remove('hidden'); } - // Add shadow backdrop - let rect = searchPanel.getBoundingClientRect(); - - let shadowTop = hyHeader.classList.contains('hy-site-header--sticky-active') - ? hyHeader.offsetHeight + rect.height - : hyHeader.offsetTop + hyHeader.offsetHeight + rect.height; - this.showBackdropShadow('open', shadowTop); - // Without setTimeout it will not focus the input because it hasn't rendered yet. setTimeout(() => { const searchInput = this.el.shadowRoot.querySelector('input#search') as HTMLElement; @@ -154,6 +147,47 @@ export class SiteSearch { event.stopPropagation(); } + adjustPosition(target) { + let headerHeight = '0'; + let shadowTop = 0; + const searchPanel = target.shadowRoot.querySelectorAll(`.site-search__panel`)[0] as HTMLElement; + let rect = searchPanel.getBoundingClientRect(); + + if (this.isGroup) { + let hyHeader = target.closest('.hy-site-header__content-top') as HTMLElement; + if (hyHeader) { + let rectHeader = hyHeader.getBoundingClientRect(); + headerHeight = `${rectHeader.height}px`; + + // Add shadow backdrop + //@todo For some reason rect (Search Panel) is { + // "x": 0, + // "y": 0, + // "width": 0, + // "height": 0, + // "top": 0, + // "right": 0, + // "bottom": 0, + // "left": 0 + // } + shadowTop = hyHeader.offsetHeight + rect.height; + } + } else { + let hyHeader = target.closest('.hy-site-header') as HTMLElement; + headerHeight = hyHeader.classList.contains('hy-site-header--sticky-active') + ? `${hyHeader.offsetHeight}px` + : `${hyHeader.offsetTop + hyHeader.offsetHeight}px`; + + // Add shadow backdrop + shadowTop = hyHeader.classList.contains('hy-site-header--sticky-active') + ? hyHeader.offsetHeight + rect.height + : hyHeader.offsetTop + hyHeader.offsetHeight + rect.height; + } + + searchPanel.style.top = headerHeight; + this.showBackdropShadow('open', shadowTop); + } + showBackdropShadow(state = 'close', top = 0) { let hyHeader = this.el.closest('.hy-site-header') as HTMLElement; let hyBackdropDiv = hyHeader.children[0] as HTMLElement; @@ -173,8 +207,6 @@ export class SiteSearch { } render() { - const isGroupClass = this.isGroup ? 'group' : 'page'; - const buttonSearchLabelClass = ['button--search__label', `button--search__label__${isGroupClass}`].join(' '); return ( <Host class={{ @@ -187,13 +219,19 @@ export class SiteSearch { aria-expanded={`${this.isSearchPanelOpen}`} class={{ 'button--search': true, - 'button--search--group': this.isGroup, + group: this.isGroup, 'is-open--menu': this.isAlternative, 'is-open': this.isSearchPanelOpen, }} onClick={(e) => this.handleSearchPanelToggle(e)} > - {this.showLabel ? <span class={buttonSearchLabelClass}>{this._labels['label']}</span> : ''} + {this.showLabel ? ( + <span class={{'button--search__label': true, 'button--search__label__group': this.isGroup}}> + {this._labels['label']} + </span> + ) : ( + '' + )} <hy-icon icon={'hy-icon-search'} size={this.size} fill={this.color} /> </button> <div