Markus Michalski FAQ

Barrierefreiheit-Widget: Storefront-Integration

Barrierefreiheit-Widget für Sylius - Twig Hooks, Skip-Link-Ziel, Theming per CSS Custom Properties, Theme-Kompatibilität

English Version

Zurück zur Übersicht

Barrierefreiheit-Widget: Storefront-Integration

Live Demo: Teste dieses und weitere Plugins live — ohne Installation, ohne Risiko: demo.markus-michalski.net

Twig Hooks

Das Plugin registriert sich über folgende Hooks, kein Core-Template wird überschrieben:

Hook Zweck
sylius_shop.base#stylesheets Lädt accessibility.css; bei mindestens einem aktiven Werkzeug außerdem accessibility-early.js (synchron, vor dem ersten Rendern) und, bei aktivem Farbfilter, einen Inline-<style> mit den Filterregeln
sylius_shop.base#javascripts Lädt accessibility.js (defer), nur wenn mindestens ein Werkzeug aktiv ist
sylius_shop.base.header Skip-Link (Priorität 1000, ganz vorn) und das Sprungziel (Priorität 50)
sylius_shop.base.offcanvas Das schwebende Widget selbst (Priorität -100), außerhalb des Seiten-Wrappers

Ein Theme, das diese Hook-Slots ersetzt, muss die Templates des Plugins selbst rendern, sonst erscheint nichts.

Der Skip-Link ist ein Link <a class="mmd-a11y-skip-link" href="#mmd-a11y-main"> mit dem Text „Zum Hauptinhalt springen“ (EN: „Skip to main content“). Er ist per CSS außerhalb des Bildschirms und erscheint nur, wenn er den Tastaturfokus bekommt.

Die Basis-Vorlage des Shops hat kein <main> und keine Inhalts-ID. Das Plugin gibt deshalb selbst einen leeren, fokussierbaren <div id="mmd-a11y-main" tabindex="-1" role="region"> mit aria-label („Hauptinhalt“) aus, und zwar im Hook sylius_shop.base.header zwischen der Navigation (Priorität 100) und den Flash-Nachrichten (Priorität 0), damit eine Validierungsmeldung oder „In den Warenkorb gelegt“-Nachricht nach dem Sprung nicht übersprungen wird. Link und Ziel erscheinen nur, wenn die Einstellung für den Skip-Link im Channel eingeschaltet ist.

Setzt dein Theme den Inhalt an anderer Stelle, überschreibe das Template des Plugins nach dem üblichen Symfony-Muster unter templates/bundles/MmdSyliusAccessibilityPlugin/shop/skip_target.html.twig (Original: templates/shop/skip_target.html.twig im Plugin).

Theming

Die Effekte sind einfache Klassen auf <html>, Farben/Abstände über CSS Custom Properties aus deinem Theme überschreibbar:

:root {
    --mmd-a11y-primary: #0b6b3a;
    --mmd-a11y-primary-dark: #08522c;
    --mmd-a11y-offset-x: 24px;
    --mmd-a11y-offset-bottom: 90px;
    --mmd-a11y-z-index: 1020;
}

Weitere Properties im Stylesheet: --mmd-a11y-bg, --mmd-a11y-text, --mmd-a11y-text-light, --mmd-a11y-border, --mmd-a11y-control-border, --mmd-a11y-focus, --mmd-a11y-hover, --mmd-a11y-size und --mmd-a11y-panel-width.

Einstellung Klassen auf <html>
Schriftgröße mmd-a11y-font-small, mmd-a11y-font-large
Kontrast mmd-a11y-contrast-high, mmd-a11y-contrast-inverted
Farbfilter mmd-a11y-filter-protanopia, -deuteranopia, -tritanopia
Blaulicht mmd-a11y-blue-light
Animationen reduzieren mmd-a11y-reduce-motion

localStorage-Key: mmd-accessibility-settings. Eine Headless-Storefront kann dieselben Klassen als Konvention wiederverwenden (siehe Shop API).

Die Farbfilter sitzen bewusst auf <html>, nicht auf einem Wrapper-Element: Ein Filter auf einem Wrapper würde zum Containing Block jedes position: fixed-Elements (Sticky-Header, Banner) und dessen Platzierung zerstören.

Verhalten im Detail