Auto stash before merge of "feat/quickshell-dense-bar" and "origin/feat/quickshell-dense-bar"

This commit is contained in:
2026-08-28 23:03:36 +02:00
parent 9b6b799a5d
commit 6406e06330
8 changed files with 24 additions and 684 deletions
+1 -6
View File
@@ -5,7 +5,6 @@ import qs.widgets.bar
import qs.widgets.launcher
import qs.widgets.notifications
import qs.widgets.osd
import qs.widgets.sidebar
import qs.widgets.systray
import qs.widgets.vitals
@@ -13,11 +12,7 @@ Scope {
// Dense multi-monitor status rail; visual core is headlessly renderable.
DenseBar {}
// Left sidebar in the Slant (V6) style — toggle with SUPER CTRL S.
SideBar {}
BarBottom {}
// App launcher variants — 110; variant 8 remains the primary HUD.
// App launcher variants — SUPER CTRL 18; variant 8 is the primary HUD.
LauncherStack {} // 1 — left vertical list
LauncherGrid {} // 2 — centered icon grid
LauncherSpotlight {} // 3 — top-center command bar
@@ -1,81 +0,0 @@
pragma ComponentBehavior: Bound
import Quickshell
import Quickshell.Widgets
import QtQuick
import QtQuick.Layouts
import qs.widgets.launcher
import qs.widgets.theme
Scope {
id: root
Variants {
model: Quickshell.screens
PanelWindow {
required property var modelData
screen: modelData
color: "transparent"
anchors {
bottom: true
left: true
right: true
}
implicitHeight: wrapper.implicitHeight
WrapperRectangle {
id: wrapper
color: "transparent"
anchors.fill: parent
leftMargin: 12
rightMargin: 12
bottomMargin: 12
Rectangle {
implicitHeight: 12
// Brightens when the Dock launcher (variant 5) opens.
color: LauncherState.dockOpen ? Theme.accentSoft : Theme.accent
Behavior on color {
ColorAnimation {
duration: 250
}
}
// Gentle "listening" pulse while the dock is open.
Rectangle {
anchors.fill: parent
color: Theme.highlight
opacity: 0
visible: LauncherState.dockOpen
SequentialAnimation on opacity {
running: LauncherState.dockOpen
loops: Animation.Infinite
NumberAnimation {
to: 0.4
duration: 700
easing.type: Easing.InOutSine
}
NumberAnimation {
to: 0.0
duration: 700
easing.type: Easing.InOutSine
}
}
}
}
}
}
}
}
@@ -1,81 +0,0 @@
pragma ComponentBehavior: Bound
import Quickshell
import Quickshell.Widgets
import QtQuick
import qs.widgets.launcher
import qs.widgets.theme
Scope {
id: root
Variants {
model: Quickshell.screens
PanelWindow {
id: topBar
required property var modelData
screen: modelData
color: "transparent"
anchors {
top: true
left: true
right: true
}
implicitHeight: wrapper.implicitHeight
WrapperRectangle {
id: wrapper
color: "transparent"
anchors.fill: parent
margin: 12
bottomMargin: 0
Rectangle {
implicitHeight: 6
// Brightens when the Console launcher (variant 4) opens.
color: LauncherState.consoleOpen ? Theme.accentSoft : Theme.accent
Behavior on color {
ColorAnimation {
duration: 250
}
}
// Gentle "listening" pulse while the console is open.
Rectangle {
anchors.fill: parent
color: Theme.highlight
opacity: 0
visible: LauncherState.consoleOpen
SequentialAnimation on opacity {
running: LauncherState.consoleOpen
loops: Animation.Infinite
NumberAnimation {
to: 0.4
duration: 700
easing.type: Easing.InOutSine
}
NumberAnimation {
to: 0.0
duration: 700
easing.type: Easing.InOutSine
}
}
}
}
}
}
}
}
@@ -96,9 +96,8 @@ Item {
height: 92
readonly property real identityWidth: root.compact ? 250 : 320
readonly property real radarWidth: root.compact ? 130 : 164
readonly property real stateWidth: root.compact ? 210 : 250
readonly property real flexWidth: Math.max(250, (width - identityWidth - radarWidth - stateWidth - 32) / 2)
readonly property real stateWidth: root.compact ? 300 : 350
readonly property real flexWidth: Math.max(250, (width - identityWidth - stateWidth - 32) / 2)
Row {
anchors.fill: parent
@@ -234,24 +233,10 @@ Item {
}
}
StatusBarPanel {
width: array.radarWidth
height: array.height
panelId: "03"
title: "SCAN"
RadarGauge {
anchors.horizontalCenter: parent.horizontalCenter
y: 28
size: 57
level: root.cpuFraction
}
}
StatusBarPanel {
width: array.flexWidth
height: array.height
panelId: "04"
panelId: "03"
title: "CARRIER UPLINK"
meta: root.networkInterface.toUpperCase()
@@ -298,7 +283,7 @@ Item {
StatusBarPanel {
width: array.stateWidth
height: array.height
panelId: "05"
panelId: "04"
title: "SYSTEM STATE"
Row {
@@ -1,477 +0,0 @@
pragma ComponentBehavior: Bound
import Quickshell
import Quickshell.Hyprland
import Quickshell.Services.Pipewire
import Quickshell.Wayland
import Quickshell.Widgets
import QtQuick
import QtQuick.Layouts
import QtQuick.Shapes
import qs.widgets.theme
// A vertical sidebar carrying the "Slant" (launcher V6) visual language —
// chamfered panel, thick trapezoid bevel accents, an outward bracket, a
// floating triangle cap and a slanted divider. Right-anchored, mirrored.
Scope {
id: root
property bool active: true
function toggle() {
root.active = !root.active;
}
GlobalShortcut {
name: "sidebar"
description: "Toggle the Slant sidebar"
onPressed: root.toggle()
}
readonly property PwNode sink: Pipewire.defaultAudioSink
readonly property real volume: sink?.audio?.volume ?? 0
readonly property bool muted: sink?.audio?.muted ?? false
readonly property real maxVolume: 1.5
PwObjectTracker {
objects: [root.sink]
}
PanelWindow {
id: win
visible: root.active
color: "transparent"
anchors {
top: true
right: true
bottom: true
}
margins {
top: 8
}
// Frame width plus the gutter the outward bracket grows into.
readonly property int pad: 10
implicitWidth: 72 + 2 * pad
Item {
id: frame
// Inset so the outward bracket has room in the gutter.
anchors.fill: parent
anchors.margins: win.pad
readonly property int chamfer: 18 // big cut corners (top-right, bottom-left)
readonly property int smallChamfer: 7 // small bevel (top-left, bottom-right)
readonly property int bevel: 4 // inward thickness of the trapezoid accents
readonly property int chunkThick: 7 // outward thickness of the bracket
readonly property int chunkSlant: 10 // slant of the bracket end pieces
readonly property int capSize: 10 // floating triangle cap
readonly property int armSide: 58 // bracket arm down the left edge
readonly property int armTop: 34 // bracket arm along the top edge
Shape {
id: panelShape
anchors.fill: parent
preferredRendererType: Shape.CurveRenderer
// Panel: big chamfers on top-right & bottom-left, small bevels
// on top-left & bottom-right (mirror of the left-anchored panel).
ShapePath {
fillColor: Theme.surface
strokeColor: Theme.accent
strokeWidth: 2
startX: panelShape.width - frame.chamfer
startY: 0
PathLine {
x: frame.smallChamfer
y: 0
}
PathLine {
x: 0
y: frame.smallChamfer
}
PathLine {
x: 0
y: panelShape.height - frame.chamfer
}
PathLine {
x: frame.chamfer
y: panelShape.height
}
PathLine {
x: panelShape.width - frame.smallChamfer
y: panelShape.height
}
PathLine {
x: panelShape.width
y: panelShape.height - frame.smallChamfer
}
PathLine {
x: panelShape.width
y: frame.chamfer
}
PathLine {
x: panelShape.width - frame.chamfer
y: 0
}
}
// Thick top-right bevel accent (trapezoid to the edges).
ShapePath {
strokeWidth: 0
fillColor: Theme.accent
startX: panelShape.width
startY: frame.chamfer
PathLine {
x: panelShape.width - frame.chamfer
y: 0
}
PathLine {
x: panelShape.width - frame.chamfer - 2 * frame.bevel
y: 0
}
PathLine {
x: panelShape.width
y: frame.chamfer + 2 * frame.bevel
}
PathLine {
x: panelShape.width
y: frame.chamfer
}
}
// Thick bottom-left bevel accent.
ShapePath {
strokeWidth: 0
fillColor: Theme.accent
startX: 0
startY: panelShape.height - frame.chamfer
PathLine {
x: frame.chamfer
y: panelShape.height
}
PathLine {
x: frame.chamfer + 2 * frame.bevel
y: panelShape.height
}
PathLine {
x: 0
y: panelShape.height - frame.chamfer - 2 * frame.bevel
}
PathLine {
x: 0
y: panelShape.height - frame.chamfer
}
}
// Floating triangle cap in the bottom-left notch.
ShapePath {
strokeWidth: 0
fillColor: Theme.accent
startX: 0
startY: panelShape.height
PathLine {
x: 0
y: panelShape.height - frame.capSize
}
PathLine {
x: frame.capSize
y: panelShape.height
}
PathLine {
x: 0
y: panelShape.height
}
}
// Outward bracket wrapping the top-left corner: down the left
// edge and along the top edge, with slanted ends and a beveled
// corner following the small chamfer.
ShapePath {
strokeWidth: 0
fillColor: Theme.accent
startX: 0
startY: frame.armSide
PathLine {
x: -frame.chunkThick
y: frame.armSide - frame.chunkSlant
}
PathLine {
x: -frame.chunkThick
y: frame.smallChamfer
}
PathLine {
x: frame.smallChamfer
y: -frame.chunkThick
}
PathLine {
x: frame.armTop - frame.chunkSlant
y: -frame.chunkThick
}
PathLine {
x: frame.armTop
y: 0
}
PathLine {
x: frame.smallChamfer
y: 0
}
PathLine {
x: 0
y: frame.smallChamfer
}
PathLine {
x: 0
y: frame.armSide
}
}
}
// ── Content ────────────────────────────────────────────────────
ColumnLayout {
anchors.fill: parent
anchors.topMargin: 16
anchors.bottomMargin: 16
anchors.leftMargin: 10
anchors.rightMargin: 8
spacing: 10
// Clock — readout font, hh over mm
Text {
Layout.alignment: Qt.AlignHCenter
horizontalAlignment: Text.AlignHCenter
text: Qt.formatDateTime(clock.date, "hh\nmm")
font.family: Theme.readoutFont
font.pointSize: 22
font.letterSpacing: 1
color: Theme.text
SystemClock {
id: clock
precision: SystemClock.Minutes
}
}
// Date
Text {
Layout.alignment: Qt.AlignHCenter
horizontalAlignment: Text.AlignHCenter
text: Qt.formatDateTime(clock.date, "dd\nMMM").toUpperCase()
font.family: Theme.readoutFont
font.pointSize: 13
color: Theme.accent
}
// Slanted divider
Item {
Layout.fillWidth: true
implicitHeight: 4
Shape {
id: divider
anchors.fill: parent
preferredRendererType: Shape.CurveRenderer
ShapePath {
strokeWidth: 0
fillColor: Theme.accent
startX: 8
startY: 0
PathLine { x: divider.width; y: 0 }
PathLine { x: divider.width - 8; y: divider.height }
PathLine { x: 0; y: divider.height }
PathLine { x: 8; y: 0 }
}
}
}
Item {
Layout.fillHeight: true
}
// Volume — vertical meter with a sheared fill and a % readout
Text {
Layout.alignment: Qt.AlignHCenter
text: "VOL"
font.family: Theme.readoutFont
font.pointSize: 10
color: Theme.muted
}
ColumnLayout {
Layout.alignment: Qt.AlignHCenter
spacing: 3
// Overflow — three floating slanted segments for volume
// pushed above 100%, lit with the same overload color as
// the volume OSD.
Repeater {
model: 3
delegate: Item {
id: seg
required property int index
readonly property real segStart: 1 + (2 - index) / 3 * (root.maxVolume - 1)
readonly property real segEnd: 1 + (3 - index) / 3 * (root.maxVolume - 1)
readonly property real frac: root.muted ? 0 : Math.max(0, Math.min(1, (root.volume - segStart) / (segEnd - segStart)))
readonly property int chamfer: 4
Layout.alignment: Qt.AlignHCenter
implicitWidth: 16
implicitHeight: 12
// Empty track, chamfered to match the main meter.
Shape {
anchors.fill: parent
preferredRendererType: Shape.CurveRenderer
ShapePath {
strokeWidth: 1
strokeColor: Theme.muted
fillColor: Theme.raised
startX: seg.chamfer
startY: 0
PathLine { x: seg.width; y: 0 }
PathLine { x: seg.width; y: seg.height - seg.chamfer }
PathLine { x: seg.width - seg.chamfer; y: seg.height }
PathLine { x: 0; y: seg.height }
PathLine { x: 0; y: seg.chamfer }
PathLine { x: seg.chamfer; y: 0 }
}
}
// Overload fill — reveals a fixed copy of the same
// chamfered hexagon from the bottom, so filled and
// empty states always share one silhouette.
Item {
id: segFillClip
anchors.left: parent.left
anchors.leftMargin: 2
anchors.right: parent.right
anchors.rightMargin: 2
anchors.bottom: parent.bottom
anchors.bottomMargin: 2
clip: true
height: seg.frac * (seg.height - 4)
Shape {
id: segFill
width: seg.width - 4
height: seg.height - 4
y: segFillClip.height - height
preferredRendererType: Shape.CurveRenderer
readonly property int chamfer: seg.chamfer - 2
ShapePath {
strokeWidth: 0
fillColor: Theme.hot
startX: segFill.chamfer
startY: 0
PathLine { x: segFill.width; y: 0 }
PathLine { x: segFill.width; y: segFill.height - segFill.chamfer }
PathLine { x: segFill.width - segFill.chamfer; y: segFill.height }
PathLine { x: 0; y: segFill.height }
PathLine { x: 0; y: segFill.chamfer }
PathLine { x: segFill.chamfer; y: 0 }
}
}
}
}
}
Item {
id: volMeter
Layout.alignment: Qt.AlignHCenter
implicitWidth: 16
implicitHeight: 96
readonly property int chamfer: 6
// Track — chamfered top-left/bottom-right to match the
// panel's slant, so the sheared fill sits in a shape that
// agrees with it rather than a plain rectangle.
Shape {
anchors.fill: parent
preferredRendererType: Shape.CurveRenderer
ShapePath {
strokeWidth: 1
strokeColor: Theme.muted
fillColor: Theme.raised
startX: volMeter.chamfer
startY: 0
PathLine { x: volMeter.width; y: 0 }
PathLine { x: volMeter.width; y: volMeter.height - volMeter.chamfer }
PathLine { x: volMeter.width - volMeter.chamfer; y: volMeter.height }
PathLine { x: 0; y: volMeter.height }
PathLine { x: 0; y: volMeter.chamfer }
PathLine { x: volMeter.chamfer; y: 0 }
}
}
// Accent fill — reveals a fixed copy of the same
// chamfered hexagon as the track from the bottom, so
// the fill and background always share one silhouette.
Item {
id: fillClip
anchors.left: parent.left
anchors.leftMargin: 2
anchors.right: parent.right
anchors.rightMargin: 2
anchors.bottom: parent.bottom
anchors.bottomMargin: 2
clip: true
readonly property real frac: root.muted ? 0 : Math.min(root.volume, 1)
height: frac * (volMeter.height - 4)
Shape {
id: vol
width: volMeter.width - 4
height: volMeter.height - 4
y: fillClip.height - height
preferredRendererType: Shape.CurveRenderer
readonly property int chamfer: volMeter.chamfer - 2
ShapePath {
strokeWidth: 0
fillColor: root.muted ? Theme.muted : Theme.accent
startX: vol.chamfer
startY: 0
PathLine { x: vol.width; y: 0 }
PathLine { x: vol.width; y: vol.height - vol.chamfer }
PathLine { x: vol.width - vol.chamfer; y: vol.height }
PathLine { x: 0; y: vol.height }
PathLine { x: 0; y: vol.chamfer }
PathLine { x: vol.chamfer; y: 0 }
}
}
}
}
}
Text {
Layout.alignment: Qt.AlignHCenter
text: root.muted ? "--" : Math.round(root.volume * 100)
font.family: Theme.readoutFont
font.pointSize: 14
color: root.muted ? Theme.muted : Theme.text
}
}
}
}
}
Generated
+18 -18
View File
@@ -14,11 +14,11 @@
"uv2nix": "uv2nix"
},
"locked": {
"lastModified": 1786986906,
"narHash": "sha256-DJ1oU9szQJNdEM0dysh4NnKOB1HwOKtNukrUYKpawVs=",
"lastModified": 1787577519,
"narHash": "sha256-YNAXQTgR26RJiX2vtYjk6OtBu2jMWeq4qUN6sUrt6Lc=",
"owner": "nix-community",
"repo": "authentik-nix",
"rev": "afdb2eeca1e0b38fabb93c4a8944be73d3581268",
"rev": "30c37930450d7a5fefa8ffec613f037fc75c3071",
"type": "github"
},
"original": {
@@ -270,11 +270,11 @@
"treefmt-nix": "treefmt-nix"
},
"locked": {
"lastModified": 1787124618,
"narHash": "sha256-aKf1k2hvYgaxP9oxDPRiv9npEJLODC9eKxk7nR69lzQ=",
"lastModified": 1787728766,
"narHash": "sha256-g2oZlrBU3AI2ubCiY/UyE9ALTIDueTcF//QP3vaY9IQ=",
"owner": "nix-community",
"repo": "nixos-anywhere",
"rev": "ad8fa24e11eef167fd72d49fafefa3f840312d71",
"rev": "6b77f26ec4538ced04bf1d02f374b0ec02e9c27e",
"type": "github"
},
"original": {
@@ -291,11 +291,11 @@
"nixos-unstable": "nixos-unstable"
},
"locked": {
"lastModified": 1787222173,
"narHash": "sha256-acp6QJnWVnLvnanC59CMkiDC/i0ZhdFKiB7prru9SHw=",
"lastModified": 1787826771,
"narHash": "sha256-gWkyr3I/cg4SHWGkAoUo24+BQaqoi+S0T2JxDjsA+pw=",
"owner": "nix-community",
"repo": "nixos-images",
"rev": "e17386d9193d6d5a90f1b4b6a8a5cd2620d34b56",
"rev": "f6714acc84ce92df7286c89a571ad1e946057a5b",
"type": "github"
},
"original": {
@@ -354,11 +354,11 @@
},
"nixpkgs-unstable": {
"locked": {
"lastModified": 1787209939,
"narHash": "sha256-WvvHR4kSQLAbtouMC/ruZ5UpLwlUcY3K4FAllMN+yGk=",
"lastModified": 1787814960,
"narHash": "sha256-PYZq1qzCJXC2zGI0mH07vrZBsw6DRBAOX0jN1pPtqOQ=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "391b592eb44808b3bd0cb80bb71b63a5a118b8bb",
"rev": "c27cdad491a991b11ed731760aa2ef8db0cb0410",
"type": "github"
},
"original": {
@@ -370,11 +370,11 @@
},
"nixpkgs_2": {
"locked": {
"lastModified": 1787204541,
"narHash": "sha256-OURZPknrTjQrlNyxPdqzyqmU/81Wes1CUP/Ft1Rv/YI=",
"lastModified": 1787753485,
"narHash": "sha256-BZWCi9ZRJiARTuKTbbtvFTj7t1TK4G3UEckT3HyNfRg=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "5880666fd9eb563038431edb35c2d0aa595884e6",
"rev": "062346a6d85bc4b49dfaa61c986e9c5be21217d1",
"type": "github"
},
"original": {
@@ -400,11 +400,11 @@
]
},
"locked": {
"lastModified": 1785730568,
"narHash": "sha256-NjSPsgjJ7MSpBtTkUcmNhRe6AFZ96+zsca2M8YuQi8Y=",
"lastModified": 1786936886,
"narHash": "sha256-8SFyOdmcG6Nsh/JzlH812lTI/v+ur06fpQhj/acNn8k=",
"owner": "pyproject-nix",
"repo": "build-system-pkgs",
"rev": "90fde00db3687922d39d95fc591475fd0bbbcd72",
"rev": "90ffdeee1a4929b231913df067448cd9803d3e07",
"type": "github"
},
"original": {
-1
View File
@@ -54,7 +54,6 @@ in
pkgs.hyprcursor
pkgs.bibata-cursors
pkgs.papirus-icon-theme
tome
];
xdg.desktopEntries.btop = {
+1 -1
View File
@@ -36,7 +36,7 @@ let
# here rather than at runtime, since hyprpaper has no built-in "random"
# mode; re-pick and rebuild (or swap in real per-monitor selection) when
# this stops being a placeholder.
wallpaper = "/mnt/hdd_01/data/Pictures/Wallhaven/wallhaven-4yjyd4.png";
wallpaper = "/mnt/hdd_01/data/Pictures/Wallhaven/wallhaven-ym81rl.png";
# Dispatchers → the new hl.dsp.* API (signatures verified against hyprland
# 0.55's src/config/lua/bindings/LuaBindingsDispatchers.cpp).