zaphyra's git: nixfiles

zaphyra's nixfiles

commit b4bda85db509927832ccdc97e4375f3e1189f97d
parent cae75d197fd433191f14f6b4ec45101a33675d03
Author: Katja Ramona Sophie Kwast (zaphyra) <git@zaphyra.eu>
Date: Mon, 13 Oct 2025 18:11:52 +0200

config/home-manager/zaphyra: rice some stuff
11 files changed, 740 insertions(+), 302 deletions(-)
A
config/home/zaphyra/colors.nix
|
45
+++++++++++++++++++++++++++++++++++++++++++++
M
config/home/zaphyra/configure/niri.nix
|
76
+++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------
M
config/home/zaphyra/home.nix
|
1
-
M
config/home/zaphyra/programs/fuzzel.nix
|
39
+++++++++++++++++++++++++++++++++++----
M
config/home/zaphyra/programs/niri.nix
|
180
++++++++++++++++++++++++++++++++++++++-----------------------------------------
M
config/home/zaphyra/programs/nmgui.nix
|
239
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
M
config/home/zaphyra/programs/pipewire.nix
|
5
+++--
M
config/home/zaphyra/programs/wleave.nix
|
62
++++++++++++++++++++++++++++++++++++++++++++++++++++++--------
M
config/home/zaphyra/services/swaync.nix
|
214
++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
M
config/home/zaphyra/services/waybar.nix
|
170
++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------
M
config/home/zaphyra/services/wob.nix
|
11
++++++++---
diff --git a/config/home/zaphyra/colors.nix b/config/home/zaphyra/colors.nix
@@ -0,0 +1,45 @@
+{
+
+  background = {
+    r = 30;
+    g = 40;
+    b = 30;
+    a = 0.9;
+  };
+
+  button = {
+    r = 255;
+    g = 255;
+    b = 255;
+    a = 0.06;
+  };
+
+  buttonHover = {
+    r = 255;
+    g = 255;
+    b = 255;
+    a = 0.1;
+  };
+
+  border = {
+    r = 255;
+    g = 255;
+    b = 255;
+    a = 0.08;
+  };
+
+  accent = {
+    r = 74;
+    g = 169;
+    b = 108;
+    a = 1;
+  };
+
+  accentBorder = {
+    r = 59;
+    g = 135;
+    b = 86;
+    a = 0.5;
+  };
+
+}
diff --git a/config/home/zaphyra/configure/niri.nix b/config/home/zaphyra/configure/niri.nix
@@ -7,6 +7,10 @@
   ...
 }:
 
+let
+  colors = import ../colors.nix;
+
+in
 {
 
   imports =

@@ -49,37 +53,59 @@
       "gtk"
       "gnome"
     ];
+    config.preferred.default = [
+      "gtk"
+      "gnome"
+    ];
     extraPortals = with pkgs; [
       xdg-desktop-portal-gtk
       xdg-desktop-portal-gnome
     ];
   };
 
-  gtk = {
-    enable = true;
-
-    gtk3.extraConfig = {
-      gtk-theme = "adw-gtk3-dark";
-      gtk-application-prefer-dark-theme = 1;
-    };
-
-    font = {
-      name = "Adwaita Sans";
-      size = 11;
-      package = pkgs.adwaita-fonts;
-    };
-
-    iconTheme = {
-      name = "Adwaita-green";
-      package = pkgs.tgc.adwaita-colors-icon-theme;
+  gtk =
+    let
+      extraCss = ''
+        @define-color background-color rgba(${toString colors.background.r}, ${toString colors.background.g}, ${toString colors.background.b}, ${toString colors.background.a});
+        @define-color button-color rgba(${toString colors.button.r}, ${toString colors.button.g}, ${toString colors.button.b}, ${toString colors.button.a});
+        @define-color button-hover-color rgba(${toString colors.buttonHover.r}, ${toString colors.buttonHover.g}, ${toString colors.buttonHover.b}, ${toString colors.buttonHover.a});
+        @define-color border-color rgba(${toString colors.border.r}, ${toString colors.border.g}, ${toString colors.border.b}, ${toString colors.border.a});
+        @define-color accent-border-color rgba(${toString colors.accentBorder.r}, ${toString colors.accentBorder.g}, ${toString colors.accentBorder.b}, ${toString colors.accentBorder.a});
+        @define-color accent-color rgba(${toString colors.accent.r}, ${toString colors.accent.g}, ${toString colors.accent.b}, ${toString colors.accent.a});
+      '';
+    in
+    {
+      enable = true;
+
+      gtk3.extraConfig = {
+        gtk-theme-name = "adw-gtk3-dark";
+        gtk-application-prefer-dark-theme = 1;
+      };
+
+      gtk4.extraConfig = {
+        gtk-application-prefer-dark-theme = 1;
+      };
+
+      gtk3.extraCss = extraCss;
+      gtk4.extraCss = extraCss;
+
+      font = {
+        name = "Adwaita Sans";
+        size = 11;
+        package = pkgs.adwaita-fonts;
+      };
+
+      iconTheme = {
+        name = "Adwaita-green";
+        package = pkgs.tgc.adwaita-colors-icon-theme;
+      };
+
+      cursorTheme = {
+        name = "Adwaita";
+        package = pkgs.adwaita-icon-theme;
+      };
     };
 
-    cursorTheme = {
-      name = "Adwaita";
-      package = pkgs.adwaita-icon-theme;
-    };
-  };
-
   qt = {
     enable = true;
     platformTheme.name = "Adwaita-dark";

@@ -100,10 +126,14 @@
     "org/gnome/desktop/interface" = {
       color-scheme = "prefer-dark";
       accent-color = "green";
+      theme-name = "";
     };
     "org/gnome/desktop/wm/preferences" = {
       button-layout = "";
     };
+    "org/gtk/Settings/Debug" = {
+      enable-inspector-keybinding = true;
+    };
   };
 
 }
diff --git a/config/home/zaphyra/home.nix b/config/home/zaphyra/home.nix
@@ -31,7 +31,6 @@
 
   imports = with homeManagerModules.zaphyra; [
     homeManagerModules.common.programs.starship
-    homeManagerModules.common.programs.app2unit
     programs.fish
     programs.mcfly
     programs.zoxide
diff --git a/config/home/zaphyra/programs/fuzzel.nix b/config/home/zaphyra/programs/fuzzel.nix
@@ -1,5 +1,9 @@
-{ ... }:
+{ lib, ... }:
 
+let
+  colors = import ../colors.nix;
+
+in
 {
 
   programs.fuzzel = {

@@ -17,15 +21,42 @@
         radius = 6;
       };
       colors = {
-        background = "#00000080"; # Background color
+        background = "#${
+          lib.concatStrings (
+            lib.map (elem: lib.toHexString elem) [
+              colors.background.r
+              colors.background.g
+              colors.background.b
+              (builtins.floor (100 * colors.background.a))
+            ]
+          )
+        }"; # Background color
+        border = "#${
+          lib.concatStrings (
+            lib.map (elem: lib.toHexString elem) [
+              colors.accentBorder.r
+              colors.accentBorder.g
+              colors.accentBorder.b
+              (builtins.floor (100 * colors.accentBorder.a))
+            ]
+          )
+        }"; # The color of the match count stats printed at the right-hand side of the input prompt
+        selection = "#${
+          lib.concatStrings (
+            lib.map (elem: lib.toHexString elem) [
+              colors.buttonHover.r
+              colors.buttonHover.g
+              colors.buttonHover.b
+              (builtins.floor (100 * colors.buttonHover.a))
+            ]
+          )
+        }"; # Background color of the selected entry
         text = "#d8daddff"; # Text (foreground) color of unselected entries
         prompt = "#d8daddff"; # Text (foreground) color of prompt character(s)
         input = "#d8daddff"; # Text (foreground) color of input string
         match = "#d8daddff"; # Text (foreground) color of the matched substring
-        selection = "#ffffff1a"; # Background color of the selected entry
         selection-text = "#d8daddff"; # Text (foreground) color of the selected entry
         selection-match = "#b7d4edf2"; # Text (foreground) color of the matched substring of the selected entry
-        border = "#4aa96cff"; # The color of the match count stats printed at the right-hand side of the input prompt
       };
     };
   };
diff --git a/config/home/zaphyra/programs/niri.nix b/config/home/zaphyra/programs/niri.nix
@@ -67,13 +67,6 @@
 
     prefer-no-csd = true;
 
-    workspaces = {
-      "01-Web".name = "Web";
-      "02-Mail".name = "Mail";
-      "03-Term".name = "Term";
-      "04-Chat".name = "Chat";
-    };
-
     window-rules = [
       {
         shadow.enable = true;

@@ -93,20 +86,20 @@
         matches = [
           {
             at-startup = true;
-            app-id = "org.gnome.Fractal$";
+            app-id = "org.gnome.Fractal";
           }
           {
             at-startup = true;
-            app-id = "im.dino.Dino$";
+            app-id = "im.dino.Dino";
           }
           {
             at-startup = true;
-            app-id = "org.gajim.Gajim$";
+            app-id = "org.gajim.Gajim";
           }
         ];
 
-        open-on-workspace = "Chat";
         default-column-display = "tabbed";
+        open-on-workspace = "4";
       }
       {
         matches = [

@@ -128,7 +121,7 @@
           { app-id = "thunderbird$"; }
         ];
 
-        open-on-workspace = "Mail";
+        open-on-workspace = "2";
       }
       {
         matches = [

@@ -149,104 +142,103 @@
       }
     ];
 
-    binds = with config.lib.niri.actions; {
-      "Mod+Shift+E".action = quit;
-      "Mod+Space".action = lib.mkDefault (spawn (lib.getExe pkgs.fuzzel));
-      "Mod+Return".action = lib.mkDefault (spawn config.home.sessionVariables.TERMINAL);
-
-      "Mod+L".action = spawn (lib.getExe' pkgs.systemd "loginctl") "lock-session";
-      "Mod+Z".action = power-off-monitors;
-      # "Mod+Z".action = spawn (lib.getExe' pkgs.systemd "systemctl") "suspend";
-
-      "Mod+W" = {
-        action = close-window;
-        repeat = false;
-      };
+    binds =
+      with config.lib.niri.actions;
+      {
+        "Mod+Shift+E".action = quit;
+        "Mod+Space".action = lib.mkDefault (spawn (lib.getExe pkgs.fuzzel));
+        "Mod+Return".action = lib.mkDefault (spawn (lib.getExe pkgs.unstable.app2unit) "-T");
 
-      "XF86AudioRaiseVolume" = {
-        allow-when-locked = true;
-        action = lib.mkDefault (spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "1%+");
-      };
-      "XF86AudioLowerVolume" = {
-        allow-when-locked = true;
-        action = lib.mkDefault (spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "1%-");
-      };
-      "XF86MonBrightnessUp" = {
-        allow-when-locked = true;
-        action = lib.mkDefault (spawn (lib.getExe pkgs.brightnessctl) "s" "+5%");
-      };
-      "XF86MonBrightnessDown" = {
-        allow-when-locked = true;
-        action = lib.mkDefault (spawn (lib.getExe pkgs.brightnessctl) "s" "5%-");
-      };
+        "Mod+L".action = spawn (lib.getExe' pkgs.systemd "loginctl") "lock-session";
+        "Mod+Z".action = power-off-monitors;
+        # "Mod+Z".action = spawn (lib.getExe' pkgs.systemd "systemctl") "suspend";
 
-      "Mod+Tab".action = toggle-overview;
+        "Mod+W" = {
+          action = close-window;
+          repeat = false;
+        };
 
-      "Mod+1".action = focus-workspace "Web";
-      "Mod+2".action = focus-workspace "Mail";
-      "Mod+3".action = focus-workspace "Term";
-      "Mod+4".action = focus-workspace "Chat";
-      "Mod+5".action = focus-workspace 5;
-      "Mod+6".action = focus-workspace 6;
-      "Mod+7".action = focus-workspace 7;
-      "Mod+8".action = focus-workspace 8;
-      "Mod+9".action = focus-workspace 9;
+        "XF86AudioRaiseVolume" = {
+          allow-when-locked = true;
+          action = lib.mkDefault (spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "1%+");
+        };
+        "XF86AudioLowerVolume" = {
+          allow-when-locked = true;
+          action = lib.mkDefault (spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "1%-");
+        };
+        "XF86MonBrightnessUp" = {
+          allow-when-locked = true;
+          action = lib.mkDefault (spawn (lib.getExe pkgs.brightnessctl) "s" "+5%");
+        };
+        "XF86MonBrightnessDown" = {
+          allow-when-locked = true;
+          action = lib.mkDefault (spawn (lib.getExe pkgs.brightnessctl) "s" "5%-");
+        };
 
-      "Mod+Shift+1".action.move-column-to-workspace = "Web";
-      "Mod+Shift+2".action.move-column-to-workspace = "Mail";
-      "Mod+Shift+3".action.move-column-to-workspace = "Term";
-      "Mod+Shift+4".action.move-column-to-workspace = "Chat";
-      "Mod+Shift+5".action.move-column-to-workspace = 5;
-      "Mod+Shift+6".action.move-column-to-workspace = 6;
-      "Mod+Shift+7".action.move-column-to-workspace = 7;
-      "Mod+Shift+8".action.move-column-to-workspace = 8;
-      "Mod+Shift+9".action.move-column-to-workspace = 9;
+        "Mod+Tab".action = toggle-overview;
 
-      "Mod+Prior".action = focus-workspace-up;
-      "Mod+Next".action = focus-workspace-down;
+        "Mod+Prior".action = focus-workspace-up;
+        "Mod+Next".action = focus-workspace-down;
 
-      "Mod+Shift+Prior".action = move-window-up-or-to-workspace-up;
-      "Mod+Shift+Next".action = move-window-down-or-to-workspace-down;
+        "Mod+Shift+Prior".action = move-window-up-or-to-workspace-up;
+        "Mod+Shift+Next".action = move-window-down-or-to-workspace-down;
 
-      "Mod+Ctrl+Prior".action = focus-monitor-up;
-      "Mod+Ctrl+Next".action = focus-monitor-down;
+        "Mod+Ctrl+Prior".action = focus-monitor-up;
+        "Mod+Ctrl+Next".action = focus-monitor-down;
 
-      "Mod+Left".action = focus-column-left;
-      "Mod+Right".action = focus-column-right;
-      "Mod+Up".action = focus-window-or-workspace-up;
-      "Mod+Down".action = focus-window-or-workspace-down;
+        "Mod+Left".action = focus-column-left;
+        "Mod+Right".action = focus-column-right;
+        "Mod+Up".action = focus-window-or-workspace-up;
+        "Mod+Down".action = focus-window-or-workspace-down;
 
-      "Mod+Shift+Left".action = move-column-left;
-      "Mod+Shift+Right".action = move-column-right;
-      "Mod+Shift+Up".action = move-window-up;
-      "Mod+Shift+Down".action = move-window-down;
+        "Mod+Shift+Left".action = move-column-left;
+        "Mod+Shift+Right".action = move-column-right;
+        "Mod+Shift+Up".action = move-window-up;
+        "Mod+Shift+Down".action = move-window-down;
 
-      "Mod+R".action = switch-preset-column-width;
-      "Mod+Shift+R".action = switch-preset-window-height;
-      "Mod+Ctrl+R".action = reset-window-height;
+        "Mod+R".action = switch-preset-column-width;
+        "Mod+Shift+R".action = switch-preset-window-height;
+        "Mod+Ctrl+R".action = reset-window-height;
 
-      "Mod+C".action = center-window;
+        "Mod+C".action = center-window;
 
-      "Mod+F".action = maximize-column;
-      "Mod+Ctrl+F".action = expand-column-to-available-width;
-      "Mod+Shift+F".action = fullscreen-window;
-      "Mod+Alt+F".action = set-column-width "50%";
+        "Mod+F".action = maximize-column;
+        "Mod+Ctrl+F".action = expand-column-to-available-width;
+        "Mod+Shift+F".action = fullscreen-window;
+        "Mod+Alt+F".action = set-column-width "50%";
 
-      "Mod+Minus".action = set-column-width "-10%";
-      "Mod+Equal".action = set-column-width "+10%";
-      "Mod+Shift+Minus".action = set-window-height "-10%";
-      "Mod+Shift+Equal".action = set-window-height "+10%";
+        "Mod+Minus".action = set-column-width "-10%";
+        "Mod+Equal".action = set-column-width "+10%";
+        "Mod+Shift+Minus".action = set-window-height "-10%";
+        "Mod+Shift+Equal".action = set-window-height "+10%";
 
-      "Mod+Shift+Space".action = toggle-window-floating;
+        "Mod+Shift+Space".action = toggle-window-floating;
 
-      "Mod+Shift+Return".action = spawn (lib.getExe pkgs.tgc.nirius) "toggle-follow-mode";
+        "Mod+Shift+Return".action = spawn (lib.getExe pkgs.tgc.nirius) "toggle-follow-mode";
 
-      "Mod+T".action = toggle-column-tabbed-display;
+        "Mod+T".action = toggle-column-tabbed-display;
 
-      "Mod+Print".action = spawn (lib.getExe pkgs.hyprpicker) "--lowercase-hex" "--autocopy";
-      "Print".action = screenshot;
-      "Alt+Print".action = screenshot-window;
-    };
+        "Mod+Print".action = spawn (lib.getExe pkgs.hyprpicker) "--lowercase-hex" "--autocopy";
+        "Print".action = screenshot;
+        "Alt+Print".action = screenshot-window;
+      }
+      // (lib.mergeAttrsList (
+        lib.map
+          (num: {
+            "Mod+${toString num}".action.focus-workspace = num;
+            "Mod+Shift+${toString num}".action.move-column-to-workspace = num;
+          })
+          [
+            1
+            2
+            3
+            4
+            5
+            6
+            7
+            8
+            9
+          ]
+      ));
   };
-
 }
diff --git a/config/home/zaphyra/programs/nmgui.nix b/config/home/zaphyra/programs/nmgui.nix
@@ -1,17 +1,246 @@
-{ pkgs, ... }:
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}:
 
 {
 
-  home.packages = [ pkgs.unstable.nmgui ];
+  home.packages = [
+    (pkgs.writeShellScriptBin "nmgui" ''
+      windowID=`niri msg --json windows | jq -re '[.[] | select(.app_id == "com.network.manager") | .id][0]'`
+
+      if [ $windowID != "null" ]
+      then
+        exec niri msg action close-window --id=$windowID
+      else
+        app2unit -- ${
+          lib.getExe (
+            pkgs.unstable.nmgui.overrideAttrs {
+              src = pkgs.fetchFromGitHub {
+                owner = "s-adi-dev";
+                repo = "nmgui";
+                rev = "08b2380e5b230a2215a6430878e2aa13c3d86d44";
+                hash = "sha256-qRFJbzam48GTbQnLrZINE0vAvAJfVN4bJey8MZwCsm4=";
+              };
+            }
+          )
+        }
+      fi
+    '')
+  ];
+
+  xdg.configFile."nmgui/style.css".text = ''
+     * {
+       font-family: "Adwaita Sans", "Symbols Nerd Font";
+       outline-color: @accent-color;
+       color: white;
+     }
+
+     window {
+       border: 2px solid @accent-border-color;
+       background: @background-color;
+     }
+
+     window {
+       border-top: unset;
+       border-bottom-left-radius: 10px;
+       border-bottom-right-radius: 10px;
+     }
+
+    #wifi-scan-label,
+     button,
+     entry {
+       border-radius: 4px;
+     }
+
+     separator {
+       min-height: 2px;
+       margin: 0 -20px;
+       background: @border-color;
+     }
+
+     entry {
+       min-height: 32px;
+       padding-left: 9px;
+       padding-right: 8px;
+       border: 1px solid;
+       border-spacing: 6px;
+     }
+
+     entry:hover {
+       outline: none;
+       background: @button-hover-color;
+       border: 1px solid @border-color;
+     }
+
+     text selection {
+       color: white;
+       background: @accent-color;
+     }
+
+     button {
+       min-height: 24px;
+       min-width: 16px;
+       padding: 4px 9px;
+       background: @button-color;
+       border: 1px solid @border-color;
+       color: white;
+     }
+
+     button.image-button {
+       padding: 8px 12px 8px 8px;
+       border: unset;
+       background: unset;
+     }
+
+     button:hover {
+      background: @button-hover-color;
+     }
+
+     button:disabled {
+       border-left: 4px solid @accent-color;
+       border-top: unset;
+       border-bottom: unset;
+       padding: unset;
+     }
+
+     button:disabled box {
+       margin: -2px;
+       margin-right: 0;
+       background: @button-hover-color;
+       padding: 4px 10px 4px 8px;
+       border: 1px solid @border-color;
+       border-right: unset;
+     }
+
+     switch {
+       border-radius: 4px;
+       border: 1px solid @border-color;
+       background: @button-color;
+     }
+
+     switch:checked {
+       background: alpha(@accent-color, .5);
+     }
+
+     switch slider {
+       border-radius: 4px;
+       border: 1px solid @border-color;
+       background: rgb(190, 190, 190);
+       margin: 3px;
+       min-height: 15px;
+       min-width: 15px;
+     }
+
+     switch:hover slider,
+     switch slider:hover {
+       border 1px solid @border-color;
+       background: rgb(170, 170, 170);
+     }
+
+     #wifi-label {
+       font-size: 15pt;
+       font-weight: 400;
+     }
+
+     #wifi-networks-label {
+       font-size: 12pt;
+       font-weight: 300;
+     }
+
+     #wifi-scan-label {
+       padding: 5px 8px;
+       background: @button-color;
+       border: 1px solid @border-color;
+       color: white;
+     }
+
+     #wifi-scan-label:hover {
+       background: @button-hover-color;
+       color: white;
+     }
+
+     #network-list-box #network-button {
+       margin-right: -5px;
+       border-right: 0;
+       border-top-right-radius: unset;
+       border-bottom-right-radius: unset;
+     }
+
+     #network-list-box .more-details-button {
+       border-top-left-radius: unset;
+       border-bottom-left-radius: unset;
+       margin-left: unset;
+     }
+
+     /* Details page */
+     window > box .image-button {
+       margin-left:-10px;
+     }
+
+     window > box > box > box > box:last-child {
+       margin: 0 -20px -20px;
+     }
+
+     window > box > box > box > box:last-child > button:first-child {
+       margin-right: 15px;
+     }
+
+     /* dialogs */
+     .titlebar {
+       background: transparent;
+     }
+
+     .dialog-vbox button {
+       margin: 10px;
+     }
+
+     .dialog-vbox button:first-child {
+       margin-right: 5px;
+     }
+
+     .dialog-vbox button:last-child {
+       margin-left: 5px;
+     }
+
+     .dialog-vbox box > label:last-child {
+       margin: 0 10px 20px;
+     }
+
+     .password {
+       background: @button-color;
+       border: 1px solid @border-color;
+       color: white;
+     }
+  '';
 
   programs.niri.settings.window-rules = [
     {
       matches = [ { app-id = "com.network.manager$"; } ];
 
-      open-floating = true;
+      focus-ring.enable = false;
+
       open-focused = true;
-      default-column-width.fixed = 500;
-      default-window-height.fixed = 600;
+      open-floating = true;
+      default-floating-position = {
+        x = 40;
+        y = 0;
+        relative-to = "top-right";
+      };
+
+      geometry-corner-radius = {
+        "bottom-left" = 9.0;
+        "bottom-right" = 9.0;
+        "top-left" = 0.0;
+        "top-right" = 0.0;
+      };
+
+      min-width = 400;
+      max-width = 400;
+      min-height = 500;
+      max-height = 500;
     }
   ];
 
diff --git a/config/home/zaphyra/programs/pipewire.nix b/config/home/zaphyra/programs/pipewire.nix
@@ -12,7 +12,7 @@
     sonusmix
   ];
 
-  home.file."${config.xdg.configHome}/pipewire/pipewire.conf.d/10-chloe-raop.conf".text =
+  xdg.configFile."pipewire/pipewire.conf.d/10-chloe-raop.conf".text =
     let
       raopSink = ipAddr: name: {
         name = "libpipewire-module-raop-sink";

@@ -39,10 +39,11 @@
         {
           name = "libpipewire-module-combine-stream";
           args = {
-            "node.name" = "combine_sink";
+            "node.name" = "raop_multi_room";
             "node.description" = "Multi-Room";
             "combine.mode" = "sink";
             "combine.latency-compensate" = false;
+            "combine.on-demand-streams" = true;
             "stream.rules" = [
               {
                 actions."create-stream" = { };
diff --git a/config/home/zaphyra/programs/wleave.nix b/config/home/zaphyra/programs/wleave.nix
@@ -1,6 +1,5 @@
 {
   config,
-  lib,
   pkgs,
   ...
 }:

@@ -8,43 +7,90 @@
 {
 
   home.packages = [
-    (pkgs.writeShellScriptBin "wleave" ''
-      ${lib.getExe pkgs.wleave} --buttons-per-row 5 --column-spacing 10 --margin-bottom 440 --margin-top 440 $@
-    '')
+    pkgs.tgc.wleave
   ];
 
-  home.file."${config.xdg.configHome}/wleave/layout".text = lib.concatStringsSep "\n" (
-    lib.map (elem: builtins.toJSON elem) [
+  xdg.configFile."wleave/layout.json".text = builtins.toJSON {
+    no-version-info = true;
+    css = "${config.xdg.configHome}/wleave/style.css";
+    close-on-lost-focus = true;
+    buttons-per-row = "1/1";
+    margin-top = 380;
+    margin-bottom = 380;
+    buttons = [
       {
         label = "lock";
+        icon = "${pkgs.tgc.wleave}/share/wleave/icons/lock.svg";
         action = "loginctl lock-session";
         text = "Lock";
         keybind = "l";
       }
       {
         label = "suspend";
+        icon = "${pkgs.tgc.wleave}/share/wleave/icons/suspend.svg";
         action = "systemctl suspend";
         text = "Suspend";
         keybind = "u";
       }
       {
         label = "logout";
+        icon = "${pkgs.tgc.wleave}/share/wleave/icons/logout.svg";
         action = "loginctl terminate-user $USER";
         text = "Logout";
         keybind = "e";
       }
       {
         label = "shutdown";
+        icon = "${pkgs.tgc.wleave}/share/wleave/icons/shutdown.svg";
         action = "systemctl poweroff";
         text = "Shutdown";
         keybind = "s";
       }
       {
         label = "reboot";
+        icon = "${pkgs.tgc.wleave}/share/wleave/icons/reboot.svg";
         action = "systemctl reboot";
         text = "Reboot";
         keybind = "r";
       }
-    ]
-  );
+    ];
+  };
+
+  home.file."${config.xdg.configHome}/wleave/style.css".text = ''
+    * {
+      font-family: "Adwaita Sans", "Symbols Nerd Font";
+      outline: none;
+      color: white;
+    }
+
+    window {
+      background-color: @background-color;
+    }
+
+    button {
+      color: rgb(190, 190, 190);
+      background: @button-color;
+      border: 1px solid @border-color;
+      border-radius: 10px;
+      padding: 10px;
+      margin: 10px;
+    }
+
+    button:hover {
+      border-color: @border-color;
+      background: @button-hover-color;
+    }
+
+    button:focus {
+      border: 2px solid @accent-border-color;
+      background: @button-hover-color;
+    }
+
+    button label.action-name {
+      margin-top: 20px;
+      font-size: 18pt;
+      font-weight: 300;
+    }
+  '';
+
 }
diff --git a/config/home/zaphyra/services/swaync.nix b/config/home/zaphyra/services/swaync.nix
@@ -1,4 +1,5 @@
 {
+  config,
   lib,
   pkgs,
   homeManagerModules,

@@ -33,43 +34,66 @@
         "backlight"
         "volume"
         "title"
+        "notifications"
+        "mpris"
       ];
 
       widget-config = {
-        volume.label = "";
+        volume.label = "";
         backlight.label = "󰃟";
         title = {
-          text = "Notification Center";
+          text = "Notifications";
           clear-all-button = true;
-          button-text = "󰆴 Clear";
+          button-text = "󰆴Clear";
+        };
+
+        mpris = {
+          autohide = true;
+          show_album_art = "never";
+          blacklist = [ "^(?!playerctld)" ];
         };
 
         "buttons-grid#powerprofiles".actions = [
           {
             type = "toggle";
-            label = "   Power Saver ";
+            label = "  Power Saver ";
             update-command = "sh -c '[[ $(powerprofilesctl get) == \"power-saver\" ]] && echo true || echo false'";
-            command = "sh -c 'swaync-client -cp; powerprofilesctl set power-saver'";
+            command = lib.concatStringsSep " " [
+              "swaync-client -cp;"
+              "powerprofilesctl set power-saver"
+            ];
           }
           {
             type = "toggle";
-            label = "   Balanced ";
+            label = "  Balanced ";
             update-command = "sh -c '[[ $(powerprofilesctl get) == \"balanced\" ]] && echo true || echo false'";
-            command = "sh -c 'swaync-client -cp; powerprofilesctl set balanced'";
+            command = lib.concatStringsSep " " [
+              "swaync-client -cp;"
+              "powerprofilesctl set balanced"
+            ];
           }
           {
             type = "toggle";
             label = "  Performance ";
             update-command = "sh -c '[[ $(powerprofilesctl get) == \"performance\" ]] && echo true || echo false'";
-            command = "sh -c 'swaync-client -cp; powerprofilesctl set performance'";
+            command = lib.concatStringsSep " " [
+              "swaync-client -cp;"
+              "powerprofilesctl set performance"
+            ];
           }
         ];
         "buttons-grid#actions".actions = [
           {
             type = "toggle";
-            label = " ☕ ";
-            command = "systemctl --user is-active --quiet swayidle.service && systemctl --user stop swayidle.service || systemctl --user start swayidle.service";
+            label = "☕";
             update-command = "systemctl --user is-active --quiet swayidle.service && echo false || echo true";
+            command = lib.concatStringsSep " " [
+              "systemctl --user is-active --quiet swayidle.service"
+              "&&"
+              "systemctl --user stop swayidle.service"
+              "||"
+              "systemctl --user start swayidle.service"
+            ];
           }
           {
             type = "toggle";

@@ -82,82 +106,119 @@
             type = "toggle";
             active = true;
             label = "󰥻 󰛨";
-            command = "sh -c '[[ $SWAYNC_TOGGLE_STATE == true ]] && ${lib.getExe pkgs.brightnessctl} --device='tpacpi::kbd_backlight' set 1 || ${lib.getExe pkgs.brightnessctl} --device='tpacpi::kbd_backlight' set 0'";
             update-command = "sh -c '[[ $(${lib.getExe pkgs.brightnessctl} --device='tpacpi::kbd_backlight' get) == \"1\" ]] && echo true || echo false'";
+            command = "sh -c '[[ $SWAYNC_TOGGLE_STATE == true ]] && ${lib.getExe pkgs.brightnessctl} --device='tpacpi::kbd_backlight' set 1 || ${lib.getExe pkgs.brightnessctl} --device='tpacpi::kbd_backlight' set 0'";
           }
           {
             type = "toggle";
             active = true;
             label = "直";
-            command = "sh -c '[[ $SWAYNC_TOGGLE_STATE == true ]] && nmcli radio wifi on || nmcli radio wifi off'";
             update-command = "sh -c '[[ $(nmcli radio wifi) == \"enabled\" ]] && echo true || echo false'";
+            command = "sh -c '[[ $SWAYNC_TOGGLE_STATE == true ]] && nmcli radio wifi on || nmcli radio wifi off'";
           }
           {
             type = "toggle";
             label = "";
-            # command = "swaync-client -cp; ${config.home.sessionVariables.TERMINAL} --confirm-close-surface=false -e ${lib.getExe pkgs.bluetui}";
-            command = "swaync-client -cp; ${lib.getExe pkgs.overskride}";
             update-command = "sh -c 'bluetoothctl show | grep -q \\\"Powered: yes\\\" && echo true || echo false'";
+            command = lib.concatStringsSep " " [
+              "swaync-client -cp;"
+              config.home.sessionVariables.TERMINAL
+              "--confirm-close-surface=false"
+              "-e"
+              (lib.getExe pkgs.bluetuith)
+            ];
           }
           {
             label = "";
-            command = "swaync-client -cp; wleave";
+            command = lib.concatStringsSep " " [
+              "swaync-client -cp;"
+              "wleave"
+            ];
           }
         ];
       };
     };
     style = ''
-      @define-color border-color rgba(255, 255, 255, 0.08);
-
       * {
-        font-family: "Adwaita Sans", "Symbols Nerd Font";
+        all: unset;
+        font-family: "AdwaitaSans Nerd Font";
       }
 
       .control-center {
-        background-color: #222226;
-        border-radius: 0 0 10px 10px;
-        border: 2px solid @border-color;
-        border-top: 0;
         box-shadow: 0 0 10px 0 rgba(0,0,0,.80);
+        background: @background-color;
+        border-radius: 0 0 10px 10px;
+        border: 2px solid @accent-border-color;
+        border-top: unset;
+      }
+
+      .control-center > box {
+        padding: 4px 8px;
+      }
+
+      .control-center box:first-child {
+        margin-top: 4px;
+      }
+
+      .actions button {
+        padding: 1px 0;
+      }
+
+      .powerprofiles button {
+        margin: 0 4px;
         padding: 4px;
       }
 
-      .widget-title > button {
-        background: rgba(255, 255, 255, 0.06);
+      .widget-volume label,
+      .widget-brightness label {
+        padding: 2px;
+      }
+
+      .widget-volume > box > label,
+      .widget-backlight > label {
+        padding: 0 4px;
+      }
+
+      scale trough {
+        background: @button-color;
         border: 1px solid @border-color;
         border-radius: 4px;
-      }
-      .widget-title > button:hover {
-        background: rgba(255, 255, 255, 0.1);
+        min-height: 4px;
       }
 
-      .widget-backlight, .widget-volume, .widget-buttons-grid {
-        background: transparent;
+      scale slider {
+        min-height: 8px;
+        min-width: 8px;
+        background: white;
+        border-radius: 10px;
+        border: 1px solid @border-color;
       }
 
-      .widget-backlight,
-      .widget-volume {
-        margin: 0px;
-        padding: 5px 10px;
+      .widget-title {
+        border-top: 1px solid rgba(255,255,255,.1);
       }
 
-      /* Buttons */
-      .widget-buttons-grid {
-        padding: 0px;        
+      .widget-title > label {
+        margin: 4px;
+        font-size: 14pt;
+        font-weight: 300;
       }
 
-      .widget-buttons-grid > flowbox > flowboxchild > button {
-        background: rgba(255, 255, 255, 0.06);
+      /* Buttons */
+      button {
+        background: @button-color;
         border: 1px solid @border-color;
         border-radius: 4px;
+        margin: 4px;
+        padding: 2px;
       }
 
-      .widget-buttons-grid > flowbox > flowboxchild > button:checked {
-        border-bottom: 2px solid rgb(74, 169, 108);
+      button:hover {
+        background: @button-hover-color;
       }
 
-      .widget-buttons-grid > flowbox > flowboxchild > button:hover {
-        background: rgba(255, 255, 255, 0.1);
+      button:checked {
+        border-bottom: 2px solid @accent-color;
       }
 
       /* Sliders */

@@ -167,41 +228,25 @@
       }
 
       scale trough {
-        background: rgba(255, 255, 255, 0.06);
+        background: @button-color;
       }
 
       scale highlight {
-        background: rgb(74, 169, 108);
+        background: @accent-color;
         border-radius: 5px;
       }
 
-
       /* Notification */
-      .control-center .notification {
-        box-shadow: unset;
-        background: rgba(47, 47, 51, 0.95);
-        border: 1px solid @border-color;
-      }
-
-      .close-button {
-        border-radius: 0;
-        margin-top: 0;
-        margin-right: -2px;
-        background: unset;
-      }
-
-      .close-button:hover {
-        background: rgba(255, 255, 255, 0.1);
-        border-bottom-left-radius: 4px;
-        border-top-right-radius: 4px;
-      }
-
-      .notification-group-headers {
-        margin-bottom: 4px;
+      .notification {
+        background: @background-color;
+        border: 2px solid @accent-border-color;
+        border-radius: 4px;
+        margin: 4px;
       }
 
-      .notification-group-icon {
-        opacity: 0;
+      .control-center .notification {
+        background: @button-color;
+        border: 1px solid @border-color;
       }
 
       .notification-group .notification-group-header {

@@ -209,33 +254,6 @@
         font-size: 16pt;
       }
 
-      .notification-group .notification-group-buttons {
-        margin: 4px;
-      }
-
-      .notification-group-collapse-button,
-      .notification-group-close-all-button {
-        border-radius: 4px;
-        background: rgba(47, 47, 51, 0.95);
-        border: 1px solid @border-color;
-        margin: 0 4px;
-      }
-
-      .notification-background {
-        padding: 5px 5px;
-      }
-
-      .notification {
-        background: rgba(0, 0, 0, 0.5);
-        border: 2px solid rgba(59, 135, 86, 0.5);
-        border-radius: 4px;
-      }
-
-      .notification .notification-default-action:hover,
-      .notification button:hover {
-        background: rgba(255, 255, 255, 0.06);
-        border-radius: 0;
-      }
 
       .notification .text-box {
         margin: 2px;

@@ -248,7 +266,11 @@
       .notification .text-box .time {
         font-weight: 200;
         font-size: 13px;
-        margin-right: 0;
+      }
+
+      .notification .notification-default-action:hover,
+      .notification button:hover {
+        background: @button-hover-color;
       }
     '';
   };
diff --git a/config/home/zaphyra/services/waybar.nix b/config/home/zaphyra/services/waybar.nix
@@ -26,6 +26,7 @@
 
         modules-left = [
           "niri/workspaces"
+          "cffi/niri-taskbar"
           "custom/arrow1"
         ];
         modules-center = [

@@ -33,8 +34,8 @@
           "custom/notification"
         ];
         modules-right = [
-          "tray"
           "custom/arrow2"
+          "tray"
           "network"
           "wireplumber"
           "custom/airpodsctl"

@@ -43,21 +44,40 @@
         ];
 
         "niri/workspaces" = {
-          format = "{index}: {value}";
+          format = "{icon}";
+          format-icons = {
+            default = "";
+            active = "";
+          };
         };
 
-        "niri/language" = {
-          format = "{}";
-          format-en = "US";
-          format-de = "DE";
-          format-ru = "RU";
+        "cffi/niri-taskbar" = {
+          module_path = "${pkgs.tgc.niri-taskbar}/lib/libniri_taskbar.so";
+        };
+
+        "custom/arrow1" = {
+          format = "";
+          tooltip = false;
         };
 
         clock = {
           on-click = "swaync-client -t -sw";
           on-click-right = lib.getExe pkgs.gnome-calendar;
           format = "{:%d. %b %H:%M}";
-          tooltip-format = "{:%x %T}";
+          tooltip = false;
+          tooltip-format = "<tt><small>{calendar}</small></tt>";
+          calendar = {
+            mode = "year";
+            mode-mon-col = 3;
+            weeks-pos = "left";
+            format = {
+              months = "<span color='#ffead3'><b>{}</b></span>";
+              days = "<span color='#fff'><b>{}</b></span>";
+              weeks = "<span color='#99ffdd'><b>W{}</b></span>";
+              weekdays = "<span color='#ffcc66'><b>{}</b></span>";
+              today = "<span color='#ff6699'><b><u>{}</u></b></span>";
+            };
+          };
         };
 
         "custom/notification" = {

@@ -84,7 +104,12 @@
           spacing = 10;
         };
 
-        "network" =
+        "custom/arrow2" = {
+          format = "";
+          tooltip = false;
+        };
+
+        network =
           let
             format = [
               "<b>Interface:</b> {ifname}"

@@ -97,8 +122,8 @@
             interval = 5;
             # family = "ipv4_6";
 
-            # on-click = lib.getExe pkgs.networkmanager_dmenu;
-            on-click = lib.getExe pkgs.unstable.nmgui;
+            on-click-right = lib.getExe pkgs.networkmanager_dmenu;
+            on-click = "nmgui";
 
             tooltip-format = lib.concatStringsSep "\n" format;
             tooltip-format-wifi = lib.concatStringsSep "\n" (

@@ -110,21 +135,22 @@
               ]
             );
 
-            format-ethernet = "󰈀 ";
-            format-wifi = "󰖩  {essid} ({signalStrength}%)";
-            format-linked = "󰌹 ";
-            format-disconnected = "󰌙 ";
+            format-ethernet = "󰈀";
+            format-wifi = "󰖩 {essid} ({signalStrength}%)";
+            format-linked = "󰌹";
+            format-disconnected = "󰌙";
           };
 
         wireplumber = {
           max-volume = 150;
           scroll-step = 1;
 
+          on-click-right = lib.getExe pkgs.pwvucontrol;
           on-click = lib.concatStringsSep " " [
             config.home.sessionVariables.TERMINAL
             "--confirm-close-surface=false"
             "-e"
-            (lib.getExe pkgs.ncpamixer)
+            (lib.getExe pkgs.unstable.wiremix)
           ];
 
           format = "{icon} {volume}%";

@@ -171,9 +197,9 @@
           };
 
           # Connected to AC
-          format = "󰚥 <span color='white'>{capacity}%</span>";
+          format = "󰚥 <span color='#bedcbe'>{capacity}%</span>";
           # Not connected to AC
-          format-discharging = "{icon} <span color='white'>{capacity}%</span>";
+          format-discharging = "{icon} <span color='#bedcbe'>{capacity}%</span>";
           format-icons = [
             "󱃍"
             "󰂎"

@@ -191,14 +217,11 @@
           tooltip-format = "{power} W, {timeTo}";
         };
 
-        "custom/arrow1" = {
-          format = "";
-          tooltip = false;
-        };
-
-        "custom/arrow2" = {
-          format = "";
-          tooltip = false;
+        "niri/language" = {
+          format = "{}";
+          format-en = "US";
+          format-de = "DE";
+          format-ru = "RU";
         };
       }
     ];

@@ -206,79 +229,94 @@
     style = ''
       @keyframes blink {
         to {
-          background: transparent;
-          color: #fff;
+          background: @background-color;
+          color: rgb(190, 220, 190);
         }
       }
 
       * {
-        font-family: "Adwaita Sans", "Symbols Nerd Font";
+        all: unset;
+        font-family: "AdwaitaSans Nerd Font";
         font-size: 14px;
-        border: none;
-        border-radius: 0;
-        min-height: 0;
-        transition: none;
-        box-shadow: none;
+        color: rgb(190, 220, 190);
       }
 
-      window#waybar {
+      tooltip {
+        background: @background-color;
+        border: 1px solid @border-color;
+      }
+
+      tooltip label {
         color: white;
-        background: rgba(0, 0, 0, 0.5);
-        border-bottom: 2px solid rgba(59, 135, 86, 0.5);
+        padding: 4px;
       }
 
-      #workspaces {
-        background: rgba(255, 255, 255, 0.06);
+      window#waybar {
+        background: @background-color;
+        border-bottom: 2px solid @accent-border-color;
       }
-      #workspaces button.focused {
-        background: rgba(255, 255, 255, 0.1);
-        border-bottom: 2px solid rgb(74, 169, 108);
+
+      .modules-left > widget:not(:last-child),
+      .modules-right > widget:not(:first-child) {
+        background: rgba(255, 255, 255, .05);
       }
-      #workspaces button:hover {
-        background: rgba(255, 255, 255, 0.06);
+
+      .modules-left > widget:not(:last-child) > *,
+      .modules-right > widget:not(:first-child) > * {
+        padding: 0 10px;
       }
 
-      #clock {
-        font-size: 14px;
-        font-family: 'Noto Mono', monospace;
-        padding: 0px 5px;
+      #custom-arrow1,
+      #custom-arrow2 {
+        color: rgba(255, 255, 255, .05);
+        font-family: monospace;
+        font-size: 20pt;
       }
 
-      #tray {
-        padding: 0px 15px;
+      #workspaces label {
+        font-size: 14pt;
       }
 
-      #network, #wireplumber, #custom-airpodsctl, #battery, #language {
-        background: rgba(255, 255, 255, 0.06);
-        padding: 0px 15px;
+      .niri-taskbar image {
+        opacity: .7;
       }
 
-      #battery {
-        color: #a3be8c;
+      #workspaces button,
+      .niri-taskbar button {
+        padding: 4px;
+        border-bottom: 2px solid transparent;
       }
 
-      #battery.charging {
+      #workspaces button:hover,
+      #workspaces button.focused,
+      .niri-taskbar button:hover,
+      .niri-taskbar button.focused {
+        background: @button-hover-color;
+        border-bottom: 2px solid @accent-color;
+      }
+
+      #clock {
+        color: white;
+        font-size: 14px;
+        font-family: 'AdwaitaMono Nerd Font';
+      }
+
+      #custom-notification {
+        padding: 0 4px;
+      }
+
+      #battery {
         color: #a3be8c;
       }
 
       #battery.critical:not(.charging) {
         background: rgba(245, 60, 60, 0.4);
-        color: #fff;
-
-        border-radius: 15px;
-        margin: 6px;
-
         animation-name: blink;
         animation-duration: 1s;
         animation-timing-function: linear;
         animation-iteration-count: infinite;
         animation-direction: alternate;
       }
-
-      #custom-arrow1, #custom-arrow2 {
-        font-size: 20pt;
-        color: rgba(255, 255, 255, 0.06);
-      }
     '';
   };
 
diff --git a/config/home/zaphyra/services/wob.nix b/config/home/zaphyra/services/wob.nix
@@ -11,9 +11,14 @@
     enable = true;
     settings."" = {
       anchor = "top center";
-      background_color = "00000080";
-      border_color = "4aa96ce6";
-      bar_color = "ffffffa6";
+      background_color = "0000004d";
+      border_color = "3b875680";
+      bar_color = "ffffff4d";
+      margin = "5 0 0 0";
+      height = 25;
+      bar_padding = 0;
+      border_offset = 0;
+      border_size = 2;
     };
   };