Accessibility nutrition labels
Public per-product manifest declaring which accessibility features the product supports — screen-reader, keyboard-only, captions, dynamic-type, reduced-motion, color-blind-mode, high-contrast, voice-control. Renders as a badge row on every product page in KDS + Hub. Modeled after Apple's App Store accessibility nutrition labels.
Spec — Accessibility nutrition labels
*tatus* v0.1.0 — Draft. Bootstraps a new
specs/accessibility/toplevel group. First entry; companion spec `a11ymodes.kmd` may follow in the same dir for theme-mode coverage (#062).
R1 — Canonical label vocabulary
A product MAY declare any subset of these 15 labels. Each label has a fixed slug + display name + 1-line description; the product declares "supported" / "partial" / "not-supported".
| Slug | Display name |
|---|---|
screen-reader |
Screen reader |
keyboard-only |
Full keyboard navigation |
voice-control |
Voice control |
switch-control |
Switch control |
captions |
Captions / subtitles |
audio-descriptions |
Audio descriptions |
dynamic-type |
User-scalable text |
reduced-motion |
Honors prefers |
color-blind-mode |
Color-blind theme mode |
high-contrast |
High-contrast mode |
forced-colors |
Forced-colors (Windows) |
magnification |
Pinch / OS magnification compatible |
haptics-optional |
Haptics optional (toggleable) |
sound-optional |
Audio cues optional (toggleable) |
text-only-mode |
Text-only rendering (no images) |
R2 — Product manifest schema
Products declare in koder.toml under [a11y_labels]:
[a11y_labels]
screen-reader = "supported" # or "partial" / "not-supported"
keyboard-only = "supported"
voice-control = "partial"
captions = "not-supported"
# omitted slugs = "unknown" (no badge rendered)R3 — Rendering contract
- KDS renders the labels on every product landing
(
/<locale>/products/<slug>/) as a 4-column badge grid in a section titled "Accessibility". - Each badge shows the icon + display name + status pill (green
"supported" / yellow "partial" / gray "not-supported").
- Hub MAY consume the same
koder.tomlblock and render an inlinebadge row on
hub.koder.dev/apps/<slug>. - Products without an
[a11y_labels]block render no badge row (noteven "unknown") — encourages explicit declaration.
R4 — Honesty rule
A label MUST NOT be declared "supported" unless an automated test or documented manual test verifies it. False claims are worse than absent claims; KDS does NOT police but reserves the right to delist a product landing if owner-documented evidence contradicts the label.
R5 — i18n + a11y
- Display names + descriptions translatable per
specs/i18n/contract.kmd. - Badge row itself MUST be screen-reader friendly: a single
<h2>("Accessibility"), an unordered list of labels, status pill carries an accessible name ("Supported: Screen reader").
R6 — Update cadence
Product owner SHOULD audit the labels at every minor release. KDS may display a "Last verified: YYYYMMDD" line beneath the grid pulled from koder.toml's [a11y_labels].verified_at.
Não-escopo
- Programmatic verification of the claims (separate audit tooling
ticket if pursued).
- Per-locale label variations (the vocabulary is universal).
- Replacement of WCAG 2.x conformance reports — labels are a marketing
surface, not a substitute for full a11y audits.