fix(a11y): mark the playing row with a shape, not only a colour
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:
@@ -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);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user