An opinionated NixOS configuration with Hyprland, featuring: - Modular flake-based architecture - Parameterized user configuration (username, timezone, locale, etc.) - Classical/antiquity theme with Thomas Cole wallpapers - Full Hyprland setup with waybar, rofi, swaync - Custom utility scripts (screenshots, screen recording, WiFi QR) - Neovim with LSP support - Interactive installer for existing NixOS systems - ISO builder for fresh installations Flake outputs: - nixosConfigurations.example - Test configuration - nixosConfigurations.installer - ISO installer - packages.iso - Bootable ISO image - apps.default - Interactive installer - lib.mkHost - Host builder function - templates.default - Starter template Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
268 lines
6.4 KiB
Nix
268 lines
6.4 KiB
Nix
# Waybar status bar configuration
|
||
{
|
||
config,
|
||
lib,
|
||
pkgs,
|
||
...
|
||
}: {
|
||
programs.waybar = {
|
||
enable = true;
|
||
style = ''
|
||
* {
|
||
font-family: "JetBrainsMono Nerd Font Mono", "JetBrainsMono NF", monospace;
|
||
font-size: 14px;
|
||
min-height: 0;
|
||
}
|
||
|
||
window#waybar {
|
||
background-color: rgba(26, 22, 17, 0.92);
|
||
color: #d4c4a8;
|
||
border-bottom: 2px solid rgba(139, 90, 43, 0.6);
|
||
}
|
||
|
||
#workspaces button {
|
||
padding: 0 8px;
|
||
color: #8b7355;
|
||
border-radius: 4px;
|
||
margin: 4px 2px;
|
||
}
|
||
|
||
#workspaces button.active {
|
||
color: #d4a857;
|
||
background-color: rgba(180, 134, 11, 0.2);
|
||
}
|
||
|
||
#workspaces button:hover {
|
||
background-color: rgba(139, 90, 43, 0.15);
|
||
}
|
||
|
||
#custom-help {
|
||
padding: 0 10px;
|
||
margin: 4px 2px;
|
||
border-radius: 4px;
|
||
background-color: rgba(212, 168, 87, 0.3);
|
||
color: #d4a857;
|
||
font-weight: bold;
|
||
}
|
||
|
||
#custom-help:hover {
|
||
background-color: rgba(212, 168, 87, 0.5);
|
||
}
|
||
|
||
#clock, #battery, #network, #pulseaudio, #cpu, #memory, #tray {
|
||
padding: 0 12px;
|
||
margin: 4px 2px;
|
||
border-radius: 4px;
|
||
background-color: rgba(45, 38, 32, 0.85);
|
||
}
|
||
|
||
#clock {
|
||
color: #d4a857;
|
||
font-weight: bold;
|
||
}
|
||
|
||
#battery {
|
||
color: #8a9a5b;
|
||
}
|
||
|
||
#battery.charging {
|
||
color: #d4a857;
|
||
}
|
||
|
||
#battery.warning:not(.charging) {
|
||
color: #c9a227;
|
||
}
|
||
|
||
#battery.critical:not(.charging) {
|
||
color: #a63d40;
|
||
animation: blink 0.5s linear infinite alternate;
|
||
}
|
||
|
||
#network {
|
||
color: #7a9cb8;
|
||
}
|
||
|
||
#network.disconnected {
|
||
color: #a63d40;
|
||
}
|
||
|
||
#bluetooth {
|
||
color: #7a9cb8;
|
||
}
|
||
|
||
#bluetooth.connected {
|
||
color: #8a9a5b;
|
||
}
|
||
|
||
#bluetooth.disabled {
|
||
color: #5c5346;
|
||
}
|
||
|
||
#language {
|
||
color: #c67b5c;
|
||
font-weight: bold;
|
||
min-width: 20px;
|
||
}
|
||
|
||
#pulseaudio {
|
||
color: #c9a227;
|
||
}
|
||
|
||
#pulseaudio.muted {
|
||
color: #5c5346;
|
||
}
|
||
|
||
#cpu {
|
||
color: #b85c38;
|
||
}
|
||
|
||
#memory {
|
||
color: #c67b5c;
|
||
}
|
||
|
||
#tray {
|
||
padding: 0 8px;
|
||
}
|
||
|
||
@keyframes blink {
|
||
to {
|
||
background-color: #722f37;
|
||
color: #d4c4a8;
|
||
}
|
||
}
|
||
|
||
#custom-recording {
|
||
color: #ff4444;
|
||
font-weight: bold;
|
||
animation: blink 1s linear infinite;
|
||
padding: 0 10px;
|
||
}
|
||
'';
|
||
|
||
settings = {
|
||
mainBar = {
|
||
layer = "top";
|
||
position = "top";
|
||
height = 34;
|
||
spacing = 4;
|
||
modules-left = ["custom/help" "hyprland/workspaces" "hyprland/window"];
|
||
modules-center = ["custom/recording" "clock"];
|
||
modules-right = ["hyprland/language" "tray" "cpu" "memory" "pulseaudio" "bluetooth" "network" "battery"];
|
||
|
||
"custom/recording" = {
|
||
exec = "[ -f /tmp/recording-status ] && echo ' REC' || echo ''";
|
||
interval = 1;
|
||
format = "{}";
|
||
on-click = "~/.local/bin/screen-record";
|
||
tooltip = "Click to stop recording";
|
||
};
|
||
|
||
"custom/help" = {
|
||
format = "?";
|
||
tooltip = "Quick Actions (Super+/)";
|
||
on-click = "~/.local/bin/quick-actions";
|
||
};
|
||
|
||
"hyprland/workspaces" = {
|
||
format = "{name}";
|
||
on-click = "activate";
|
||
};
|
||
|
||
"hyprland/window" = {
|
||
max-length = 50;
|
||
separate-outputs = true;
|
||
};
|
||
|
||
clock = {
|
||
format = "{:%H:%M %a %b %d}";
|
||
format-alt = "{:%I:%M %p %a %b %d}";
|
||
tooltip-format = "<tt><small>{calendar}</small></tt>";
|
||
calendar = {
|
||
mode = "month";
|
||
weeks-pos = "right";
|
||
format = {
|
||
months = "<span color='#d4a857'><b>{}</b></span>";
|
||
days = "<span color='#d4c4a8'>{}</span>";
|
||
weeks = "<span color='#8b7355'>W{}</span>";
|
||
weekdays = "<span color='#c9a227'>{}</span>";
|
||
today = "<span color='#a63d40'><b><u>{}</u></b></span>";
|
||
};
|
||
};
|
||
};
|
||
|
||
cpu = {
|
||
format = "CPU {usage}%";
|
||
tooltip = true;
|
||
interval = 2;
|
||
};
|
||
|
||
memory = {
|
||
format = "RAM {percentage}%";
|
||
tooltip-format = "{used:0.1f}GB / {total:0.1f}GB";
|
||
interval = 2;
|
||
};
|
||
|
||
battery = {
|
||
states = {
|
||
warning = 30;
|
||
critical = 15;
|
||
};
|
||
format = "BAT {capacity}%";
|
||
format-charging = "CHR {capacity}%";
|
||
format-plugged = "PLG {capacity}%";
|
||
format-icons = ["" "" "" "" ""];
|
||
tooltip-format = "{timeTo}";
|
||
};
|
||
|
||
network = {
|
||
format-wifi = " {essid}";
|
||
format-ethernet = " {ipaddr}";
|
||
format-disconnected = " ";
|
||
tooltip-format-wifi = "{essid} • {signalStrength}% • {ipaddr}";
|
||
tooltip-format-ethernet = "IP: {ipaddr}";
|
||
on-click = "~/.local/bin/wifi-menu";
|
||
on-click-right = "nm-connection-editor";
|
||
};
|
||
|
||
bluetooth = {
|
||
format = "";
|
||
format-connected = " {device_alias}";
|
||
format-disabled = "";
|
||
tooltip-format = "{controller_alias}\n{status}";
|
||
tooltip-format-connected = "{controller_alias}\n{device_enumerate}";
|
||
tooltip-format-enumerate-connected = "{device_alias}";
|
||
on-click = "blueman-manager";
|
||
on-click-right = "~/.local/bin/bluetooth-toggle";
|
||
};
|
||
|
||
"hyprland/language" = {
|
||
format = "{}";
|
||
format-en = "EN";
|
||
format-gr = "ΕΛ";
|
||
tooltip-format = "{long} ({variant})";
|
||
on-click = "hyprctl switchxkblayout all next";
|
||
};
|
||
|
||
pulseaudio = {
|
||
format = "{icon} {volume}%";
|
||
format-muted = " ";
|
||
format-icons = {
|
||
default = ["" "" ""];
|
||
headphone = "";
|
||
};
|
||
tooltip-format = "{desc}";
|
||
on-click = "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle";
|
||
on-click-right = "pavucontrol";
|
||
on-scroll-up = "wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+";
|
||
on-scroll-down = "wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-";
|
||
};
|
||
|
||
tray = {
|
||
icon-size = 18;
|
||
spacing = 8;
|
||
};
|
||
};
|
||
};
|
||
};
|
||
}
|