Android: the Playlists page header buttons are unreachable #69
Closed
opened 2026-08-18 06:00:07 +00:00 by logan
·
2 comments
No Branch/Tag Specified
main
fix/146-stub-etxtbsy
fix/175-wizard-follows-the-library
fix/231-setter-rollback
fix/197-duplicate-column-label
docs/225-fixtures-wav-tags
docs/220-skill-check-scope
test/217-fixture-names-in-queue-selection
fix/216-riff-parse-allocation
fix/170-queue-header-action-names
fix/210-nav-sheet-scroll-affordance
docs/50-readme-landing-page
feat/65-art-prefetch-ahead
feat/71-more-as-a-bottom-sheet
feat/54-native-touch-feel
feat/67-entity-links-into-menus
test/196-visual-tier-gates
fix/138-ui-test-storage-leak
fix/104-wav-tags-read
fix/207-sheet-scroll-affordance
fix/204-ui-visual-update-filter
pi-agent-backlog-automation
63-touch-model-phase-2
63-android-touch-model
186-touch-targets-settings
186-touch-targets-page-header
187-seek-bar-hit-area
189-190-explore-correctness
135-android-underrun-instrumentation
51-android-small-screens
fix/171-phone-queue-scrim
fix/137-touch-only-affordances
fix/154-nested-css-check
feat/58-mini-player-progress-line
fix/66-album-page-scrolls-as-one
60-context-menu-action-sheet
64-android-system-volume
59-slim-the-mini-player
55-queue-as-a-screen
feat/57-drop-the-android-top-bar
feat/62-jobs-as-a-notification
fix/53-seek-bar-never-moves
fix/159-android-task-app-id
fix/52-android-activity-recreation-restarts-the-process
fix/150-expand-button-under-the-art
feat/42-inline-volume-and-centred-transport
fix/156-queue-selection-fixture-order
fix/151-fuse-the-scroll-guard-and-the-write
fix/43-queue-panel-selection
fix/143-top-bar-fits-its-window
feat/27-jobs-into-settings
feat/25-configurable-sidebar-tabs
feat/6-global-back-forward
fix/72-active-view-broadcast
fix/69-page-header-action-overflow
fix/quick-wins-batch
fix/118-in-library-clear
fix/61-mini-player-plain-text
fix/68-hover-affordances-pointer
fix/119-dev-headless-port
fix/130-issue-claim-user
fix/131-codegen-check-scope
feat/28-autotag-match-on-album
feat/17-demote-version-selector
feat/38-ownership-visibility
ci/115-manual-release
feat/34-icon-language
feat/7-full-tracklist-toggle
fix/16-tagwriter-totals
fix/unclaim-ca-certs
fix/unclaim-shell
ci/unclaim-on-close
docs/closing-keyword
docs/retire-stale-planning-docs
docs/issue-driven-workflow
integration/small-fixes
fix/small-issue-batch
fix/queue-toggle-state
fix/drag-count-badge
fix/album-card-year
fix/album-tracklist-heading
fix/seek-bar-clock-width
fix/explore-art-scanner-requests
chore/workflow-guardrails
v0.7.0
v0.6.0
v0.5.0
v0.4.0
v0.3.1
v0.3.0
v0.2.3
v0.2.2
v0.2.1
v0.2.0
v0.1.0
v0.0.1
v0.0.0
Labels
Clear labels
Area/Design
Area/Downloads
Area/Explore
Area/Library-UI
Area/Metadata
Area/Packaging
Area/Player
Area/Queue
Area/Settings
Area/Shell-Nav
Compat/Breaking
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Security
Kind/Testing
Platform/Android
Platform/Desktop
Breaking change that won't be backward compatible
Something is not working
Documentation changes
Improve existing functionality
New functionality
This is security issue
Issue or pull request related to testing
Priority
Critical
1
The priority is critical
Priority
High
2
The priority is high
Priority
Medium
3
The priority is medium
Priority
Low
4
The priority is low
Reviewed
Confirmed
1
Issue has been confirmed
Reviewed
Duplicate
2
This issue or pull request already exists
Reviewed
Invalid
3
Invalid issue
Reviewed
Won't Fix
3
This issue won't be fixed
Status
Blocked
1
Something is blocking this issue or pull request
Status
Need More Info
2
Feedback is required to reproduce issue or to continue work
Status
Abandoned
3
Somebody has started to work on this but abandoned work
Status
In Progress
Somebody is actively working on this right now
Milestone
No items
No Milestone
Projects
Clear projects
No projects
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: yonlu/yellowjacket#69
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Report
I cannot scroll to reach all the buttons along the top of the Playlists page (import, etc.), and scrolling is probably not the right way to expose playlist controls anyway. These need to be reachable in a sensible way.
Findings
<page-header>is the shared title/count/sort/actions component for the primary views, so the fix lands in one place for all of them.Direction
Give
page-headeran overflow rule: actions that do not fit collapse into a single "More actions" menu (a bottom sheet on phone — see the context-menu issue) rather than being clipped or requiring a horizontal scroll. Decide a priority order per host so the most useful action stays visible. Never let an action become unreachable at any supported size.Measured while deciding #24, and it changes this issue's shape twice.
Only this page overflows. Sweeping all ten primary views at 900x600 and at
390x780, every other
page-headerreportsscrollWidth == clientWidth; Albumsat 390px renders title, count and sort legibly (checked on a screenshot, not
just the number). The offender is this view's action set specifically — three
text buttons,
Import(91px) +New Playlist(122px) +New Smart Playlist(162px), 390px inside a header that gets 379px at 900x600.
And it clips at the supported minimum with the queue closed, which makes it
independent of #24: at 800x600 — the size
window.goenforces — "New SmartPlaylist" loses 4px of its 162. The queue makes it dramatic (all three gone at
900x600), but this is not only a queue symptom.
The finding that decides scope:
page-headercannot collapse its ownactions. They arrive through
<slot name="actions">as arbitrary light-DOMmarkup — this view slots a
<div class="header-actions">of three<button>scarrying click handlers, drag handlers and a conditional class. A component
cannot move another component's light-DOM children into a dropdown and keep
their behaviour; there is nothing generic to render as a menu item.
So "give
page-headeran overflow rule" needs an actions API first — hostsdeclaring
{icon, label, handler, priority}that the header can render eitheras buttons or as menu items — which is a change to all three hosts that slot
actions (
playlist-view,home-view,downloads-view), not a rule added inone place. That is why #24 does not absorb this: it is a different piece of
work, independently verifiable, and #24 removes the desktop half of the symptom
(the queue stops eating the header's width) without touching the cause.
What #24 owes this issue is the promise in its size matrix — no action is ever
unreachable at any supported size — which is the sentence this issue asks for
and the one that makes it checkable. Doing this next, after #24.
Note the
priority order per hostin the Direction is now cheap to decide:there is one host that needs it.
Claiming this. Branch:
fix/69-page-header-action-overflow.Approach — the finding on this issue decides the shape, so this is
an actions API first and an overflow rule second.
page-headergains anactions: PageAction[]property —{id, label, icon, handler, priority, disabled?, title?, acceptsDrop?}— and renders them itself. All three hosts that slot actions
(
playlist-view,home-view,downloads-view) migrate, which alsonormalises the plain-
<button>/<wa-button>split between them.The
<slot name="actions">survives for markup a data list cannotexpress, documented as not collapsible: the header cannot measure or
move another component's light-DOM children, which is this issue's own
finding restated as the slot's cost.
acceptsDropis what keepsNew Playlista drop target. The headerowns the
dragover/dragleave/dropwiring and the affordance andre-dispatches
action-drop; a menu item is not a drop target, so theaffordance simply does not exist in the overflow, which is correct —
you cannot drag onto a closed menu.
header, and on each pass the buttons are un-hidden and the
lowest-priority ones hidden one at a time until
scrollWidth <= clientWidth. Starting each pass from all-visible iswhat stops it being sticky — the collapsed set is a pure function of
the width. The sort control and the count are
flex-shrink: 0and aretherefore inside the budget, which is why the header's own overflow is
the right thing to measure rather than the actions row's.
On the Direction's "a bottom sheet on phone — see #60": using the
existing menu pattern now and not blocking on #60. #60 is Phase 4 and
its Direction is an
<action-sheet>"selected by viewport width so everyexisting menu call site gains it without changing" — so a phone-specific
surface built here is either thrown away by #60 or becomes the second one
it exists to prevent. Commenting on #60 so it inherits this surface.
And no phone mode for
page-header.PHONE_COLUMN_IDSis theprecedent for "what is drawn and what can be sorted are different
questions", but it exists because the track list's columns cannot be
derived from a width. These can: the fit rule already collapses all three
at 390px, and a second declaration of what a phone shows is a second thing
to keep in step.
Verification:
make ui-test,tsc --noEmitin bothfrontend/ande2e/,make e2e, and read screenshots at 900x600, 800x600 and 390x780 —layout-overflow.spec.tsasserts the shell needs no sideways scrollingand passes on today's build, which is exactly why this defect survived a
spec named for it.