feat(a11y): GlobalSearch aria-label + theme button aria-expanded (MAPPS-314) #344

Merged
YousifShkara merged 1 commit from fix/MAPPS-314-a11y-polish into main 2026-06-25 11:02:14 +02:00
Owner

QA accessibility pass surfaced three gaps. The first - aria-required
on the shared form controls - already shipped (see Input/Select/Textarea
in crate::components::form). This commit covers the remaining two.

GlobalSearch label:

  • The top-bar search input passed label: "" to the shared Input,
    relying on the placeholder. Placeholders disappear once typing
    begins; screen-reader users had nothing to announce after focus.
  • Extend Input with an optional aria_label prop. When set, the
    underlying <input> carries aria-label; when empty, behaviour is
    unchanged (the visible <label for> keeps doing the work for
    every other call site).
  • GlobalSearch passes
    aria_label: "Search tickets, contacts, companies, assets, projects".

ThemePickerButton dialog semantics:

  • The top-bar swatch button carried aria-label: "Theme and appearance"
    but no aria-expanded mirroring the modal's open signal and no
    aria-haspopup, so assistive tech could not tell it is a dialog
    opener.
  • Add aria_expanded: open() and aria_haspopup: "dialog" on the
    button. The Modal it opens is already focus-trapped, so "dialog"
    is honest.

#MAPPS-314

QA accessibility pass surfaced three gaps. The first - `aria-required` on the shared form controls - already shipped (see Input/Select/Textarea in `crate::components::form`). This commit covers the remaining two. GlobalSearch label: - The top-bar search input passed `label: ""` to the shared `Input`, relying on the placeholder. Placeholders disappear once typing begins; screen-reader users had nothing to announce after focus. - Extend `Input` with an optional `aria_label` prop. When set, the underlying `<input>` carries `aria-label`; when empty, behaviour is unchanged (the visible `<label for>` keeps doing the work for every other call site). - `GlobalSearch` passes `aria_label: "Search tickets, contacts, companies, assets, projects"`. ThemePickerButton dialog semantics: - The top-bar swatch button carried `aria-label: "Theme and appearance"` but no `aria-expanded` mirroring the modal's open signal and no `aria-haspopup`, so assistive tech could not tell it is a dialog opener. - Add `aria_expanded: open()` and `aria_haspopup: "dialog"` on the button. The Modal it opens is already focus-trapped, so "dialog" is honest. #MAPPS-314
feat(a11y): GlobalSearch aria-label + theme button aria-expanded (MAPPS-314)
All checks were successful
Check / fmt + clippy + tests (pull_request) Successful in 1m28s
Create release / Create release from merged PR (pull_request) Has been skipped
9a2cac8d64
QA accessibility pass surfaced three gaps. The first - `aria-required`
on the shared form controls - already shipped (see Input/Select/Textarea
in `crate::components::form`). This commit covers the remaining two.

GlobalSearch label:
- The top-bar search input passed `label: ""` to the shared `Input`,
  relying on the placeholder. Placeholders disappear once typing
  begins; screen-reader users had nothing to announce after focus.
- Extend `Input` with an optional `aria_label` prop. When set, the
  underlying `<input>` carries `aria-label`; when empty, behaviour is
  unchanged (the visible `<label for>` keeps doing the work for
  every other call site).
- `GlobalSearch` passes
  `aria_label: "Search tickets, contacts, companies, assets, projects"`.

ThemePickerButton dialog semantics:
- The top-bar swatch button carried `aria-label: "Theme and appearance"`
  but no `aria-expanded` mirroring the modal's open signal and no
  `aria-haspopup`, so assistive tech could not tell it is a dialog
  opener.
- Add `aria_expanded: open()` and `aria_haspopup: "dialog"` on the
  button. The Modal it opens is already focus-trapped, so "dialog"
  is honest.

#MAPPS-314
YousifShkara deleted branch fix/MAPPS-314-a11y-polish 2026-06-25 11:02:15 +02:00
Sign in to join this conversation.
No reviewers
No labels
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
psa-systems/mokosh-apps!344
No description provided.