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 required property string modelData
source: Qt.resolvedUrl("modules/" + modelData + ".qml") source: Qt.resolvedUrl("modules/" + modelData + ".qml")
onLoaded: barContent.bindModule(item, "left") onLoaded: barContent.bindModule(item, "left")
visible: !item || item.moduleEnabled !== false
} }
} }
} }
@@ -139,6 +140,7 @@ PanelWindow {
required property string modelData required property string modelData
source: Qt.resolvedUrl("modules/" + modelData + ".qml") source: Qt.resolvedUrl("modules/" + modelData + ".qml")
onLoaded: barContent.bindModule(item, "right") onLoaded: barContent.bindModule(item, "right")
visible: !item || item.moduleEnabled !== false
} }
} }
} }
@@ -170,6 +172,7 @@ PanelWindow {
required property string modelData required property string modelData
source: Qt.resolvedUrl("modules/" + modelData + ".qml") source: Qt.resolvedUrl("modules/" + modelData + ".qml")
onLoaded: barContent.bindModule(item, "center") 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 QtQuick.Layouts
import Quickshell import Quickshell
import Quickshell.Wayland import Quickshell.Wayland
import Quickshell.Io
import "../../config" as Cfg import "../../config" as Cfg
@@ -17,8 +18,44 @@ Rectangle {
property int barMargin: Cfg.Config.margin property int barMargin: Cfg.Config.margin
readonly property var t: Cfg.Config.theme 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 width: clockLayout.implicitWidth + 24
height: Cfg.Config.moduleHeight height: Cfg.Config.moduleHeight
@@ -66,7 +103,7 @@ Rectangle {
} }
Text { Text {
text: timeManager.now.toLocaleTimeString(Qt.locale(), "HH:mm") text: root.toTz(timeManager.now).toLocaleTimeString(Qt.locale(), "HH:mm")
color: root.t.clockTime color: root.t.clockTime
font.pixelSize: 13 font.pixelSize: 13
font.bold: true font.bold: true
@@ -75,7 +112,7 @@ Rectangle {
Text { Text {
id: secondsText id: secondsText
text: ":" + timeManager.now.toLocaleTimeString(Qt.locale(), "ss") text: ":" + root.toTz(timeManager.now).toLocaleTimeString(Qt.locale(), "ss")
color: root.t.clockSeconds color: root.t.clockSeconds
font.pixelSize: 13 font.pixelSize: 13
font.bold: true font.bold: true
@@ -230,7 +267,7 @@ Rectangle {
Layout.fillWidth: true Layout.fillWidth: true
Text { Text {
text: timeManager.now.toLocaleDateString(Qt.locale(), "dddd") text: root.toTz(timeManager.now).toLocaleDateString(Qt.locale(), "dddd")
color: root.t.clockPopupDim color: root.t.clockPopupDim
font.pixelSize: 12 font.pixelSize: 12
font.capitalization: Font.AllUppercase font.capitalization: Font.AllUppercase
@@ -239,7 +276,7 @@ Rectangle {
} }
Text { 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 color: root.t.clockPopupHeader
font.pixelSize: 22 font.pixelSize: 22
font.bold: true font.bold: true
@@ -269,8 +306,8 @@ Rectangle {
id: cal id: cal
Layout.fillWidth: true Layout.fillWidth: true
implicitHeight: gridCol.implicitHeight implicitHeight: gridCol.implicitHeight
property int displayYear: timeManager.now.getFullYear() property int displayYear: root.toTz(timeManager.now).getFullYear()
property int displayMonth: timeManager.now.getMonth() property int displayMonth: root.toTz(timeManager.now).getMonth()
property int pendingYear: displayYear property int pendingYear: displayYear
property int pendingMonth: displayMonth property int pendingMonth: displayMonth
property int slideDir: 1 property int slideDir: 1
@@ -279,8 +316,9 @@ Rectangle {
target: calendarPopup target: calendarPopup
function onPopupOpenChanged() { function onPopupOpenChanged() {
if (calendarPopup.popupOpen) { if (calendarPopup.popupOpen) {
cal.displayYear = timeManager.now.getFullYear() let tzd = root.toTz(timeManager.now)
cal.displayMonth = timeManager.now.getMonth() cal.displayYear = tzd.getFullYear()
cal.displayMonth = tzd.getMonth()
} }
} }
} }
@@ -339,7 +377,12 @@ Rectangle {
width: (card.width - 32) / 7; height: 26 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 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 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 { Rectangle {
anchors.centerIn: parent; width: 22; height: 22; radius: 11 anchors.centerIn: parent; width: 22; height: 22; radius: 11
@@ -371,7 +414,7 @@ Rectangle {
Layout.rightMargin: 6 Layout.rightMargin: 6
Text { Text {
text: "UTC " + (root.tzOffsetHours >= 0 ? "+" : "") + root.tzOffsetHours text: "UTC " + (root.tzOffsetHours() >= 0 ? "+" : "") + root.tzOffsetHours()
color: root.t.clockPopupUtc color: root.t.clockPopupUtc
font.pixelSize: 13 font.pixelSize: 13
font.bold: true font.bold: true
@@ -382,11 +425,11 @@ Rectangle {
Text { Text {
text: { text: {
let d = timeManager.now let d = root.toTz(timeManager.now)
let month = d.getMonth() + 1 let month = d.getMonth() + 1
let day = d.getDate() let day = d.getDate()
let year = d.getFullYear() let year = d.getFullYear()
if (Cfg.Config.clockDateFormat === "DMY") if (Cfg.Config.dateFormat === "DMY")
return day + "/" + month + "/" + year return day + "/" + month + "/" + year
return month + "/" + day + "/" + 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
import QtQuick.Layouts
import Quickshell
import "../../config" as Cfg import "../../config" as Cfg
@@ -37,10 +35,10 @@ Rectangle {
width: Cfg.Config.logoIconSize * 2 + 4 width: Cfg.Config.logoIconSize * 2 + 4
height: parent.height height: parent.height
color: isHovered ? t.archLogoBgHover : t.archLogoBg color: isHovered ? t.logoBgHover : t.logoBg
radius: panelRadius radius: panelRadius
border.color: launcherActive ? t.archLogoBorderActive : t.archLogoBorder border.color: launcherActive ? t.logoBorderActive : t.logoBorder
border.width: borderWidth border.width: borderWidth
Behavior on color { ColorAnimation { duration: 250 } } Behavior on color { ColorAnimation { duration: 250 } }
@@ -69,7 +67,7 @@ Rectangle {
anchors.centerIn: parent anchors.centerIn: parent
text: Cfg.Config.logoIcon text: Cfg.Config.logoIcon
color: launcherActive ? t.archLogoIconActive : t.archLogoIcon color: launcherActive ? t.logoIconActive : t.logoIcon
font.pixelSize: Cfg.Config.logoIconSize font.pixelSize: Cfg.Config.logoIconSize
Behavior on color { ColorAnimation { duration: 250 } } 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
import QtQuick.Layouts import QtQuick.Layouts
import Quickshell
import Quickshell.Io import Quickshell.Io
import "../../config" as Cfg import "../../config" as Cfg
@@ -25,7 +24,19 @@ Rectangle {
NumberAnimation { duration: 250; easing.type: Easing.OutCubic } 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 cpuVal: 0
property real memVal: 0 property real memVal: 0
@@ -36,75 +47,81 @@ Rectangle {
running: true running: true
repeat: true repeat: true
triggeredOnStart: true triggeredOnStart: true
onTriggered: { onTriggered: { statsProc.running = true }
cpuProc.running = true
memProc.running = true
diskProc.running = true
}
} }
Process { Process {
id: cpuProc id: statsProc
command: ["sh", "-c", "top -bn1 | awk '/^%Cpu/ {print 100-$8}'"] 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 { stdout: SplitParser {
onRead: data => { onRead: data => { statsProc.rawOutput += data + "\n" }
let val = parseFloat(data.trim()) }
root.cpuVal = isNaN(val) ? 0 : val 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 { component StatRing: RowLayout {
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 {
id: ring id: ring
spacing: 5
property real value: 0.0 property real value: 0.0
property string label: "" property string icon: ""
property real iconXOff: 0
property color ringColor: Cfg.Config.theme.accent property color ringColor: Cfg.Config.theme.accent
property color trackColor: Cfg.Config.theme.statsTrackColor property color trackColor: Cfg.Config.theme.statsTrackColor
property color labelColor: Cfg.Config.theme.textMain
Behavior on value { Behavior on value {
NumberAnimation { NumberAnimation { duration: 800; easing.type: Easing.OutCubic }
duration: 800
easing.type: Easing.OutCubic
}
} }
readonly property real fraction: Math.max(0, Math.min(value, 100)) / 100 readonly property real fraction: Math.max(0, Math.min(value, 100)) / 100
width: Cfg.Config.statsRingSize Text {
height: Cfg.Config.statsRingSize 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() readonly property bool active: Cfg.Config.statsLabelPosition === "left" && (root.expanded || root.hovered)
onRingColorChanged: arc.requestPaint() opacity: active ? 1 : 0
Layout.preferredWidth: active ? implicitWidth : 0
Behavior on opacity { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } }
Behavior on Layout.preferredWidth { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } }
}
Item {
id: ringCore
Layout.preferredWidth: Cfg.Config.statsRingSize
Layout.preferredHeight: Cfg.Config.statsRingSize
onVisibleChanged: if (visible) arc.requestPaint()
Canvas { Canvas {
id: arc id: arc
anchors.fill: parent anchors.fill: parent
antialiasing: true antialiasing: true
Connections {
target: ring
function onFractionChanged() { arc.requestPaint() }
function onRingColorChanged() { arc.requestPaint() }
}
onPaint: { onPaint: {
var ctx = getContext("2d") var ctx = getContext("2d")
ctx.reset() ctx.reset()
@@ -133,69 +150,59 @@ Rectangle {
} }
} }
HoverHandler { Text {
id: hov anchors.centerIn: parent
onHoveredChanged: if (!hovered) ring.showAlt = false anchors.horizontalCenterOffset: ring.iconXOff
text: ring.icon
color: ring.ringColor
font.pixelSize: Cfg.Config.statsIconSize
} }
property bool showAlt: false
onShowAltChanged: arc.requestPaint()
TapHandler {
enabled: !Cfg.Config.statsHideTextUntilHover || hov.hovered
onTapped: ring.showAlt = !ring.showAlt
} }
Text { Text {
anchors.centerIn: parent id: rightPct
text: Math.round(ring.value) + "%"
text: { color: ring.ringColor
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
}
color: ring.labelColor
font.pixelSize: Cfg.Config.statsRingFontSize font.pixelSize: Cfg.Config.statsRingFontSize
font.bold: true font.bold: true
font.family: "monospace" font.family: "monospace"
Layout.alignment: Qt.AlignVCenter
clip: true
opacity: (Cfg.Config.statsHideTextUntilHover && !hov.hovered) ? 0 : 1 readonly property bool active: Cfg.Config.statsLabelPosition === "right" && (root.expanded || root.hovered)
Behavior on opacity { opacity: active ? 1 : 0
NumberAnimation { duration: 180; easing.type: Easing.OutCubic } Layout.preferredWidth: active ? implicitWidth : 0
}
Behavior on opacity { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } }
Behavior on Layout.preferredWidth { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } }
} }
} }
RowLayout { RowLayout {
id: statsLayout id: statsLayout
anchors.centerIn: parent anchors.centerIn: parent
spacing: 10 spacing: 8
StatRing { StatRing {
value: root.cpuVal value: root.cpuVal
label: "cpu" icon: "󰍛"
iconXOff: 0.3
ringColor: root.t.statsCpuColor ringColor: root.t.statsCpuColor
trackColor: root.t.statsTrackColor trackColor: root.t.statsTrackColor
labelColor: root.t.statsText
} }
StatRing { StatRing {
value: root.memVal value: root.memVal
label: "ram" icon: "󰑭"
ringColor: root.t.statsMemColor ringColor: root.t.statsMemColor
trackColor: root.t.statsTrackColor trackColor: root.t.statsTrackColor
labelColor: root.t.statsText
} }
StatRing { StatRing {
value: root.diskVal value: root.diskVal
label: "disk" icon: "󰒋"
ringColor: root.t.statsDiskColor ringColor: root.t.statsDiskColor
trackColor: root.t.statsTrackColor trackColor: root.t.statsTrackColor
labelColor: root.t.statsText
} }
} }
} }

View File

@@ -13,9 +13,9 @@ Item {
property real panelRadius: Cfg.Config.radius / 2 property real panelRadius: Cfg.Config.radius / 2
property int borderWidth: Cfg.Config.panelBorderWidth property int borderWidth: Cfg.Config.panelBorderWidth
property bool isTop: true
property var targetScreen: null property var targetScreen: null
property string barSide: "right" property string barSide: "right"
property bool isTop: true
readonly property var t: Cfg.Config.theme readonly property var t: Cfg.Config.theme
@@ -23,14 +23,24 @@ Item {
property bool manuallyExpanded: false property bool manuallyExpanded: false
property var menuWindow: null property var menuWindow: null
readonly property bool effectiveExpanded: expanded || trayMenuPopup.popupOpen
implicitWidth: bgRect.width implicitWidth: bgRect.width
implicitHeight: bgRect.height 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 { Rectangle {
id: bgRect id: bgRect
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
height: Cfg.Config.trayHeight height: parent.height
width: mainRow.width width: mainRow.width
radius: root.panelRadius radius: root.panelRadius
@@ -54,21 +64,21 @@ Item {
id: mainRow id: mainRow
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
leftPadding: root.expanded && root.barSide === "right" ? 8 : 0 leftPadding: root.effectiveExpanded && root.barSide === "right" ? 8 : 0
rightPadding: root.expanded && root.barSide === "left" ? 8 : 0 rightPadding: root.effectiveExpanded && root.barSide === "left" ? 8 : 0
Behavior on leftPadding { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } } Behavior on leftPadding { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } }
Behavior on rightPadding { 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 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 } } Behavior on spacing { NumberAnimation { duration: 180; easing.type: Easing.OutCubic } }
Item { Item {
id: toggleArea id: toggleArea
width: Cfg.Config.trayHeight width: Cfg.Config.trayToggleSize
height: Cfg.Config.trayHeight height: Cfg.Config.trayToggleSize
z: 10 z: 10
TapHandler { TapHandler {
@@ -80,11 +90,11 @@ Item {
Text { Text {
anchors.centerIn: parent anchors.centerIn: parent
text: root.expanded text: root.effectiveExpanded
? (root.barSide === "left" ? "󰅁" : "󰅂") ? (root.barSide === "left" ? "󰅁" : "󰅂")
: (root.barSide === "left" ? "󰅂" : "󰅁") : (root.barSide === "left" ? "󰅂" : "󰅁")
color: root.t.trayIcon color: root.t.trayIcon
font.pixelSize: Cfg.Config.trayHeight * 0.55 font.pixelSize: Cfg.Config.trayToggleSize * 0.55
} }
} }
@@ -94,8 +104,8 @@ Item {
clip: true clip: true
anchors.verticalCenter: parent.verticalCenter anchors.verticalCenter: parent.verticalCenter
width: root.expanded ? implicitWidth : 0 width: root.effectiveExpanded ? implicitWidth : 0
opacity: root.expanded ? 1 : 0 opacity: root.effectiveExpanded ? 1 : 0
Behavior on width { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } } Behavior on width { NumberAnimation { duration: 200; easing.type: Easing.OutCubic } }
Behavior on opacity { NumberAnimation { duration: 150 } } Behavior on opacity { NumberAnimation { duration: 150 } }
@@ -122,7 +132,9 @@ Item {
} else if (mouse.button === Qt.MiddleButton) { } else if (mouse.button === Qt.MiddleButton) {
item.secondaryActivate() item.secondaryActivate()
} else if (mouse.button === Qt.RightButton) { } else if (mouse.button === Qt.RightButton) {
menuAnchor.open() if (item.hasMenu) {
trayMenuPopup.open(item, iconDelegate)
}
} }
} }
@@ -135,22 +147,462 @@ Item {
anchors.fill: parent anchors.fill: parent
source: item.icon source: item.icon
} }
}
}
}
}
}
QsMenuAnchor {
id: menuAnchor
menu: item.menu
anchor.window: root.menuWindow PanelWindow {
anchor.adjustment: PopupAdjustment.Flip id: trayMenuPopup
anchor.onAnchoring: { screen: root.targetScreen
if (!root.menuWindow) return visible: false
const global = iconDelegate.mapToGlobal(0, iconDelegate.height) color: "transparent"
const local = root.menuWindow.contentItem.mapFromGlobal(
global.x, global.y property bool popupOpen: false
) property bool _pendingOpen: false
menuAnchor.anchor.rect = Qt.rect( property var activeTrayItem: null
local.x, local.y, property var activeDelegate: null
iconDelegate.width, 0
) 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 outputMaxVolume: Cfg.Config.volumeOutputMax
property int inputMaxVolume: Cfg.Config.volumeInputMax 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 sink: Pipewire.defaultAudioSink
readonly property var source: Pipewire.defaultAudioSource readonly property var source: Pipewire.defaultAudioSource

View File

@@ -6,12 +6,13 @@ import "themes"
QtObject { QtObject {
id: root id: root
readonly property var theme: Goldencity readonly property var theme: Tropicalnight
// ──────────────────────────────────────────────────────────────────────── // ────────────────────────────────────────────────────────────────────────
// Widgets // Widgets
// ──────────────────────────────────────────────────────────────────────── // ────────────────────────────────────────────────────────────────────────
property bool enableBgDate: true property bool enableBgDate: true
property bool enablePolkit: true
// ──────────────────────────────────────────────────────────────────────── // ────────────────────────────────────────────────────────────────────────
// BAR // BAR
@@ -20,62 +21,64 @@ QtObject {
// ── Position & Dimensions ───────────────────────────────────────────────── // ── Position & Dimensions ─────────────────────────────────────────────────
property string barPosition: "bottom" property string barPosition: "bottom"
property int barHeight: 35 property int barHeight: 35
property int margin: 15 property int margin: 20
property int radius: 26 property int radius: 26
// ── Module Lists ────────────────────────────────────────────────────────── // ── Module Lists ──────────────────────────────────────────────────────────
property var leftModules: ["ArchLogo", "Stats"] property var leftModules: ["Logo", "Stats", "Crypto"]
property var centerModules: ["Workspace"] 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 int logoIconSize: 23 // icon font size; container width scales with it
property string logoIcon: "󱄅" // Nerd Font glyph for the logo property string logoIcon: "󱄅" // Nerd Font glyph for the logo
// ── Panel Styling ───────────────────────────────────────────────────────── // ── Panel Styling ─────────────────────────────────────────────────────────
property int panelBorderWidth: 1 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 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 ───────────────────────────────────────────────────────── // ── Popup Styling ─────────────────────────────────────────────────────────
property int popupRadius: 18 property int popupRadius: 18
property int popupBorderWidth: 1 property int popupBorderWidth: 1
property int popupAnimDuration: 500 property int popupAnimDuration: 500
// ── Clock Popup ─────────────────────────────────────────────────────────── // ── Timezone (IANA name, e.g. "America/New_York", "Europe/London")g ──────────
// Date format shown in the clock popup. // Leave empty to use the system timezone.
// "MDY" → month/day/year (e.g. 4/28/2026) property string timezone: "America/New_York"
// "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 ───────────────────────────────────────────────────────── // ── Tray Styling ─────────────────────────────────────────────────────────
property int trayHeight: 26 property int trayToggleSize: 23 // size of the expand/collapse arrow button
property int trayIconSize: 20 property int trayIconSize: 20 // size of each system tray item icon
// ── Stats Styling ───────────────────────────────────────────────────────── // ── Stats Styling ─────────────────────────────────────────────────────────
property int statsRingSize: 23 property int statsRingSize: 22
property int statsRingFontSize: 10 property int statsRingFontSize: 12
// If true, the % value is shown by default; hovering shows the label, clicking swaps back. property int statsIconSize: 10
// If false, the label is shown by default; hovering shows the %, clicking swaps back. // Where the percentage label appears when stats are expanded.
property bool statsShowPercentByDefault: true // "right" → label to the right of the ring; "left" → label to the left.
// If true, text is hidden completely until you hover a ring. property string statsLabelPosition: "right"
// • Hover → shows the "default" value (% when statsShowPercentByDefault, label otherwise) // If true, percentage labels are visible on startup without clicking.
// • Click → swaps to the "other" value (label / %) property bool statsStartExpanded: false
property bool statsHideTextUntilHover: false
// ── Volume Module ───────────────────────────────────────────────────────── // ── Volume Module ─────────────────────────────────────────────────────────
property int volumeIconSize: 20 property int volumeIconSize: 20
property int volumeSliderHeight: 2 property int volumeSliderHeight: 2
property int volumeHandleSize: 20 property int volumeHandleSize: 20
property int volumePopupWidth: 280 property int volumePopupWidth: 280
property int volumeOutputMax: 100 property int volumeOutputMax: 170
property int volumeInputMax: 200 property int volumeInputMax: 200
// ──────────────────────────────────────────────────────────────────────── // ────────────────────────────────────────────────────────────────────────
// FRAME // FRAME
// ──────────────────────────────────────────────────────────────────────── // ────────────────────────────────────────────────────────────────────────
property int frameBorderWidth: 2 property int frameBorderWidth: 3
// ──────────────────────────────────────────────────────────────────────── // ────────────────────────────────────────────────────────────────────────
// NOTIFICATIONS // NOTIFICATIONS
@@ -100,4 +103,45 @@ QtObject {
property bool launcherCloseOnClickOutside: true property bool launcherCloseOnClickOutside: true
property bool launcherSelectFirst: false property bool launcherSelectFirst: false
property bool launcherMipmapIcons: 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 readonly property color borderToday: accent
// ── ArchLogo Module ──────────────────────────────────────────────────────── // ── ArchLogo Module ────────────────────────────────────────────────────────
readonly property color archLogoBg: bgPanel readonly property color logoBg: bgPanel
readonly property color archLogoBgHover: "#22ffffff" readonly property color logoBgHover: "#22ffffff"
readonly property color archLogoHover: accent readonly property color logoBorder: border
readonly property color archLogoBorder: border readonly property color logoBorderActive: accent
readonly property color archLogoBorderActive: accent readonly property color logoIcon: textMain
readonly property color archLogoIcon: textMain readonly property color logoIconActive: accent
readonly property color archLogoIconActive: accent
// ── Stats Module (Aurora Tones) ─────────────────────────────────────────── // ── Stats Module (Aurora Tones) ───────────────────────────────────────────
readonly property color statsBg: bgPanel readonly property color statsBg: bgPanel
@@ -45,7 +44,6 @@ QtObject {
readonly property color statsCpuColor: "#cbdc3d" // Lime green readonly property color statsCpuColor: "#cbdc3d" // Lime green
readonly property color statsMemColor: "#4db6ac" // Teal readonly property color statsMemColor: "#4db6ac" // Teal
readonly property color statsDiskColor: "#81d4fa" // Sky blue readonly property color statsDiskColor: "#81d4fa" // Sky blue
readonly property color statsGpuColor: "#fff176" // Sun yellow
readonly property color statsTrackColor: "#15ffffff" readonly property color statsTrackColor: "#15ffffff"
// ── Volume Module (Glass Water) ─────────────────────────────────────────── // ── Volume Module (Glass Water) ───────────────────────────────────────────
@@ -71,15 +69,55 @@ QtObject {
readonly property color clockTime: textMain readonly property color clockTime: textMain
readonly property color clockSeconds: "#fff176" // Sun yellow readonly property color clockSeconds: "#fff176" // Sun yellow
readonly property color clockIcon: accent readonly property color clockIcon: accent
readonly property color clockSeparator: separator
readonly property color clockText: textMain // ── Battery Module ────────────────────────────────────────────────────────
readonly property color clockShadow: "#44000000" 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 ───────────────────────────────────────────────────────── // ── Calendar Popup ─────────────────────────────────────────────────────────
readonly property color calCardBg: bgPopup readonly property color calCardBg: bgPopup
readonly property color calCardBorder: borderPopup readonly property color calCardBorder: borderPopup
readonly property color calSeparator: separator readonly property color calSeparator: separator
readonly property color calShadow: "#66000000"
readonly property color clockPopupHeader: "#cbdc3d" readonly property color clockPopupHeader: "#cbdc3d"
readonly property color clockPopupText: textMain readonly property color clockPopupText: textMain
readonly property color clockPopupDim: textDim readonly property color clockPopupDim: textDim
@@ -137,7 +175,6 @@ QtObject {
readonly property color notifToastBg: bgPopup readonly property color notifToastBg: bgPopup
readonly property color notifToastBgHover: "#22ffffff" readonly property color notifToastBgHover: "#22ffffff"
readonly property color notifToastBorder: borderPopup readonly property color notifToastBorder: borderPopup
readonly property color notifToastShadow: "#44000000"
readonly property color notifToastText: textMain readonly property color notifToastText: textMain
readonly property color notifToastDim: textDim readonly property color notifToastDim: textDim
readonly property color notifToastAppName: "#ff81d4fa" readonly property color notifToastAppName: "#ff81d4fa"
@@ -154,11 +191,10 @@ QtObject {
// ── History popup ────────────────────────────────────────────────────────── // ── History popup ──────────────────────────────────────────────────────────
readonly property color notifHistoryBg: bgPopup readonly property color notifHistoryBg: bgPopup
readonly property color notifHistoryBorder: "#33cbdc3d" readonly property color notifHistoryBorder: "#33cbdc3d"
readonly property color notifHistoryShadow: "#55000000"
readonly property color notifHistoryHover: "#11cbdc3d" readonly property color notifHistoryHover: "#11cbdc3d"
readonly property color notifHistoryEmpty: textDim readonly property color notifHistoryEmpty: textDim
// new variables adaptated // new variables adapted
readonly property color frameBorder: "transparent" readonly property color frameBorder: "transparent"
readonly property color clockPopupDate: textMain readonly property color clockPopupDate: textMain
readonly property color clockPopupUtc: textDim readonly property color clockPopupUtc: textDim
@@ -168,8 +204,96 @@ QtObject {
readonly property color calArrowBgHover: "#22cbdc3d" readonly property color calArrowBgHover: "#22cbdc3d"
readonly property color calArrowBgPress: accent 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 ────────────────────────────────────────────────────────── // ── BgDate Module ──────────────────────────────────────────────────────────
readonly property color bgDateText: textMain readonly property color bgDateText: textMain
readonly property color bgDateShadow: "#66000000" readonly property color bgDateShadow: "#66000000"
readonly property color bgDateSecondsText: textMain 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 readonly property color borderToday: accent
// ── ArchLogo Module ──────────────────────────────────────────────────────── // ── ArchLogo Module ────────────────────────────────────────────────────────
readonly property color archLogoBg: bgPanel readonly property color logoBg: bgPanel
readonly property color archLogoBgHover: "#22ffffff" readonly property color logoBgHover: "#22ffffff"
readonly property color archLogoHover: accent readonly property color logoBorder: border
readonly property color archLogoBorder: border readonly property color logoBorderActive: accent
readonly property color archLogoBorderActive: accent readonly property color logoIcon: textMain
readonly property color archLogoIcon: textMain readonly property color logoIconActive: accent
readonly property color archLogoIconActive: accent
// ── Stats Module (Variation: Cosmic Cyan) ────────────────────────────────── // ── Stats Module (Variation: Cosmic Cyan) ──────────────────────────────────
readonly property color statsBg: bgPanel readonly property color statsBg: bgPanel
@@ -45,7 +44,6 @@ QtObject {
readonly property color statsCpuColor: "#ff00f2ff" readonly property color statsCpuColor: "#ff00f2ff"
readonly property color statsMemColor: "#ffbc7fff" // Trail violet readonly property color statsMemColor: "#ffbc7fff" // Trail violet
readonly property color statsDiskColor: "#ff7fbaff" // Sky blue readonly property color statsDiskColor: "#ff7fbaff" // Sky blue
readonly property color statsGpuColor: "#ff3df5ff" // Bright teal
readonly property color statsTrackColor: "#15ffffff" readonly property color statsTrackColor: "#15ffffff"
// ── Volume Module (Variation: Comet Purple) ──────────────────────────────── // ── Volume Module (Variation: Comet Purple) ────────────────────────────────
@@ -71,15 +69,55 @@ QtObject {
readonly property color clockTime: textMain readonly property color clockTime: textMain
readonly property color clockSeconds: "#ffbc7fff" // Purple seconds readonly property color clockSeconds: "#ffbc7fff" // Purple seconds
readonly property color clockIcon: accent readonly property color clockIcon: accent
readonly property color clockSeparator: separator
readonly property color clockText: textMain // ── Battery Module ────────────────────────────────────────────────────────
readonly property color clockShadow: "#66000000" 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 ───────────────────────────────────────────────────────── // ── Calendar Popup ─────────────────────────────────────────────────────────
readonly property color calCardBg: bgPopup readonly property color calCardBg: bgPopup
readonly property color calCardBorder: borderPopup readonly property color calCardBorder: borderPopup
readonly property color calSeparator: separator readonly property color calSeparator: separator
readonly property color calShadow: "#88000000"
readonly property color clockPopupHeader: "#ff82e6ff" readonly property color clockPopupHeader: "#ff82e6ff"
readonly property color clockPopupText: textMain readonly property color clockPopupText: textMain
readonly property color clockPopupDim: textDim readonly property color clockPopupDim: textDim
@@ -133,12 +171,10 @@ QtObject {
readonly property color notifSeparator: separator readonly property color notifSeparator: separator
readonly property color notifDnd: separator readonly property color notifDnd: separator
// ── Toast cards (Variation: Nebula) ──────────────────────────────────────── // ── Toast cards (Variation: Nebula) ────────────────────────────────────────
readonly property color notifToastBg: bgPopup readonly property color notifToastBg: bgPopup
readonly property color notifToastBgHover: "#22ffffff" readonly property color notifToastBgHover: "#22ffffff"
readonly property color notifToastBorder: borderPopup readonly property color notifToastBorder: borderPopup
readonly property color notifToastShadow: "#44000000"
readonly property color notifToastText: textMain readonly property color notifToastText: textMain
readonly property color notifToastDim: textDim readonly property color notifToastDim: textDim
readonly property color notifToastAppName: "#ffbc7fff" readonly property color notifToastAppName: "#ffbc7fff"
@@ -155,11 +191,10 @@ QtObject {
// ── History popup ────────────────────────────────────────────────────────── // ── History popup ──────────────────────────────────────────────────────────
readonly property color notifHistoryBg: bgPopup readonly property color notifHistoryBg: bgPopup
readonly property color notifHistoryBorder: "#3300d9ff" readonly property color notifHistoryBorder: "#3300d9ff"
readonly property color notifHistoryShadow: "#55000000"
readonly property color notifHistoryHover: "#1100d9ff" readonly property color notifHistoryHover: "#1100d9ff"
readonly property color notifHistoryEmpty: textDim readonly property color notifHistoryEmpty: textDim
// new variables adaptated // new variables adapted
readonly property color frameBorder: "transparent" readonly property color frameBorder: "transparent"
readonly property color clockPopupDate: textMain readonly property color clockPopupDate: textMain
readonly property color clockPopupUtc: textDim readonly property color clockPopupUtc: textDim
@@ -169,8 +204,96 @@ QtObject {
readonly property color calArrowBgHover: "#2200d9ff" readonly property color calArrowBgHover: "#2200d9ff"
readonly property color calArrowBgPress: accent 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 ────────────────────────────────────────────────────────── // ── BgDate Module ──────────────────────────────────────────────────────────
readonly property color bgDateText: textMain readonly property color bgDateText: textMain
readonly property color bgDateShadow: "#88000000" readonly property color bgDateShadow: "#88000000"
readonly property color bgDateSecondsText: textMain 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 readonly property color borderToday: accent
// ── ArchLogo Module ──────────────────────────────────────────────────────── // ── ArchLogo Module ────────────────────────────────────────────────────────
readonly property color archLogoBg: bgPanel readonly property color logoBg: bgPanel
readonly property color archLogoBgHover: "#22ffffff" readonly property color logoBgHover: "#22ffffff"
readonly property color archLogoHover: accent readonly property color logoBorder: border
readonly property color archLogoBorder: border readonly property color logoBorderActive: accent
readonly property color archLogoBorderActive: accent readonly property color logoIcon: textMain
readonly property color archLogoIcon: textMain readonly property color logoIconActive: accent
readonly property color archLogoIconActive: accent
// ── Stats Module (Variation: Shoreline Tones) ────────────────────────────── // ── Stats Module (Variation: Shoreline Tones) ──────────────────────────────
readonly property color statsBg: bgPanel readonly property color statsBg: bgPanel
@@ -45,7 +44,6 @@ QtObject {
readonly property color statsCpuColor: "#ffebc6a0" // Sunset gold readonly property color statsCpuColor: "#ffebc6a0" // Sunset gold
readonly property color statsMemColor: "#ff8fa3b0" // Ocean mist readonly property color statsMemColor: "#ff8fa3b0" // Ocean mist
readonly property color statsDiskColor: "#ffc2d1d9" // Bright sky blue readonly property color statsDiskColor: "#ffc2d1d9" // Bright sky blue
readonly property color statsGpuColor: "#ffd9a385" // Sand tan
readonly property color statsTrackColor: "#15ffffff" readonly property color statsTrackColor: "#15ffffff"
// ── Volume Module (Variation: Deep Water) ────────────────────────────────── // ── Volume Module (Variation: Deep Water) ──────────────────────────────────
@@ -71,15 +69,55 @@ QtObject {
readonly property color clockTime: textMain readonly property color clockTime: textMain
readonly property color clockSeconds: "#ffd9a385" // Sun-glow orange readonly property color clockSeconds: "#ffd9a385" // Sun-glow orange
readonly property color clockIcon: accent readonly property color clockIcon: accent
readonly property color clockSeparator: separator
readonly property color clockText: textMain // ── Battery Module ────────────────────────────────────────────────────────
readonly property color clockShadow: "#44000000" 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 ───────────────────────────────────────────────────────── // ── Calendar Popup ─────────────────────────────────────────────────────────
readonly property color calCardBg: bgPopup readonly property color calCardBg: bgPopup
readonly property color calCardBorder: borderPopup readonly property color calCardBorder: borderPopup
readonly property color calSeparator: separator readonly property color calSeparator: separator
readonly property color calShadow: "#66000000"
readonly property color clockPopupHeader: "#ffebc6a0" readonly property color clockPopupHeader: "#ffebc6a0"
readonly property color clockPopupText: textMain readonly property color clockPopupText: textMain
readonly property color clockPopupDim: textDim readonly property color clockPopupDim: textDim
@@ -137,7 +175,6 @@ QtObject {
readonly property color notifToastBg: bgPopup readonly property color notifToastBg: bgPopup
readonly property color notifToastBgHover: "#22ffffff" readonly property color notifToastBgHover: "#22ffffff"
readonly property color notifToastBorder: borderPopup readonly property color notifToastBorder: borderPopup
readonly property color notifToastShadow: "#44000000"
readonly property color notifToastText: textMain readonly property color notifToastText: textMain
readonly property color notifToastDim: textDim readonly property color notifToastDim: textDim
readonly property color notifToastAppName: "#ff8fa3b0" readonly property color notifToastAppName: "#ff8fa3b0"
@@ -154,11 +191,10 @@ QtObject {
// ── History popup ────────────────────────────────────────────────────────── // ── History popup ──────────────────────────────────────────────────────────
readonly property color notifHistoryBg: bgPopup readonly property color notifHistoryBg: bgPopup
readonly property color notifHistoryBorder: "#33ebc6a0" readonly property color notifHistoryBorder: "#33ebc6a0"
readonly property color notifHistoryShadow: "#55000000"
readonly property color notifHistoryHover: "#11ebc6a0" readonly property color notifHistoryHover: "#11ebc6a0"
readonly property color notifHistoryEmpty: textDim readonly property color notifHistoryEmpty: textDim
// new variables adaptated // new variables adapted
readonly property color frameBorder: "transparent" readonly property color frameBorder: "transparent"
readonly property color clockPopupDate: textMain readonly property color clockPopupDate: textMain
readonly property color clockPopupUtc: textDim readonly property color clockPopupUtc: textDim
@@ -168,8 +204,96 @@ QtObject {
readonly property color calArrowBgHover: "#22ebc6a0" readonly property color calArrowBgHover: "#22ebc6a0"
readonly property color calArrowBgPress: accent 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 ────────────────────────────────────────────────────────── // ── BgDate Module ──────────────────────────────────────────────────────────
readonly property color bgDateText: textMain readonly property color bgDateText: textMain
readonly property color bgDateShadow: "#66000000" readonly property color bgDateShadow: "#66000000"
readonly property color bgDateSecondsText: textMain 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 readonly property color borderToday: accent
// ── ArchLogo Module ──────────────────────────────────────────────────────── // ── ArchLogo Module ────────────────────────────────────────────────────────
readonly property color archLogoBg: bgPanel readonly property color logoBg: bgPanel
readonly property color archLogoBgHover: "#22ffffff" readonly property color logoBgHover: "#22ffffff"
readonly property color archLogoHover: accent readonly property color logoBorder: border
readonly property color archLogoBorder: border readonly property color logoBorderActive: accent
readonly property color archLogoBorderActive: accent readonly property color logoIcon: textMain
readonly property color archLogoIcon: textMain readonly property color logoIconActive: accent
readonly property color archLogoIconActive: accent
// ── Stats Module (Variation: Alpenglow) ──────────────────────────────────── // ── Stats Module (Variation: Alpenglow) ────────────────────────────────────
readonly property color statsBg: bgPanel readonly property color statsBg: bgPanel
@@ -45,7 +44,6 @@ QtObject {
readonly property color statsCpuColor: "#fff0a1ba" // Pink readonly property color statsCpuColor: "#fff0a1ba" // Pink
readonly property color statsMemColor: "#ffffcc99" // Horizon orange readonly property color statsMemColor: "#ffffcc99" // Horizon orange
readonly property color statsDiskColor: "#ff8da0c4" // Water blue readonly property color statsDiskColor: "#ff8da0c4" // Water blue
readonly property color statsGpuColor: "#ffb08dc4" // Purple mist
readonly property color statsTrackColor: "#15ffffff" readonly property color statsTrackColor: "#15ffffff"
// ── Volume Module (Variation: Frozen Lake) ───────────────────────────────── // ── Volume Module (Variation: Frozen Lake) ─────────────────────────────────
@@ -71,15 +69,55 @@ QtObject {
readonly property color clockTime: textMain readonly property color clockTime: textMain
readonly property color clockSeconds: "#ffffcc99" // Horizon orange readonly property color clockSeconds: "#ffffcc99" // Horizon orange
readonly property color clockIcon: accent readonly property color clockIcon: accent
readonly property color clockSeparator: separator
readonly property color clockText: textMain // ── Battery Module ────────────────────────────────────────────────────────
readonly property color clockShadow: "#44000000" 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 ───────────────────────────────────────────────────────── // ── Calendar Popup ─────────────────────────────────────────────────────────
readonly property color calCardBg: bgPopup readonly property color calCardBg: bgPopup
readonly property color calCardBorder: borderPopup readonly property color calCardBorder: borderPopup
readonly property color calSeparator: separator readonly property color calSeparator: separator
readonly property color calShadow: "#66000000"
readonly property color clockPopupHeader: "#fff0a1ba" readonly property color clockPopupHeader: "#fff0a1ba"
readonly property color clockPopupText: textMain readonly property color clockPopupText: textMain
readonly property color clockPopupDim: textDim readonly property color clockPopupDim: textDim
@@ -133,12 +171,10 @@ QtObject {
readonly property color notifSeparator: separator readonly property color notifSeparator: separator
readonly property color notifDnd: separator readonly property color notifDnd: separator
// ── Toast cards (Variation: Twilight) ────────────────────────────────────── // ── Toast cards (Variation: Twilight) ──────────────────────────────────────
readonly property color notifToastBg: bgPopup readonly property color notifToastBg: bgPopup
readonly property color notifToastBgHover: "#22ffffff" readonly property color notifToastBgHover: "#22ffffff"
readonly property color notifToastBorder: borderPopup readonly property color notifToastBorder: borderPopup
readonly property color notifToastShadow: "#44000000"
readonly property color notifToastText: textMain readonly property color notifToastText: textMain
readonly property color notifToastDim: textDim readonly property color notifToastDim: textDim
readonly property color notifToastAppName: "#ffb08dc4" readonly property color notifToastAppName: "#ffb08dc4"
@@ -155,11 +191,10 @@ QtObject {
// ── History popup ────────────────────────────────────────────────────────── // ── History popup ──────────────────────────────────────────────────────────
readonly property color notifHistoryBg: bgPopup readonly property color notifHistoryBg: bgPopup
readonly property color notifHistoryBorder: "#33f0a1ba" readonly property color notifHistoryBorder: "#33f0a1ba"
readonly property color notifHistoryShadow: "#55000000"
readonly property color notifHistoryHover: "#11f0a1ba" readonly property color notifHistoryHover: "#11f0a1ba"
readonly property color notifHistoryEmpty: textDim readonly property color notifHistoryEmpty: textDim
// new variables adaptated // new variables adapted
readonly property color frameBorder: "transparent" readonly property color frameBorder: "transparent"
readonly property color clockPopupDate: textMain readonly property color clockPopupDate: textMain
readonly property color clockPopupUtc: textDim readonly property color clockPopupUtc: textDim
@@ -169,8 +204,96 @@ QtObject {
readonly property color calArrowBgHover: "#22f0a1ba" readonly property color calArrowBgHover: "#22f0a1ba"
readonly property color calArrowBgPress: accent 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 ────────────────────────────────────────────────────────── // ── BgDate Module ──────────────────────────────────────────────────────────
readonly property color bgDateText: textMain readonly property color bgDateText: textMain
readonly property color bgDateShadow: "#66000000" readonly property color bgDateShadow: "#66000000"
readonly property color bgDateSecondsText: textMain 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 readonly property color borderToday: accent
// ── ArchLogo Module ──────────────────────────────────────────────────────── // ── ArchLogo Module ────────────────────────────────────────────────────────
readonly property color archLogoBg: bgPanel readonly property color logoBg: bgPanel
readonly property color archLogoBgHover: "#22ffffff" readonly property color logoBgHover: "#22ffffff"
readonly property color archLogoHover: accent readonly property color logoBorder: border
readonly property color archLogoBorder: border readonly property color logoBorderActive: accent
readonly property color archLogoBorderActive: accent readonly property color logoIcon: textMain
readonly property color archLogoIcon: textMain readonly property color logoIconActive: accent
readonly property color archLogoIconActive: accent
// ── Stats Module (Variation: Comet Trail) ────────────────────────────────── // ── Stats Module (Variation: Comet Trail) ──────────────────────────────────
readonly property color statsBg: bgPanel readonly property color statsBg: bgPanel
@@ -45,7 +44,6 @@ QtObject {
readonly property color statsCpuColor: "#ffbdf0ff" readonly property color statsCpuColor: "#ffbdf0ff"
readonly property color statsMemColor: "#ffcfb3ff" // Nebula purple readonly property color statsMemColor: "#ffcfb3ff" // Nebula purple
readonly property color statsDiskColor: "#ffffc2e0" // Horizon pink readonly property color statsDiskColor: "#ffffc2e0" // Horizon pink
readonly property color statsGpuColor: accent
readonly property color statsTrackColor: "#15ffffff" readonly property color statsTrackColor: "#15ffffff"
// ── Volume Module (Variation: Nebula Purple) ─────────────────────────────── // ── Volume Module (Variation: Nebula Purple) ───────────────────────────────
@@ -71,15 +69,55 @@ QtObject {
readonly property color clockTime: textMain readonly property color clockTime: textMain
readonly property color clockSeconds: "#ffffc2e0" // Horizon pink readonly property color clockSeconds: "#ffffc2e0" // Horizon pink
readonly property color clockIcon: accent readonly property color clockIcon: accent
readonly property color clockSeparator: separator
readonly property color clockText: textMain // ── Battery Module ────────────────────────────────────────────────────────
readonly property color clockShadow: "#44000000" 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 ───────────────────────────────────────────────────────── // ── Calendar Popup ─────────────────────────────────────────────────────────
readonly property color calCardBg: bgPopup readonly property color calCardBg: bgPopup
readonly property color calCardBorder: borderPopup readonly property color calCardBorder: borderPopup
readonly property color calSeparator: separator readonly property color calSeparator: separator
readonly property color calShadow: "#66000000"
readonly property color clockPopupHeader: "#ffcfb3ff" readonly property color clockPopupHeader: "#ffcfb3ff"
readonly property color clockPopupText: textMain readonly property color clockPopupText: textMain
readonly property color clockPopupDim: textDim readonly property color clockPopupDim: textDim
@@ -137,7 +175,6 @@ QtObject {
readonly property color notifToastBg: bgPopup readonly property color notifToastBg: bgPopup
readonly property color notifToastBgHover: "#22ffffff" readonly property color notifToastBgHover: "#22ffffff"
readonly property color notifToastBorder: borderPopup readonly property color notifToastBorder: borderPopup
readonly property color notifToastShadow: "#44000000"
readonly property color notifToastText: textMain readonly property color notifToastText: textMain
readonly property color notifToastDim: textDim readonly property color notifToastDim: textDim
readonly property color notifToastAppName: "#ffcfb3ff" readonly property color notifToastAppName: "#ffcfb3ff"
@@ -154,11 +191,10 @@ QtObject {
// ── History popup ────────────────────────────────────────────────────────── // ── History popup ──────────────────────────────────────────────────────────
readonly property color notifHistoryBg: bgPopup readonly property color notifHistoryBg: bgPopup
readonly property color notifHistoryBorder: "#33bdf0ff" readonly property color notifHistoryBorder: "#33bdf0ff"
readonly property color notifHistoryShadow: "#55000000"
readonly property color notifHistoryHover: "#11bdf0ff" readonly property color notifHistoryHover: "#11bdf0ff"
readonly property color notifHistoryEmpty: textDim readonly property color notifHistoryEmpty: textDim
// new variables adaptated // new variables adapted
readonly property color frameBorder: "transparent" readonly property color frameBorder: "transparent"
readonly property color clockPopupDate: textMain readonly property color clockPopupDate: textMain
readonly property color clockPopupUtc: textDim readonly property color clockPopupUtc: textDim
@@ -168,8 +204,96 @@ QtObject {
readonly property color calArrowBgHover: "#22bdf0ff" readonly property color calArrowBgHover: "#22bdf0ff"
readonly property color calArrowBgPress: accent 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 ────────────────────────────────────────────────────────── // ── BgDate Module ──────────────────────────────────────────────────────────
readonly property color bgDateText: textMain readonly property color bgDateText: textMain
readonly property color bgDateShadow: "#66000000" readonly property color bgDateShadow: "#66000000"
readonly property color bgDateSecondsText: textMain 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 readonly property color borderToday: accent
// ── ArchLogo Module ──────────────────────────────────────────────────────── // ── ArchLogo Module ────────────────────────────────────────────────────────
readonly property color archLogoBg: bgPanel readonly property color logoBg: bgPanel
readonly property color archLogoBgHover: "#22ffffff" readonly property color logoBgHover: "#22ffffff"
readonly property color archLogoHover: accent readonly property color logoBorder: border
readonly property color archLogoBorder: border readonly property color logoBorderActive: accent
readonly property color archLogoBorderActive: accent readonly property color logoIcon: textMain
readonly property color archLogoIcon: textMain readonly property color logoIconActive: accent
readonly property color archLogoIconActive: accent
// ── Stats Module ─────────────────────────────────────────────────────────── // ── Stats Module ───────────────────────────────────────────────────────────
readonly property color statsBg: bgPanel readonly property color statsBg: bgPanel
@@ -45,7 +44,6 @@ QtObject {
readonly property color statsCpuColor: statsRingColor readonly property color statsCpuColor: statsRingColor
readonly property color statsMemColor: statsRingColor readonly property color statsMemColor: statsRingColor
readonly property color statsDiskColor: statsRingColor readonly property color statsDiskColor: statsRingColor
readonly property color statsGpuColor: statsRingColor
readonly property color statsTrackColor: "#28ffffff" readonly property color statsTrackColor: "#28ffffff"
// ── Volume Module ────────────────────────────────────────────────────────── // ── Volume Module ──────────────────────────────────────────────────────────
@@ -71,15 +69,55 @@ QtObject {
readonly property color clockTime: textMain readonly property color clockTime: textMain
readonly property color clockSeconds: textMain readonly property color clockSeconds: textMain
readonly property color clockIcon: textMain readonly property color clockIcon: textMain
readonly property color clockSeparator: separator
readonly property color clockText: textMain // ── Battery Module ────────────────────────────────────────────────────────
readonly property color clockShadow: "#22000000" 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 ───────────────────────────────────────────────────────── // ── Calendar Popup ─────────────────────────────────────────────────────────
readonly property color calCardBg: bgPopup readonly property color calCardBg: bgPopup
readonly property color calCardBorder: borderPopup readonly property color calCardBorder: borderPopup
readonly property color calSeparator: separator readonly property color calSeparator: separator
readonly property color calShadow: "#44000000"
readonly property color clockPopupHeader: accent readonly property color clockPopupHeader: accent
readonly property color clockPopupText: textMain readonly property color clockPopupText: textMain
readonly property color clockPopupDim: textDim readonly property color clockPopupDim: textDim
@@ -133,12 +171,10 @@ QtObject {
readonly property color notifSeparator: separator readonly property color notifSeparator: separator
readonly property color notifDnd: separator readonly property color notifDnd: separator
// ── Toast cards ──────────────────────────────────────────────────────────── // ── Toast cards ────────────────────────────────────────────────────────────
readonly property color notifToastBg: bgPopup readonly property color notifToastBg: bgPopup
readonly property color notifToastBgHover: borderPopup readonly property color notifToastBgHover: borderPopup
readonly property color notifToastBorder: borderPopup readonly property color notifToastBorder: borderPopup
readonly property color notifToastShadow: "#55000000"
readonly property color notifToastText: textMain readonly property color notifToastText: textMain
readonly property color notifToastDim: textDim readonly property color notifToastDim: textDim
readonly property color notifToastAppName: accent readonly property color notifToastAppName: accent
@@ -155,11 +191,10 @@ QtObject {
// ── History popup ────────────────────────────────────────────────────────── // ── History popup ──────────────────────────────────────────────────────────
readonly property color notifHistoryBg: bgPopup readonly property color notifHistoryBg: bgPopup
readonly property color notifHistoryBorder: borderPopup readonly property color notifHistoryBorder: borderPopup
readonly property color notifHistoryShadow: "#55000000"
readonly property color notifHistoryHover: "#22ffffff" readonly property color notifHistoryHover: "#22ffffff"
readonly property color notifHistoryEmpty: textDim readonly property color notifHistoryEmpty: textDim
// new variables adaptated // new variables adapted
readonly property color frameBorder: "transparent" readonly property color frameBorder: "transparent"
readonly property color clockPopupDate: textMain readonly property color clockPopupDate: textMain
readonly property color clockPopupUtc: textDim readonly property color clockPopupUtc: textDim
@@ -169,10 +204,97 @@ QtObject {
readonly property color calArrowBgHover: "#224a8c5c" readonly property color calArrowBgHover: "#224a8c5c"
readonly property color calArrowBgPress: accent 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 ────────────────────────────────────────────────────────── // ── BgDate Module ──────────────────────────────────────────────────────────
readonly property color bgDateText: textMain readonly property color bgDateText: textMain
readonly property color bgDateShadow: "#44000000" readonly property color bgDateShadow: "#44000000"
readonly property color bgDateSecondsText: textMain 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,14 +29,13 @@ QtObject {
readonly property color borderPopup: "transparent" readonly property color borderPopup: "transparent"
readonly property color borderToday: accent readonly property color borderToday: accent
// ── ArchLogo Module ──────────────────────────────────────────────────────── // ── Logo Module ────────────────────────────────────────────────────────
readonly property color archLogoBg: bgPanel readonly property color logoBg: bgPanel
readonly property color archLogoBgHover: "#22ffffff" readonly property color logoBgHover: "#22ffffff"
readonly property color archLogoHover: accent readonly property color logoBorder: border
readonly property color archLogoBorder: border readonly property color logoBorderActive: accent
readonly property color archLogoBorderActive: accent readonly property color logoIcon: textMain
readonly property color archLogoIcon: textMain readonly property color logoIconActive: accent
readonly property color archLogoIconActive: accent
// ── Stats Module (Variation: Skyline Pulse) ─────────────────────────────── // ── Stats Module (Variation: Skyline Pulse) ───────────────────────────────
readonly property color statsBg: bgPanel readonly property color statsBg: bgPanel
@@ -46,7 +45,6 @@ QtObject {
readonly property color statsCpuColor: "#ffc19375" // Horizon gold readonly property color statsCpuColor: "#ffc19375" // Horizon gold
readonly property color statsMemColor: "#ff89b4fa" // Building window blue readonly property color statsMemColor: "#ff89b4fa" // Building window blue
readonly property color statsDiskColor: "#ff94e2d5" // Teal office light readonly property color statsDiskColor: "#ff94e2d5" // Teal office light
readonly property color statsGpuColor: "#fff38ba8" // Aviation warning red
readonly property color statsTrackColor: "#15ffffff" readonly property color statsTrackColor: "#15ffffff"
// ── Volume Module (Variation: Hazy Dusk) ────────────────────────────────── // ── Volume Module (Variation: Hazy Dusk) ──────────────────────────────────
@@ -72,15 +70,55 @@ QtObject {
readonly property color clockTime: textMain readonly property color clockTime: textMain
readonly property color clockSeconds: "#ffc19375" // Sun-glow gold readonly property color clockSeconds: "#ffc19375" // Sun-glow gold
readonly property color clockIcon: accent readonly property color clockIcon: accent
readonly property color clockSeparator: separator
readonly property color clockText: textMain // ── Battery Module ────────────────────────────────────────────────────────
readonly property color clockShadow: "#66000000" 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 ───────────────────────────────────────────────────────── // ── Calendar Popup ─────────────────────────────────────────────────────────
readonly property color calCardBg: bgPopup readonly property color calCardBg: bgPopup
readonly property color calCardBorder: borderPopup readonly property color calCardBorder: borderPopup
readonly property color calSeparator: separator readonly property color calSeparator: separator
readonly property color calShadow: "#88000000"
readonly property color clockPopupHeader: "#ffc19375" readonly property color clockPopupHeader: "#ffc19375"
readonly property color clockPopupText: textMain readonly property color clockPopupText: textMain
readonly property color clockPopupDim: textDim readonly property color clockPopupDim: textDim
@@ -109,6 +147,15 @@ QtObject {
readonly property color trayBorderHover: "#22ffffff" readonly property color trayBorderHover: "#22ffffff"
readonly property color trayIcon: textMain 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) ─────────────────────────────────── // ── Launcher (Variation: Shanghai Mist) ───────────────────────────────────
readonly property color launcherBg: bgPopup readonly property color launcherBg: bgPopup
readonly property color launcherBorder: borderPopup readonly property color launcherBorder: borderPopup
@@ -145,7 +192,6 @@ QtObject {
readonly property color notifToastBg: bgPopup readonly property color notifToastBg: bgPopup
readonly property color notifToastBgHover: "#22ffffff" readonly property color notifToastBgHover: "#22ffffff"
readonly property color notifToastBorder: borderPopup readonly property color notifToastBorder: borderPopup
readonly property color notifToastShadow: "#88000000"
readonly property color notifToastText: textMain readonly property color notifToastText: textMain
readonly property color notifToastDim: textDim readonly property color notifToastDim: textDim
readonly property color notifToastAppName: "#ff89b4fa" readonly property color notifToastAppName: "#ff89b4fa"
@@ -162,7 +208,6 @@ QtObject {
// ── History popup ────────────────────────────────────────────────────────── // ── History popup ──────────────────────────────────────────────────────────
readonly property color notifHistoryBg: bgPopup readonly property color notifHistoryBg: bgPopup
readonly property color notifHistoryBorder: borderPopup readonly property color notifHistoryBorder: borderPopup
readonly property color notifHistoryShadow: "#aa000000"
readonly property color notifHistoryHover: "#11c19375" readonly property color notifHistoryHover: "#11c19375"
readonly property color notifHistoryEmpty: textDim readonly property color notifHistoryEmpty: textDim
@@ -170,4 +215,96 @@ QtObject {
readonly property color bgDateText: "#ffffffff" // Pure white (brightest possible) 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 bgDateShadow: "#88000000" // Slightly softer shadow to let the white glow
readonly property color bgDateSecondsText: bgDateText // Brighter, more "sunlight" gold/yellow 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 readonly property color borderToday: accent
// ── ArchLogo Module ──────────────────────────────────────────────────────── // ── ArchLogo Module ────────────────────────────────────────────────────────
readonly property color archLogoBg: bgPanel readonly property color logoBg: bgPanel
readonly property color archLogoBgHover: "#22ffffff" readonly property color logoBgHover: "#22ffffff"
readonly property color archLogoHover: accent readonly property color logoBorder: border
readonly property color archLogoBorder: border readonly property color logoBorderActive: accent
readonly property color archLogoBorderActive: accent readonly property color logoIcon: textMain
readonly property color archLogoIcon: textMain readonly property color logoIconActive: accent
readonly property color archLogoIconActive: accent
// ── Stats Module (Variation: Night City Lights) ─────────────────────────── // ── Stats Module (Variation: Night City Lights) ───────────────────────────
readonly property color statsBg: bgPanel readonly property color statsBg: bgPanel
@@ -46,7 +45,6 @@ QtObject {
readonly property color statsCpuColor: "#ffffb86c" // Streetlight gold readonly property color statsCpuColor: "#ffffb86c" // Streetlight gold
readonly property color statsMemColor: "#ff9ece6a" // Train stripe green readonly property color statsMemColor: "#ff9ece6a" // Train stripe green
readonly property color statsDiskColor: "#ff7dcfff" // Cyan window light readonly property color statsDiskColor: "#ff7dcfff" // Cyan window light
readonly property color statsGpuColor: "#fff7768e" // Traffic taillight red
readonly property color statsTrackColor: "#15ffffff" readonly property color statsTrackColor: "#15ffffff"
// ── Volume Module (Variation: Urban Sound) ──────────────────────────────── // ── Volume Module (Variation: Urban Sound) ────────────────────────────────
@@ -72,15 +70,55 @@ QtObject {
readonly property color clockTime: textMain readonly property color clockTime: textMain
readonly property color clockSeconds: "#ff9ece6a" // Subtle green pulse readonly property color clockSeconds: "#ff9ece6a" // Subtle green pulse
readonly property color clockIcon: accent readonly property color clockIcon: accent
readonly property color clockSeparator: separator
readonly property color clockText: textMain // ── Battery Module ────────────────────────────────────────────────────────
readonly property color clockShadow: "#66000000" 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 ───────────────────────────────────────────────────────── // ── Calendar Popup ─────────────────────────────────────────────────────────
readonly property color calCardBg: bgPopup readonly property color calCardBg: bgPopup
readonly property color calCardBorder: borderPopup readonly property color calCardBorder: borderPopup
readonly property color calSeparator: separator readonly property color calSeparator: separator
readonly property color calShadow: "#aa000000"
readonly property color clockPopupHeader: "#ffffb86c" readonly property color clockPopupHeader: "#ffffb86c"
readonly property color clockPopupText: textMain readonly property color clockPopupText: textMain
readonly property color clockPopupDim: textDim readonly property color clockPopupDim: textDim
@@ -138,7 +176,6 @@ QtObject {
readonly property color notifToastBg: bgPopup readonly property color notifToastBg: bgPopup
readonly property color notifToastBgHover: "#22ffffff" readonly property color notifToastBgHover: "#22ffffff"
readonly property color notifToastBorder: borderPopup readonly property color notifToastBorder: borderPopup
readonly property color notifToastShadow: "#88000000"
readonly property color notifToastText: textMain readonly property color notifToastText: textMain
readonly property color notifToastDim: textDim readonly property color notifToastDim: textDim
readonly property color notifToastAppName: "#ff7dcfff" readonly property color notifToastAppName: "#ff7dcfff"
@@ -155,11 +192,10 @@ QtObject {
// ── History popup ────────────────────────────────────────────────────────── // ── History popup ──────────────────────────────────────────────────────────
readonly property color notifHistoryBg: bgPopup readonly property color notifHistoryBg: bgPopup
readonly property color notifHistoryBorder: "#44ffb86c" readonly property color notifHistoryBorder: "#44ffb86c"
readonly property color notifHistoryShadow: "#aa000000"
readonly property color notifHistoryHover: "#11ffb86c" readonly property color notifHistoryHover: "#11ffb86c"
readonly property color notifHistoryEmpty: textDim readonly property color notifHistoryEmpty: textDim
// new variables adaptated // new variables adapted
readonly property color frameBorder: "transparent" readonly property color frameBorder: "transparent"
readonly property color clockPopupDate: textMain readonly property color clockPopupDate: textMain
readonly property color clockPopupUtc: textDim readonly property color clockPopupUtc: textDim
@@ -169,8 +205,96 @@ QtObject {
readonly property color calArrowBgHover: "#22ffb86c" readonly property color calArrowBgHover: "#22ffb86c"
readonly property color calArrowBgPress: accent 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 ────────────────────────────────────────────────────────── // ── BgDate Module ──────────────────────────────────────────────────────────
readonly property color bgDateText: textMain readonly property color bgDateText: textMain
readonly property color bgDateShadow: "#aa000000" readonly property color bgDateShadow: "#aa000000"
readonly property color bgDateSecondsText: textMain 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 readonly property color borderToday: accent
// ── ArchLogo Module ──────────────────────────────────────────────────────── // ── ArchLogo Module ────────────────────────────────────────────────────────
readonly property color archLogoBg: bgPanel readonly property color logoBg: bgPanel
readonly property color archLogoBgHover: "#22ffffff" readonly property color logoBgHover: "#22ffffff"
readonly property color archLogoHover: accent readonly property color logoBorder: border
readonly property color archLogoBorder: border readonly property color logoBorderActive: accent
readonly property color archLogoBorderActive: accent readonly property color logoIcon: textMain
readonly property color archLogoIcon: textMain readonly property color logoIconActive: accent
readonly property color archLogoIconActive: accent
// ── Stats Module (Variation: Cyan/Blue) ──────────────────────────────────── // ── Stats Module (Variation: Cyan/Blue) ────────────────────────────────────
readonly property color statsBg: bgPanel readonly property color statsBg: bgPanel
@@ -45,7 +44,6 @@ QtObject {
readonly property color statsCpuColor: "#ff9ccfd8" // Light Blue readonly property color statsCpuColor: "#ff9ccfd8" // Light Blue
readonly property color statsMemColor: "#ffc4a7e7" // Soft Purple readonly property color statsMemColor: "#ffc4a7e7" // Soft Purple
readonly property color statsDiskColor: "#ffebbcba" // Muted Rose readonly property color statsDiskColor: "#ffebbcba" // Muted Rose
readonly property color statsGpuColor: accent
readonly property color statsTrackColor: "#15ffffff" readonly property color statsTrackColor: "#15ffffff"
// ── Volume Module (Variation: Violet) ────────────────────────────────────── // ── Volume Module (Variation: Violet) ──────────────────────────────────────
@@ -71,15 +69,55 @@ QtObject {
readonly property color clockTime: textMain readonly property color clockTime: textMain
readonly property color clockSeconds: "#ffeb6f92" // Pink seconds readonly property color clockSeconds: "#ffeb6f92" // Pink seconds
readonly property color clockIcon: accent readonly property color clockIcon: accent
readonly property color clockSeparator: separator
readonly property color clockText: textMain // ── Battery Module ────────────────────────────────────────────────────────
readonly property color clockShadow: "#22000000" 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 ───────────────────────────────────────────────────────── // ── Calendar Popup ─────────────────────────────────────────────────────────
readonly property color calCardBg: bgPopup readonly property color calCardBg: bgPopup
readonly property color calCardBorder: borderPopup readonly property color calCardBorder: borderPopup
readonly property color calSeparator: separator readonly property color calSeparator: separator
readonly property color calShadow: "#44000000"
readonly property color clockPopupHeader: "#ff9ccfd8" // Blue header readonly property color clockPopupHeader: "#ff9ccfd8" // Blue header
readonly property color clockPopupText: textMain readonly property color clockPopupText: textMain
readonly property color clockPopupDim: "#ff6e6a86" readonly property color clockPopupDim: "#ff6e6a86"
@@ -131,12 +169,12 @@ QtObject {
readonly property color notifBadgeBg: "#ffeb6f92" readonly property color notifBadgeBg: "#ffeb6f92"
readonly property color notifBadgeText: "#ff0d0b1c" readonly property color notifBadgeText: "#ff0d0b1c"
readonly property color notifSeparator: separator readonly property color notifSeparator: separator
readonly property color notifDnd: separator
// ── Toast cards ──────────────────────────────────────────────────────────── // ── Toast cards ────────────────────────────────────────────────────────────
readonly property color notifToastBg: bgPopup readonly property color notifToastBg: bgPopup
readonly property color notifToastBgHover: "#443b224c" readonly property color notifToastBgHover: "#443b224c"
readonly property color notifToastBorder: borderPopup readonly property color notifToastBorder: borderPopup
readonly property color notifToastShadow: "#33000000"
readonly property color notifToastText: textMain readonly property color notifToastText: textMain
readonly property color notifToastDim: "#ff908caa" readonly property color notifToastDim: "#ff908caa"
readonly property color notifToastAppName: "#ffc4a7e7" // Violet App name readonly property color notifToastAppName: "#ffc4a7e7" // Violet App name
@@ -153,11 +191,10 @@ QtObject {
// ── History popup ────────────────────────────────────────────────────────── // ── History popup ──────────────────────────────────────────────────────────
readonly property color notifHistoryBg: bgPopup readonly property color notifHistoryBg: bgPopup
readonly property color notifHistoryBorder: "#33c4a7e7" readonly property color notifHistoryBorder: "#33c4a7e7"
readonly property color notifHistoryShadow: "#33000000"
readonly property color notifHistoryHover: "#22c4a7e7" readonly property color notifHistoryHover: "#22c4a7e7"
readonly property color notifHistoryEmpty: "#ff6e6a86" readonly property color notifHistoryEmpty: "#ff6e6a86"
// new variables adaptated // new variables adapted
readonly property color frameBorder: "transparent" readonly property color frameBorder: "transparent"
readonly property color clockPopupDate: textMain readonly property color clockPopupDate: textMain
readonly property color clockPopupUtc: textDim readonly property color clockPopupUtc: textDim
@@ -167,8 +204,96 @@ QtObject {
readonly property color calArrowBgHover: "#22ff2e97" readonly property color calArrowBgHover: "#22ff2e97"
readonly property color calArrowBgPress: accent 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 ────────────────────────────────────────────────────────── // ── BgDate Module ──────────────────────────────────────────────────────────
readonly property color bgDateText: textMain readonly property color bgDateText: textMain
readonly property color bgDateShadow: "#44000000" readonly property color bgDateShadow: "#44000000"
readonly property color bgDateSecondsText: textMain 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 Supreme 1.0 supreme.qml
singleton Metropolitan 1.0 metropolitan.qml singleton Metropolitan 1.0 metropolitan.qml
singleton Goldencity 1.0 goldencity.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 readonly property color borderToday: accent
// ── ArchLogo Module ──────────────────────────────────────────────────────── // ── ArchLogo Module ────────────────────────────────────────────────────────
readonly property color archLogoBg: bgPanel readonly property color logoBg: bgPanel
readonly property color archLogoBgHover: "#22ffffff" readonly property color logoBgHover: "#22ffffff"
readonly property color archLogoHover: accent readonly property color logoBorder: border
readonly property color archLogoBorder: border readonly property color logoBorderActive: accent
readonly property color archLogoBorderActive: accent readonly property color logoIcon: textMain
readonly property color archLogoIcon: textMain readonly property color logoIconActive: accent
readonly property color archLogoIconActive: accent
// ── Stats Module (Candy Tones) ───────────────────────────────────────────── // ── Stats Module (Candy Tones) ─────────────────────────────────────────────
readonly property color statsBg: bgPanel readonly property color statsBg: bgPanel
@@ -45,7 +44,6 @@ QtObject {
readonly property color statsCpuColor: "#ffff7eb9" // Hot pink readonly property color statsCpuColor: "#ffff7eb9" // Hot pink
readonly property color statsMemColor: "#ffee99ff" // Soft purple readonly property color statsMemColor: "#ffee99ff" // Soft purple
readonly property color statsDiskColor: "#ff70c5ce" // Cyan pop readonly property color statsDiskColor: "#ff70c5ce" // Cyan pop
readonly property color statsGpuColor: "#ffff9a9e" // Pastel coral
readonly property color statsTrackColor: "#15ffffff" readonly property color statsTrackColor: "#15ffffff"
// ── Volume Module (Berry Glass) ─────────────────────────────────────────── // ── Volume Module (Berry Glass) ───────────────────────────────────────────
@@ -71,15 +69,55 @@ QtObject {
readonly property color clockTime: textMain readonly property color clockTime: textMain
readonly property color clockSeconds: "#ffff9a9e" // Pastel peach readonly property color clockSeconds: "#ffff9a9e" // Pastel peach
readonly property color clockIcon: accent readonly property color clockIcon: accent
readonly property color clockSeparator: separator
readonly property color clockText: textMain // ── Battery Module ────────────────────────────────────────────────────────
readonly property color clockShadow: "#442d1621" 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 ───────────────────────────────────────────────────────── // ── Calendar Popup ─────────────────────────────────────────────────────────
readonly property color calCardBg: bgPopup readonly property color calCardBg: bgPopup
readonly property color calCardBorder: borderPopup readonly property color calCardBorder: borderPopup
readonly property color calSeparator: separator readonly property color calSeparator: separator
readonly property color calShadow: "#662d1621"
readonly property color clockPopupHeader: "#ffff7eb9" readonly property color clockPopupHeader: "#ffff7eb9"
readonly property color clockPopupText: textMain readonly property color clockPopupText: textMain
readonly property color clockPopupDim: textDim readonly property color clockPopupDim: textDim
@@ -137,7 +175,6 @@ QtObject {
readonly property color notifToastBg: bgPopup readonly property color notifToastBg: bgPopup
readonly property color notifToastBgHover: "#22ffffff" readonly property color notifToastBgHover: "#22ffffff"
readonly property color notifToastBorder: borderPopup readonly property color notifToastBorder: borderPopup
readonly property color notifToastShadow: "#442d1621"
readonly property color notifToastText: textMain readonly property color notifToastText: textMain
readonly property color notifToastDim: textDim readonly property color notifToastDim: textDim
readonly property color notifToastAppName: "#ffff7eb9" readonly property color notifToastAppName: "#ffff7eb9"
@@ -154,11 +191,10 @@ QtObject {
// ── History popup ────────────────────────────────────────────────────────── // ── History popup ──────────────────────────────────────────────────────────
readonly property color notifHistoryBg: bgPopup readonly property color notifHistoryBg: bgPopup
readonly property color notifHistoryBorder: "#33ff7eb9" readonly property color notifHistoryBorder: "#33ff7eb9"
readonly property color notifHistoryShadow: "#552d1621"
readonly property color notifHistoryHover: "#11ff7eb9" readonly property color notifHistoryHover: "#11ff7eb9"
readonly property color notifHistoryEmpty: textDim readonly property color notifHistoryEmpty: textDim
// new variables adaptated // new variables adapted
readonly property color frameBorder: "transparent" readonly property color frameBorder: "transparent"
readonly property color clockPopupDate: textMain readonly property color clockPopupDate: textMain
readonly property color clockPopupUtc: textDim readonly property color clockPopupUtc: textDim
@@ -168,8 +204,96 @@ QtObject {
readonly property color calArrowBgHover: "#22ff7eb9" readonly property color calArrowBgHover: "#22ff7eb9"
readonly property color calArrowBgPress: accent 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 ────────────────────────────────────────────────────────── // ── BgDate Module ──────────────────────────────────────────────────────────
readonly property color bgDateText: textMain readonly property color bgDateText: textMain
readonly property color bgDateShadow: "#662d1621" readonly property color bgDateShadow: "#662d1621"
readonly property color bgDateSecondsText: textMain 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) { function shellQuote(str) {
// POSIX single-quote escaping: wrap in ' and replace every ' with '\''
return "'" + str.replace(/'/g, "'\\''") + "'" 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 "bar"
import "launcher" import "launcher"
import "widgets/bgDate" import "widgets/bgDate"
import "polkit"
import "config" as Cfg import "config" as Cfg
ShellRoot { ShellRoot {
id: root id: root
Component.onCompleted: {
Qt.application.organization = "quickshell"
Qt.application.name = "quickshell"
}
readonly property bool isTop: Cfg.Config.barPosition === "top" readonly property bool isTop: Cfg.Config.barPosition === "top"
property color frameBackground: Cfg.Config.theme.bgFrame property color frameBackground: Cfg.Config.theme.bgFrame
property color frameBorderColor: Cfg.Config.theme.frameBorder ?? Cfg.Config.theme.borderPopup 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 ──────────────────────────────────────── // ── Spacing Gap: Top / Bottom ────────────────────────────────────────
Variants { Variants {
model: Quickshell.screens model: Quickshell.screens
@@ -117,7 +134,6 @@ ShellRoot {
id: frameCanvas id: frameCanvas
anchors.fill: parent anchors.fill: parent
// Animation Properties
opacity: 0 opacity: 0
scale: 0.98 scale: 0.98
@@ -212,9 +228,6 @@ ShellRoot {
ctx.stroke() ctx.stroke()
} }
onWidthChanged: requestPaint()
onHeightChanged: requestPaint()
Connections { Connections {
target: root target: root
function onFrameBackgroundChanged() { frameCanvas.requestPaint() } 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 QtQuick
import Quickshell import Quickshell
import Quickshell.Wayland import Quickshell.Wayland
import Quickshell.Io
import "../../config" as Cfg import "../../config" as Cfg
PanelWindow { PanelWindow {
id: root
required property var modelData required property var modelData
screen: modelData screen: modelData
color: "transparent" color: "transparent"
@@ -14,10 +17,46 @@ PanelWindow {
WlrLayershell.exclusiveZone: -1 WlrLayershell.exclusiveZone: -1
mask: Region {} mask: Region {}
readonly property string tz: Cfg.Config.timezone || ""
property int tzOffsetMin: 0
property string fullDateString: "" property string fullDateString: ""
property int typedChars: 0 property int typedChars: 0
property string secondsString: "" 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() { function startTyping() {
typedChars = 0 typedChars = 0
secondsText.opacity = 0 secondsText.opacity = 0
@@ -26,13 +65,14 @@ PanelWindow {
function updateDate(d) { function updateDate(d) {
let now = d || new Date() 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() startTyping()
} }
Component.onCompleted: { Component.onCompleted: {
let d = new Date() let d = new Date()
secondsString = Qt.formatTime(d, "hh:mm:ss") secondsString = Qt.formatTime(toTz(d), "hh:mm:ss")
updateDate(d) updateDate(d)
} }
@@ -50,6 +90,9 @@ PanelWindow {
font.letterSpacing: 4 font.letterSpacing: 4
opacity: 0.55 opacity: 0.55
style: Text.Raised style: Text.Raised
renderType: Text.NativeRendering
layer.enabled: true
layer.smooth: true
text: fullDateString.substring(0, typedChars) text: fullDateString.substring(0, typedChars)
} }
@@ -63,6 +106,9 @@ PanelWindow {
font.letterSpacing: 6 font.letterSpacing: 6
opacity: 0 opacity: 0
style: Text.Raised style: Text.Raised
renderType: Text.NativeRendering
layer.enabled: true
layer.smooth: true
text: secondsString text: secondsString
Behavior on opacity { Behavior on opacity {
@@ -94,8 +140,9 @@ PanelWindow {
repeat: true repeat: true
onTriggered: { onTriggered: {
let d = new Date() let d = new Date()
secondsString = Qt.formatTime(d, "hh:mm:ss") let tzd = toTz(d)
if (d.getSeconds() === 0 && d.getMinutes() === 0 && d.getHours() === 0) secondsString = Qt.formatTime(tzd, "hh:mm:ss")
if (tzd.getHours() === 0 && tzd.getMinutes() === 0 && tzd.getSeconds() === 0)
updateDate(d) updateDate(d)
} }
} }