fix(a11y): mark the playing row with a shape, not only a colour
Build & publish Arch package / arch-package (push) Successful in 2m2s
CI / check (push) Successful in 2m18s
Search index maintenance / maintain-index (push) Successful in 7s
CI / e2e (push) Canceled after 3m51s

a11y.22, WCAG 1.4.1: `.track-row.active` was a background tint and a
text colour, and the row markup carried no aria-current either — so a
colour-blind user could not find the playing row and AT had no signal
at all. The queue panel had aria-current from Phase 1 and the same
colour-only visual.

A triangle drawn in each row's own left padding by `::before`. It is a
shape that is present or absent, and it costs no layout: track-list's
grid columns are computed from the host width, so a marker in the flow
would move every cell on the playing row and nothing else.

Both directions are asserted in both tiers. A marker that renders on
every row satisfies "the playing row has one" for free, which is this
plan's oldest rule.

And one thing the reproduction found: a track started from the *list*
leaves the queue's currentIndex at -1, so the panel has no current row
in that flow at all. Pre-existing, and the reason this looked broken
the first time it was checked in the running app.
This commit is contained in:
2026-08-13 02:14:55 -04:00
parent 9d420cda0a
commit 254646da5e
5 changed files with 170 additions and 0 deletions
+35
View File
@@ -141,3 +141,38 @@ test.describe('queue', () => {
await expect(shuffle).toHaveAttribute('aria-pressed', 'false');
});
});
test.describe('the playing row is findable without colour vision', () => {
test('the queue marks its current row with a shape and aria-current', async ({
app,
}) => {
await app.getByTestId('nav-tracks').click();
await app.getByTestId('track-row').first().dblclick();
const queueToggle = app.locator('#queue-button');
await queueToggle.click();
const row = app.getByTestId('queue-row').first();
await expect(row).toBeVisible();
// Played *from the queue*, because a track started from the list
// leaves `currentIndex` at -1 — so the panel has no current row at
// all in that flow, which is what made this marker look broken the
// first time it was checked.
await row.dblclick();
await expect(row).toHaveAttribute('aria-current', 'true');
const marker = await row.evaluate(
(el) => getComputedStyle(el, '::before').borderLeftWidth,
);
// `a11y.22`: a background tint and a text colour were the only two
// signals, and both are hue (WCAG 1.4.1).
expect(parseFloat(marker)).toBeGreaterThan(0);
await queueToggle.click();
await expect(app.getByTestId('queue-row')).toHaveCount(0);
});
});