feat(qbz-slint): header redesign, Lucide icons, scrollbar fixes

- Replace every Unicode glyph placeholder with Lucide icons via QbzIcon
  (player transport, carousel nav, album-card overlay, album-page
  actions, gear, search, checkbox, sidebar).
- Header: the search field is centered to the window width and gets a
  search icon; the header and player bar now use the elevated surface,
  so all chrome (header, sidebar, player bar) shares one color over the
  darker content area.
- The sidebar user card moves to the header as a user element (name +
  QBZ logo) that opens a dropdown — Settings, Keyboard Shortcuts,
  Documentation, Report an Issue, About, plus Log Out and Close. Log Out
  clears the session and returns to login; Close quits the app.
- Content ScrollViews disable the horizontal scrollbar — no view scrolls
  horizontally, so the phantom reserved lane is gone.

cc
This commit is contained in:
vicrodh committed 2026-05-18 14:58:58 -06:00
1 parent 636b3e8a06
commit 8c27de5651
13 files changed
+389 -165

No files matched your search

+14 -12
View File
@@ -11,13 +11,14 @@ import { Typography } from "../foundation/typography.slint";
import { Radius } from "../foundation/radius.slint";
import { Spacing } from "../foundation/spacing.slint";
import { AlbumCardItem } from "../state.slint";
import { QbzIcon } from "../primitives/QbzIcon.slint";
// Circular hover-overlay action button.
component OverlayButton inherits Rectangle {
in property <string> glyph;
in property <image> icon;
in property <bool> primary: false;
in property <length> diameter: 36px;
in property <length> glyph-size: 16px;
in property <length> icon-size: 16px;
width: root.diameter;
height: root.diameter;
@@ -26,12 +27,13 @@ component OverlayButton inherits Rectangle {
border-width: root.primary ? 0px : 1.5px;
border-color: #ffffffe6;
Text {
text: root.glyph;
color: root.primary ? #000000 : #ffffff;
font-size: root.glyph-size;
horizontal-alignment: center;
vertical-alignment: center;
QbzIcon {
source: root.icon;
width: root.icon-size;
height: root.icon-size;
x: (parent.width - self.width) / 2;
y: (parent.height - self.height) / 2;
tint: root.primary ? #000000 : #ffffff;
}
}
@@ -109,17 +111,17 @@ export component AlbumCard inherits Rectangle {
VerticalLayout {
alignment: center;
OverlayButton { glyph: "♡"; }
OverlayButton { icon: @image-url("../assets/icons/heart.svg"); }
}
OverlayButton {
glyph: "▶";
icon: @image-url("../assets/icons/play.svg");
primary: true;
diameter: 44px;
glyph-size: 17px;
icon-size: 18px;
}
VerticalLayout {
alignment: center;
OverlayButton { glyph: "⋯"; glyph-size: 18px; }
OverlayButton { icon: @image-url("../assets/icons/ellipsis.svg"); }
}
}