From 2b41c276165333030e4e34f4e0211f8400923885 Mon Sep 17 00:00:00 2001 From: Logan Date: Thu, 13 Aug 2026 01:55:17 -0400 Subject: [PATCH] fix(a11y): let a clipped value be read, and name a row's own buttons MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit a11y.24: `text-overflow: ellipsis` in 40+ places, and the four highest-density lists were the ones with no `title` — the queue panel (whose width is user-resizable down to MIN_WIDTH), track-info, every track-list cell, and the playlist sidebar. In track-list the attribute is on the *cell*, not on what is inside it: the value may be a link, a highlighted search match or plain text, and a tooltip is inherited by descendants either way. One binding rather than three, and the same value the accessor already computed. a11y.32: every queue row's remove button was named "Remove from queue", so a list whose entire purpose is which track is where had four identically named controls. --- .../components/playlist-view/playlist-view.ts | 1 + .../src/components/queue-panel/queue-panel.ts | 14 ++++-- .../src/components/track-info/track-info.ts | 6 ++- .../src/components/track-list/track-list.ts | 6 ++- frontend/test/components/aria-tail.test.ts | 44 +++++++++++++++++++ .../test/components/queue-reorder.test.ts | 35 ++++++++++++++- 6 files changed, 99 insertions(+), 7 deletions(-) diff --git a/frontend/src/components/playlist-view/playlist-view.ts b/frontend/src/components/playlist-view/playlist-view.ts index 5a951b7..775d94f 100644 --- a/frontend/src/components/playlist-view/playlist-view.ts +++ b/frontend/src/components/playlist-view/playlist-view.ts @@ -1786,6 +1786,7 @@ export class PlaylistView extends ViewLifecycleMixin(LitElement) { : html` ${entry.summary .Name} diff --git a/frontend/src/components/queue-panel/queue-panel.ts b/frontend/src/components/queue-panel/queue-panel.ts index 78d2746..6453424 100644 --- a/frontend/src/components/queue-panel/queue-panel.ts +++ b/frontend/src/components/queue-panel/queue-panel.ts @@ -1595,6 +1595,13 @@ export class QueuePanel const artUrl = track.coverArtPath || ''; + // The panel's width is user-resizable down to MIN_WIDTH, so + // both of these are routinely clipped (a11y.24) — and the + // remove button is one of every row, named identically + // (a11y.32). + const title = this.getDisplayTitle(track); + const artist = track.artist || 'Unknown Artist'; + // No inline closures — all events delegated via data-index // on the virtualizer element (see firstUpdated). return html` @@ -1620,16 +1627,17 @@ export class QueuePanel ${artUrl ? html`
` : nothing}
- - ${trackLink(this.getDisplayTitle(track), track.album, track.releaseGroupMbid, track.recordingMbid, undefined, track.artist)} + + ${trackLink(title, track.album, track.releaseGroupMbid, track.recordingMbid, undefined, track.artist)} - + ${artistLink(track.artist, track.artistMbid) || 'Unknown Artist'}