laptop-config/home/desktop.nix

228 lines
7.9 KiB
Nix

{ 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
# 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"
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 = <i>unlock</i>
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" "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 = "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>"; };
cpu = { format = " {usage}%"; };
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".text = ''
configuration {
modi: "drun,run,window"; show-icons: true; icon-theme: "Papirus-Dark";
drun-display-format: "{name}"; font: "JetBrainsMono Nerd Font 13"; matching: "normal";
}
window { width: 600px; border-radius: 10px; background-color: rgba(30,30,46,0.95); border: 2px;
border-color: #89b4fa; }
mainbox { padding: 8px; }
inputbar { padding: 4px 8px; background-color: rgba(49,50,68,0.8); border-radius: 8px; margin-bottom: 4px; }
entry { background: transparent; text-color: #cdd6f4; caret-color: #cdd6f4; }
listview { background: transparent; lines: 8; }
element { padding: 4px 8px; border-radius: 6px; text-color: #cdd6f4; }
element selected { background-color: rgba(137,180,250,0.3); text-color: #ffffff; }
element-text { vertical-align: 0.5; }
'';
# === 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 = "<b>%s</b>\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
'';
}