[Bug] AccountMenu: a radio group inside role="menu", and the person's own name at 1.14:1 contrast #745

Closed
opened 2026-09-22 05:04:56 +00:00 by claude-bot · 1 comment
Collaborator

Found by the journeys harness's axe gate (#726) on 2026-09-22, scanning the new shell (#742) with the account menu open. Both are in lane 0's design system (#364).

  1. aria-required-children, critical. src/ui/Menu/index.jsx puts role="menu" around everything in the panel, and AccountMenu places the identity block and the theme strip (a Segmented, role="radiogroup") inside it. A menu may own only menuitems, groups and separators. Fix: the identity block goes in Menu's head slot (outside the menu role); the theme becomes a role="group" labelled "Theme" of three menuitemradio buttons with aria-checked, drawn as the same strip, with the arrow keys moving between them as they do on the segmented control.

  2. .menu__name and .menu__pron at 1.14:1 (#eaf0fb on #ffffff). .menu (Menu.css) sets background: var(--paper-raised) and no color, and the panel is a descendant of .appbar, which sets color: var(--chrome-ink), the ink for the dark chrome; the rows set their own colour, so only the name and pronouns inherit it. Fix: color: var(--ink) on .menu.

The harness records both as kind: "bug" in webapp/frontend/e2e/a11y-baseline.js, printed on every run; the fix removes those two entries.

Also, unrelated but found in the same pass: src/shell/AppFrame.jsx contains two literal NUL bytes in a cache key, which makes git and grep treat the file as binary. Replace with |.

Found by the journeys harness's axe gate (#726) on 2026-09-22, scanning the new shell (#742) with the account menu open. Both are in lane 0's design system (#364). 1. **`aria-required-children`, critical.** `src/ui/Menu/index.jsx` puts `role="menu"` around everything in the panel, and `AccountMenu` places the identity block and the theme strip (a `Segmented`, `role="radiogroup"`) inside it. A `menu` may own only `menuitem`s, groups and separators. Fix: the identity block goes in `Menu`'s `head` slot (outside the menu role); the theme becomes a `role="group"` labelled "Theme" of three `menuitemradio` buttons with `aria-checked`, drawn as the same strip, with the arrow keys moving between them as they do on the segmented control. 2. **`.menu__name` and `.menu__pron` at 1.14:1** (`#eaf0fb` on `#ffffff`). `.menu` (`Menu.css`) sets `background: var(--paper-raised)` and no `color`, and the panel is a descendant of `.appbar`, which sets `color: var(--chrome-ink)`, the ink for the dark chrome; the rows set their own colour, so only the name and pronouns inherit it. Fix: `color: var(--ink)` on `.menu`. The harness records both as `kind: "bug"` in `webapp/frontend/e2e/a11y-baseline.js`, printed on every run; the fix removes those two entries. Also, unrelated but found in the same pass: `src/shell/AppFrame.jsx` contains two literal NUL bytes in a cache key, which makes git and grep treat the file as binary. Replace with `|`.
Author
Collaborator

Fixed in #747, merged on green CI: Menu renders its head outside the role="menu" element and AccountMenu passes the identity block as head; the theme strip is a role="group" of three menuitemradio buttons that the menu treats as one stop; .menu sets color: var(--ink) so nothing in the panel inherits the chrome's ink; the NUL bytes in AppFrame.jsx are gone. The harness's two BUG baseline entries come out with #746's next rebase, and the axe gate proves they are gone.

Fixed in #747, merged on green CI: `Menu` renders its `head` outside the `role="menu"` element and `AccountMenu` passes the identity block as `head`; the theme strip is a `role="group"` of three `menuitemradio` buttons that the menu treats as one stop; `.menu` sets `color: var(--ink)` so nothing in the panel inherits the chrome's ink; the NUL bytes in `AppFrame.jsx` are gone. The harness's two `BUG` baseline entries come out with #746's next rebase, and the axe gate proves they are gone.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
rbrooks/Quest-Board#745
No description provided.