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();
+ });
});