Skip to content

Notices: one alert component on every surface #76

Closed

Description

@elementalvoid

What to build

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.

Activity

  1. elementalvoid commented on Oct 31, 2026

    @elementalvoid
    OwnerAuthor

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    accessibilityBarrier affecting people with disabilitiesenhancementNew feature or requestready-for-agentFully specified, ready for an AFK agent

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions