Merge branch 'main' into feat/llm-chat-tab
C++ / fmt (pull_request) Successful in 4s
C++ / build (pull_request) Failing after 2m3s
C++ / clang-tidy (pull_request) Failing after 2m2s
JS/TS / fmt (pull_request) Failing after 12s
JS/TS / lint (pull_request) Successful in 9s
Python / static (pull_request) Successful in 29s
Rust / build (pull_request) Successful in 51s
Python / verify (pull_request) Successful in 1m35s
Rust / fmt (pull_request) Successful in 33s
Rust / clippy (pull_request) Successful in 57s
C++ / fmt (pull_request) Successful in 4s
C++ / build (pull_request) Failing after 2m3s
C++ / clang-tidy (pull_request) Failing after 2m2s
JS/TS / fmt (pull_request) Failing after 12s
JS/TS / lint (pull_request) Successful in 9s
Python / static (pull_request) Successful in 29s
Rust / build (pull_request) Successful in 51s
Python / verify (pull_request) Successful in 1m35s
Rust / fmt (pull_request) Successful in 33s
Rust / clippy (pull_request) Successful in 57s
This commit is contained in:
@@ -40,7 +40,7 @@ Item {
|
|||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
|
|
||||||
sourceComponent: BatteryIcon {
|
sourceComponent: BatteryIcon {
|
||||||
devState: Battery.deviceStateString
|
devState: Battery.deviceStateString.toLowerCase()
|
||||||
percentage: Battery.currentPerc
|
percentage: Battery.currentPerc
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ ColumnLayout {
|
|||||||
Layout.alignment: Qt.AlignVCenter
|
Layout.alignment: Qt.AlignVCenter
|
||||||
color: Colors.palette.m3secondary
|
color: Colors.palette.m3secondary
|
||||||
font.bold: true
|
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)
|
font.pointSize: Math.floor(Tokens.font.size.extraLarge * 3 * root.centerScale)
|
||||||
text: Time.hourStr
|
text: Time.hourStr
|
||||||
}
|
}
|
||||||
@@ -38,7 +38,7 @@ ColumnLayout {
|
|||||||
Layout.alignment: Qt.AlignVCenter
|
Layout.alignment: Qt.AlignVCenter
|
||||||
color: Colors.palette.m3primary
|
color: Colors.palette.m3primary
|
||||||
font.bold: true
|
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)
|
font.pointSize: Math.floor(Tokens.font.size.extraLarge * 3 * root.centerScale)
|
||||||
text: ":"
|
text: ":"
|
||||||
}
|
}
|
||||||
@@ -47,7 +47,7 @@ ColumnLayout {
|
|||||||
Layout.alignment: Qt.AlignVCenter
|
Layout.alignment: Qt.AlignVCenter
|
||||||
color: Colors.palette.m3secondary
|
color: Colors.palette.m3secondary
|
||||||
font.bold: true
|
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)
|
font.pointSize: Math.floor(Tokens.font.size.extraLarge * 3 * root.centerScale)
|
||||||
text: Time.minuteStr
|
text: Time.minuteStr
|
||||||
}
|
}
|
||||||
@@ -58,7 +58,7 @@ ColumnLayout {
|
|||||||
Layout.topMargin: -Tokens.padding.large * 2
|
Layout.topMargin: -Tokens.padding.large * 2
|
||||||
color: Colors.palette.m3tertiary
|
color: Colors.palette.m3tertiary
|
||||||
font.bold: true
|
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)
|
font.pointSize: Math.floor(Tokens.font.size.extraLarge * root.centerScale)
|
||||||
text: Time.format("dddd, d MMMM yyyy")
|
text: Time.format("dddd, d MMMM yyyy")
|
||||||
}
|
}
|
||||||
@@ -226,7 +226,7 @@ ColumnLayout {
|
|||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
animateProp: "opacity"
|
animateProp: "opacity"
|
||||||
color: Colors.palette.m3onSurfaceVariant
|
color: Colors.palette.m3onSurfaceVariant
|
||||||
font.family: Appearance.font.family.mono
|
font.family: Config.appearance.font.family.mono
|
||||||
horizontalAlignment: Qt.AlignHCenter
|
horizontalAlignment: Qt.AlignHCenter
|
||||||
lineHeight: 1.2
|
lineHeight: 1.2
|
||||||
opacity: shouldBeVisible && !message.msg ? 1 : 0
|
opacity: shouldBeVisible && !message.msg ? 1 : 0
|
||||||
@@ -295,7 +295,7 @@ ColumnLayout {
|
|||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
anchors.right: parent.right
|
anchors.right: parent.right
|
||||||
color: Colors.palette.m3error
|
color: Colors.palette.m3error
|
||||||
font.family: Appearance.font.family.mono
|
font.family: Config.appearance.font.family.mono
|
||||||
font.pointSize: Tokens.font.size.small
|
font.pointSize: Tokens.font.size.small
|
||||||
horizontalAlignment: Qt.AlignHCenter
|
horizontalAlignment: Qt.AlignHCenter
|
||||||
opacity: 0
|
opacity: 0
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ pragma ComponentBehavior: Bound
|
|||||||
|
|
||||||
import Quickshell
|
import Quickshell
|
||||||
import Quickshell.Wayland
|
import Quickshell.Wayland
|
||||||
|
import QtQuick
|
||||||
import ZShell.Internal
|
import ZShell.Internal
|
||||||
import ZShell.Config
|
import ZShell.Config
|
||||||
import qs.Helpers
|
import qs.Helpers
|
||||||
@@ -30,12 +31,12 @@ Scope {
|
|||||||
Quickshell.execDetached(action);
|
Quickshell.execDetached(action);
|
||||||
}
|
}
|
||||||
|
|
||||||
LidWatcher {
|
LidWatcher {
|
||||||
onAboutToSleep: root.lock.lock.locked = true
|
onAboutToSleep: root.lock.lock.locked = true
|
||||||
}
|
}
|
||||||
|
|
||||||
Variants {
|
Variants {
|
||||||
model: Config.general.idle.timeouts
|
model: Config.general.idle.timeouts.values
|
||||||
|
|
||||||
IdleMonitor {
|
IdleMonitor {
|
||||||
required property var modelData
|
required property var modelData
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ Item {
|
|||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
animate: true
|
animate: true
|
||||||
color: root.pam.passwd.active ? Colors.palette.m3secondary : Colors.palette.m3outline
|
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
|
font.pointSize: Tokens.font.size.normal
|
||||||
opacity: root.buffer ? 0 : 1
|
opacity: root.buffer ? 0 : 1
|
||||||
text: {
|
text: {
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ ColumnLayout {
|
|||||||
Layout.fillWidth: true
|
Layout.fillWidth: true
|
||||||
color: Colors.palette.m3outline
|
color: Colors.palette.m3outline
|
||||||
elide: Text.ElideRight
|
elide: Text.ElideRight
|
||||||
font.family: Appearance.font.family.mono
|
font.family: Config.appearance.font.family.mono
|
||||||
font.weight: 500
|
font.weight: 500
|
||||||
text: NotifServer.list.length > 0 ? qsTr("%1 notification%2").arg(NotifServer.list.length).arg(NotifServer.list.length === 1 ? "" : "s") : qsTr("Notifications")
|
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 {
|
CustomText {
|
||||||
Layout.alignment: Qt.AlignHCenter
|
Layout.alignment: Qt.AlignHCenter
|
||||||
color: Colors.palette.m3outlineVariant
|
color: Colors.palette.m3outlineVariant
|
||||||
font.family: Appearance.font.family.mono
|
font.family: Config.appearance.font.family.mono
|
||||||
font.pointSize: Tokens.font.size.large
|
font.pointSize: Tokens.font.size.large
|
||||||
font.weight: 500
|
font.weight: 500
|
||||||
text: qsTr("No Notifications")
|
text: qsTr("No Notifications")
|
||||||
|
|||||||
+17
-20
@@ -73,20 +73,21 @@ Scope {
|
|||||||
|
|
||||||
// mask: Region { item: inputPanel }
|
// mask: Region { item: inputPanel }
|
||||||
|
|
||||||
Rectangle {
|
CustomRect {
|
||||||
id: inputPanel
|
id: inputPanel
|
||||||
|
|
||||||
anchors.centerIn: parent
|
anchors.centerIn: parent
|
||||||
color: Colors.tPalette.m3surface
|
color: Colors.tPalette.m3surface
|
||||||
implicitHeight: layout.childrenRect.height + 28
|
implicitHeight: layout.implicitHeight + layout.anchors.margins * 2
|
||||||
implicitWidth: layout.childrenRect.width + 32
|
implicitWidth: Math.max(layout.implicitWidth + layout.anchors.margins * 2, 450)
|
||||||
opacity: 0
|
opacity: 0
|
||||||
radius: Tokens.rounding.small * 2
|
radius: Tokens.rounding.small * 2
|
||||||
|
|
||||||
ColumnLayout {
|
ColumnLayout {
|
||||||
id: layout
|
id: layout
|
||||||
|
|
||||||
anchors.centerIn: parent
|
anchors.fill: parent
|
||||||
|
anchors.margins: Tokens.padding.medium
|
||||||
|
|
||||||
RowLayout {
|
RowLayout {
|
||||||
id: contentRow
|
id: contentRow
|
||||||
@@ -130,7 +131,7 @@ Scope {
|
|||||||
Layout.preferredWidth: Math.min(600, contentWidth)
|
Layout.preferredWidth: Math.min(600, contentWidth)
|
||||||
font.bold: true
|
font.bold: true
|
||||||
font.pointSize: 16
|
font.pointSize: 16
|
||||||
text: polkitAgent.flow?.message
|
text: polkitAgent.flow?.message ?? ""
|
||||||
wrapMode: Text.WordWrap
|
wrapMode: Text.WordWrap
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -147,8 +148,8 @@ Scope {
|
|||||||
TextField {
|
TextField {
|
||||||
id: passInput
|
id: passInput
|
||||||
|
|
||||||
|
Layout.fillWidth: true
|
||||||
Layout.preferredHeight: 40
|
Layout.preferredHeight: 40
|
||||||
Layout.preferredWidth: contentColumn.implicitWidth
|
|
||||||
color: Colors.palette.m3onSurfaceVariant
|
color: Colors.palette.m3onSurfaceVariant
|
||||||
echoMode: polkitAgent.flow?.responseVisible ? TextInput.Normal : TextInput.Password
|
echoMode: polkitAgent.flow?.responseVisible ? TextInput.Normal : TextInput.Password
|
||||||
placeholderText: polkitAgent.flow?.failed ? " Incorrect Password" : " Input Password"
|
placeholderText: polkitAgent.flow?.failed ? " Incorrect Password" : " Input Password"
|
||||||
@@ -168,7 +169,7 @@ Scope {
|
|||||||
id: showPassCheckbox
|
id: showPassCheckbox
|
||||||
|
|
||||||
Layout.alignment: Qt.AlignLeft
|
Layout.alignment: Qt.AlignLeft
|
||||||
checked: polkitAgent.flow?.responseVisible
|
checked: polkitAgent.flow?.responseVisible ?? false
|
||||||
text: "Show Password"
|
text: "Show Password"
|
||||||
|
|
||||||
onCheckedChanged: {
|
onCheckedChanged: {
|
||||||
@@ -189,7 +190,8 @@ Scope {
|
|||||||
clip: true
|
clip: true
|
||||||
color: Colors.tPalette.m3surfaceContainerLow
|
color: Colors.tPalette.m3surfaceContainerLow
|
||||||
implicitHeight: 0
|
implicitHeight: 0
|
||||||
radius: 16
|
implicitWidth: textDetailsColumn.implicitWidth + textDetailsColumn.anchors.margins * 2
|
||||||
|
radius: Tokens.rounding.medium
|
||||||
visible: true
|
visible: true
|
||||||
|
|
||||||
Behavior on open {
|
Behavior on open {
|
||||||
@@ -197,7 +199,8 @@ Scope {
|
|||||||
Anim {
|
Anim {
|
||||||
property: "implicitHeight"
|
property: "implicitHeight"
|
||||||
target: detailsPanel
|
target: detailsPanel
|
||||||
to: !detailsPanel.open ? textDetailsColumn.childrenRect.height + 16 : 0
|
to: !detailsPanel.open ? textDetailsColumn.implicitHeight + Tokens.padding.small * 2 : 0
|
||||||
|
type: Anim.DefaultEffects
|
||||||
}
|
}
|
||||||
|
|
||||||
Anim {
|
Anim {
|
||||||
@@ -205,12 +208,6 @@ Scope {
|
|||||||
target: textDetailsColumn
|
target: textDetailsColumn
|
||||||
to: !detailsPanel.open ? 1 : 0
|
to: !detailsPanel.open ? 1 : 0
|
||||||
}
|
}
|
||||||
|
|
||||||
Anim {
|
|
||||||
property: "scale"
|
|
||||||
target: textDetailsColumn
|
|
||||||
to: !detailsPanel.open ? 1 : 0.9
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -218,10 +215,9 @@ Scope {
|
|||||||
id: textDetailsColumn
|
id: textDetailsColumn
|
||||||
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
anchors.margins: 8
|
anchors.margins: Tokens.padding.small
|
||||||
opacity: 0
|
opacity: 0
|
||||||
scale: 0.9
|
spacing: Tokens.spacing.small
|
||||||
spacing: 8
|
|
||||||
|
|
||||||
CustomText {
|
CustomText {
|
||||||
text: `actionId: ${polkitAgent.flow?.actionId}`
|
text: `actionId: ${polkitAgent.flow?.actionId}`
|
||||||
@@ -239,16 +235,17 @@ Scope {
|
|||||||
Layout.preferredWidth: contentRow.implicitWidth
|
Layout.preferredWidth: contentRow.implicitWidth
|
||||||
spacing: 8
|
spacing: 8
|
||||||
|
|
||||||
IconTextButton {
|
IconButton {
|
||||||
id: detailsButton
|
id: detailsButton
|
||||||
|
|
||||||
Layout.alignment: Qt.AlignLeft
|
Layout.alignment: Qt.AlignLeft
|
||||||
|
horizontalPadding: Tokens.padding.medium
|
||||||
icon: "info"
|
icon: "info"
|
||||||
inactiveColor: Colors.palette.m3surfaceContainer
|
inactiveColor: Colors.palette.m3surfaceContainer
|
||||||
inactiveOnColor: Colors.palette.m3onSurface
|
inactiveOnColor: Colors.palette.m3onSurface
|
||||||
isRound: true
|
isRound: true
|
||||||
shapeMorph: true
|
shapeMorph: true
|
||||||
text: "Details"
|
verticalPadding: Tokens.padding.medium
|
||||||
|
|
||||||
onClicked: {
|
onClicked: {
|
||||||
panelWindow.detailsOpen = !panelWindow.detailsOpen;
|
panelWindow.detailsOpen = !panelWindow.detailsOpen;
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ It includes a configurable top bar, launcher, notifications daemon + sidebar, wa
|
|||||||
## Highlights
|
## Highlights
|
||||||
|
|
||||||
- Multi-window shell layout driven by `Drawers/Windows.qml` and panel/interactions wrappers
|
- 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
|
- 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
|
- 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
|
- Dynamic Material 3 palette generation from wallpaper, optional template rendering, terminal sequence application
|
||||||
@@ -47,16 +46,25 @@ Core requirements:
|
|||||||
- Hyprland (Wayland session integration)
|
- Hyprland (Wayland session integration)
|
||||||
- Python 3 for scheme/wallpaper tooling
|
- 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):
|
Used by major features (install as needed for your setup):
|
||||||
|
|
||||||
- `app2unit` (launcher app execution)
|
- `app2unit` (launcher app execution)
|
||||||
- `nmcli` (network integration)
|
- `nmcli` (network integration)
|
||||||
- `brightnessctl`, `ddcutil` (brightness controls)
|
- `brightnessctl`, `ddcutil` (brightness controls)
|
||||||
- `wl-copy`, `swappy` (picker/screenshot flow)
|
- `wl-copy` (clipboard integration)
|
||||||
- `libqalculate` (launcher calculator)
|
|
||||||
- `PipeWire` + audio stack + `aubio`/`cava` paths for media visualization
|
- `PipeWire` + audio stack + `aubio`/`cava` paths for media visualization
|
||||||
|
- `libqalculate` (launcher calculator)
|
||||||
- `gsettings` (optional GTK dark/light mode sync)
|
- `gsettings` (optional GTK dark/light mode sync)
|
||||||
|
|
||||||
## Build and Install
|
## Build and Install
|
||||||
@@ -180,7 +188,7 @@ Important state/cache files:
|
|||||||
- `~/.local/state/zshell/apps.sqlite`
|
- `~/.local/state/zshell/apps.sqlite`
|
||||||
- `~/.cache/zshell/`
|
- `~/.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`
|
- `general`
|
||||||
- `appearance`
|
- `appearance`
|
||||||
@@ -265,7 +273,6 @@ Note: Template rendering (Jinja2) applies generated colors to `~/.config/zshell/
|
|||||||
### `screenshot` — area picker
|
### `screenshot` — area picker
|
||||||
|
|
||||||
- `start` — open interactive area picker
|
- `start` — open interactive area picker
|
||||||
- `start-freeze` — freeze screen then pick
|
|
||||||
|
|
||||||
### `wallpaper` — wallpaper management
|
### `wallpaper` — wallpaper management
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user