fix(slint): follow chip, playlist card size, track row hover, dedupe

- Follow button on the artist card is no longer a pill — Radius.sm
  rounded rectangle, matching the rest of the app (new ADR-008).
- PlaylistCard sized identically to AlbumCard (220x266) with the same
  220px artwork area; collage and the grid/carousel updated to match.
- Track row play overlay now appears anywhere over the row, not only
  when the pointer is directly over the cell. Slint does not propagate
  has-hover to ancestor TouchAreas, so each row OR-s its own ta with
  every nested TouchArea (play-cell, fav/dl/more) into row-hovered.
- EqualizerBars sit on a fixed 16px baseline so the animation stays
  perfectly centered while the bar heights oscillate.
- TrackPlayCell exposes out hovered so rows can OR it cleanly.
- Search dedupes a top-result artist that is also the first carousel
  entry, removing the redundant duplicate.

cc
This commit is contained in:
vicrodh committed 2026-05-19 19:53:15 -06:00
1 parent 7efb83c075
commit c7129de096
10 files changed
+89 -42

No files matched your search

@@ -4,6 +4,7 @@
import { Theme } from "../foundation/semantic-colors.slint";
import { Typography } from "../foundation/typography.slint";
import { Radius } from "../foundation/radius.slint";
import { SlimItem } from "../state.slint";
import { QbzIcon } from "../primitives/QbzIcon.slint";
@@ -74,7 +75,9 @@ export component ArtistCard inherits Rectangle {
Rectangle {
width: chip-row.preferred-width;
height: 30px;
border-radius: 15px;
// Rectangular with small rounded corners — QBZ never uses
// pill-shaped chips (ADR-008).
border-radius: Radius.sm;
background: follow-ta.has-hover
? Theme.surface-hover
: Theme.surface-elevated;
@@ -52,8 +52,8 @@ export component PlaylistCard inherits Rectangle {
// "queue" | "favorite").
callback media-action(string, string, string);
width: 162px;
height: 210px;
width: 220px;
height: 266px;
property <bool> overlay-on: hover.has-hover
|| fav-btn.hovered || play-btn.hovered || more-btn.hovered;
@@ -64,14 +64,14 @@ export component PlaylistCard inherits Rectangle {
// --- Cover collage + hover overlay -------------------------------
Rectangle {
width: 162px;
height: 162px;
width: 220px;
height: 220px;
border-radius: Radius.sm;
clip: true;
PlaylistCollage {
playlist: root.playlist;
size: 162px;
size: 220px;
}
Rectangle {
@@ -93,8 +93,8 @@ export component PlaylistCard inherits Rectangle {
HorizontalLayout {
x: 0px;
y: 95px;
width: 162px;
y: 132px;
width: 220px;
height: 44px;
alignment: center;
spacing: 12px;
@@ -172,7 +172,7 @@ export component PlaylistCard inherits Rectangle {
// --- Title / subtitle --------------------------------------------
VerticalLayout {
height: 42px;
height: 40px;
spacing: 2px;
padding-left: Spacing.xs;
Text {
@@ -68,9 +68,9 @@ export component PlaylistCarousel inherits VerticalLayout {
callback view-all-clicked();
callback media-action(string, string, string);
property <length> card-width: 162px;
property <length> card-height: 210px;
property <length> gap: 24px;
property <length> card-width: 220px;
property <length> card-height: 266px;
property <length> gap: 32px;
property <int> count: root.playlists.length;
property <int> per-page: Math.max(
@@ -9,7 +9,7 @@ import { SearchPlaylistItem } from "../state.slint";
export component PlaylistCollage inherits Rectangle {
in property <SearchPlaylistItem> playlist;
in property <length> size: 162px;
in property <length> size: 220px;
width: root.size;
height: root.size;