commit eb7a38d3fd0b4746330adbc3a5f26f21265a4397
parent e0676e48592b6c6879a5a034a3e7be1d7f3fb0aa
Author: I Mean I'm Just Saying <imeanimjustsaying@kiwifarms.st>
Date: Wed, 30 Sep 2026 18:01:54 -0400
common: the Search in refusal line is a polite live region, not a second role="status"
From xl the Filters panel is always mounted, so the always-mounted line
gave the search page a second "status" beside the video modal's, and
modal-digest.spec's getByRole("status") found two (the first full run after
the review, 213 passed, 1 failed). aria-live="polite" with aria-atomic is
announced the same way on a change of its text and is no status role.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Diffstat:
2 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/common/components/FiltersPanel.tsx b/common/components/FiltersPanel.tsx
@@ -450,11 +450,15 @@ export default function FiltersPanel({
)}
{/* Always mounted, empty unless Search is refused: a live region
is announced when its content changes, which several screen
- readers miss for a region that appears with its text. The
- Search button is described by the bar's own copy of these
+ readers miss for a region that appears with its text. A polite
+ live region rather than role="status": this panel is always
+ mounted from xl, and a page-wide second "status" would be a
+ second answer to `getByRole("status")` (modal-digest.spec).
+ The Search button is described by the bar's own copy of these
words (this panel may be a closed sheet). */}
<span
- role="status"
+ aria-live="polite"
+ aria-atomic="true"
data-testid="search-in-empty"
className={cn("text-xs text-warning", draftSearchInEmpty && "basis-full")}
>
diff --git a/export/e2e/search-in.spec.ts b/export/e2e/search-in.spec.ts
@@ -182,7 +182,7 @@ test.describe("Search in", () => {
const empty = page.getByTestId("search-in-empty");
await expect(submit).toBeDisabled();
await expect(empty).toHaveText("Search in: pick at least one");
- await expect(empty).toHaveAttribute("role", "status");
+ await expect(empty).toHaveAttribute("aria-live", "polite");
// The disabled button says why, to a screen reader as well as on hover.
await expect(submit).toHaveAccessibleDescription("Search in: pick at least one");
// A save commits the draft, so Save as… is refused the same way.