diff --git a/src/components/Hero.tsx b/src/components/Hero.tsx index 5602303..73f6827 100644 --- a/src/components/Hero.tsx +++ b/src/components/Hero.tsx @@ -19,18 +19,18 @@ export function Hero() { {heroContent.codeLine} -
+
handleAnchorClick(event, '#pakketten')} - className="rounded-lg bg-accent px-6 py-3.5 text-[0.98rem] font-semibold text-[var(--color-accent-contrast)] transition-transform hover:bg-[var(--color-accent-hover)] active:scale-[0.98]" + className="rounded-lg bg-accent px-6 py-3.5 text-center text-[0.98rem] font-semibold text-[var(--color-accent-contrast)] transition-transform hover:bg-[var(--color-accent-hover)] active:scale-[0.98] sm:text-left" > Bekijk pakketten handleAnchorClick(event, '#contact')} - className="rounded-lg border border-line px-6 py-3.5 text-[0.98rem] font-semibold text-text transition-colors hover:border-accent-line" + className="rounded-lg border border-line px-6 py-3.5 text-center text-[0.98rem] font-semibold text-text transition-colors hover:border-accent-line sm:text-left" > Plan een gesprek diff --git a/src/components/Nav.tsx b/src/components/Nav.tsx index f54c9f6..d605391 100644 --- a/src/components/Nav.tsx +++ b/src/components/Nav.tsx @@ -1,8 +1,16 @@ +import { useState } from 'react'; import { navLinks } from '../data/content'; import { ThemeToggle } from './ThemeToggle'; import { handleAnchorClick } from '../utils/scrollToHash'; export function Nav() { + const [isMenuOpen, setIsMenuOpen] = useState(false); + + function handleMobileLinkClick(event: React.MouseEvent, href: string) { + handleAnchorClick(event, href); + setIsMenuOpen(false); + } + return ( ); } diff --git a/src/components/__tests__/Nav.test.tsx b/src/components/__tests__/Nav.test.tsx index 49a042a..2c75990 100644 --- a/src/components/__tests__/Nav.test.tsx +++ b/src/components/__tests__/Nav.test.tsx @@ -37,4 +37,32 @@ describe('Nav', () => { fireEvent.click(toggle); expect(toggle).toHaveAttribute('aria-pressed', 'true'); }); + + it('opens and closes the mobile menu via the toggle button', () => { + renderNav(); + expect(screen.queryByTestId('nav-mobile-menu')).not.toBeInTheDocument(); + + const mobileToggle = screen.getByTestId('nav-mobile-toggle'); + expect(mobileToggle).toHaveAttribute('aria-expanded', 'false'); + + fireEvent.click(mobileToggle); + expect(mobileToggle).toHaveAttribute('aria-expanded', 'true'); + const mobileMenu = screen.getByTestId('nav-mobile-menu'); + expect(mobileMenu).toBeInTheDocument(); + + fireEvent.click(mobileToggle); + expect(screen.queryByTestId('nav-mobile-menu')).not.toBeInTheDocument(); + }); + + it('closes the mobile menu when a link inside it is clicked', () => { + renderNav(); + fireEvent.click(screen.getByTestId('nav-mobile-toggle')); + const mobileMenu = screen.getByTestId('nav-mobile-menu'); + + const link = mobileMenu.querySelector('a[href="#pakketten"]'); + expect(link).not.toBeNull(); + fireEvent.click(link as HTMLAnchorElement); + + expect(screen.queryByTestId('nav-mobile-menu')).not.toBeInTheDocument(); + }); });