Compare commits

..

7 Commits

Author SHA1 Message Date
samantha42
36ee6f35da removed eww and waybar added quickshell 2026-05-18 08:19:40 +02:00
samantha42
f7d6f07e3a get app icons for each workspace 2026-04-23 05:43:05 +02:00
samantha42
52fa42698f eww replacement of waybar 2026-04-20 20:37:54 +02:00
a240874719 Update readme.md 2026-04-19 07:29:54 +00:00
a5f8b51dad Update readme.md 2026-04-19 07:26:55 +00:00
6cc93eb031 Update readme.md 2026-04-19 07:26:34 +00:00
448b3ea8fc Update readme.md 2026-04-19 07:25:54 +00:00
30 changed files with 739 additions and 983 deletions

View File

@@ -1,48 +0,0 @@
* { all: unset; }
.volume-overlay {
background: rgba(15, 15, 20, 0.92);
border: 1px solid rgba(255,255,255,0.08);
border-radius: 12px;
padding: 16px;
backdrop-filter: blur(20px);
color: #e0e0e0;
font-family: "JetBrains Mono", monospace;
}
.header {
margin-bottom: 4px;
.header-icon { font-size: 18px; color: #33ccff; }
.header-title { font-size: 14px; font-weight: bold; color: #fff; }
}
.divider {
background: rgba(255,255,255,0.07);
min-height: 1px;
margin: 4px 0;
}
.sink-row {
padding: 4px 0;
.app-name { font-size: 12px; color: #aaa; min-width: 120px; }
.app-vol { font-size: 12px; color: #33ccff; margin-left: auto; }
.app-icon { font-size: 14px; color: #666; }
}
.vol-slider {
min-height: 20px;
trough { background: rgba(255,255,255,0.1); border-radius: 4px; min-height: 4px; }
highlight { background: linear-gradient(90deg, #33ccff, #00ff99); border-radius: 4px; }
slider { background: #fff; border-radius: 50%; min-width: 12px; min-height: 12px; }
}
.mute-btn {
margin-top: 8px;
background: rgba(255,255,255,0.06);
border-radius: 8px;
padding: 8px;
font-size: 13px;
color: #aaa;
&:hover { background: rgba(255,255,255,0.12); }
&.muted { color: #ff5555; background: rgba(255,85,85,0.1); }
}

View File

@@ -1,49 +0,0 @@
(defpoll volume :interval "1s"
"wpctl get-volume @DEFAULT_AUDIO_SINK@ | awk '{printf \"%d\", $2*100}'")
(defpoll muted :interval "1s"
"wpctl get-volume @DEFAULT_AUDIO_SINK@ | grep -c MUTED || echo 0")
(defpoll sink-inputs :interval "2s"
"~/.config/eww/scripts/get-sinks.sh")
(defwidget volume-overlay []
(box :class "volume-overlay" :orientation "v" :spacing 12 :space-evenly false
(box :class "header" :orientation "h" :space-evenly false :spacing 8
(label :class "header-icon" :text "󰕾")
(label :class "header-title" :text "Volume Mixer"))
(box :class "sink-row" :orientation "v" :spacing 4
(box :orientation "h" :space-evenly false :spacing 8
(label :class "app-icon" :text "󰓃")
(label :class "app-name" :text "Master")
(label :class "app-vol" :text "${volume}%"))
(scale :class "vol-slider master-slider"
:min 0 :max 100 :value volume
:onchange "wpctl set-volume @DEFAULT_AUDIO_SINK@ {}%"))
(box :class "divider")
(for sink in sink-inputs
(box :class "sink-row" :orientation "v" :spacing 4
(box :orientation "h" :space-evenly false :spacing 8
(label :class "app-icon" :text "󰓃")
(label :class "app-name" :text {sink.name})
(label :class "app-vol" :text "${sink.volume}%"))
(scale :class "vol-slider"
:min 0 :max 100 :value {sink.volume}
:onchange "wpctl set-volume ${sink.id} {}%")))
(button :class "mute-btn ${muted == "1" ? "muted" : ""}"
:onclick "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
(label :text "${muted == "1" ? "󰝟 Muted" : "󰕾 Mute"}"))))
(defwindow volume-mixer
:monitor 0
:geometry (geometry :x "0px" :y "40px"
:width "280px"
:anchor "top right")
:stacking "overlay"
:exclusive false
(volume-overlay))

View File

@@ -1,11 +0,0 @@
#!/bin/bash
# Get all sink inputs as JSON array for eww
pactl list sink-inputs | awk '
/^Sink Input/ { id=substr($3,2,length($3)-1) }
/application.name/ { gsub(/"/,"",$3); name=$3 }
/Volume:.*%/ {
match($0, /[0-9]+%/)
vol=substr($0,RSTART,RLENGTH-1)
printf "{\"id\":\"%s\",\"name\":\"%s\",\"volume\":\"%s\"}\n", id, name, vol
name=""; vol=""
}' | jq -s '.'

View File

@@ -1,6 +0,0 @@
#!/bin/bash
if eww active-windows | grep -q "volume-mixer"; then
eww close volume-mixer
else
eww open volume-mixer
fi

View File

@@ -1,131 +0,0 @@
#!/usr/bin/env bash
# ~/.config/hypr/2d-nav.sh
# 2D workspace navigation for Hyprland
# Workspaces are named "X" (base row) or "X-Y" (sub-row, Y >= 1)
# Usage: 2d-nav.sh [left|right|up|down|move-left|move-right|move-up|move-down]
set -euo pipefail
ACTION="${1:-}"
# --- Parse current workspace ---
# Returns e.g. "3" or "3-2"
get_current_ws() {
hyprctl activeworkspace -j | jq -r '.name'
}
# Split "X-Y" into X and Y parts
parse_ws() {
local name="$1"
if [[ "$name" =~ ^([0-9]+)-([0-9]+)$ ]]; then
echo "${BASH_REMATCH[1]} ${BASH_REMATCH[2]}"
elif [[ "$name" =~ ^([0-9]+)$ ]]; then
echo "${BASH_REMATCH[1]} 0"
else
# Named/special workspace we don't manage — bail
echo "0 0"
fi
}
make_ws_name() {
local x="$1" y="$2"
if [[ "$y" -eq 0 ]]; then
echo "$x"
else
echo "${x}-${y}"
fi
}
# Check if a named workspace currently exists (has at least one window OR is active)
ws_exists() {
local name="$1"
hyprctl workspaces -j | jq -e --arg n "$name" '.[] | select(.name == $n)' > /dev/null 2>&1
}
# Navigate to workspace (creates it on demand if going up; smart-back if going down)
go_to_ws() {
local name="$1"
hyprctl dispatch workspace "name:${name}"
}
move_window_to_ws() {
local name="$1"
hyprctl dispatch movetoworkspace "name:${name}"
}
# --- Main logic ---
current=$(get_current_ws)
read -r cx cy <<< "$(parse_ws "$current")"
# Min/max for X axis (your config has 1-5 on DP-2, 6-10 on HDMI-A-1)
# But for 2D nav we treat X as free-range 1..10
X_MIN=1
X_MAX=10
Y_MIN=0
Y_MAX=9 # Reasonable cap for sub-workspaces
case "$ACTION" in
right)
nx=$(( cx < X_MAX ? cx + 1 : cx ))
# When moving right, land on base row of target X (Y=0)
target=$(make_ws_name "$nx" 0)
go_to_ws "$target"
;;
left)
nx=$(( cx > X_MIN ? cx - 1 : cx ))
target=$(make_ws_name "$nx" 0)
go_to_ws "$target"
;;
up)
ny=$(( cy < Y_MAX ? cy + 1 : cy ))
target=$(make_ws_name "$cx" "$ny")
go_to_ws "$target"
;;
down)
if [[ "$cy" -gt 0 ]]; then
ny=$(( cy - 1 ))
# If the workspace below doesn't exist, fall back to base (Y=0), not Y=(cy-1)
target=$(make_ws_name "$cx" "$ny")
if [[ "$ny" -gt 0 ]] && ! ws_exists "$target"; then
target=$(make_ws_name "$cx" 0)
fi
else
target=$(make_ws_name "$cx" 0)
fi
go_to_ws "$target"
;;
# --- Move window variants ---
move-right)
nx=$(( cx < X_MAX ? cx + 1 : cx ))
target=$(make_ws_name "$nx" 0)
move_window_to_ws "$target"
;;
move-left)
nx=$(( cx > X_MIN ? cx - 1 : cx ))
target=$(make_ws_name "$nx" 0)
move_window_to_ws "$target"
;;
move-up)
ny=$(( cy < Y_MAX ? cy + 1 : cy ))
target=$(make_ws_name "$cx" "$ny")
move_window_to_ws "$target"
;;
move-down)
if [[ "$cy" -gt 0 ]]; then
ny=$(( cy - 1 ))
target=$(make_ws_name "$cx" "$ny")
if [[ "$ny" -gt 0 ]] && ! ws_exists "$target"; then
target=$(make_ws_name "$cx" 0)
fi
else
target=$(make_ws_name "$cx" 0)
fi
move_window_to_ws "$target"
;;
*)
echo "Usage: $0 [left|right|up|down|move-left|move-right|move-up|move-down]" >&2
exit 1
;;
esac

View File

@@ -14,8 +14,8 @@ DEPS=(
wofi wofi
thunar thunar
fastfetch fastfetch
waybar
jq jq
python-gobject # arch
) )
PASS=0 PASS=0

View File

@@ -59,10 +59,10 @@ env = HYPRCURSOR_SIZE,24
# https://wiki.hypr.land/Configuring/Variables/#general # https://wiki.hypr.land/Configuring/Variables/#general
general { general {
gaps_in = 5 gaps_in = 0
gaps_out = 10 gaps_out = 0
border_size = 2 border_size = 0
# https://wiki.hypr.land/Configuring/Variables/#variable-types for info about colors # https://wiki.hypr.land/Configuring/Variables/#variable-types for info about colors
col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg
@@ -79,8 +79,8 @@ general {
# https://wiki.hypr.land/Configuring/Variables/#decoration # https://wiki.hypr.land/Configuring/Variables/#decoration
decoration { decoration {
rounding = 4 rounding = 0
rounding_power = 2 rounding_power = 0
# Change transparency of focused and unfocused windows # Change transparency of focused and unfocused windows
active_opacity = 1.0 active_opacity = 1.0
@@ -88,7 +88,7 @@ decoration {
shadow { shadow {
enabled = true enabled = true
range = 4 range = 0
render_power = 3 render_power = 3
color = rgba(1a1a1aee) color = rgba(1a1a1aee)
} }
@@ -96,7 +96,7 @@ decoration {
# https://wiki.hypr.land/Configuring/Variables/#blur # https://wiki.hypr.land/Configuring/Variables/#blur
blur { blur {
enabled = true enabled = true
size = 3 size = 0
passes = 1 passes = 1
vibrancy = 0.1696 vibrancy = 0.1696
@@ -160,8 +160,9 @@ misc {
# https://wiki.hypr.land/Configuring/Variables/#input # https://wiki.hypr.land/Configuring/Variables/#input
input { input {
kb_layout = us,dk kb_layout = us,dk
kb_variant = ,
kb_options = grp:alt_shift_toggle
} }
# See https://wiki.hypr.land/Configuring/Gestures # See https://wiki.hypr.land/Configuring/Gestures
gesture = 3, horizontal, workspace gesture = 3, horizontal, workspace
@@ -186,7 +187,9 @@ bind = $mainMod, W, killactive,
bind = $mainMod, M, exec, command -v hyprshutdown >/dev/null 2>&1 && hyprshutdown || hyprctl dispatch exit bind = $mainMod, M, exec, command -v hyprshutdown >/dev/null 2>&1 && hyprshutdown || hyprctl dispatch exit
bind = $mainMod, R, exec, sh -c '~/.config/hypr/reload.sh' bind = $mainMod, R, exec, sh -c '~/.config/hypr/reload.sh'
bind = $mainMod, V, togglefloating, bind = $mainMod, V, togglefloating,
bind = $mainMod, space, exec, $menu #bind = $mainMod, space, exec, $menu
bind = SUPER, SPACE, exec, $menu
bind = $mainMod, F, exec, $fileManager
bind = $mainMod, P, pseudo, # dwindle bind = $mainMod, P, pseudo, # dwindle
bind = $mainMod, J, togglesplit, # dwindle bind = $mainMod, J, togglesplit, # dwindle
@@ -227,19 +230,6 @@ bind = SUPER SHIFT, left, movetoworkspacesilent, e-1
bind = SUPER ALT, right, movefocus, r bind = SUPER ALT, right, movefocus, r
bind = SUPER ALT, left, movefocus, l bind = SUPER ALT, left, movefocus, l
# Navigate workspaces (2D)
#bind = SUPER, right, exec, ~/.config/hypr/2d-nav.sh right && pkill -SIGRTMIN+8 waybar
#bind = SUPER, left, exec, ~/.config/hypr/2d-nav.sh left && pkill -SIGRTMIN+8 waybar
#bind = SUPER, up, exec, ~/.config/hypr/2d-nav.sh up && pkill -SIGRTMIN+8 waybar
#bind = SUPER, down, exec, ~/.config/hypr/2d-nav.sh down && pkill -SIGRTMIN+8 waybar
# Move window to workspace (2D)
#bind = SUPER SHIFT, right, exec, ~/.config/hypr/2d-nav.sh move-right && pkill -SIGRTMIN+8 waybar
#bind = SUPER SHIFT, left, exec, ~/.config/hypr/2d-nav.sh move-left && pkill -SIGRTMIN+8 waybar
#bind = SUPER SHIFT, up, exec, ~/.config/hypr/2d-nav.sh move-up && pkill -SIGRTMIN+8 waybar
#bind = SUPER SHIFT, down, exec, ~/.config/hypr/2d-nav.sh move-down && pkill -SIGRTMIN+8 waybar
# Example special workspace (scratchpad) # Example special workspace (scratchpad)
bind = $mainMod, S, exec, grim -g "$(slurp)" - | wl-copy bind = $mainMod, S, exec, grim -g "$(slurp)" - | wl-copy
@@ -316,53 +306,65 @@ windowrule {
} }
# env stuff # env stuff
exec-once = waybar --style ~/.config/waybar/style.css exec-once = quickshell
exec-once = hyprpaper exec-once = hyprpaper
exec-once = ~/.config/hypr/theme-cycle.sh exec-once = ~/.config/hypr/theme-cycle.sh
exec-once = [workspace 1 silent] firefox #rules
exec-once = [workspace 10 silent] firefox --new-instance windowrulev = nodecorate, class:.*
windowrule { windowrule {
name = firefox-to-ws2 name = firefox-to-ws1
match:class = ^(firefox)$ match:class = ^(firefox)$
workspace = 1 silent workspace = 1 silent
} }
windowrule { windowrule {
name = code-to-ws2 name = code-to-ws2
match:class = ^(code)$ match:class = ^(code-oss)$
workspace = 2 silent workspace = 2 silent
} }
windowrule { windowrule {
name = vesktop-to-ws6 name = spotify-to-ws6
match:class = ^(vesktop)$ match:class = ^(spotify)$
workspace = 4 silent
}
windowrule {
name = vesktop-to-ws6
match:class = ^(vesktop)$
workspace = 4 silent
}
windowrule {
name = steam-to-ws7
match:class = ^(steam)$
workspace = 6 silent workspace = 6 silent
} }
windowrule { windowrule {
name = firefox-to-ws10 name = vesktop-to-ws9
match:class = ^(firefox)$ match:class = ^(vesktop)$
workspace = 10 silent workspace = 9 silent
} }
windowrule {
name = steam-to-ws5
match:class = ^(steam)$
workspace = 5 silent
}
windowrule { windowrule {
name = eww-volume-float name = eww-volume-float
match:class = ^(eww)$ match:class = ^(eww)$
float = yes float = yes
} }
windowrule {
name = wofi=thing
match:class = ^(wofi)$
float = yes
move = 50% 36
}
#launch apps
exec-once = firefox
exec-once = code
exec-once = xwaylandvideobridge
exec-once = vesktop --enable-features=UseOzonePlatform --ozone-platform=wayland
exec-once = steam
exec-once = spotify

View File

@@ -1,11 +1,6 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Reload Waybar if running, otherwise start it pgrep -x quickshell >/dev/null && quickshell kill; quickshell
if pgrep -x waybar >/dev/null; then
killall -SIGUSR2 waybar
else
setsid waybar &>/dev/null &
fi
# Restart hyprpaper # Restart hyprpaper
pkill hyprpaper 2>/dev/null pkill hyprpaper 2>/dev/null

View File

@@ -12,14 +12,14 @@ apply_day() {
for mon in "${MONITORS[@]}"; do for mon in "${MONITORS[@]}"; do
hyprctl hyprpaper wallpaper "$mon,$DAY_WALL" &>/dev/null hyprctl hyprpaper wallpaper "$mon,$DAY_WALL" &>/dev/null
done done
sh ~/.config/waybar/switch-theme.sh day #sh ~/.config/waybar/switch-theme.sh day
} }
apply_night() { apply_night() {
for mon in "${MONITORS[@]}"; do for mon in "${MONITORS[@]}"; do
hyprctl hyprpaper wallpaper "$mon,$NIGHT_WALL" &>/dev/null hyprctl hyprpaper wallpaper "$mon,$NIGHT_WALL" &>/dev/null
done done
sh ~/.config/waybar/switch-theme.sh night #sh ~/.config/waybar/switch-theme.sh night
} }
wait_for_hyprpaper() { wait_for_hyprpaper() {

View File

@@ -0,0 +1,29 @@
import QtQuick
// Mirrors eww clock-widget: click to toggle time ↔ date
Rectangle {
id: root
property string clockTime: ""
property string clockDate: ""
property bool showDate: false
implicitWidth: lbl.implicitWidth + 16
implicitHeight: 22
radius: 4
color: "#313244"
Text {
id: lbl
anchors.centerIn: parent
text: root.showDate ? root.clockDate : root.clockTime
color: "#cdd6f4"
font.pixelSize: 12
font.family: "monospace"
}
MouseArea {
anchors.fill: parent
onClicked: root.showDate = !root.showDate
}
}

8
quickshell/CpuWidget.qml Normal file
View File

@@ -0,0 +1,8 @@
import QtQuick
import Quickshell.Io
// eww cpu-widget
StatPill {
property string cpuUsage: ""
text: cpuUsage + "%"
}

71
quickshell/LogoutMenu.qml Normal file
View File

@@ -0,0 +1,71 @@
import QtQuick
import QtQuick.Layouts
import Quickshell.Io
// Mirrors eww logout-menu
Item {
id: root
property bool open: false
implicitHeight: 26
implicitWidth: lrow.implicitWidth
Row {
id: lrow
spacing: 4
layoutDirection: Qt.RightToLeft
// Toggle btn
Rectangle {
width: 26; height: 26; radius: 13
color: root.open ? "#89b4fa" : "#313244"
Text {
anchors.centerIn: parent
text: root.open ? "󰅖" : "󰍃"
color: root.open ? "#1e1e2e" : "#cdd6f4"
font.pixelSize: 14
}
MouseArea {
anchors.fill: parent
onClicked: root.open = !root.open
cursorShape: Qt.PointingHandCursor
}
}
// Revealed actions
Item {
id: menuReveal
width: root.open ? actionRow.implicitWidth + 8 : 0
height: 26
clip: true
Behavior on width { NumberAnimation { duration: 200; easing.type: Easing.InOutQuad } }
Row {
id: actionRow
anchors.verticalCenter: parent.verticalCenter
spacing: 4
x: 4
// Lock
PowerBtn { icon: "󰌾"; onActivated: run(["hyprlock"]) }
// Reboot
PowerBtn { icon: "󰜉"; onActivated: run(["systemctl","reboot"]) }
// Power off
PowerBtn { icon: "󰐥"; onActivated: run(["systemctl","poweroff"]) }
// Logout (exit Hyprland)
PowerBtn { icon: "󰍃"; onActivated: run(["hyprctl","dispatch","exit"]) }
}
}
}
function run(cmd) {
root.open = false
Qt.createQmlObject(
'import Quickshell.Io; Process { command: ' +
JSON.stringify(cmd) + '; running: true }',
root)
}
}

7
quickshell/MemWidget.qml Normal file
View File

@@ -0,0 +1,7 @@
import QtQuick
// eww mem-widget
StatPill {
property string memUsed: ""
text: memUsed + "G"
}

View File

@@ -0,0 +1,12 @@
import QtQuick
// eww network-widget
StatPill {
property string networkInfo: ""
text: {
if (networkInfo === "offline") return "Offline"
if (networkInfo.startsWith("wifi:")) return networkInfo
return networkInfo
}
}

28
quickshell/PowerBtn.qml Normal file
View File

@@ -0,0 +1,28 @@
import QtQuick
// Reusable icon button for LogoutMenu actions (eww center-btn)
Rectangle {
id: root
property string icon: ""
signal activated()
width: 26; height: 26; radius: 13
color: ma.containsMouse ? "#f38ba8" : "#313244"
Behavior on color { ColorAnimation { duration: 120 } }
Text {
anchors.centerIn: parent
text: root.icon
color: "#cdd6f4"
font.pixelSize: 13
}
MouseArea {
id: ma
anchors.fill: parent
hoverEnabled: true
onClicked: root.activated()
cursorShape: Qt.PointingHandCursor
}
}

View File

@@ -0,0 +1,13 @@
import QtQuick
import Quickshell.Io
// Simple settings icon button used on HDMI bar (eww settings-btn)
StatPill {
text: "󰒓"
clickable: true
onClicked: {
Qt.createQmlObject(
'import Quickshell.Io; Process { command: ["your-settings-command"]; running: true }',
parent)
}
}

100
quickshell/SettingsMenu.qml Normal file
View File

@@ -0,0 +1,100 @@
import QtQuick
import QtQuick.Layouts
import Quickshell.Io
// Mirrors eww settings-menu (revealer + toggle button)
Item {
id: root
property string volumeInfo: ""
property string networkInfo: ""
property string themeInfo: ""
// exposed so LogoutMenu can close us
property bool open: false
implicitHeight: 26
implicitWidth: row.implicitWidth
Row {
id: row
spacing: 4
layoutDirection: Qt.RightToLeft // toggle btn on the right, menu slides left
// Toggle button (eww center-btn)
Rectangle {
width: 26; height: 26; radius: 13
color: root.open ? "#89b4fa" : "#313244"
Text {
anchors.centerIn: parent
text: root.open ? "󰅖" : "󰒓"
color: root.open ? "#1e1e2e" : "#cdd6f4"
font.pixelSize: 14
}
MouseArea {
anchors.fill: parent
onClicked: root.open = !root.open
cursorShape: Qt.PointingHandCursor
}
}
// Revealed menu (slides in from right)
Item {
width: menuRow.implicitWidth + 8
height: 26
clip: true
// animate width for slide effect (like :transition slideright)
Behavior on width { NumberAnimation { duration: 200; easing.type: Easing.InOutQuad } }
// Collapsed when closed
states: State {
name: "hidden"
when: !root.open
PropertyChanges { target: menuReveal; width: 0 }
}
Item {
id: menuReveal
width: root.open ? menuRow.implicitWidth + 8 : 0
height: 26
clip: true
Behavior on width { NumberAnimation { duration: 200; easing.type: Easing.InOutQuad } }
Row {
id: menuRow
anchors.verticalCenter: parent.verticalCenter
spacing: 4
x: 4
ThemeWidget { themeInfo: root.themeInfo }
VolumeWidget { volumeInfo: root.volumeInfo }
NetworkWidget { networkInfo: root.networkInfo }
// wdisplays button
Rectangle {
width: 30; height: 22; radius: 11
color: "#313244"
Text {
anchors.centerIn: parent
text: "󰍹"
color: "#cdd6f4"
font.pixelSize: 13
}
MouseArea {
anchors.fill: parent
onClicked: {
root.open = false
Qt.createQmlObject(
'import Quickshell.Io; Process { command: ["wdisplays"]; running: true }',
root)
}
cursorShape: Qt.PointingHandCursor
}
}
}
}
}
}
}

34
quickshell/StatPill.qml Normal file
View File

@@ -0,0 +1,34 @@
import QtQuick
// Generic stat pill matches eww stat-pill
Rectangle {
id: root
property string text: ""
property bool clickable: false
signal clicked()
signal rightClicked()
implicitWidth: lbl.implicitWidth + 16
implicitHeight: 22
radius: 11 // fully rounded pill
color: "#313244"
Text {
id: lbl
anchors.centerIn: parent
text: root.text
color: "#cdd6f4"
font.pixelSize: 12
font.family: "monospace"
}
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.LeftButton | Qt.RightButton
onClicked: (mouse) => {
if (mouse.button === Qt.RightButton) root.rightClicked()
else root.clicked()
}
cursorShape: root.clickable ? Qt.PointingHandCursor : Qt.ArrowCursor
}
}

View File

@@ -0,0 +1,19 @@
import QtQuick
import Quickshell.Io
// eww theme-widget
StatPill {
property string themeInfo: ""
text: themeInfo
clickable: true
onClicked: launchTheme("next")
onRightClicked: launchTheme("auto")
function launchTheme(mode) {
Qt.createQmlObject(
'import Quickshell.Io; Process { command: ["bash","' +
Qt.resolvedUrl("../hypr/theme-cycle.sh") +
'","' + mode + '"]; running: true }', parent)
}
}

View File

@@ -0,0 +1,50 @@
import QtQuick
import Quickshell.Io
// eww volume-widget
Rectangle {
id: root
property string volumeInfo: ""
readonly property bool muted: volumeInfo.startsWith("muted")
readonly property int level: parseInt(volumeInfo) || 0
readonly property string icon:
muted ? "󰝟" :
level < 34 ? "󰕿" :
level < 67 ? "󰖀" : "󰕾"
implicitWidth: row.implicitWidth + 16
implicitHeight: 22
radius: 11
color: "#313244"
Row {
id: row
anchors.centerIn: parent
spacing: 4
Text {
text: root.icon
color: "#cdd6f4"
font.pixelSize: 13
}
Text {
text: root.muted ? "Muted" : root.level + "%"
color: "#cdd6f4"
font.pixelSize: 12
font.family: "monospace"
}
}
MouseArea {
anchors.fill: parent
onClicked: {
Qt.createQmlObject(
'import Quickshell.Io; Process { command: ["bash","' +
Qt.resolvedUrl("scripts/toggle-mixer.sh") +
'"]; running: true }', root)
}
cursorShape: Qt.PointingHandCursor
}
}

View File

@@ -0,0 +1,65 @@
import Quickshell
import Quickshell.Io
import Quickshell.Hyprland
import QtQuick
import QtQuick.Layouts
// Mirrors eww workspaces-widget / workspace-btn
Item {
id: root
property var workspaces: []
implicitHeight: row.implicitHeight
implicitWidth: row.implicitWidth
RowLayout {
id: row
spacing: 10
Repeater {
model: root.workspaces
// workspace-btn equivalent
Rectangle {
id: wsBtn
required property var modelData
readonly property bool active: modelData.active ?? false
readonly property bool urgent: modelData.urgent ?? false
readonly property bool empty: modelData.empty ?? false
implicitWidth: Math.max(label.implicitWidth + 16,
modelData.pxwidth ?? 28)
implicitHeight: 22
radius: 4
color: active ? "#89b4fa" // blue active
: urgent ? "#f38ba8" // red urgent
: empty ? "transparent" // ghost empty
: "#313244" // normal
border.color: empty && !active ? "#585b70" : "transparent"
border.width: empty && !active ? 1 : 0
Text {
id: label
anchors.centerIn: parent
text: wsBtn.modelData.label ?? ""
color: wsBtn.active ? "#1e1e2e" : "#cdd6f4"
font.pixelSize: 12
font.family: "monospace"
}
MouseArea {
anchors.fill: parent
onClicked: {
var proc = Qt.createQmlObject(
'import Quickshell.Io; Process { command: ["hyprctl","dispatch","workspace","' +
wsBtn.modelData.id + '"]; running: true }',
wsBtn)
}
}
}
}
}
}

247
quickshell/shell.qml Normal file
View File

@@ -0,0 +1,247 @@
import Quickshell
import Quickshell.Io
import Quickshell.Wayland
import Quickshell.Hyprland
import QtQuick
import QtQuick.Layouts
// ─────────────────────────────────────────────
// Shell root spawns one bar per screen
// ─────────────────────────────────────────────
ShellRoot {
id: root
// ── Global polled data ───────────────────
property string clockTime: ""
property string clockDate: ""
property string cpuUsage: ""
property string memUsed: ""
property string networkInfo: ""
property string volumeInfo: ""
property string themeInfo: ""
// Clock every second
Process {
id: clockTimeProc
command: ["date", "+%H:%M:%S"]
running: true
stdout: StdioCollector { onStreamFinished: clockTime = this.text.trim() }
}
Timer {
interval: 1000; running: true; repeat: true
onTriggered: clockTimeProc.running = true
}
Process {
id: clockDateProc
command: ["date", "+%A, %B %d %Y"]
running: true
stdout: StdioCollector { onStreamFinished: clockDate = this.text.trim() }
}
Timer {
interval: 1000; running: true; repeat: true
onTriggered: clockDateProc.running = true
}
// CPU every 2 s
Process {
id: cpuProc
command: ["bash", "-c", "top -bn1 | grep 'Cpu(s)' | awk '{print int($2+$4)}'"]
running: true
stdout: StdioCollector { onStreamFinished: cpuUsage = this.text.trim() }
}
Timer {
interval: 2000; running: true; repeat: true
onTriggered: cpuProc.running = true
}
// Memory every 2 s
Process {
id: memProc
command: ["bash", "-c", "free -g --si | awk '/Mem:/{printf \"%.1f\", $3}'"]
running: true
stdout: StdioCollector { onStreamFinished: memUsed = this.text.trim() }
}
Timer {
interval: 2000; running: true; repeat: true
onTriggered: memProc.running = true
}
// Network every 5 s
Process {
id: netProc
command: ["bash", Qt.resolvedUrl("scripts/get-network.sh")]
running: true
stdout: StdioCollector { onStreamFinished: networkInfo = this.text.trim() }
}
Timer {
interval: 5000; running: true; repeat: true
onTriggered: netProc.running = true
}
// Volume every 1 s
Process {
id: volProc
command: ["bash", Qt.resolvedUrl("scripts/get-volume.sh")]
running: true
stdout: StdioCollector { onStreamFinished: volumeInfo = this.text.trim() }
}
Timer {
interval: 1000; running: true; repeat: true
onTriggered: volProc.running = true
}
// Theme every 2 s
Process {
id: themeProc
command: ["bash", Qt.resolvedUrl("scripts/get-theme.sh")]
running: true
stdout: StdioCollector { onStreamFinished: themeInfo = this.text.trim() }
}
Timer {
interval: 2000; running: true; repeat: true
onTriggered: themeProc.running = true
}
// ── One bar per screen ───────────────────
Variants {
model: Quickshell.screens
PanelWindow {
id: bar
required property var modelData
screen: modelData
color: '#1c1d20'
anchors { top: true; left: true; right: true }
implicitHeight: 30
exclusiveZone: implicitHeight // reserve space (replaces :exclusive true)
// Which screen slot is this? (0 = primary → ws 15, 1 = secondary → ws 610)
property int screenIndex: {
var screens = Quickshell.screens
for (var i = 0; i < screens.length; i++) {
if (screens[i] === modelData) return i
}
return 0
}
// The 5 workspace IDs that belong to this bar
readonly property int wsFirst: screenIndex === 0 ? 1 : 6
readonly property int wsLast: screenIndex === 0 ? 5 : 10
// ── Bar layout (centerbox equivalent) ──
RowLayout {
anchors.fill: parent
spacing: 0
anchors.leftMargin: 8
anchors.rightMargin: 8
// LEFT workspaces (native Hyprland model, filtered per screen)
Item {
Layout.fillWidth: true
Layout.fillHeight: true
Row {
anchors { left: parent.left; verticalCenter: parent.verticalCenter }
spacing: 4
Repeater {
// Always show slots wsFirst..wsLast, even if Hyprland
// hasn't created the workspace yet (shows as empty).
model: bar.wsLast - bar.wsFirst + 1
delegate: Rectangle {
required property int index
readonly property int wsId: bar.wsFirst + index
// Look up live workspace from Hyprland
readonly property HyprlandWorkspace liveWs: {
for (var i = 0; i < Hyprland.workspaces.values.length; i++) {
if (Hyprland.workspaces.values[i].id === wsId)
return Hyprland.workspaces.values[i]
}
return null
}
readonly property bool active: Hyprland.focusedMonitor !== null
&& Hyprland.focusedMonitor.activeWorkspace !== null
&& Hyprland.focusedMonitor.activeWorkspace.id === wsId
&& Hyprland.focusedMonitor.name === bar.modelData.name
readonly property bool occupied: liveWs !== null
&& liveWs.windowCount > 0
implicitWidth: 22
implicitHeight: 22
radius: 4
color: active ? "#89b4fa" // focused
: occupied ? "#313244" // has windows
: "transparent" // empty
border.color: active ? "transparent" : "#585b70"
border.width: active ? 0 : 1
Text {
anchors.centerIn: parent
text: wsId
color: active ? "#1e1e2e" : "#cdd6f4"
font.pixelSize: 11
font.family: "monospace"
}
MouseArea {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onClicked: Hyprland.dispatch("workspace " + wsId)
}
}
}
}
}
// CENTER clock
Item {
Layout.fillWidth: true
Layout.fillHeight: true
ClockWidget {
anchors.centerIn: parent
clockTime: root.clockTime
clockDate: root.clockDate
}
}
// RIGHT stats + menus
Item {
Layout.fillWidth: true
Layout.fillHeight: true
RowLayout {
anchors { right: parent.right; verticalCenter: parent.verticalCenter }
spacing: 2
// Primary screen (0) gets full menus; secondary gets stats only
SettingsMenu {
visible: bar.screenIndex === 0
volumeInfo: root.volumeInfo
networkInfo: root.networkInfo
themeInfo: root.themeInfo
}
LogoutMenu {
visible: bar.screenIndex === 0
}
CpuWidget { cpuUsage: root.cpuUsage }
MemWidget { memUsed: root.memUsed }
}
}
}
}
}
}

View File

@@ -21,8 +21,8 @@
<div align="center" style="display:flex; gap:8px;"> <div align="center" style="display:flex; gap:8px;">
<img src="https://git.samantha42.xyz/samantha/dotfiles/raw/branch/master/hypr/paper/day.jpg" width="50%" alt="day wallpaper"/> <img src="https://git.samantha42.xyz/samantha/dotfiles/raw/branch/master/rice-image/day.png" width="40%" alt="day wallpaper"/>
<img src="https://git.samantha42.xyz/samantha/dotfiles/raw/branch/master/hypr/paper/night.jpg" width="50%" alt="night wallpaper"/> <img src="https://git.samantha42.xyz/samantha/dotfiles/raw/branch/master/rice-image/night.png" width="40%" alt="night wallpaper"/>
</div> </div>

View File

@@ -1,157 +0,0 @@
[
{
"layer": "top",
"output": "DP-2",
"position": "top",
"height": 24,
"spacing": 4,
"margin-top": 8,
"margin-left": 10,
"margin-right": 10,
"modules-left": ["hyprland/workspaces", "hyprland/window"],
"modules-center": ["clock"],
"modules-right": ["custom/theme", "pulseaudio", "network", "cpu", "memory", "battery", "tray"],
"hyprland/workspaces": {
"format": "{icon}",
"on-click": "activate",
"all-outputs": false,
"active-only": false,
"persistent-workspaces": {
"DP-2": [1, 2, 3, 4, 5]
},
"format-icons": {
"1": "1", "2": "2", "3": "3", "4": "4", "5": "5",
"urgent": "", "default": ""
}
},
"hyprland/window": { "format": " {}", "max-length": 20, "separate-outputs": true },
"clock": {
"format": "{:%H:%M, %A, %B %d %Y}",
"format-alt": "{:%H:%M}",
"tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>"
},
"cpu": { "format": "{usage}%", "tooltip": true, "interval": 2 },
"memory": { "format": "{used:0.1f}G", "interval": 2 },
"battery": {
"states": { "warning": 30, "critical": 15 },
"format": "{icon} {capacity}%",
"format-charging": "{capacity}%",
"format-plugged": "{capacity}%",
"format-icons": ["", "", "", "", ""]
},
"network": {
"format-wifi": "{signalStrength}%",
"format-ethernet": "{ipaddr}",
"format-disconnected": "󰌙 Offline",
"tooltip-format": "{essid} — {ipaddr}\n{bandwidthUpBits} up {bandwidthDownBits} down",
"interval": 5
},
"pulseaudio": {
"format": "{icon} {volume}%",
"format-muted": "󰝟 Muted",
"format-icons": { "headphone": "󰋋", "default": ["󰕿", "󰖀", "󰕾"] },
"on-click": "~/.config/eww/scripts/toggle-mixer.sh"
},
"custom/theme": {
"exec": "$HOME/.config/hypr/theme-cycle.sh status",
"exec-on-event": true,
"return-type": "json",
"interval": 2,
"on-click": "$HOME/.config/hypr/theme-cycle.sh next",
"on-click-right": "$HOME/.config/hypr/theme-cycle.sh auto",
"on-scroll-up": "$HOME/.config/hypr/theme-cycle.sh day",
"on-scroll-down": "$HOME/.config/hypr/wallthemepaper-cycle.sh night"
},
"tray": { "spacing": 8, "icon-size": 16 },
"custom/2d-workspaces": {
"exec": "~/.config/hypr/2d-workspaces.sh",
"return-type": "json",
"interval": "once",
"restart-interval": 1,
"signal": 8
}
},
{
"layer": "top",
"output": "HDMI-A-1",
"position": "top",
"height": 24,
"spacing": 4,
"margin-top": 8,
"margin-left": 10,
"margin-right": 10,
"modules-left": ["hyprland/workspaces", "hyprland/window"],
"modules-center": ["clock"],
"modules-right": ["custom/theme", "pulseaudio", "network", "cpu", "memory", "battery", "tray"],
"hyprland/workspaces": {
"format": "{icon}",
"on-click": "activate",
"all-outputs": false,
"active-only": false,
"persistent-workspaces": {
"HDMI-A-1": [6, 7, 8, 9, 10]
},
"format-icons": {
"6": "6", "7": "7", "8": "8", "9": "9", "10": "10",
"urgent": "", "default": ""
}
},
"hyprland/window": { "format": " {}", "max-length": 50, "separate-outputs": true },
"clock": {
"format": "{:%H:%M, %A, %B %d %Y}",
"format-alt": "{:%H:%M}",
"tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>"
},
"cpu": { "format": "{usage}%", "tooltip": true, "interval": 2 },
"memory": { "format": "{used:0.1f}G", "interval": 2 },
"battery": {
"states": { "warning": 30, "critical": 15 },
"format": "{icon} {capacity}%",
"format-charging": "{capacity}%",
"format-plugged": "{capacity}%",
"format-icons": ["", "", "", "", ""]
},
"network": {
"format-wifi": "{signalStrength}%",
"format-ethernet": " {ipaddr}",
"format-disconnected": "󰌙 Offline",
"tooltip-format": "{essid} — {ipaddr}\n{bandwidthUpBits} up {bandwidthDownBits} down",
"interval": 5
},
"pulseaudio": {
"format": "{icon} {volume}%",
"format-muted": "󰝟 Muted",
"format-icons": { "headphone": "󰋋", "default": ["󰕿", "󰖀", "󰕾"] },
"on-click": "pavucontrol"
},
"custom/theme": {
"exec": "$HOME/.config/hypr/theme-cycle.sh status",
"exec-on-event": true,
"return-type": "json",
"interval": 2,
"on-click": "$HOME/.config/hypr/theme-cycle.sh next",
"on-click-right": "$HOME/.config/hypr/theme-cycle.sh auto",
"on-scroll-up": "$HOME/.config/hypr/theme-cycle.sh day",
"on-scroll-down": "$HOME/.config/hypr/wallthemepaper-cycle.sh night"
},
"tray": { "spacing": 8, "icon-size": 16 },
"custom/2d-workspaces": {
"exec": "~/.config/hypr/2d-workspaces.sh",
"return-type": "json",
"interval": "once",
"restart-interval": 1,
"signal": 8
}
}
]

View File

@@ -1 +0,0 @@
/home/sam42/.config/waybar/themes/night.css

View File

@@ -1,20 +0,0 @@
#!/bin/bash
# ~/.config/waybar/switch-theme.sh
THEME_DIR="$HOME/.config/waybar/themes"
STYLE="$HOME/.config/waybar/style.css"
THEME="$1" # e.g. dark, light, catppuccin
if [ -z "$THEME" ]; then
echo "Usage: switch-theme.sh <theme-name>"
exit 1
fi
if [ ! -f "$THEME_DIR/$THEME.css" ]; then
echo "Theme '$THEME' not found in $THEME_DIR"
exit 1
fi
ln -sf "$THEME_DIR/$THEME.css" "$STYLE"
pkill -SIGUSR2 waybar
echo "Switched to $THEME"

View File

@@ -1,159 +0,0 @@
/* ── Global ─────────────────────────────────────────── */
/*
Theme: Arch Bliss
Inspired by the rolling green hills and blue sky of the wallpaper.
Palette:
Sky deep: #2a6db5 (upper sky blue)
Sky mid: #5b9fd6 (horizon blue)
Sky light: #a8cef0 (pale sky)
Grass dark: #3a6b0e (shadow grass)
Grass mid: #5a9416 (mid grass)
Grass light: #7dbe1e (bright grass highlight)
Hill muted: #4a7a12 (rolling hills mid)
White: #f0f4f8 (Arch logo white)
Muted: #8bafc8 (distant hill / muted text)
Urgent: #c0392b (red for warnings)
*/
* {
font-family: "JetBrainsMono Nerd Font", "Noto Sans", monospace;
font-size: 13px;
border: none;
border-radius: 0;
min-height: 0;
}
window#waybar {
background: rgba(255, 255, 255, 0);
color: #f0f4f8;
border-radius: 10px;
}
/* ── Workspaces ─────────────────────────────────────── */
#workspaces {
background: rgba(0, 0, 0, 0.35);
border-radius: 8px;
padding: 2px 2px;
}
#workspaces button {
padding: 2px 8px;
color: #ffffff;
background: transparent;
border-radius: 6px;
font-size: 15px;
transition: all 0.2s ease;
}
#workspaces button:hover {
background: rgba(168, 206, 240, 0.18);
color: #f0f4f8;
}
#workspaces button.active {
background: rgba(90, 148, 22, 0.85);
color: #f0f4f8;
box-shadow: 0 0 6px rgba(125, 190, 30, 0.4);
}
#workspaces button.urgent {
color: #c0392b;
background: rgba(192, 57, 43, 0.18);
}
#workspaces button.empty {
color: #5b7a99;
}
/* ── Window title ───────────────────────────────────── */
#window {
background: rgba(0, 0, 0, 0.35);
color: #ffffff;
padding: 0 10px;
font-style: italic;
border-radius: 8px;
}
/* ── Clock ──────────────────────────────────────────── */
#clock {
color: #ffffff;
padding: 1px 14px;
font-weight: bold;
border-radius: 8px;
background: rgba(0, 0, 0, 0.35);
}
/* ── Right modules shared style ─────────────────────── */
#cpu,
#memory,
#network,
#pulseaudio {
padding: 2px 10px;
border-radius: 8px;
background: rgba(0, 0, 0, 0.35);
color: #ffffff;
}
/* ── CPU ────────────────────────────────────────────── */
#cpu { color: #bfff5e; } /* bright grass green */
#cpu.warning { color: #ffe943; } /* warm amber */
#cpu.critical { color: #ff6250; } /* red */
/* ── Memory ─────────────────────────────────────────── */
#memory { color: #7dc2ff; } /* sky mid-blue */
/* ── Tray ───────────────────────────────────────────── */
#tray {
padding: 2px 8px;
border-radius: 8px;
background: rgba(0, 0, 0, 0.35);
color: #ffffff;
}
#tray > .passive { -gtk-icon-effect: dim; }
#tray > .needs-attention {
-gtk-icon-effect: highlight;
background-color: rgba(192, 57, 43, 0.2);
}
/* ── Custom 2D Workspaces ───────────────────────────── */
#custom-2d-workspaces {
font-size: 13px;
font-weight: bold;
padding: 0 12px;
border-radius: 6px;
transition: all 0.15s ease;
}
/* Base row — sky blue */
#custom-2d-workspaces.base {
color: #a8cef0;
background: transparent;
}
/* Sub-workspace — grass green tint */
#custom-2d-workspaces.sub {
color: #7dbe1e;
background: rgba(255, 255, 255, 0.5);
}
#custom-theme {
color: #ffffff;
padding: 1px 14px;
font-weight: bold;
border-radius: 8px;
background: rgba(0, 0, 0, 0.35);
}
#custom-theme.day {
color: #f9e2af;
}
#custom-theme.night {
color: #89b4fa;
}
#custom-theme.auto {
color: #a6e3a1;
}

View File

@@ -1,150 +0,0 @@
* {
font-family: "JetBrainsMono Nerd Font", "Noto Sans", monospace;
font-size: 13px;
border: none;
border-radius: 0;
min-height: 0;
}
window#waybar {
background: rgba(255, 255, 255, 0);
color: #f0f4f8;
border-radius: 10px;
}
/* ── Workspaces ─────────────────────────────────────── */
#workspaces {
background: rgba(0, 0, 0, 0.3);
border-radius: 8px;
padding: 2px 2px;
}
#workspaces button {
padding: 2px 8px;
color: #ffffff;
background: transparent;
border-radius: 6px;
font-size: 15px;
transition: all 0.2s ease;
}
#workspaces button:hover {
background: rgba(168, 206, 240, 0.18);
color: #f0f4f8;
}
#workspaces button.active {
background: rgb(167, 124, 215);
color: #000000;
box-shadow: 0 0 6px rgba(62, 15, 65, 0.4);
}
#workspaces button.urgent {
color: #c0392b;
background: rgba(192, 57, 43, 0.18);
}
#workspaces button.empty {
color: #5b7a99;
}
/* ── Window title ───────────────────────────────────── */
#window {
background: rgba(0, 0, 0, 0.3);
color: #ffffff;
padding: 0 10px;
font-style: italic;
border-radius: 8px;
}
/* ── Clock ──────────────────────────────────────────── */
#clock {
color: #ffffff;
padding: 1px 14px;
font-weight: bold;
border-radius: 8px;
background: rgba(0, 0, 0, 0.3);
}
#custom-wallpaper-mode{
color: #ffffff;
padding: 1px 14px;
font-weight: bold;
border-radius: 8px;
background: rgba(0, 0, 0, 0.3);
}
/* ── Right modules shared style ─────────────────────── */
#cpu,
#memory,
#network,
#pulseaudio {
padding: 2px 10px;
border-radius: 8px;
background: rgba(0, 0, 0, 0.3);
color: #ffffff;
}
/* ── CPU ────────────────────────────────────────────── */
#cpu { color: #9ed649; } /* bright grass green */
#cpu.warning { color: #e5b25b; } /* warm amber */
#cpu.critical { color: #e04534; } /* red */
/* ── Memory ─────────────────────────────────────────── */
#memory { color: #7db9ec; } /* sky mid-blue */
/* ── Tray ───────────────────────────────────────────── */
#tray {
padding: 2px 8px;
border-radius: 8px;
background: rgba(0, 0, 0, 0.3);
color: #ffffff;
}
#tray > .passive { -gtk-icon-effect: dim; }
#tray > .needs-attention {
-gtk-icon-effect: highlight;
background-color: rgba(192, 57, 43, 0.2);
}
/* ── Custom 2D Workspaces ───────────────────────────── */
#custom-2d-workspaces {
font-size: 13px;
font-weight: bold;
padding: 0 12px;
border-radius: 6px;
transition: all 0.15s ease;
}
/* Base row — sky blue */
#custom-2d-workspaces.base {
color: #a8cef0;
background: transparent;
}
/* Sub-workspace — grass green tint */
#custom-2d-workspaces.sub {
color: #7dbe1e;
background: rgba(255, 255, 255, 0.5);
}
#custom-theme {
color: #ffffff;
padding: 1px 14px;
font-weight: bold;
border-radius: 8px;
background: rgba(0, 0, 0, 0.35);
}
#custom-theme.day {
color: #f9e2af;
}
#custom-theme.night {
color: #89b4fa;
}
#custom-theme.auto {
color: #a6e3a1;
}

View File

@@ -1,141 +0,0 @@
/* ── Global ─────────────────────────────────────────── */
* {
font-family: "JetBrainsMono Nerd Font", "Noto Sans", monospace;
font-size: 13px;
border: none;
border-radius: 0;
min-height: 0;
}
window#waybar {
background: rgba(17, 17, 27, 0);
color: #cdd6f4;
/*border-bottom: 2px solid rgba(137, 180, 250, 0.25);*/
border-radius: 10px;
}
/* ── Workspaces ─────────────────────────────────────── */
#workspaces {
background: rgba(30, 30, 46, 0.85);
border-radius: 8px;
padding: 2px 6px;
}
#workspaces button {
padding: 2px 8px;
color: #6c7086;
background: transparent;
border-radius: 6px;
font-size: 15px;
transition: all 0.2s ease;
}
#workspaces button:hover {
background: rgba(137, 180, 250, 0.15);
color: #ffffff;
}
#workspaces button.active {
background: rgb(167, 124, 215);
color: #ffffff;
}
#workspaces button.urgent {
color: #f38ba8;
background: rgba(243, 139, 168, 0.15);
}
#workspaces button.empty {
color: #6c7086;
}
/* ── Window title ───────────────────────────────────── */
#window {
color: #ffffff;
padding: 0 10px;
font-style: italic;
border: 2px solid rgba(30, 30, 46, 0.85);
border-radius: 8px;
}
/* ── Clock ──────────────────────────────────────────── */
#clock {
color: #cba6f7;
padding: 1px 14px;
font-weight: bold;
border-radius: 8px;
background: rgba(30, 30, 46, 0.85);
}
/* ── Right modules shared style ─────────────────────── */
#cpu,
#memory,
#battery,
#network,
#pulseaudio {
padding: 2px 10px;
border-radius: 8px;
background: rgba(30, 30, 46, 0.85);
}
/* ── CPU ────────────────────────────────────────────── */
#cpu { color: #a6e3a1; }
#cpu.warning { color: #fab387; }
#cpu.critical { color: #f38ba8; }
/* ── Memory ─────────────────────────────────────────── */
#memory { color: #89dceb; }
/* ── Battery ────────────────────────────────────────── */
#battery { color: #a6e3a1; }
#battery.warning { color: #fab387; }
#battery.critical { color: #f38ba8; animation: blink 1s linear infinite; }
#battery.charging { color: #a6e3a1; }
@keyframes blink {
to { color: transparent; }
}
/* ── Network ────────────────────────────────────────── */
#network { color: #89b4fa; }
#network.disconnected { color: #6c7086; }
/* ── Audio ──────────────────────────────────────────── */
#pulseaudio { color: #f5c2e7; }
#pulseaudio.muted { color: #6c7086; }
/* ── Tray ───────────────────────────────────────────── */
#tray {
padding: 2px 8px;
border-radius: 8px;
background: rgba(30, 30, 46, 0.85);
}
#tray > .passive { -gtk-icon-effect: dim; }
#tray > .needs-attention {
-gtk-icon-effect: highlight;
background-color: rgba(243, 139, 168, 0.2);
}
/* --- waybar style.css --- */
#custom-2d-workspaces {
font-size: 13px;
font-weight: bold;
padding: 0 12px;
border-radius: 6px;
transition: all 0.15s ease;
}
/* Base row — normal blue */
#custom-2d-workspaces.base {
color: #89b4fa;
background: transparent;
}
/* Sub-workspace — green tint so you know you're "deeper" */
#custom-2d-workspaces.sub {
color: #a6e3a1;
background: rgba(166, 227, 161, 0.12);
}

View File

@@ -1,51 +0,0 @@
window {
margin: 0px;
border: 1px solid #bd93f9;
background-color: #282a36;
}
#input {
margin: 5px;
border: none;
color: #f8f8f2;
background-color: #44475a;
}
#inner-box {
margin: 5px;
border: none;
background-color: #282a36;
}
#outer-box {
margin: 5px;
border: none;
background-color: #282a36;
}
#scroll {
margin: 0px;
border: none;
}
#text {
margin: 5px;
border: none;
color: #f8f8f2;
}
#entry.activatable #text {
color: #282a36;
}
#entry > * {
color: #f8f8f2;
}
#entry:selected {
background-color: #44475a;
}
#entry:selected #text {
font-weight: bold;
}