Barrierefreiheit stable
VelinStyle zielt auf WCAG-2.2-Level-AAA-orientierte Token-Defaults und Component Contracts —
Fokus, Target Size, Authentifizierungsmuster und Reduced Motion.
Komponenten liefern ARIA, Tastatur-Support und Hilfen für Screenreader und Forced Colors.
Die Nutzung des Frameworks zertifiziert Ihre Anwendung nicht. AAA-Kontrast ist der Default;
mit data-velin-contrast="aa" auf <html> erhalten Sie eine leichtere 4.5:1-Palette.
English: Accessibility
Reifegrad
Tokens, Contracts, initA11y() und Overlay-Focus-Lifecycle sind stable.
A11y-Scores von velinstyle review sind beta-Heuristiken — kein AT-Nachweis.
Wann nutzen
- Framework-Helfer (Skip-Links, Focus-Rings, Form-Summary, Overlay-Focus-Trap) als Defaults übernehmen.
test:a11y:coverage/velinstyle scan --only a11yals CI-Smoke — danach echte AT-Tests.
Wann nicht
- Keine App-AAA-Zertifizierung behaupten, nur weil VelinStyle AAA-orientierte Defaults liefert.
- A11y Dashboard oder
review-Scores nicht als Konformitätsnachweis behandeln.
npm run test:a11y:coverage ·
npx velinstyle scan --only a11y ·
Samples: samples/wcag22-auth.html, samples/wcag22-dragging.html
Component Contracts (38)
Jede ausgelieferte Web Component hat einen Eintrag in core/a11y/component-contracts.json
(Status, Tastatur, Live Regions, Pflichtattribute).
<velin-persist> unterstützt WCAG 2.2 3.3.7 Redundant Entry durch Auto-Save von Formularfeldern;
<velin-form-summary> deckt
3.3.1 Error Identification und 3.3.3 Error Suggestion mit fokussierbarer Fehlerliste ab.
Siehe WCAG-2.2-AAA-Matrix.
Runtime-Bootstrap (initA11y)
Optionales JavaScript verdrahtet einen Live-Region-Announcer und Scroll-Padding für fixierte Header (Focus not obscured).
Import aus @birdapi/velinstyle/a11y oder Aufruf nach dem Komponenten-Bundle.
import { initA11y } from '@birdapi/velinstyle/a11y';
initA11y({ announcer: true, scrollPadding: true });
Icon-only Controls: velin-icon-label oder aria-label am Host — siehe Icons.
Visually Hidden (.velin-sr-only)
Die Klasse .velin-sr-only versteckt ein Element visuell, hält es aber für Screenreader zugänglich. Mit .velin-sr-only--focusable wird das Element sichtbar, sobald es Tastaturfokus erhält.
<!-- Verstecktes Label für Icon-only Buttons -->
<button class="velin-btn velin-btn--ghost" aria-label="Schließen">
<velin-icon name="x" size="18"></velin-icon>
<span class="velin-sr-only">Schließen</span>
</button>
<!-- Skip-Link wird bei Fokus sichtbar -->
<a href="#main-content" class="velin-sr-only velin-sr-only--focusable">
Zum Hauptinhalt springen
</a>Tabben Sie in diesen Bereich, um den Skip-Link sichtbar zu machen:
Zum Hauptinhalt springenSkip-Links
Skip-Links lassen Tastaturnutzer direkt zum Hauptinhalt springen und wiederholte Navigation überspringen. VelinStyle enthält die Klasse .velin-doc-skip, die auch auf dieser Doku-Seite verwendet wird und erst bei Fokus sichtbar ist.
<body>
<a href="#main-content" class="skip-link">Zum Hauptinhalt springen</a>
<nav>...</nav>
<main id="main-content">
<!-- Seiteninhalt -->
</main>
</body>Fokus-Management
Alle interaktiven Komponenten zeigen einen sichtbaren Fokus-Ring. VelinStyle nutzt :focus-visible, damit Fokusindikatoren bei Tastaturnavigation erscheinen, aber nicht bei Mausklicks.
/* VelinStyle-Standard-Fokus-Ring */
:focus-visible {
outline: 2px solid var(--velin-focus-ring-color, #6366f1);
outline-offset: 2px;
}
/* Eigener Fokus-Ring per Utility */
.focus-ring-primary:focus-visible {
--velin-focus-ring-color: var(--velin-primary);
}
.focus-ring-danger:focus-visible {
--velin-focus-ring-color: var(--velin-danger);
}Reduced Motion
VelinStyle respektiert die Media Query prefers-reduced-motion. Wenn sie aktiv ist, werden Animationen und Transitions auf nahezu sofortige Dauer reduziert, damit motion-sensitive Nutzer eine angenehme Erfahrung haben.
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}Animationen können außerdem nur dann angewendet werden, wenn Bewegung erlaubt ist, etwa mit der Utility-Klasse .motion-safe:
<div class="animate-fade-in motion-safe">
Dieser Bereich blendet nur ein, wenn Bewegung erlaubt ist.
</div>Forced Colors (High Contrast)
VelinStyle unterstützt Windows High Contrast Mode und forced-colors: active. Komponentenrahmen, Fokus-Ringe und interaktive Zustände verwenden Systemfarben, damit sie in High-Contrast-Themes sichtbar bleiben.
@media (forced-colors: active) {
.btn {
border: 1px solid ButtonText;
}
.btn:focus-visible {
outline: 2px solid Highlight;
}
.form-control {
border-color: ButtonText;
}
}Fokus nicht verdeckt (WCAG 2.4.11)
Fixierte Header können fokussierte Elemente beim Tabben verdecken. VelinStyle setzt scroll-padding-block-start über --velin-nav-height und bietet .velin-scroll-pt-nav für eigene Layouts.
<html class="velin-scroll-pt-nav">…</html>
Zielgröße (WCAG 2.5.8)
Primäre Controls erfüllen 44×44px über target-size.css (.velin-target-touch).
Farbkontrast (AAA-Defaults)
VelinStyle liefert 7:1-OKLCH-Token-Defaults in :root, Dark Mode und allen 13 Themes — kein Attribut nötig.
Für eine leichtere AA-Palette (4.5:1 Body-Text) data-velin-contrast="aa" auf <html> setzen.
Details: Color, Token-Docs.
WCAG-2.2-Checkliste (Auszug)
| Kriterium | VelinStyle |
|---|---|
| 3.3.8 Accessible Authentication | authentication.css |
| 3.2.6 Consistent Help | consistent-help.css |
| 2.5.7 Dragging Movements | dragging-alternatives.css |
| 2.4.12 Focus Appearance | focus-appearance.css |
| 2.4.11 Focus Not Obscured | focus-not-obscured.css |
| 2.5.8 Target Size | target-size.css |
| 1.4.3 / 1.4.6 Contrast | AAA-Defaults > 7:1; data-velin-contrast="aa" für 4.5:1 |
| 2.1.1 Keyboard | Focus-visible, Focus-Trap, Roving Tabindex (WC Contracts) |
Tests in CI
npm run test:a11y, npm run test:a11y:coverage, npm run test:contrast und
npx velinstyle scan --only a11y.
Siehe Scanner-Rules und
CLI scan.
Weiterführend
- A11y-Muster
- A11y Dashboard (Demo-Playground)
- Vollständige englische Accessibility-Seite mit Code-Beispielen