From c077841ce5905c83440df59814645b482ca67c83 Mon Sep 17 00:00:00 2001 From: Fabian Montero Date: Tue, 7 Oct 2025 15:13:17 -0600 Subject: [PATCH] waybar: add waybar module --- trivionomicon/modules/waybar/default.nix | 13 ++ trivionomicon/modules/waybar/hm.nix | 207 +++++++++++++++++++++++ trivionomicon/modules/waybar/options.nix | 23 +++ 3 files changed, 243 insertions(+) create mode 100644 trivionomicon/modules/waybar/default.nix create mode 100644 trivionomicon/modules/waybar/hm.nix create mode 100644 trivionomicon/modules/waybar/options.nix diff --git a/trivionomicon/modules/waybar/default.nix b/trivionomicon/modules/waybar/default.nix new file mode 100644 index 0000000..97cacf3 --- /dev/null +++ b/trivionomicon/modules/waybar/default.nix @@ -0,0 +1,13 @@ +{ + config, + lib, + pkgs, + doctrine, + ... +}: +doctrine.lib.mkModule { + inherit config; + name = "waybar"; + hm = ./hm.nix; + options = ./options.nix; +} diff --git a/trivionomicon/modules/waybar/hm.nix b/trivionomicon/modules/waybar/hm.nix new file mode 100644 index 0000000..1bfa3e2 --- /dev/null +++ b/trivionomicon/modules/waybar/hm.nix @@ -0,0 +1,207 @@ +{ + lib, + pkgs, + cfg, + doctrine, + ... +}: +with lib; { + programs.waybar = { + enable = true; + settings = { + mainBar = { + layer = "top"; + position = "top"; + height = 20; + spacing = 0; + + modules-left = [ + "sway/workspaces" + "sway/mode" + ]; + modules-center = [ + "clock" + ]; + + modules-right = + [ + "keyboard-state" + "privacy" + "idle_inhibitor" + "cpu" + "memory" + "disk" + "temperature" + "tray" + ] + ++ lists.optionals cfg.battery [ + "battery" + ]; + battery = mkIf cfg.battery { + format = "{capacity}% {icon}"; + format-plugged = "{capacity}% 󱐥{icon}"; + format-icons = ["󰂃" "󰁺" "󰁻" "󰁼" "󰁽" "󰁾" "󰁿" "󰂀" "󰂁" "󰂂" "󰁹"]; + states = { + warning = 20; + critical = 10; + }; + }; + keyboard-state = { + capslock = true; + format.capslock = "{icon}"; + format-icons = { + locked = "󰘲 "; + unlocked = ""; + }; + }; + idle_inhibitor = { + format = "{icon}"; + format-icons = { + activated = " "; + deactivated = " "; + }; + }; + tray = { + icon-size = 13; + spacing = 8; + }; + clock = { + interval = 60; + format = "{:%A %B %d %Y %H:%M}"; + tooltip = false; + }; + cpu = { + format = " {usage}%"; + tooltip = false; + }; + memory = { + format = " {percentage}% "; + tooltip = true; + tooltip-format = "{used}/{total}"; + }; + disk = { + format = " {specific_used:0.0f}/{specific_total:0.0f}"; + unit = "GiB"; + tooltip = false; + }; + temperature = { + format = " {temperatureC}°C"; + }; + privacy = { + icon-size = 12; + }; + }; + }; + style = '' + * { + font-family: "${cfg.fontFamily}", monospace; + font-size: ${cfg.fontSize}; + font-weight: 500; + border: none; + box-shadow: none; + } + + /* Entire bar: fully transparent, no border */ + window#waybar { + background: transparent; + color: #eaeaea; + margin: 0; + padding: 0; + } + + /* Optional: small edge breathing room (comment out if you want edge-to-edge) */ + /* window#waybar { margin: 3px 6px 0 6px; } */ + + /* Module containers */ + .modules-left, .modules-center, .modules-right { + padding: 0; + margin: 0 6px; + } + + /* Subtle separators between modules (no boxes) */ + .modules-left > widget:not(:first-child), + .modules-center > widget:not(:first-child), + .modules-right > widget:not(:first-child) { + margin-left: 12px; + padding-left: 12px; + border-left: 1px solid rgba(255, 255, 255, 0.08); + } + + /* Tightest possible workspaces */ + #workspaces { padding: 0; margin: 0; } + #workspaces button { + margin: 0; + padding: 0 3px; + min-width: 0; + border-radius: 0; + background: transparent; + color: #cfcfcf; + } + #workspaces button:hover { + background: rgba(255, 255, 255, 0.06); + } + #workspaces button.active, + #workspaces button.focused { + background: rgba(255, 255, 255, 0.10); + color: #ffffff; + box-shadow: inset 0 -2px #ffffff; + } + #workspaces button.urgent { + background: rgba(255, 80, 80, 0.25); + box-shadow: inset 0 -2px #ff5050; + } + + /* Focused window title: single line, no glow */ + #window { + padding: 0 6px; + margin: 0; + color: #dedede; + } + + /* Sway mode indicator: visible only when active, no bloat */ + #mode { + padding: 0 6px; + margin: 0; + background: rgba(255, 255, 255, 0.10); + color: #ffffff; + box-shadow: inset 0 -2px #ffffff; + } + + /* Status modules — keep them flat and compact */ + #clock, #battery, #network, #pulseaudio, #backlight, #cpu, #memory, #temperature, #tray { + padding: 0 6px; + margin: 0; + background: transparent; + color: #eaeaea; + } + + /* States (battery, network, audio) */ + #battery.charging { color: #27f902; } + #battery.warning:not(.charging) { color: #fc8b02; } + #battery.critical:not(.charging) { color: #fc0000; } + + #network.disconnected { color: #ffb4b4; } + #pulseaudio.muted { color: #9aa0a6; } + + /* Tray: compress icons */ + #tray > .passive { opacity: 0.6; } + #tray > .needs-attention { opacity: 1; } + + /* Tooltips: clean and readable */ + tooltip { + background: rgba(30, 30, 30, 0.95); + border: 1px solid rgba(255, 255, 255, 0.08); + color: #eaeaea; + padding: 6px 8px; + } + + /* Remove any leftover borders around everything */ + #custom-*, #idle_inhibitor, #privacy, #bluetooth { + border: none; + background: transparent; + margin: 0; + padding: 0 6px; + } + ''; + }; +} diff --git a/trivionomicon/modules/waybar/options.nix b/trivionomicon/modules/waybar/options.nix new file mode 100644 index 0000000..b2daa33 --- /dev/null +++ b/trivionomicon/modules/waybar/options.nix @@ -0,0 +1,23 @@ +{lib, ...}: +with lib.types; { + hm = { + battery = lib.mkOption { + type = bool; + default = false; + description = '' + `true` to display battery info + ''; + }; + fontFamily = lib.mkOption { + type = str; + example = "JetBrainsMono Nerd Font"; + description = '' + needs to be a nerdfont + ''; + }; + fontSize = lib.mkOption { + type = str; + default = "12px"; + }; + }; +}