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:
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;
|
||||
|
||||
Reference in new issue
Block a user