{
pkgs,
lib,
host,
config,
...
}: let
inherit (import ../../../hosts/${host}/variables.nix) clock24h;
scriptsDir = ./scripts;
scripts = builtins.attrNames (builtins.readDir scriptsDir);
in
with lib; {
# Configure & Theme Waybar (Tony)
home.file = builtins.listToAttrs (
map (name: {
name = ".config/waybar/scripts/" + name;
value = {
source = "${scriptsDir}/${name}";
executable = true;
};
})
scripts
);
programs.waybar = {
enable = true;
package = pkgs.waybar;
settings = [
{
layer = "top";
position = "top";
height = 30;
spacing = 4;
modules-left = [
"custom/startmenu"
"custom/sep_gap_left"
"group/qs_wallpapers"
"custom/sep"
"hyprland/workspaces"
"custom/sep"
#"custom/sep"
"hyprland/window"
"custom/sep"
];
modules-center = [
#"custom/sep"
"idle_inhibitor"
"custom/weather"
"custom/notification"
#"custom/sep"
];
modules-right = [
"custom/sep"
"tray"
"custom/sep"
"pulseaudio"
#"network"
"cpu"
#"memory"
"clock"
"custom/sep"
"custom/power"
];
"hyprland/workspaces" = {
disable-scroll = true;
all-outputs = true;
warp-on-scroll = false;
format = "{name}";
persistent-workspaces = {
"*" = 9;
};
};
"hyprland/window" = {
max-length = 40;
seperate-outputs = false;
};
tray = {
spacing = 10;
};
clock = {
format-alt = "{:%Y-%m-%d}";
};
cpu = {
format = "CPU: {usage}%";
tooltip = false;
};
memory = {
format = "Mem: {used}GiB";
};
disk = {
interval = 60;
path = "/";
format = "Disk: {free}";
};
battery = {
states = {
good = 95;
warning = 30;
critical = 15;
};
format = "Bat: {capacity}% {icon} {time}";
format-plugged = "{capacity}% ";
format-alt = "Bat {capacity}%";
format-time = "{H}:{M}";
format-icons = [
""
""
""
""
""
];
};
network = {
format-icons = [
""
""
""
""
""
];
format-ethernet = "{ifname} {ipaddr}";
format-wifi = "{essid} {signalStrength}% {ipaddr}";
format-disconnected = "";
tooltip = true;
tooltip-format = "{ifname}\nIPv4: {ipaddr}/{cidr}\nGateway: {gwaddr}\nSSID: {essid}\nSignal: {signalStrength}%";
on-click = "nmtui";
};
"custom/sep" = {
format = "|";
interval = 0;
};
"idle_inhibitor" = {
format = "{icon}";
format-icons = {
activated = "";
deactivated = "";
};
tooltip = true;
};
"custom/startmenu" = {
format = "";
tooltip = true;
"tooltip-format" = "App menu";
on-click = "rofi -show drun";
"on-click-right" = "nwg-drawer -mr 225 -ml 225 -mt 200 -mb 200 -is 48 --spacing 15";
};
# Wallpaper quick-switchers close to startmenu
"custom/qs_wallpapers_apply" = {
format = "";
tooltip = true;
"tooltip-format" = "Set image wallpaper";
on-click = "qs-wallpapers-apply";
};
"custom/qs_vid_wallpapers_apply" = {
format = "";
tooltip = true;
"tooltip-format" = "Set video wallpaper";
on-click = "qs-vid-wallpapers-apply";
};
"group/qs_wallpapers" = {
orientation = "inherit";
modules = [
"custom/qs_wallpapers_apply"
"custom/sep_gap"
"custom/qs_vid_wallpapers_apply"
];
};
# Narrow spacer for QS icons
"custom/sep_gap" = {
format = " ";
tooltip = false;
};
# Spacer between startmenu and first QS icon
"custom/sep_gap_left" = {
format = " ";
tooltip = false;
};
"custom/notification" = {
tooltip = false;
format = "{icon} {}";
format-icons = {
notification = "";
none = "";
dnd-notification = "";
dnd-none = "";
inhibited-notification = "";
inhibited-none = "";
dnd-inhibited-notification = "";
dnd-inhibited-none = "";
};
return-type = "json";
exec-if = "which swaync-client";
exec = "swaync-client -swb";
on-click = "swaync-client -t";
escape = true;
};
"custom/weather" = {
return-type = "json";
exec = "sh -lc 'WEATHER_ICON_STYLE=emoji WEATHER_TOOLTIP_MARKUP=1 ~/.local/bin/weather'";
interval = 600;
tooltip = true;
};
pulseaudio = {
format = "{icon} {volume}% {format_source}";
format-bluetooth = "{volume}% {icon} {format_source}";
format-bluetooth-muted = " {icon} {format_source}";
format-muted = " {format_source}";
format-source = " {volume}%";
format-source-muted = "";
format-icons = {
headphone = "";
hands-free = "";
headset = "";
phone = "";
portable = "";
car = "";
default = [
""
""
""
];
};
on-click = "pavucontrol";
};
"custom/power" = {
format = " ⏻ ";
tooltip = true;
"tooltip-format" = "Power menu: Left-click for QS logout, Right-click for rofi power menu";
"on-click" = "qs-wlogout";
"on-click-right" = "~/.config/waybar/scripts/power-menu.sh";
};
}
];
style = concatStrings [
''
@define-color bg #1a1b26;
@define-color fg #a9b1d6;
@define-color blk #32344a;
@define-color red #f7768e;
@define-color grn #9ece6a;
@define-color ylw #e0af68;
@define-color blu #7aa2f7;
@define-color mag #ad8ee6;
@define-color cyn #0db9d7;
@define-color brblk #444b6a;
@define-color white #ffffff;
* {
font-family: "JetBrainsMono Nerd Font", monospace;
font-size: 16px;
font-weight: bold;
}
window#waybar {
background-color: @bg;
color: @fg;
}
#workspaces button {
padding: 0 6px;
color: @cyn;
background: transparent;
border-bottom: 3px solid @bg;
}
#workspaces button.active {
color: @cyn;
border-bottom: 3px solid @mag;
}
#workspaces button.empty {
color: @white;
}
#workspaces button.empty.active {
color: @cyn;
border-bottom: 3px solid @mag;
}
#workspaces button.urgent {
background-color: @red;
}
button:hover {
background: inherit;
box-shadow: inset 0 -3px #ffffff;
}
#clock,
#custom-sep,
#battery,
#cpu,
#memory,
#disk,
#network,
#tray,
#pulseaudio,
#idle_inhibitor,
#custom-notification,
#custom-power {
padding: 0 8px;
color: @white;
}
/* Rounded, raised bottom effect for center/right modules */
#clock,
#battery,
#cpu,
#memory,
#disk,
#network,
#tray,
#pulseaudio,
#idle_inhibitor,
#custom-notification,
#custom-power {
border-bottom-left-radius: 10px;
border-bottom-right-radius: 10px;
box-shadow: inset 0 -2px rgba(255,255,255,0.07);
}
/* Tighten spacing between the two QS buttons */
#group-qs_wallpapers { margin: 0; padding: 0; }
/* Make QS icons match startmenu color and background (bright green) */
/* Start menu stays bright green; QS icons switch to clock blue (@cyn) */
#custom-startmenu {
color: @grn;
background: transparent;
font-size: 21px; /* ~30% larger than base 16px */
}
#custom-qs_wallpapers_apply,
#custom-qs_vid_wallpapers_apply {
color: @cyn; /* match clock color */
background: transparent;
font-size: 21px; /* ~30% larger than base 16px */
}
/* Prevent QS icons from being clipped; add a tiny internal pad */
#custom-qs_wallpapers_apply,
#custom-qs_vid_wallpapers_apply {
padding: 0 2px;
min-width: 20px;
}
#custom-startmenu { margin-right: 6px; }
#custom-sep {
color: @brblk;
}
/* Width for gap spacer between QS icons */
#custom-sep_gap { padding: 0 1px; }
#custom-sep_gap_left { padding: 0 2px; }
#clock {
color: @cyn;
border-bottom: 4px solid @cyn;
}
#battery {
color: @mag;
border-bottom: 4px solid @mag;
}
#disk {
color: @ylw;
border-bottom: 4px solid @ylw;
}
#memory {
color: @mag;
border-bottom: 4px solid @mag;
}
#cpu {
color: @grn;
border-bottom: 4px solid @grn;
}
#network {
color: @blu;
border-bottom: 4px solid @blu;
}
#network.disconnected {
background-color: @red;
}
#pulseaudio {
color: @blu;
border-bottom: 4px solid @blu;
}
/* Center the idle_inhibitor icon within its pill */
#idle_inhibitor {
/* Center visually via symmetric padding + fixed min width */
padding-left: 10px;
padding-right: 10px;
min-width: 26px; /* keep a consistent hit area */
border-bottom: 4px solid @brblk; /* default raised strip */
border-bottom-left-radius: 10px;
border-bottom-right-radius: 10px;
}
#idle_inhibitor label {
margin: 0; /* remove any label offset */
padding: 0;
}
#idle_inhibitor.deactivated {
color: @red;
border-bottom: 4px solid @red;
}
#idle_inhibitor.activated {
color: @grn;
border-bottom: 4px solid @grn;
margin-right: 5px;
}
#custom-notification {
color: @grn; /* default green */
border-bottom: 4px solid @grn;
}
/* Turn red on new alerts */
#custom-notification.notification,
#custom-notification.dnd-notification,
#custom-notification.inhibited-notification {
color: @red;
border-bottom: 4px solid @red;
}
/* Add subtle raised effect to center modules too */
#custom-notification,
#idle_inhibitor {
box-shadow: inset 0 -3px @brblk;
}
#tray {
background-color: @bg; /* match bar background */
border-bottom: 4px solid @brblk; /* restore raised strip */
border-bottom-left-radius: 10px;
border-bottom-right-radius: 10px;
}
#custom-power {
color: @red;
border-bottom: 4px solid @red;
}
''
];
};
}