Navigation: Dropdown-Disclosure-Pattern (WCAG 2.1 AA)
61148:47024 (P2503-84), ADR-0027.
Problem Statement
Nutzer auf solcom.de können nicht erkennen, welche Unterseiten sich hinter den vier Top-Level-Navigationspunkten verbergen. Die aktuelle Hauptnavigation ist flach (Single-Level) — es gibt keine Möglichkeit, direkt aus der Navigation heraus auf eine Unterseite zu springen, ohne die URL zu kennen. Das zwingt Nutzer zu unnötigem Raten oder zur Nutzung der Suche.
Gleichzeitig schließt die aktuelle Implementierung Screenreader- und Keyboard-Nutzer strukturell aus: es gibt keinen maschinenlesbaren Hinweis auf Unterpunkte, keine Keyboard-Navigation in Untermenüs, keine ARIA-States für geöffnete/geschlossene Zustände.
Solution
Erweiterung der bestehenden byte_theme:navbar-SDC um ein 2-stufiges Dropdown-System nach dem WAI-ARIA Disclosure Navigation Pattern:
- Top-Level-Items mit Kindern werden zu
<button aria-expanded>-Toggles, die ein Flyout-Panel öffnen. - Sub-Items (2. Ebene) rendern als barrierefreie
<a>-Links mit Lime-Arrow-Indikator. - Mobile Accordion im bestehenden Hamburger-Overlay — kein separates Panel, gleiche ARIA-Mechanik.
- WCAG 2.1 AA durchgehend: Keyboard-Navigation, Focus-Management,
aria-current="page"auf dem aktiven Sub-Link.
byte_theme:navbar-Schema (Slots logo/navigation/links) bleibt unverändert — nur menu--main.html.twig, CSS und navbar.js werden erweitert.User Stories
- Als Sitebesucher möchte ich beim Klicken auf einen Top-Level-Navigationspunkt eine Liste der Unterseiten sehen, damit ich direkt zu dem Inhalt navigieren kann, den ich suche.
- Als Sitebesucher möchte ich erkennen, welche Navigationspunkte Unterseiten haben (Chevron-Indikator), damit ich nicht planlos auf alle Items klicke.
- Als Sitebesucher möchte ich, dass ein offenes Dropdown automatisch schließt, wenn ich außerhalb davon klicke, damit meine Arbeitsfläche nicht unnötig verdeckt wird.
- Als Sitebesucher möchte ich, dass immer nur ein Dropdown gleichzeitig offen ist, damit die Navigation übersichtlich bleibt.
- Als Keyboard-Nutzer möchte ich ein Dropdown mit Enter oder Leertaste öffnen und schließen, damit ich die Navigation ohne Maus benutzen kann.
- Als Keyboard-Nutzer möchte ich ein offenes Dropdown mit Escape schließen und den Fokus zurück auf den Trigger-Button erhalten, damit ich meinen Navigationsfluss nicht verliere.
- Als Keyboard-Nutzer möchte ich mit Tab durch die geöffneten Sub-Items navigieren, damit ich alle Optionen erreichen kann.
- Als Screenreader-Nutzer möchte ich hören, ob ein Navigationspunkt ein Untermenü hat und ob dieses geöffnet oder geschlossen ist (
aria-expanded), damit ich die Struktur der Navigation verstehe. - Als Screenreader-Nutzer möchte ich auf dem aktiven Sub-Link
aria-current="page"hören, damit ich weiß, auf welcher Seite ich mich befinde. - Als mobiler Nutzer möchte ich im Hamburger-Menü auf einen Hauptpunkt tippen und die Unterseiten direkt darunter aufklappen sehen (Accordion), damit ich nicht in ein weiteres Panel wechseln muss.
- Als mobiler Nutzer möchte ich ein aufgeklapptes Accordion durch erneutes Tippen auf den Hauptpunkt wieder schließen, damit die Navigation kompakt bleibt.
- Als Nutzer auf einer Unterseite möchte ich im aktiven Parent-Button visuell erkennen, in welchem Hauptbereich ich mich befinde (Active-Trail-Underline), damit ich meinen Kontext nicht verliere.
- Als Nutzer möchte ich auf einen Sub-Link klicken und direkt auf die entsprechende Seite navigiert werden, damit die Navigation intuitiv funktioniert.
- Als Redakteur möchte ich Untermenü-Punkte einfach über das Drupal-Menü-Interface (
/admin/structure/menu/manage/main) anlegen und hierarchisch einordnen, damit ich keine Entwicklerunterstützung für Menü-Änderungen brauche.
Implementation Decisions
Disclosure Navigation Pattern (nicht ARIA Menubar)
Das WAI-ARIA Disclosure Navigation Pattern wird gegenüber dem ARIA Menubar Pattern bevorzugt. Disclosure ist für Site-Navigation geeignet, erfordert keine Arrow-Key-Behandlung zwischen Top-Level-Items und ist für Screenreader-Nutzer auf Navigation-Sites intuitiver. Quellen: WAI-ARIA Authoring Practices Guide. Entscheidung dokumentiert in ADR-0027.
Template-Erweiterung: menu--main.html.twig
Das bestehende Template wird um item.below-Rendering erweitert. Conditional auf item.below: wenn Kinder vorhanden, <button aria-expanded> mit aria-controls statt <a>. Drupal-Menü-Semantik (in_active_trail, item.attributes) bleibt vollständig erhalten. Maximale Tiefe: 2 Ebenen — 3. Ebene wird nicht gerendert.
Neue CSS-Klasse: .solcom-nav-sub-link
Eigene CSS-Klasse für zweite Navigationsebene. Differenzierung zu .solcom-btn-link: führender Lime-Arrow via ::before-Pseudo-Element. Kein byte_theme:button-link-Include — Drupal-Menü-Semantik bleibt erhalten, kein SDC-Overhead. Zu definieren in src/main.css.
JavaScript: navbar.js-Erweiterung
Bestehender Hamburger-Toggle bleibt unverändert. Neue Mechanismen:
- Dropdown-Toggle: click auf
aria-expanded-Buttons öffnet/schließt Panel, schließt andere offene Panels - Click-outside-close: Klick außerhalb schließt alle offenen Panels
- Escape-close: Escape schließt offenes Panel und gibt Fokus zurück auf Trigger
- Mobile-Accordion: gleiche Toggle-Mechanik, aber Panel expandiert inline im Flow statt absolut positioniert
WCAG 2.1 AA — Pflicht-Attribute
aria-expanded="true|false"auf Toggle-Buttonaria-controls="[panel-id]"auf Toggle-Button, korrespondierendeidauf Panel-<ul>aria-current="page"auf dem aktiven Sub-<a>-Link (nicht auf Parent-Button)- Focus-Return: beim Schließen via Escape/Click-outside kehrt Fokus auf Trigger zurück
Active-Trail
solcom-btn-link--active-trail-Modifier auch auf Parent-<button>, wenn item.in_active_trail true. Konsistent mit dem bestehenden Underline-Pattern aus ADR-0008. aria-current="page" kommt ausschließlich auf den aktiven Sub-<a>-Link.
Flyout-Panel-Styling
Absolut positioniertes Panel unterhalb des Trigger-Buttons. White Background, Rounded Corners, Shadow. Sichtbarkeit via CSS-Klasse, gesteuert durch JS (nicht via display:none — für Transitions). Nur Dark-Navbar-Kontext.
Navbar-SDC-Schema bleibt unverändert
Das byte_theme:navbar-Schema (logo/navigation/links-Slots, menu_align-Prop) wird nicht geändert. Cherry-Pick-Kompatibilität zum Upstream-Byte-Theme bleibt erhalten (ADR-0008-Prinzip).
Testing Decisions
Was ein guter Test ist
Tests prüfen das externe Verhalten des gerenderten HTML — nicht den Twig-Code selbst. Ein Test beschreibt einen Contract: „Wenn das Menu ein Item mit Kindern enthält, MUSS das gerenderte Markup einen <button aria-expanded> enthalten, kein <a>." Tests sind unabhängig von CSS-Klassen-Implementierungsdetails und JS-Interaktionen.
Zu testende Module
menu--main.html.twig— Kernel-Tests inHeaderTemplatesTest.php(Prior Art: bestehende 7 Tests aus ADR-0008). Neue Contracts:- Item mit
below: rendert<button aria-expanded="false">, kein<a> aria-controlsauf Button referenziertiddes Sub-<ul>- Sub-Items haben CSS-Klasse
solcom-nav-sub-link - Aktiver Sub-Link hat
aria-current="page" - 3. Ebene wird nicht gerendert (Items aus
item.below.belowtauchen nicht im Output auf) - Parent-Button mit
in_active_trail=truehatsolcom-btn-link--active-trail
- Item mit
Nicht getestet: JS-Interaktion (navbar.js), CSS-Animation, visuelle Darstellung. Diese können optional als Playwright E2E-Tests ergänzt werden (WCAG 2.1 AA Keyboard-Navigation), sind aber nicht Pflicht für den initialen PR.
Out of Scope
- Footer-Implementierung — kein Figma-Frame in P2503-84, eigenes Ticket
- Light-Navigation-Variante (ivory BG) — kein aktueller Anwendungsfall, eigener ADR bei Bedarf
- 3-Ebenen-Navigation — nicht im Figma, explizit nicht supportiert (ADR-0027)
- URL-Konventionen / Path Aliases — bereits implementiert (Pathauto), kein Handlungsbedarf
- Sub-Site-Routing (Subdomains vs. Pfad-Präfixe) — offenes Thema in ADR-0018, nicht P2503-84
- Sprachschalter EN-Aktivierung — Drupal-Konfigurationsaufgabe, kein Code
- Menü-Inhalt (konkrete Menü-Items und Hierarchie) — redaktionelle Aufgabe
Further Notes
- Figma-Quelle:
figma.com/design/CHHDfbpX8Ys2LBiGs5HVK0, Nodes61148:47024(Components-Overview),61730:37631(Macbook Pro 16),61148:35369(Documentation 1). Zeigen 4 Top-Level-Items mit Dropdown-Chevrons und Flyout-Panels mit Placeholder-Links. - Architekturentscheidungen sind vollständig in ADR-0027 dokumentiert (erweitert ADR-0008). Die Grilling-Session vom 2026-05-13 hat 11 Entscheidungen systematisch geklärt.
- Bekannte Lücken aus der Docs-Lage (nicht in Scope, aber dokumentiert): URL-Konventionen (
context/0006), Sub-Site-Routing (adr/0018), Footer (kein ADR, kein Figma). - Canvas-Config ist nicht betroffen — die Navigation ist über
menu--main.html.twigverdrahtet, nicht über Canvas-Block-Config.