[QA] §I Accessibility: aria-labels on edit-history / reactions / threads / replies with a screen reader #179

Open
opened 2026-09-17 23:24:08 -04:00 by jared · 3 comments
Owner

Migrated from LOTUS_TESTING.md §I on 2026-09-17 — the file is now reference-only.

How to report: tick each item as it passes; on FAIL comment with what you saw vs expected, browser/OS, web (chat.lotusguild.org) vs desktop (Tauri), theme, and any browser-console errors. Screenshots for anything visual.


With a screen reader on, navigate message hover-actions and content and confirm each control announces a meaningful label (not "button" / blank):

  • Reaction buttons announce the emoji + count (e.g. "thumbsup reaction, 3 people").
  • Edit history button announces "View edit history".
  • Thread indicator announces "View thread".
  • Reply (jump to original) announces "Jump to original message".

_Migrated from `LOTUS_TESTING.md` §I on 2026-09-17 — the file is now reference-only._ **How to report:** tick each item as it passes; on FAIL comment with what you saw vs expected, browser/OS, web (chat.lotusguild.org) vs desktop (Tauri), theme, and any browser-console errors. Screenshots for anything visual. --- With a screen reader on, navigate message hover-actions and content and confirm each control **announces a meaningful label** (not "button" / blank): - [x] **Reaction** buttons announce the emoji + count (e.g. "thumbsup reaction, 3 people"). - [x] **Edit history** button announces "View edit history". - [x] **Thread indicator** announces "View thread". - [x] **Reply** (jump to original) announces "Jump to original message". ---
jared added this to the Manual QA backlog milestone 2026-09-17 23:24:08 -04:00
jared added the a11yqa labels 2026-09-17 23:24:08 -04:00
Author
Owner

Automated pass done under #185 (axe-core on timeline, settings, thread panel; sidebar/avatar/switch labels fixed). The remaining §I checks (edit-history / reaction / thread / reply aria-labels read correctly) need a screen reader in hand — leaving open for that.

Automated pass done under #185 (axe-core on timeline, settings, thread panel; sidebar/avatar/switch labels fixed). The remaining §I checks (edit-history / reaction / thread / reply aria-labels read correctly) need a screen reader in hand — leaving open for that.
Author
Owner

Checked the accessible names in the live DOM (edited message, reply, thread and reaction created via the API; the speech itself still needs a screen reader):

control accessible name
Reaction "👍 reaction, 1 person" ✅
Edit history ("(edited)") "View edit history" ✅
Reply (jump to original) "Jump to original message" ✅
Thread indicator was just its visible text "1 reply · 12:16 PM", with no "thread" and the unread dot / muted bell visual-only fixed → "1 reply · 12:16 PM, view thread" (+ ", unread replies" / ", muted" when they apply). The visible text comes first, so voice control ("click 1 reply") still works.

One small inconsistency: a reaction's label sometimes uses the emoji ("🎉 reaction") and sometimes the shortcode ("tada reaction") for the same button, depending on render path. Both are readable.

Checked the accessible names in the live DOM (edited message, reply, thread and reaction created via the API; the *speech* itself still needs a screen reader): | control | accessible name | | |---|---|---| | Reaction | "👍 reaction, 1 person" | ✅ | | Edit history ("(edited)") | "View edit history" | ✅ | | Reply (jump to original) | "Jump to original message" | ✅ | | Thread indicator | was just its visible text "1 reply · 12:16 PM", with no "thread" and the unread dot / muted bell visual-only | **fixed** → "1 reply · 12:16 PM, view thread" (+ ", unread replies" / ", muted" when they apply). The visible text comes first, so voice control ("click 1 reply") still works. | One small inconsistency: a reaction's label sometimes uses the emoji ("🎉 reaction") and sometimes the shortcode ("tada reaction") for the same button, depending on render path. Both are readable.
Author
Owner

Reaction-label inconsistency fixed in 1b5e6a37.

Cause. The label used getShortcodeFor(), which returns nothing until the lazily loaded emoji data arrives. A button rendered before that read "🎉 reaction". Once anything re-rendered it (for example someone else adding the same reaction), it read "tada reaction".

Fix. The label now always uses the emoji itself. Screen readers speak the character by its proper name ("party popper"), which reads better than the shortcode "tada". Custom (mxc) emoji were labelled only "custom emoji"; they now use the shortcode from the reaction event.

Evidence. Local Synapse run: bob sends 🎉 plus a custom emoji carrying shortcode: lotus_blob, alice opens the emoji board (which loads the data), then alice adds her own 🎉 to force a re-render.

before data after data after re-render
old 🎉 reaction, 1 person · custom emoji reaction, 1 person same tada reaction, 2 people · custom emoji reaction, 1 person
new 🎉 reaction, 1 person · :lotus_blob: reaction, 1 person same 🎉 reaction, 2 people · :lotus_blob: reaction, 1 person

The accessible names in this issue are now all correct in the DOM. What's left is the checklist's actual ask: hearing them spoken by a screen reader. Leaving this open for that human pass.

Reaction-label inconsistency fixed in `1b5e6a37`. **Cause.** The label used `getShortcodeFor()`, which returns nothing until the lazily loaded emoji data arrives. A button rendered before that read "🎉 reaction". Once anything re-rendered it (for example someone else adding the same reaction), it read "tada reaction". **Fix.** The label now always uses the emoji itself. Screen readers speak the character by its proper name ("party popper"), which reads better than the shortcode "tada". Custom (mxc) emoji were labelled only "custom emoji"; they now use the shortcode from the reaction event. **Evidence.** Local Synapse run: bob sends 🎉 plus a custom emoji carrying `shortcode: lotus_blob`, alice opens the emoji board (which loads the data), then alice adds her own 🎉 to force a re-render. | | before data | after data | after re-render | |---|---|---|---| | old | `🎉 reaction, 1 person` · `custom emoji reaction, 1 person` | same | **`tada reaction, 2 people`** · `custom emoji reaction, 1 person` | | new | `🎉 reaction, 1 person` · `:lotus_blob: reaction, 1 person` | same | `🎉 reaction, 2 people` · `:lotus_blob: reaction, 1 person` | The accessible names in this issue are now all correct in the DOM. What's left is the checklist's actual ask: hearing them spoken by a screen reader. Leaving this open for that human pass.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: LotusGuild/cinny#179