The music library reused the movie-poster tile (2:3, hover-revealed actions) for artists and albums too, since it was already there for video - functional, but never reads as "this is music" the way real apps do. Explored as mockups first, then implemented without touching any of MusicBar's existing sync/cast/HLS logic: - tiles.ts's tileHtml() now dispatches on Emby type: artists get a circle with no hover overlay, albums a square - same "whole tile is the one link" idea, since there's only ever one action either way. - Artist/album pages gain a real hero header (circular/square art, a pill-shaped play button) instead of a plain title + text button. Album's per-track buttons shrink from a wide text button repeated on every row to a small icon that swaps play/plus with the same two states as before. - MusicBar gains a real mobile "now playing" full-screen view (tap the collapsed mini bar to expand it) instead of only ever being a thin strip - the screen every music app has that this one was missing. The existing thin top-edge progress bar didn't change shape at all, on either breakpoint. Nothing here invents a feature without a real data source behind it - no popular tracks, no previous-track, no favorites, none of that exists server-side. Caught and fixed one real bug via computed-style verification, not just reading the CSS back: the new circular play button was silently losing to .iconBtn's own background/radius at equal specificity, outcome depending on esbuild's bundle order rather than either rule's own declared intent. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
89 lines
2.2 KiB
CSS
89 lines
2.2 KiB
CSS
/* ---- Artist hero - see Artist.ts. A circular photo, never a poster:
|
|
the same reasoning tiles.ts's artistTileHtml already gives for the
|
|
artist grid applies just as much to the one photo at the top of the
|
|
artist's own page. ---- */
|
|
.artistHero {
|
|
display: flex;
|
|
align-items: flex-end;
|
|
gap: 20px;
|
|
margin-bottom: 24px;
|
|
}
|
|
|
|
.artistHeroPhoto {
|
|
width: 132px;
|
|
height: 132px;
|
|
border-radius: 50%;
|
|
object-fit: cover;
|
|
background: var(--panel);
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.artistHeroPhoto.noImage { visibility: hidden; }
|
|
|
|
.artistHeroInfo {
|
|
display: flex;
|
|
flex-direction: column;
|
|
gap: 4px;
|
|
min-width: 0;
|
|
}
|
|
|
|
.artistHeroInfo h1 { margin: 0; font-size: 26px; line-height: 1.15; }
|
|
|
|
/* ---- Shared with views/album's own hero (Album.css reuses these three
|
|
classes directly rather than redefining them - same "one rule,
|
|
whichever file needs it first" precedent Album.css already set for
|
|
.seriesInfo/.playlistActions). ---- */
|
|
.heroKicker {
|
|
font-size: 12px;
|
|
color: var(--muted);
|
|
text-transform: uppercase;
|
|
letter-spacing: .05em;
|
|
font-weight: 600;
|
|
}
|
|
|
|
.heroActions {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 14px;
|
|
margin-top: 10px;
|
|
flex-wrap: wrap;
|
|
}
|
|
|
|
/* A pill, not a plain rectangular button - the one visual actually
|
|
borrowed from real music apps' big circular play button, while
|
|
keeping the explicit text label this app already standardized on
|
|
for every request/action control (see docs/architecture.md's
|
|
player-rework section) - nothing here is icon-only. */
|
|
.heroPlayBtn {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: 10px;
|
|
padding: 6px 18px 6px 6px;
|
|
border-radius: 99px;
|
|
background: var(--panel);
|
|
color: var(--text);
|
|
font-size: 14px;
|
|
font-weight: 600;
|
|
}
|
|
|
|
.heroPlayBtn:hover { background: #333; }
|
|
|
|
.heroPlayIcon {
|
|
width: 34px;
|
|
height: 34px;
|
|
border-radius: 50%;
|
|
background: var(--accent);
|
|
color: #fff;
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
flex-shrink: 0;
|
|
}
|
|
|
|
.heroPlayIcon svg { width: 14px; height: 14px; display: block; }
|
|
|
|
@media (max-width: 600px) {
|
|
.artistHero { flex-direction: column; align-items: center; text-align: center; }
|
|
.artistHeroPhoto { width: 104px; height: 104px; }
|
|
.artistHeroInfo { align-items: center; }
|
|
}
|