{ config, pkgs, ... }: { # === Linux desktop packages === home.packages = with pkgs; [ # pi + qmd (from overlay) qmd # Terminal ghostty zellij # Status bar waybar # App launcher rofi # Notifications dunst libnotify # Wallpaper awww btop fuzzel # Lock + idle hyprlock hypridle # Screenshots grim slurp swappy # Clipboard wl-clipboard cliphist # Brightness / audio brightnessctl pavucontrol # File manager thunar # Polkit agent polkit_gnome # Theming bibata-cursors papirus-icon-theme adw-gtk3 # Network / containers / system networkmanagerapplet firefox tailscale docker dive beeper nmap tcpdump speedtest-cli ]; # === GTK / QT theming === gtk = { enable = true; theme.name = "adw-gtk3-dark"; iconTheme.name = "Papirus-Dark"; cursorTheme = { name = "Bibata-Modern-Classic"; size = 24; }; }; qt = { enable = true; platformTheme.name = "gtk"; style.name = "adwaita-dark"; }; # === Hyprland WM config === home.file.".config/hypr/hyprland.conf" = { force = true; source = ./hyprland.conf; }; # === Ghostty config === home.file.".config/ghostty/config" = { force = true; text = '' font-family = JetBrainsMono Nerd Font font-size = 13 theme = Catppuccin Mocha background-opacity = 0.9 window-padding-x = 8 window-padding-y = 4 cursor-style = bar confirm-close-surface = false shell-integration = zsh gtk-single-instance = true ''; }; # === Zellij config === home.file.".config/zellij/config.kdl" = { force = true; text = '' theme "catppuccin-mocha" default_shell "zsh" show_startup_tips false pane_frames false scrollback_editor "nvim" keybinds clear-defaults=true { normal { bind "Ctrl g" { SwitchToMode "Locked"; } } locked { bind "Ctrl g" { SwitchToMode "Normal"; } bind "Ctrl q" { CloseTab; } bind "Ctrl p" { NewPane "down"; } bind "Ctrl n" { NewPane "right"; } bind "Ctrl t" { NewTab; } bind "Ctrl x" { CloseFocus; } bind "Ctrl f" { ToggleFloatingPanes; } bind "Ctrl z" { ToggleFocusFullscreen; } bind "Ctrl d" { Detach; } bind "Ctrl h" { MoveFocusOrTab "left"; } bind "Ctrl j" { MoveFocusOrTab "down"; } bind "Ctrl k" { MoveFocusOrTab "up"; } bind "Ctrl l" { MoveFocusOrTab "right"; } bind "Ctrl r" { SwitchToMode "RenameTab"; } } renametab { bind "Ctrl c" { SwitchToMode "Locked"; } bind "Esc" { SwitchToMode "Locked"; } } } ''; }; # === Hyprlock === home.file.".config/hypr/hyprlock.conf".text = '' general { disable_loading_bar = false; hide_cursor = true; grace = 0; no_fade_in = false; } background { path = screenshot; blur_passes = 3; blur_size = 10; color = rgba(0,0,0,0.6); } input-field { size = 250, 50; position = 0, -200; monitor = dots_center = true; fade_on_empty = false placeholder_text = unlock outer_color = rgba(8ebdff,0.8); inner_color = rgba(30,30,46,0.8) font_color = rgba(255,255,255,0.9) } label { text = cmd[update:60] date +"%A, %B %d %H:%M" position = 0, 200; monitor = font_size = 32; font_family = JetBrains Mono Nerd Font color = rgba(255,255,255,0.9) } ''; # === Hypridle === home.file.".config/hypr/hypridle.conf".text = '' general { lock_cmd = hyprlock; before_sleep_cmd = hyprlock; } listener { timeout = 300; on-timeout = hyprlock; } listener { timeout = 600; on-timeout = hyprctl dispatch dpms off; on-resume = hyprctl dispatch dpms on; } ''; # === Waybar config === home.file.".config/waybar/config.jsonc" = { force = true; text = builtins.toJSON { layer = "top"; position = "top"; height = 32; spacing = 4; margin = "6 8 0 8"; modules-left = [ "hyprland/workspaces" ]; modules-center = [ "clock" ]; modules-right = [ "tray" "pulseaudio" "backlight" "battery" "network" "cpu" "temperature" "memory" ]; "hyprland/workspaces" = { format = "{icon}"; format-icons = { "1" = "󰆍"; "2" = "󰨞"; "3" = "󰖟"; "4" = "󰭻"; "5" = "󰠮"; media = "󰎆"; "7" = "󰎇"; "8" = "󰎈"; "9" = "󰎉"; sys = "󰒓"; default = "󰊌"; }; persistent_workspaces = { "1" = []; "2" = []; "3" = []; "4" = []; "5" = []; }; }; clock = { format = "{:%a %b %d %H:%M}"; tooltip-format = "{:%Y %B}\n{calendar}"; }; cpu = { format = " {usage}%"; }; temperature = { format = " {temperatureC}°C"; interval = 10; thermal-zone = 5; }; memory = { format = "󰍛 {}%"; }; backlight = { format = "{icon} {percent}%"; format-icons = [ "󰃝" "󰃞" "󰃟" "󰃠" ]; }; battery = { format = "{icon} {capacity}%"; format-icons = [ "󰁺" "󰁻" "󰁼" "󰁽" "󰁾" "󰁿" "󰂀" "󰂁" "󰂂" "󰁹" ]; format-charging = "󰂄 {capacity}%"; }; network = { format-wifi = "󰖩 {signalStrength}%"; format-ethernet = "󰈀"; format-disconnected = "⚠"; tooltip-format = "{ifname} via {gwaddr}"; }; pulseaudio = { format = "{icon} {volume}%"; format-bluetooth = "{icon}󰂯 {volume}%"; format-muted = "󰝟"; format-icons.default = [ "󰕿" "󰖀" "󰕾" ]; on-click = "pavucontrol"; }; tray.spacing = 10; }; }; # === Waybar style === home.file.".config/waybar/style.css".text = '' * { font-family: "JetBrainsMono Nerd Font", "Font Awesome 6 Free"; font-size: 13px; } window#waybar { background: rgba(30,30,46,0.85); border-radius: 8px; color: #cdd6f4; } #workspaces button { padding: 0 6px; color: #6c7086; background: transparent; border-radius: 4px; } #workspaces button.active { color: #cdd6f4; background: #45475a; } #workspaces button:hover { color: #cdd6f4; background: #313244; } #clock, #cpu, #memory, #backlight, #battery, #network, #pulseaudio, #tray { padding: 0 10px; color: #cdd6f4; } #cpu.warning, #memory.warning, #battery.warning { color: #f9e2af; } #cpu.critical, #memory.critical, #battery.critical { color: #f38ba8; } tooltip { background: rgba(30,30,46,0.95); border: 1px solid #45475a; border-radius: 6px; } ''; # === Rofi launcher === home.file.".config/rofi/config.rasi" = { force = true; source = ./rofi-config.rasi; }; # === Dunst notifications === home.file.".config/dunst/dunstrc".text = '' [global] monitor = 0; follow = mouse; width = 350; height = 150; offset = 10x50; origin = top-right notification_limit = 5; indicate_hidden = yes; shrink = no; transparency = 0 separator_height = 2; padding = 12; horizontal_padding = 12; frame_width = 2 frame_color = "#89b4fa"; separator_color = frame; sort = yes font = JetBrainsMono Nerd Font 11; corner_radius = 8 background = "#1e1e2e"; foreground = "#cdd6f4"; timeout = 5 idle_threshold = 120; icon_position = left; max_icon_size = 48; markup = full format = "%s\n%b" [urgency_low] background = "#1e1e2e"; foreground = "#cdd6f4"; timeout = 3 [urgency_normal] background = "#1e1e2e"; foreground = "#cdd6f4"; timeout = 5 [urgency_critical] background = "#f38ba8"; foreground = "#1e1e2e"; timeout = 0 ''; # === Wallpaper rotation === home.file.".local/bin/wallpaper-rotate" = { source = ./wallpaper-rotate.sh; }; }