Skip to content

Docked queue glow-up: fixes, polish, and vibes#75

Merged
JoePittsy merged 32 commits into
mainfrom
develop
May 6, 2026
Merged

Docked queue glow-up: fixes, polish, and vibes#75
JoePittsy merged 32 commits into
mainfrom
develop

Conversation

@JoePittsy
Copy link
Copy Markdown
Member

What's in the box

🐛 Bugs squashed like they owed us money

  • Scroll-to-now-playing in docked mode never worked. Turned out the guard was checking open, which is always false in docked mode. Classic. Fixed.
  • Song changes were yeeting the body gradient colour. useDominantColor was letting useNowPlaying scribble over --panel-color on every track change. Added a setGlobal flag so only page components (artist, album) drive the gradient. The player bar can keep its colour to itself.

✨ Visual crimes committed (intentionally)

  • Docked queue now inherits the app's gradient background instead of having its own awkward box. It just… floats there. Classy.
  • Panel colour gradient on .body — the dominant colour from whatever artist/album page you're on bleeds into the queue column. Transitions smoothly between tracks. Very cinematic.
  • Resize handle glows purple when you hover it, emanating rightward into the queue like a tiny aurora. Does not leak into the main content. Respects boundaries.
  • Track rows glow on hover — radial gradient follows your mouse inside the row. Contained to the border radius. We're fancy now.
  • Window controls wrapped in a frosted pill in docked mode. Looks expensive.
  • Queue header became a footer in docked mode. Footer? Header? It's at the bottom now. Moving on.
  • Scrollbar polish — bigger hit box, pill-shaped thumb, never touches the top of the container. Global scrollbars got the same treatment.
  • Borderless docked queue — no dividing line, no box shadow, no evidence it was ever a separate panel. Seamless.

⚙️ UX improvements nobody asked for but everyone deserves

  • Queue button hidden from player bar and top nav when docked — you can't open a panel that's already open, we checked.
  • Player bar and top nav recentre over the main content area (not the whole window) when the queue is docked. Live during resize drag. No React re-renders were harmed.
  • Minimum window width enforced at 1144px so the queue doesn't eat the main content alive.
  • Queue max width derived from player bar width + padding — it can get wide but not that wide.
  • Resize drag updates layout live via direct DOM style.setProperty — silky smooth, zero re-renders on the hot path.

Test plan

  • Open docked queue, change tracks — gradient should not flash/change colour
  • Navigate to an artist page — body gradient should pick up artist colour, bleed into queue
  • Scroll artist page — content scrolls, gradient stays (it's on the background)
  • Resize queue — player bar and nav pill recentre in real time
  • Resize window narrow — queue doesn't crush the main content
  • Hover resize handle — purple glow appears on the right side only
  • Hover track rows — mouse-following glow, contained to row bounds
  • Scroll queue — queue scrolls independently, no weirdness
  • Window controls pill visible in docked mode, not floating randomly

🤖 Generated with Claude Code

Joe Pitts and others added 30 commits May 5, 2026 22:46
…ange

Both auto-scroll effects checked `open` (the floating queue toggle) which
is always false in docked mode. Changed guard to `isActive` so the docked
queue correctly follows the current track when it changes and re-centres
after a group switch.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces the flat --bg-1 fill with a subtle 175deg gradient
(#2c2c32 → #232327 → #1e1e22) and a soft left-edge shadow so the
docked panel has some depth against the main content area.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Removes the custom gradient fill so the docked sidebar shows the
shell's radial gradient through, making it feel like one continuous
surface rather than a separate panel.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Increased opacity on all three radial stops (0.45→0.7, 0.35→0.55,
0.3→0.45) and shifted hues slightly warmer/deeper so the gradient
reads clearly through the transparent docked queue panel.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces the full-height hover background with a ::after pseudo-element
that tracks the cursor Y via a --mouse-y CSS custom property, so only a
200px pill centred on the mouse is lit up.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces the flat pill with a 28px-wide radial gradient ellipse that
bulges out from the 6px handle, blurred + box-shadowed in purple to
create a soft glow. Docked sidebar set to overflow: visible so the
lens can spill into the main content area.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sets --docked-queue-w CSS variable on the shell when docked so the
fixed player bar offsets its 50% anchor by the sidebar width.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds onResizeWidthLive prop to QueueSidebar — fires on every pointer
move during resize. App.tsx handles it by mutating the shell's
--docked-queue-w CSS variable directly via a ref, avoiding any React
re-render on the hot drag path.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Removes the hardcoded MAX_DOCKED_WIDTH=700 / MIN_ROUTES_WIDTH=320.
Max queue width is now window.innerWidth - (800 + 64), guaranteeing
the main content area is always at least the player bar's inner width
(800px) plus 32px breathing room on each side.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Prevents the window being resized narrow enough to crunch the docked
queue: minWidth = 864px (player bar 800px + 32px each side) + 280px
(MIN_DOCKED_WIDTH). Also bumps default size from 960x640 to 1280x720.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Anchors ::after to left:0 and extends 120px rightward. Radial gradient
centred at the left edge fades into the queue — nothing bleeds left.
Removed filter:blur which was the source of leftward spill.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Gradient in docked queue fades out as main content is scrolled down,
  using a capture-phase scroll listener on the routes container
- Resets to full opacity on route navigation
- Fix TS error: void the removeProperty cleanup return in useDominantColor
- Row hover glow via ::before radial gradient tracking mouse position
- Resize handle glow pulses into queue only (no leftward bleed)
- winPill wrapper around window controls in docked mode
- Header reordered as footer when docked
- subAlbum hit-box fix: block + fit-content instead of inline-block
- Scrollbar polish: bigger hit box, pill thumb, never touches top
- body::after gradient opacity driven by --panel-gradient-opacity CSS var

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Use document-level capture scroll listener instead of a wrapper div
around Routes. The wrapper div disrupted the flex layout that panels
rely on for height. Queue scroll is excluded via data-queue-content attr.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Joe Pitts and others added 2 commits May 6, 2026 17:18
useDominantColor now only sets --panel-color globally when setGlobal:true.
Page components (ArtistHero, ArtistPanel, AlbumPanel) opt in; useNowPlaying
does not, so track changes no longer overwrite the gradient.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 6, 2026

Coverage Report

Status Category Percentage Covered / Total
🔵 Lines 80.65% 1672 / 2073
🔵 Statements 77.8% 1939 / 2492
🔵 Functions 72.72% 544 / 748
🔵 Branches 71.89% 1801 / 2505
File Coverage
File Stmts Branches Functions Lines Uncovered Lines
Changed Files
renderer/src/App.tsx 65.19% 54.82% 36.98% 69.61% 61, 62, 68, 81-82, 94, 106-111, 115-116, 120-121, 125-128, 135, 140, 148, 156, 159, 164, 171-175, 222, 243-259, 277-279, 284, 368-380, 405-407, 415, 456-514, 539-564
renderer/src/components/LeaderboardPanel.tsx 90.32% 84.8% 88% 91.66% 14, 39-47, 205-206, 348-358, 383
renderer/src/components/PlayerBar.tsx 83.11% 68.57% 80.76% 86.15% 47, 77, 78, 96-101, 128, 202, 303
renderer/src/components/TopNav.tsx 75.3% 70.58% 61.29% 77.46% 82, 92-97, 143-146, 211, 221-226, 254, 255-301
renderer/src/components/album/AlbumPanel.tsx 78.12% 85.83% 73.68% 82.6% 47, 83-98, 109, 145, 202
renderer/src/components/artist/ArtistHero.tsx 72.72% 78.94% 71.42% 77.27% 63-77
renderer/src/components/artist/ArtistPanel.tsx 38.09% 53.84% 42.85% 51.21% 43-72, 78
renderer/src/components/queue/DraggableQueueRow.tsx 34.78% 70% 33.33% 40% 25-29, 55-57, 61-91
renderer/src/components/queue/QueueSidebar.tsx 52.63% 63.77% 61.7% 53.75% 94-102, 107, 117, 148, 157-181, 213-271, 289, 336-341, 377
renderer/src/components/queuedle/QueuedlePanel.tsx 85.36% 80.08% 87.23% 87.29% 85, 118, 142-149, 155, 162, 201-204, 381, 385, 418, 420-422, 432, 453-456, 461, 473-475
renderer/src/hooks/useDailyGame.ts 87.95% 74.32% 74.07% 87.14% 70, 148-149, 173-175, 201, 214-226
renderer/src/hooks/useDominantColor.ts 86.66% 70.58% 71.42% 87.87% 32, 43-48
renderer/src/lib/gameRankAssets.ts 100% 75% 100% 100%
Generated in workflow #117 for commit 2df6473 by the Vitest Coverage Report Action

@JoePittsy JoePittsy merged commit 2741a84 into main May 6, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants