diff --git a/alacritty/yorha.toml b/alacritty/yorha.toml index 5ae9218..cd9d19e 100644 --- a/alacritty/yorha.toml +++ b/alacritty/yorha.toml @@ -53,8 +53,11 @@ magenta = "#a48ba0" cyan = "#86a8a0" white = "#bcc1bf" +# Bright black doubles as a panel fill in TUIs (Claude Code's side pane, fzf +# previews), so it sits one step under the outline grey rather than at it: +# light enough for comments, dark enough not to read as a slab. [colors.bright] -black = "#545c52" +black = "#464d44" red = "#d98068" green = "#a5b893" yellow = "#d8c491" diff --git a/hypr/lua/animations.lua b/hypr/lua/animations.lua index 9568833..4286060 100644 --- a/hypr/lua/animations.lua +++ b/hypr/lua/animations.lua @@ -1,11 +1,13 @@ -- https://wiki.hypr.land/Configuring/Advanced-and-Cool/Animations/ -- --- Quick and clean. Motion should get out of the way, not perform. +-- YoRHa motion: calm and mechanical. Things glide in, settle and stop; nothing +-- overshoots, nothing pops. Matches Theme.easeSnap / easeGlide in +-- ~/.config/quickshell/config/Theme.qml. -- --- An earlier pass overdid it: a 1.56 overshoot on every window, an 88% popin --- scale, and a borderangle looping forever so the focused border was in --- constant motion. The bounce is dialled back to a hint, the popin barely --- scales, and the border angle does not animate at all. +-- Windows fade in from a hair smaller, the way a NieR menu panel resolves +-- rather than arrives. Workspaces slide a short way and fade instead of +-- sweeping the whole screen across, which on a 2560px panel is a lot of +-- motion for "you are somewhere else now". The border angle never animates. hl.config({ animations = { @@ -14,34 +16,40 @@ hl.config({ }) -- ------------------------------------------------------------------- curves -hl.curve("snap", { type = "bezier", points = { { 0.16, 1.00 }, { 0.30, 1.00 } } }) -hl.curve("overshoot", { type = "bezier", points = { { 0.34, 1.12 }, { 0.64, 1.00 } } }) -hl.curve("hard", { type = "bezier", points = { { 0.55, 0.00 }, { 0.90, 0.35 } } }) +-- outQuint: fast off the mark, long quiet settle. +hl.curve("glide", { type = "bezier", points = { { 0.22, 1.00 }, { 0.36, 1.00 } } }) +-- Material standard, for things that move from one place to another. +hl.curve("standard", { type = "bezier", points = { { 0.40, 0.00 }, { 0.20, 1.00 } } }) +-- Leaving: ease in, so the exit gathers pace and is gone. +hl.curve("exit", { type = "bezier", points = { { 0.55, 0.00 }, { 0.90, 0.35 } } }) hl.curve("linear", { type = "bezier", points = { { 0, 0 }, { 1, 1 } } }) -- --------------------------------------------------------------------- tree -- speed is in ds (1ds = 100ms). Unset leaves inherit their parent. -hl.animation({ leaf = "global", enabled = true, speed = 4, bezier = "snap" }) -hl.animation({ leaf = "border", enabled = true, speed = 5, bezier = "snap" }) +hl.animation({ leaf = "global", enabled = true, speed = 4, bezier = "glide" }) +hl.animation({ leaf = "border", enabled = true, speed = 4, bezier = "glide" }) +hl.animation({ leaf = "borderangle", enabled = false }) -hl.animation({ leaf = "windows", enabled = true, speed = 4, bezier = "snap" }) -hl.animation({ leaf = "windowsIn", enabled = true, speed = 4, bezier = "overshoot", style = "popin 96%" }) -hl.animation({ leaf = "windowsOut", enabled = true, speed = 2.6, bezier = "hard", style = "popin 97%" }) -hl.animation({ leaf = "windowsMove", enabled = true, speed = 3.6, bezier = "snap" }) +hl.animation({ leaf = "windows", enabled = true, speed = 4, bezier = "glide" }) +hl.animation({ leaf = "windowsIn", enabled = true, speed = 4, bezier = "glide", style = "popin 94%" }) +hl.animation({ leaf = "windowsOut", enabled = true, speed = 2.4, bezier = "exit", style = "popin 96%" }) +hl.animation({ leaf = "windowsMove", enabled = true, speed = 4, bezier = "standard" }) -hl.animation({ leaf = "fade", enabled = true, speed = 3, bezier = "snap" }) -hl.animation({ leaf = "fadeIn", enabled = true, speed = 2.4, bezier = "snap" }) -hl.animation({ leaf = "fadeOut", enabled = true, speed = 1.8, bezier = "hard" }) -hl.animation({ leaf = "fadeSwitch", enabled = true, speed = 2, bezier = "snap" }) -hl.animation({ leaf = "fadeShadow", enabled = true, speed = 3, bezier = "snap" }) -hl.animation({ leaf = "fadeDim", enabled = true, speed = 2.4, bezier = "snap" }) +hl.animation({ leaf = "fade", enabled = true, speed = 3.4, bezier = "glide" }) +hl.animation({ leaf = "fadeIn", enabled = true, speed = 3.4, bezier = "glide" }) +hl.animation({ leaf = "fadeOut", enabled = true, speed = 2.2, bezier = "exit" }) +hl.animation({ leaf = "fadeSwitch", enabled = true, speed = 3, bezier = "glide" }) +hl.animation({ leaf = "fadeShadow", enabled = true, speed = 3.4, bezier = "glide" }) +hl.animation({ leaf = "fadeDim", enabled = true, speed = 3, bezier = "glide" }) -hl.animation({ leaf = "layers", enabled = true, speed = 3, bezier = "snap" }) -hl.animation({ leaf = "layersIn", enabled = true, speed = 3, bezier = "snap", style = "slide" }) -hl.animation({ leaf = "layersOut", enabled = true, speed = 2, bezier = "hard", style = "slide" }) +-- Quickshell animates its own surfaces; the compositor only fades them, so the +-- two motions never stack. +hl.animation({ leaf = "layers", enabled = true, speed = 2.6, bezier = "glide" }) +hl.animation({ leaf = "layersIn", enabled = true, speed = 2.6, bezier = "glide", style = "fade" }) +hl.animation({ leaf = "layersOut", enabled = true, speed = 2, bezier = "exit", style = "fade" }) -hl.animation({ leaf = "workspaces", enabled = true, speed = 3, bezier = "snap", style = "slidevert" }) -hl.animation({ leaf = "workspacesIn", enabled = true, speed = 3, bezier = "snap", style = "slidevert" }) -hl.animation({ leaf = "workspacesOut", enabled = true, speed = 2.4, bezier = "hard", style = "slidevert" }) +hl.animation({ leaf = "workspaces", enabled = true, speed = 4, bezier = "glide", style = "slidefadevert 12%" }) +hl.animation({ leaf = "workspacesIn", enabled = true, speed = 4, bezier = "glide", style = "slidefadevert 12%" }) +hl.animation({ leaf = "workspacesOut", enabled = true, speed = 3, bezier = "exit", style = "slidefadevert 12%" }) -hl.animation({ leaf = "specialWorkspace", enabled = true, speed = 3, bezier = "snap", style = "slidevert" }) +hl.animation({ leaf = "specialWorkspace", enabled = true, speed = 4, bezier = "glide", style = "slidefadevert 20%" }) diff --git a/hypr/lua/look.lua b/hypr/lua/look.lua index 28937f8..e6ba1c6 100644 --- a/hypr/lua/look.lua +++ b/hypr/lua/look.lua @@ -35,9 +35,12 @@ hl.config({ }, decoration = { - -- NieR panels are plain rectangles. The only curve on screen is the - -- porthole the quickshell hull cuts round the desktop. - rounding = 0, + -- Concentric with the porthole: the opening's corners are 18px and + -- the windows sit 10px inside them, so 8px keeps every gap the same + -- width all the way round the curve. Matches Theme.frameRadius - + -- gaps_out; change one and the other has to follow. + rounding = 8, + rounding_power = 2, -- Fully opaque, both states. Flat ink on flat ground. active_opacity = 1.0, @@ -76,27 +79,40 @@ hl.config({ group = { col = { border_active = c.activeBorder, - border_inactive = c.surfaceAlt, + border_inactive = c.overlay, }, + -- Tabs are solid slabs of the hull, not titles painted over the + -- wallpaper. Hyprland paints a tab's fill and its indicator from the + -- same colour, so the current tab is told apart by being lifted a step + -- and by its title taking the light, not by an accent fill — a light + -- fill would swallow its own title. groupbar = { - font_family = "JetBrainsMono Nerd Font", - font_size = 11, + font_family = "Noto Sans", + font_size = 10, + font_weight_active = "medium", + font_weight_inactive = "normal", - height = 24, - gradients = false, + height = 22, + indicator_height = 1, + indicator_gap = 0, + gradients = true, + rounding = 6, + gradient_rounding = 6, + round_only_edges = true, + gradient_round_only_edges = true, + keep_upper_gap = false, + gaps_in = 2, + gaps_out = 0, - -- --- Active tab --- col = { - active = c.accent, + active = c.overlay, inactive = c.surface, + locked_active = c.alarm, + locked_inactive = c.surface, }, - text_color = c.ink, - - -- --- Inactive tab --- + text_color = c.accent, text_color_inactive = c.muted, - - indicator_height = 3, }, }, diff --git a/quickshell/README.md b/quickshell/README.md index f7d9627..8e388ce 100644 --- a/quickshell/README.md +++ b/quickshell/README.md @@ -296,13 +296,18 @@ network and bluetooth, but keep running as the secret and pairing agents. ## The rest of the desktop -- **Hyprland** — `hypr/lua/look.lua`. No rounding, no blur, both opacities at - `1.0`, 1px borders. The active border runs from the light into the suit's - grey; the inactive border is `overlay`. The shadow is soft and wide, so - windows float in the opening rather than being printed onto it. `gaps_out` - is measured from the hull's opening, since the hull reserves its own zones. +- **Hyprland** — `hypr/lua/look.lua`. Windows round at 8px, concentric with + the opening's 18px corners at a 10px gap (`Theme.frameRadius - gaps_out`); + change one and the others follow. No blur, both opacities at `1.0`, 1px + borders running from the light into the suit's grey. The shadow is soft and + wide, so windows float in the opening. Group tabs are solid hull slabs, the + current one lifted a step with its title in the light. Motion + (`hypr/lua/animations.lua`) glides and settles with no overshoot; layers only + fade, since quickshell animates its own surfaces. - **Alacritty** — `alacritty/yorha.toml`, selected by the `import` in `alacritty.toml`. Muted earth hues on the void; selection inverts. + Alacritty only live-reloads when `alacritty.toml` itself changes, so touch + it after editing the palette. The Catppuccin and `takemi.toml` files are left in place, unreferenced. - **Neovim** — still the `catppuccin` plugin, flavour mocha, configured in `nvim/lua/plugins/ui.lua`. Not yet moved to the YoRHa palette. @@ -333,7 +338,10 @@ rectangles; the knobs are kept so a shape can be brought back on purpose. The porthole's curve is the only one on screen, which is what lets it read. **Motion glides.** No overshoot anywhere: things ease in on `OutCubic` or -`OutExpo` and settle. NieR's interface is calm and mechanical. +`OutExpo` and settle. Nothing scales up or nudges sideways on hover either; +hover brightens and marks, the way NieR's menus do. Meters are thin segment +rows, album art sits square in a hairline frame, and the bar's player shows a +five-hairline signal meter. Each surface is **one continuous slab**, with modules divided by hairline rules rather than by gaps. A row of separate floating cards reads as clutter; that is diff --git a/quickshell/bar/Clock.qml b/quickshell/bar/Clock.qml index 5ec53c6..2e5c5bd 100644 --- a/quickshell/bar/Clock.qml +++ b/quickshell/bar/Clock.qml @@ -53,16 +53,15 @@ BarPill { } } - // Declared with room for its own lean, so the slash sits inside the box - // the Row gave it instead of hanging several px into the date column. - Skew { + // A hairline between the date and the time. + Rectangle { anchors.verticalCenter: parent.verticalCenter - width: 22 * Theme.skew + 3 - height: 22 - color: Theme.alpha(Theme.accent, 0.6) + width: 1 + height: 18 + color: Theme.alpha(Theme.outline, 0.6) } - // Archivo Black's digits are not all the same width, so a clock sized to + // The display face's digits are not all the same width, so a clock sized to // its own text changed width as the minutes rolled over — 11:11 is // several px narrower than 08:48 — and shoved the rest of the bar // around. Reserve the widest possible reading and centre inside it. diff --git a/quickshell/bar/MediaPill.qml b/quickshell/bar/MediaPill.qml index 84b9a1c..bf9e627 100644 --- a/quickshell/bar/MediaPill.qml +++ b/quickshell/bar/MediaPill.qml @@ -41,40 +41,27 @@ BarPill { anchors.left: parent.left spacing: Theme.padS - // Album art, chopped into the house shape. - Item { + // Album art in a hairline frame. + Rectangle { id: artFrame anchors.verticalCenter: parent.verticalCenter width: 24 height: 24 - - Shape { - id: artMask - anchors.fill: parent - visible: false - layer.enabled: true - layer.smooth: true - preferredRendererType: Shape.CurveRenderer - ShapePath { - fillColor: "white" - strokeColor: "transparent" - PathPolyline { - path: Geom.chamfer(Geom.parallelogram(24, 24, 0.18), 5, [1, 3]) - } - } - } + color: Theme.surface + border.width: 1 + border.color: Theme.overlay Image { id: art anchors.fill: parent + anchors.margins: 1 source: Media.artUrl fillMode: Image.PreserveAspectCrop cache: true asynchronous: true visible: status === Image.Ready - layer.enabled: true - layer.smooth: true - layer.effect: MaskedArt { maskItem: artMask } + sourceSize.width: 48 + sourceSize.height: 48 } // Fallback: the source app's glyph. @@ -124,8 +111,10 @@ BarPill { } } - // Compact play-state equaliser. It moves only while audio is playing - // and freezes into three quiet bars when paused. + // Signal meter: five hairline bars, NieR's audio readout rather than a + // chunky equaliser. It moves only while audio is playing and settles + // into a row of square dots when paused — the channel is open, there + // is just nothing on it. // // Sampled from a timer rather than tweened by an infinite // NumberAnimation. DP-1 runs at 240 Hz, and a frame-synced animation @@ -144,7 +133,7 @@ BarPill { Row { id: eq anchors.verticalCenter: parent.verticalCenter - spacing: 2 + spacing: 3 // Sampling interval — the one knob trading smoothness against cost. // Frames are the whole expense: a full-bar repaint runs about 0.3% of @@ -163,8 +152,8 @@ BarPill { // sine would, is three times the motion and reads far busier than // this meter is supposed to. function level(i: int): real { - const lo = 4 + (i * 5) % 13; // old first NumberAnimation `to` - const hi = 14 - (i * 4) % 9; // old second NumberAnimation `to` + const lo = 2 + (i * 3) % 5; + const hi = 14 - (i * 4) % 7; const d1 = 320 + i * 90; // ...and their durations const d2 = 280 + i * 70; @@ -188,12 +177,12 @@ BarPill { } Repeater { - model: 3 + model: 5 Rectangle { required property int index - width: 3 - height: Media.playing ? eq.level(index) : 6 + width: 1 + height: Media.playing ? eq.level(index) : 2 anchors.verticalCenter: parent.verticalCenter color: Media.playing ? Theme.primary : Theme.muted @@ -212,11 +201,16 @@ BarPill { function onTrackChanged() { titleGlitch.restart(); } } + // A new track resolves in, the way NieR text does: a brief dip and back. SequentialAnimation { id: titleGlitch NumberAnimation { - target: artFrame; property: "rotation" - from: -8; to: 0; duration: Theme.durSlow; easing.type: Easing.OutCubic + target: meta; property: "opacity" + to: 0.25; duration: 60 + } + NumberAnimation { + target: meta; property: "opacity" + to: 1; duration: Theme.durSlow; easing.type: Easing.OutCubic } } diff --git a/quickshell/bar/RailIcon.qml b/quickshell/bar/RailIcon.qml index 33bb753..0244d51 100644 --- a/quickshell/bar/RailIcon.qml +++ b/quickshell/bar/RailIcon.qml @@ -122,12 +122,10 @@ Item { } // Leading-edge wipe. On the rail this runs vertically down the left side, - // mirroring the slash P5Panel puts on horizontal modules. + // mirroring the accent bar P5Panel puts on horizontal modules. // // Held off the edge by `wipeInset`: the icon spans the rail's full width, so - // at x = 0 this landed exactly on the slab's own border, and the 1.08 hover - // scale then pushed it out past the silhouette onto the desktop. The inset - // has to survive that scale, which is why it is not simply 1 or 2. + // at x = 0 this landed exactly on the slab's own border. // // It is the accent rather than `tint` because it only ever appears on // hover, and hover is the accent everywhere else in the shell (Theme.glow). @@ -137,7 +135,7 @@ Item { anchors.leftMargin: root.wipeInset anchors.verticalCenter: parent.verticalCenter width: 2 - height: root.hovered ? root.height - 4 : 0 + height: root.hovered ? Theme.marker * 2 : 0 color: Theme.glow Behavior on height { @@ -145,10 +143,6 @@ Item { } } - scale: root.hovered ? 1.08 : 1.0 - Behavior on scale { - NumberAnimation { duration: Theme.durBase; easing.type: Easing.OutCubic } - } onAlarmChanged: if (alarm) glyph.bump() onLiveChanged: if (live) glyph.bump() diff --git a/quickshell/bar/Tray.qml b/quickshell/bar/Tray.qml index 06d3ef2..c0f860c 100644 --- a/quickshell/bar/Tray.qml +++ b/quickshell/bar/Tray.qml @@ -77,10 +77,6 @@ Column { } } - scale: itemHover.hovered ? 1.18 : 1.0 - Behavior on scale { - NumberAnimation { duration: Theme.durBase; easing.type: Easing.OutCubic } - } HoverHandler { id: itemHover diff --git a/quickshell/bar/Workspaces.qml b/quickshell/bar/Workspaces.qml index f653ab3..638dceb 100644 --- a/quickshell/bar/Workspaces.qml +++ b/quickshell/bar/Workspaces.qml @@ -76,7 +76,6 @@ Item { NumberAnimation { duration: Theme.durSlow easing.type: Easing.OutCubic - easing.overshoot: 1.6 } } diff --git a/quickshell/components/Icon.qml b/quickshell/components/Icon.qml index 8c9f6ef..a519786 100644 --- a/quickshell/components/Icon.qml +++ b/quickshell/components/Icon.qml @@ -35,7 +35,7 @@ Text { id: bumpAnim NumberAnimation { target: root; property: "scale" - to: 1.35; duration: Theme.durFast; easing.type: Easing.OutExpo + to: 1.12; duration: Theme.durFast; easing.type: Easing.OutExpo } NumberAnimation { target: root; property: "scale" diff --git a/quickshell/components/MetricRow.qml b/quickshell/components/MetricRow.qml index 4b45ecd..830f337 100644 --- a/quickshell/components/MetricRow.qml +++ b/quickshell/components/MetricRow.qml @@ -2,8 +2,8 @@ import QtQuick import "root:/config" import "root:/components" -// One metric in a popout: a label and its reading on a line, with a wide -// sheared segmented meter underneath. +// One metric in a popout: a label and its reading on a line, with a thin +// segmented meter underneath. // // This replaces the radial Gauge. A 270° dial was the only curved thing in a // shell whose whole geometry is sheared slabs and hard chamfers, so it read as @@ -78,7 +78,7 @@ Item { anchors.left: parent.left anchors.right: parent.right anchors.bottom: parent.bottom - height: 12 + height: 4 segments: root.segments spacing: root.segmentSpacing // Fill the row exactly rather than leaving a ragged tail on the right. diff --git a/quickshell/components/P5Button.qml b/quickshell/components/P5Button.qml index ceb9bd6..9eef41c 100644 --- a/quickshell/components/P5Button.qml +++ b/quickshell/components/P5Button.qml @@ -12,7 +12,9 @@ FocusScope { property bool destructive: false property bool selected: false property real lean: Theme.skew - property real lunge: 4 + // Sideways nudge on hover. Zero: NieR buttons do not move, the marker + // and the inversion carry the state. + property real lunge: 0 property bool wide: false signal clicked() diff --git a/quickshell/overlays/Osd.qml b/quickshell/overlays/Osd.qml index ee5f8b1..29ce158 100644 --- a/quickshell/overlays/Osd.qml +++ b/quickshell/overlays/Osd.qml @@ -171,8 +171,8 @@ PanelWindow { anchors.verticalCenter: parent.verticalCenter // Natural width, not a fixed one — SplitText offsets its // ghosts with left/right anchor margins, so pinning the - // width and right-aligning the text would flatten the RGB - // split away. The title's left edge is anchored, so a + // width and right-aligning the text would flatten the + // glitch flicker away. The title's left edge is anchored, so a // widening readout only moves its own left edge. text: Math.round(root.level * 100) + "%" pixelSize: Theme.fsBody @@ -181,10 +181,10 @@ PanelWindow { MeterBar { width: parent.width - height: 10 + height: 4 segments: 20 - segmentWidth: (width - 19 * 3) / 20 - spacing: 3 + segmentWidth: (width - 19 * 2) / 20 + spacing: 2 value: root.level * 100 activeColor: root.tone } diff --git a/quickshell/overlays/PowerMenu.qml b/quickshell/overlays/PowerMenu.qml index ac9e91a..c81b049 100644 --- a/quickshell/overlays/PowerMenu.qml +++ b/quickshell/overlays/PowerMenu.qml @@ -179,7 +179,6 @@ PanelWindow { selected: root.selectedAction === entry.index accent: entry.modelData.danger ? Theme.alarm : Theme.primary lean: Theme.skew - lunge: -10 onClicked: root.invoke(entry.modelData.act) onHoveredChanged: if (hovered) root.selectedAction = entry.index onActiveFocusChanged: if (actionButton.activeFocus) root.selectedAction = entry.index diff --git a/quickshell/overlays/Toasts.qml b/quickshell/overlays/Toasts.qml index 179cb0c..245bb36 100644 --- a/quickshell/overlays/Toasts.qml +++ b/quickshell/overlays/Toasts.qml @@ -80,14 +80,9 @@ PanelWindow { } } - // Countdown rule that drains along the bottom edge. - // - // It used to be a full-bleed rectangle across the whole toast, - // which meant it ran straight through the card's chopped - // bottom-left corner and out the other side — a stray bar - // hanging off the card at the one place the silhouette is - // supposed to be cut. It lives inside the cut now, and ends - // where the leaning right edge does. + // Countdown hairline that drains along the bottom edge. The + // chop and lean terms are zero under the YoRHa theme; they are + // kept so the fuse still fits if a shape is brought back. readonly property real fuseSpan: Math.max(0, width - card.chop - card.implicitHeight * card.lean) @@ -96,7 +91,7 @@ PanelWindow { anchors.bottom: parent.bottom anchors.bottomMargin: 1 x: card.chop - height: 2 + height: 1 width: toast.fuseSpan lean: card.lean color: Theme.alpha(card.tone, 0.7) diff --git a/quickshell/popouts/BatteryPopout.qml b/quickshell/popouts/BatteryPopout.qml index 000163e..573b875 100644 --- a/quickshell/popouts/BatteryPopout.qml +++ b/quickshell/popouts/BatteryPopout.qml @@ -99,10 +99,10 @@ Popout { anchors.topMargin: Theme.padM anchors.left: parent.left anchors.right: parent.right - height: 12 + height: 4 segments: 20 - segmentWidth: (width - 19 * 3) / 20 - spacing: 3 + segmentWidth: (width - 19 * 2) / 20 + spacing: 2 value: Battery.percent activeColor: Battery.tint } diff --git a/quickshell/popouts/MediaPopout.qml b/quickshell/popouts/MediaPopout.qml index 42ce57b..39bd8fc 100644 --- a/quickshell/popouts/MediaPopout.qml +++ b/quickshell/popouts/MediaPopout.qml @@ -32,62 +32,30 @@ Popout { subtitle: Media.identity } - // Cover art, chopped. - Item { + // Cover art in a hairline frame. + Rectangle { id: artFrame anchors.top: header.bottom anchors.topMargin: Theme.padM anchors.left: parent.left width: 108 height: 108 - - Shape { - id: artMask - anchors.fill: parent - visible: false - layer.enabled: true - // Without this the mask texture is point-sampled, so the - // antialiased pixels along the cuts get snapped back to hard - // steps before MultiEffect ever sees them — see MaskedArt. - layer.smooth: true - preferredRendererType: Shape.CurveRenderer - ShapePath { - fillColor: "white" - strokeColor: "transparent" - PathPolyline { - path: Geom.chamfer(Geom.parallelogram(108, 108, 0.1), 18, [1, 3]) - } - } - } + color: Theme.surface + border.width: 1 + border.color: Theme.overlay Image { id: art anchors.fill: parent + anchors.margins: 1 source: Media.artUrl fillMode: Image.PreserveAspectCrop asynchronous: true cache: true visible: status === Image.Ready - layer.enabled: true - layer.smooth: true - layer.effect: MaskedArt { maskItem: artMask } } // Placeholder when the player exposes no artwork. - Shape { - anchors.fill: parent - visible: art.status !== Image.Ready - preferredRendererType: Shape.CurveRenderer - ShapePath { - fillColor: Theme.surface - strokeColor: Theme.surfaceAlt - strokeWidth: 2 - PathPolyline { - path: Geom.chamfer(Geom.parallelogram(108, 108, 0.1), 18, [1, 3]) - } - } - } - Icon { anchors.centerIn: parent visible: art.status !== Image.Ready @@ -95,16 +63,6 @@ Popout { font.pixelSize: 42 color: Theme.muted } - - // Spinning rule around the art while playing. - Rectangle { - anchors.right: parent.right - anchors.bottom: parent.bottom - width: 30 - height: 3 - color: Theme.accent - visible: Media.playing - } } Column { @@ -363,10 +321,6 @@ Popout { } } - scale: tbHover.hovered && tb.enabled ? 1.12 : 1.0 - Behavior on scale { - NumberAnimation { duration: Theme.durBase; easing.type: Easing.OutCubic } - } HoverHandler { id: tbHover diff --git a/quickshell/popouts/PopoutHeader.qml b/quickshell/popouts/PopoutHeader.qml index fcb90ee..ee4b516 100644 --- a/quickshell/popouts/PopoutHeader.qml +++ b/quickshell/popouts/PopoutHeader.qml @@ -17,7 +17,7 @@ Item { Row { anchors.left: parent.left anchors.top: parent.top - spacing: Theme.padS + spacing: Theme.padM Icon { anchors.verticalCenter: parent.verticalCenter