diff --git a/src/components.d.ts b/src/components.d.ts index 7530b018eb611dfae21200ea4550a8e6021a9a03..058df522f4055a6dcc813c2fea176e5b7cd0a1b3 100644 --- a/src/components.d.ts +++ b/src/components.d.ts @@ -53,6 +53,7 @@ import {CtaLinkValue} from './components/hy-link-list/hy-link-list'; import {AdditionalInfo, RelatedLink} from './components/hy-list-item/hy-list-item'; import {MenuLanguage} from './components/navigation/menu-language/menu-language'; import {ComponentLabels} from './components/site-header/site-header'; +import {MainMenu} from './components/hy-menu-main-group/hy-menu-main-group'; import {ProcessFlowBoxValue} from './components/process/process'; import {ShortcutLinkValue} from './components/hy-shortcuts/hy-shortcuts'; import {DesktopLinks as DesktopLinks1} from './components/site-header/site-header'; @@ -624,6 +625,10 @@ export namespace Components { menuType: MenuType; triggerItem: string; } + interface HyMenuMainGroup { + dataMainMenu: MainMenu[] | string; + isMobile: boolean; + } interface HyMenuMobileBreadcrumb { bid: string; isFirst: boolean; @@ -769,6 +774,7 @@ export namespace Components { } interface HySiteHeader { dataDesktopLinks: DesktopLinks[] | string; + dataMainMenuLinks: DesktopLinks[] | string; dataMenuDonate: string; dataMenuLanguage: string; dataSearchTools: DesktopLinks[] | string; @@ -1194,6 +1200,11 @@ declare global { prototype: HTMLHyMenuLevelContainerElement; new (): HTMLHyMenuLevelContainerElement; }; + interface HTMLHyMenuMainGroupElement extends Components.HyMenuMainGroup, HTMLStencilElement {} + var HTMLHyMenuMainGroupElement: { + prototype: HTMLHyMenuMainGroupElement; + new (): HTMLHyMenuMainGroupElement; + }; interface HTMLHyMenuMobileBreadcrumbElement extends Components.HyMenuMobileBreadcrumb, HTMLStencilElement {} var HTMLHyMenuMobileBreadcrumbElement: { prototype: HTMLHyMenuMobileBreadcrumbElement; @@ -1382,6 +1393,7 @@ declare global { 'hy-menu-language': HTMLHyMenuLanguageElement; 'hy-menu-language-item': HTMLHyMenuLanguageItemElement; 'hy-menu-level-container': HTMLHyMenuLevelContainerElement; + 'hy-menu-main-group': HTMLHyMenuMainGroupElement; 'hy-menu-mobile-breadcrumb': HTMLHyMenuMobileBreadcrumbElement; 'hy-menu-sidebar': HTMLHyMenuSidebarElement; 'hy-pager': HTMLHyPagerElement; @@ -1988,6 +2000,10 @@ declare namespace LocalJSX { menuType?: MenuType; triggerItem?: string; } + interface HyMenuMainGroup { + dataMainMenu?: MainMenu[] | string; + isMobile?: boolean; + } interface HyMenuMobileBreadcrumb { bid?: string; isFirst?: boolean; @@ -2134,6 +2150,7 @@ declare namespace LocalJSX { } interface HySiteHeader { dataDesktopLinks?: DesktopLinks[] | string; + dataMainMenuLinks?: DesktopLinks[] | string; dataMenuDonate?: string; dataMenuLanguage?: string; dataSearchTools?: DesktopLinks[] | string; @@ -2312,6 +2329,7 @@ declare namespace LocalJSX { 'hy-menu-language': HyMenuLanguage; 'hy-menu-language-item': HyMenuLanguageItem; 'hy-menu-level-container': HyMenuLevelContainer; + 'hy-menu-main-group': HyMenuMainGroup; 'hy-menu-mobile-breadcrumb': HyMenuMobileBreadcrumb; 'hy-menu-sidebar': HyMenuSidebar; 'hy-pager': HyPager; @@ -2411,6 +2429,7 @@ declare module '@stencil/core' { 'hy-menu-language-item': LocalJSX.HyMenuLanguageItem & JSXBase.HTMLAttributes<HTMLHyMenuLanguageItemElement>; 'hy-menu-level-container': LocalJSX.HyMenuLevelContainer & JSXBase.HTMLAttributes<HTMLHyMenuLevelContainerElement>; + 'hy-menu-main-group': LocalJSX.HyMenuMainGroup & JSXBase.HTMLAttributes<HTMLHyMenuMainGroupElement>; 'hy-menu-mobile-breadcrumb': LocalJSX.HyMenuMobileBreadcrumb & JSXBase.HTMLAttributes<HTMLHyMenuMobileBreadcrumbElement>; 'hy-menu-sidebar': LocalJSX.HyMenuSidebar & JSXBase.HTMLAttributes<HTMLHyMenuSidebarElement>; diff --git a/src/components/hy-menu-main-group/hy-menu-main-group.scss b/src/components/hy-menu-main-group/hy-menu-main-group.scss new file mode 100644 index 0000000000000000000000000000000000000000..5d4e87f30f6362b8597dbe54a44aadaffa915763 --- /dev/null +++ b/src/components/hy-menu-main-group/hy-menu-main-group.scss @@ -0,0 +1,3 @@ +:host { + display: block; +} diff --git a/src/components/hy-menu-main-group/hy-menu-main-group.tsx b/src/components/hy-menu-main-group/hy-menu-main-group.tsx new file mode 100644 index 0000000000000000000000000000000000000000..a33699018c3cf48dbe4461148bd84f08b9b77c7f --- /dev/null +++ b/src/components/hy-menu-main-group/hy-menu-main-group.tsx @@ -0,0 +1,73 @@ +export interface MainMenu { + label: string; + url: string; + menuLinkId: string; +} + +import {Component, Host, h, Element, Prop, State, Watch, Listen} from '@stencil/core'; + +@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; + @State() isMenuOpen: boolean = false; + + 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; + event.stopPropagation(); + } + + componentWillRender() { + this.dataMainMenuWatcher(this.dataMainMenu); + } + + render() { + const white = 'var(--grayscale-white)'; + + return this.isMobile ? ( + <div>Mobile Main Menu in Groups</div> + ) : ( + <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__globe-icon'} icon={'hy-icon-globe'} size={14} fill={white} /> + <span>University main menu</span> + <hy-icon class={'menu--main-group__toggle__caret'} icon={'hy-icon-caret-down'} size={8} fill={white} /> + </button> + <div + class={{ + 'menu--language__dropdown': true, + 'is-open': this.isMenuOpen, + }} + > + {this._dataMainMenu.map((item) => { + return <a href={item.url}>{item.label}</a>; + })} + </div> + </Host> + ); + } +} diff --git a/src/components/hy-menu-main-group/readme.md b/src/components/hy-menu-main-group/readme.md new file mode 100644 index 0000000000000000000000000000000000000000..b3a61124010d6e9006184a79bb0e49f6ff92aa91 --- /dev/null +++ b/src/components/hy-menu-main-group/readme.md @@ -0,0 +1,33 @@ +# hy-menu-main-group + +<!-- Auto Generated Below --> + +## Properties + +| Property | Attribute | Description | Type | Default | +| -------------- | ---------------- | ----------- | ---------------------- | ----------- | +| `dataMainMenu` | `data-main-menu` | | `MainMenu[] \| string` | `undefined` | +| `isMobile` | `is-mobile` | | `boolean` | `false` | + +## Dependencies + +### Used by + +- [hy-site-header](../site-header) + +### Depends on + +- [hy-icon](../icon) + +### Graph + +```mermaid +graph TD; + hy-menu-main-group --> hy-icon + hy-site-header --> hy-menu-main-group + style hy-menu-main-group fill:#f9f,stroke:#333,stroke-width:4px +``` + +--- + +Helsinki University Design System diff --git a/src/components/icon/readme.md b/src/components/icon/readme.md index 26a9d79ddd4cd58a379350ea11e06f459780c13b..e5c795da76b0c7609c50d595681daa02a48ed08d 100644 --- a/src/components/icon/readme.md +++ b/src/components/icon/readme.md @@ -38,6 +38,7 @@ - [hy-menu-item-sidebar](../navigation/menu-item-sidebar) - [hy-menu-language](../navigation/menu-language) - [hy-menu-level-container](../navigation/menu-level-container) +- [hy-menu-main-group](../hy-menu-main-group) - [hy-menu-mobile-breadcrumb](../navigation/menu-mobile-breadcrumb) - [hy-menu-sidebar](../navigation/menu-sidebar) - [hy-pager-item](../pagination/hy-pager-item) @@ -79,6 +80,7 @@ graph TD; hy-menu-item-sidebar --> hy-icon hy-menu-language --> hy-icon hy-menu-level-container --> hy-icon + hy-menu-main-group --> hy-icon hy-menu-mobile-breadcrumb --> hy-icon hy-menu-sidebar --> hy-icon hy-pager-item --> hy-icon diff --git a/src/components/site-header/readme.md b/src/components/site-header/readme.md index 51ee063369e9deb1921e1c1bfaa0051a47acb969..f22ff03cc39bd2e3512f1b070637bc6512c9941b 100644 --- a/src/components/site-header/readme.md +++ b/src/components/site-header/readme.md @@ -7,6 +7,7 @@ | Property | Attribute | Description | Type | Default | | ---------------------- | ------------------------- | ----------- | -------------------------------------------------------------------------------------------------- | ------------------ | | `dataDesktopLinks` | `data-desktop-links` | | `DesktopLinks[] \| string` | `undefined` | +| `dataMainMenuLinks` | `data-main-menu-links` | | `DesktopLinks[] \| string` | `undefined` | | `dataMenuDonate` | `data-menu-donate` | | `string` | `undefined` | | `dataMenuLanguage` | `data-menu-language` | | `string` | `undefined` | | `dataSearchTools` | `data-search-tools` | | `DesktopLinks[] \| string` | `undefined` | @@ -33,6 +34,7 @@ ### Depends on - [hy-site-logo](site-logo) +- [hy-menu-main-group](../hy-menu-main-group) - [hy-menu-language](../navigation/menu-language) - [hy-site-search](site-search) - [hy-icon](../icon) @@ -43,11 +45,13 @@ ```mermaid graph TD; hy-site-header --> hy-site-logo + hy-site-header --> hy-menu-main-group hy-site-header --> hy-menu-language hy-site-header --> hy-site-search hy-site-header --> hy-icon hy-site-header --> hy-desktop-menu-links hy-site-logo --> hy-icon + hy-menu-main-group --> hy-icon hy-menu-language --> hy-menu-language-item hy-menu-language --> hy-icon hy-site-search --> hy-icon diff --git a/src/components/site-header/site-header.scss b/src/components/site-header/site-header.scss index 59587e2ec79a6fa62427bbaa503453c372461035..162b32b0deeb3edcb77ba63febe71972d6eb7272 100644 --- a/src/components/site-header/site-header.scss +++ b/src/components/site-header/site-header.scss @@ -66,11 +66,25 @@ display: flex; flex-flow: row; place-content: center space-between; + position: relative; @include breakpoint($narrow) { margin: 0 auto; max-width: $fullhd; } + + &__main-menu-container { + color: var(--grayscale-white); + } + + &__main-menu { + background-color: black; + color: white; + display: none; + position: absolute; + bottom: 0; + left: 0; + } } .hy-site-header__logo-container { diff --git a/src/components/site-header/site-header.tsx b/src/components/site-header/site-header.tsx index e9c624e7028de6bc103ce265b3f4ed81df3541d4..64c4a38520662582025947aa687f3b20336e3417 100644 --- a/src/components/site-header/site-header.tsx +++ b/src/components/site-header/site-header.tsx @@ -40,6 +40,7 @@ export class SiteHeader { First level menu links to be displayed on Desktop screens. * */ @Prop() dataDesktopLinks: DesktopLinks[] | string; + @Prop() dataMainMenuLinks: DesktopLinks[] | string; @Prop() dataSearchTools: DesktopLinks[] | string; @State() isMobile: boolean; @@ -225,6 +226,13 @@ export class SiteHeader { <div class={'hy-site-header__logo-container'}> <hy-site-logo size={logoSize} color={logoColor} url={this.logoUrl} label={this.logoLabel} /> </div> + + <hy-menu-main-group + //className={'menu--secondary__item is-first'} + is-mobile={false} + data-main-menu={this.dataMainMenuLinks} + /> + <div class={'menu--secondary'}> <hy-menu-language class={'menu--secondary__item is-first'}