diff --git a/DESIGN.md b/DESIGN.md index 9c2eae5..4bb950c 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -174,13 +174,12 @@ not yet found, violet (`--status-airing`) for downloading, neutral for untracked. The word stays present in every chip, so state survives with colour removed. -**Amendment (#253):** a drawn check glyph is a shape, not only a hue, so it -survives the same greyscale read a word does — `mediaStateChip`'s `available` -state is a check glyph instead of the word, word kept in the chip's -`aria-label`. The word-stays-present rule otherwise stands as written, for -every chip whose state is a word with no unambiguous glyph — which is every -status chip this section lists. The exception is scoped to `mediaStateChip`, -not to the derived-status chips above. +One state is exempt: a file being on disk is drawn as a check glyph rather +than the word `available`, with the word on the chip's `aria-label`. A drawn +check is a shape, not only a hue, so it survives the greyscale read the rule +exists to protect. The exemption is that narrow — every other state, and every +derived-status chip above, keeps its word, because no unambiguous glyph stands +in for `incomplete` or `waiting`. Season 0 is invisible to all of it: derived status ignores season 0 episodes entirely, so a manually wanted special cannot pin a series at `incomplete` or diff --git a/web/src/main.ts b/web/src/main.ts index dc66dc4..502055c 100644 --- a/web/src/main.ts +++ b/web/src/main.ts @@ -757,6 +757,9 @@ function mediaStateChip(state: string, wanted: boolean): HTMLSpanElement { if (state === "available") { return chip("", (span) => { span.replaceChildren(icon("check")); + // a bare span's aria-label is not reliably exposed; role="img" is what + // makes the word reachable once the glyph replaced it + span.setAttribute("role", "img"); span.setAttribute("aria-label", state); span.dataset.movieState = state; span.dataset.wanted = String(wanted);