added three new modules (Crypto.qml, Battery.qml, Network.qml), improved Stats.qml, improved Tray.qml, optimized code in general, added a polkit agent, configurations change (check configs)

This commit is contained in:
SomeElse
2026-05-14 04:56:33 +00:00
parent 046a36fbec
commit e3bfa6661f
31 changed files with 5857 additions and 353 deletions

View File

@@ -112,6 +112,7 @@ PanelWindow {
required property string modelData
source: Qt.resolvedUrl("modules/" + modelData + ".qml")
onLoaded: barContent.bindModule(item, "left")
visible: !item || item.moduleEnabled !== false
}
}
}
@@ -139,6 +140,7 @@ PanelWindow {
required property string modelData
source: Qt.resolvedUrl("modules/" + modelData + ".qml")
onLoaded: barContent.bindModule(item, "right")
visible: !item || item.moduleEnabled !== false
}
}
}
@@ -170,6 +172,7 @@ PanelWindow {
required property string modelData
source: Qt.resolvedUrl("modules/" + modelData + ".qml")
onLoaded: barContent.bindModule(item, "center")
visible: !item || item.moduleEnabled !== false
}
}
}

589
bar/modules/Battery.qml Normal file
View File

@@ -0,0 +1,589 @@
import QtQuick
import QtQuick.Layouts
import Quickshell
import Quickshell.Wayland
import Quickshell.Services.UPower
import "../../config" as Cfg
Rectangle {
id: root
property real panelRadius: Cfg.Config.radius / 2
property int borderWidth: Cfg.Config.panelBorderWidth
property bool isTop: true
property var targetScreen: null
property int barHeight: Cfg.Config.barHeight
property int barMargin: Cfg.Config.margin
readonly property var t: Cfg.Config.theme
readonly property var bat: UPower.displayDevice
readonly property bool batReady: bat && bat.ready && bat.isLaptopBattery
readonly property bool moduleEnabled: batready
readonly property real pct: batReady ? bat.percentage * 100 : 72
readonly property int state: batReady ? bat.state : UPowerDeviceState.Unknown
readonly property bool charging: state === UPowerDeviceState.Charging
readonly property bool fullCharge: state === UPowerDeviceState.FullyCharged
readonly property string batIcon: {
if (!batReady) return "󱉞"
if (fullCharge) return "󱟢"
if (charging) {
if (pct >= 90) return "󰂋"
if (pct >= 80) return "󰂊"
if (pct >= 70) return "󰢞"
if (pct >= 60) return "󰂉"
if (pct >= 50) return "󰢝"
if (pct >= 40) return "󰂈"
if (pct >= 30) return "󰂇"
if (pct >= 20) return "󰂆"
if (pct >= 10) return "󰢜"
return "󰢟"
}
if (pct >= 90) return "󰂂"
if (pct >= 80) return "󰂁"
if (pct >= 70) return "󰂀"
if (pct >= 60) return "󰁿"
if (pct >= 50) return "󰁾"
if (pct >= 40) return "󰁽"
if (pct >= 30) return "󰁼"
if (pct >= 20) return "󰁻"
if (pct >= 10) return "󰁺"
return "󰂎"
}
readonly property bool isCritical: batReady && !charging && pct <= 15
readonly property bool isLow: batReady && !charging && pct <= 30
readonly property color iconColor: {
if (fullCharge) return t.batteryFull ?? t.accent
if (charging) return t.batteryCharging ?? t.accent
if (isCritical) return t.batteryCritical ?? "#ff5555"
if (isLow) return t.batteryLow ?? "#ffb86c"
return t.batteryIcon ?? t.clockIcon
}
readonly property var up: UPower
readonly property var pp: PowerProfiles
readonly property string typeText: {
if (!batReady) return "—"
switch (bat.type) {
case UPowerDeviceType.Battery: return "Battery"
case UPowerDeviceType.Ups: return "UPS"
case UPowerDeviceType.Mouse: return "Mouse"
case UPowerDeviceType.Keyboard: return "Keyboard"
case UPowerDeviceType.Phone: return "Phone"
case UPowerDeviceType.Tablet: return "Tablet"
default: return "Other"
}
}
readonly property string degradationText: {
if (pp.degradationReason === PerformanceDegradationReason.None) return ""
if (pp.degradationReason === PerformanceDegradationReason.LapDetected) return "Lap detected"
if (pp.degradationReason === PerformanceDegradationReason.HighTemperature) return "High temp"
return ""
}
readonly property var profileHolds: {
let names = []
for (let i = 0; i < pp.holds.length; i++) {
let h = pp.holds[i]
let label = PowerProfile.toString(h.profile)
if (h.applicationId) label += " (" + h.applicationId + ")"
names.push(label)
}
return names
}
width: batLayout.implicitWidth + 24
height: Cfg.Config.moduleHeight
radius: panelRadius
color: hoverHandler.hovered ? t.batBgHover : t.batBg
border.color: hoverHandler.hovered ? t.batBorderHover : t.batBorder
border.width: borderWidth
Behavior on width { NumberAnimation { duration: 250; easing.type: Easing.OutCubic } }
Behavior on color { ColorAnimation { duration: 150 } }
Behavior on border.color { ColorAnimation { duration: 150 } }
HoverHandler { id: hoverHandler; cursorShape: Qt.PointingHandCursor }
TapHandler { onTapped: batteryPopup.toggle() }
RowLayout {
id: batLayout
anchors.centerIn: parent
spacing: 0
Text {
text: root.batIcon
color: root.iconColor
font.pixelSize: 16
Layout.alignment: Qt.AlignVCenter
Layout.rightMargin: 7
SequentialAnimation on opacity {
running: root.isCritical
loops: Animation.Infinite
NumberAnimation { to: 0.3; duration: 700; easing.type: Easing.InOutSine }
NumberAnimation { to: 1.0; duration: 700; easing.type: Easing.InOutSine }
}
opacity: 1.0
}
Text {
text: root.batReady ? Math.round(root.pct) + "%" : "—"
color: root.t.batText
font.pixelSize: 13
font.bold: true
verticalAlignment: Text.AlignVCenter
}
Text {
id: chargingLabel
text: root.charging ? " +" : (root.fullCharge ? " ✓" : "")
color: root.iconColor
font.pixelSize: 13
font.bold: true
verticalAlignment: Text.AlignVCenter
opacity: (hoverHandler.hovered || batteryPopup.popupOpen) ? 1.0 : 0.0
Layout.preferredWidth: (hoverHandler.hovered || batteryPopup.popupOpen)
? implicitWidth : 0
clip: true
Behavior on opacity { NumberAnimation { duration: 200 } }
Behavior on Layout.preferredWidth { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } }
}
}
PanelWindow {
id: batteryPopup
screen: root.targetScreen
visible: false
color: "transparent"
property bool popupOpen: false
function open() { hideTimer.stop(); visible = true; popupOpen = true }
function close() { popupOpen = false; hideTimer.restart() }
function toggle() { popupOpen ? close() : open() }
Timer {
id: hideTimer
interval: Cfg.Config.popupAnimDuration + 70
onTriggered: batteryPopup.visible = false
}
anchors { top: true; bottom: true; left: true; right: true }
WlrLayershell.layer: WlrLayer.Top
WlrLayershell.namespace: "main-shell-battery"
WlrLayershell.exclusiveZone: -1
mask: popupOpen ? null : _noInput
Region { id: _noInput }
TapHandler { onTapped: batteryPopup.close() }
Item {
id: popupClipContainer
readonly property int cardW: 260
readonly property int screenPad: root.barMargin + 10
x: {
let centerX = root.mapToItem(null, 0, 0).x + root.width / 2
let desiredX = centerX - cardW / 2
return Math.max(screenPad,
Math.min(desiredX, parent.width - cardW - screenPad))
}
width: cardW
anchors.top: root.isTop ? parent.top : undefined
anchors.bottom: root.isTop ? undefined : parent.bottom
anchors.topMargin: root.isTop ? (root.barHeight + 10) : 0
anchors.bottomMargin: root.isTop ? 0 : (root.barHeight + 10)
height: parent.height - root.barHeight - 10
clip: true
Rectangle {
id: cardShadow
anchors.fill: card
anchors.margins: -3
radius: card.radius + 3
color: "transparent"
border.color: Qt.rgba(0, 0, 0, 0.35)
border.width: 6
visible: batteryPopup.popupOpen
opacity: batteryPopup.popupOpen ? 0.6 : 0
Behavior on opacity { NumberAnimation { duration: 200 } }
}
Rectangle {
id: card
width: parent.width
height: cardCol.implicitHeight + 28
anchors.top: root.isTop ? parent.top : undefined
anchors.bottom: root.isTop ? undefined : parent.bottom
transform: Translate {
y: batteryPopup.popupOpen ? 0
: (root.isTop ? -card.height : card.height)
Behavior on y {
NumberAnimation {
duration: Cfg.Config.popupAnimDuration
easing.type: Easing.OutExpo
}
enabled: batteryPopup.visible
}
}
opacity: batteryPopup.popupOpen ? 1.0 : 0.0
Behavior on opacity { NumberAnimation { duration: 220 } }
color: root.t.batPopupBg
radius: Cfg.Config.popupRadius
border.color: root.t.batPopupBorder
border.width: Cfg.Config.popupBorderWidth
layer.enabled: true
MouseArea { anchors.fill: parent; propagateComposedEvents: false }
ColumnLayout {
id: cardCol
anchors {
left: parent.left
right: parent.right
top: parent.top
margins: 18
topMargin: 20
}
spacing: 12
RowLayout {
Layout.fillWidth: true
spacing: 14
Item {
width: 52
height: 52
Rectangle {
anchors.centerIn: parent
width: 46
height: 46
radius: 23
color: Qt.rgba(
Qt.darker(root.iconColor, 1.0).r,
Qt.darker(root.iconColor, 1.0).g,
Qt.darker(root.iconColor, 1.0).b,
0.15
)
}
Text {
anchors.centerIn: parent
text: root.batIcon
color: root.iconColor
font.pixelSize: 26
SequentialAnimation on opacity {
running: root.isCritical
loops: Animation.Infinite
NumberAnimation { to: 0.3; duration: 700; easing.type: Easing.InOutSine }
NumberAnimation { to: 1.0; duration: 700; easing.type: Easing.InOutSine }
}
opacity: 1.0
}
}
ColumnLayout {
spacing: 2
Layout.fillWidth: true
Text {
text: root.batReady ? Math.round(root.pct) + "%" : "—"
color: root.t.batPopupHeader
font.pixelSize: 30
font.bold: true
}
Text {
text: {
if (!root.batReady) return "No battery"
if (root.fullCharge) return "Fully charged"
if (root.charging) return "Charging"
if (root.isCritical) return "Critical"
if (root.isLow) return "Low"
return "Discharging"
}
color: root.iconColor
font.pixelSize: 11
font.capitalization: Font.AllUppercase
font.letterSpacing: 0.8
font.bold: true
}
}
}
Item {
Layout.fillWidth: true
height: 10
Rectangle {
anchors.fill: parent
radius: 5
color: root.t.batProgressTrack
}
Rectangle {
width: Math.max(height, parent.width * (root.pct / 100))
height: parent.height
radius: 5
clip: false
gradient: Gradient {
orientation: Gradient.Horizontal
GradientStop {
position: 0.0
color: Qt.darker(root.iconColor, 1.25)
}
GradientStop {
position: 1.0
color: root.iconColor
}
}
Behavior on width { NumberAnimation { duration: 450; easing.type: Easing.OutCubic } }
}
Rectangle {
anchors.fill: parent
radius: 5
color: "transparent"
border.color: Qt.rgba(root.iconColor.r,
root.iconColor.g,
root.iconColor.b, 0.2)
border.width: 1
}
}
Rectangle {
Layout.fillWidth: true
height: 1
color: root.t.batPopupSeparator
opacity: 0.6
}
component DetailRow: RowLayout {
required property string label
required property string value
Layout.fillWidth: true
Text {
text: label
color: root.t.batPopupDim
font.pixelSize: 12
Layout.fillWidth: true
}
Text {
text: value
color: root.t.batPopupText
font.pixelSize: 12
font.bold: true
font.family: "monospace"
}
}
DetailRow {
label: root.charging ? "Time to full" : "Time left"
value: {
if (!root.batReady || root.fullCharge) return "—"
let secs = root.charging ? bat.timeToFull : bat.timeToEmpty
if (secs <= 0) return "—"
let h = Math.floor(secs / 3600)
let m = Math.floor((secs % 3600) / 60)
return h > 0 ? h + "h " + m + "m" : m + "m"
}
}
DetailRow {
label: "Rate"
value: {
if (!root.batReady) return "—"
let r = bat.changeRate
return (r >= 0 ? "+" : "") + r.toFixed(1) + " W"
}
}
DetailRow {
label: "Health"
value: {
if (!root.batReady) return "—"
if (!bat.healthSupported) return "Undetected"
return Math.round(bat.healthPercentage) + "%"
}
}
DetailRow {
label: "Energy"
value: {
if (!root.batReady) return "—"
return bat.energy.toFixed(1) + " / "
+ bat.energyCapacity.toFixed(1) + " Wh"
}
}
Item {
Layout.fillWidth: true
height: 16
Rectangle {
anchors.verticalCenter: parent.verticalCenter
width: parent.width
height: 1
color: root.t.batPopupSeparator
opacity: 0.6
}
Rectangle {
anchors.centerIn: parent
width: sectionLabel.implicitWidth + 14
height: sectionLabel.implicitHeight + 4
radius: 4
color: root.t.batPopupBg
Text {
id: sectionLabel
anchors.centerIn: parent
text: "Power Profile"
color: root.t.batPopupDim
font.pixelSize: 10
font.capitalization: Font.AllUppercase
font.letterSpacing: 0.8
}
}
}
component ProfileButton: Rectangle {
required property string text
required property var profileValue
property bool interactive: true
property bool isActive: interactive && (root.pp.profile === profileValue)
height: 38
radius: 10
color: isActive ? root.iconColor
: Qt.rgba(root.iconColor.r, root.iconColor.g, root.iconColor.b,
(profileHover.containsMouse && interactive) ? 0.14 : 0.06)
border.color: isActive
? Qt.lighter(root.iconColor, 1.2)
: Qt.rgba(root.iconColor.r, root.iconColor.g, root.iconColor.b, 0.12)
border.width: 1
Behavior on color { ColorAnimation { duration: 150 } }
Behavior on border.color { ColorAnimation { duration: 150 } }
Text {
anchors.centerIn: parent
text: parent.text
font.pixelSize: 10
font.bold: parent.isActive
font.letterSpacing: 0.4
color: parent.isActive ? root.t.batProfileActiveText : root.t.batPopupText
}
HoverHandler { id: profileHover; enabled: parent.interactive }
MouseArea {
anchors.fill: parent
cursorShape: parent.interactive ? Qt.PointingHandCursor : Qt.ArrowCursor
onClicked: {
if (parent.interactive) root.pp.profile = parent.profileValue
}
}
}
RowLayout {
Layout.fillWidth: true
spacing: 6
ProfileButton {
text: "Power Saver"
profileValue: PowerProfile.PowerSaver
Layout.fillWidth: true
}
ProfileButton {
text: "Balanced"
profileValue: PowerProfile.Balanced
Layout.fillWidth: true
}
ProfileButton {
text: "Performance"
profileValue: PowerProfile.Performance
interactive: root.pp.hasPerformanceProfile
Layout.fillWidth: true
}
}
DetailRow {
label: "Degradation"
value: root.degradationText || "None"
}
DetailRow {
label: "Holds"
value: root.profileHolds.length > 0 ? root.profileHolds[0] : "—"
visible: root.profileHolds.length > 0
}
Item {
Layout.fillWidth: true
height: 16
Rectangle {
anchors.verticalCenter: parent.verticalCenter
width: parent.width
height: 1
color: root.t.batPopupSeparator
opacity: 0.6
}
Rectangle {
anchors.centerIn: parent
width: devLabel.implicitWidth + 14
height: devLabel.implicitHeight + 4
radius: 4
color: root.t.batPopupBg
Text {
id: devLabel
anchors.centerIn: parent
text: "Device"
color: root.t.batPopupDim
font.pixelSize: 10
font.capitalization: Font.AllUppercase
font.letterSpacing: 0.8
}
}
}
DetailRow { label: "Type"; value: root.typeText }
DetailRow { label: "Model"; value: root.batReady ? (bat.model || "Undetected") : "—" }
DetailRow { label: "Power supply"; value: root.batReady ? (bat.powerSupply ? "Yes" : "No") : "—" }
DetailRow { label: "On battery"; value: root.up.onBattery ? "Yes" : "No" }
DetailRow { label: "Devices"; value: root.up.devices.values.length + " total" }
Item { height: 2 }
}
}
}
}
}

View File

@@ -2,6 +2,7 @@ import QtQuick
import QtQuick.Layouts
import Quickshell
import Quickshell.Wayland
import Quickshell.Io
import "../../config" as Cfg
@@ -17,8 +18,44 @@ Rectangle {
property int barMargin: Cfg.Config.margin
readonly property var t: Cfg.Config.theme
readonly property string tz: Cfg.Config.timezone || ""
readonly property int tzOffsetHours: -timeManager.now.getTimezoneOffset() / 60
property int tzOffsetMin: 0
Process {
id: tzProc
command: ["bash", "-c", "TZ=" + (root.tz || "UTC") + " date +%z"]
running: root.tz !== ""
stdout: SplitParser {
onRead: data => {
var s = data.trim()
if (s.length < 5) return
var sign = (s[0] === "-") ? -1 : 1
var h = parseInt(s.substring(1, 3), 10)
var m = parseInt(s.substring(3, 5), 10)
root.tzOffsetMin = sign * (h * 60 + m)
}
}
}
Timer {
interval: 1800000; running: root.tz !== ""; repeat: true
onTriggered: tzProc.running = true
}
function toTz(date) {
if (!tz) return date
return new Date(date.getTime()
+ date.getTimezoneOffset() * 60000
+ tzOffsetMin * 60000)
}
function tzOffsetHours() {
if (!tz) return -timeManager.now.getTimezoneOffset() / 60
return tzOffsetMin / 60
}
width: clockLayout.implicitWidth + 24
height: Cfg.Config.moduleHeight
@@ -66,7 +103,7 @@ Rectangle {
}
Text {
text: timeManager.now.toLocaleTimeString(Qt.locale(), "HH:mm")
text: root.toTz(timeManager.now).toLocaleTimeString(Qt.locale(), "HH:mm")
color: root.t.clockTime
font.pixelSize: 13
font.bold: true
@@ -75,7 +112,7 @@ Rectangle {
Text {
id: secondsText
text: ":" + timeManager.now.toLocaleTimeString(Qt.locale(), "ss")
text: ":" + root.toTz(timeManager.now).toLocaleTimeString(Qt.locale(), "ss")
color: root.t.clockSeconds
font.pixelSize: 13
font.bold: true
@@ -230,7 +267,7 @@ Rectangle {
Layout.fillWidth: true
Text {
text: timeManager.now.toLocaleDateString(Qt.locale(), "dddd")
text: root.toTz(timeManager.now).toLocaleDateString(Qt.locale(), "dddd")
color: root.t.clockPopupDim
font.pixelSize: 12
font.capitalization: Font.AllUppercase
@@ -239,7 +276,7 @@ Rectangle {
}
Text {
text: timeManager.now.toLocaleDateString(Qt.locale(), "d MMMM yyyy")
text: root.toTz(timeManager.now).toLocaleDateString(Qt.locale(), "d MMMM yyyy")
color: root.t.clockPopupHeader
font.pixelSize: 22
font.bold: true
@@ -269,8 +306,8 @@ Rectangle {
id: cal
Layout.fillWidth: true
implicitHeight: gridCol.implicitHeight
property int displayYear: timeManager.now.getFullYear()
property int displayMonth: timeManager.now.getMonth()
property int displayYear: root.toTz(timeManager.now).getFullYear()
property int displayMonth: root.toTz(timeManager.now).getMonth()
property int pendingYear: displayYear
property int pendingMonth: displayMonth
property int slideDir: 1
@@ -279,8 +316,9 @@ Rectangle {
target: calendarPopup
function onPopupOpenChanged() {
if (calendarPopup.popupOpen) {
cal.displayYear = timeManager.now.getFullYear()
cal.displayMonth = timeManager.now.getMonth()
let tzd = root.toTz(timeManager.now)
cal.displayYear = tzd.getFullYear()
cal.displayMonth = tzd.getMonth()
}
}
}
@@ -339,7 +377,12 @@ Rectangle {
width: (card.width - 32) / 7; height: 26
readonly property int dayNum: (weekRow.weekIndex * 7 + index) - ((new Date(cal.displayYear, cal.displayMonth, 1).getDay() + 6) % 7) + 1
readonly property bool inMonth: dayNum >= 1 && dayNum <= new Date(cal.displayYear, cal.displayMonth + 1, 0).getDate()
readonly property bool isToday: inMonth && dayNum === timeManager.now.getDate() && cal.displayYear === timeManager.now.getFullYear() && cal.displayMonth === timeManager.now.getMonth()
readonly property bool isToday: {
let tzd = root.toTz(timeManager.now)
return inMonth && dayNum === tzd.getDate()
&& cal.displayYear === tzd.getFullYear()
&& cal.displayMonth === tzd.getMonth()
}
Rectangle {
anchors.centerIn: parent; width: 22; height: 22; radius: 11
@@ -371,7 +414,7 @@ Rectangle {
Layout.rightMargin: 6
Text {
text: "UTC " + (root.tzOffsetHours >= 0 ? "+" : "") + root.tzOffsetHours
text: "UTC " + (root.tzOffsetHours() >= 0 ? "+" : "") + root.tzOffsetHours()
color: root.t.clockPopupUtc
font.pixelSize: 13
font.bold: true
@@ -382,11 +425,11 @@ Rectangle {
Text {
text: {
let d = timeManager.now
let d = root.toTz(timeManager.now)
let month = d.getMonth() + 1
let day = d.getDate()
let year = d.getFullYear()
if (Cfg.Config.clockDateFormat === "DMY")
if (Cfg.Config.dateFormat === "DMY")
return day + "/" + month + "/" + year
return month + "/" + day + "/" + year
}

1200
bar/modules/Crypto.qml Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,6 +1,4 @@
import QtQuick
import QtQuick.Layouts
import Quickshell
import "../../config" as Cfg
@@ -37,10 +35,10 @@ Rectangle {
width: Cfg.Config.logoIconSize * 2 + 4
height: parent.height
color: isHovered ? t.archLogoBgHover : t.archLogoBg
color: isHovered ? t.logoBgHover : t.logoBg
radius: panelRadius
border.color: launcherActive ? t.archLogoBorderActive : t.archLogoBorder
border.color: launcherActive ? t.logoBorderActive : t.logoBorder
border.width: borderWidth
Behavior on color { ColorAnimation { duration: 250 } }
@@ -69,7 +67,7 @@ Rectangle {
anchors.centerIn: parent
text: Cfg.Config.logoIcon
color: launcherActive ? t.archLogoIconActive : t.archLogoIcon
color: launcherActive ? t.logoIconActive : t.logoIcon
font.pixelSize: Cfg.Config.logoIconSize
Behavior on color { ColorAnimation { duration: 250 } }

728
bar/modules/Network.qml Normal file
View File

@@ -0,0 +1,728 @@
import QtQuick
import QtQuick.Layouts
import Quickshell
import Quickshell.Wayland
import Quickshell.Networking
import Quickshell.Services.Polkit
import "../../config" as Cfg
Rectangle {
id: root
property real panelRadius: Cfg.Config.radius / 2
property int borderWidth: Cfg.Config.panelBorderWidth
property bool isTop: true
property var targetScreen: null
property int barHeight: Cfg.Config.barHeight
property int barMargin: Cfg.Config.margin
readonly property var t: Cfg.Config.theme
readonly property var wifiDevice: {
for (const dev of (Networking.devices?.values ?? []))
if (dev.type === DeviceType.Wifi) return dev
return null
}
readonly property var wiredDevice: {
for (const dev of (Networking.devices?.values ?? []))
if (dev.type === DeviceType.Wired) return dev
return null
}
readonly property bool hasWifi: wifiDevice !== null
readonly property bool hasWired: wiredDevice !== null
readonly property bool wifiUp: hasWifi && wifiDevice.connected
readonly property bool wiredUp: hasWired && wiredDevice.connected
readonly property string connectivityLabel: {
switch (Networking.connectivity) {
case NetworkConnectivity.Portal: return "Captive Portal"
case NetworkConnectivity.Limited: return "Limited"
case NetworkConnectivity.None: return "No Internet"
default: return ""
}
}
readonly property string wifiModeLabel: {
if (!wifiUp || !wifiDevice) return ""
switch (wifiDevice.mode) {
case WifiDeviceMode.Infra: return "Infra"
case WifiDeviceMode.Ap: return "AP"
case WifiDeviceMode.Adhoc: return "Ad-Hoc"
case WifiDeviceMode.Mesh: return "Mesh"
default: return ""
}
}
readonly property var activeAP: {
for (const n of (wifiDevice?.networks?.values ?? []))
if (n.connected) return n
return null
}
readonly property string ssid: activeAP ? (activeAP.name || "") : ""
readonly property int strength: activeAP ? Math.round((activeAP.signalStrength || 0) * 100) : 0
readonly property string wifiIcon: {
if (!wifiUp) return "󰤭"
if (strength >= 80) return "󰤨"
if (strength >= 60) return "󰤥"
if (strength >= 40) return "󰤢"
if (strength >= 20) return "󰤟"
return "󰤯"
}
readonly property string displayIcon: hasWifi ? wifiIcon : ""
readonly property color iconColor: {
if (hasWifi) return wifiUp ? t.statusOk : t.statusErr
if (hasWired) return wiredUp ? t.statusOk : t.statusErr
return t.textDim
}
readonly property string chipLabel: {
if (hasWifi) return (wifiUp && ssid !== "") ? ssid : "Wi-Fi"
if (hasWired) return wiredUp ? "Ethernet" : "Offline"
return "No NIC"
}
property var pendingAP: null
property string pendingSSID: ""
property bool showPwdPrompt: false
property string enteredPwd: ""
function attemptConnect() {
if (!pendingAP) return
if (enteredPwd.length > 0)
pendingAP.connectWithPsk(enteredPwd)
else
pendingAP.connect()
pendingAP = null
pendingSSID = ""
enteredPwd = ""
showPwdPrompt = false
}
function cancelConnect() {
pendingAP = null
pendingSSID = ""
enteredPwd = ""
showPwdPrompt = false
}
implicitWidth: chipRow.implicitWidth + 24
height: Cfg.Config.moduleHeight
radius: panelRadius
color: chipHover.hovered ? t.netBgHover : t.netBg
border.color: chipHover.hovered ? t.netBorderHover : t.netBorder
border.width: borderWidth
Behavior on implicitWidth { NumberAnimation { duration: 250; easing.type: Easing.OutCubic } }
Behavior on color { ColorAnimation { duration: 150 } }
Behavior on border.color { ColorAnimation { duration: 150 } }
HoverHandler { id: chipHover; cursorShape: Qt.PointingHandCursor }
TapHandler { onTapped: netPopup.toggle() }
RowLayout {
id: chipRow
anchors.centerIn: parent
spacing: 6
Text {
text: root.displayIcon
color: root.iconColor
font.pixelSize: 16
Layout.alignment: Qt.AlignVCenter
SequentialAnimation on opacity {
running: root.hasWifi && root.wifiDevice
&& (root.wifiDevice.scannerEnabled || false)
loops: Animation.Infinite
NumberAnimation { to: 0.4; duration: 600; easing.type: Easing.InOutSine }
NumberAnimation { to: 1.0; duration: 600; easing.type: Easing.InOutSine }
}
opacity: 1.0
}
Text {
text: root.chipLabel
color: root.t.netText
font.pixelSize: 12
font.bold: true
verticalAlignment: Text.AlignVCenter
Layout.maximumWidth: 110
elide: Text.ElideRight
}
}
PanelWindow {
id: netPopup
screen: root.targetScreen
visible: false
color: "transparent"
property bool popupOpen: false
function open() {
root.cancelConnect()
hideTimer.stop()
visible = true
popupOpen = true
if (root.hasWifi && root.wifiDevice)
root.wifiDevice.scannerEnabled = true
}
function close() { popupOpen = false; hideTimer.restart() }
function toggle() { popupOpen ? close() : open() }
Timer {
id: hideTimer
interval: Cfg.Config.popupAnimDuration + 70
onTriggered: netPopup.visible = false
}
anchors { top: true; bottom: true; left: true; right: true }
WlrLayershell.layer: WlrLayer.Top
WlrLayershell.namespace: "main-shell-network"
WlrLayershell.exclusiveZone: -1
mask: netPopup.popupOpen ? null : _noInput
Region { id: _noInput }
TapHandler { onTapped: netPopup.close() }
Item {
id: popupClip
readonly property int cardW: 310
readonly property int screenPad: root.barMargin + 10
x: {
var cx = root.mapToItem(null, 0, 0).x + root.width / 2
var dx = cx - cardW / 2
return Math.max(screenPad, Math.min(dx, parent.width - cardW - screenPad))
}
width: cardW
anchors.top: root.isTop ? parent.top : undefined
anchors.bottom: root.isTop ? undefined : parent.bottom
anchors.topMargin: root.isTop ? (root.barHeight + 10) : 0
anchors.bottomMargin: root.isTop ? 0 : (root.barHeight + 10)
height: parent.height - root.barHeight - 10
clip: true
Rectangle {
id: card
width: parent.width
height: cardBody.implicitHeight + 24
anchors.top: root.isTop ? parent.top : undefined
anchors.bottom: root.isTop ? undefined : parent.bottom
transform: Translate {
y: netPopup.popupOpen ? 0 : (root.isTop ? -card.height : card.height)
Behavior on y {
NumberAnimation {
duration: Cfg.Config.popupAnimDuration
easing.type: Easing.OutExpo
}
enabled: netPopup.visible
}
}
opacity: netPopup.popupOpen ? 1.0 : 0.0
Behavior on opacity { NumberAnimation { duration: 200 } }
color: root.t.netPopupBg
radius: Cfg.Config.popupRadius
border.color: root.t.netPopupBorder
border.width: Cfg.Config.popupBorderWidth
layer.enabled: true
MouseArea { anchors.fill: parent; propagateComposedEvents: false }
ColumnLayout {
id: cardBody
anchors {
left: parent.left
right: parent.right
top: parent.top
margins: 16
topMargin: 18
}
spacing: 12
RowLayout {
Layout.fillWidth: true
spacing: 12
Text {
text: root.displayIcon
color: root.iconColor
font.pixelSize: 36
Layout.alignment: Qt.AlignVCenter
}
ColumnLayout {
spacing: 2
Layout.fillWidth: true
Text {
text: {
if (root.hasWifi)
return root.wifiUp
? (root.ssid !== "" ? root.ssid : "Connected")
: "Wi-Fi"
if (root.hasWired)
return root.wiredUp ? "Ethernet" : "Disconnected"
return "No Network"
}
color: root.t.netPopupHeader
font.pixelSize: 17
font.bold: true
elide: Text.ElideRight
Layout.fillWidth: true
}
Text {
text: {
if (root.hasWifi && root.wifiDevice) {
var st = root.wifiDevice.state
if (st === ConnectionState.Activating) return "Connecting..."
if (st === ConnectionState.Deactivating) return "Disconnecting..."
if (root.wifiUp && root.activeAP) {
var s = root.strength + "% signal"
if (root.wifiModeLabel !== "") s += " · " + root.wifiModeLabel
return s
}
if (st === ConnectionState.Deactivated)
return "Disconnected"
return "Not connected"
}
if (root.hasWired && root.wiredDevice)
return root.wiredDevice.name || "—"
return "No hardware found"
}
color: root.t.netPopupDim
font.pixelSize: 12
}
Text {
visible: root.connectivityLabel !== ""
text: root.connectivityLabel
color: root.t.statusErr
font.pixelSize: 11
}
}
Rectangle {
visible: root.hasWifi
width: 28; height: 28
radius: 8
color: scanHover.hovered ? root.t.netApHoverBg : "transparent"
border.color: root.t.netPopupBorder
border.width: 1
Behavior on color { ColorAnimation { duration: 120 } }
Text {
anchors.centerIn: parent
text: "\uf0450"
font.pixelSize: 15
color: scanHover.hovered ? root.t.accent : root.t.netPopupDim
RotationAnimator on rotation {
id: scanSpin; running: false
from: 0; to: 360; duration: 700; loops: 2
easing.type: Easing.InOutCubic
}
}
HoverHandler { id: scanHover; cursorShape: Qt.PointingHandCursor }
TapHandler {
onTapped: {
scanSpin.restart()
if (root.wifiDevice) root.wifiDevice.scannerEnabled = true
}
}
}
}
Rectangle { Layout.fillWidth: true; height: 1; color: root.t.netPopupSeparator }
ColumnLayout {
visible: root.hasWifi
Layout.fillWidth: true
spacing: 4
Text {
text: "AVAILABLE NETWORKS"
color: root.t.netPopupDim
font.pixelSize: 10
font.letterSpacing: 1.2
Layout.fillWidth: true
}
Text {
visible: root.hasWifi && root.wifiDevice
&& root.wifiDevice.networks.values.length === 0
text: (root.wifiDevice && (root.wifiDevice.scannerEnabled || false))
? "Scanning..." : "No networks found"
color: root.t.netPopupDim
font.pixelSize: 12
Layout.alignment: Qt.AlignHCenter
Layout.topMargin: 4
}
Repeater {
model: (root.hasWifi && root.wifiDevice) ? root.wifiDevice.networks.values : []
delegate: Rectangle {
required property var modelData
Layout.fillWidth: true
height: 50
radius: 10
color: {
var active = modelData.connected || false
if (active) return root.t.netApActiveBg
if (apHover.hovered) return root.t.netApHoverBg
return "transparent"
}
border.color: (modelData.connected || false) ? root.t.accent : "transparent"
border.width: 1
Behavior on color { ColorAnimation { duration: 120 } }
Behavior on border.color { ColorAnimation { duration: 120 } }
HoverHandler { id: apHover; cursorShape: Qt.PointingHandCursor }
TapHandler {
onTapped: {
if (modelData.connected || false) return
if (modelData.security !== WifiSecurityType.None) {
root.pendingAP = modelData
root.pendingSSID = modelData.name || ""
root.enteredPwd = ""
root.showPwdPrompt = true
} else {
modelData.connect()
}
}
}
RowLayout {
anchors { fill: parent; leftMargin: 12; rightMargin: 12 }
spacing: 10
Text {
text: {
var s = Math.round((modelData.signalStrength || 0) * 100)
if (s >= 80) return "\uf0ec8"
if (s >= 60) return "\uf0ec5"
if (s >= 40) return "\uf0ec2"
if (s >= 20) return "\uf0ebf"
return "\uf0eef"
}
color: (modelData.connected || false)
? root.t.accent : root.t.netPopupDim
font.pixelSize: 18
Layout.alignment: Qt.AlignVCenter
}
ColumnLayout {
spacing: 2
Layout.fillWidth: true
Text {
text: modelData.name || "(hidden)"
color: (modelData.connected || false)
? root.t.netPopupHeader
: root.t.netPopupText
font.pixelSize: 13
font.bold: (modelData.connected || false)
elide: Text.ElideRight
Layout.fillWidth: true
}
Text {
text: {
if (modelData.stateChanging)
return modelData.state === ConnectionState.Activating
? "Connecting..." : "Disconnecting..."
var parts = []
if (modelData.known) parts.push("Saved")
if (modelData.security !== WifiSecurityType.None) parts.push("Secured")
else parts.push("Open")
parts.push(Math.round((modelData.signalStrength || 0) * 100) + "%")
return parts.join(" · ")
}
color: root.t.netPopupDim
font.pixelSize: 11
}
}
Text {
visible: (modelData.security !== WifiSecurityType.None) && !(modelData.connected || false)
text: "\uf033e"
color: root.t.netPopupDim
font.pixelSize: 13
Layout.alignment: Qt.AlignVCenter
}
Text {
visible: (modelData.connected || false)
text: "\uf012c"
color: root.t.statusOk
font.pixelSize: 15
Layout.alignment: Qt.AlignVCenter
}
}
}
}
Rectangle {
visible: root.wifiUp
Layout.fillWidth: true
Layout.topMargin: 4
height: 36; radius: 10
color: discoHover.hovered
? root.t.netDisconnectBg : "transparent"
border.color: root.t.netDisconnectBorder
border.width: 1
Behavior on color { ColorAnimation { duration: 120 } }
HoverHandler { id: discoHover; cursorShape: Qt.PointingHandCursor }
TapHandler {
onTapped: {
if (root.activeAP)
root.activeAP.disconnect()
}
}
Text {
anchors.centerIn: parent
text: "Disconnect"
color: root.t.statusErr
font.pixelSize: 12
font.bold: true
}
}
}
ColumnLayout {
visible: !root.hasWifi && root.hasWired
Layout.fillWidth: true
spacing: 10
Text {
text: "CONNECTION DETAILS"
color: root.t.netPopupDim
font.pixelSize: 10
font.letterSpacing: 1.2
Layout.fillWidth: true
}
Rectangle {
Layout.fillWidth: true
height: 38; radius: 10
color: root.wiredUp
? root.t.netWiredOkBg
: root.t.netWiredErrBg
border.color: root.wiredUp
? root.t.netWiredOkBorder
: root.t.netWiredErrBorder
border.width: 1
RowLayout {
anchors { fill: parent; leftMargin: 14; rightMargin: 14 }
spacing: 10
Text {
text: root.wiredUp ? "\uf0601" : "\uf0602"
color: root.wiredUp ? root.t.statusOk : root.t.statusErr
font.pixelSize: 18
Layout.alignment: Qt.AlignVCenter
}
Text {
text: root.wiredUp ? "Connected" : "Cable unplugged"
color: root.wiredUp ? root.t.statusOk : root.t.statusErr
font.pixelSize: 13
font.bold: true
Layout.fillWidth: true
}
}
}
ColumnLayout {
Layout.fillWidth: true
spacing: 6
Repeater {
model: [
{
label: "Interface",
value: (root.wiredDevice && root.wiredDevice.name)
? root.wiredDevice.name : "—"
},
{
label: "MAC",
value: (root.wiredDevice && root.wiredDevice.address)
? root.wiredDevice.address : "—"
},
{
label: "Link",
value: (root.wiredDevice)
? (root.wiredDevice.hasLink ? "Up" : "Down") : "—"
},
{
label: "Speed",
value: (root.wiredDevice && root.wiredUp &&
root.wiredDevice.linkSpeed > 0)
? (root.wiredDevice.linkSpeed + " Mbps") : "—"
}
]
delegate: RowLayout {
required property var modelData
Layout.fillWidth: true
Text {
text: modelData.label
color: root.t.netPopupDim
font.pixelSize: 12
Layout.fillWidth: true
}
Text {
text: modelData.value
color: root.t.netPopupText
font.pixelSize: 12
font.bold: true
font.family: "monospace"
}
}
}
}
}
Text {
visible: !root.hasWifi && !root.hasWired
text: "No network hardware detected."
color: root.t.netPopupDim
font.pixelSize: 12
horizontalAlignment: Text.AlignHCenter
Layout.fillWidth: true
Layout.topMargin: 4
}
ColumnLayout {
visible: root.showPwdPrompt
Layout.fillWidth: true
spacing: 8
Rectangle { Layout.fillWidth: true; height: 1; color: root.t.netPopupSeparator }
Text {
text: "Connect to \"" + root.pendingSSID + "\""
color: root.t.netPopupHeader
font.pixelSize: 13
font.bold: true
elide: Text.ElideRight
Layout.fillWidth: true
}
Rectangle {
Layout.fillWidth: true
height: 36; radius: 8
color: root.t.netFieldBg
border.color: pwdField.activeFocus ? root.t.accent : root.t.netPopupBorder
border.width: 1
Behavior on border.color { ColorAnimation { duration: 120 } }
RowLayout {
anchors { fill: parent; leftMargin: 12; rightMargin: 10 }
spacing: 6
TextInput {
id: pwdField
Layout.fillWidth: true
verticalAlignment: TextInput.AlignVCenter
echoMode: eyeToggle.showClear
? TextInput.Normal : TextInput.Password
color: root.t.netPopupText
font.pixelSize: 13
selectionColor: Qt.alpha(root.t.accent, 0.4)
clip: true
text: root.enteredPwd
onTextChanged: root.enteredPwd = text
Keys.onReturnPressed: root.attemptConnect()
Keys.onEscapePressed: root.cancelConnect()
onVisibleChanged: if (visible) forceActiveFocus()
Text {
anchors.fill: parent
verticalAlignment: Text.AlignVCenter
text: "Password"
color: root.t.netPopupDim
font.pixelSize: 13
visible: pwdField.text === "" && !pwdField.activeFocus
}
}
Text {
id: eyeToggle
property bool showClear: false
text: showClear ? "\uf0349" : "\uf0354"
color: eyeHover.hovered ? root.t.accent : root.t.netPopupDim
font.pixelSize: 15
Layout.alignment: Qt.AlignVCenter
HoverHandler { id: eyeHover; cursorShape: Qt.PointingHandCursor }
TapHandler { onTapped: eyeToggle.showClear = !eyeToggle.showClear }
}
}
}
RowLayout {
Layout.fillWidth: true
spacing: 8
Rectangle {
Layout.fillWidth: true
height: 34; radius: 8
color: cancelHover.hovered ? root.t.netCancelBgHover : "transparent"
border.color: root.t.netPopupBorder
border.width: 1
Behavior on color { ColorAnimation { duration: 120 } }
HoverHandler { id: cancelHover; cursorShape: Qt.PointingHandCursor }
TapHandler { onTapped: root.cancelConnect() }
Text {
anchors.centerIn: parent
text: "Cancel"
color: root.t.netPopupDim
font.pixelSize: 12
}
}
Rectangle {
Layout.fillWidth: true
height: 34; radius: 8
color: connHover.hovered ? root.t.accent : Qt.alpha(root.t.accent, 0.75)
Behavior on color { ColorAnimation { duration: 120 } }
HoverHandler { id: connHover; cursorShape: Qt.PointingHandCursor }
TapHandler { onTapped: root.attemptConnect() }
Text {
anchors.centerIn: parent
text: "Connect"
color: root.t.netConnectText
font.pixelSize: 12
font.bold: true
}
}
}
}
Item { height: 4 }
}
}
}
}
}

View File

@@ -1,6 +1,5 @@
import QtQuick
import QtQuick.Layouts
import Quickshell
import Quickshell.Io
import "../../config" as Cfg
@@ -25,7 +24,19 @@ Rectangle {
NumberAnimation { duration: 250; easing.type: Easing.OutCubic }
}
HoverHandler { cursorShape: Qt.PointingHandCursor }
property bool expanded: Cfg.Config.statsStartExpanded
property bool hovered: false
HoverHandler {
onHoveredChanged: root.hovered = hovered
}
TapHandler {
onTapped: {
root.expanded = !root.expanded
if (!root.expanded) root.hovered = false
}
}
property real cpuVal: 0
property real memVal: 0
@@ -36,166 +47,162 @@ Rectangle {
running: true
repeat: true
triggeredOnStart: true
onTriggered: {
cpuProc.running = true
memProc.running = true
diskProc.running = true
}
onTriggered: { statsProc.running = true }
}
Process {
id: cpuProc
command: ["sh", "-c", "top -bn1 | awk '/^%Cpu/ {print 100-$8}'"]
id: statsProc
command: ["sh", "-c", "top -bn1 | awk '/^%Cpu/ {print 100-$8}'; free | awk '/Mem:/ {print ($2-$7)/$2 * 100}'; df / --output=pcent | tail -1 | tr -dc '0-9'"]
property string rawOutput: ""
stdout: SplitParser {
onRead: data => {
let val = parseFloat(data.trim())
root.cpuVal = isNaN(val) ? 0 : val
onRead: data => { statsProc.rawOutput += data + "\n" }
}
onRunningChanged: {
if (!statsProc.running && statsProc.rawOutput) {
const lines = statsProc.rawOutput.trim().split("\n")
if (lines.length >= 3) {
let v = parseFloat(lines[0]); root.cpuVal = isNaN(v) ? 0 : v
v = parseFloat(lines[1]); root.memVal = isNaN(v) ? 0 : v
v = parseFloat(lines[2]); root.diskVal = isNaN(v) ? 0 : v
}
statsProc.rawOutput = ""
}
}
}
Process {
id: memProc
command: ["sh", "-c", "free | awk '/Mem:/ {print ($2-$7)/$2 * 100}'"]
stdout: SplitParser {
onRead: data => {
let val = parseFloat(data.trim())
root.memVal = isNaN(val) ? 0 : val
}
}
}
Process {
id: diskProc
command: ["sh", "-c", "df / --output=pcent | tail -1 | tr -dc '0-9'"]
stdout: SplitParser {
onRead: data => {
let val = parseFloat(data.trim())
root.diskVal = isNaN(val) ? 0 : val
}
}
}
component StatRing: Item {
component StatRing: RowLayout {
id: ring
spacing: 5
property real value: 0.0
property string label: ""
property string icon: ""
property real iconXOff: 0
property color ringColor: Cfg.Config.theme.accent
property color trackColor: Cfg.Config.theme.statsTrackColor
property color labelColor: Cfg.Config.theme.textMain
Behavior on value {
NumberAnimation {
duration: 800
easing.type: Easing.OutCubic
}
NumberAnimation { duration: 800; easing.type: Easing.OutCubic }
}
readonly property real fraction: Math.max(0, Math.min(value, 100)) / 100
width: Cfg.Config.statsRingSize
height: Cfg.Config.statsRingSize
Text {
id: leftPct
text: Math.round(ring.value) + "%"
color: ring.ringColor
font.pixelSize: Cfg.Config.statsRingFontSize
font.bold: true
font.family: "monospace"
Layout.alignment: Qt.AlignVCenter
clip: true
onFractionChanged: arc.requestPaint()
onRingColorChanged: arc.requestPaint()
readonly property bool active: Cfg.Config.statsLabelPosition === "left" && (root.expanded || root.hovered)
opacity: active ? 1 : 0
Layout.preferredWidth: active ? implicitWidth : 0
Canvas {
id: arc
anchors.fill: parent
antialiasing: true
Behavior on opacity { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } }
Behavior on Layout.preferredWidth { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } }
}
onPaint: {
var ctx = getContext("2d")
ctx.reset()
Item {
id: ringCore
Layout.preferredWidth: Cfg.Config.statsRingSize
Layout.preferredHeight: Cfg.Config.statsRingSize
var cx = width / 2
var cy = height / 2
var lw = 2.8
var r = Math.min(cx, cy) - lw / 2 - 0.5
onVisibleChanged: if (visible) arc.requestPaint()
ctx.beginPath()
ctx.arc(cx, cy, r, 0, Math.PI * 2)
ctx.strokeStyle = ring.trackColor
ctx.lineWidth = lw
ctx.stroke()
Canvas {
id: arc
anchors.fill: parent
antialiasing: true
Connections {
target: ring
function onFractionChanged() { arc.requestPaint() }
function onRingColorChanged() { arc.requestPaint() }
}
onPaint: {
var ctx = getContext("2d")
ctx.reset()
var cx = width / 2
var cy = height / 2
var lw = 2.8
var r = Math.min(cx, cy) - lw / 2 - 0.5
if (ring.fraction > 0) {
var start = -Math.PI / 2
var end = start + (ring.fraction * Math.PI * 2)
ctx.beginPath()
ctx.arc(cx, cy, r, start, end)
ctx.strokeStyle = ring.ringColor
ctx.arc(cx, cy, r, 0, Math.PI * 2)
ctx.strokeStyle = ring.trackColor
ctx.lineWidth = lw
ctx.lineCap = "round"
ctx.stroke()
if (ring.fraction > 0) {
var start = -Math.PI / 2
var end = start + (ring.fraction * Math.PI * 2)
ctx.beginPath()
ctx.arc(cx, cy, r, start, end)
ctx.strokeStyle = ring.ringColor
ctx.lineWidth = lw
ctx.lineCap = "round"
ctx.stroke()
}
}
}
}
HoverHandler {
id: hov
onHoveredChanged: if (!hovered) ring.showAlt = false
}
property bool showAlt: false
onShowAltChanged: arc.requestPaint()
TapHandler {
enabled: !Cfg.Config.statsHideTextUntilHover || hov.hovered
onTapped: ring.showAlt = !ring.showAlt
Text {
anchors.centerIn: parent
anchors.horizontalCenterOffset: ring.iconXOff
text: ring.icon
color: ring.ringColor
font.pixelSize: Cfg.Config.statsIconSize
}
}
Text {
anchors.centerIn: parent
id: rightPct
text: Math.round(ring.value) + "%"
color: ring.ringColor
font.pixelSize: Cfg.Config.statsRingFontSize
font.bold: true
font.family: "monospace"
Layout.alignment: Qt.AlignVCenter
clip: true
text: {
const hide = Cfg.Config.statsHideTextUntilHover
const byDefault = Cfg.Config.statsShowPercentByDefault
if (hide && !hov.hovered) return ""
const showPct = ring.showAlt ? !byDefault : byDefault
return showPct ? Math.round(ring.value) + "%" : ring.label
}
readonly property bool active: Cfg.Config.statsLabelPosition === "right" && (root.expanded || root.hovered)
opacity: active ? 1 : 0
Layout.preferredWidth: active ? implicitWidth : 0
color: ring.labelColor
font.pixelSize: Cfg.Config.statsRingFontSize
font.bold: true
font.family: "monospace"
opacity: (Cfg.Config.statsHideTextUntilHover && !hov.hovered) ? 0 : 1
Behavior on opacity {
NumberAnimation { duration: 180; easing.type: Easing.OutCubic }
}
Behavior on opacity { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } }
Behavior on Layout.preferredWidth { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } }
}
}
RowLayout {
id: statsLayout
anchors.centerIn: parent
spacing: 10
spacing: 8
StatRing {
value: root.cpuVal
label: "cpu"
icon: "󰍛"
iconXOff: 0.3
ringColor: root.t.statsCpuColor
trackColor: root.t.statsTrackColor
labelColor: root.t.statsText
}
StatRing {
value: root.memVal
label: "ram"
icon: "󰑭"
ringColor: root.t.statsMemColor
trackColor: root.t.statsTrackColor
labelColor: root.t.statsText
}
StatRing {
value: root.diskVal
label: "disk"
icon: "󰒋"
ringColor: root.t.statsDiskColor
trackColor: root.t.statsTrackColor
labelColor: root.t.statsText
}
}
}

View File

@@ -13,9 +13,9 @@ Item {
property real panelRadius: Cfg.Config.radius / 2
property int borderWidth: Cfg.Config.panelBorderWidth
property bool isTop: true
property var targetScreen: null
property string barSide: "right"
property bool isTop: true
readonly property var t: Cfg.Config.theme
@@ -23,14 +23,24 @@ Item {
property bool manuallyExpanded: false
property var menuWindow: null
readonly property bool effectiveExpanded: expanded || trayMenuPopup.popupOpen
implicitWidth: bgRect.width
implicitHeight: bgRect.height
readonly property color tmBg: t.trayMenuBg
readonly property color tmBorder: t.trayMenuBorder
readonly property color tmText: t.trayMenuText
readonly property color tmDim: t.trayMenuDim
readonly property color tmHover: t.trayMenuHover
readonly property color tmCheck: t.trayMenuCheck
readonly property color tmSeparator: t.trayMenuSeparator
Rectangle {
id: bgRect
anchors.verticalCenter: parent.verticalCenter
height: Cfg.Config.trayHeight
height: parent.height
width: mainRow.width
radius: root.panelRadius
@@ -41,8 +51,8 @@ Item {
Behavior on color { ColorAnimation { duration: 150 } }
Behavior on border.color { ColorAnimation { duration: 150 } }
HoverHandler {
id: bgHover
HoverHandler {
id: bgHover
onHoveredChanged: {
if (!root.manuallyExpanded) {
root.expanded = hovered;
@@ -54,21 +64,21 @@ Item {
id: mainRow
anchors.verticalCenter: parent.verticalCenter
leftPadding: root.expanded && root.barSide === "right" ? 8 : 0
rightPadding: root.expanded && root.barSide === "left" ? 8 : 0
leftPadding: root.effectiveExpanded && root.barSide === "right" ? 8 : 0
rightPadding: root.effectiveExpanded && root.barSide === "left" ? 8 : 0
Behavior on leftPadding { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } }
Behavior on rightPadding { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } }
layoutDirection: root.barSide === "left" ? Qt.LeftToRight : Qt.RightToLeft
spacing: root.expanded ? 4 : 0
spacing: root.effectiveExpanded ? 4 : 0
Behavior on spacing { NumberAnimation { duration: 180; easing.type: Easing.OutCubic } }
Item {
id: toggleArea
width: Cfg.Config.trayHeight
height: Cfg.Config.trayHeight
width: Cfg.Config.trayToggleSize
height: Cfg.Config.trayToggleSize
z: 10
TapHandler {
@@ -80,11 +90,11 @@ Item {
Text {
anchors.centerIn: parent
text: root.expanded
text: root.effectiveExpanded
? (root.barSide === "left" ? "󰅁" : "󰅂")
: (root.barSide === "left" ? "󰅂" : "󰅁")
color: root.t.trayIcon
font.pixelSize: Cfg.Config.trayHeight * 0.55
font.pixelSize: Cfg.Config.trayToggleSize * 0.55
}
}
@@ -94,9 +104,9 @@ Item {
clip: true
anchors.verticalCenter: parent.verticalCenter
width: root.expanded ? implicitWidth : 0
opacity: root.expanded ? 1 : 0
width: root.effectiveExpanded ? implicitWidth : 0
opacity: root.effectiveExpanded ? 1 : 0
Behavior on width { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } }
Behavior on opacity { NumberAnimation { duration: 150 } }
@@ -122,7 +132,9 @@ Item {
} else if (mouse.button === Qt.MiddleButton) {
item.secondaryActivate()
} else if (mouse.button === Qt.RightButton) {
menuAnchor.open()
if (item.hasMenu) {
trayMenuPopup.open(item, iconDelegate)
}
}
}
@@ -135,22 +147,462 @@ Item {
anchors.fill: parent
source: item.icon
}
}
}
}
}
}
QsMenuAnchor {
id: menuAnchor
menu: item.menu
anchor.window: root.menuWindow
anchor.adjustment: PopupAdjustment.Flip
anchor.onAnchoring: {
if (!root.menuWindow) return
const global = iconDelegate.mapToGlobal(0, iconDelegate.height)
const local = root.menuWindow.contentItem.mapFromGlobal(
global.x, global.y
)
menuAnchor.anchor.rect = Qt.rect(
local.x, local.y,
iconDelegate.width, 0
)
PanelWindow {
id: trayMenuPopup
screen: root.targetScreen
visible: false
color: "transparent"
property bool popupOpen: false
property bool _pendingOpen: false
property var activeTrayItem: null
property var activeDelegate: null
function open(item, delegate) {
if (popupOpen) close()
hideTimer.stop()
_pendingOpen = false
activeTrayItem = item
activeDelegate = delegate
rootMenuOpener.menu = item.menu
visible = true
if (menuCol.height > 0) {
popupOpen = true
} else {
_pendingOpen = true
openFallbackTimer.restart()
}
}
function close() {
_pendingOpen = false
openFallbackTimer.stop()
popupOpen = false
hideTimer.restart()
}
Connections {
target: menuCol
function onHeightChanged() {
if (trayMenuPopup._pendingOpen && menuCol.height > 0) {
trayMenuPopup._pendingOpen = false
openFallbackTimer.stop()
trayMenuPopup.popupOpen = true
}
}
}
Timer {
id: openFallbackTimer
interval: 400
onTriggered: {
if (trayMenuPopup._pendingOpen) {
trayMenuPopup._pendingOpen = false
trayMenuPopup.popupOpen = true
}
}
}
Timer {
id: hideTimer
interval: Cfg.Config.popupAnimDuration + 70
onTriggered: {
trayMenuPopup.visible = false
rootMenuOpener.menu = null
trayMenuPopup.activeTrayItem = null
trayMenuPopup.activeDelegate = null
}
}
anchors { top: true; bottom: true; left: true; right: true }
WlrLayershell.layer: WlrLayer.Top
WlrLayershell.namespace: "main-shell-tray-menu"
WlrLayershell.exclusiveZone: -1
mask: popupOpen ? null : _trayMenuNoInput
Region { id: _trayMenuNoInput }
TapHandler { onTapped: trayMenuPopup.close() }
QsMenuOpener { id: rootMenuOpener }
Item {
id: menuCardWrapper
readonly property int cardW: 220
readonly property int pad: 10
x: {
if (!trayMenuPopup.activeDelegate)
return (parent.width - cardW) / 2
var gp = trayMenuPopup.activeDelegate.mapToGlobal(0, 0)
var cx = gp.x + trayMenuPopup.activeDelegate.width / 2
return Math.max(pad,
Math.min(cx - cardW / 2, parent.width - cardW - pad))
}
width: cardW
clip: true
anchors.top: root.isTop ? parent.top : undefined
anchors.bottom: root.isTop ? undefined : parent.bottom
anchors.topMargin: root.isTop ? (Cfg.Config.barHeight + 8) : 0
anchors.bottomMargin: root.isTop ? 0 : (Cfg.Config.barHeight + 8)
height: parent.height - Cfg.Config.barHeight - 8
Rectangle {
id: menuCard
width: parent.width
height: menuCol.height + 12
anchors.top: root.isTop ? parent.top : undefined
anchors.bottom: root.isTop ? undefined : parent.bottom
transform: Translate {
y: trayMenuPopup.popupOpen ? 0
: (root.isTop ? -menuCard.height : menuCard.height)
Behavior on y {
NumberAnimation {
duration: Cfg.Config.popupAnimDuration
easing.type: Easing.OutExpo
}
}
}
opacity: trayMenuPopup.popupOpen ? 1 : 0
Behavior on opacity { NumberAnimation { duration: 200 } }
color: root.tmBg
radius: Cfg.Config.popupRadius
border.color: root.tmBorder
border.width: Cfg.Config.popupBorderWidth
Column {
id: menuCol
anchors { left: parent.left; right: parent.right; top: parent.top }
anchors.margins: 6
spacing: 0
Repeater {
model: rootMenuOpener.children
delegate: Item {
id: menuDelegate
required property var modelData
property bool isSep: modelData.isSeparator
width: menuCol.width
height: isSep ? 5 : 32
Rectangle {
visible: isSep
anchors {
left: parent.left; right: parent.right
verticalCenter: parent.verticalCenter
}
anchors.leftMargin: 8
anchors.rightMargin: 8
height: 1
color: root.tmSeparator
}
Rectangle {
id: itemBg
visible: !isSep
anchors.fill: parent
anchors.margins: 2
radius: 10
property bool active: itemMouse.containsMouse
|| (submenuCard.visible
&& trayMenuPopup._submenuParentRef === menuDelegate)
color: active ? root.tmHover : "transparent"
Behavior on color { ColorAnimation { duration: 120 } }
RowLayout {
anchors.fill: parent
anchors.leftMargin: 8
anchors.rightMargin: 8
spacing: 8
Item {
Layout.preferredWidth: 16
Layout.preferredHeight: 16
visible: !isSep
Text {
anchors.centerIn: parent
visible: modelData.buttonType === QsMenuButtonType.CheckBox
&& modelData.checkState === Qt.Checked
text: "✓"
color: root.tmCheck
font.pixelSize: 14
}
Text {
anchors.centerIn: parent
visible: modelData.buttonType === QsMenuButtonType.RadioButton
&& modelData.checkState === Qt.Checked
text: "●"
color: root.tmCheck
font.pixelSize: 9
}
Text {
anchors.centerIn: parent
visible: modelData.buttonType === QsMenuButtonType.RadioButton
&& modelData.checkState !== Qt.Checked
text: "○"
color: root.tmDim
font.pixelSize: 11
}
}
Image {
visible: !isSep && modelData.icon !== ""
source: modelData.icon
width: 16; height: 16
sourceSize: Qt.size(16, 16)
fillMode: Image.PreserveAspectFit
}
Text {
text: modelData.text
color: modelData.enabled ? root.tmText : root.tmDim
font.pixelSize: 13
Layout.fillWidth: true
elide: Text.ElideRight
}
Text {
visible: !isSep && modelData.hasChildren
text: "▶"
color: root.tmDim
font.pixelSize: 9
}
}
MouseArea {
id: itemMouse
anchors.fill: parent
hoverEnabled: true
enabled: !isSep && modelData.enabled
onClicked: {
if (modelData.hasChildren) {
closeSubmenuTimer.stop()
submenuDelayTimer.itemRef = menuDelegate
submenuDelayTimer.restart()
} else {
modelData.triggered()
trayMenuPopup.close()
}
}
onEntered: {
if (modelData.hasChildren) {
closeSubmenuTimer.stop()
submenuDelayTimer.itemRef = menuDelegate
submenuDelayTimer.restart()
} else {
closeSubmenuTimer.stop()
submenuCard.visible = false
}
}
onExited: {
if (modelData.hasChildren)
closeSubmenuTimer.restart()
}
}
}
}
}
}
}
}
property var _submenuParentRef: null
QsMenuOpener { id: subMenuOpener }
Timer {
id: submenuDelayTimer
interval: 250
property var itemRef: null
onTriggered: {
if (!itemRef) return
var entry = itemRef.modelData
if (!entry || !entry.hasChildren) return
subMenuOpener.menu = entry
trayMenuPopup._submenuParentRef = itemRef
submenuCard.visible = true
}
}
Timer {
id: closeSubmenuTimer
interval: 300
onTriggered: {
if (!submenuCard.containsMouse) {
submenuCard.visible = false
subMenuOpener.menu = null
trayMenuPopup._submenuParentRef = null
}
}
}
Rectangle {
id: submenuCard
visible: false
property bool containsMouse: false
property int subW: Math.max(submenuCol.width, 180)
x: {
if (!trayMenuPopup._submenuParentRef) return 0
var pItem = trayMenuPopup._submenuParentRef
var gp = pItem.mapToGlobal(0, 0)
var lp = trayMenuPopup.contentItem.mapFromGlobal(gp.x, gp.y)
var fromLeft = lp.x + pItem.width + 4
if (fromLeft + subW + 10 > trayMenuPopup.contentItem.width)
return Math.max(2, lp.x - subW - 4)
return fromLeft
}
y: {
if (!trayMenuPopup._submenuParentRef) return 0
var pItem = trayMenuPopup._submenuParentRef
var gp = pItem.mapToGlobal(0, 0)
var lp = trayMenuPopup.contentItem.mapFromGlobal(gp.x, gp.y)
return Math.max(2, lp.y - 2)
}
width: subW
height: submenuCol.height + 12
color: root.tmBg
radius: Cfg.Config.popupRadius
border.color: root.tmBorder
border.width: Cfg.Config.popupBorderWidth
HoverHandler {
onHoveredChanged: {
submenuCard.containsMouse = hovered
if (!hovered)
closeSubmenuTimer.restart()
}
}
Column {
id: submenuCol
anchors { left: parent.left; right: parent.right; top: parent.top }
anchors.margins: 6
spacing: 0
Repeater {
model: subMenuOpener.children
delegate: Item {
required property var modelData
property bool isSep: modelData.isSeparator
width: submenuCol.width
height: isSep ? 5 : 32
Rectangle {
visible: isSep
anchors {
left: parent.left; right: parent.right
verticalCenter: parent.verticalCenter
}
anchors.leftMargin: 8; anchors.rightMargin: 8
height: 1
color: root.tmSeparator
}
Rectangle {
id: subBg
visible: !isSep
anchors.fill: parent
anchors.margins: 2
radius: 10
color: subMouse.containsMouse ? root.tmHover : "transparent"
Behavior on color { ColorAnimation { duration: 120 } }
RowLayout {
anchors.fill: parent
anchors.leftMargin: 8; anchors.rightMargin: 8
spacing: 8
Item {
Layout.preferredWidth: 16
Layout.preferredHeight: 16
visible: !isSep
Text {
anchors.centerIn: parent
visible: modelData.buttonType === QsMenuButtonType.CheckBox
&& modelData.checkState === Qt.Checked
text: "✓"; color: root.tmCheck
font.pixelSize: 14
}
Text {
anchors.centerIn: parent
visible: modelData.buttonType === QsMenuButtonType.RadioButton
&& modelData.checkState === Qt.Checked
text: "●"; color: root.tmCheck
font.pixelSize: 9
}
Text {
anchors.centerIn: parent
visible: modelData.buttonType === QsMenuButtonType.RadioButton
&& modelData.checkState !== Qt.Checked
text: "○"; color: root.tmDim
font.pixelSize: 11
}
}
Image {
visible: !isSep && modelData.icon !== ""
source: modelData.icon
width: 16; height: 16
sourceSize: Qt.size(16, 16)
fillMode: Image.PreserveAspectFit
}
Text {
text: modelData.text
color: modelData.enabled ? root.tmText : root.tmDim
font.pixelSize: 13
Layout.fillWidth: true
elide: Text.ElideRight
}
}
MouseArea {
id: subMouse
anchors.fill: parent
hoverEnabled: true
enabled: !isSep && modelData.enabled
onClicked: {
modelData.triggered()
trayMenuPopup.close()
}
}
}
}

View File

@@ -22,6 +22,42 @@ Rectangle {
property int outputMaxVolume: Cfg.Config.volumeOutputMax
property int inputMaxVolume: Cfg.Config.volumeInputMax
// Path to config.qml — using HOME to avoid Qt.resolvedUrl ambiguity
readonly property string configPath:
Quickshell.env("HOME") + "/.config/quickshell/config/config.qml"
// Process that patches volumeOutputMax / volumeInputMax in config.qml
Process {
id: volConfigWriter
running: false
onExited: (code) => {
if (code !== 0)
console.warn("[Volume] Failed to patch config.qml (exit " + code + ")")
}
}
// Debounce: write to disk 800 ms after the last limit change
Timer {
id: saveDebounce
interval: 800
repeat: false
onTriggered: {
const outMax = Math.round(root.outputMaxVolume).toString()
const inMax = Math.round(root.inputMaxVolume).toString()
const cfgPath = root.configPath
const sh =
"sed -i" +
" -e 's/\\(property int[ ]\\+volumeOutputMax:[ ]\\+\\)[0-9.]\\+/\\1" + outMax + "/'" +
" -e 's/\\(property int[ ]\\+volumeInputMax:[ ]\\+\\)[0-9.]\\+/\\1" + inMax + "/'" +
" " + JSON.stringify(cfgPath)
volConfigWriter.command = ["/bin/sh", "-c", sh]
volConfigWriter.running = true
}
}
onOutputMaxVolumeChanged: { if (root.outputMaxVolume >= 10) saveDebounce.restart() }
onInputMaxVolumeChanged: { if (root.inputMaxVolume >= 10) saveDebounce.restart() }
readonly property var sink: Pipewire.defaultAudioSink
readonly property var source: Pipewire.defaultAudioSource

View File

@@ -6,12 +6,13 @@ import "themes"
QtObject {
id: root
readonly property var theme: Goldencity
readonly property var theme: Tropicalnight
// ────────────────────────────────────────────────────────────────────────
// Widgets
// ────────────────────────────────────────────────────────────────────────
property bool enableBgDate: true
property bool enableBgDate: true
property bool enablePolkit: true
// ────────────────────────────────────────────────────────────────────────
// BAR
@@ -20,62 +21,64 @@ QtObject {
// ── Position & Dimensions ─────────────────────────────────────────────────
property string barPosition: "bottom"
property int barHeight: 35
property int margin: 15
property int margin: 20
property int radius: 26
// ── Module Lists ──────────────────────────────────────────────────────────
property var leftModules: ["ArchLogo", "Stats"]
property var leftModules: ["Logo", "Stats", "Crypto"]
property var centerModules: ["Workspace"]
property var rightModules: ["Tray", "Notifications", "Volume", "Clock"]
property var rightModules: ["Tray", "Notifications", "Volume", "Network", "Battery" ,"Clock"]
// ── Arch Logo ─────────────────────────────────────────────────────────────
// ── Logo ─────────────────────────────────────────────────────────────
property int logoIconSize: 23 // icon font size; container width scales with it
property string logoIcon: "󱄅" // Nerd Font glyph for the logo
// ── Panel Styling ─────────────────────────────────────────────────────────
property int panelBorderWidth: 1
property int moduleSpacing: 2 // space between modules within a panel
property int moduleSpacing: 5 // space between modules within a panel
property int panelSpacing: 12 // gap between left / center / right panels
property int moduleHeight: 32 // default chip height for bar modules
property int moduleHeight: 23 // default chip height for bar modules
// ── Popup Styling ─────────────────────────────────────────────────────────
property int popupRadius: 18
property int popupBorderWidth: 1
property int popupAnimDuration: 500
// ── Timezone (IANA name, e.g. "America/New_York", "Europe/London")g ──────────
// Leave empty to use the system timezone.
property string timezone: "America/New_York"
// ── Clock Popup ───────────────────────────────────────────────────────────
// Date format shown in the clock popup.
// "MDY" → month/day/year (e.g. 4/28/2026)
// "DMY" → day/month/year (e.g. 28/4/2026)
property string clockDateFormat: "DMY"
// Date format used in the clock popup and background date widget.
// "MDY" → month/day/year (e.g. May 14, 2026)
// "DMY" → day/month/year (e.g. 14 May 2026)
property string dateFormat: "DMY"
// ── Tray Styling ─────────────────────────────────────────────────────────
property int trayHeight: 26
property int trayIconSize: 20
property int trayToggleSize: 23 // size of the expand/collapse arrow button
property int trayIconSize: 20 // size of each system tray item icon
// ── Stats Styling ─────────────────────────────────────────────────────────
property int statsRingSize: 23
property int statsRingFontSize: 10
// If true, the % value is shown by default; hovering shows the label, clicking swaps back.
// If false, the label is shown by default; hovering shows the %, clicking swaps back.
property bool statsShowPercentByDefault: true
// If true, text is hidden completely until you hover a ring.
// • Hover → shows the "default" value (% when statsShowPercentByDefault, label otherwise)
// • Click → swaps to the "other" value (label / %)
property bool statsHideTextUntilHover: false
property int statsRingSize: 22
property int statsRingFontSize: 12
property int statsIconSize: 10
// Where the percentage label appears when stats are expanded.
// "right" → label to the right of the ring; "left" → label to the left.
property string statsLabelPosition: "right"
// If true, percentage labels are visible on startup without clicking.
property bool statsStartExpanded: false
// ── Volume Module ─────────────────────────────────────────────────────────
property int volumeIconSize: 20
property int volumeSliderHeight: 2
property int volumeHandleSize: 20
property int volumePopupWidth: 280
property int volumeOutputMax: 100
property int volumeOutputMax: 170
property int volumeInputMax: 200
// ────────────────────────────────────────────────────────────────────────
// FRAME
// ────────────────────────────────────────────────────────────────────────
property int frameBorderWidth: 2
property int frameBorderWidth: 3
// ────────────────────────────────────────────────────────────────────────
// NOTIFICATIONS
@@ -100,4 +103,45 @@ QtObject {
property bool launcherCloseOnClickOutside: true
property bool launcherSelectFirst: false
property bool launcherMipmapIcons: false
// ────────────────────────────────────────────────────────────────────────
// CRYPTO
// ────────────────────────────────────────────────────────────────────────
// ── Coin/currency pairs to cycle ──────────────────────────────────────────
// Each entry is a { coin, currency } object. The bar chip rotates to the
// next pair after each successful CoinGecko fetch.
//
// coin CoinGecko coin ID (find them at https://api.coingecko.com/api/v3/coins/list)
// currency any quote currency CoinGecko supports: "usd", "eur", "brl", "btc", …
//
// Single pair → [{ coin: "bitcoin", currency: "usd" }]
// Three pairs → [{ coin: "bitcoin", currency: "usd" },
// { coin: "monero", currency: "usd" },
// { coin: "solana", currency: "brl" }]
//
// This list is the *default*; pairs can be added/removed live in the
// Settings popup and those changes are persisted across restarts.
property var cryptoPairs: [{ coin: "bitcoin", currency: "usd" }, { coin: "ethereum", currency: "eur" }, { coin: "monero", currency: "usd" }, { coin: "solana", currency: "brl" }]
// Legacy fallbacks used by Crypto.qml when cryptoPairs is absent.
// You can leave these as-is; they are derived from the first pair above.
property string cryptoCoinId: cryptoPairs[0].coin ?? "bitcoin"
property string cryptoVsCurrency: cryptoPairs[0].currency ?? "usd"
// ── Compact label decimals ────────────────────────────────────────────────
// 0 → "80k"
// 1 → "80.0k" (default)
// 3 → "80.000k"
property int cryptoDecimals: 2
// ── Poll interval ─────────────────────────────────────────────────────────
// Seconds between CoinGecko requests. Free tier allows ~30 req/min.
// With multiple pairs each refresh fetches one pair then advances the index,
// so the effective per-pair interval is: cryptoRefreshSec × cryptoPairs.length
property int cryptoRefreshSec: 120
// ── Bar chip icon ─────────────────────────────────────────────────────────
// Show the coin icon glyph ("󰿤") on the bar chip.
property bool cryptoShowIcon: true
}

View File

@@ -29,13 +29,12 @@ QtObject {
readonly property color borderToday: accent
// ── ArchLogo Module ────────────────────────────────────────────────────────
readonly property color archLogoBg: bgPanel
readonly property color archLogoBgHover: "#22ffffff"
readonly property color archLogoHover: accent
readonly property color archLogoBorder: border
readonly property color archLogoBorderActive: accent
readonly property color archLogoIcon: textMain
readonly property color archLogoIconActive: accent
readonly property color logoBg: bgPanel
readonly property color logoBgHover: "#22ffffff"
readonly property color logoBorder: border
readonly property color logoBorderActive: accent
readonly property color logoIcon: textMain
readonly property color logoIconActive: accent
// ── Stats Module (Aurora Tones) ───────────────────────────────────────────
readonly property color statsBg: bgPanel
@@ -45,7 +44,6 @@ QtObject {
readonly property color statsCpuColor: "#cbdc3d" // Lime green
readonly property color statsMemColor: "#4db6ac" // Teal
readonly property color statsDiskColor: "#81d4fa" // Sky blue
readonly property color statsGpuColor: "#fff176" // Sun yellow
readonly property color statsTrackColor: "#15ffffff"
// ── Volume Module (Glass Water) ───────────────────────────────────────────
@@ -71,15 +69,55 @@ QtObject {
readonly property color clockTime: textMain
readonly property color clockSeconds: "#fff176" // Sun yellow
readonly property color clockIcon: accent
readonly property color clockSeparator: separator
readonly property color clockText: textMain
readonly property color clockShadow: "#44000000"
// ── Battery Module ────────────────────────────────────────────────────────
readonly property color batteryFull: accent
readonly property color batteryCharging: accent
readonly property color batteryCritical: statusErr
readonly property color batteryLow: statusWarn
readonly property color batteryIcon: clockIcon
readonly property color batBg: bgPanel
readonly property color batBgHover: "#11ffffff"
readonly property color batBorder: border
readonly property color batBorderHover: accent
readonly property color batText: textMain
readonly property color batPopupBg: bgPopup
readonly property color batPopupBorder: borderPopup
readonly property color batPopupSeparator: separator
readonly property color batPopupHeader: "#cbdc3d"
readonly property color batPopupText: textMain
readonly property color batPopupDim: textDim
readonly property color batProgressTrack: separator
readonly property color batProfileActiveText: bg
// ── Network Module ────────────────────────────────────────────────────────
readonly property color netBg: bgPanel
readonly property color netBgHover: "#11ffffff"
readonly property color netBorder: border
readonly property color netBorderHover: accent
readonly property color netText: textMain
readonly property color netPopupBg: bgPopup
readonly property color netPopupBorder: borderPopup
readonly property color netPopupSeparator: separator
readonly property color netPopupHeader: "#cbdc3d"
readonly property color netPopupText: textMain
readonly property color netPopupDim: textDim
readonly property color netFieldBg: "#22ffffff"
readonly property color netCancelBgHover: "#22ffffff"
readonly property color netConnectText: "#ff0b3333"
readonly property color netApActiveBg: Qt.alpha(accent, 0.15)
readonly property color netApHoverBg: calArrowBgHover
readonly property color netDisconnectBg: Qt.alpha(statusErr, 0.18)
readonly property color netDisconnectBorder: Qt.alpha(statusErr, 0.45)
readonly property color netWiredOkBg: Qt.alpha(statusOk, 0.12)
readonly property color netWiredErrBg: Qt.alpha(statusErr, 0.12)
readonly property color netWiredOkBorder: Qt.alpha(statusOk, 0.4)
readonly property color netWiredErrBorder: Qt.alpha(statusErr, 0.4)
// ── Calendar Popup ─────────────────────────────────────────────────────────
readonly property color calCardBg: bgPopup
readonly property color calCardBorder: borderPopup
readonly property color calSeparator: separator
readonly property color calShadow: "#66000000"
readonly property color clockPopupHeader: "#cbdc3d"
readonly property color clockPopupText: textMain
readonly property color clockPopupDim: textDim
@@ -137,7 +175,6 @@ QtObject {
readonly property color notifToastBg: bgPopup
readonly property color notifToastBgHover: "#22ffffff"
readonly property color notifToastBorder: borderPopup
readonly property color notifToastShadow: "#44000000"
readonly property color notifToastText: textMain
readonly property color notifToastDim: textDim
readonly property color notifToastAppName: "#ff81d4fa"
@@ -154,11 +191,10 @@ QtObject {
// ── History popup ──────────────────────────────────────────────────────────
readonly property color notifHistoryBg: bgPopup
readonly property color notifHistoryBorder: "#33cbdc3d"
readonly property color notifHistoryShadow: "#55000000"
readonly property color notifHistoryHover: "#11cbdc3d"
readonly property color notifHistoryEmpty: textDim
// new variables adaptated
// new variables adapted
readonly property color frameBorder: "transparent"
readonly property color clockPopupDate: textMain
readonly property color clockPopupUtc: textDim
@@ -168,8 +204,96 @@ QtObject {
readonly property color calArrowBgHover: "#22cbdc3d"
readonly property color calArrowBgPress: accent
// ── Crypto Module ──────────────────────────────────────────────────────────
readonly property color cryptoBg: bgPanel
readonly property color cryptoBgHover: "#15ffffff"
readonly property color cryptoBorder: border
readonly property color cryptoBorderHover: accent
readonly property color cryptoIcon: accent
readonly property color cryptoLabel: textDim
readonly property color cryptoValue: textMain
readonly property color cryptoUp: statusOk
readonly property color cryptoDown: statusErr
readonly property color cryptoPopupBg: bgPopup
readonly property color cryptoPopupBorder: borderPopup
readonly property color cryptoPopupHeader: accent
readonly property color cryptoPopupText: textMain
readonly property color cryptoPopupDim: textDim
// Tinted surfaces (derived from main colours)
readonly property color cryptoUpBg: Qt.rgba(cryptoUp.r, cryptoUp.g, cryptoUp.b, 0.13)
readonly property color cryptoDownBg: Qt.rgba(cryptoDown.r, cryptoDown.g, cryptoDown.b, 0.13)
readonly property color cryptoChipRemoveBg: Qt.rgba(cryptoDown.r, cryptoDown.g, cryptoDown.b, 0.27)
readonly property color cryptoApplyIdleBg: Qt.rgba(accent.r, accent.g, accent.b, 0.20)
// ── BgDate Module ──────────────────────────────────────────────────────────
readonly property color bgDateText: textMain
readonly property color bgDateShadow: "#66000000"
readonly property color bgDateSecondsText: textMain
// ── Polkit Dialog ──────────────────────────────────────────────────────────
// Overlay
readonly property color polkitOverlayBg: "#bb000000"
// Card chrome
readonly property color polkitCardBg: bgPopup
readonly property color polkitCardBorder: Qt.rgba(accent.r, accent.g, accent.b, 0.16)
// Lock icon
readonly property color polkitIconBg: Qt.rgba(accent.r, accent.g, accent.b, 0.12)
readonly property color polkitIconBorder: Qt.rgba(accent.r, accent.g, accent.b, 0.27)
readonly property color polkitIconColor: accent
// Text hierarchy
readonly property color polkitTitle: textMain
readonly property color polkitMessage: textMain
// Action-ID pill
readonly property color polkitPillBg: Qt.rgba(textDim.r, textDim.g, textDim.b, 0.10)
readonly property color polkitPillText: textDim
// Divider
readonly property color polkitDivider: separator
// Supplementary message — error state
readonly property color polkitSuppErrBg: Qt.rgba(statusErr.r, statusErr.g, statusErr.b, 0.10)
readonly property color polkitSuppErrBorder: Qt.rgba(statusErr.r, statusErr.g, statusErr.b, 0.27)
readonly property color polkitSuppErrText: statusErr
// Supplementary message — info / ok state
readonly property color polkitSuppOkBg: Qt.rgba(statusOk.r, statusOk.g, statusOk.b, 0.10)
readonly property color polkitSuppOkBorder: Qt.rgba(statusOk.r, statusOk.g, statusOk.b, 0.27)
readonly property color polkitSuppOkText: statusOk
// Fields (password input & identity selector)
readonly property color polkitFieldBg: launcherInput
readonly property color polkitFieldBorder: "#22ffffff"
readonly property color polkitFieldBorderFocus: accent
// Identity selector text
readonly property color polkitUserLabel: textDim
readonly property color polkitUserValue: accent
// Input prompt label above password field
readonly property color polkitInputPrompt: textDim
// TextInput inside password field
readonly property color polkitInputText: textMain
readonly property color polkitInputSelection: Qt.rgba(accent.r, accent.g, accent.b, 0.33)
readonly property color polkitInputSelectedText: bg
// Eye / show-password toggle
readonly property color polkitEyeIcon: textDim
readonly property color polkitEyeIconHover: accent
// Authenticate button
readonly property color polkitAuthBg: accent
readonly property color polkitAuthBgHover: Qt.lighter(accent, 1.15)
readonly property color polkitAuthText: bg
// Cancel button
readonly property color polkitCancelBg: "transparent"
readonly property color polkitCancelBgHover: "#22ffffff"
readonly property color polkitCancelBorder: "#22ffffff"
readonly property color polkitCancelText: textDim
}

View File

@@ -29,13 +29,12 @@ QtObject {
readonly property color borderToday: accent
// ── ArchLogo Module ────────────────────────────────────────────────────────
readonly property color archLogoBg: bgPanel
readonly property color archLogoBgHover: "#22ffffff"
readonly property color archLogoHover: accent
readonly property color archLogoBorder: border
readonly property color archLogoBorderActive: accent
readonly property color archLogoIcon: textMain
readonly property color archLogoIconActive: accent
readonly property color logoBg: bgPanel
readonly property color logoBgHover: "#22ffffff"
readonly property color logoBorder: border
readonly property color logoBorderActive: accent
readonly property color logoIcon: textMain
readonly property color logoIconActive: accent
// ── Stats Module (Variation: Cosmic Cyan) ──────────────────────────────────
readonly property color statsBg: bgPanel
@@ -45,7 +44,6 @@ QtObject {
readonly property color statsCpuColor: "#ff00f2ff"
readonly property color statsMemColor: "#ffbc7fff" // Trail violet
readonly property color statsDiskColor: "#ff7fbaff" // Sky blue
readonly property color statsGpuColor: "#ff3df5ff" // Bright teal
readonly property color statsTrackColor: "#15ffffff"
// ── Volume Module (Variation: Comet Purple) ────────────────────────────────
@@ -71,15 +69,55 @@ QtObject {
readonly property color clockTime: textMain
readonly property color clockSeconds: "#ffbc7fff" // Purple seconds
readonly property color clockIcon: accent
readonly property color clockSeparator: separator
readonly property color clockText: textMain
readonly property color clockShadow: "#66000000"
// ── Battery Module ────────────────────────────────────────────────────────
readonly property color batteryFull: accent
readonly property color batteryCharging: accent
readonly property color batteryCritical: statusErr
readonly property color batteryLow: statusWarn
readonly property color batteryIcon: clockIcon
readonly property color batBg: bgPanel
readonly property color batBgHover: "#11ffffff"
readonly property color batBorder: border
readonly property color batBorderHover: accent
readonly property color batText: textMain
readonly property color batPopupBg: bgPopup
readonly property color batPopupBorder: borderPopup
readonly property color batPopupSeparator: separator
readonly property color batPopupHeader: "#ff82e6ff"
readonly property color batPopupText: textMain
readonly property color batPopupDim: textDim
readonly property color batProgressTrack: separator
readonly property color batProfileActiveText: bg
// ── Network Module ────────────────────────────────────────────────────────
readonly property color netBg: bgPanel
readonly property color netBgHover: "#11ffffff"
readonly property color netBorder: border
readonly property color netBorderHover: accent
readonly property color netText: textMain
readonly property color netPopupBg: bgPopup
readonly property color netPopupBorder: borderPopup
readonly property color netPopupSeparator: separator
readonly property color netPopupHeader: "#ff82e6ff"
readonly property color netPopupText: textMain
readonly property color netPopupDim: textDim
readonly property color netFieldBg: "#22ffffff"
readonly property color netCancelBgHover: "#22ffffff"
readonly property color netConnectText: "#ff050a14"
readonly property color netApActiveBg: Qt.alpha(accent, 0.15)
readonly property color netApHoverBg: calArrowBgHover
readonly property color netDisconnectBg: Qt.alpha(statusErr, 0.18)
readonly property color netDisconnectBorder: Qt.alpha(statusErr, 0.45)
readonly property color netWiredOkBg: Qt.alpha(statusOk, 0.12)
readonly property color netWiredErrBg: Qt.alpha(statusErr, 0.12)
readonly property color netWiredOkBorder: Qt.alpha(statusOk, 0.4)
readonly property color netWiredErrBorder: Qt.alpha(statusErr, 0.4)
// ── Calendar Popup ─────────────────────────────────────────────────────────
readonly property color calCardBg: bgPopup
readonly property color calCardBorder: borderPopup
readonly property color calSeparator: separator
readonly property color calShadow: "#88000000"
readonly property color clockPopupHeader: "#ff82e6ff"
readonly property color clockPopupText: textMain
readonly property color clockPopupDim: textDim
@@ -131,14 +169,12 @@ QtObject {
readonly property color notifBadgeBg: statusErr
readonly property color notifBadgeText: "#ffffffff"
readonly property color notifSeparator: separator
readonly property color notifDnd: separator
readonly property color notifDnd: separator
// ── Toast cards (Variation: Nebula) ────────────────────────────────────────
readonly property color notifToastBg: bgPopup
readonly property color notifToastBgHover: "#22ffffff"
readonly property color notifToastBorder: borderPopup
readonly property color notifToastShadow: "#44000000"
readonly property color notifToastText: textMain
readonly property color notifToastDim: textDim
readonly property color notifToastAppName: "#ffbc7fff"
@@ -155,11 +191,10 @@ QtObject {
// ── History popup ──────────────────────────────────────────────────────────
readonly property color notifHistoryBg: bgPopup
readonly property color notifHistoryBorder: "#3300d9ff"
readonly property color notifHistoryShadow: "#55000000"
readonly property color notifHistoryHover: "#1100d9ff"
readonly property color notifHistoryEmpty: textDim
// new variables adaptated
// new variables adapted
readonly property color frameBorder: "transparent"
readonly property color clockPopupDate: textMain
readonly property color clockPopupUtc: textDim
@@ -169,8 +204,96 @@ QtObject {
readonly property color calArrowBgHover: "#2200d9ff"
readonly property color calArrowBgPress: accent
// ── Crypto Module ──────────────────────────────────────────────────────────
readonly property color cryptoBg: bgPanel
readonly property color cryptoBgHover: "#15ffffff"
readonly property color cryptoBorder: border
readonly property color cryptoBorderHover: accent
readonly property color cryptoIcon: accent
readonly property color cryptoLabel: textDim
readonly property color cryptoValue: textMain
readonly property color cryptoUp: statusOk
readonly property color cryptoDown: statusErr
readonly property color cryptoPopupBg: bgPopup
readonly property color cryptoPopupBorder: borderPopup
readonly property color cryptoPopupHeader: accent
readonly property color cryptoPopupText: textMain
readonly property color cryptoPopupDim: textDim
// Tinted surfaces (derived from main colours)
readonly property color cryptoUpBg: Qt.rgba(cryptoUp.r, cryptoUp.g, cryptoUp.b, 0.13)
readonly property color cryptoDownBg: Qt.rgba(cryptoDown.r, cryptoDown.g, cryptoDown.b, 0.13)
readonly property color cryptoChipRemoveBg: Qt.rgba(cryptoDown.r, cryptoDown.g, cryptoDown.b, 0.27)
readonly property color cryptoApplyIdleBg: Qt.rgba(accent.r, accent.g, accent.b, 0.20)
// ── BgDate Module ──────────────────────────────────────────────────────────
readonly property color bgDateText: textMain
readonly property color bgDateShadow: "#88000000"
readonly property color bgDateSecondsText: textMain
// ── Polkit Dialog ──────────────────────────────────────────────────────────
// Overlay
readonly property color polkitOverlayBg: "#bb000000"
// Card chrome
readonly property color polkitCardBg: bgPopup
readonly property color polkitCardBorder: Qt.rgba(accent.r, accent.g, accent.b, 0.16)
// Lock icon
readonly property color polkitIconBg: Qt.rgba(accent.r, accent.g, accent.b, 0.12)
readonly property color polkitIconBorder: Qt.rgba(accent.r, accent.g, accent.b, 0.27)
readonly property color polkitIconColor: accent
// Text hierarchy
readonly property color polkitTitle: textMain
readonly property color polkitMessage: textMain
// Action-ID pill
readonly property color polkitPillBg: Qt.rgba(textDim.r, textDim.g, textDim.b, 0.10)
readonly property color polkitPillText: textDim
// Divider
readonly property color polkitDivider: separator
// Supplementary message — error state
readonly property color polkitSuppErrBg: Qt.rgba(statusErr.r, statusErr.g, statusErr.b, 0.10)
readonly property color polkitSuppErrBorder: Qt.rgba(statusErr.r, statusErr.g, statusErr.b, 0.27)
readonly property color polkitSuppErrText: statusErr
// Supplementary message — info / ok state
readonly property color polkitSuppOkBg: Qt.rgba(statusOk.r, statusOk.g, statusOk.b, 0.10)
readonly property color polkitSuppOkBorder: Qt.rgba(statusOk.r, statusOk.g, statusOk.b, 0.27)
readonly property color polkitSuppOkText: statusOk
// Fields (password input & identity selector)
readonly property color polkitFieldBg: launcherInput
readonly property color polkitFieldBorder: "#22ffffff"
readonly property color polkitFieldBorderFocus: accent
// Identity selector text
readonly property color polkitUserLabel: textDim
readonly property color polkitUserValue: accent
// Input prompt label above password field
readonly property color polkitInputPrompt: textDim
// TextInput inside password field
readonly property color polkitInputText: textMain
readonly property color polkitInputSelection: Qt.rgba(accent.r, accent.g, accent.b, 0.33)
readonly property color polkitInputSelectedText: bg
// Eye / show-password toggle
readonly property color polkitEyeIcon: textDim
readonly property color polkitEyeIconHover: accent
// Authenticate button
readonly property color polkitAuthBg: accent
readonly property color polkitAuthBgHover: Qt.lighter(accent, 1.15)
readonly property color polkitAuthText: bg
// Cancel button
readonly property color polkitCancelBg: "transparent"
readonly property color polkitCancelBgHover: "#22ffffff"
readonly property color polkitCancelBorder: "#22ffffff"
readonly property color polkitCancelText: textDim
}

View File

@@ -29,13 +29,12 @@ QtObject {
readonly property color borderToday: accent
// ── ArchLogo Module ────────────────────────────────────────────────────────
readonly property color archLogoBg: bgPanel
readonly property color archLogoBgHover: "#22ffffff"
readonly property color archLogoHover: accent
readonly property color archLogoBorder: border
readonly property color archLogoBorderActive: accent
readonly property color archLogoIcon: textMain
readonly property color archLogoIconActive: accent
readonly property color logoBg: bgPanel
readonly property color logoBgHover: "#22ffffff"
readonly property color logoBorder: border
readonly property color logoBorderActive: accent
readonly property color logoIcon: textMain
readonly property color logoIconActive: accent
// ── Stats Module (Variation: Shoreline Tones) ──────────────────────────────
readonly property color statsBg: bgPanel
@@ -45,7 +44,6 @@ QtObject {
readonly property color statsCpuColor: "#ffebc6a0" // Sunset gold
readonly property color statsMemColor: "#ff8fa3b0" // Ocean mist
readonly property color statsDiskColor: "#ffc2d1d9" // Bright sky blue
readonly property color statsGpuColor: "#ffd9a385" // Sand tan
readonly property color statsTrackColor: "#15ffffff"
// ── Volume Module (Variation: Deep Water) ──────────────────────────────────
@@ -71,15 +69,55 @@ QtObject {
readonly property color clockTime: textMain
readonly property color clockSeconds: "#ffd9a385" // Sun-glow orange
readonly property color clockIcon: accent
readonly property color clockSeparator: separator
readonly property color clockText: textMain
readonly property color clockShadow: "#44000000"
// ── Battery Module ────────────────────────────────────────────────────────
readonly property color batteryFull: accent
readonly property color batteryCharging: accent
readonly property color batteryCritical: statusErr
readonly property color batteryLow: statusWarn
readonly property color batteryIcon: clockIcon
readonly property color batBg: bgPanel
readonly property color batBgHover: "#11ffffff"
readonly property color batBorder: border
readonly property color batBorderHover: accent
readonly property color batText: textMain
readonly property color batPopupBg: bgPopup
readonly property color batPopupBorder: borderPopup
readonly property color batPopupSeparator: separator
readonly property color batPopupHeader: "#ffebc6a0"
readonly property color batPopupText: textMain
readonly property color batPopupDim: textDim
readonly property color batProgressTrack: separator
readonly property color batProfileActiveText: bg
// ── Network Module ────────────────────────────────────────────────────────
readonly property color netBg: bgPanel
readonly property color netBgHover: "#11ffffff"
readonly property color netBorder: border
readonly property color netBorderHover: accent
readonly property color netText: textMain
readonly property color netPopupBg: bgPopup
readonly property color netPopupBorder: borderPopup
readonly property color netPopupSeparator: separator
readonly property color netPopupHeader: "#ffebc6a0"
readonly property color netPopupText: textMain
readonly property color netPopupDim: textDim
readonly property color netFieldBg: "#22ffffff"
readonly property color netCancelBgHover: "#22ffffff"
readonly property color netConnectText: "#ff1a212e"
readonly property color netApActiveBg: Qt.alpha(accent, 0.15)
readonly property color netApHoverBg: calArrowBgHover
readonly property color netDisconnectBg: Qt.alpha(statusErr, 0.18)
readonly property color netDisconnectBorder: Qt.alpha(statusErr, 0.45)
readonly property color netWiredOkBg: Qt.alpha(statusOk, 0.12)
readonly property color netWiredErrBg: Qt.alpha(statusErr, 0.12)
readonly property color netWiredOkBorder: Qt.alpha(statusOk, 0.4)
readonly property color netWiredErrBorder: Qt.alpha(statusErr, 0.4)
// ── Calendar Popup ─────────────────────────────────────────────────────────
readonly property color calCardBg: bgPopup
readonly property color calCardBorder: borderPopup
readonly property color calSeparator: separator
readonly property color calShadow: "#66000000"
readonly property color clockPopupHeader: "#ffebc6a0"
readonly property color clockPopupText: textMain
readonly property color clockPopupDim: textDim
@@ -131,13 +169,12 @@ QtObject {
readonly property color notifBadgeBg: statusErr
readonly property color notifBadgeText: "#ffffffff"
readonly property color notifSeparator: separator
readonly property color notifDnd: separator
readonly property color notifDnd: separator
// ── Toast cards (Variation: Dusk) ──────────────────────────────────────────
readonly property color notifToastBg: bgPopup
readonly property color notifToastBgHover: "#22ffffff"
readonly property color notifToastBorder: borderPopup
readonly property color notifToastShadow: "#44000000"
readonly property color notifToastText: textMain
readonly property color notifToastDim: textDim
readonly property color notifToastAppName: "#ff8fa3b0"
@@ -154,11 +191,10 @@ QtObject {
// ── History popup ──────────────────────────────────────────────────────────
readonly property color notifHistoryBg: bgPopup
readonly property color notifHistoryBorder: "#33ebc6a0"
readonly property color notifHistoryShadow: "#55000000"
readonly property color notifHistoryHover: "#11ebc6a0"
readonly property color notifHistoryEmpty: textDim
// new variables adaptated
// new variables adapted
readonly property color frameBorder: "transparent"
readonly property color clockPopupDate: textMain
readonly property color clockPopupUtc: textDim
@@ -168,8 +204,96 @@ QtObject {
readonly property color calArrowBgHover: "#22ebc6a0"
readonly property color calArrowBgPress: accent
// ── Crypto Module ──────────────────────────────────────────────────────────
readonly property color cryptoBg: bgPanel
readonly property color cryptoBgHover: "#15ffffff"
readonly property color cryptoBorder: border
readonly property color cryptoBorderHover: accent
readonly property color cryptoIcon: accent
readonly property color cryptoLabel: textDim
readonly property color cryptoValue: textMain
readonly property color cryptoUp: statusOk
readonly property color cryptoDown: statusErr
readonly property color cryptoPopupBg: bgPopup
readonly property color cryptoPopupBorder: borderPopup
readonly property color cryptoPopupHeader: accent
readonly property color cryptoPopupText: textMain
readonly property color cryptoPopupDim: textDim
// Tinted surfaces (derived from main colours)
readonly property color cryptoUpBg: Qt.rgba(cryptoUp.r, cryptoUp.g, cryptoUp.b, 0.13)
readonly property color cryptoDownBg: Qt.rgba(cryptoDown.r, cryptoDown.g, cryptoDown.b, 0.13)
readonly property color cryptoChipRemoveBg: Qt.rgba(cryptoDown.r, cryptoDown.g, cryptoDown.b, 0.27)
readonly property color cryptoApplyIdleBg: Qt.rgba(accent.r, accent.g, accent.b, 0.20)
// ── BgDate Module ──────────────────────────────────────────────────────────
readonly property color bgDateText: textMain
readonly property color bgDateShadow: "#66000000"
readonly property color bgDateSecondsText: textMain
// ── Polkit Dialog ──────────────────────────────────────────────────────────
// Overlay
readonly property color polkitOverlayBg: "#bb000000"
// Card chrome
readonly property color polkitCardBg: bgPopup
readonly property color polkitCardBorder: Qt.rgba(accent.r, accent.g, accent.b, 0.16)
// Lock icon
readonly property color polkitIconBg: Qt.rgba(accent.r, accent.g, accent.b, 0.12)
readonly property color polkitIconBorder: Qt.rgba(accent.r, accent.g, accent.b, 0.27)
readonly property color polkitIconColor: accent
// Text hierarchy
readonly property color polkitTitle: textMain
readonly property color polkitMessage: textMain
// Action-ID pill
readonly property color polkitPillBg: Qt.rgba(textDim.r, textDim.g, textDim.b, 0.10)
readonly property color polkitPillText: textDim
// Divider
readonly property color polkitDivider: separator
// Supplementary message — error state
readonly property color polkitSuppErrBg: Qt.rgba(statusErr.r, statusErr.g, statusErr.b, 0.10)
readonly property color polkitSuppErrBorder: Qt.rgba(statusErr.r, statusErr.g, statusErr.b, 0.27)
readonly property color polkitSuppErrText: statusErr
// Supplementary message — info / ok state
readonly property color polkitSuppOkBg: Qt.rgba(statusOk.r, statusOk.g, statusOk.b, 0.10)
readonly property color polkitSuppOkBorder: Qt.rgba(statusOk.r, statusOk.g, statusOk.b, 0.27)
readonly property color polkitSuppOkText: statusOk
// Fields (password input & identity selector)
readonly property color polkitFieldBg: launcherInput
readonly property color polkitFieldBorder: "#22ffffff"
readonly property color polkitFieldBorderFocus: accent
// Identity selector text
readonly property color polkitUserLabel: textDim
readonly property color polkitUserValue: accent
// Input prompt label above password field
readonly property color polkitInputPrompt: textDim
// TextInput inside password field
readonly property color polkitInputText: textMain
readonly property color polkitInputSelection: Qt.rgba(accent.r, accent.g, accent.b, 0.33)
readonly property color polkitInputSelectedText: bg
// Eye / show-password toggle
readonly property color polkitEyeIcon: textDim
readonly property color polkitEyeIconHover: accent
// Authenticate button
readonly property color polkitAuthBg: accent
readonly property color polkitAuthBgHover: Qt.lighter(accent, 1.15)
readonly property color polkitAuthText: bg
// Cancel button
readonly property color polkitCancelBg: "transparent"
readonly property color polkitCancelBgHover: "#22ffffff"
readonly property color polkitCancelBorder: "#22ffffff"
readonly property color polkitCancelText: textDim
}

View File

@@ -29,13 +29,12 @@ QtObject {
readonly property color borderToday: accent
// ── ArchLogo Module ────────────────────────────────────────────────────────
readonly property color archLogoBg: bgPanel
readonly property color archLogoBgHover: "#22ffffff"
readonly property color archLogoHover: accent
readonly property color archLogoBorder: border
readonly property color archLogoBorderActive: accent
readonly property color archLogoIcon: textMain
readonly property color archLogoIconActive: accent
readonly property color logoBg: bgPanel
readonly property color logoBgHover: "#22ffffff"
readonly property color logoBorder: border
readonly property color logoBorderActive: accent
readonly property color logoIcon: textMain
readonly property color logoIconActive: accent
// ── Stats Module (Variation: Alpenglow) ────────────────────────────────────
readonly property color statsBg: bgPanel
@@ -45,7 +44,6 @@ QtObject {
readonly property color statsCpuColor: "#fff0a1ba" // Pink
readonly property color statsMemColor: "#ffffcc99" // Horizon orange
readonly property color statsDiskColor: "#ff8da0c4" // Water blue
readonly property color statsGpuColor: "#ffb08dc4" // Purple mist
readonly property color statsTrackColor: "#15ffffff"
// ── Volume Module (Variation: Frozen Lake) ─────────────────────────────────
@@ -71,15 +69,55 @@ QtObject {
readonly property color clockTime: textMain
readonly property color clockSeconds: "#ffffcc99" // Horizon orange
readonly property color clockIcon: accent
readonly property color clockSeparator: separator
readonly property color clockText: textMain
readonly property color clockShadow: "#44000000"
// ── Battery Module ────────────────────────────────────────────────────────
readonly property color batteryFull: accent
readonly property color batteryCharging: accent
readonly property color batteryCritical: statusErr
readonly property color batteryLow: statusWarn
readonly property color batteryIcon: clockIcon
readonly property color batBg: bgPanel
readonly property color batBgHover: "#11ffffff"
readonly property color batBorder: border
readonly property color batBorderHover: accent
readonly property color batText: textMain
readonly property color batPopupBg: bgPopup
readonly property color batPopupBorder: borderPopup
readonly property color batPopupSeparator: separator
readonly property color batPopupHeader: "#fff0a1ba"
readonly property color batPopupText: textMain
readonly property color batPopupDim: textDim
readonly property color batProgressTrack: separator
readonly property color batProfileActiveText: bg
// ── Network Module ────────────────────────────────────────────────────────
readonly property color netBg: bgPanel
readonly property color netBgHover: "#11ffffff"
readonly property color netBorder: border
readonly property color netBorderHover: accent
readonly property color netText: textMain
readonly property color netPopupBg: bgPopup
readonly property color netPopupBorder: borderPopup
readonly property color netPopupSeparator: separator
readonly property color netPopupHeader: "#fff0a1ba"
readonly property color netPopupText: textMain
readonly property color netPopupDim: textDim
readonly property color netFieldBg: "#22ffffff"
readonly property color netCancelBgHover: "#22ffffff"
readonly property color netConnectText: "#ff1c2433"
readonly property color netApActiveBg: Qt.alpha(accent, 0.15)
readonly property color netApHoverBg: calArrowBgHover
readonly property color netDisconnectBg: Qt.alpha(statusErr, 0.18)
readonly property color netDisconnectBorder: Qt.alpha(statusErr, 0.45)
readonly property color netWiredOkBg: Qt.alpha(statusOk, 0.12)
readonly property color netWiredErrBg: Qt.alpha(statusErr, 0.12)
readonly property color netWiredOkBorder: Qt.alpha(statusOk, 0.4)
readonly property color netWiredErrBorder: Qt.alpha(statusErr, 0.4)
// ── Calendar Popup ─────────────────────────────────────────────────────────
readonly property color calCardBg: bgPopup
readonly property color calCardBorder: borderPopup
readonly property color calSeparator: separator
readonly property color calShadow: "#66000000"
readonly property color clockPopupHeader: "#fff0a1ba"
readonly property color clockPopupText: textMain
readonly property color clockPopupDim: textDim
@@ -131,14 +169,12 @@ QtObject {
readonly property color notifBadgeBg: statusErr
readonly property color notifBadgeText: "#ffffffff"
readonly property color notifSeparator: separator
readonly property color notifDnd: separator
readonly property color notifDnd: separator
// ── Toast cards (Variation: Twilight) ──────────────────────────────────────
readonly property color notifToastBg: bgPopup
readonly property color notifToastBgHover: "#22ffffff"
readonly property color notifToastBorder: borderPopup
readonly property color notifToastShadow: "#44000000"
readonly property color notifToastText: textMain
readonly property color notifToastDim: textDim
readonly property color notifToastAppName: "#ffb08dc4"
@@ -155,11 +191,10 @@ QtObject {
// ── History popup ──────────────────────────────────────────────────────────
readonly property color notifHistoryBg: bgPopup
readonly property color notifHistoryBorder: "#33f0a1ba"
readonly property color notifHistoryShadow: "#55000000"
readonly property color notifHistoryHover: "#11f0a1ba"
readonly property color notifHistoryEmpty: textDim
// new variables adaptated
// new variables adapted
readonly property color frameBorder: "transparent"
readonly property color clockPopupDate: textMain
readonly property color clockPopupUtc: textDim
@@ -169,8 +204,96 @@ QtObject {
readonly property color calArrowBgHover: "#22f0a1ba"
readonly property color calArrowBgPress: accent
// ── Crypto Module ──────────────────────────────────────────────────────────
readonly property color cryptoBg: bgPanel
readonly property color cryptoBgHover: "#15ffffff"
readonly property color cryptoBorder: border
readonly property color cryptoBorderHover: accent
readonly property color cryptoIcon: accent
readonly property color cryptoLabel: textDim
readonly property color cryptoValue: textMain
readonly property color cryptoUp: statusOk
readonly property color cryptoDown: statusErr
readonly property color cryptoPopupBg: bgPopup
readonly property color cryptoPopupBorder: borderPopup
readonly property color cryptoPopupHeader: accent
readonly property color cryptoPopupText: textMain
readonly property color cryptoPopupDim: textDim
// Tinted surfaces (derived from main colours)
readonly property color cryptoUpBg: Qt.rgba(cryptoUp.r, cryptoUp.g, cryptoUp.b, 0.13)
readonly property color cryptoDownBg: Qt.rgba(cryptoDown.r, cryptoDown.g, cryptoDown.b, 0.13)
readonly property color cryptoChipRemoveBg: Qt.rgba(cryptoDown.r, cryptoDown.g, cryptoDown.b, 0.27)
readonly property color cryptoApplyIdleBg: Qt.rgba(accent.r, accent.g, accent.b, 0.20)
// ── BgDate Module ──────────────────────────────────────────────────────────
readonly property color bgDateText: textMain
readonly property color bgDateShadow: "#66000000"
readonly property color bgDateSecondsText: textMain
// ── Polkit Dialog ──────────────────────────────────────────────────────────
// Overlay
readonly property color polkitOverlayBg: "#bb000000"
// Card chrome
readonly property color polkitCardBg: bgPopup
readonly property color polkitCardBorder: Qt.rgba(accent.r, accent.g, accent.b, 0.16)
// Lock icon
readonly property color polkitIconBg: Qt.rgba(accent.r, accent.g, accent.b, 0.12)
readonly property color polkitIconBorder: Qt.rgba(accent.r, accent.g, accent.b, 0.27)
readonly property color polkitIconColor: accent
// Text hierarchy
readonly property color polkitTitle: textMain
readonly property color polkitMessage: textMain
// Action-ID pill
readonly property color polkitPillBg: Qt.rgba(textDim.r, textDim.g, textDim.b, 0.10)
readonly property color polkitPillText: textDim
// Divider
readonly property color polkitDivider: separator
// Supplementary message — error state
readonly property color polkitSuppErrBg: Qt.rgba(statusErr.r, statusErr.g, statusErr.b, 0.10)
readonly property color polkitSuppErrBorder: Qt.rgba(statusErr.r, statusErr.g, statusErr.b, 0.27)
readonly property color polkitSuppErrText: statusErr
// Supplementary message — info / ok state
readonly property color polkitSuppOkBg: Qt.rgba(statusOk.r, statusOk.g, statusOk.b, 0.10)
readonly property color polkitSuppOkBorder: Qt.rgba(statusOk.r, statusOk.g, statusOk.b, 0.27)
readonly property color polkitSuppOkText: statusOk
// Fields (password input & identity selector)
readonly property color polkitFieldBg: launcherInput
readonly property color polkitFieldBorder: "#22ffffff"
readonly property color polkitFieldBorderFocus: accent
// Identity selector text
readonly property color polkitUserLabel: textDim
readonly property color polkitUserValue: accent
// Input prompt label above password field
readonly property color polkitInputPrompt: textDim
// TextInput inside password field
readonly property color polkitInputText: textMain
readonly property color polkitInputSelection: Qt.rgba(accent.r, accent.g, accent.b, 0.33)
readonly property color polkitInputSelectedText: bg
// Eye / show-password toggle
readonly property color polkitEyeIcon: textDim
readonly property color polkitEyeIconHover: accent
// Authenticate button
readonly property color polkitAuthBg: accent
readonly property color polkitAuthBgHover: Qt.lighter(accent, 1.15)
readonly property color polkitAuthText: bg
// Cancel button
readonly property color polkitCancelBg: "transparent"
readonly property color polkitCancelBgHover: "#22ffffff"
readonly property color polkitCancelBorder: "#22ffffff"
readonly property color polkitCancelText: textDim
}

Binary file not shown.

View File

@@ -29,13 +29,12 @@ QtObject {
readonly property color borderToday: accent
// ── ArchLogo Module ────────────────────────────────────────────────────────
readonly property color archLogoBg: bgPanel
readonly property color archLogoBgHover: "#22ffffff"
readonly property color archLogoHover: accent
readonly property color archLogoBorder: border
readonly property color archLogoBorderActive: accent
readonly property color archLogoIcon: textMain
readonly property color archLogoIconActive: accent
readonly property color logoBg: bgPanel
readonly property color logoBgHover: "#22ffffff"
readonly property color logoBorder: border
readonly property color logoBorderActive: accent
readonly property color logoIcon: textMain
readonly property color logoIconActive: accent
// ── Stats Module (Variation: Comet Trail) ──────────────────────────────────
readonly property color statsBg: bgPanel
@@ -45,7 +44,6 @@ QtObject {
readonly property color statsCpuColor: "#ffbdf0ff"
readonly property color statsMemColor: "#ffcfb3ff" // Nebula purple
readonly property color statsDiskColor: "#ffffc2e0" // Horizon pink
readonly property color statsGpuColor: accent
readonly property color statsTrackColor: "#15ffffff"
// ── Volume Module (Variation: Nebula Purple) ───────────────────────────────
@@ -71,15 +69,55 @@ QtObject {
readonly property color clockTime: textMain
readonly property color clockSeconds: "#ffffc2e0" // Horizon pink
readonly property color clockIcon: accent
readonly property color clockSeparator: separator
readonly property color clockText: textMain
readonly property color clockShadow: "#44000000"
// ── Battery Module ────────────────────────────────────────────────────────
readonly property color batteryFull: accent
readonly property color batteryCharging: accent
readonly property color batteryCritical: statusErr
readonly property color batteryLow: statusWarn
readonly property color batteryIcon: clockIcon
readonly property color batBg: bgPanel
readonly property color batBgHover: "#11ffffff"
readonly property color batBorder: border
readonly property color batBorderHover: accent
readonly property color batText: textMain
readonly property color batPopupBg: bgPopup
readonly property color batPopupBorder: borderPopup
readonly property color batPopupSeparator: separator
readonly property color batPopupHeader: "#ffcfb3ff"
readonly property color batPopupText: textMain
readonly property color batPopupDim: textDim
readonly property color batProgressTrack: separator
readonly property color batProfileActiveText: bg
// ── Network Module ────────────────────────────────────────────────────────
readonly property color netBg: bgPanel
readonly property color netBgHover: "#11ffffff"
readonly property color netBorder: border
readonly property color netBorderHover: accent
readonly property color netText: textMain
readonly property color netPopupBg: bgPopup
readonly property color netPopupBorder: borderPopup
readonly property color netPopupSeparator: separator
readonly property color netPopupHeader: "#ffcfb3ff"
readonly property color netPopupText: textMain
readonly property color netPopupDim: textDim
readonly property color netFieldBg: "#22ffffff"
readonly property color netCancelBgHover: "#22ffffff"
readonly property color netConnectText: "#ff0d1326"
readonly property color netApActiveBg: Qt.alpha(accent, 0.15)
readonly property color netApHoverBg: calArrowBgHover
readonly property color netDisconnectBg: Qt.alpha(statusErr, 0.18)
readonly property color netDisconnectBorder: Qt.alpha(statusErr, 0.45)
readonly property color netWiredOkBg: Qt.alpha(statusOk, 0.12)
readonly property color netWiredErrBg: Qt.alpha(statusErr, 0.12)
readonly property color netWiredOkBorder: Qt.alpha(statusOk, 0.4)
readonly property color netWiredErrBorder: Qt.alpha(statusErr, 0.4)
// ── Calendar Popup ─────────────────────────────────────────────────────────
readonly property color calCardBg: bgPopup
readonly property color calCardBorder: borderPopup
readonly property color calSeparator: separator
readonly property color calShadow: "#66000000"
readonly property color clockPopupHeader: "#ffcfb3ff"
readonly property color clockPopupText: textMain
readonly property color clockPopupDim: textDim
@@ -131,13 +169,12 @@ QtObject {
readonly property color notifBadgeBg: statusErr
readonly property color notifBadgeText: "#ffffffff"
readonly property color notifSeparator: separator
readonly property color notifDnd: separator
readonly property color notifDnd: separator
// ── Toast cards (Variation: Horizon Dusk) ──────────────────────────────────
readonly property color notifToastBg: bgPopup
readonly property color notifToastBgHover: "#22ffffff"
readonly property color notifToastBorder: borderPopup
readonly property color notifToastShadow: "#44000000"
readonly property color notifToastText: textMain
readonly property color notifToastDim: textDim
readonly property color notifToastAppName: "#ffcfb3ff"
@@ -154,11 +191,10 @@ QtObject {
// ── History popup ──────────────────────────────────────────────────────────
readonly property color notifHistoryBg: bgPopup
readonly property color notifHistoryBorder: "#33bdf0ff"
readonly property color notifHistoryShadow: "#55000000"
readonly property color notifHistoryHover: "#11bdf0ff"
readonly property color notifHistoryEmpty: textDim
// new variables adaptated
// new variables adapted
readonly property color frameBorder: "transparent"
readonly property color clockPopupDate: textMain
readonly property color clockPopupUtc: textDim
@@ -168,8 +204,96 @@ QtObject {
readonly property color calArrowBgHover: "#22bdf0ff"
readonly property color calArrowBgPress: accent
// ── Crypto Module ──────────────────────────────────────────────────────────
readonly property color cryptoBg: bgPanel
readonly property color cryptoBgHover: "#15ffffff"
readonly property color cryptoBorder: border
readonly property color cryptoBorderHover: accent
readonly property color cryptoIcon: accent
readonly property color cryptoLabel: textDim
readonly property color cryptoValue: textMain
readonly property color cryptoUp: statusOk
readonly property color cryptoDown: statusErr
readonly property color cryptoPopupBg: bgPopup
readonly property color cryptoPopupBorder: borderPopup
readonly property color cryptoPopupHeader: accent
readonly property color cryptoPopupText: textMain
readonly property color cryptoPopupDim: textDim
// Tinted surfaces (derived from main colours)
readonly property color cryptoUpBg: Qt.rgba(cryptoUp.r, cryptoUp.g, cryptoUp.b, 0.13)
readonly property color cryptoDownBg: Qt.rgba(cryptoDown.r, cryptoDown.g, cryptoDown.b, 0.13)
readonly property color cryptoChipRemoveBg: Qt.rgba(cryptoDown.r, cryptoDown.g, cryptoDown.b, 0.27)
readonly property color cryptoApplyIdleBg: Qt.rgba(accent.r, accent.g, accent.b, 0.20)
// ── BgDate Module ──────────────────────────────────────────────────────────
readonly property color bgDateText: textMain
readonly property color bgDateShadow: "#66000000"
readonly property color bgDateSecondsText: textMain
// ── Polkit Dialog ──────────────────────────────────────────────────────────
// Overlay
readonly property color polkitOverlayBg: "#bb000000"
// Card chrome
readonly property color polkitCardBg: bgPopup
readonly property color polkitCardBorder: Qt.rgba(accent.r, accent.g, accent.b, 0.16)
// Lock icon
readonly property color polkitIconBg: Qt.rgba(accent.r, accent.g, accent.b, 0.12)
readonly property color polkitIconBorder: Qt.rgba(accent.r, accent.g, accent.b, 0.27)
readonly property color polkitIconColor: accent
// Text hierarchy
readonly property color polkitTitle: textMain
readonly property color polkitMessage: textMain
// Action-ID pill
readonly property color polkitPillBg: Qt.rgba(textDim.r, textDim.g, textDim.b, 0.10)
readonly property color polkitPillText: textDim
// Divider
readonly property color polkitDivider: separator
// Supplementary message — error state
readonly property color polkitSuppErrBg: Qt.rgba(statusErr.r, statusErr.g, statusErr.b, 0.10)
readonly property color polkitSuppErrBorder: Qt.rgba(statusErr.r, statusErr.g, statusErr.b, 0.27)
readonly property color polkitSuppErrText: statusErr
// Supplementary message — info / ok state
readonly property color polkitSuppOkBg: Qt.rgba(statusOk.r, statusOk.g, statusOk.b, 0.10)
readonly property color polkitSuppOkBorder: Qt.rgba(statusOk.r, statusOk.g, statusOk.b, 0.27)
readonly property color polkitSuppOkText: statusOk
// Fields (password input & identity selector)
readonly property color polkitFieldBg: launcherInput
readonly property color polkitFieldBorder: "#22ffffff"
readonly property color polkitFieldBorderFocus: accent
// Identity selector text
readonly property color polkitUserLabel: textDim
readonly property color polkitUserValue: accent
// Input prompt label above password field
readonly property color polkitInputPrompt: textDim
// TextInput inside password field
readonly property color polkitInputText: textMain
readonly property color polkitInputSelection: Qt.rgba(accent.r, accent.g, accent.b, 0.33)
readonly property color polkitInputSelectedText: bg
// Eye / show-password toggle
readonly property color polkitEyeIcon: textDim
readonly property color polkitEyeIconHover: accent
// Authenticate button
readonly property color polkitAuthBg: accent
readonly property color polkitAuthBgHover: Qt.lighter(accent, 1.15)
readonly property color polkitAuthText: bg
// Cancel button
readonly property color polkitCancelBg: "transparent"
readonly property color polkitCancelBgHover: "#22ffffff"
readonly property color polkitCancelBorder: "#22ffffff"
readonly property color polkitCancelText: textDim
}

View File

@@ -29,13 +29,12 @@ QtObject {
readonly property color borderToday: accent
// ── ArchLogo Module ────────────────────────────────────────────────────────
readonly property color archLogoBg: bgPanel
readonly property color archLogoBgHover: "#22ffffff"
readonly property color archLogoHover: accent
readonly property color archLogoBorder: border
readonly property color archLogoBorderActive: accent
readonly property color archLogoIcon: textMain
readonly property color archLogoIconActive: accent
readonly property color logoBg: bgPanel
readonly property color logoBgHover: "#22ffffff"
readonly property color logoBorder: border
readonly property color logoBorderActive: accent
readonly property color logoIcon: textMain
readonly property color logoIconActive: accent
// ── Stats Module ───────────────────────────────────────────────────────────
readonly property color statsBg: bgPanel
@@ -45,7 +44,6 @@ QtObject {
readonly property color statsCpuColor: statsRingColor
readonly property color statsMemColor: statsRingColor
readonly property color statsDiskColor: statsRingColor
readonly property color statsGpuColor: statsRingColor
readonly property color statsTrackColor: "#28ffffff"
// ── Volume Module ──────────────────────────────────────────────────────────
@@ -71,15 +69,55 @@ QtObject {
readonly property color clockTime: textMain
readonly property color clockSeconds: textMain
readonly property color clockIcon: textMain
readonly property color clockSeparator: separator
readonly property color clockText: textMain
readonly property color clockShadow: "#22000000"
// ── Battery Module ────────────────────────────────────────────────────────
readonly property color batteryFull: accent
readonly property color batteryCharging: accent
readonly property color batteryCritical: statusErr
readonly property color batteryLow: statusWarn
readonly property color batteryIcon: clockIcon
readonly property color batBg: bgPanel
readonly property color batBgHover: "#22ffffff"
readonly property color batBorder: border
readonly property color batBorderHover: accent
readonly property color batText: textMain
readonly property color batPopupBg: bgPopup
readonly property color batPopupBorder: borderPopup
readonly property color batPopupSeparator: separator
readonly property color batPopupHeader: accent
readonly property color batPopupText: textMain
readonly property color batPopupDim: textDim
readonly property color batProgressTrack: separator
readonly property color batProfileActiveText: bg
// ── Network Module ────────────────────────────────────────────────────────
readonly property color netBg: bgPanel
readonly property color netBgHover: "#22ffffff"
readonly property color netBorder: border
readonly property color netBorderHover: accent
readonly property color netText: textMain
readonly property color netPopupBg: bgPopup
readonly property color netPopupBorder: borderPopup
readonly property color netPopupSeparator: separator
readonly property color netPopupHeader: accent
readonly property color netPopupText: textMain
readonly property color netPopupDim: textDim
readonly property color netFieldBg: "#22ffffff"
readonly property color netCancelBgHover: "#22ffffff"
readonly property color netConnectText: "#ff0e1410"
readonly property color netApActiveBg: Qt.alpha(accent, 0.15)
readonly property color netApHoverBg: calArrowBgHover
readonly property color netDisconnectBg: Qt.alpha(statusErr, 0.18)
readonly property color netDisconnectBorder: Qt.alpha(statusErr, 0.45)
readonly property color netWiredOkBg: Qt.alpha(statusOk, 0.12)
readonly property color netWiredErrBg: Qt.alpha(statusErr, 0.12)
readonly property color netWiredOkBorder: Qt.alpha(statusOk, 0.4)
readonly property color netWiredErrBorder: Qt.alpha(statusErr, 0.4)
// ── Calendar Popup ─────────────────────────────────────────────────────────
readonly property color calCardBg: bgPopup
readonly property color calCardBorder: borderPopup
readonly property color calSeparator: separator
readonly property color calShadow: "#44000000"
readonly property color clockPopupHeader: accent
readonly property color clockPopupText: textMain
readonly property color clockPopupDim: textDim
@@ -131,14 +169,12 @@ QtObject {
readonly property color notifBadgeBg: statusErr
readonly property color notifBadgeText: "#ff0e1410"
readonly property color notifSeparator: separator
readonly property color notifDnd: separator
readonly property color notifDnd: separator
// ── Toast cards ────────────────────────────────────────────────────────────
readonly property color notifToastBg: bgPopup
readonly property color notifToastBgHover: borderPopup
readonly property color notifToastBorder: borderPopup
readonly property color notifToastShadow: "#55000000"
readonly property color notifToastText: textMain
readonly property color notifToastDim: textDim
readonly property color notifToastAppName: accent
@@ -155,11 +191,10 @@ QtObject {
// ── History popup ──────────────────────────────────────────────────────────
readonly property color notifHistoryBg: bgPopup
readonly property color notifHistoryBorder: borderPopup
readonly property color notifHistoryShadow: "#55000000"
readonly property color notifHistoryHover: "#22ffffff"
readonly property color notifHistoryEmpty: textDim
// new variables adaptated
// new variables adapted
readonly property color frameBorder: "transparent"
readonly property color clockPopupDate: textMain
readonly property color clockPopupUtc: textDim
@@ -169,10 +204,97 @@ QtObject {
readonly property color calArrowBgHover: "#224a8c5c"
readonly property color calArrowBgPress: accent
// ── Crypto Module ──────────────────────────────────────────────────────────
readonly property color cryptoBg: bgPanel
readonly property color cryptoBgHover: "#15ffffff"
readonly property color cryptoBorder: border
readonly property color cryptoBorderHover: accent
readonly property color cryptoIcon: accent
readonly property color cryptoLabel: textDim
readonly property color cryptoValue: textMain
readonly property color cryptoUp: statusOk
readonly property color cryptoDown: statusErr
readonly property color cryptoPopupBg: bgPopup
readonly property color cryptoPopupBorder: borderPopup
readonly property color cryptoPopupHeader: accent
readonly property color cryptoPopupText: textMain
readonly property color cryptoPopupDim: textDim
// Tinted surfaces (derived from main colours)
readonly property color cryptoUpBg: Qt.rgba(cryptoUp.r, cryptoUp.g, cryptoUp.b, 0.13)
readonly property color cryptoDownBg: Qt.rgba(cryptoDown.r, cryptoDown.g, cryptoDown.b, 0.13)
readonly property color cryptoChipRemoveBg: Qt.rgba(cryptoDown.r, cryptoDown.g, cryptoDown.b, 0.27)
readonly property color cryptoApplyIdleBg: Qt.rgba(accent.r, accent.g, accent.b, 0.20)
// ── BgDate Module ──────────────────────────────────────────────────────────
readonly property color bgDateText: textMain
readonly property color bgDateShadow: "#44000000"
readonly property color bgDateSecondsText: textMain
// ── Polkit Dialog ──────────────────────────────────────────────────────────
// Overlay
readonly property color polkitOverlayBg: "#bb000000"
// Card chrome
readonly property color polkitCardBg: bgPopup
readonly property color polkitCardBorder: Qt.rgba(accent.r, accent.g, accent.b, 0.16)
// Lock icon
readonly property color polkitIconBg: Qt.rgba(accent.r, accent.g, accent.b, 0.12)
readonly property color polkitIconBorder: Qt.rgba(accent.r, accent.g, accent.b, 0.27)
readonly property color polkitIconColor: accent
// Text hierarchy
readonly property color polkitTitle: textMain
readonly property color polkitMessage: textMain
// Action-ID pill
readonly property color polkitPillBg: Qt.rgba(textDim.r, textDim.g, textDim.b, 0.10)
readonly property color polkitPillText: textDim
// Divider
readonly property color polkitDivider: separator
// Supplementary message — error state
readonly property color polkitSuppErrBg: Qt.rgba(statusErr.r, statusErr.g, statusErr.b, 0.10)
readonly property color polkitSuppErrBorder: Qt.rgba(statusErr.r, statusErr.g, statusErr.b, 0.27)
readonly property color polkitSuppErrText: statusErr
// Supplementary message — info / ok state
readonly property color polkitSuppOkBg: Qt.rgba(statusOk.r, statusOk.g, statusOk.b, 0.10)
readonly property color polkitSuppOkBorder: Qt.rgba(statusOk.r, statusOk.g, statusOk.b, 0.27)
readonly property color polkitSuppOkText: statusOk
// Fields (password input & identity selector)
readonly property color polkitFieldBg: launcherInput
readonly property color polkitFieldBorder: "#22ffffff"
readonly property color polkitFieldBorderFocus: accent
// Identity selector text
readonly property color polkitUserLabel: textDim
readonly property color polkitUserValue: accent
// Input prompt label above password field
readonly property color polkitInputPrompt: textDim
// TextInput inside password field
readonly property color polkitInputText: textMain
readonly property color polkitInputSelection: Qt.rgba(accent.r, accent.g, accent.b, 0.33)
readonly property color polkitInputSelectedText: bg
// Eye / show-password toggle
readonly property color polkitEyeIcon: textDim
readonly property color polkitEyeIconHover: accent
// Authenticate button
readonly property color polkitAuthBg: accent
readonly property color polkitAuthBgHover: Qt.lighter(accent, 1.15)
readonly property color polkitAuthText: bg
// Cancel button
readonly property color polkitCancelBg: "transparent"
readonly property color polkitCancelBgHover: "#22ffffff"
readonly property color polkitCancelBorder: "#22ffffff"
readonly property color polkitCancelText: textDim
}

View File

@@ -25,18 +25,17 @@ QtObject {
// ── Accent & Borders ──────────────────────────────────────────────────────
readonly property color accent: "#ffc19375" // Warm hazy horizon gold
readonly property color border: "transparent"
readonly property color frameBorder: "transparent"
readonly property color frameBorder: "transparent"
readonly property color borderPopup: "transparent"
readonly property color borderToday: accent
// ── ArchLogo Module ────────────────────────────────────────────────────────
readonly property color archLogoBg: bgPanel
readonly property color archLogoBgHover: "#22ffffff"
readonly property color archLogoHover: accent
readonly property color archLogoBorder: border
readonly property color archLogoBorderActive: accent
readonly property color archLogoIcon: textMain
readonly property color archLogoIconActive: accent
// ── Logo Module ────────────────────────────────────────────────────────
readonly property color logoBg: bgPanel
readonly property color logoBgHover: "#22ffffff"
readonly property color logoBorder: border
readonly property color logoBorderActive: accent
readonly property color logoIcon: textMain
readonly property color logoIconActive: accent
// ── Stats Module (Variation: Skyline Pulse) ───────────────────────────────
readonly property color statsBg: bgPanel
@@ -46,7 +45,6 @@ QtObject {
readonly property color statsCpuColor: "#ffc19375" // Horizon gold
readonly property color statsMemColor: "#ff89b4fa" // Building window blue
readonly property color statsDiskColor: "#ff94e2d5" // Teal office light
readonly property color statsGpuColor: "#fff38ba8" // Aviation warning red
readonly property color statsTrackColor: "#15ffffff"
// ── Volume Module (Variation: Hazy Dusk) ──────────────────────────────────
@@ -72,15 +70,55 @@ QtObject {
readonly property color clockTime: textMain
readonly property color clockSeconds: "#ffc19375" // Sun-glow gold
readonly property color clockIcon: accent
readonly property color clockSeparator: separator
readonly property color clockText: textMain
readonly property color clockShadow: "#66000000"
// ── Battery Module ────────────────────────────────────────────────────────
readonly property color batteryFull: accent
readonly property color batteryCharging: accent
readonly property color batteryCritical: statusErr
readonly property color batteryLow: statusWarn
readonly property color batteryIcon: clockIcon
readonly property color batBg: bgPanel
readonly property color batBgHover: "#11ffffff"
readonly property color batBorder: border
readonly property color batBorderHover: accent
readonly property color batText: textMain
readonly property color batPopupBg: bgPopup
readonly property color batPopupBorder: borderPopup
readonly property color batPopupSeparator: separator
readonly property color batPopupHeader: "#ffc19375"
readonly property color batPopupText: textMain
readonly property color batPopupDim: textDim
readonly property color batProgressTrack: separator
readonly property color batProfileActiveText: bg
// ── Network Module ────────────────────────────────────────────────────────
readonly property color netBg: bgPanel
readonly property color netBgHover: "#11ffffff"
readonly property color netBorder: border
readonly property color netBorderHover: accent
readonly property color netText: textMain
readonly property color netPopupBg: bgPopup
readonly property color netPopupBorder: borderPopup
readonly property color netPopupSeparator: separator
readonly property color netPopupHeader: "#ffc19375"
readonly property color netPopupText: textMain
readonly property color netPopupDim: textDim
readonly property color netFieldBg: "#22ffffff"
readonly property color netCancelBgHover: "#22ffffff"
readonly property color netConnectText: "#ff0c0e12"
readonly property color netApActiveBg: Qt.alpha(accent, 0.15)
readonly property color netApHoverBg: calArrowBgHover
readonly property color netDisconnectBg: Qt.alpha(statusErr, 0.18)
readonly property color netDisconnectBorder: Qt.alpha(statusErr, 0.45)
readonly property color netWiredOkBg: Qt.alpha(statusOk, 0.12)
readonly property color netWiredErrBg: Qt.alpha(statusErr, 0.12)
readonly property color netWiredOkBorder: Qt.alpha(statusOk, 0.4)
readonly property color netWiredErrBorder: Qt.alpha(statusErr, 0.4)
// ── Calendar Popup ─────────────────────────────────────────────────────────
readonly property color calCardBg: bgPopup
readonly property color calCardBorder: borderPopup
readonly property color calSeparator: separator
readonly property color calShadow: "#88000000"
readonly property color clockPopupHeader: "#ffc19375"
readonly property color clockPopupText: textMain
readonly property color clockPopupDim: textDim
@@ -109,6 +147,15 @@ QtObject {
readonly property color trayBorderHover: "#22ffffff"
readonly property color trayIcon: textMain
// ── Tray Context Menu ──────────────────────────────────────────────────────
readonly property color trayMenuBg: bgPopup
readonly property color trayMenuBorder: borderPopup
readonly property color trayMenuText: textMain
readonly property color trayMenuDim: textDim
readonly property color trayMenuHover: "#22c19375" // soft gold tint
readonly property color trayMenuCheck: accent
readonly property color trayMenuSeparator: separator
// ── Launcher (Variation: Shanghai Mist) ───────────────────────────────────
readonly property color launcherBg: bgPopup
readonly property color launcherBorder: borderPopup
@@ -145,7 +192,6 @@ QtObject {
readonly property color notifToastBg: bgPopup
readonly property color notifToastBgHover: "#22ffffff"
readonly property color notifToastBorder: borderPopup
readonly property color notifToastShadow: "#88000000"
readonly property color notifToastText: textMain
readonly property color notifToastDim: textDim
readonly property color notifToastAppName: "#ff89b4fa"
@@ -162,7 +208,6 @@ QtObject {
// ── History popup ──────────────────────────────────────────────────────────
readonly property color notifHistoryBg: bgPopup
readonly property color notifHistoryBorder: borderPopup
readonly property color notifHistoryShadow: "#aa000000"
readonly property color notifHistoryHover: "#11c19375"
readonly property color notifHistoryEmpty: textDim
@@ -170,4 +215,96 @@ QtObject {
readonly property color bgDateText: "#ffffffff" // Pure white (brightest possible)
readonly property color bgDateShadow: "#88000000" // Slightly softer shadow to let the white glow
readonly property color bgDateSecondsText: bgDateText // Brighter, more "sunlight" gold/yellow
// ── Crypto Module ──────────────────────────────────────────────────────────
readonly property color cryptoBg: bgPanel
readonly property color cryptoBgHover: "#15ffffff" // subtle hover wash (matches other modules)
readonly property color cryptoBorder: border
readonly property color cryptoBorderHover: accent // horizon gold on hover / when popup is open
readonly property color cryptoIcon: accent // coin glyph colour
readonly property color cryptoLabel: textDim // "BTC/USD: " prefix
readonly property color cryptoValue: textMain // price number on chip
readonly property color cryptoUp: "#ffb4c9a1" // ▲ positive change — soft green
readonly property color cryptoDown: "#fff38ba8" // ▼ negative change — soft red
// Popup card
readonly property color cryptoPopupBg: bgPopup
readonly property color cryptoPopupBorder: borderPopup
readonly property color cryptoPopupHeader: "#ffc19375" // horizon gold (matches clock popup)
readonly property color cryptoPopupText: textMain
readonly property color cryptoPopupDim: textDim
// Tinted surfaces (derived from main colours)
readonly property color cryptoUpBg: Qt.rgba(cryptoUp.r, cryptoUp.g, cryptoUp.b, 0.13)
readonly property color cryptoDownBg: Qt.rgba(cryptoDown.r, cryptoDown.g, cryptoDown.b, 0.13)
readonly property color cryptoChipRemoveBg: Qt.rgba(cryptoDown.r, cryptoDown.g, cryptoDown.b, 0.27)
readonly property color cryptoApplyIdleBg: Qt.rgba(accent.r, accent.g, accent.b, 0.20)
// ── Polkit Dialog ──────────────────────────────────────────────────────────
// Overlay
readonly property color polkitOverlayBg: "#bb000000" // dim backdrop behind the card
// Card chrome
readonly property color polkitCardBg: bgPopup // near-opaque deep shadow (matches bgPopup family)
readonly property color polkitCardBorder: border // faint horizon-gold ring
// Lock icon
readonly property color polkitIconBg: "#1ec19375" // translucent gold fill
readonly property color polkitIconBorder: "#44c19375" // stronger gold ring
readonly property color polkitIconColor: accent // glyph — horizon gold
// Text hierarchy
readonly property color polkitTitle: textMain // "Authentication Required"
readonly property color polkitMessage: "#cce8eef2" // main message (slightly dimmed)
// Action-ID pill
readonly property color polkitPillBg: "#1a4a5d6e" // muted sky-blue tint
readonly property color polkitPillText: "#667a8996" // monospace action-id label
// Divider between pill and supplementary area
readonly property color polkitDivider: "#334a5d6e" // separator line
// Supplementary message — error state
readonly property color polkitSuppErrBg: "#1af38ba8" // translucent rose fill
readonly property color polkitSuppErrBorder: "#44f38ba8" // rose ring
readonly property color polkitSuppErrText: statusErr // rose icon + text
// Supplementary message — info / ok state
readonly property color polkitSuppOkBg: "#1ab4c9a1" // translucent sage fill
readonly property color polkitSuppOkBorder: "#44b4c9a1" // sage ring
readonly property color polkitSuppOkText: statusOk // sage icon + text
// Fields (password input & identity selector share the same palette)
readonly property color polkitFieldBg: "#44080a0d" // deep dark fill
readonly property color polkitFieldBorder: "#22ffffff" // inactive border
readonly property color polkitFieldBorderFocus: accent // focused border — horizon gold
// Identity selector text
readonly property color polkitUserLabel: "#997a8996" // "User:" prefix
readonly property color polkitUserValue: accent // selected identity name
// Input prompt label above the password field
readonly property color polkitInputPrompt: "#887a8996" // dim label
// TextInput inside the password field
readonly property color polkitInputText: textMain // typed text
readonly property color polkitInputSelection: "#55c19375" // selection highlight
readonly property color polkitInputSelectedText: bg // text over selection
// Eye / show-password toggle
readonly property color polkitEyeIcon: "#667a8996" // default glyph
readonly property color polkitEyeIconHover: accent // hovered glyph
// Authenticate button
readonly property color polkitAuthBg: "#ddc19375" // slightly-muted gold fill
readonly property color polkitAuthBgHover: accent // full gold on hover
readonly property color polkitAuthText: bg // dark label on gold
// Cancel button
readonly property color polkitCancelBg: "#0dffffff" // ghost fill
readonly property color polkitCancelBgHover: "#22ffffff" // brighter ghost on hover
readonly property color polkitCancelBorder: "#22ffffff" // outline
readonly property color polkitCancelText: "#cce8eef2" // slightly-dimmed white label
}

View File

@@ -0,0 +1,277 @@
pragma Singleton
import QtQuick
import Quickshell
QtObject {
id: theme
// ── Wallpaper ──────────────────────────────────────────────────────────────
readonly property string wallpaper: Quickshell.env("HOME") + "/.config/quickshell/wallpapers/hummingbird.jpg"
// ── Base Backgrounds ───────────────────────────────────────────────────────
readonly property color bg: "#cc0d140d" // Deep mossy shadow
readonly property color bgPanel: "transparent"
readonly property color bgPopup: "#cc0d140d" // Dark forest floor
readonly property color bgFrame: bg
// ── Separators ────────────────────────────────────────────────────────────
readonly property color separator: "#338bc34a" // Muted leaf green
// ── Text ──────────────────────────────────────────────────────────────────
readonly property color textMain: "#fff1f8e9" // Creamy mint highlight
readonly property color textDim: "#99a5ad94" // Sage horizon gray
readonly property color todayText: "#ffffffff"
// ── Accent & Borders ──────────────────────────────────────────────────────
readonly property color accent: "#ffff5722" // Fiery vermilion (throat)
readonly property color border: "transparent"
readonly property color frameBorder: "transparent"
readonly property color borderPopup: "transparent"
readonly property color borderToday: accent
// ── Logo Module ────────────────────────────────────────────────────────
readonly property color logoBg: bgPanel
readonly property color logoBgHover: "#22ffffff"
readonly property color logoBorder: border
readonly property color logoBorderActive: accent
readonly property color logoIcon: textMain
readonly property color logoIconActive: accent
// ── Stats Module (Variation: Canopy Pulse) ───────────────────────────────
readonly property color statsBg: bgPanel
readonly property color statsBorder: border
readonly property color statsText: "#ff8bc34a" // Leaf green
readonly property color statsRingColor: accent
readonly property color statsCpuColor: "#ffff5722" // Vermilion
readonly property color statsMemColor: "#ff8bc34a" // Bright green
readonly property color statsDiskColor: "#ff90caf9" // Bokeh sky blue
readonly property color statsTrackColor: "#15ffffff"
// ── Volume Module (Variation: Forest Echo) ──────────────────────────────────
readonly property color volBg: bgPanel
readonly property color volBgHover: "#222e7d32"
readonly property color volBorder: border
readonly property color volBorderHover: "#ff8bc34a"
readonly property color volPopupBg: bgPopup
readonly property color volPopupBorder: borderPopup
readonly property color volIcon: "#ff8bc34a"
readonly property color volIconMuted: "#ff5d665d"
readonly property color volTrack: "#22ffffff"
readonly property color volHandle: accent
readonly property color volHandleBorder: "#33ffffff"
readonly property color volMuteBg: "#33f44336"
readonly property color volPickerHover: "#15ff5722"
// ── Clock Module ───────────────────────────────────────────────────────────
readonly property color clockBg: bgPanel
readonly property color clockBgHover: "#11ffffff"
readonly property color clockBorder: border
readonly property color clockBorderHover: accent
readonly property color clockTime: textMain
readonly property color clockSeconds: "#ffff5722" // Fiery glow
readonly property color clockIcon: accent
// ── Battery Module ────────────────────────────────────────────────────────
readonly property color batteryFull: accent
readonly property color batteryCharging: "#ff8bc34a"
readonly property color batteryCritical: statusErr
readonly property color batteryLow: statusWarn
readonly property color batteryIcon: clockIcon
readonly property color batBg: bgPanel
readonly property color batBgHover: "#11ffffff"
readonly property color batBorder: border
readonly property color batBorderHover: accent
readonly property color batText: textMain
readonly property color batPopupBg: bgPopup
readonly property color batPopupBorder: borderPopup
readonly property color batPopupSeparator: separator
readonly property color batPopupHeader: "#ffff5722"
readonly property color batPopupText: textMain
readonly property color batPopupDim: textDim
readonly property color batProgressTrack: separator
readonly property color batProfileActiveText: bg
// ── Network Module ────────────────────────────────────────────────────────
readonly property color netBg: bgPanel
readonly property color netBgHover: "#11ffffff"
readonly property color netBorder: border
readonly property color netBorderHover: accent
readonly property color netText: textMain
readonly property color netPopupBg: bgPopup
readonly property color netPopupBorder: borderPopup
readonly property color netPopupSeparator: separator
readonly property color netPopupHeader: "#ffff5722"
readonly property color netPopupText: textMain
readonly property color netPopupDim: textDim
readonly property color netFieldBg: "#22ffffff"
readonly property color netCancelBgHover: "#22ffffff"
readonly property color netConnectText: "#ff0d140d"
readonly property color netApActiveBg: Qt.alpha(accent, 0.15)
readonly property color netApHoverBg: "#22ff5722"
readonly property color netDisconnectBg: Qt.alpha(statusErr, 0.18)
readonly property color netDisconnectBorder: Qt.alpha(statusErr, 0.45)
readonly property color netWiredOkBg: Qt.alpha(statusOk, 0.12)
readonly property color netWiredErrBg: Qt.alpha(statusErr, 0.12)
readonly property color netWiredOkBorder: Qt.alpha(statusOk, 0.4)
readonly property color netWiredErrBorder: Qt.alpha(statusErr, 0.4)
// ── Calendar Popup ─────────────────────────────────────────────────────────
readonly property color calCardBg: bgPopup
readonly property color calCardBorder: borderPopup
readonly property color calSeparator: separator
readonly property color clockPopupHeader: "#ffff5722"
readonly property color clockPopupText: textMain
readonly property color clockPopupDim: textDim
readonly property color clockPopupDate: textMain
readonly property color clockPopupUtc: textDim
readonly property color calArrowIcon: textDim
readonly property color calArrowIconHover: "#ffff5722"
readonly property color calArrowBg: "transparent"
readonly property color calArrowBgHover: "#22ff5722"
readonly property color calArrowBgPress: "#ffff5722"
// ── Workspace Module ───────────────────────────────────────────────────────
readonly property color wsPanelBg: bgPanel
readonly property color wsPanelBorder: "transparent"
readonly property color wsActiveBg: accent
readonly property color wsInactiveBg: "#15ffffff"
readonly property color wsHoverBg: "#332e7d32"
readonly property color wsActiveText: "#ff0d140d"
readonly property color wsInactiveText: textMain
readonly property color wsHoverText: "#ffffffff"
// ── Tray Module ────────────────────────────────────────────────────────────
readonly property color trayBg: bgPanel
readonly property color trayBgHover: "#11ffffff"
readonly property color trayBorder: border
readonly property color trayBorderHover: "#22ffffff"
readonly property color trayIcon: textMain
// ── Tray Context Menu ──────────────────────────────────────────────────────
readonly property color trayMenuBg: bgPopup
readonly property color trayMenuBorder: borderPopup
readonly property color trayMenuText: textMain
readonly property color trayMenuDim: textDim
readonly property color trayMenuHover: "#22ff5722"
readonly property color trayMenuCheck: accent
readonly property color trayMenuSeparator: separator
// ── Launcher (Variation: Forest Shade) ───────────────────────────────────
readonly property color launcherBg: bgPopup
readonly property color launcherBorder: borderPopup
readonly property color launcherInput: "#440d140d"
readonly property color launcherInputBorderFocus: accent
readonly property color launcherPill: "#442e7d32"
readonly property color launcherText: textMain
readonly property color launcherDim: textDim
readonly property color launcherAccent: accent
readonly property color launcherHover: "#22ff5722"
readonly property color launcherSelected: "#44ff5722"
readonly property color launcherModeActiveText: "#ffffffff"
readonly property color launcherModeActiveBg: accent
// ── Status Colors ──────────────────────────────────────────────────────────
readonly property color statusOk: "#ff8bc34a" // Leaf green
readonly property color statusWarn: "#ffffa726" // Amber
readonly property color statusErr: "#fff44336" // Red bird feather
readonly property color statusInfo: "#ff90caf9" // Bokeh sky blue
// ── Notifications Module ───────────────────────────────────────────────────
readonly property color notifBg: bgPanel
readonly property color notifBgHover: "#11ffffff"
readonly property color notifBorder: border
readonly property color notifBorderActive: accent
readonly property color notifIcon: textMain
readonly property color notifIconActive: accent
readonly property color notifBadgeBg: statusErr
readonly property color notifBadgeText: "#ffffffff"
readonly property color notifSeparator: separator
readonly property color notifDnd: separator
// ── Toast cards (Variation: Canopy Glow) ─────────────────────────────────────
readonly property color notifToastBg: bgPopup
readonly property color notifToastBgHover: "#22ffffff"
readonly property color notifToastBorder: borderPopup
readonly property color notifToastText: textMain
readonly property color notifToastDim: textDim
readonly property color notifToastAppName: "#ff90caf9"
// ── Urgency colours ────────────────────────────────────────────────────────
readonly property color notifUrgencyCritical: statusErr
readonly property color notifUrgencyNormal: statusInfo
readonly property color notifUrgencyLow: textDim
// ── Progress bar ───────────────────────────────────────────────────────────
readonly property color notifProgressBg: "#22ffffff"
readonly property color notifProgressFill: accent
// ── History popup ──────────────────────────────────────────────────────────
readonly property color notifHistoryBg: bgPopup
readonly property color notifHistoryBorder: borderPopup
readonly property color notifHistoryHover: "#11ff5722"
readonly property color notifHistoryEmpty: textDim
// ── BgDate Module ──────────────────────────────────────────────────────────
readonly property color bgDateText: "#ffffffff"
readonly property color bgDateShadow: "#aa000000"
readonly property color bgDateSecondsText: "#ffff5722"
// ── Crypto Module ──────────────────────────────────────────────────────────
readonly property color cryptoBg: bgPanel
readonly property color cryptoBgHover: "#15ffffff"
readonly property color cryptoBorder: border
readonly property color cryptoBorderHover: accent
readonly property color cryptoIcon: accent
readonly property color cryptoLabel: textDim
readonly property color cryptoValue: textMain
readonly property color cryptoUp: "#ff8bc34a"
readonly property color cryptoDown: "#fff44336"
readonly property color cryptoPopupBg: bgPopup
readonly property color cryptoPopupBorder: borderPopup
readonly property color cryptoPopupHeader: "#ffff5722"
readonly property color cryptoPopupText: textMain
readonly property color cryptoPopupDim: textDim
readonly property color cryptoUpBg: Qt.rgba(cryptoUp.r, cryptoUp.g, cryptoUp.b, 0.13)
readonly property color cryptoDownBg: Qt.rgba(cryptoDown.r, cryptoDown.g, cryptoDown.b, 0.13)
readonly property color cryptoChipRemoveBg: Qt.rgba(cryptoDown.r, cryptoDown.g, cryptoDown.b, 0.27)
readonly property color cryptoApplyIdleBg: Qt.rgba(accent.r, accent.g, accent.b, 0.20)
// ── Polkit Dialog ──────────────────────────────────────────────────────────
readonly property color polkitOverlayBg: "#bb000000"
readonly property color polkitCardBg: bgPopup
readonly property color polkitCardBorder: border
readonly property color polkitIconBg: "#1eff5722"
readonly property color polkitIconBorder: "#44ff5722"
readonly property color polkitIconColor: accent
readonly property color polkitTitle: textMain
readonly property color polkitMessage: "#cce1f8e9"
readonly property color polkitPillBg: "#1a2e7d32"
readonly property color polkitPillText: "#66a5ad94"
readonly property color polkitDivider: "#332e7d32"
readonly property color polkitSuppErrBg: "#1af44336"
readonly property color polkitSuppErrBorder: "#44f44336"
readonly property color polkitSuppErrText: statusErr
readonly property color polkitSuppOkBg: "#1a8bc34a"
readonly property color polkitSuppOkBorder: "#448bc34a"
readonly property color polkitSuppOkText: statusOk
readonly property color polkitFieldBg: "#440d140d"
readonly property color polkitFieldBorder: "#22ffffff"
readonly property color polkitFieldBorderFocus: accent
readonly property color polkitUserLabel: "#99a5ad94"
readonly property color polkitUserValue: accent
readonly property color polkitInputPrompt: "#88a5ad94"
readonly property color polkitInputText: textMain
readonly property color polkitInputSelection: "#55ff5722"
readonly property color polkitInputSelectedText: bg
readonly property color polkitEyeIcon: "#66a5ad94"
readonly property color polkitEyeIconHover: accent
readonly property color polkitAuthBg: "#ddff5722"
readonly property color polkitAuthBgHover: accent
readonly property color polkitAuthText: bg
readonly property color polkitCancelBg: "#0dffffff"
readonly property color polkitCancelBgHover: "#22ffffff"
readonly property color polkitCancelBorder: "#22ffffff"
readonly property color polkitCancelText: "#cce1f8e9"
}

View File

@@ -30,13 +30,12 @@ QtObject {
readonly property color borderToday: accent
// ── ArchLogo Module ────────────────────────────────────────────────────────
readonly property color archLogoBg: bgPanel
readonly property color archLogoBgHover: "#22ffffff"
readonly property color archLogoHover: accent
readonly property color archLogoBorder: border
readonly property color archLogoBorderActive: accent
readonly property color archLogoIcon: textMain
readonly property color archLogoIconActive: accent
readonly property color logoBg: bgPanel
readonly property color logoBgHover: "#22ffffff"
readonly property color logoBorder: border
readonly property color logoBorderActive: accent
readonly property color logoIcon: textMain
readonly property color logoIconActive: accent
// ── Stats Module (Variation: Night City Lights) ───────────────────────────
readonly property color statsBg: bgPanel
@@ -46,7 +45,6 @@ QtObject {
readonly property color statsCpuColor: "#ffffb86c" // Streetlight gold
readonly property color statsMemColor: "#ff9ece6a" // Train stripe green
readonly property color statsDiskColor: "#ff7dcfff" // Cyan window light
readonly property color statsGpuColor: "#fff7768e" // Traffic taillight red
readonly property color statsTrackColor: "#15ffffff"
// ── Volume Module (Variation: Urban Sound) ────────────────────────────────
@@ -72,15 +70,55 @@ QtObject {
readonly property color clockTime: textMain
readonly property color clockSeconds: "#ff9ece6a" // Subtle green pulse
readonly property color clockIcon: accent
readonly property color clockSeparator: separator
readonly property color clockText: textMain
readonly property color clockShadow: "#66000000"
// ── Battery Module ────────────────────────────────────────────────────────
readonly property color batteryFull: accent
readonly property color batteryCharging: accent
readonly property color batteryCritical: statusErr
readonly property color batteryLow: statusWarn
readonly property color batteryIcon: clockIcon
readonly property color batBg: bgPanel
readonly property color batBgHover: "#11ffffff"
readonly property color batBorder: border
readonly property color batBorderHover: accent
readonly property color batText: textMain
readonly property color batPopupBg: bgPopup
readonly property color batPopupBorder: borderPopup
readonly property color batPopupSeparator: separator
readonly property color batPopupHeader: "#ffffb86c"
readonly property color batPopupText: textMain
readonly property color batPopupDim: textDim
readonly property color batProgressTrack: separator
readonly property color batProfileActiveText: bg
// ── Network Module ────────────────────────────────────────────────────────
readonly property color netBg: bgPanel
readonly property color netBgHover: "#11ffffff"
readonly property color netBorder: border
readonly property color netBorderHover: accent
readonly property color netText: textMain
readonly property color netPopupBg: bgPopup
readonly property color netPopupBorder: borderPopup
readonly property color netPopupSeparator: separator
readonly property color netPopupHeader: "#ffffb86c"
readonly property color netPopupText: textMain
readonly property color netPopupDim: textDim
readonly property color netFieldBg: "#22ffffff"
readonly property color netCancelBgHover: "#22ffffff"
readonly property color netConnectText: "#ff0d1117"
readonly property color netApActiveBg: Qt.alpha(accent, 0.15)
readonly property color netApHoverBg: calArrowBgHover
readonly property color netDisconnectBg: Qt.alpha(statusErr, 0.18)
readonly property color netDisconnectBorder: Qt.alpha(statusErr, 0.45)
readonly property color netWiredOkBg: Qt.alpha(statusOk, 0.12)
readonly property color netWiredErrBg: Qt.alpha(statusErr, 0.12)
readonly property color netWiredOkBorder: Qt.alpha(statusOk, 0.4)
readonly property color netWiredErrBorder: Qt.alpha(statusErr, 0.4)
// ── Calendar Popup ─────────────────────────────────────────────────────────
readonly property color calCardBg: bgPopup
readonly property color calCardBorder: borderPopup
readonly property color calSeparator: separator
readonly property color calShadow: "#aa000000"
readonly property color clockPopupHeader: "#ffffb86c"
readonly property color clockPopupText: textMain
readonly property color clockPopupDim: textDim
@@ -138,7 +176,6 @@ QtObject {
readonly property color notifToastBg: bgPopup
readonly property color notifToastBgHover: "#22ffffff"
readonly property color notifToastBorder: borderPopup
readonly property color notifToastShadow: "#88000000"
readonly property color notifToastText: textMain
readonly property color notifToastDim: textDim
readonly property color notifToastAppName: "#ff7dcfff"
@@ -155,11 +192,10 @@ QtObject {
// ── History popup ──────────────────────────────────────────────────────────
readonly property color notifHistoryBg: bgPopup
readonly property color notifHistoryBorder: "#44ffb86c"
readonly property color notifHistoryShadow: "#aa000000"
readonly property color notifHistoryHover: "#11ffb86c"
readonly property color notifHistoryEmpty: textDim
// new variables adaptated
// new variables adapted
readonly property color frameBorder: "transparent"
readonly property color clockPopupDate: textMain
readonly property color clockPopupUtc: textDim
@@ -169,8 +205,96 @@ QtObject {
readonly property color calArrowBgHover: "#22ffb86c"
readonly property color calArrowBgPress: accent
// ── Crypto Module ──────────────────────────────────────────────────────────
readonly property color cryptoBg: bgPanel
readonly property color cryptoBgHover: "#15ffffff"
readonly property color cryptoBorder: border
readonly property color cryptoBorderHover: accent
readonly property color cryptoIcon: accent
readonly property color cryptoLabel: textDim
readonly property color cryptoValue: textMain
readonly property color cryptoUp: statusOk
readonly property color cryptoDown: statusErr
readonly property color cryptoPopupBg: bgPopup
readonly property color cryptoPopupBorder: borderPopup
readonly property color cryptoPopupHeader: accent
readonly property color cryptoPopupText: textMain
readonly property color cryptoPopupDim: textDim
// Tinted surfaces (derived from main colours)
readonly property color cryptoUpBg: Qt.rgba(cryptoUp.r, cryptoUp.g, cryptoUp.b, 0.13)
readonly property color cryptoDownBg: Qt.rgba(cryptoDown.r, cryptoDown.g, cryptoDown.b, 0.13)
readonly property color cryptoChipRemoveBg: Qt.rgba(cryptoDown.r, cryptoDown.g, cryptoDown.b, 0.27)
readonly property color cryptoApplyIdleBg: Qt.rgba(accent.r, accent.g, accent.b, 0.20)
// ── BgDate Module ──────────────────────────────────────────────────────────
readonly property color bgDateText: textMain
readonly property color bgDateShadow: "#aa000000"
readonly property color bgDateSecondsText: textMain
// ── Polkit Dialog ──────────────────────────────────────────────────────────
// Overlay
readonly property color polkitOverlayBg: "#bb000000"
// Card chrome
readonly property color polkitCardBg: bgPopup
readonly property color polkitCardBorder: Qt.rgba(accent.r, accent.g, accent.b, 0.16)
// Lock icon
readonly property color polkitIconBg: Qt.rgba(accent.r, accent.g, accent.b, 0.12)
readonly property color polkitIconBorder: Qt.rgba(accent.r, accent.g, accent.b, 0.27)
readonly property color polkitIconColor: accent
// Text hierarchy
readonly property color polkitTitle: textMain
readonly property color polkitMessage: textMain
// Action-ID pill
readonly property color polkitPillBg: Qt.rgba(textDim.r, textDim.g, textDim.b, 0.10)
readonly property color polkitPillText: textDim
// Divider
readonly property color polkitDivider: separator
// Supplementary message — error state
readonly property color polkitSuppErrBg: Qt.rgba(statusErr.r, statusErr.g, statusErr.b, 0.10)
readonly property color polkitSuppErrBorder: Qt.rgba(statusErr.r, statusErr.g, statusErr.b, 0.27)
readonly property color polkitSuppErrText: statusErr
// Supplementary message — info / ok state
readonly property color polkitSuppOkBg: Qt.rgba(statusOk.r, statusOk.g, statusOk.b, 0.10)
readonly property color polkitSuppOkBorder: Qt.rgba(statusOk.r, statusOk.g, statusOk.b, 0.27)
readonly property color polkitSuppOkText: statusOk
// Fields (password input & identity selector)
readonly property color polkitFieldBg: launcherInput
readonly property color polkitFieldBorder: "#22ffffff"
readonly property color polkitFieldBorderFocus: accent
// Identity selector text
readonly property color polkitUserLabel: textDim
readonly property color polkitUserValue: accent
// Input prompt label above password field
readonly property color polkitInputPrompt: textDim
// TextInput inside password field
readonly property color polkitInputText: textMain
readonly property color polkitInputSelection: Qt.rgba(accent.r, accent.g, accent.b, 0.33)
readonly property color polkitInputSelectedText: bg
// Eye / show-password toggle
readonly property color polkitEyeIcon: textDim
readonly property color polkitEyeIconHover: accent
// Authenticate button
readonly property color polkitAuthBg: accent
readonly property color polkitAuthBgHover: Qt.lighter(accent, 1.15)
readonly property color polkitAuthText: bg
// Cancel button
readonly property color polkitCancelBg: "transparent"
readonly property color polkitCancelBgHover: "#22ffffff"
readonly property color polkitCancelBorder: "#22ffffff"
readonly property color polkitCancelText: textDim
}

View File

@@ -29,13 +29,12 @@ QtObject {
readonly property color borderToday: accent
// ── ArchLogo Module ────────────────────────────────────────────────────────
readonly property color archLogoBg: bgPanel
readonly property color archLogoBgHover: "#22ffffff"
readonly property color archLogoHover: accent
readonly property color archLogoBorder: border
readonly property color archLogoBorderActive: accent
readonly property color archLogoIcon: textMain
readonly property color archLogoIconActive: accent
readonly property color logoBg: bgPanel
readonly property color logoBgHover: "#22ffffff"
readonly property color logoBorder: border
readonly property color logoBorderActive: accent
readonly property color logoIcon: textMain
readonly property color logoIconActive: accent
// ── Stats Module (Variation: Cyan/Blue) ────────────────────────────────────
readonly property color statsBg: bgPanel
@@ -45,7 +44,6 @@ QtObject {
readonly property color statsCpuColor: "#ff9ccfd8" // Light Blue
readonly property color statsMemColor: "#ffc4a7e7" // Soft Purple
readonly property color statsDiskColor: "#ffebbcba" // Muted Rose
readonly property color statsGpuColor: accent
readonly property color statsTrackColor: "#15ffffff"
// ── Volume Module (Variation: Violet) ──────────────────────────────────────
@@ -71,15 +69,55 @@ QtObject {
readonly property color clockTime: textMain
readonly property color clockSeconds: "#ffeb6f92" // Pink seconds
readonly property color clockIcon: accent
readonly property color clockSeparator: separator
readonly property color clockText: textMain
readonly property color clockShadow: "#22000000"
// ── Battery Module ────────────────────────────────────────────────────────
readonly property color batteryFull: accent
readonly property color batteryCharging: accent
readonly property color batteryCritical: statusErr
readonly property color batteryLow: statusWarn
readonly property color batteryIcon: clockIcon
readonly property color batBg: bgPanel
readonly property color batBgHover: "#22ffffff"
readonly property color batBorder: border
readonly property color batBorderHover: accent
readonly property color batText: textMain
readonly property color batPopupBg: bgPopup
readonly property color batPopupBorder: borderPopup
readonly property color batPopupSeparator: separator
readonly property color batPopupHeader: "#ff9ccfd8"
readonly property color batPopupText: textMain
readonly property color batPopupDim: textDim
readonly property color batProgressTrack: separator
readonly property color batProfileActiveText: bg
// ── Network Module ────────────────────────────────────────────────────────
readonly property color netBg: bgPanel
readonly property color netBgHover: "#22ffffff"
readonly property color netBorder: border
readonly property color netBorderHover: accent
readonly property color netText: textMain
readonly property color netPopupBg: bgPopup
readonly property color netPopupBorder: borderPopup
readonly property color netPopupSeparator: separator
readonly property color netPopupHeader: "#ff9ccfd8"
readonly property color netPopupText: textMain
readonly property color netPopupDim: textDim
readonly property color netFieldBg: "#22ffffff"
readonly property color netCancelBgHover: "#22ffffff"
readonly property color netConnectText: "#ff0d0b1c"
readonly property color netApActiveBg: Qt.alpha(accent, 0.15)
readonly property color netApHoverBg: calArrowBgHover
readonly property color netDisconnectBg: Qt.alpha(statusErr, 0.18)
readonly property color netDisconnectBorder: Qt.alpha(statusErr, 0.45)
readonly property color netWiredOkBg: Qt.alpha(statusOk, 0.12)
readonly property color netWiredErrBg: Qt.alpha(statusErr, 0.12)
readonly property color netWiredOkBorder: Qt.alpha(statusOk, 0.4)
readonly property color netWiredErrBorder: Qt.alpha(statusErr, 0.4)
// ── Calendar Popup ─────────────────────────────────────────────────────────
readonly property color calCardBg: bgPopup
readonly property color calCardBorder: borderPopup
readonly property color calSeparator: separator
readonly property color calShadow: "#44000000"
readonly property color clockPopupHeader: "#ff9ccfd8" // Blue header
readonly property color clockPopupText: textMain
readonly property color clockPopupDim: "#ff6e6a86"
@@ -131,12 +169,12 @@ QtObject {
readonly property color notifBadgeBg: "#ffeb6f92"
readonly property color notifBadgeText: "#ff0d0b1c"
readonly property color notifSeparator: separator
readonly property color notifDnd: separator
// ── Toast cards ────────────────────────────────────────────────────────────
readonly property color notifToastBg: bgPopup
readonly property color notifToastBgHover: "#443b224c"
readonly property color notifToastBorder: borderPopup
readonly property color notifToastShadow: "#33000000"
readonly property color notifToastText: textMain
readonly property color notifToastDim: "#ff908caa"
readonly property color notifToastAppName: "#ffc4a7e7" // Violet App name
@@ -153,11 +191,10 @@ QtObject {
// ── History popup ──────────────────────────────────────────────────────────
readonly property color notifHistoryBg: bgPopup
readonly property color notifHistoryBorder: "#33c4a7e7"
readonly property color notifHistoryShadow: "#33000000"
readonly property color notifHistoryHover: "#22c4a7e7"
readonly property color notifHistoryEmpty: "#ff6e6a86"
// new variables adaptated
// new variables adapted
readonly property color frameBorder: "transparent"
readonly property color clockPopupDate: textMain
readonly property color clockPopupUtc: textDim
@@ -167,8 +204,96 @@ QtObject {
readonly property color calArrowBgHover: "#22ff2e97"
readonly property color calArrowBgPress: accent
// ── Crypto Module ──────────────────────────────────────────────────────────
readonly property color cryptoBg: bgPanel
readonly property color cryptoBgHover: "#15ffffff"
readonly property color cryptoBorder: border
readonly property color cryptoBorderHover: accent
readonly property color cryptoIcon: accent
readonly property color cryptoLabel: textDim
readonly property color cryptoValue: textMain
readonly property color cryptoUp: statusOk
readonly property color cryptoDown: statusErr
readonly property color cryptoPopupBg: bgPopup
readonly property color cryptoPopupBorder: borderPopup
readonly property color cryptoPopupHeader: accent
readonly property color cryptoPopupText: textMain
readonly property color cryptoPopupDim: textDim
// Tinted surfaces (derived from main colours)
readonly property color cryptoUpBg: Qt.rgba(cryptoUp.r, cryptoUp.g, cryptoUp.b, 0.13)
readonly property color cryptoDownBg: Qt.rgba(cryptoDown.r, cryptoDown.g, cryptoDown.b, 0.13)
readonly property color cryptoChipRemoveBg: Qt.rgba(cryptoDown.r, cryptoDown.g, cryptoDown.b, 0.27)
readonly property color cryptoApplyIdleBg: Qt.rgba(accent.r, accent.g, accent.b, 0.20)
// ── BgDate Module ──────────────────────────────────────────────────────────
readonly property color bgDateText: textMain
readonly property color bgDateShadow: "#44000000"
readonly property color bgDateSecondsText: textMain
// ── Polkit Dialog ──────────────────────────────────────────────────────────
// Overlay
readonly property color polkitOverlayBg: "#bb000000"
// Card chrome
readonly property color polkitCardBg: bgPopup
readonly property color polkitCardBorder: Qt.rgba(accent.r, accent.g, accent.b, 0.16)
// Lock icon
readonly property color polkitIconBg: Qt.rgba(accent.r, accent.g, accent.b, 0.12)
readonly property color polkitIconBorder: Qt.rgba(accent.r, accent.g, accent.b, 0.27)
readonly property color polkitIconColor: accent
// Text hierarchy
readonly property color polkitTitle: textMain
readonly property color polkitMessage: textMain
// Action-ID pill
readonly property color polkitPillBg: Qt.rgba(textDim.r, textDim.g, textDim.b, 0.10)
readonly property color polkitPillText: textDim
// Divider
readonly property color polkitDivider: separator
// Supplementary message — error state
readonly property color polkitSuppErrBg: Qt.rgba(statusErr.r, statusErr.g, statusErr.b, 0.10)
readonly property color polkitSuppErrBorder: Qt.rgba(statusErr.r, statusErr.g, statusErr.b, 0.27)
readonly property color polkitSuppErrText: statusErr
// Supplementary message — info / ok state
readonly property color polkitSuppOkBg: Qt.rgba(statusOk.r, statusOk.g, statusOk.b, 0.10)
readonly property color polkitSuppOkBorder: Qt.rgba(statusOk.r, statusOk.g, statusOk.b, 0.27)
readonly property color polkitSuppOkText: statusOk
// Fields (password input & identity selector)
readonly property color polkitFieldBg: launcherInput
readonly property color polkitFieldBorder: "#22ffffff"
readonly property color polkitFieldBorderFocus: accent
// Identity selector text
readonly property color polkitUserLabel: textDim
readonly property color polkitUserValue: accent
// Input prompt label above password field
readonly property color polkitInputPrompt: textDim
// TextInput inside password field
readonly property color polkitInputText: textMain
readonly property color polkitInputSelection: Qt.rgba(accent.r, accent.g, accent.b, 0.33)
readonly property color polkitInputSelectedText: bg
// Eye / show-password toggle
readonly property color polkitEyeIcon: textDim
readonly property color polkitEyeIconHover: accent
// Authenticate button
readonly property color polkitAuthBg: accent
readonly property color polkitAuthBgHover: Qt.lighter(accent, 1.15)
readonly property color polkitAuthText: bg
// Cancel button
readonly property color polkitCancelBg: "transparent"
readonly property color polkitCancelBgHover: "#22ffffff"
readonly property color polkitCancelBorder: "#22ffffff"
readonly property color polkitCancelText: textDim
}

View File

@@ -10,9 +10,6 @@ singleton Aero 1.0 aero.qml
singleton Supreme 1.0 supreme.qml
singleton Metropolitan 1.0 metropolitan.qml
singleton Goldencity 1.0 goldencity.qml
singleton Hummingbird 1.0 hummingbird.qml
singleton Tropicalnight 1.0 tropicalnight.qml

View File

@@ -29,13 +29,12 @@ QtObject {
readonly property color borderToday: accent
// ── ArchLogo Module ────────────────────────────────────────────────────────
readonly property color archLogoBg: bgPanel
readonly property color archLogoBgHover: "#22ffffff"
readonly property color archLogoHover: accent
readonly property color archLogoBorder: border
readonly property color archLogoBorderActive: accent
readonly property color archLogoIcon: textMain
readonly property color archLogoIconActive: accent
readonly property color logoBg: bgPanel
readonly property color logoBgHover: "#22ffffff"
readonly property color logoBorder: border
readonly property color logoBorderActive: accent
readonly property color logoIcon: textMain
readonly property color logoIconActive: accent
// ── Stats Module (Candy Tones) ─────────────────────────────────────────────
readonly property color statsBg: bgPanel
@@ -45,7 +44,6 @@ QtObject {
readonly property color statsCpuColor: "#ffff7eb9" // Hot pink
readonly property color statsMemColor: "#ffee99ff" // Soft purple
readonly property color statsDiskColor: "#ff70c5ce" // Cyan pop
readonly property color statsGpuColor: "#ffff9a9e" // Pastel coral
readonly property color statsTrackColor: "#15ffffff"
// ── Volume Module (Berry Glass) ───────────────────────────────────────────
@@ -71,15 +69,55 @@ QtObject {
readonly property color clockTime: textMain
readonly property color clockSeconds: "#ffff9a9e" // Pastel peach
readonly property color clockIcon: accent
readonly property color clockSeparator: separator
readonly property color clockText: textMain
readonly property color clockShadow: "#442d1621"
// ── Battery Module ────────────────────────────────────────────────────────
readonly property color batteryFull: accent
readonly property color batteryCharging: accent
readonly property color batteryCritical: statusErr
readonly property color batteryLow: statusWarn
readonly property color batteryIcon: clockIcon
readonly property color batBg: bgPanel
readonly property color batBgHover: "#11ffffff"
readonly property color batBorder: border
readonly property color batBorderHover: accent
readonly property color batText: textMain
readonly property color batPopupBg: bgPopup
readonly property color batPopupBorder: borderPopup
readonly property color batPopupSeparator: separator
readonly property color batPopupHeader: "#ffff7eb9"
readonly property color batPopupText: textMain
readonly property color batPopupDim: textDim
readonly property color batProgressTrack: separator
readonly property color batProfileActiveText: bg
// ── Network Module ────────────────────────────────────────────────────────
readonly property color netBg: bgPanel
readonly property color netBgHover: "#11ffffff"
readonly property color netBorder: border
readonly property color netBorderHover: accent
readonly property color netText: textMain
readonly property color netPopupBg: bgPopup
readonly property color netPopupBorder: borderPopup
readonly property color netPopupSeparator: separator
readonly property color netPopupHeader: "#ffff7eb9"
readonly property color netPopupText: textMain
readonly property color netPopupDim: textDim
readonly property color netFieldBg: "#22ffffff"
readonly property color netCancelBgHover: "#22ffffff"
readonly property color netConnectText: "#ff2d1621"
readonly property color netApActiveBg: Qt.alpha(accent, 0.15)
readonly property color netApHoverBg: calArrowBgHover
readonly property color netDisconnectBg: Qt.alpha(statusErr, 0.18)
readonly property color netDisconnectBorder: Qt.alpha(statusErr, 0.45)
readonly property color netWiredOkBg: Qt.alpha(statusOk, 0.12)
readonly property color netWiredErrBg: Qt.alpha(statusErr, 0.12)
readonly property color netWiredOkBorder: Qt.alpha(statusOk, 0.4)
readonly property color netWiredErrBorder: Qt.alpha(statusErr, 0.4)
// ── Calendar Popup ─────────────────────────────────────────────────────────
readonly property color calCardBg: bgPopup
readonly property color calCardBorder: borderPopup
readonly property color calSeparator: separator
readonly property color calShadow: "#662d1621"
readonly property color clockPopupHeader: "#ffff7eb9"
readonly property color clockPopupText: textMain
readonly property color clockPopupDim: textDim
@@ -137,7 +175,6 @@ QtObject {
readonly property color notifToastBg: bgPopup
readonly property color notifToastBgHover: "#22ffffff"
readonly property color notifToastBorder: borderPopup
readonly property color notifToastShadow: "#442d1621"
readonly property color notifToastText: textMain
readonly property color notifToastDim: textDim
readonly property color notifToastAppName: "#ffff7eb9"
@@ -154,11 +191,10 @@ QtObject {
// ── History popup ──────────────────────────────────────────────────────────
readonly property color notifHistoryBg: bgPopup
readonly property color notifHistoryBorder: "#33ff7eb9"
readonly property color notifHistoryShadow: "#552d1621"
readonly property color notifHistoryHover: "#11ff7eb9"
readonly property color notifHistoryEmpty: textDim
// new variables adaptated
// new variables adapted
readonly property color frameBorder: "transparent"
readonly property color clockPopupDate: textMain
readonly property color clockPopupUtc: textDim
@@ -168,8 +204,96 @@ QtObject {
readonly property color calArrowBgHover: "#22ff7eb9"
readonly property color calArrowBgPress: accent
// ── Crypto Module ──────────────────────────────────────────────────────────
readonly property color cryptoBg: bgPanel
readonly property color cryptoBgHover: "#15ffffff"
readonly property color cryptoBorder: border
readonly property color cryptoBorderHover: accent
readonly property color cryptoIcon: accent
readonly property color cryptoLabel: textDim
readonly property color cryptoValue: textMain
readonly property color cryptoUp: statusOk
readonly property color cryptoDown: statusErr
readonly property color cryptoPopupBg: bgPopup
readonly property color cryptoPopupBorder: borderPopup
readonly property color cryptoPopupHeader: accent
readonly property color cryptoPopupText: textMain
readonly property color cryptoPopupDim: textDim
// Tinted surfaces (derived from main colours)
readonly property color cryptoUpBg: Qt.rgba(cryptoUp.r, cryptoUp.g, cryptoUp.b, 0.13)
readonly property color cryptoDownBg: Qt.rgba(cryptoDown.r, cryptoDown.g, cryptoDown.b, 0.13)
readonly property color cryptoChipRemoveBg: Qt.rgba(cryptoDown.r, cryptoDown.g, cryptoDown.b, 0.27)
readonly property color cryptoApplyIdleBg: Qt.rgba(accent.r, accent.g, accent.b, 0.20)
// ── BgDate Module ──────────────────────────────────────────────────────────
readonly property color bgDateText: textMain
readonly property color bgDateShadow: "#662d1621"
readonly property color bgDateSecondsText: textMain
// ── Polkit Dialog ──────────────────────────────────────────────────────────
// Overlay
readonly property color polkitOverlayBg: "#bb000000"
// Card chrome
readonly property color polkitCardBg: bgPopup
readonly property color polkitCardBorder: Qt.rgba(accent.r, accent.g, accent.b, 0.16)
// Lock icon
readonly property color polkitIconBg: Qt.rgba(accent.r, accent.g, accent.b, 0.12)
readonly property color polkitIconBorder: Qt.rgba(accent.r, accent.g, accent.b, 0.27)
readonly property color polkitIconColor: accent
// Text hierarchy
readonly property color polkitTitle: textMain
readonly property color polkitMessage: textMain
// Action-ID pill
readonly property color polkitPillBg: Qt.rgba(textDim.r, textDim.g, textDim.b, 0.10)
readonly property color polkitPillText: textDim
// Divider
readonly property color polkitDivider: separator
// Supplementary message — error state
readonly property color polkitSuppErrBg: Qt.rgba(statusErr.r, statusErr.g, statusErr.b, 0.10)
readonly property color polkitSuppErrBorder: Qt.rgba(statusErr.r, statusErr.g, statusErr.b, 0.27)
readonly property color polkitSuppErrText: statusErr
// Supplementary message — info / ok state
readonly property color polkitSuppOkBg: Qt.rgba(statusOk.r, statusOk.g, statusOk.b, 0.10)
readonly property color polkitSuppOkBorder: Qt.rgba(statusOk.r, statusOk.g, statusOk.b, 0.27)
readonly property color polkitSuppOkText: statusOk
// Fields (password input & identity selector)
readonly property color polkitFieldBg: launcherInput
readonly property color polkitFieldBorder: "#22ffffff"
readonly property color polkitFieldBorderFocus: accent
// Identity selector text
readonly property color polkitUserLabel: textDim
readonly property color polkitUserValue: accent
// Input prompt label above password field
readonly property color polkitInputPrompt: textDim
// TextInput inside password field
readonly property color polkitInputText: textMain
readonly property color polkitInputSelection: Qt.rgba(accent.r, accent.g, accent.b, 0.33)
readonly property color polkitInputSelectedText: bg
// Eye / show-password toggle
readonly property color polkitEyeIcon: textDim
readonly property color polkitEyeIconHover: accent
// Authenticate button
readonly property color polkitAuthBg: accent
readonly property color polkitAuthBgHover: Qt.lighter(accent, 1.15)
readonly property color polkitAuthText: bg
// Cancel button
readonly property color polkitCancelBg: "transparent"
readonly property color polkitCancelBgHover: "#22ffffff"
readonly property color polkitCancelBorder: "#22ffffff"
readonly property color polkitCancelText: textDim
}

View File

@@ -0,0 +1,278 @@
pragma Singleton
import QtQuick
import Quickshell
QtObject {
id: theme
// ── Wallpaper ──────────────────────────────────────────────────────────────
readonly property string wallpaper: Quickshell.env("HOME") + "/.config/quickshell/wallpapers/tropicalnight.png"
// ── Base Backgrounds ───────────────────────────────────────────────────────
readonly property color bg: "#cc161a22" // Deep navy-black from silhouettes
readonly property color bgPanel: "transparent"
readonly property color bgPopup: bg
readonly property color bgFrame: bg
// ── Separators ────────────────────────────────────────────────────────────
readonly property color separator: "#334a5d6e" // Muted sky blue-gray
// ── Text ──────────────────────────────────────────────────────────────────
readonly property color textMain: "#ffe8eef2" // Bright moonlit white
readonly property color textDim: "#997a8996" // Hazy horizon gray
readonly property color todayText: "#ffffffff"
// ── Accent & Borders ──────────────────────────────────────────────────────
readonly property color accent: "#ff89b4fa" // Summer sky blue (Main Accent)
readonly property color border: "transparent"
readonly property color frameBorder: "transparent"
readonly property color borderPopup: "transparent"
readonly property color borderToday: accent
// ── Logo Module ────────────────────────────────────────────────────────
readonly property color logoBg: bgPanel
readonly property color logoBgHover: "#22ffffff"
readonly property color logoBorder: border
readonly property color logoBorderActive: accent
readonly property color logoIcon: textMain
readonly property color logoIconActive: accent
// ── Stats Module ──────────────────────────────────────────────────────────
readonly property color statsBg: bgPanel
readonly property color statsBorder: border
readonly property color statsText: "#ff7a8996"
readonly property color statsRingColor: accent
readonly property color statsCpuColor: "#ff89b4fa"
readonly property color statsMemColor: "#ffb4c9a1" // Soft moonlit green
readonly property color statsDiskColor: "#ff94e2d5"
readonly property color statsTrackColor: "#15ffffff"
// ── Volume Module ─────────────────────────────────────────────────────────
readonly property color volBg: bgPanel
readonly property color volBgHover: "#224a5d6e"
readonly property color volBorder: border
readonly property color volBorderHover: accent
readonly property color volPopupBg: bgPopup
readonly property color volPopupBorder: borderPopup
readonly property color volIcon: accent
readonly property color volIconMuted: "#ff5a6b78"
readonly property color volTrack: "#22ffffff"
readonly property color volHandle: accent
readonly property color volHandleBorder: "#33ffffff"
readonly property color volMuteBg: "#33f38ba8"
readonly property color volPickerHover: "#1589b4fa"
// ── Clock Module ───────────────────────────────────────────────────────────
readonly property color clockBg: bgPanel
readonly property color clockBgHover: "#11ffffff"
readonly property color clockBorder: border
readonly property color clockBorderHover: accent
readonly property color clockTime: textMain
readonly property color clockSeconds: "#ff89b4fa"
readonly property color clockIcon: accent
// ── Battery Module ────────────────────────────────────────────────────────
readonly property color batteryFull: accent
readonly property color batteryCharging: accent
readonly property color batteryCritical: statusErr
readonly property color batteryLow: statusWarn
readonly property color batteryIcon: clockIcon
readonly property color batBg: bgPanel
readonly property color batBgHover: "#11ffffff"
readonly property color batBorder: border
readonly property color batBorderHover: accent
readonly property color batText: textMain
readonly property color batPopupBg: bgPopup
readonly property color batPopupBorder: borderPopup
readonly property color batPopupSeparator: separator
readonly property color batPopupHeader: accent
readonly property color batPopupText: textMain
readonly property color batPopupDim: textDim
readonly property color batProgressTrack: separator
readonly property color batProfileActiveText: bg
// ── Network Module ────────────────────────────────────────────────────────
readonly property color netBg: bgPanel
readonly property color netBgHover: "#11ffffff"
readonly property color netBorder: border
readonly property color netBorderHover: accent
readonly property color netText: textMain
readonly property color netPopupBg: bgPopup
readonly property color netPopupBorder: borderPopup
readonly property color netPopupSeparator: separator
readonly property color netPopupHeader: accent
readonly property color netPopupText: textMain
readonly property color netPopupDim: textDim
readonly property color netFieldBg: "#22ffffff"
readonly property color netCancelBgHover: "#22ffffff"
readonly property color netConnectText: "#ff0c0e12"
readonly property color netApActiveBg: Qt.alpha(accent, 0.15)
readonly property color netApHoverBg: "#2289b4fa"
readonly property color netDisconnectBg: Qt.alpha(statusErr, 0.18)
readonly property color netDisconnectBorder: Qt.alpha(statusErr, 0.45)
readonly property color netWiredOkBg: Qt.alpha(statusOk, 0.12)
readonly property color netWiredErrBg: Qt.alpha(statusErr, 0.12)
readonly property color netWiredOkBorder: Qt.alpha(statusOk, 0.4)
readonly property color netWiredErrBorder: Qt.alpha(statusErr, 0.4)
// ── Calendar Popup ─────────────────────────────────────────────────────────
readonly property color calCardBg: bgPopup
readonly property color calCardBorder: borderPopup
readonly property color calSeparator: separator
readonly property color clockPopupHeader: accent
readonly property color clockPopupText: textMain
readonly property color clockPopupDim: textDim
readonly property color clockPopupDate: textMain
readonly property color clockPopupUtc: textDim
readonly property color calArrowIcon: textDim
readonly property color calArrowIconHover: accent
readonly property color calArrowBg: "transparent"
readonly property color calArrowBgHover: "#2289b4fa"
readonly property color calArrowBgPress: accent
// ── Workspace Module ───────────────────────────────────────────────────────
readonly property color wsPanelBg: bgPanel
readonly property color wsPanelBorder: "transparent"
readonly property color wsActiveBg: accent
readonly property color wsInactiveBg: "#15ffffff"
readonly property color wsHoverBg: "#334a5d6e"
readonly property color wsActiveText: "#ff0c0e12"
readonly property color wsInactiveText: textMain
readonly property color wsHoverText: "#ffffffff"
// ── Tray Module ────────────────────────────────────────────────────────────
readonly property color trayBg: bgPanel
readonly property color trayBgHover: "#11ffffff"
readonly property color trayBorder: border
readonly property color trayBorderHover: "#22ffffff"
readonly property color trayIcon: textMain
// ── Tray Context Menu ──────────────────────────────────────────────────────
readonly property color trayMenuBg: bgPopup
readonly property color trayMenuBorder: borderPopup
readonly property color trayMenuText: textMain
readonly property color trayMenuDim: textDim
readonly property color trayMenuHover: "#2289b4fa"
readonly property color trayMenuCheck: accent
readonly property color trayMenuSeparator: separator
// ── Launcher ──────────────────────────────────────────────────────────────
readonly property color launcherBg: bgPopup
readonly property color launcherBorder: borderPopup
readonly property color launcherInput: "#44080a0d"
readonly property color launcherInputBorderFocus: accent
readonly property color launcherPill: "#444a5d6e"
readonly property color launcherText: textMain
readonly property color launcherDim: textDim
readonly property color launcherAccent: accent
readonly property color launcherHover: "#2289b4fa"
readonly property color launcherSelected: "#4489b4fa"
readonly property color launcherModeActiveText: "#ffffffff"
readonly property color launcherModeActiveBg: accent
// ── Status Colors ──────────────────────────────────────────────────────────
readonly property color statusOk: "#ffb4c9a1"
readonly property color statusWarn: "#ff89b4fa"
readonly property color statusErr: "#fff38ba8"
readonly property color statusInfo: "#ff89b4fa"
// ── Notifications Module ───────────────────────────────────────────────────
readonly property color notifBg: bgPanel
readonly property color notifBgHover: "#11ffffff"
readonly property color notifBorder: border
readonly property color notifBorderActive: accent
readonly property color notifIcon: textMain
readonly property color notifIconActive: accent
readonly property color notifBadgeBg: statusErr
readonly property color notifBadgeText: "#ffffffff"
readonly property color notifSeparator: separator
readonly property color notifDnd: separator
// ── Toast cards ────────────────────────────────────────────────────────────
readonly property color notifToastBg: bgPopup
readonly property color notifToastBgHover: "#22ffffff"
readonly property color notifToastBorder: borderPopup
readonly property color notifToastText: textMain
readonly property color notifToastDim: textDim
readonly property color notifToastAppName: "#ff89b4fa"
// ── Urgency colours ────────────────────────────────────────────────────────
readonly property color notifUrgencyCritical: statusErr
readonly property color notifUrgencyNormal: statusInfo
readonly property color notifUrgencyLow: textDim
// ── Progress bar ───────────────────────────────────────────────────────────
readonly property color notifProgressBg: "#22ffffff"
readonly property color notifProgressFill: accent
// ── History popup ──────────────────────────────────────────────────────────
readonly property color notifHistoryBg: bgPopup
readonly property color notifHistoryBorder: borderPopup
readonly property color notifHistoryHover: "#1189b4fa"
readonly property color notifHistoryEmpty: textDim
// ── BgDate Module ──────────────────────────────────────────────────────────
readonly property color bgDateText: accent
readonly property color bgDateShadow: "#88000000"
readonly property color bgDateSecondsText: accent
// ── Crypto Module ──────────────────────────────────────────────────────────
readonly property color cryptoBg: bgPanel
readonly property color cryptoBgHover: "#15ffffff"
readonly property color cryptoBorder: border
readonly property color cryptoBorderHover: accent
readonly property color cryptoIcon: accent
readonly property color cryptoLabel: textDim
readonly property color cryptoValue: textMain
readonly property color cryptoUp: "#ffb4c9a1"
readonly property color cryptoDown: "#fff38ba8"
readonly property color cryptoPopupBg: bgPopup
readonly property color cryptoPopupBorder: borderPopup
readonly property color cryptoPopupHeader: accent
readonly property color cryptoPopupText: textMain
readonly property color cryptoPopupDim: textDim
readonly property color cryptoUpBg: Qt.rgba(cryptoUp.r, cryptoUp.g, cryptoUp.b, 0.13)
readonly property color cryptoDownBg: Qt.rgba(cryptoDown.r, cryptoDown.g, cryptoDown.b, 0.13)
readonly property color cryptoChipRemoveBg: Qt.rgba(cryptoDown.r, cryptoDown.g, cryptoDown.b, 0.27)
readonly property color cryptoApplyIdleBg: Qt.rgba(accent.r, accent.g, accent.b, 0.20)
// ── Polkit Dialog ──────────────────────────────────────────────────────────
readonly property color polkitOverlayBg: "#bb000000"
readonly property color polkitCardBg: bgPopup
readonly property color polkitCardBorder: border
readonly property color polkitIconBg: "#1e89b4fa"
readonly property color polkitIconBorder: "#4489b4fa"
readonly property color polkitIconColor: accent
readonly property color polkitTitle: textMain
readonly property color polkitMessage: "#cce8eef2"
readonly property color polkitPillBg: "#1a4a5d6e"
readonly property color polkitPillText: "#667a8996"
readonly property color polkitDivider: "#334a5d6e"
readonly property color polkitSuppErrBg: "#1af38ba8"
readonly property color polkitSuppErrBorder: "#44f38ba8"
readonly property color polkitSuppErrText: statusErr
readonly property color polkitSuppOkBg: "#1ab4c9a1"
readonly property color polkitSuppOkBorder: "#44b4c9a1"
readonly property color polkitSuppOkText: statusOk
readonly property color polkitFieldBg: "#44080a0d"
readonly property color polkitFieldBorder: "#22ffffff"
readonly property color polkitFieldBorderFocus: accent
readonly property color polkitUserLabel: "#997a8996"
readonly property color polkitUserValue: accent
readonly property color polkitInputPrompt: "#887a8996"
readonly property color polkitInputText: textMain
readonly property color polkitInputSelection: "#5589b4fa"
readonly property color polkitInputSelectedText: bg
readonly property color polkitEyeIcon: "#667a8996"
readonly property color polkitEyeIconHover: accent
readonly property color polkitAuthBg: "#dd89b4fa"
readonly property color polkitAuthBgHover: accent
readonly property color polkitAuthText: bg
readonly property color polkitCancelBg: "#0dffffff"
readonly property color polkitCancelBgHover: "#22ffffff"
readonly property color polkitCancelBorder: "#22ffffff"
readonly property color polkitCancelText: "#cce8eef2"
}

View File

@@ -80,7 +80,6 @@ PanelWindow {
}
function shellQuote(str) {
// POSIX single-quote escaping: wrap in ' and replace every ' with '\''
return "'" + str.replace(/'/g, "'\\''") + "'"
}

544
polkit/Polkit.qml Normal file
View File

@@ -0,0 +1,544 @@
import QtQuick
import QtQuick.Controls
import Quickshell
import Quickshell.Wayland
import Quickshell.Services.Polkit
import "../config" as Cfg
Item {
id: root
readonly property var t: Cfg.Config.theme
readonly property var cfg: Cfg.Config
property bool interactionAvailable: false
property bool windowShouldExist: false
PolkitAgent {
id: agent
onAuthenticationRequestStarted: {
root.windowShouldExist = true
root.interactionAvailable = true
resetInput()
}
}
readonly property var flow: agent.flow ?? null
Connections {
target: flow
function onAuthenticationFailed() {
root.interactionAvailable = true
resetInput()
}
}
function submitAuth() {
if (!root.interactionAvailable) return
if (flow?.isResponseRequired) {
root.interactionAvailable = false
flow.submit(windowLoader.item?.passwordText ?? "")
windowLoader.item?.clearPassword()
}
}
function resetInput() {
windowLoader.item?.resetInput()
}
Loader {
id: windowLoader
active: root.windowShouldExist
sourceComponent: Component {
PanelWindow {
id: overlay
property bool exiting: false
property bool authFailed: false
property var displayFlow: null
function captureFlowSnapshot(flow) {
if (!flow) return null
return {
message: flow.message,
actionId: flow.actionId,
supplementaryMessage: flow.supplementaryMessage,
supplementaryIsError: flow.supplementaryIsError,
identities: flow.identities?.slice() ?? [],
selectedIdentity: flow.selectedIdentity,
isResponseRequired: flow.isResponseRequired,
inputPrompt: flow.inputPrompt,
responseVisible: flow.responseVisible
}
}
readonly property string passwordText: passwordInput.text
function clearPassword() { passwordInput.clear() }
function resetInput() {
passwordInput.clear()
passwordInput.forceActiveFocus()
}
visible: true
anchors { top: true; bottom: true; left: true; right: true }
color: "transparent"
WlrLayershell.layer: WlrLayer.Overlay
WlrLayershell.exclusiveZone: -1
WlrLayershell.keyboardFocus: WlrKeyboardFocus.Exclusive
WlrLayershell.namespace: "main-shell-polkit"
Timer {
id: exitDebounce
interval: 250
onTriggered: {
if (!agent.isActive && !overlay.exiting) {
overlay.exiting = true
exitAnim.start()
}
}
}
function cancelAndClose() {
if (overlay.exiting) return
overlay.exiting = true
exitAnim.start()
root.flow?.cancelAuthenticationRequest()
}
Rectangle {
anchors.fill: parent
color: t.polkitOverlayBg
}
component DialogButton: Rectangle {
property string label
property int labelWeight: Font.Normal
property color bgColor
property color bgHoverColor
property color borderColor
property color borderHoverColor
property color labelColor
signal tapped()
width: (parent.width - 12) / 2
height: 44
radius: 10
HoverHandler { id: hover }
color: hover.hovered ? bgHoverColor : bgColor
border.color: hover.hovered ? borderHoverColor : borderColor
border.width: 1
Behavior on color { ColorAnimation { duration: 200 } }
Behavior on border.color { ColorAnimation { duration: 200 } }
scale: pressHandler.pressed ? 0.97 : 1.0
Behavior on scale { NumberAnimation { duration: 100; easing.type: Easing.OutQuad } }
TapHandler {
id: pressHandler
cursorShape: Qt.PointingHandCursor
onTapped: parent.tapped()
}
Text {
anchors.centerIn: parent
text: label
color: labelColor
font.pixelSize: 13
font.weight: labelWeight
font.letterSpacing: 0.2
}
}
Rectangle {
id: card
property real shakeX: 0
x: Math.round((parent.width - width) / 2) + shakeX
y: Math.round((parent.height - height) / 2)
width: 440
height: content.implicitHeight + 64
radius: cfg.popupRadius
color: t.polkitCardBg
border.color: t.polkitCardBorder
border.width: 1
opacity: 0
scale: 0.86
Component.onCompleted: {
overlay.displayFlow = agent.flow
enterAnim.start()
}
ParallelAnimation {
id: enterAnim
NumberAnimation {
target: card; property: "opacity"
from: 0; to: 1
duration: 260; easing.type: Easing.OutCubic
}
NumberAnimation {
target: card; property: "scale"
from: 0.86; to: 1.0
duration: 360; easing.type: Easing.OutBack; easing.overshoot: 0.6
}
}
ParallelAnimation {
id: exitAnim
NumberAnimation {
target: card; property: "opacity"
from: 1; to: 0
duration: 200; easing.type: Easing.InCubic
}
NumberAnimation {
target: card; property: "scale"
from: 1.0; to: 0.88
duration: 260; easing.type: Easing.InBack
}
onFinished: {
overlay.exiting = false
root.windowShouldExist = false
}
}
Connections {
target: agent
function onIsActiveChanged() {
if (agent.isActive) {
overlay.authFailed = false
overlay.displayFlow = agent.flow
exitDebounce.stop()
if (overlay.exiting) {
exitAnim.stop()
overlay.exiting = false
}
card.opacity = 0
card.scale = 0.86
enterAnim.restart()
} else {
if (overlay.displayFlow)
overlay.displayFlow = captureFlowSnapshot(overlay.displayFlow)
exitDebounce.restart()
}
}
}
Connections {
target: flow
function onAuthenticationFailed() {
overlay.authFailed = true
shakeAnim.restart()
}
}
SequentialAnimation {
id: shakeAnim
NumberAnimation { target: card; property: "shakeX"; to: 12; duration: 45; easing.type: Easing.InOutQuad }
NumberAnimation { target: card; property: "shakeX"; to: -10; duration: 45 }
NumberAnimation { target: card; property: "shakeX"; to: 8; duration: 45 }
NumberAnimation { target: card; property: "shakeX"; to: -5; duration: 45 }
NumberAnimation { target: card; property: "shakeX"; to: 3; duration: 45 }
NumberAnimation { target: card; property: "shakeX"; to: 0; duration: 45 }
}
Column {
id: content
anchors {
top: parent.top
left: parent.left
right: parent.right
topMargin: 32
leftMargin: 32
rightMargin: 32
}
spacing: 16
Item {
width: parent.width
height: 72
Rectangle {
anchors.centerIn: parent
width: 66
height: 66
radius: 33
color: t.polkitIconBg
border.color: t.polkitIconBorder
border.width: 1
Text {
anchors.centerIn: parent
text: "󰌆"
font.pixelSize: 28
color: t.polkitIconColor
Component.onCompleted: {
if (implicitWidth < 4) text = "🔒"
}
}
}
}
Text {
width: parent.width
horizontalAlignment: Text.AlignHCenter
text: "Authentication Required"
color: t.polkitTitle
font.pixelSize: 17
font.weight: Font.DemiBold
font.letterSpacing: 0.3
}
Text {
visible: !!displayFlow?.message
width: parent.width
wrapMode: Text.WordWrap
horizontalAlignment: Text.AlignHCenter
text: displayFlow?.message ?? ""
color: t.polkitMessage
font.pixelSize: 13
lineHeight: 1.50
}
Item {
visible: !!displayFlow?.actionId
width: parent.width
height: pillBg.height
Rectangle {
id: pillBg
anchors.horizontalCenter: parent.horizontalCenter
width: Math.min(pillText.implicitWidth + 22, parent.width)
height: pillText.implicitHeight + 10
radius: 6
color: t.polkitPillBg
Text {
id: pillText
anchors.centerIn: parent
width: parent.width - 22
elide: Text.ElideMiddle
text: displayFlow?.actionId ?? ""
color: t.polkitPillText
font.pixelSize: 11
font.family: "monospace"
}
}
}
Rectangle {
width: parent.width
height: 1
color: t.polkitDivider
}
Rectangle {
visible: overlay.authFailed || !!displayFlow?.supplementaryMessage
width: parent.width
height: suppRow.implicitHeight + 20
radius: 10
color: overlay.authFailed || displayFlow?.supplementaryIsError ? t.polkitSuppErrBg : t.polkitSuppOkBg
border.color: overlay.authFailed || displayFlow?.supplementaryIsError ? t.polkitSuppErrBorder : t.polkitSuppOkBorder
border.width: 1
Row {
id: suppRow
anchors {
top: parent.top; topMargin: 10
bottom: parent.bottom; bottomMargin: 10
left: parent.left; leftMargin: 14
right: parent.right; rightMargin: 14
}
spacing: 9
Text {
anchors.top: parent.top
text: "✕"
font.pixelSize: 12
font.weight: Font.Medium
lineHeight: 1.8
color: t.polkitSuppErrText
}
Text {
width: parent.width - 22
wrapMode: Text.WordWrap
text: overlay.authFailed ? "Authentication failed, please try again." : (displayFlow?.supplementaryMessage ?? "")
font.pixelSize: 12
lineHeight: 1.45
color: overlay.authFailed || displayFlow?.supplementaryIsError ? t.polkitSuppErrText : t.polkitSuppOkText
}
}
}
Text {
visible: true
width: parent.width
text: displayFlow?.inputPrompt ?? "Password"
color: t.polkitInputPrompt
font.pixelSize: 12
}
Rectangle {
visible: true
width: parent.width
height: 46
radius: 10
color: t.polkitFieldBg
border.color: passwordInput.activeFocus ? t.polkitFieldBorderFocus : t.polkitFieldBorder
border.width: passwordInput.activeFocus ? 1.5 : 1
Behavior on border.color { ColorAnimation { duration: 120 } }
Behavior on border.width { NumberAnimation { duration: 120 } }
TextInput {
id: passwordInput
enabled: root.interactionAvailable
anchors {
left: parent.left; leftMargin: 16
right: eyeBtn.left; rightMargin: 8
verticalCenter: parent.verticalCenter
}
property bool showPassword: false
echoMode: (displayFlow?.responseVisible || showPassword)
? TextInput.Normal : TextInput.Password
color: t.polkitInputText
selectionColor: t.polkitInputSelection
selectedTextColor: t.polkitInputSelectedText
font.pixelSize: 14
passwordCharacter: "•"
clip: true
Keys.onReturnPressed: root.submitAuth()
Keys.onEnterPressed: root.submitAuth()
Keys.onEscapePressed: overlay.cancelAndClose()
}
Text {
id: eyeBtn
anchors {
right: parent.right; rightMargin: 14
verticalCenter: parent.verticalCenter
}
text: passwordInput.showPassword ? "🙈" : "👁"
font.pixelSize: 20
color: eyeHover.hovered ? t.polkitEyeIconHover : t.polkitEyeIcon
Behavior on color { ColorAnimation { duration: 120 } }
HoverHandler { id: eyeHover }
MouseArea {
anchors.fill: parent
anchors.margins: -8
cursorShape: Qt.PointingHandCursor
onClicked: passwordInput.showPassword = !passwordInput.showPassword
}
}
}
Item { width: 1; height: 2 }
Row {
width: parent.width
spacing: 12
layoutDirection: Qt.RightToLeft
DialogButton {
label: "Authenticate"
labelWeight: Font.Medium
labelColor: t.polkitAuthText
bgColor: t.polkitAuthBg
bgHoverColor: t.polkitAuthBgHover
borderColor: t.polkitAuthBg
borderHoverColor: t.polkitAuthBgHover
onTapped: root.submitAuth()
}
DialogButton {
label: "Cancel"
labelColor: t.polkitCancelText
bgColor: t.polkitCancelBg
bgHoverColor: t.polkitCancelBgHover
borderColor: t.polkitCancelBorder
borderHoverColor: t.polkitCancelBgHover
onTapped: overlay.cancelAndClose()
}
}
}
Rectangle {
anchors.fill: parent
radius: cfg.popupRadius
color: Qt.rgba(
t.polkitCardBg.r,
t.polkitCardBg.g,
t.polkitCardBg.b, 0.78)
opacity: root.interactionAvailable ? 0 : 1
visible: opacity > 0
Behavior on opacity { NumberAnimation { duration: 180; easing.type: Easing.InOutSine } }
Canvas {
id: spinnerCanvas
anchors.centerIn: parent
width: 40
height: 40
property real angle: 0
NumberAnimation on angle {
running: !root.interactionAvailable
from: 0
to: 360
duration: 700
loops: Animation.Infinite
}
onAngleChanged: requestPaint()
onPaint: {
const ctx = getContext("2d")
ctx.clearRect(0, 0, width, height)
const cx = width / 2, cy = height / 2
const r = width / 2 - 3
ctx.strokeStyle = Qt.rgba(
t.polkitTitle.r, t.polkitTitle.g, t.polkitTitle.b, 0.12)
ctx.lineWidth = 3.5
ctx.beginPath()
ctx.arc(cx, cy, r, 0, 2 * Math.PI)
ctx.stroke()
const start = (angle - 90) * Math.PI / 180
ctx.strokeStyle = Qt.rgba(
t.polkitTitle.r, t.polkitTitle.g, t.polkitTitle.b, 0.88)
ctx.lineCap = "round"
ctx.beginPath()
ctx.arc(cx, cy, r, start, start + 1.3 * Math.PI)
ctx.stroke()
}
}
}
}
}
}
}
}

View File

@@ -7,16 +7,33 @@ import Quickshell.Io
import "bar"
import "launcher"
import "widgets/bgDate"
import "polkit"
import "config" as Cfg
ShellRoot {
id: root
Component.onCompleted: {
Qt.application.organization = "quickshell"
Qt.application.name = "quickshell"
}
readonly property bool isTop: Cfg.Config.barPosition === "top"
property color frameBackground: Cfg.Config.theme.bgFrame
property color frameBorderColor: Cfg.Config.theme.frameBorder ?? Cfg.Config.theme.borderPopup
// ── Polkit Agent ─────────────────────────────────────────────────────────
Loader {
active: Cfg.Config.enablePolkit
source: Qt.resolvedUrl("polkit/Polkit.qml")
}
Component {
id: polkitComp
Polkit {}
}
// ── Spacing Gap: Top / Bottom ────────────────────────────────────────
Variants {
model: Quickshell.screens
@@ -117,7 +134,6 @@ ShellRoot {
id: frameCanvas
anchors.fill: parent
// Animation Properties
opacity: 0
scale: 0.98
@@ -212,9 +228,6 @@ ShellRoot {
ctx.stroke()
}
onWidthChanged: requestPaint()
onHeightChanged: requestPaint()
Connections {
target: root
function onFrameBackgroundChanged() { frameCanvas.requestPaint() }
@@ -245,4 +258,3 @@ ShellRoot {
}
}
}

BIN
wallpapers/hummingbird.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 KiB

View File

@@ -1,9 +1,12 @@
import QtQuick
import Quickshell
import Quickshell.Wayland
import Quickshell.Io
import "../../config" as Cfg
PanelWindow {
id: root
required property var modelData
screen: modelData
color: "transparent"
@@ -14,10 +17,46 @@ PanelWindow {
WlrLayershell.exclusiveZone: -1
mask: Region {}
readonly property string tz: Cfg.Config.timezone || ""
property int tzOffsetMin: 0
property string fullDateString: ""
property int typedChars: 0
property string secondsString: ""
onTzOffsetMinChanged: {
updateDate(new Date())
}
Process {
id: tzProc
command: ["bash", "-c", "TZ=" + (root.tz || "UTC") + " date +%z"]
running: root.tz !== ""
stdout: SplitParser {
onRead: data => {
var s = data.trim()
if (s.length < 5) return
var sign = (s[0] === "-") ? -1 : 1
var h = parseInt(s.substring(1, 3), 10)
var m = parseInt(s.substring(3, 5), 10)
root.tzOffsetMin = sign * (h * 60 + m)
}
}
}
Timer {
interval: 1800000; running: root.tz !== ""; repeat: true
onTriggered: tzProc.running = true
}
function toTz(date) {
if (!tz) return date
return new Date(date.getTime()
+ date.getTimezoneOffset() * 60000
+ root.tzOffsetMin * 60000)
}
function startTyping() {
typedChars = 0
secondsText.opacity = 0
@@ -26,13 +65,14 @@ PanelWindow {
function updateDate(d) {
let now = d || new Date()
fullDateString = now.toLocaleDateString(Qt.locale(), "dddd, d MMMM yyyy")
fullDateString = toTz(now).toLocaleDateString(Qt.locale(),
Cfg.Config.dateFormat === "DMY" ? "dddd, d MMMM yyyy" : "dddd, MMMM d, yyyy")
startTyping()
}
Component.onCompleted: {
let d = new Date()
secondsString = Qt.formatTime(d, "hh:mm:ss")
secondsString = Qt.formatTime(toTz(d), "hh:mm:ss")
updateDate(d)
}
@@ -50,6 +90,9 @@ PanelWindow {
font.letterSpacing: 4
opacity: 0.55
style: Text.Raised
renderType: Text.NativeRendering
layer.enabled: true
layer.smooth: true
text: fullDateString.substring(0, typedChars)
}
@@ -63,6 +106,9 @@ PanelWindow {
font.letterSpacing: 6
opacity: 0
style: Text.Raised
renderType: Text.NativeRendering
layer.enabled: true
layer.smooth: true
text: secondsString
Behavior on opacity {
@@ -94,8 +140,9 @@ PanelWindow {
repeat: true
onTriggered: {
let d = new Date()
secondsString = Qt.formatTime(d, "hh:mm:ss")
if (d.getSeconds() === 0 && d.getMinutes() === 0 && d.getHours() === 0)
let tzd = toTz(d)
secondsString = Qt.formatTime(tzd, "hh:mm:ss")
if (tzd.getHours() === 0 && tzd.getMinutes() === 0 && tzd.getSeconds() === 0)
updateDate(d)
}
}