From a6b476399e5b1682eef6b3ea2e3fde1331d2d44f Mon Sep 17 00:00:00 2001 From: Caleb Allen Date: Mon, 23 Feb 2026 15:53:30 -0500 Subject: [PATCH] hovering now-playing cover thumb shows full-res art --- .../src/components/now-playing/now-playing.ts | 109 +++++++++++++++--- 1 file changed, 94 insertions(+), 15 deletions(-) diff --git a/frontend/src/components/now-playing/now-playing.ts b/frontend/src/components/now-playing/now-playing.ts index 46c052e..d35b9bf 100644 --- a/frontend/src/components/now-playing/now-playing.ts +++ b/frontend/src/components/now-playing/now-playing.ts @@ -1,6 +1,7 @@ -import { LitElement, html, css } from 'lit'; +import { LitElement, html, css, nothing } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import '@awesome.me/webawesome/dist/components/icon/icon.js'; +import '@awesome.me/webawesome/dist/components/popup/popup.js'; import { PlayerController } from '@store/controllers/player-controller'; const MIN_WIDTH = 120; @@ -14,6 +15,9 @@ export class NowPlaying extends LitElement { @state() private isDragging = false; + @state() + private showCoverPreview = false; + static override styles = css` :host { display: block; @@ -59,6 +63,25 @@ export class NowPlaying extends LitElement { font-size: 24px; } + .cover-art-wrapper { + position: relative; + } + + .cover-preview-panel { + width: 500px; + height: 500px; + border-radius: 8px; + overflow: hidden; + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5); + pointer-events: none; + } + + .cover-preview-panel img { + width: 100%; + height: 100%; + object-fit: cover; + } + .track-info { display: flex; flex-direction: column; @@ -132,23 +155,54 @@ export class NowPlaying extends LitElement { return html`
-
- ${track.coverArt - ? html`Album cover { - const img = e.target as HTMLImageElement; - if (track.coverArt && img.src !== track.coverArt) { - img.src = track.coverArt; - } - }} - />` - : html`
`} +
+
+ ${track.coverArt + ? html`Album cover { + const img = e.target as HTMLImageElement; + if ( + track.coverArt && + img.src !== track.coverArt + ) { + img.src = track.coverArt; + } + }} + />` + : html`
+ +
`} +
+ + ${this.showCoverPreview && track.coverArt + ? html` +
+ Album cover full size +
+ ` + : nothing} +
${track.title} - ${track.artist || 'Unknown Artist'} + + ${track.artist || 'Unknown Artist'} +
{ + const track = this.player.currentTrack; + + if (!track?.coverArt) return; + + this.showCoverPreview = true; + + this.updateComplete.then(() => { + const popup = this.shadowRoot?.querySelector( + '#cover-preview', + ); + const anchor = this.shadowRoot?.querySelector( + '.cover-art', + ); + + if (popup && anchor) { + (popup as any).anchor = anchor; + } + }); + }; + + private handleCoverMouseLeave = () => { + this.showCoverPreview = false; + }; + private handleMouseDown = (e: MouseEvent) => { e.preventDefault(); this.isDragging = true;