import React, { useState } from 'react'; import styled from 'styled-components'; import { border, color, layout, lineHeight, position, space, } from 'styled-system'; import { MaterialClose, MaterialMenu, MaterialPerson, T3nPlus, } from '@t3n/icons'; import { ThemeProps } from '@t3n/theme'; import Box from '../../Box'; import Grid from '../../Grid'; import GridItem from '../../GridItem'; import Heading from '../../Heading'; import Icon from '../../Icon'; import Image from '../../Image'; import Input from '../../Input'; import RoundedButton from '../../RoundedButton'; import SearchBoxWrapper from '../../SearchBox/SearchBoxWrapper'; import { PageHeaderLinksType, PageHeaderTeaserImageType } from '../PageHeader'; import BurgerAccordion from './BurgerAccordion'; export interface BurgerNavProps { ressorts: PageHeaderLinksType[]; skills: PageHeaderLinksType[]; brands: PageHeaderTeaserImageType[]; magazines: PageHeaderTeaserImageType[]; campaignUrl: string; campaignImage: string; isLoggedIn?: boolean; isMenuOpen: boolean; onMenuOpenClick: () => void; } const MenuToggleBox = styled(Box)` span { ${({ theme }) => position({ theme, position: 'absolute', top: '1px', right: '-2px', })}; } `; const MenuToggle = styled( ({ doNotDisplayMobile, doNotDisplayDesktop, onClick, ...props }) => ( { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onClick?.(e as unknown as React.MouseEvent); } }} /> ), )` cursor: pointer; ${({ theme, doNotDisplayMobile }) => doNotDisplayMobile && layout({ theme, display: ['none', 'none', 'none', 'block'] })} ${({ theme, doNotDisplayDesktop }) => doNotDisplayDesktop && layout({ theme, display: ['block', 'block', 'block', 'none'] })} `; const MenuContainer = styled(Box)<{ isMenuOpen: boolean }>` position: fixed; overflow-y: auto; right: 0; z-index: -1; box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.1); transform: translateY( ${({ isMenuOpen }) => (isMenuOpen ? '0' : 'calc(-100vh - 65px)')} ); transition: transform 0.333s ease-in-out; ${({ theme }) => color({ theme, bg: 'background.primary', color: 'text.primary' })} ${({ theme }) => layout({ theme, width: [1, '400px'], height: 'calc(100vh - 113px)', })} ${({ theme }) => position({ theme, top: '113px' })} ${({ theme }) => border({ theme, borderWidth: 1, borderColor: 'shades.grey232', borderStyle: 'solid', })} ${({ theme }) => space({ theme, pt: [4, 4, 4, 5], px: [4, 4, 4, 5], pb: '120px' })}; @media (min-width: 768px) { transform: translateX( ${({ isMenuOpen }) => (isMenuOpen ? '0' : 'calc(100% + 10px)')} ); } `; const BurgerButtonBox = styled(Box)` > a { padding: 6px 8px 6px 8px; line-height: 1em; font-size: 0.875rem; } `; const SubMenuItem = styled.a` text-decoration: none; display: block; ${({ theme }) => space({ theme, mb: 4 })}; ${({ theme }) => color({ theme, color: 'text.primary' })} &:hover, :focus { cursor: pointer; ${({ theme }: ThemeProps) => color({ theme, color: 'text.highlight' })} } `; const BurgerHeading = styled(Heading)` ${({ theme }) => lineHeight({ theme, lineHeight: '32px' })} font-size: 1.125rem; > a { text-decoration: none; ${({ theme }) => color({ theme, color: 'text.primary' })} display: flex; align-items: center; &:hover, :focus { cursor: pointer; ${({ theme }: ThemeProps) => color({ theme, color: 'text.highlight' })} } > svg { margin-right: 8px; } } `; const ObjectFitImage = styled(Image)` object-fit: cover; `; const BurgerNav: React.FC = ({ ressorts, skills, brands, magazines, campaignUrl, campaignImage, isLoggedIn, isMenuOpen, onMenuOpenClick, }) => { const [term, setTerm] = useState(''); const tabbable = isMenuOpen; // Track open state for each accordion const [openAccordions, setOpenAccordions] = useState<{ [key: string]: boolean; }>({ Brands: false, Themen: false, Magazine: true, Skills: false, }); const handleAccordionToggle = (key: string) => { setOpenAccordions((prev) => ({ ...prev, [key]: !prev[key], })); }; return ( {isLoggedIn ? ( ) : ( )}
setTerm(e.target.value)} tabIndex={tabbable ? 0 : -1} />
Kampagnen-Grafik Plus-Artikel Newsticker handleAccordionToggle('Themen')} tabbable={tabbable} > {ressorts.map((link) => ( {link.label} ))} handleAccordionToggle('Brands')} tabbable={tabbable} > {brands.map((brand) => ( ))} handleAccordionToggle('Magazine')} tabbable={tabbable} > {magazines.map((magazine) => ( ))} handleAccordionToggle('Skills')} tabbable={tabbable} > {skills.map((link) => ( {link.label} ))} Shop Pioneers Picks Podcast Jobs Events
); }; export default BurgerNav;