diff --git a/Modules/Bar/Components/StatusIcons/UPowerWidget.qml b/Modules/Bar/Components/StatusIcons/UPowerWidget.qml index 0b1ab6d..8cdc2a7 100644 --- a/Modules/Bar/Components/StatusIcons/UPowerWidget.qml +++ b/Modules/Bar/Components/StatusIcons/UPowerWidget.qml @@ -40,7 +40,7 @@ Item { anchors.centerIn: parent sourceComponent: BatteryIcon { - devState: Battery.deviceStateString + devState: Battery.deviceStateString.toLowerCase() percentage: Battery.currentPerc } } diff --git a/Modules/Lock/Center.qml b/Modules/Lock/Center.qml index fc98815..06ad24b 100644 --- a/Modules/Lock/Center.qml +++ b/Modules/Lock/Center.qml @@ -29,7 +29,7 @@ ColumnLayout { Layout.alignment: Qt.AlignVCenter color: Colors.palette.m3secondary font.bold: true - font.family: Appearance.font.family.clock + font.family: Config.appearance.font.family.clock font.pointSize: Math.floor(Tokens.font.size.extraLarge * 3 * root.centerScale) text: Time.hourStr } @@ -38,7 +38,7 @@ ColumnLayout { Layout.alignment: Qt.AlignVCenter color: Colors.palette.m3primary font.bold: true - font.family: Appearance.font.family.clock + font.family: Config.appearance.font.family.clock font.pointSize: Math.floor(Tokens.font.size.extraLarge * 3 * root.centerScale) text: ":" } @@ -47,7 +47,7 @@ ColumnLayout { Layout.alignment: Qt.AlignVCenter color: Colors.palette.m3secondary font.bold: true - font.family: Appearance.font.family.clock + font.family: Config.appearance.font.family.clock font.pointSize: Math.floor(Tokens.font.size.extraLarge * 3 * root.centerScale) text: Time.minuteStr } @@ -58,7 +58,7 @@ ColumnLayout { Layout.topMargin: -Tokens.padding.large * 2 color: Colors.palette.m3tertiary font.bold: true - font.family: Appearance.font.family.mono + font.family: Config.appearance.font.family.mono font.pointSize: Math.floor(Tokens.font.size.extraLarge * root.centerScale) text: Time.format("dddd, d MMMM yyyy") } @@ -226,7 +226,7 @@ ColumnLayout { anchors.right: parent.right animateProp: "opacity" color: Colors.palette.m3onSurfaceVariant - font.family: Appearance.font.family.mono + font.family: Config.appearance.font.family.mono horizontalAlignment: Qt.AlignHCenter lineHeight: 1.2 opacity: shouldBeVisible && !message.msg ? 1 : 0 @@ -295,7 +295,7 @@ ColumnLayout { anchors.left: parent.left anchors.right: parent.right color: Colors.palette.m3error - font.family: Appearance.font.family.mono + font.family: Config.appearance.font.family.mono font.pointSize: Tokens.font.size.small horizontalAlignment: Qt.AlignHCenter opacity: 0 diff --git a/Modules/Lock/IdleMonitors.qml b/Modules/Lock/IdleMonitors.qml index df2f1b0..af75788 100644 --- a/Modules/Lock/IdleMonitors.qml +++ b/Modules/Lock/IdleMonitors.qml @@ -2,6 +2,7 @@ pragma ComponentBehavior: Bound import Quickshell import Quickshell.Wayland +import QtQuick import ZShell.Internal import ZShell.Config import qs.Helpers @@ -30,12 +31,12 @@ Scope { Quickshell.execDetached(action); } - LidWatcher { - onAboutToSleep: root.lock.lock.locked = true - } + LidWatcher { + onAboutToSleep: root.lock.lock.locked = true + } Variants { - model: Config.general.idle.timeouts + model: Config.general.idle.timeouts.values IdleMonitor { required property var modelData diff --git a/Modules/Lock/InputField.qml b/Modules/Lock/InputField.qml index e211280..67511c3 100644 --- a/Modules/Lock/InputField.qml +++ b/Modules/Lock/InputField.qml @@ -41,7 +41,7 @@ Item { anchors.centerIn: parent animate: true color: root.pam.passwd.active ? Colors.palette.m3secondary : Colors.palette.m3outline - font.family: Appearance.font.family.mono + font.family: Config.appearance.font.family.mono font.pointSize: Tokens.font.size.normal opacity: root.buffer ? 0 : 1 text: { diff --git a/Modules/Lock/NotifDock.qml b/Modules/Lock/NotifDock.qml index 0511ebf..3b468a9 100644 --- a/Modules/Lock/NotifDock.qml +++ b/Modules/Lock/NotifDock.qml @@ -24,7 +24,7 @@ ColumnLayout { Layout.fillWidth: true color: Colors.palette.m3outline elide: Text.ElideRight - font.family: Appearance.font.family.mono + font.family: Config.appearance.font.family.mono font.weight: 500 text: NotifServer.list.length > 0 ? qsTr("%1 notification%2").arg(NotifServer.list.length).arg(NotifServer.list.length === 1 ? "" : "s") : qsTr("Notifications") } @@ -66,7 +66,7 @@ ColumnLayout { CustomText { Layout.alignment: Qt.AlignHCenter color: Colors.palette.m3outlineVariant - font.family: Appearance.font.family.mono + font.family: Config.appearance.font.family.mono font.pointSize: Tokens.font.size.large font.weight: 500 text: qsTr("No Notifications") diff --git a/Modules/Polkit/Polkit.qml b/Modules/Polkit/Polkit.qml index d6e749a..7bff94e 100644 --- a/Modules/Polkit/Polkit.qml +++ b/Modules/Polkit/Polkit.qml @@ -73,20 +73,21 @@ Scope { // mask: Region { item: inputPanel } - Rectangle { + CustomRect { id: inputPanel anchors.centerIn: parent color: Colors.tPalette.m3surface - implicitHeight: layout.childrenRect.height + 28 - implicitWidth: layout.childrenRect.width + 32 + implicitHeight: layout.implicitHeight + layout.anchors.margins * 2 + implicitWidth: Math.max(layout.implicitWidth + layout.anchors.margins * 2, 450) opacity: 0 radius: Tokens.rounding.small * 2 ColumnLayout { id: layout - anchors.centerIn: parent + anchors.fill: parent + anchors.margins: Tokens.padding.medium RowLayout { id: contentRow @@ -130,7 +131,7 @@ Scope { Layout.preferredWidth: Math.min(600, contentWidth) font.bold: true font.pointSize: 16 - text: polkitAgent.flow?.message + text: polkitAgent.flow?.message ?? "" wrapMode: Text.WordWrap } @@ -147,8 +148,8 @@ Scope { TextField { id: passInput + Layout.fillWidth: true Layout.preferredHeight: 40 - Layout.preferredWidth: contentColumn.implicitWidth color: Colors.palette.m3onSurfaceVariant echoMode: polkitAgent.flow?.responseVisible ? TextInput.Normal : TextInput.Password placeholderText: polkitAgent.flow?.failed ? " Incorrect Password" : " Input Password" @@ -168,7 +169,7 @@ Scope { id: showPassCheckbox Layout.alignment: Qt.AlignLeft - checked: polkitAgent.flow?.responseVisible + checked: polkitAgent.flow?.responseVisible ?? false text: "Show Password" onCheckedChanged: { @@ -189,7 +190,8 @@ Scope { clip: true color: Colors.tPalette.m3surfaceContainerLow implicitHeight: 0 - radius: 16 + implicitWidth: textDetailsColumn.implicitWidth + textDetailsColumn.anchors.margins * 2 + radius: Tokens.rounding.medium visible: true Behavior on open { @@ -197,7 +199,8 @@ Scope { Anim { property: "implicitHeight" target: detailsPanel - to: !detailsPanel.open ? textDetailsColumn.childrenRect.height + 16 : 0 + to: !detailsPanel.open ? textDetailsColumn.implicitHeight + Tokens.padding.small * 2 : 0 + type: Anim.DefaultEffects } Anim { @@ -205,12 +208,6 @@ Scope { target: textDetailsColumn to: !detailsPanel.open ? 1 : 0 } - - Anim { - property: "scale" - target: textDetailsColumn - to: !detailsPanel.open ? 1 : 0.9 - } } } @@ -218,10 +215,9 @@ Scope { id: textDetailsColumn anchors.fill: parent - anchors.margins: 8 + anchors.margins: Tokens.padding.small opacity: 0 - scale: 0.9 - spacing: 8 + spacing: Tokens.spacing.small CustomText { text: `actionId: ${polkitAgent.flow?.actionId}` @@ -239,16 +235,17 @@ Scope { Layout.preferredWidth: contentRow.implicitWidth spacing: 8 - IconTextButton { + IconButton { id: detailsButton Layout.alignment: Qt.AlignLeft + horizontalPadding: Tokens.padding.medium icon: "info" inactiveColor: Colors.palette.m3surfaceContainer inactiveOnColor: Colors.palette.m3onSurface isRound: true shapeMorph: true - text: "Details" + verticalPadding: Tokens.padding.medium onClicked: { panelWindow.detailsOpen = !panelWindow.detailsOpen; diff --git a/README.md b/README.md index 6612e46..1ca52b4 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,6 @@ It includes a configurable top bar, launcher, notifications daemon + sidebar, wa ## Highlights - Multi-window shell layout driven by `Drawers/Windows.qml` and panel/interactions wrappers -- Configurable bar entries and popouts (audio, tray, network, power, resources, clock, active window) - Launcher with app DB frequency tracking, action commands, fuzzy search modes, and wallpaper/scheme flows - Notification server with persistence (`~/.local/state/zshell/notifs.json`) and sidebar UI - Dynamic Material 3 palette generation from wallpaper, optional template rendering, terminal sequence application @@ -47,16 +46,25 @@ Core requirements: - Hyprland (Wayland session integration) - Python 3 for scheme/wallpaper tooling -Make sure to have the newest Quickshell version! As of writing, version `0.2.0.r136.gfb08ece-1`. +Here's a list of package dependencies, names are from arch-packages so they +might differ slightly depending on your distro. + +``` +python python-pillow python-materialyoucolor libnotify cava +app2unit wl-clipboard dconf cliphist python-typer qt6-canvaspainter +python-build python-installer python-hatch python-hatch-vcs cmake ninja +``` + +Make sure to have the newest Quickshell version! As of writing, version `0.3.1.r1.g0fed22a-1`. Used by major features (install as needed for your setup): - `app2unit` (launcher app execution) - `nmcli` (network integration) - `brightnessctl`, `ddcutil` (brightness controls) -- `wl-copy`, `swappy` (picker/screenshot flow) -- `libqalculate` (launcher calculator) +- `wl-copy` (clipboard integration) - `PipeWire` + audio stack + `aubio`/`cava` paths for media visualization +- `libqalculate` (launcher calculator) - `gsettings` (optional GTK dark/light mode sync) ## Build and Install @@ -180,7 +188,7 @@ Important state/cache files: - `~/.local/state/zshell/apps.sqlite` - `~/.cache/zshell/` -Config is hot-reloaded and saved through `Config/Config.qml` serializers. Top-level sections include: +Config is hot-reloaded and saved through the `Config` singleton. Top-level sections include: - `general` - `appearance` @@ -265,7 +273,6 @@ Note: Template rendering (Jinja2) applies generated colors to `~/.config/zshell/ ### `screenshot` — area picker - `start` — open interactive area picker -- `start-freeze` — freeze screen then pick ### `wallpaper` — wallpaper management