Compare commits

...

2 Commits

19 changed files with 597 additions and 47 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
launcher/favorites.txt

View File

@@ -12,6 +12,9 @@ PanelWindow {
readonly property var cfg: Cfg.Config
readonly property real barEdgePad: cfg.frameVariant === "bar" ? (isTop ? cfg.frameBarPadTop : cfg.frameBarPadBottom) : 0
readonly property real barRoundPad: cfg.frameVariant === "bar" ? Math.min(cfg.radius, cfg.barHeight / 2) : 0
color: "transparent"
anchors {
top: isTop
@@ -19,15 +22,21 @@ PanelWindow {
left: true
right: true
}
implicitHeight: cfg.barHeight
implicitHeight: cfg.barHeight + barEdgePad
WlrLayershell.layer: WlrLayer.Top
WlrLayershell.namespace: "main-shell-bar"
WlrLayershell.exclusiveZone: cfg.barHeight
WlrLayershell.exclusiveZone: cfg.barHeight + barEdgePad
Item {
id: animatedWrapper
anchors.fill: parent
anchors {
fill: parent
topMargin: isTop ? barEdgePad : 0
bottomMargin: !isTop ? barEdgePad : 0
leftMargin: 0
rightMargin: 0
}
opacity: 0
scale: 0.95
@@ -66,8 +75,8 @@ PanelWindow {
Item {
id: barContent
anchors.fill: parent
anchors.leftMargin: cfg.margin
anchors.rightMargin: cfg.margin
anchors.leftMargin: cfg.margin + barRoundPad
anchors.rightMargin: cfg.margin + barRoundPad
function bindModule(item, side) {
item.height = Qt.binding(() => barContent.height - 12)
@@ -78,6 +87,7 @@ PanelWindow {
"targetScreen": barWindow.modelData,
"barHeight": cfg.barHeight,
"barMargin": cfg.margin,
"barEdgePad": barEdgePad,
"barSide": side,
"menuWindow": barWindow
}

View File

@@ -323,6 +323,7 @@ ModuleChip {
text: root.coinSymbol + "/" + root.displayCurrency.toUpperCase() + ": "
color: t.cryptoLabel
font.pixelSize: 12
font.bold: true
verticalAlignment: Text.AlignVCenter
}
@@ -339,6 +340,8 @@ ModuleChip {
text: root.change24h >= 0 ? "▲" : "▼"
color: root.change24h >= 0 ? (t.cryptoUp) : (t.cryptoDown)
font.pixelSize: 9
font.bold: true
renderType: Text.NativeRendering
verticalAlignment: Text.AlignVCenter
Layout.alignment: Qt.AlignVCenter
Layout.leftMargin: 4
@@ -495,6 +498,7 @@ ModuleChip {
color: root.change24h >= 0 ? (t.cryptoUp) : (t.cryptoDown)
font.pixelSize: 11
font.bold: true
renderType: Text.NativeRendering
}
}
}
@@ -516,7 +520,7 @@ ModuleChip {
property string value: ""
Layout.fillWidth: true
Text { text: label; color: t.cryptoPopupDim; font.pixelSize: 12; Layout.fillWidth: true }
Text { text: value; color: t.cryptoPopupText; font.pixelSize: 12; font.bold: true; font.family: "monospace" }
Text { text: value; color: t.cryptoPopupText; font.pixelSize: 12; font.bold: true; font.family: "monospace"; renderType: Text.NativeRendering }
}
StatRow { label: "Rank"; value: root.rank > 0 ? "#" + root.rank : "—" }
@@ -552,6 +556,7 @@ ModuleChip {
text: "24h Range"
color: t.cryptoPopupDim
font.pixelSize: 12
renderType: Text.NativeRendering
Layout.fillWidth: true
}
Text {
@@ -559,6 +564,7 @@ ModuleChip {
text: ((root.price - root.low24h) / (root.high24h - root.low24h) * 100).toFixed(1) + "% of range"
color: t.cryptoPopupDim
font.pixelSize: 11
renderType: Text.NativeRendering
}
}
@@ -595,6 +601,7 @@ ModuleChip {
color: t.cryptoDown
font.pixelSize: 10
font.family: "monospace"
renderType: Text.NativeRendering
}
Item { Layout.fillWidth: true }
Text {
@@ -602,6 +609,7 @@ ModuleChip {
color: t.cryptoUp
font.pixelSize: 10
font.family: "monospace"
renderType: Text.NativeRendering
}
}
}

View File

@@ -505,7 +505,7 @@ ModuleChip {
mask: Region { item: toastCol }
readonly property bool shareEdge: (root.isTop && !atBottom) || (!root.isTop && atBottom)
readonly property int edgeGap: shareEdge ? root.barMargin + root.barHeight + 10 : root.barMargin + 10
readonly property int edgeGap: shareEdge ? root.barMargin + root.barHeight + root.barEdgePad + 10 : root.barMargin + 10
readonly property int toastPad: root.barMargin + Cfg.Config.frameBorderWidth + Cfg.Config.notifToastEdgePad
Column {
@@ -577,9 +577,9 @@ ModuleChip {
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
anchors.topMargin: root.isTop ? (root.barHeight + root.barEdgePad + 10) : 0
anchors.bottomMargin: root.isTop ? 0 : (root.barHeight + root.barEdgePad + 10)
height: parent.height - root.barHeight - root.barEdgePad - 10
clip: true

View File

@@ -367,9 +367,9 @@ ModuleChip {
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
anchors.topMargin: root.isTop ? (Cfg.Config.barHeight + root.barEdgePad + 8) : 0
anchors.bottomMargin: root.isTop ? 0 : (Cfg.Config.barHeight + root.barEdgePad + 8)
height: parent.height - Cfg.Config.barHeight - root.barEdgePad - 8
PopupCard {
id: menuCard

View File

@@ -10,6 +10,7 @@ Rectangle {
property var targetScreen: null
property int barHeight: Cfg.Config.barHeight
property int barMargin: Cfg.Config.margin
property int barEdgePad: Cfg.Config.frameVariant === "bar" ? (Cfg.Config.barPosition === "top" ? Cfg.Config.frameBarPadTop : Cfg.Config.frameBarPadBottom) : 0
readonly property var t: Cfg.Config.theme
property bool moduleEnabled: true

View File

@@ -56,9 +56,9 @@ PanelWindow {
anchors.top: chipRoot && chipRoot.isTop ? parent.top : undefined
anchors.bottom: chipRoot && chipRoot.isTop ? undefined : parent.bottom
anchors.topMargin: chipRoot && chipRoot.isTop ? (chipRoot.barHeight + 10) : 0
anchors.bottomMargin: chipRoot && chipRoot.isTop ? 0 : (chipRoot.barHeight + 10)
height: chipRoot ? parent.height - chipRoot.barHeight - 10 : parent.height
anchors.topMargin: chipRoot && chipRoot.isTop ? (chipRoot.barHeight + chipRoot.barEdgePad + 10) : 0
anchors.bottomMargin: chipRoot && chipRoot.isTop ? 0 : (chipRoot.barHeight + chipRoot.barEdgePad + 10)
height: chipRoot ? parent.height - chipRoot.barHeight - chipRoot.barEdgePad - 10 : parent.height
clip: true
}

View File

@@ -6,7 +6,7 @@ import "themes"
QtObject {
id: root
readonly property var theme: Tranquil
readonly property var theme: Snowy
// ────────────────────────────────────────────────────────────────────────
// Widgets
@@ -21,12 +21,19 @@ QtObject {
// ────────────────────────────────────────────────────────────────────────
// BAR
// ────────────────────────────────────────────────────────────────────────
property string barPosition: "bottom"
property int barHeight: 35
property int margin: 15
property int radius: 20
// ────────────────────────────────────────────────────────────────────────
// FRAME
// ────────────────────────────────────────────────────────────────────────
property string frameVariant: "bar" // "card" or "bar"
property int frameBorderWidth: 3
property int frameBarPadTop: 5 // bar variant: padding from top edge
property int frameBarPadBottom: 5 // bar variant: padding from bottom edge
// ── Position & Dimensions ─────────────────────────────────────────────────
property string barPosition: "bottom"
property int barHeight: 35
property int margin: 15
property int radius: 20
// ── Module Lists ──────────────────────────────────────────────────────────
property var leftModules: ["Logo", "Stats", "Crypto"]
@@ -91,10 +98,7 @@ QtObject {
property int volumeInputMax: 200
// ────────────────────────────────────────────────────────────────────────
// FRAME
// ────────────────────────────────────────────────────────────────────────
property int frameBorderWidth: 3
// ────────────────────────────────────────────────────────────────────────
// NOTIFICATIONS

View File

@@ -17,5 +17,7 @@ singleton Autumn 1.0 autumn.qml
singleton Pinkie 1.0 pinkie.qml
singleton Lowlight 1.0 lowlight.qml
singleton Tranquil 1.0 tranquil.qml
singleton Snowy 1.0 snowy.qml

367
config/themes/snowy.qml Normal file
View File

@@ -0,0 +1,367 @@
pragma Singleton
import QtQuick
import Quickshell
QtObject {
id: theme
// ── Wallpaper ──────────────────────────────────────────────────────────────
readonly property string wallpaper: Quickshell.env("HOME") + "/.config/quickshell/wallpapers/snowy.jpg"
// ── Base Backgrounds ───────────────────────────────────────────────────────
readonly property color bg: "#cc0f1120" // Deep mountain shadow night
readonly property color bgPanel: "transparent"
readonly property color bgPopup: "#cc0f1120" // Deep slate valley dark
readonly property color bgFrame: bg
// ── Separators ────────────────────────────────────────────────────────────
readonly property color separator: "#334a5270" // Cool blue-grey ridge line
// ── Text ──────────────────────────────────────────────────────────────────
readonly property color textMain: "#ffe8eaf0" // Snow highlight white
readonly property color textDim: "#996a7090" // Hazy blue-grey mist
// ── Accent & Borders ──────────────────────────────────────────────────────
readonly property color accent: "#ffc4889e" // Alpenglow rose-mauve
readonly property color border: "transparent"
readonly property color frameBorder: "transparent"
readonly property color borderPopup: "transparent"
// ── 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
// ── Mpris Module ──────────────────────────────────────────────────────────
readonly property color mprisAccent: accent
readonly property color mprisTextMain: textMain
readonly property color mprisTextDim: textDim
readonly property color mprisTrackColor: statsTrackColor
readonly property color mprisButtonText: bgPopup
readonly property color mprisAlbumBg: Qt.alpha(accent, 0.08)
readonly property color mprisAlbumBorder: Qt.alpha(accent, 0.15)
readonly property color mprisBtnBg: Qt.alpha(accent, 0.10)
readonly property color mprisBtnBgHover: Qt.alpha(accent, 0.22)
readonly property color mprisBtnBorder: Qt.alpha(accent, 0.20)
readonly property color mprisBtnBorderHover: Qt.alpha(accent, 0.45)
readonly property color mprisBtnIcon: accent
readonly property color mprisBtnIconHover: Qt.lighter(accent, 1.3)
// ── Stats Module (Variation: Alpine Pulse) ────────────────────────────────
readonly property color statsBg: bgPanel
readonly property color statsBorder: border
readonly property color statsCpuColor: "#ffc4845a" // Sunlit amber rock face
readonly property color statsMemColor: "#ff8ab4d4" // Glacial sky blue
readonly property color statsDiskColor: "#ff94c4b8" // Frozen teal snowmelt
readonly property color statsTrackColor: "#15ffffff"
readonly property color statsCpuTempColor: "#ffcb6080" // Deep alpenglow crimson
readonly property color statsGpuColor: "#ffb09ad4" // Twilight lavender peak
// ── SysInfo Module ────────────────────────────────────────────────────────
readonly property color sysInfoAccent: accent
readonly property color sysInfoTextMain: textMain
readonly property color sysInfoTextDim: textDim
readonly property color sysInfoCpuColor: statsCpuColor
readonly property color sysInfoMemColor: statsMemColor
readonly property color sysInfoDiskColor: statsDiskColor
readonly property color sysInfoCpuTempColor: statsCpuTempColor
readonly property color sysInfoGpuColor: statsGpuColor
readonly property color sysInfoTrackColor: statsTrackColor
// ── Volume Module (Variation: Frozen Dusk) ────────────────────────────────
readonly property color volBg: bgPanel
readonly property color volBgHover: "#224a5270"
readonly property color volBorder: border
readonly property color volBorderHover: "#ff73d0ff" // Luminous sky blue
readonly property color volPopupBg: bgPopup
readonly property color volPopupBorder: borderPopup
readonly property color volIcon: "#ff73d0ff" // Luminous sky blue
readonly property color volIconMuted: "#ff4a5270" // Deep slate mute
readonly property color volTrack: "#22ffffff"
readonly property color volHandle: accent
readonly property color volHandleBorder: "#33ffffff"
readonly property color volMuteBg: "#33cb6080"
readonly property color volPickerHover: "#15c4889e"
// ── Volume Limit Buttons ────────────────────────────────────────────────
readonly property color volLimitBtn: "transparent"
readonly property color volLimitBtnHover: "#22c4889e"
readonly property color volLimitBtnPress: accent
readonly property color volOutputLimitBtnPress: accent
readonly property color volInputLimitBtnPress: statusInfo
readonly property color volOutputLimitBtnHover: Qt.alpha(accent, 0.08)
readonly property color volInputLimitBtnHover: Qt.alpha(statusInfo, 0.08)
// ── 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: "#ffc4889e" // Alpenglow rose
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: "#ffc4889e" // Alpenglow rose
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: "#ffc4889e" // Alpenglow rose
readonly property color netPopupText: textMain
readonly property color netPopupDim: textDim
readonly property color netFieldBg: "#22ffffff"
readonly property color netCancelBgHover: "#22ffffff"
readonly property color netConnectText: "#ff0f1120"
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)
readonly property color netWifiIconOk: "#ff87d97c" // Vibrant meadow green
readonly property color netWifiIconErr: "#ffcb6080" // Alpenglow crimson
readonly property color netEthIconOk: "#ff87d97c" // Vibrant meadow green
readonly property color netEthIconErr: "#ffcb6080"
// ── Calendar Popup ─────────────────────────────────────────────────────────
readonly property color calCardBg: bgPopup
readonly property color calCardBorder: borderPopup
readonly property color calSeparator: separator
readonly property color calTodayBg: accent
readonly property color borderToday: accent
readonly property color todayText: "#ffffffff"
readonly property color clockPopupHeader: "#ffc4889e" // Alpenglow rose
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: "#ffc4889e" // Alpenglow rose on hover
readonly property color calArrowBg: "transparent"
readonly property color calArrowBgHover: "#22c4889e" // Soft rose tint
readonly property color calArrowBgPress: "#ffc4889e" // Full alpenglow
// ── Weather Module ──────────────────────────────────────────────────────
readonly property color weatherAccent: accent
readonly property color weatherTextMain: textMain
readonly property color weatherTextDim: textDim
readonly property color weatherTempColor: "#ffcb6080" // Alpenglow crimson
readonly property color weatherFeelsColor: "#ffb09ad4" // Twilight lavender
readonly property color weatherHumidColor: "#ff8ab4d4" // Glacial sky blue
readonly property color weatherWindColor: "#ff94c4b8" // Frozen teal
// ── 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: "#334a5270"
readonly property color wsActiveText: "#ff0f1120"
readonly property color wsInactiveText: textMain
readonly property color wsHoverText: "#ffffffff"
readonly property color wsMagicActiveBg: "#ff8ab4d4" // Glacial blue magic
readonly property color wsMagicActiveText: wsActiveText
// ── 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: "#22c4889e" // Soft alpenglow rose tint
readonly property color trayMenuCheck: accent
readonly property color trayMenuSeparator: separator
// ── Launcher (Variation: Summit Mist) ─────────────────────────────────────
readonly property color launcherBg: bgPopup
readonly property color launcherBorder: borderPopup
readonly property color launcherInput: "#44080a12"
readonly property color launcherInputBorderFocus: accent
readonly property color launcherPill: "#444a5270"
readonly property color launcherText: textMain
readonly property color launcherDim: textDim
readonly property color launcherAccent: accent
readonly property color launcherHover: "#22c4889e"
readonly property color launcherSelected: "#44c4889e"
readonly property color launcherModeActiveText: "#ffffffff"
readonly property color launcherModeActiveBg: accent
// ── Status Colors ──────────────────────────────────────────────────────────
readonly property color statusOk: "#ff87d97c" // Vibrant meadow green
readonly property color statusWarn: "#ffc4845a" // Sunlit amber rock
readonly property color statusErr: "#ffcb6080" // Alpenglow crimson
readonly property color statusInfo: "#ff73d0ff" // Luminous 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: Alpenglow) ────────────────────────────────────
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: accent
// ── Urgency colours ────────────────────────────────────────────────────────
readonly property color notifUrgencyCritical: statusErr
readonly property color notifUrgencyNormal: accent
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: "#11c4889e"
readonly property color notifHistoryEmpty: textDim
// ── BgDate Module ──────────────────────────────────────────────────────────
readonly property color bgDateText: "#ffffffff" // Pure snow white
readonly property color bgDateShadow: "#88000000" // Deep mountain shadow
readonly property color bgDateSecondsText: bgDateText
// ── 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: "#ff87d97c" // ▲ vibrant meadow green
readonly property color cryptoDown: "#ffcb6080" // ▼ alpenglow crimson
// Popup card
readonly property color cryptoPopupBg: bgPopup
readonly property color cryptoPopupBorder: borderPopup
readonly property color cryptoPopupHeader: "#ffc4889e" // Alpenglow rose
readonly property color cryptoPopupText: textMain
readonly property color cryptoPopupDim: textDim
// Tinted surfaces
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)
readonly property color cryptoFieldBg: "#15ffffff"
readonly property color cryptoFieldBgFocus: "#22ffffff"
readonly property color cryptoRangeTrack: "#1affffff"
readonly property color cryptoTextOnAccent: "#ff0f1120"
readonly property color cryptoPlaceholder: Qt.rgba(textDim.r, textDim.g, textDim.b, 0.33)
// ── Polkit Dialog ──────────────────────────────────────────────────────────
// Overlay
readonly property color polkitOverlayBg: "#bb000000" // dim backdrop
// Card chrome
readonly property color polkitCardBg: bgPopup
readonly property color polkitCardBorder: border
// Lock icon
readonly property color polkitIconBg: "#1ec4889e" // translucent rose fill
readonly property color polkitIconBorder: "#44c4889e" // rose ring
readonly property color polkitIconColor: accent // glyph — alpenglow rose
// Text hierarchy
readonly property color polkitTitle: textMain
readonly property color polkitMessage: "#cce8eaf0" // slightly dimmed snow white
// Action-ID pill
readonly property color polkitPillBg: "#1a4a5270" // muted slate tint
readonly property color polkitPillText: "#666a7090" // dim blue-grey label
// Divider
readonly property color polkitDivider: "#334a5270"
// Supplementary message — error state
readonly property color polkitSuppErrBg: "#1acb6080" // translucent crimson fill
readonly property color polkitSuppErrBorder: "#44cb6080" // crimson ring
readonly property color polkitSuppErrText: statusErr
// Supplementary message — info / ok state
readonly property color polkitSuppOkBg: "#1aa8c4a0" // translucent pine fill
readonly property color polkitSuppOkBorder: "#44a8c4a0" // pine ring
readonly property color polkitSuppOkText: statusOk
// Fields
readonly property color polkitFieldBg: "#44080a12" // deep dark fill
readonly property color polkitFieldBorder: "#22ffffff" // inactive border
readonly property color polkitFieldBorderFocus: accent // focused border — alpenglow rose
// Identity selector
readonly property color polkitUserLabel: "#996a7090" // "User:" prefix
readonly property color polkitUserValue: accent
// Input prompt
readonly property color polkitInputPrompt: "#886a7090"
// TextInput
readonly property color polkitInputText: textMain
readonly property color polkitInputSelection: "#55c4889e" // rose selection highlight
readonly property color polkitInputSelectedText: bg
// Eye toggle
readonly property color polkitEyeIcon: "#666a7090"
readonly property color polkitEyeIconHover: accent
// Authenticate button
readonly property color polkitAuthBg: "#ddc4889e" // slightly-muted rose fill
readonly property color polkitAuthBgHover: accent // full alpenglow on hover
readonly property color polkitAuthText: bg
// Cancel button
readonly property color polkitCancelBg: "#0dffffff"
readonly property color polkitCancelBgHover: "#22ffffff"
readonly property color polkitCancelBorder: "#22ffffff"
readonly property color polkitCancelText: "#cce8eaf0"
}

View File

@@ -13,7 +13,8 @@ PanelWindow {
id: root
property bool isTop: true
property int barHeight: Cfg.Config.barHeight
readonly property int barEdgePad: Cfg.Config.frameVariant === "bar" ? (isTop ? Cfg.Config.frameBarPadTop : Cfg.Config.frameBarPadBottom) : 0
property int barHeight: Cfg.Config.barHeight + barEdgePad
property int barMargin: Cfg.Config.margin
readonly property var t: Cfg.Config.theme
@@ -32,14 +33,28 @@ PanelWindow {
property var allItems: []
property bool loading: false
property int lastCacheUpdate: 0
property var favoriteIds: []
readonly property string favoritesPath: Quickshell.env("HOME") + "/.config/quickshell/launcher/favorites.txt"
readonly property int defaultIndex: Cfg.Config.launcherSelectFirst ? 0 : -1
readonly property var filteredItems: {
const q = searchInput.text.toLowerCase()
if (!q) return allItems.slice(0, 80)
return allItems.filter(i => i.name.toLowerCase().includes(q))
let filtered
if (!q) {
filtered = allItems.slice(0, 80)
} else {
filtered = allItems.filter(i => i.name.toLowerCase().startsWith(q))
}
const favs = filtered.filter(i => root.favoriteIds.includes(i.id))
const rest = filtered.filter(i => !root.favoriteIds.includes(i.id))
const result = []
if (favs.length > 0)
result.push(...favs.map(i => Object.assign({}, i, { section: "Favorites" })))
if (rest.length > 0)
result.push(...rest.map(i => Object.assign({}, i, { section: "All Applications" })))
return result
}
function toggle() {
@@ -59,6 +74,7 @@ PanelWindow {
searchInput.text = ""
resultsList.currentIndex = root.defaultIndex
loadItems()
loadFavorites()
Qt.callLater(() => searchInput.forceActiveFocus())
}
@@ -131,6 +147,34 @@ PanelWindow {
return args
}
function loadFavorites() {
favoritesReadProc.command = ["sh", "-c", "cat " + shellQuote(favoritesPath) + " 2>/dev/null || true"]
favoritesReadProc.running = true
}
function saveFavorites() {
if (favoriteIds.length === 0) {
favoritesWriteProc.command = ["sh", "-c", ": > " + shellQuote(favoritesPath)]
} else {
const quoted = favoriteIds.map(id => shellQuote(id)).join(" ")
favoritesWriteProc.command = ["sh", "-c",
"printf '%s\\n' " + quoted + " > " + shellQuote(favoritesPath)]
}
favoritesWriteProc.running = true
}
function toggleFavorite(itemId) {
const arr = favoriteIds.slice()
const idx = arr.indexOf(itemId)
if (idx >= 0) {
arr.splice(idx, 1)
} else {
arr.push(itemId)
}
favoriteIds = arr
saveFavorites()
}
function launch(item) {
if (!item || !item.exec) return
@@ -193,6 +237,22 @@ PanelWindow {
Process { id: launchProc }
Process {
id: favoritesReadProc
property string rawData: ""
stdout: SplitParser { onRead: data => favoritesReadProc.rawData += data + "\n" }
onRunningChanged: {
if (!running) {
if (rawData.trim()) {
root.favoriteIds = rawData.trim().split("\n").filter(l => l.length > 0)
}
rawData = ""
}
}
}
Process { id: favoritesWriteProc }
MouseArea {
anchors.fill: parent
@@ -311,6 +371,21 @@ PanelWindow {
currentIndex: root.defaultIndex
spacing: 2
section.property: "section"
section.criteria: ViewSection.FullString
section.delegate: Rectangle {
width: resultsList.width
height: 28
color: "transparent"
Text {
anchors { left: parent.left; leftMargin: 12; verticalCenter: parent.verticalCenter }
text: section
color: t.launcherDim
font.pixelSize: 11
font.weight: Font.Bold
}
}
onModelChanged: currentIndex = root.defaultIndex
ScrollBar.vertical: ScrollBar { policy: ScrollBar.AsNeeded }
@@ -365,6 +440,18 @@ PanelWindow {
Layout.fillWidth: true
elide: Text.ElideRight
}
Item {
width: 22; height: 22
Layout.alignment: Qt.AlignVCenter
Text {
anchors.centerIn: parent
text: root.favoriteIds.includes(modelData.id) ? "★" : "☆"
color: root.favoriteIds.includes(modelData.id) ? t.launcherAccent : t.launcherDim
font.pixelSize: 14
}
}
}
MouseArea {
@@ -372,7 +459,13 @@ PanelWindow {
hoverEnabled: true
onEntered: parent.hovered = true
onExited: parent.hovered = false
onClicked: root.launch(modelData)
onClicked: mouse => {
if (mouse.x >= width - 46) {
root.toggleFavorite(modelData.id)
} else {
root.launch(modelData)
}
}
}
}
}

View File

@@ -39,7 +39,7 @@ ShellRoot {
// ── Spacing Gap: Top / Bottom ────────────────────────────────────────
Variants {
model: Quickshell.screens
model: Cfg.Config.frameVariant === "bar" ? [] : Quickshell.screens
PanelWindow {
required property var modelData
screen: modelData
@@ -59,7 +59,7 @@ ShellRoot {
// ── Spacing Gap: Left ────────────────────────────────────────────────
Variants {
model: Quickshell.screens
model: Cfg.Config.frameVariant === "bar" ? [] : Quickshell.screens
PanelWindow {
required property var modelData
screen: modelData
@@ -74,7 +74,7 @@ ShellRoot {
// ── Spacing Gap: Right ───────────────────────────────────────────────
Variants {
model: Quickshell.screens
model: Cfg.Config.frameVariant === "bar" ? [] : Quickshell.screens
PanelWindow {
required property var modelData
screen: modelData
@@ -161,6 +161,36 @@ ShellRoot {
var ctx = getContext("2d")
ctx.clearRect(0, 0, width, height)
if (Cfg.Config.frameVariant === "bar") {
var barW = width - Cfg.Config.margin * 2
var barH = Cfg.Config.barHeight
var barX = Cfg.Config.margin
var barY = root.isTop ? Cfg.Config.frameBarPadTop : height - Cfg.Config.frameBarPadBottom - barH
var r = Math.min(Cfg.Config.radius, barH / 2)
ctx.fillStyle = root.frameBackground
ctx.beginPath()
ctx.moveTo(barX + r, barY)
ctx.lineTo(barX + barW - r, barY)
ctx.arcTo(barX + barW, barY, barX + barW, barY + r, r)
ctx.lineTo(barX + barW, barY + barH - r)
ctx.arcTo(barX + barW, barY + barH, barX + barW - r, barY + barH, r)
ctx.lineTo(barX + r, barY + barH)
ctx.arcTo(barX, barY + barH, barX, barY + barH - r, r)
ctx.lineTo(barX, barY + r)
ctx.arcTo(barX, barY, barX + r, barY, r)
ctx.closePath()
ctx.fill()
if (Cfg.Config.frameBorderWidth > 0) {
ctx.lineWidth = Cfg.Config.frameBorderWidth
ctx.strokeStyle = root.frameBorderColor
ctx.stroke()
}
return
}
var mT = root.isTop ? Cfg.Config.barHeight : Cfg.Config.margin
var mB = root.isTop ? Cfg.Config.margin : Cfg.Config.barHeight
var r = Cfg.Config.radius

BIN
wallpapers/snowy.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 MiB

View File

@@ -29,8 +29,9 @@ PanelWindow {
readonly property var t: Cfg.Config.theme
readonly property bool isTop: Cfg.Config.barPosition === "top"
readonly property int frameTop: isTop ? Cfg.Config.barHeight : Cfg.Config.margin
readonly property int frameBot: isTop ? Cfg.Config.margin : Cfg.Config.barHeight
readonly property int barEdgePad: Cfg.Config.frameVariant === "bar" ? (isTop ? Cfg.Config.frameBarPadTop : Cfg.Config.frameBarPadBottom) : 0
readonly property int frameTop: isTop ? Cfg.Config.barHeight + barEdgePad : Cfg.Config.margin
readonly property int frameBot: isTop ? Cfg.Config.margin : Cfg.Config.barHeight + barEdgePad
readonly property int inset: Cfg.Config.margin + Cfg.Config.frameBorderWidth + 8
readonly property int sbWidth: 260
readonly property bool isLeft: Cfg.Config.sideBarPosition === "left"

View File

@@ -47,6 +47,7 @@ Rectangle {
: root.t.mprisTextDim
)
font.pixelSize: primary ? 22 : 18
font.weight: Font.Bold
Behavior on color { ColorAnimation { duration: 150 } }
}

View File

@@ -132,6 +132,7 @@ Item {
text: "󰎆"
color: root.t.mprisAccent
font.pixelSize: 18
font.weight: Font.Bold
}
}
@@ -144,7 +145,7 @@ Item {
text: root.activePlayer ? root.formatIdentity(root.activePlayer.identity) : "No media"
color: root.t.mprisTextMain
font.pixelSize: 13
font.weight: Font.DemiBold
font.weight: Font.Bold
elide: Text.ElideRight
Layout.fillWidth: true
}
@@ -152,6 +153,7 @@ Item {
text: root.playbackStatusText()
color: root.t.mprisTextDim
font.pixelSize: 10
font.weight: Font.Bold
opacity: 0.75
}
}
@@ -204,6 +206,7 @@ Item {
text: "󰝚"
color: root.t.mprisAccent
font.pixelSize: 28
font.weight: Font.Bold
visible: root.activePlayer && (root.activePlayer.trackArtUrl === "" || !albumArt.visible)
}
}
@@ -217,7 +220,7 @@ Item {
text: root.activePlayer ? (root.activePlayer.trackTitle || "Unknown Title") : ""
color: root.t.mprisTextMain
font.pixelSize: 13
font.weight: Font.Medium
font.weight: Font.Bold
elide: Text.ElideRight
maximumLineCount: 2
wrapMode: Text.WordWrap
@@ -228,6 +231,7 @@ Item {
text: root.activePlayer ? (root.activePlayer.trackArtist || "Unknown Artist") : ""
color: root.t.mprisTextDim
font.pixelSize: 11
font.weight: Font.Bold
elide: Text.ElideRight
Layout.fillWidth: true
}
@@ -236,6 +240,7 @@ Item {
text: root.activePlayer ? (root.activePlayer.trackAlbum || "") : ""
color: root.t.mprisTextDim
font.pixelSize: 10
font.weight: Font.Bold
opacity: 0.7
elide: Text.ElideRight
visible: root.activePlayer && root.activePlayer.trackAlbum !== ""
@@ -277,6 +282,7 @@ Item {
text: root.activePlayer ? root.formatDuration(root.activePlayer.position) : "0:00"
color: root.t.mprisTextDim
font.pixelSize: 9
font.weight: Font.Bold
Layout.alignment: Qt.AlignLeft
}
@@ -286,6 +292,7 @@ Item {
text: root.activePlayer ? root.formatDuration(root.activePlayer.length) : "0:00"
color: root.t.mprisTextDim
font.pixelSize: 9
font.weight: Font.Bold
Layout.alignment: Qt.AlignRight
}
}
@@ -302,6 +309,7 @@ Item {
text: root.volumeIcon()
color: root.activePlayer && root.activePlayer.volume > 0 ? root.t.mprisAccent : root.t.mprisTextDim
font.pixelSize: 16
font.weight: Font.Bold
Layout.alignment: Qt.AlignVCenter
}

View File

@@ -243,6 +243,7 @@ ColumnLayout {
text: "󰌽"
color: root.t.sysInfoAccent
font.pixelSize: 20
font.weight: Font.Bold
}
}
@@ -255,7 +256,7 @@ ColumnLayout {
text: root.osName
color: root.t.sysInfoTextMain
font.pixelSize: 13
font.weight: Font.DemiBold
font.weight: Font.Bold
elide: Text.ElideRight
Layout.fillWidth: true
}
@@ -263,6 +264,7 @@ ColumnLayout {
text: root.kernelVer
color: root.t.sysInfoTextDim
font.pixelSize: 10
font.weight: Font.Bold
opacity: 0.75
elide: Text.ElideRight
Layout.fillWidth: true
@@ -421,6 +423,7 @@ ColumnLayout {
text: "󰅐"
color: root.t.sysInfoAccent
font.pixelSize: 12
font.weight: Font.Bold
}
}
@@ -428,6 +431,7 @@ ColumnLayout {
text: "Uptime"
color: root.t.sysInfoTextDim
font.pixelSize: 12
font.weight: Font.Bold
Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter
}
@@ -436,7 +440,7 @@ ColumnLayout {
text: root.uptimeStr
color: root.t.sysInfoTextMain
font.pixelSize: 12
font.weight: Font.Medium
font.weight: Font.Bold
Layout.alignment: Qt.AlignVCenter
}
}
@@ -458,6 +462,7 @@ ColumnLayout {
text: ""
color: root.t.sysInfoAccent
font.pixelSize: 12
font.weight: Font.Bold
}
}
@@ -465,6 +470,7 @@ ColumnLayout {
text: "Kernel"
color: root.t.sysInfoTextDim
font.pixelSize: 12
font.weight: Font.Bold
Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter
}
@@ -473,7 +479,7 @@ ColumnLayout {
text: root.kernelVer
color: root.t.sysInfoTextMain
font.pixelSize: 12
font.weight: Font.Medium
font.weight: Font.Bold
Layout.alignment: Qt.AlignVCenter
}
}
@@ -515,6 +521,7 @@ ColumnLayout {
: "󰂃"
color: parent.battIconColor
font.pixelSize: 12
font.weight: Font.Bold
}
}
@@ -522,6 +529,7 @@ ColumnLayout {
text: "Battery"
color: root.t.sysInfoTextDim
font.pixelSize: 12
font.weight: Font.Bold
Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter
}
@@ -530,6 +538,7 @@ ColumnLayout {
text: Math.round(root.battPct) + "%"
color: root.t.sysInfoTextMain
font.pixelSize: 12
font.weight: Font.Bold
Layout.alignment: Qt.AlignVCenter
}
}
@@ -575,6 +584,7 @@ ColumnLayout {
text: root.netOnline ? "󰤨" : "󰤭"
color: root.netOnline ? root.t.statusOk : root.t.sysInfoTextDim
font.pixelSize: 12
font.weight: Font.Bold
}
}
@@ -582,6 +592,7 @@ ColumnLayout {
text: "Network"
color: root.t.sysInfoTextDim
font.pixelSize: 12
font.weight: Font.Bold
Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter
}
@@ -590,7 +601,7 @@ ColumnLayout {
text: root.netOnline ? "Connected" : "Offline"
color: root.netOnline ? root.t.statusOk : root.t.statusErr
font.pixelSize: 12
font.weight: Font.Medium
font.weight: Font.Bold
Layout.alignment: Qt.AlignVCenter
}
}

View File

@@ -42,6 +42,7 @@ Item {
text: root.icon
color: root.iconColor
font.pixelSize: 12
font.weight: Font.Bold
}
}
@@ -49,6 +50,7 @@ Item {
text: root.label
color: root.dimColor
font.pixelSize: 12
font.weight: Font.Bold
Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter
}
@@ -57,7 +59,7 @@ Item {
text: root.value
color: root.textColor
font.pixelSize: 12
font.weight: Font.Medium
font.weight: Font.Bold
Layout.alignment: Qt.AlignVCenter
}
}

View File

@@ -88,6 +88,7 @@ Item {
text: root.icon
color: root.t.weatherAccent
font.pixelSize: 18
font.weight: Font.Bold
}
}
@@ -100,7 +101,7 @@ Item {
text: root.condition
color: root.t.weatherTextMain
font.pixelSize: 13
font.weight: Font.DemiBold
font.weight: Font.Bold
elide: Text.ElideRight
Layout.fillWidth: true
}
@@ -108,6 +109,7 @@ Item {
text: root.location
color: root.t.weatherTextDim
font.pixelSize: 10
font.weight: Font.Bold
opacity: 0.75
elide: Text.ElideRight
Layout.fillWidth: true
@@ -130,6 +132,7 @@ Item {
text: "󰑐"
color: refreshMouse.containsMouse ? root.t.weatherAccent : root.t.weatherTextDim
font.pixelSize: 14
font.weight: Font.Bold
Behavior on color { ColorAnimation { duration: 150 } }
RotationAnimator {
@@ -183,6 +186,7 @@ Item {
text: "󰔄"
color: root.t.weatherTempColor
font.pixelSize: 12
font.weight: Font.Bold
}
}
@@ -190,6 +194,7 @@ Item {
text: "Temperature"
color: root.t.weatherTextDim
font.pixelSize: 12
font.weight: Font.Bold
Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter
}
@@ -198,7 +203,7 @@ Item {
text: root.temp
color: root.t.weatherTextMain
font.pixelSize: 12
font.weight: Font.Medium
font.weight: Font.Bold
Layout.alignment: Qt.AlignVCenter
}
}
@@ -220,6 +225,7 @@ Item {
text: "󰔄"
color: root.t.weatherFeelsColor
font.pixelSize: 12
font.weight: Font.Bold
}
}
@@ -227,6 +233,7 @@ Item {
text: "Feels like"
color: root.t.weatherTextDim
font.pixelSize: 12
font.weight: Font.Bold
Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter
}
@@ -235,7 +242,7 @@ Item {
text: root.feelsLike
color: root.t.weatherTextMain
font.pixelSize: 12
font.weight: Font.Medium
font.weight: Font.Bold
Layout.alignment: Qt.AlignVCenter
}
}
@@ -257,6 +264,7 @@ Item {
text: "󰃚"
color: root.t.weatherHumidColor
font.pixelSize: 12
font.weight: Font.Bold
}
}
@@ -264,6 +272,7 @@ Item {
text: "Humidity"
color: root.t.weatherTextDim
font.pixelSize: 12
font.weight: Font.Bold
Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter
}
@@ -272,7 +281,7 @@ Item {
text: root.humidity
color: root.t.weatherTextMain
font.pixelSize: 12
font.weight: Font.Medium
font.weight: Font.Bold
Layout.alignment: Qt.AlignVCenter
}
}
@@ -294,6 +303,7 @@ Item {
text: "󰖝"
color: root.t.weatherWindColor
font.pixelSize: 12
font.weight: Font.Bold
}
}
@@ -301,6 +311,7 @@ Item {
text: "Wind"
color: root.t.weatherTextDim
font.pixelSize: 12
font.weight: Font.Bold
Layout.fillWidth: true
Layout.alignment: Qt.AlignVCenter
}
@@ -309,7 +320,7 @@ Item {
text: root.wind
color: root.t.weatherTextMain
font.pixelSize: 12
font.weight: Font.Medium
font.weight: Font.Bold
Layout.alignment: Qt.AlignVCenter
}
}