feat(andreknie.de): improve accessibility and initial loading

This commit is contained in:
2026-07-28 23:53:18 +02:00
parent cf0fbd077e
commit 88bd952a60
27 changed files with 393 additions and 109 deletions
@@ -13,7 +13,15 @@ export default function Navigation() {
return () => window.removeEventListener('scroll', handleScroll)
}, [])
// Close the mobile menu whenever navigation occurs.
useEffect(() => {
function handleKeyDown(event) {
if (event.key === 'Escape') setMobileOpen(false)
}
document.addEventListener('keydown', handleKeyDown)
return () => document.removeEventListener('keydown', handleKeyDown)
}, [])
function closeMenu() {
setMobileOpen(false)
}
@@ -28,8 +36,10 @@ export default function Navigation() {
{ to: '/kontakt', label: 'Kontakt' },
]
const isActive = (path) => location.pathname === path || location.pathname.startsWith(`${path}/`)
return (
<nav className={`navigation ${scrolled ? 'scrolled' : ''}`}>
<nav className={`navigation ${scrolled ? 'scrolled' : ''}`} aria-label="Hauptnavigation">
<div className="nav-container app-container">
<Link to="/" className="logo" onClick={closeMenu}>
<span className="logo-text">Dr. André Knie</span>
@@ -40,18 +50,21 @@ export default function Navigation() {
<Link
key={link.to}
to={link.to}
className={`nav-link ${location.pathname === link.to ? 'active' : ''}`}
className={`nav-link ${isActive(link.to) ? 'active' : ''}`}
aria-current={isActive(link.to) ? 'page' : undefined}
>
{link.label}
</Link>
))}
</div>
{/* Mobile hamburger (only visible on small screens) */}
<button
className={`hamburger ${mobileOpen ? 'active' : ''}`}
onClick={() => setMobileOpen(!mobileOpen)}
aria-label="Menü öffnen"
onClick={() => setMobileOpen(open => !open)}
aria-label={mobileOpen ? 'Menü schließen' : 'Menü öffnen'}
aria-expanded={mobileOpen}
aria-controls="mobile-navigation"
type="button"
>
<span></span>
<span></span>
@@ -59,14 +72,14 @@ export default function Navigation() {
</button>
</div>
{/* Mobile dropdown */}
<div className={`nav-mobile ${mobileOpen ? 'open' : ''}`}>
<div id="mobile-navigation" className={`nav-mobile ${mobileOpen ? 'open' : ''}`}>
{navLinks.map(link => (
<Link
key={link.to}
to={link.to}
className={`nav-mobile-link ${location.pathname === link.to ? 'active' : ''}`}
className={`nav-mobile-link ${isActive(link.to) ? 'active' : ''}`}
onClick={closeMenu}
aria-current={isActive(link.to) ? 'page' : undefined}
>
{link.label}
</Link>