You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Every notice in the app — dashboard card errors and review prompts, settings save and sign-in problems, the upload pick failure, folder panel problems, and the diagnostics bundle notes — renders from one notice component with a single mapping from severity to colour, and is announced once to assistive technology rather than twice.
Today there are two separate notice helpers, plus the same coloured-edge strip written inline in several views. The severity-to-accent mapping is duplicated and can drift.
Acceptance criteria
One notice component serves every surface; the duplicated helper and the inline coloured-edge copies are gone.
Severity (error, warning, info) maps to the theme in exactly one place, and both themes keep readable contrast on the card surfaces.
Each notice keeps its own element id, so existing tests still find the one they assert.
A notice is announced once, not twice: the accessible name carries the message and the visible copy is not announced again.
No notice conveys its severity by colour alone.
Notices still wrap rather than clip where a long path or error is quoted, at the narrowest supported window.
Landed in main at 35691b2, merged from integration/kit-surface (CI green at 43223e2). Gate on the merged tree: cargo fmt --all -- --check, cargo clippy --workspace --all-targets -D warnings, cargo test --workspace — all clean.
What the review changed. The failed-row strip was a Role::Alert repeating the row's own accessible name, so class and error announced twice and a list of N rows made N alerts. Notice::quiet() — no node at all, only valid inside a container that already names the message — resolved it, with the test that would have caught it. Idle no longer wears an invented Info severity, and accent/label are private so the severity→theme map has one door.
Correction found later. This ticket's "announced once" premise needed a live region to be true at all — gpui-pre 0.3.10 sets none — which the #82 work added for every non-quiet notice and empty state.
Still manual. Real screen-reader speech, macOS/Windows wrapping.
Activity
elementalvoid commentedon Oct 31, 2026
Landed in
mainat35691b2, merged fromintegration/kit-surface(CI green at43223e2). Gate on the merged tree:cargo fmt --all -- --check,cargo clippy --workspace --all-targets -D warnings,cargo test --workspace— all clean.What the review changed. The failed-row strip was a
Role::Alertrepeating the row's own accessible name, so class and error announced twice and a list of N rows made N alerts.Notice::quiet()— no node at all, only valid inside a container that already names the message — resolved it, with the test that would have caught it.Idleno longer wears an inventedInfoseverity, andaccent/labelare private so the severity→theme map has one door.Correction found later. This ticket's "announced once" premise needed a live region to be true at all — gpui-pre 0.3.10 sets none — which the #82 work added for every non-quiet notice and empty state.
Still manual. Real screen-reader speech, macOS/Windows wrapping.