diff --git a/components/Header/MainMenu/MobileMenu/index.tsx b/components/Header/MainMenu/MobileMenu/index.tsx index fc875202d..08c7a2d11 100644 --- a/components/Header/MainMenu/MobileMenu/index.tsx +++ b/components/Header/MainMenu/MobileMenu/index.tsx @@ -24,7 +24,6 @@ export default function MobileMenu({ }: React.PropsWithChildren) { const intl = useIntl() const { - handleHamburgerClick, toggleDropdown, isHamburgerMenuOpen, isMyPagesMobileMenuOpen, @@ -32,6 +31,12 @@ export default function MobileMenu({ isFooterLanguageSwitcherOpen, } = useDropdownStore() + const isHamburgerExtended = + isHamburgerMenuOpen || + isMyPagesMobileMenuOpen || + isHeaderLanguageSwitcherMobileOpen || + isFooterLanguageSwitcherOpen + useHandleKeyUp((event: KeyboardEvent) => { if (event.key === "Escape" && isHamburgerMenuOpen) { toggleDropdown(DropdownTypeEnum.HamburgerMenu) @@ -49,18 +54,15 @@ export default function MobileMenu({ <> - + { + if (event.key === "Escape" && isMegaMenuOpen) { + toggleMegaMenu(false) + } + }) + + function closeMegaMenu() { + toggleMegaMenu(false) + } + return ( + + ) +} diff --git a/components/Header/MainMenu/NavigationMenu/MegaMenu/megaMenu.module.css b/components/Header/MainMenu/NavigationMenu/MegaMenu/megaMenu.module.css new file mode 100644 index 000000000..6eb7abd2c --- /dev/null +++ b/components/Header/MainMenu/NavigationMenu/MegaMenu/megaMenu.module.css @@ -0,0 +1,108 @@ +.megaMenuContent { + display: grid; + /* align-content: start; */ +} + +.seeAllLink { + display: flex; + padding: var(--Spacing-x2) var(--Spacing-x3); + align-items: center; + gap: var(--Spacing-x1); + background-color: var(--Base-Surface-Secondary-light-Normal); +} + +.submenus { + list-style: none; + display: grid; + gap: var(--Spacing-x3); + padding: var(--Spacing-x2) var(--Spacing-x4); +} + +.submenu { + list-style: none; +} + +.submenuItem { + display: flex; +} + +.submenusItem { + display: grid; + gap: var(--Spacing-x1); + align-content: start; +} + +.link { + padding: var(--Spacing-x1) 0; + font-weight: var(--typography-Body-Bold-fontWeight); + width: 100%; +} + +.backWrapper { + padding: var(--Spacing-x2); +} + +.backButton { + background-color: transparent; + border: none; + padding: 0; + cursor: pointer; + display: flex; + align-items: center; + gap: var(--Spacing-x1); + width: 100%; +} + +@media screen and (max-width: 767px) { + .megaMenuContent { + gap: var(--Spacing-x2); + } + .submenusItem:first-child { + padding-bottom: var(--Spacing-x2); + border-bottom: 1px solid var(--Primary-Light-On-Surface-Divider-subtle); + } + + .cardWrapper { + background-color: var(--Base-Surface-Secondary-light-Normal); + padding: var(--Spacing-x4) var(--Spacing-x2); + } +} + +@media screen and (min-width: 768px) { + .megaMenuContent { + grid-template-rows: auto 1fr; + grid-template-areas: + "seeAllLink" + "submenus"; + width: 600px; + } + + .megaMenuContent:has(.cardWrapper) { + width: 900px; + grid-template-columns: repeat(3, 1fr); + grid-template-areas: + "seeAllLink seeAllLink card" + "submenus submenus card"; + } + + .seeAllLink { + grid-area: seeAllLink; + } + + .submenus { + grid-area: submenus; + grid-template-columns: repeat(2, 1fr); + } + + .submenusItem:first-child { + border-right: 1px solid var(--Primary-Light-On-Surface-Divider-subtle); + } + + .cardWrapper { + grid-area: card; + } + + .cardWrapper .card { + border-radius: 0; + } +} diff --git a/components/Header/MainMenu/NavigationMenu/NavigationMenuItem/index.tsx b/components/Header/MainMenu/NavigationMenu/NavigationMenuItem/index.tsx index 5b1b2c80a..e0ff99f4d 100644 --- a/components/Header/MainMenu/NavigationMenu/NavigationMenuItem/index.tsx +++ b/components/Header/MainMenu/NavigationMenu/NavigationMenuItem/index.tsx @@ -2,17 +2,12 @@ import useDropdownStore from "@/stores/main-menu" -import { - ArrowRightIcon, - ChevronDownIcon, - ChevronRightIcon, -} from "@/components/Icons" -import Card from "@/components/TempDesignSystem/Card" +import { ChevronDownIcon, ChevronRightIcon } from "@/components/Icons" import Link from "@/components/TempDesignSystem/Link" -import Caption from "@/components/TempDesignSystem/Text/Caption" import { useHandleKeyUp } from "@/hooks/useHandleKeyUp" import MainMenuButton from "../../MainMenuButton" +import MegaMenu from "../MegaMenu" import styles from "./navigationMenuItem.module.css" @@ -29,7 +24,7 @@ export default function MenuItem({ item, isMobile }: NavigationMenuItemProps) { } }) - function handleLinkClick() { + function closeMegaMenu() { toggleMegaMenu(false) } @@ -49,62 +44,19 @@ export default function MenuItem({ item, isMobile }: NavigationMenuItemProps) { /> )} - {isMegaMenuOpen ? ( - - ) : null} +
+ {isMegaMenuOpen ? ( + + ) : null} +
) : ( ((set, get) => ({ isHamburgerMenuOpen: false, isMyPagesMobileMenuOpen: false, @@ -17,21 +14,6 @@ const useDropdownStore = create((set, get) => ({ isHeaderLanguageSwitcherMobileOpen: false, isFooterLanguageSwitcherOpen: false, openMegaMenu: false, - handleHamburgerClick: () => { - const state = get() - if (state.isMyPagesMobileMenuOpen) { - set({ isMyPagesMobileMenuOpen: false }) - } else { - if (state.isHeaderLanguageSwitcherMobileOpen) { - set({ isHeaderLanguageSwitcherMobileOpen: false }) - } - if (!state.isFooterLanguageSwitcherOpen) { - set({ isHamburgerMenuOpen: !state.isHamburgerMenuOpen }) - } else { - set({ isFooterLanguageSwitcherOpen: false }) - } - } - }, toggleMegaMenu: (menu: string | false) => set( produce((state: DropdownState) => { @@ -40,7 +22,6 @@ const useDropdownStore = create((set, get) => ({ } else { state.openMegaMenu = menu } - state.isHamburgerMenuOpen = false state.isMyPagesMobileMenuOpen = false state.isMyPagesMenuOpen = false state.isHeaderLanguageSwitcherOpen = false @@ -51,16 +32,28 @@ const useDropdownStore = create((set, get) => ({ toggleDropdown: (dropdown: DropdownTypeEnum) => set( produce((state: DropdownState) => { - state.openMegaMenu = false + const hamburgerShouldStayExpanded = + state.isMyPagesMenuOpen || + state.isHeaderLanguageSwitcherMobileOpen || + state.isFooterLanguageSwitcherOpen || + !!state.openMegaMenu switch (dropdown) { case DropdownTypeEnum.HamburgerMenu: - state.isHamburgerMenuOpen = !state.isHamburgerMenuOpen - state.isMyPagesMobileMenuOpen = false - state.isMyPagesMenuOpen = false - state.isHeaderLanguageSwitcherOpen = false - state.isHeaderLanguageSwitcherMobileOpen = false - state.isFooterLanguageSwitcherOpen = false + if (state.isHamburgerMenuOpen) { + if (hamburgerShouldStayExpanded) { + state.isMyPagesMobileMenuOpen = false + state.isHeaderLanguageSwitcherMobileOpen = false + state.isFooterLanguageSwitcherOpen = false + state.openMegaMenu = false + } else { + state.isHamburgerMenuOpen = false + } + } else if (state.isMyPagesMobileMenuOpen) { + state.isMyPagesMobileMenuOpen = false + } else { + state.isHamburgerMenuOpen = true + } break case DropdownTypeEnum.MyPagesMobileMenu: state.isMyPagesMobileMenuOpen = !state.isMyPagesMobileMenuOpen @@ -69,6 +62,7 @@ const useDropdownStore = create((set, get) => ({ state.isHeaderLanguageSwitcherOpen = false state.isHeaderLanguageSwitcherMobileOpen = false state.isFooterLanguageSwitcherOpen = false + state.openMegaMenu = false break case DropdownTypeEnum.MyPagesMenu: state.isMyPagesMenuOpen = !state.isMyPagesMenuOpen @@ -77,6 +71,7 @@ const useDropdownStore = create((set, get) => ({ state.isHeaderLanguageSwitcherOpen = false state.isHeaderLanguageSwitcherMobileOpen = false state.isFooterLanguageSwitcherOpen = false + state.openMegaMenu = false break case DropdownTypeEnum.HeaderLanguageSwitcher: state.isHeaderLanguageSwitcherOpen = @@ -86,15 +81,16 @@ const useDropdownStore = create((set, get) => ({ state.isMyPagesMenuOpen = false state.isHeaderLanguageSwitcherMobileOpen = false state.isFooterLanguageSwitcherOpen = false + state.openMegaMenu = false break case DropdownTypeEnum.HeaderLanguageSwitcherMobile: state.isHeaderLanguageSwitcherMobileOpen = !state.isHeaderLanguageSwitcherMobileOpen - state.isHamburgerMenuOpen = false state.isMyPagesMobileMenuOpen = false state.isMyPagesMenuOpen = false state.isHeaderLanguageSwitcherOpen = false state.isFooterLanguageSwitcherOpen = false + state.openMegaMenu = false break case DropdownTypeEnum.FooterLanguageSwitcher: state.isFooterLanguageSwitcherOpen = @@ -104,6 +100,7 @@ const useDropdownStore = create((set, get) => ({ state.isMyPagesMenuOpen = false state.isHeaderLanguageSwitcherOpen = false state.isHeaderLanguageSwitcherMobileOpen = false + state.openMegaMenu = false if (state.isFooterLanguageSwitcherOpen) { document.body.classList.add("overflow-hidden") } else { @@ -116,42 +113,3 @@ const useDropdownStore = create((set, get) => ({ })) export default useDropdownStore - -const error = [ - { - query: { - hotelId: "698", - params: { hotelId: "698", language: "En", include: "RoomCategories" }, - }, - }, - { - query: { lang: "en" }, - error: { - issues: [ - { - code: "invalid_type", - expected: "object", - received: "undefined", - path: [ - "all_header", - "items", - 0, - "menu_items", - 0, - "submenu", - 0, - "links", - 0, - "linkConnection", - "edges", - 0, - "node", - "web", - ], - message: "Required", - }, - ], - name: "ZodError", - }, - }, -] diff --git a/types/components/dropdown/dropdown.ts b/types/components/dropdown/dropdown.ts index e282e5ee1..368ffcc43 100644 --- a/types/components/dropdown/dropdown.ts +++ b/types/components/dropdown/dropdown.ts @@ -8,7 +8,6 @@ export interface DropdownState { openMegaMenu: string | false toggleMegaMenu: (menu: string | false) => void toggleDropdown: (dropdown: DropdownTypeEnum) => void - handleHamburgerClick: () => void } export enum DropdownTypeEnum { @@ -18,7 +17,6 @@ export enum DropdownTypeEnum { HeaderLanguageSwitcher = "headerLanguageSwitcher", HeaderLanguageSwitcherMobile = "headerLanguageSwitcherMobile", FooterLanguageSwitcher = "footerLanguageSwitcher", - MegaMenu = "megaMenu", } export type DropdownType = `${DropdownTypeEnum}` diff --git a/types/components/header/megaMenu.ts b/types/components/header/megaMenu.ts new file mode 100644 index 000000000..8eab851f3 --- /dev/null +++ b/types/components/header/megaMenu.ts @@ -0,0 +1,9 @@ +import type { MenuItem } from "@/types/trpc/routers/contentstack/header" + +export interface MegaMenuProps { + title: MenuItem["title"] + seeAllLink: MenuItem["seeAllLink"] + submenu: MenuItem["submenu"] + card: MenuItem["card"] + isMobile: boolean +}