diff --git a/common/desktop-node.nix b/common/desktop-node.nix deleted file mode 100644 index e3a43ba..0000000 --- a/common/desktop-node.nix +++ /dev/null @@ -1,51 +0,0 @@ -{ pkgs, lib, ... }: -{ - # Desktop profile: Graphical desktop with Hyprland - # Extends workstation-node with desktop environment - imports = [ - ./workstation-node.nix - ]; - - # omarchy-nix enables NetworkManager, but we use useDHCP globally - networking.networkmanager.enable = lib.mkForce false; - - # Enable Hyprland (Wayland compositor) - programs.hyprland = { - enable = true; - xwayland.enable = true; # For compatibility with X11 apps if needed - }; - - # Essential desktop services - services.dbus.enable = true; - - # polkit for privilege escalation - security.polkit.enable = true; - - # Enable sound with pipewire - security.rtkit.enable = true; - services.pipewire = { - enable = true; - alsa.enable = true; - alsa.support32Bit = true; - pulse.enable = true; - }; - - # Fonts - fonts.packages = with pkgs; [ - noto-fonts - noto-fonts-cjk-sans - noto-fonts-color-emoji - liberation_ttf - fira-code - fira-code-symbols - ]; - - # Environment variables for Wayland - environment.sessionVariables = { - NIXOS_OZONE_WL = "1"; # Hint electron apps to use Wayland - }; - - environment.systemPackages = with pkgs; [ - prusa-slicer - ]; -} diff --git a/common/desktop/assets/wallpapers/1-Pawel-Czerwinski-Abstract-Purple-Blue.jpg b/common/desktop/assets/wallpapers/1-Pawel-Czerwinski-Abstract-Purple-Blue.jpg new file mode 100644 index 0000000..81221de Binary files /dev/null and b/common/desktop/assets/wallpapers/1-Pawel-Czerwinski-Abstract-Purple-Blue.jpg differ diff --git a/common/desktop/default.nix b/common/desktop/default.nix new file mode 100644 index 0000000..9de5680 --- /dev/null +++ b/common/desktop/default.nix @@ -0,0 +1,79 @@ +# ABOUTME: NixOS desktop environment module for Hyprland +# ABOUTME: Configures greetd, audio, bluetooth, fonts, and system services + +{ config, pkgs, lib, ... }: +{ + imports = [ + ../workstation-node.nix + ]; + + # Force NetworkManager off - we use useDHCP globally + networking.networkmanager.enable = lib.mkForce false; + + # Hyprland window manager + programs.hyprland = { + enable = true; + xwayland.enable = true; + }; + + # greetd display manager with tuigreet + services.greetd = { + enable = true; + settings = { + default_session = { + command = "${pkgs.tuigreet}/bin/tuigreet --time --cmd Hyprland"; + user = "greeter"; + }; + }; + }; + + # Essential desktop services + services.dbus.enable = true; + + # polkit for privilege escalation + security.polkit.enable = true; + + # DNS resolution + services.resolved.enable = true; + + # Bluetooth support + hardware.bluetooth = { + enable = true; + powerOnBoot = true; + }; + services.blueman.enable = true; + + # Audio with PipeWire + security.rtkit.enable = true; + services.pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + jack.enable = true; + }; + + # direnv support + programs.direnv.enable = true; + + # Fonts + fonts.packages = with pkgs; [ + noto-fonts + noto-fonts-cjk-sans + noto-fonts-color-emoji + liberation_ttf + fira-code + fira-code-symbols + nerd-fonts.caskaydia-mono + ]; + + # Environment variables for Wayland + environment.sessionVariables = { + NIXOS_OZONE_WL = "1"; + }; + + # Additional desktop packages + environment.systemPackages = with pkgs; [ + prusa-slicer + ]; +} diff --git a/flake.lock b/flake.lock index 372d92a..d38163b 100644 --- a/flake.lock +++ b/flake.lock @@ -1,42 +1,5 @@ { "nodes": { - "aquamarine": { - "inputs": { - "hyprutils": [ - "omarchy-nix", - "hyprland", - "hyprutils" - ], - "hyprwayland-scanner": [ - "omarchy-nix", - "hyprland", - "hyprwayland-scanner" - ], - "nixpkgs": [ - "omarchy-nix", - "hyprland", - "nixpkgs" - ], - "systems": [ - "omarchy-nix", - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1753216019, - "narHash": "sha256-zik7WISrR1ks2l6T1MZqZHb/OqroHdJnSnAehkE0kCk=", - "owner": "hyprwm", - "repo": "aquamarine", - "rev": "be166e11d86ba4186db93e10c54a141058bdce49", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "aquamarine", - "type": "github" - } - }, "base16-schemes": { "flake": false, "locked": { @@ -181,22 +144,6 @@ "type": "github" } }, - "flake-compat_2": { - "flake": false, - "locked": { - "lastModified": 1747046372, - "narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885", - "type": "github" - }, - "original": { - "owner": "edolstra", - "repo": "flake-compat", - "type": "github" - } - }, "flake-parts": { "inputs": { "nixpkgs-lib": "nixpkgs-lib" @@ -304,29 +251,6 @@ "type": "github" } }, - "gitignore": { - "inputs": { - "nixpkgs": [ - "omarchy-nix", - "hyprland", - "pre-commit-hooks", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1709087332, - "narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=", - "owner": "hercules-ci", - "repo": "gitignore.nix", - "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "gitignore.nix", - "type": "github" - } - }, "home-manager": { "inputs": { "nixpkgs": [ @@ -348,287 +272,6 @@ "type": "github" } }, - "hyprcursor": { - "inputs": { - "hyprlang": [ - "omarchy-nix", - "hyprland", - "hyprlang" - ], - "nixpkgs": [ - "omarchy-nix", - "hyprland", - "nixpkgs" - ], - "systems": [ - "omarchy-nix", - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1753964049, - "narHash": "sha256-lIqabfBY7z/OANxHoPeIrDJrFyYy9jAM4GQLzZ2feCM=", - "owner": "hyprwm", - "repo": "hyprcursor", - "rev": "44e91d467bdad8dcf8bbd2ac7cf49972540980a5", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprcursor", - "type": "github" - } - }, - "hyprgraphics": { - "inputs": { - "hyprutils": [ - "omarchy-nix", - "hyprland", - "hyprutils" - ], - "nixpkgs": [ - "omarchy-nix", - "hyprland", - "nixpkgs" - ], - "systems": [ - "omarchy-nix", - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1754305013, - "narHash": "sha256-u+M2f0Xf1lVHzIPQ7DsNCDkM1NYxykOSsRr4t3TbSM4=", - "owner": "hyprwm", - "repo": "hyprgraphics", - "rev": "4c1d63a0f22135db123fc789f174b89544c6ec2d", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprgraphics", - "type": "github" - } - }, - "hyprland": { - "inputs": { - "aquamarine": "aquamarine", - "hyprcursor": "hyprcursor", - "hyprgraphics": "hyprgraphics", - "hyprland-protocols": "hyprland-protocols", - "hyprland-qtutils": "hyprland-qtutils", - "hyprlang": "hyprlang", - "hyprutils": "hyprutils", - "hyprwayland-scanner": "hyprwayland-scanner", - "nixpkgs": "nixpkgs_2", - "pre-commit-hooks": "pre-commit-hooks", - "systems": "systems_5", - "xdph": "xdph" - }, - "locked": { - "lastModified": 1755184403, - "narHash": "sha256-VI+ZPD/uIFjzYW8IcyvBgvwyDIvUe4/xh/kOHTbITX8=", - "owner": "hyprwm", - "repo": "Hyprland", - "rev": "60d769a89908c29e19100059985db15a7b6bab6a", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "Hyprland", - "type": "github" - } - }, - "hyprland-protocols": { - "inputs": { - "nixpkgs": [ - "omarchy-nix", - "hyprland", - "nixpkgs" - ], - "systems": [ - "omarchy-nix", - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1749046714, - "narHash": "sha256-kymV5FMnddYGI+UjwIw8ceDjdeg7ToDVjbHCvUlhn14=", - "owner": "hyprwm", - "repo": "hyprland-protocols", - "rev": "613878cb6f459c5e323aaafe1e6f388ac8a36330", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprland-protocols", - "type": "github" - } - }, - "hyprland-qt-support": { - "inputs": { - "hyprlang": [ - "omarchy-nix", - "hyprland", - "hyprland-qtutils", - "hyprlang" - ], - "nixpkgs": [ - "omarchy-nix", - "hyprland", - "hyprland-qtutils", - "nixpkgs" - ], - "systems": [ - "omarchy-nix", - "hyprland", - "hyprland-qtutils", - "systems" - ] - }, - "locked": { - "lastModified": 1749154592, - "narHash": "sha256-DO7z5CeT/ddSGDEnK9mAXm1qlGL47L3VAHLlLXoCjhE=", - "owner": "hyprwm", - "repo": "hyprland-qt-support", - "rev": "4c8053c3c888138a30c3a6c45c2e45f5484f2074", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprland-qt-support", - "type": "github" - } - }, - "hyprland-qtutils": { - "inputs": { - "hyprland-qt-support": "hyprland-qt-support", - "hyprlang": [ - "omarchy-nix", - "hyprland", - "hyprlang" - ], - "hyprutils": [ - "omarchy-nix", - "hyprland", - "hyprland-qtutils", - "hyprlang", - "hyprutils" - ], - "nixpkgs": [ - "omarchy-nix", - "hyprland", - "nixpkgs" - ], - "systems": [ - "omarchy-nix", - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1753819801, - "narHash": "sha256-tHe6XeNeVeKapkNM3tcjW4RuD+tB2iwwoogWJOtsqTI=", - "owner": "hyprwm", - "repo": "hyprland-qtutils", - "rev": "b308a818b9dcaa7ab8ccab891c1b84ebde2152bc", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprland-qtutils", - "type": "github" - } - }, - "hyprlang": { - "inputs": { - "hyprutils": [ - "omarchy-nix", - "hyprland", - "hyprutils" - ], - "nixpkgs": [ - "omarchy-nix", - "hyprland", - "nixpkgs" - ], - "systems": [ - "omarchy-nix", - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1753622892, - "narHash": "sha256-0K+A+gmOI8IklSg5It1nyRNv0kCNL51duwnhUO/B8JA=", - "owner": "hyprwm", - "repo": "hyprlang", - "rev": "23f0debd2003f17bd65f851cd3f930cff8a8c809", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprlang", - "type": "github" - } - }, - "hyprutils": { - "inputs": { - "nixpkgs": [ - "omarchy-nix", - "hyprland", - "nixpkgs" - ], - "systems": [ - "omarchy-nix", - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1754481650, - "narHash": "sha256-6u6HdEFJh5gY6VfyMQbhP7zDdVcqOrCDTkbiHJmAtMI=", - "owner": "hyprwm", - "repo": "hyprutils", - "rev": "df6b8820c4a0835d83d0c7c7be86fbc555f1f7fd", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprutils", - "type": "github" - } - }, - "hyprwayland-scanner": { - "inputs": { - "nixpkgs": [ - "omarchy-nix", - "hyprland", - "nixpkgs" - ], - "systems": [ - "omarchy-nix", - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1751897909, - "narHash": "sha256-FnhBENxihITZldThvbO7883PdXC/2dzW4eiNvtoV5Ao=", - "owner": "hyprwm", - "repo": "hyprwayland-scanner", - "rev": "fcca0c61f988a9d092cbb33e906775014c61579d", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "hyprwayland-scanner", - "type": "github" - } - }, "impermanence": { "locked": { "lastModified": 1737831083, @@ -777,22 +420,6 @@ "type": "github" } }, - "nixpkgs_2": { - "locked": { - "lastModified": 1754725699, - "narHash": "sha256-iAcj9T/Y+3DBy2J0N+yF9XQQQ8IEb5swLFzs23CdP88=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "85dbfc7aaf52ecb755f87e577ddbe6dbbdbc1054", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, "nixvim": { "inputs": { "flake-parts": "flake-parts_2", @@ -815,55 +442,6 @@ "type": "github" } }, - "omarchy-nix": { - "inputs": { - "home-manager": [ - "home-manager" - ], - "hyprland": "hyprland", - "nix-colors": "nix-colors", - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1762999930, - "narHash": "sha256-uKyxLwiN6sD6EmRSno66y1a8oqISr1XiWxbWHoMJT7I=", - "owner": "henrysipp", - "repo": "omarchy-nix", - "rev": "308e0f85a0deb820c01cfbe1b4faee1daab4da12", - "type": "github" - }, - "original": { - "owner": "henrysipp", - "repo": "omarchy-nix", - "type": "github" - } - }, - "pre-commit-hooks": { - "inputs": { - "flake-compat": "flake-compat_2", - "gitignore": "gitignore", - "nixpkgs": [ - "omarchy-nix", - "hyprland", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1754416808, - "narHash": "sha256-c6yg0EQ9xVESx6HGDOCMcyRSjaTpNJP10ef+6fRcofA=", - "owner": "cachix", - "repo": "git-hooks.nix", - "rev": "9c52372878df6911f9afc1e2a1391f55e4dfc864", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "git-hooks.nix", - "type": "github" - } - }, "root": { "inputs": { "browser-previews": "browser-previews", @@ -872,12 +450,12 @@ "ethereum-nix": "ethereum-nix", "home-manager": "home-manager", "impermanence": "impermanence", + "nix-colors": "nix-colors", "nix-index-database": "nix-index-database", "nixos-hardware": "nixos-hardware", "nixpkgs": "nixpkgs", "nixpkgs-unstable": "nixpkgs-unstable_2", "nixvim": "nixvim", - "omarchy-nix": "omarchy-nix", "sops-nix": "sops-nix" } }, @@ -961,21 +539,6 @@ "type": "github" } }, - "systems_5": { - "locked": { - "lastModified": 1689347949, - "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", - "owner": "nix-systems", - "repo": "default-linux", - "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default-linux", - "type": "github" - } - }, "treefmt-nix": { "inputs": { "nixpkgs": [ @@ -1014,53 +577,6 @@ "repo": "flake-utils", "type": "github" } - }, - "xdph": { - "inputs": { - "hyprland-protocols": [ - "omarchy-nix", - "hyprland", - "hyprland-protocols" - ], - "hyprlang": [ - "omarchy-nix", - "hyprland", - "hyprlang" - ], - "hyprutils": [ - "omarchy-nix", - "hyprland", - "hyprutils" - ], - "hyprwayland-scanner": [ - "omarchy-nix", - "hyprland", - "hyprwayland-scanner" - ], - "nixpkgs": [ - "omarchy-nix", - "hyprland", - "nixpkgs" - ], - "systems": [ - "omarchy-nix", - "hyprland", - "systems" - ] - }, - "locked": { - "lastModified": 1753633878, - "narHash": "sha256-js2sLRtsOUA/aT10OCDaTjO80yplqwOIaLUqEe0nMx0=", - "owner": "hyprwm", - "repo": "xdg-desktop-portal-hyprland", - "rev": "371b96bd11ad2006ed4f21229dbd1be69bed3e8a", - "type": "github" - }, - "original": { - "owner": "hyprwm", - "repo": "xdg-desktop-portal-hyprland", - "type": "github" - } } }, "root": "root", diff --git a/flake.nix b/flake.nix index f4e851e..4afed9c 100644 --- a/flake.nix +++ b/flake.nix @@ -33,11 +33,7 @@ url = "github:nix-community/browser-previews"; inputs.nixpkgs.follows = "nixpkgs-unstable"; }; - omarchy-nix = { - url = "github:henrysipp/omarchy-nix"; - inputs.nixpkgs.follows = "nixpkgs"; - inputs.home-manager.follows = "home-manager"; - }; + nix-colors.url = "github:misterio77/nix-colors"; nixos-hardware.url = "github:NixOS/nixos-hardware/master"; }; @@ -53,7 +49,7 @@ impermanence, sops-nix, browser-previews, - omarchy-nix, + nix-colors, nixos-hardware, ... }@inputs: @@ -93,37 +89,27 @@ home-manager.nixosModules.home-manager ( { lib, ... }: - lib.mkMerge [ - { - home-manager = { - useGlobalPkgs = true; - useUserPackages = true; - users.ppetru = { - imports = [ - inputs.nix-index-database.homeModules.nix-index - inputs.nixvim.homeModules.nixvim - ./home - ] ++ lib.optionals (profile == "desktop") [ - omarchy-nix.homeManagerModules.default - ]; - }; - extraSpecialArgs = { - inherit profile; - }; + { + home-manager = { + useGlobalPkgs = true; + useUserPackages = true; + users.ppetru = { + imports = [ + inputs.nix-index-database.homeModules.nix-index + inputs.nixvim.homeModules.nixvim + ./home + ] ++ lib.optionals (profile == "desktop") [ + nix-colors.homeManagerModules.default + ]; }; - } - (lib.optionalAttrs (profile == "desktop") { - omarchy = { - full_name = "Petru Paler"; - email_address = "petru@paler.net"; - theme = "tokyo-night"; - monitors = [ "DP-1,preferred,auto,1.5" ]; + extraSpecialArgs = { + inherit profile nix-colors; }; - }) - ] + }; + } ) ] ++ nixpkgs.lib.optionals (profile == "desktop") [ - omarchy-nix.nixosModules.default + ./common/desktop ] ++ modules; specialArgs = { inherit inputs self; diff --git a/home/default.nix b/home/default.nix index 44101ea..e75a799 100644 --- a/home/default.nix +++ b/home/default.nix @@ -1,6 +1,14 @@ -{ pkgs, profile ? "cli", ... }: +{ pkgs, lib, profile ? "cli", ... }: +let + # Handle both file and directory imports for profiles + # desktop is a directory, others are files + profilePath = + if builtins.pathExists ./programs/${profile}/default.nix + then ./programs/${profile} + else ./programs/${profile}.nix; +in { - imports = [ ./programs/${profile}.nix ]; + imports = [ profilePath ]; home = { packages = (import ./packages.nix { inherit pkgs profile; }).packages; diff --git a/home/profiles/desktop.nix b/home/profiles/desktop.nix index c587da6..9e1e3ef 100644 --- a/home/profiles/desktop.nix +++ b/home/profiles/desktop.nix @@ -1,13 +1,31 @@ +# ABOUTME: Desktop profile package list +# ABOUTME: Extends workstation with GUI and Wayland tools { pkgs }: let workstationProfile = import ./workstation.nix { inherit pkgs; }; + # Hyprland ecosystem packages + hyprlandPkgs = with pkgs; [ + hyprshot + hyprpicker + hyprsunset + brightnessctl + pamixer + playerctl + gnome-themes-extra + pavucontrol + wl-clip-persist + clipse + ]; + + # Desktop GUI applications desktopPkgs = with pkgs; [ browser-previews.google-chrome - foot # Wayland-native terminal emulator - wofi # Application launcher for Wayland + nautilus + blueberry + libnotify ]; in { - packages = workstationProfile.packages ++ desktopPkgs; + packages = workstationProfile.packages ++ hyprlandPkgs ++ desktopPkgs; } diff --git a/home/programs/desktop.nix b/home/programs/desktop.nix deleted file mode 100644 index 92df0a6..0000000 --- a/home/programs/desktop.nix +++ /dev/null @@ -1,27 +0,0 @@ -{ pkgs, ... }: -{ - imports = [ ./workstation.nix ]; - - # Override ghostty to use unstable version (1.2.0+) for ssh-terminfo support - programs.ghostty.package = pkgs.unstable.ghostty; - - wayland.windowManager.hyprland = { - enable = true; - settings = { - # Remap CapsLock to Super (Mod4) - "$mod" = "SUPER"; - - input = { - kb_options = "caps:super"; - }; - - "$browser" = "google-chrome-stable --new-window --ozone-platform=wayland"; - }; - }; - - # Extend ghostty configuration from omarchy-nix - programs.ghostty.settings = { - # Automatically handle TERM compatibility for SSH (requires ghostty 1.2.0+) - shell-integration-features = "ssh-terminfo"; - }; -} diff --git a/home/programs/desktop/btop.nix b/home/programs/desktop/btop.nix new file mode 100644 index 0000000..a110368 --- /dev/null +++ b/home/programs/desktop/btop.nix @@ -0,0 +1,104 @@ +# ABOUTME: Btop system monitor configuration with nix-colors theming +# ABOUTME: Creates a custom theme file and configures btop settings + +{ config, pkgs, ... }: +let + cfg = import ./config.nix; + palette = config.colorScheme.palette; +in +{ + home.file.".config/btop/themes/${cfg.theme}.theme".text = '' + # Main text color + theme[main_fg]="${palette.base05}" + + # Title color for boxes + theme[title]="${palette.base05}" + + # Highlight color for keyboard shortcuts + theme[hi_fg]="${palette.base0D}" + + # Background color of selected item in processes box + theme[selected_bg]="${palette.base01}" + + # Foreground color of selected item in processes box + theme[selected_fg]="${palette.base05}" + + # Color of inactive/disabled text + theme[inactive_fg]="${palette.base04}" + + # Misc colors for processes box + theme[proc_misc]="${palette.base0D}" + + # Box outline colors + theme[cpu_box]="${palette.base0B}" + theme[mem_box]="${palette.base09}" + theme[net_box]="${palette.base0E}" + theme[proc_box]="${palette.base0C}" + + # Box divider line + theme[div_line]="${palette.base04}" + + # Temperature graph colors + theme[temp_start]="${palette.base0B}" + theme[temp_mid]="${palette.base0A}" + theme[temp_end]="${palette.base08}" + + # CPU graph colors + theme[cpu_start]="${palette.base0B}" + theme[cpu_mid]="${palette.base0A}" + theme[cpu_end]="${palette.base08}" + + # Mem/Disk meters + theme[free_start]="${palette.base0B}" + theme[cached_start]="${palette.base0A}" + theme[available_start]="${palette.base09}" + theme[used_start]="${palette.base08}" + + # Network graph colors + theme[download_start]="${palette.base0E}" + theme[download_mid]="${palette.base0D}" + theme[download_end]="${palette.base0C}" + theme[upload_start]="${palette.base0E}" + theme[upload_mid]="${palette.base0D}" + theme[upload_end]="${palette.base0C}" + ''; + + programs.btop = { + enable = true; + settings = { + color_theme = cfg.theme; + theme_background = false; + truecolor = true; + force_tty = false; + vim_keys = true; + rounded_corners = true; + graph_symbol = "braille"; + shown_boxes = "cpu mem net proc"; + update_ms = 2000; + proc_sorting = "cpu lazy"; + proc_colors = true; + proc_gradient = false; + proc_per_core = false; + proc_mem_bytes = true; + proc_cpu_graphs = true; + show_uptime = true; + check_temp = true; + show_coretemp = true; + temp_scale = "celsius"; + show_cpu_freq = true; + clock_format = "%X"; + background_update = true; + mem_graphs = true; + show_swap = true; + swap_disk = true; + show_disks = true; + only_physical = true; + use_fstab = true; + show_io_stat = true; + net_auto = true; + net_sync = true; + show_battery = true; + log_level = "WARNING"; + }; + }; +} diff --git a/home/programs/desktop/config.nix b/home/programs/desktop/config.nix new file mode 100644 index 0000000..4185204 --- /dev/null +++ b/home/programs/desktop/config.nix @@ -0,0 +1,21 @@ +# ABOUTME: Shared configuration values for desktop environment +# ABOUTME: Centralizes user info, theme, fonts, and display settings + +{ + user = { + fullName = "Petru Paler"; + email = "petru@paler.net"; + }; + + theme = "tokyo-night"; + base16Theme = "tokyo-night-dark"; + + primaryFont = "Liberation Sans 11"; + monoFont = "CaskaydiaMono Nerd Font"; + + scale = 1.5; + monitors = [ "DP-1,preferred,auto,1.5" ]; + + # Wallpaper for tokyo-night theme + wallpaper = "1-Pawel-Czerwinski-Abstract-Purple-Blue.jpg"; +} diff --git a/home/programs/desktop/default.nix b/home/programs/desktop/default.nix new file mode 100644 index 0000000..26307d3 --- /dev/null +++ b/home/programs/desktop/default.nix @@ -0,0 +1,59 @@ +# ABOUTME: Desktop environment home-manager configuration +# ABOUTME: Imports all desktop modules and sets up nix-colors theming + +{ config, pkgs, lib, nix-colors, ... }: +let + cfg = import ./config.nix; +in +{ + imports = [ + ../workstation.nix + ./ghostty.nix + ./hyprland + ./waybar.nix + ./wofi.nix + ./mako.nix + ./hyprpaper.nix + ./hypridle.nix + ./hyprlock.nix + ./starship.nix + ./vscode.nix + ./btop.nix + ./git.nix + ]; + + # Set up nix-colors with our theme + colorScheme = nix-colors.colorSchemes.${cfg.base16Theme}; + + # Override ghostty to use unstable version (1.2.0+) for ssh-terminfo support + programs.ghostty.package = pkgs.unstable.ghostty; + + # Extend ghostty configuration + programs.ghostty.settings = { + shell-integration-features = "ssh-terminfo"; + }; + + # GTK theme (dark for tokyo-night) + gtk = { + enable = true; + theme = { + name = "Adwaita-dark"; + package = pkgs.gnome-themes-extra; + }; + }; + + # Enable neovim (placeholder for future config) + programs.neovim.enable = true; + + # direnv + programs.direnv = { + enable = true; + nix-direnv.enable = true; + }; + + # zoxide (directory jumping) + programs.zoxide = { + enable = true; + enableBashIntegration = true; + }; +} diff --git a/home/programs/desktop/ghostty.nix b/home/programs/desktop/ghostty.nix new file mode 100644 index 0000000..9d675ae --- /dev/null +++ b/home/programs/desktop/ghostty.nix @@ -0,0 +1,60 @@ +# ABOUTME: Ghostty terminal emulator configuration with nix-colors theming +# ABOUTME: Creates a custom color theme from the nix-colors palette + +{ config, pkgs, ... }: +let + cfg = import ./config.nix; + palette = config.colorScheme.palette; +in +{ + programs.ghostty = { + enable = true; + settings = { + window-padding-x = 14; + window-padding-y = 14; + background-opacity = 0.95; + window-decoration = "none"; + + font-family = cfg.monoFont; + font-size = 12; + + theme = "desktop-theme"; + keybind = [ + "ctrl+k=reset" + ]; + }; + themes = { + desktop-theme = { + background = "#${palette.base00}"; + foreground = "#${palette.base05}"; + + selection-background = "#${palette.base02}"; + selection-foreground = "#${palette.base00}"; + palette = [ + "0=#${palette.base00}" + "1=#${palette.base08}" + "2=#${palette.base0B}" + "3=#${palette.base0A}" + "4=#${palette.base0D}" + "5=#${palette.base0E}" + "6=#${palette.base0C}" + "7=#${palette.base05}" + "8=#${palette.base03}" + "9=#${palette.base08}" + "10=#${palette.base0B}" + "11=#${palette.base0A}" + "12=#${palette.base0D}" + "13=#${palette.base0E}" + "14=#${palette.base0C}" + "15=#${palette.base07}" + "16=#${palette.base09}" + "17=#${palette.base0F}" + "18=#${palette.base01}" + "19=#${palette.base02}" + "20=#${palette.base04}" + "21=#${palette.base06}" + ]; + }; + }; + }; +} diff --git a/home/programs/desktop/git.nix b/home/programs/desktop/git.nix new file mode 100644 index 0000000..9323e6a --- /dev/null +++ b/home/programs/desktop/git.nix @@ -0,0 +1,24 @@ +# ABOUTME: Git and GitHub CLI configuration +# ABOUTME: Sets up git with user info and gh CLI integration + +{ config, pkgs, ... }: +let + cfg = import ./config.nix; +in +{ + programs.git = { + enable = true; + settings = { + user.name = cfg.user.fullName; + user.email = cfg.user.email; + credential.helper = "store"; + }; + }; + + programs.gh = { + enable = true; + gitCredentialHelper = { + enable = true; + }; + }; +} diff --git a/home/programs/desktop/hypridle.nix b/home/programs/desktop/hypridle.nix new file mode 100644 index 0000000..09ac9ec --- /dev/null +++ b/home/programs/desktop/hypridle.nix @@ -0,0 +1,27 @@ +# ABOUTME: Hypridle idle daemon configuration +# ABOUTME: Handles screen locking and DPMS after idle timeout + +{ config, pkgs, ... }: +{ + services.hypridle = { + enable = true; + settings = { + general = { + lock_cmd = "pidof hyprlock || hyprlock"; + before_sleep_cmd = "loginctl lock-session"; + after_sleep_cmd = "hyprctl dispatch dpms on"; + }; + listener = [ + { + timeout = 300; + on-timeout = "loginctl lock-session"; + } + { + timeout = 330; + on-timeout = "hyprctl dispatch dpms off"; + on-resume = "hyprctl dispatch dpms on && brightnessctl -r"; + } + ]; + }; + }; +} diff --git a/home/programs/desktop/hyprland/autostart.nix b/home/programs/desktop/hyprland/autostart.nix new file mode 100644 index 0000000..f4fdc7f --- /dev/null +++ b/home/programs/desktop/hyprland/autostart.nix @@ -0,0 +1,17 @@ +# ABOUTME: Hyprland autostart configuration +# ABOUTME: Defines programs to run at Hyprland startup + +{ config, pkgs, ... }: +{ + wayland.windowManager.hyprland.settings = { + exec-once = [ + "hyprsunset" + "systemctl --user start hyprpolkitagent" + "wl-clip-persist --clipboard regular & clipse -listen" + ]; + + exec = [ + "pkill -SIGUSR2 waybar || waybar" + ]; + }; +} diff --git a/home/programs/desktop/hyprland/bindings.nix b/home/programs/desktop/hyprland/bindings.nix new file mode 100644 index 0000000..4d2e4cf --- /dev/null +++ b/home/programs/desktop/hyprland/bindings.nix @@ -0,0 +1,99 @@ +# ABOUTME: Hyprland keybindings configuration +# ABOUTME: Defines keyboard and mouse shortcuts for window management + +{ config, pkgs, ... }: +{ + wayland.windowManager.hyprland.settings = { + bind = [ + # Application launchers + "$mod, Space, exec, $menu" + "$mod, Return, exec, $terminal" + "$mod, E, exec, $fileManager" + "$mod, B, exec, $browser" + + # Window management + "$mod, W, killactive," + "$mod, BackSpace, killactive," + "$mod, V, togglefloating," + "$mod SHIFT, equal, fullscreen," + "$mod, J, togglesplit," + "$mod, P, pseudo," + + # Focus navigation + "$mod, left, movefocus, l" + "$mod, right, movefocus, r" + "$mod, up, movefocus, u" + "$mod, down, movefocus, d" + + # Workspace switching + "$mod, 1, workspace, 1" + "$mod, 2, workspace, 2" + "$mod, 3, workspace, 3" + "$mod, 4, workspace, 4" + "$mod, 5, workspace, 5" + "$mod, 6, workspace, 6" + "$mod, 7, workspace, 7" + "$mod, 8, workspace, 8" + "$mod, 9, workspace, 9" + "$mod, 0, workspace, 10" + + # Move window to workspace + "$mod SHIFT, 1, movetoworkspace, 1" + "$mod SHIFT, 2, movetoworkspace, 2" + "$mod SHIFT, 3, movetoworkspace, 3" + "$mod SHIFT, 4, movetoworkspace, 4" + "$mod SHIFT, 5, movetoworkspace, 5" + "$mod SHIFT, 6, movetoworkspace, 6" + "$mod SHIFT, 7, movetoworkspace, 7" + "$mod SHIFT, 8, movetoworkspace, 8" + "$mod SHIFT, 9, movetoworkspace, 9" + "$mod SHIFT, 0, movetoworkspace, 10" + + # Workspace navigation + "$mod, comma, workspace, m-1" + "$mod, period, workspace, m+1" + + # Window resize + "$mod, minus, splitratio, -0.1" + "$mod, equal, splitratio, +0.1" + + # Lock screen + "$mod, Escape, exec, loginctl lock-session" + + # Screenshots + ", Print, exec, hyprshot -m region" + "SHIFT, Print, exec, hyprshot -m window" + "CTRL, Print, exec, hyprshot -m output" + + # Color picker + "$mod SHIFT, C, exec, hyprpicker -a" + + # Clipboard manager + "$mod SHIFT, V, exec, ghostty --class=clipse -e clipse" + ]; + + bindm = [ + # Mouse bindings for window management + "$mod, mouse:272, movewindow" + "$mod, mouse:273, resizewindow" + ]; + + binde = [ + # Repeatable bindings for media controls + ", XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+" + ", XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-" + ", XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" + + # Brightness controls + ", XF86MonBrightnessUp, exec, brightnessctl s +5%" + ", XF86MonBrightnessDown, exec, brightnessctl s 5%-" + ]; + + bindl = [ + # Media player controls + ", XF86AudioNext, exec, playerctl next" + ", XF86AudioPrev, exec, playerctl previous" + ", XF86AudioPlay, exec, playerctl play-pause" + ]; + }; +} diff --git a/home/programs/desktop/hyprland/default.nix b/home/programs/desktop/hyprland/default.nix new file mode 100644 index 0000000..cf4af68 --- /dev/null +++ b/home/programs/desktop/hyprland/default.nix @@ -0,0 +1,39 @@ +# ABOUTME: Hyprland window manager home-manager configuration +# ABOUTME: Imports all hyprland submodules for complete WM setup + +{ config, pkgs, lib, ... }: +let + cfg = import ../config.nix; +in +{ + imports = [ + ./bindings.nix + ./autostart.nix + ./input.nix + ./looknfeel.nix + ./windows.nix + ./envs.nix + ]; + + wayland.windowManager.hyprland = { + enable = true; + systemd.enable = true; + + settings = { + # Monitor configuration + monitor = cfg.monitors; + + # Default applications + "$terminal" = "ghostty"; + "$fileManager" = "nautilus"; + "$browser" = "google-chrome-stable --new-window --ozone-platform=wayland"; + "$menu" = "wofi --show drun"; + + # Mod key + "$mod" = "SUPER"; + }; + }; + + # Hyprland polkit agent for privilege escalation + services.hyprpolkitagent.enable = true; +} diff --git a/home/programs/desktop/hyprland/envs.nix b/home/programs/desktop/hyprland/envs.nix new file mode 100644 index 0000000..74e7bdb --- /dev/null +++ b/home/programs/desktop/hyprland/envs.nix @@ -0,0 +1,56 @@ +# ABOUTME: Hyprland environment variables configuration +# ABOUTME: Sets up Wayland, cursor, and application environment variables + +{ config, lib, pkgs, osConfig ? { }, ... }: +let + cfg = import ../config.nix; + hasNvidiaDrivers = builtins.elem "nvidia" (osConfig.services.xserver.videoDrivers or []); + nvidiaEnv = [ + "NVD_BACKEND,direct" + "LIBVA_DRIVER_NAME,nvidia" + "__GLX_VENDOR_LIBRARY_NAME,nvidia" + ]; +in +{ + wayland.windowManager.hyprland.settings = { + env = (lib.optionals hasNvidiaDrivers nvidiaEnv) ++ [ + "GDK_SCALE,${toString cfg.scale}" + + # Cursor size and theme + "XCURSOR_SIZE,24" + "HYPRCURSOR_SIZE,24" + "XCURSOR_THEME,Adwaita" + "HYPRCURSOR_THEME,Adwaita" + + # Force Wayland for applications + "GDK_BACKEND,wayland" + "QT_QPA_PLATFORM,wayland" + "QT_STYLE_OVERRIDE,kvantum" + "SDL_VIDEODRIVER,wayland" + "MOZ_ENABLE_WAYLAND,1" + "ELECTRON_OZONE_PLATFORM_HINT,wayland" + "OZONE_PLATFORM,wayland" + + # Chromium Wayland support + "CHROMIUM_FLAGS,\"--enable-features=UseOzonePlatform --ozone-platform=wayland --gtk-version=4\"" + + # Make .desktop files available for wofi + "XDG_DATA_DIRS,$XDG_DATA_DIRS:$HOME/.nix-profile/share:/nix/var/nix/profiles/default/share" + + # XCompose support + "XCOMPOSEFILE,~/.XCompose" + "EDITOR,nvim" + + # GTK dark theme + "GTK_THEME,Adwaita:dark" + ]; + + xwayland = { + force_zero_scaling = true; + }; + + ecosystem = { + no_update_news = true; + }; + }; +} diff --git a/home/programs/desktop/hyprland/input.nix b/home/programs/desktop/hyprland/input.nix new file mode 100644 index 0000000..9685d8f --- /dev/null +++ b/home/programs/desktop/hyprland/input.nix @@ -0,0 +1,23 @@ +# ABOUTME: Hyprland input and gesture configuration +# ABOUTME: Keyboard layout, mouse settings, and touchpad behavior + +{ config, lib, pkgs, ... }: +{ + wayland.windowManager.hyprland.settings = { + input = lib.mkDefault { + kb_layout = "us"; + kb_options = "caps:super,compose:ralt"; + + follow_mouse = 1; + sensitivity = 0; + + touchpad = { + natural_scroll = false; + }; + }; + + gestures = lib.mkDefault { + workspace_swipe = false; + }; + }; +} diff --git a/home/programs/desktop/hyprland/looknfeel.nix b/home/programs/desktop/hyprland/looknfeel.nix new file mode 100644 index 0000000..075f3bd --- /dev/null +++ b/home/programs/desktop/hyprland/looknfeel.nix @@ -0,0 +1,89 @@ +# ABOUTME: Hyprland visual appearance configuration +# ABOUTME: Window gaps, borders, animations, and decorations with nix-colors theming + +{ config, pkgs, ... }: +let + palette = config.colorScheme.palette; + hexToRgba = hex: alpha: "rgba(${hex}${alpha})"; + inactiveBorder = hexToRgba palette.base09 "aa"; + activeBorder = hexToRgba palette.base0D "aa"; +in +{ + wayland.windowManager.hyprland.settings = { + general = { + gaps_in = 5; + gaps_out = 10; + border_size = 2; + + "col.active_border" = activeBorder; + "col.inactive_border" = inactiveBorder; + + resize_on_border = false; + allow_tearing = false; + layout = "dwindle"; + }; + + decoration = { + rounding = 4; + + shadow = { + enabled = false; + range = 30; + render_power = 3; + ignore_window = true; + color = "rgba(00000045)"; + }; + + blur = { + enabled = true; + size = 5; + passes = 2; + vibrancy = 0.1696; + }; + }; + + animations = { + enabled = true; + + bezier = [ + "easeOutQuint,0.23,1,0.32,1" + "easeInOutCubic,0.65,0.05,0.36,1" + "linear,0,0,1,1" + "almostLinear,0.5,0.5,0.75,1.0" + "quick,0.15,0,0.1,1" + ]; + + animation = [ + "global, 1, 10, default" + "border, 1, 5.39, easeOutQuint" + "windows, 1, 4.79, easeOutQuint" + "windowsIn, 1, 4.1, easeOutQuint, popin 87%" + "windowsOut, 1, 1.49, linear, popin 87%" + "fadeIn, 1, 1.73, almostLinear" + "fadeOut, 1, 1.46, almostLinear" + "fade, 1, 3.03, quick" + "layers, 1, 3.81, easeOutQuint" + "layersIn, 1, 4, easeOutQuint, fade" + "layersOut, 1, 1.5, linear, fade" + "fadeLayersIn, 1, 1.79, almostLinear" + "fadeLayersOut, 1, 1.39, almostLinear" + "workspaces, 0, 0, ease" + ]; + }; + + dwindle = { + pseudotile = true; + preserve_split = true; + force_split = 2; + }; + + master = { + new_status = "master"; + }; + + misc = { + disable_hyprland_logo = true; + disable_splash_rendering = true; + }; + }; +} diff --git a/home/programs/desktop/hyprland/windows.nix b/home/programs/desktop/hyprland/windows.nix new file mode 100644 index 0000000..2637c43 --- /dev/null +++ b/home/programs/desktop/hyprland/windows.nix @@ -0,0 +1,31 @@ +# ABOUTME: Hyprland window rules configuration +# ABOUTME: Defines per-application window behavior and layer rules + +{ config, pkgs, ... }: +{ + wayland.windowManager.hyprland.settings = { + windowrule = [ + "suppressevent maximize, class:.*" + "tile, class:^(chromium)$" + "float, class:^(org.pulseaudio.pavucontrol|blueberry.py)$" + "float, class:^(steam)$" + "fullscreen, class:^(com.libretro.RetroArch)$" + "opacity 0.97 0.9, class:.*" + "opacity 1 1, class:^(chromium|google-chrome|google-chrome-unstable)$, title:.*Youtube.*" + "opacity 1 0.97, class:^(chromium|google-chrome|google-chrome-unstable)$" + "opacity 0.97 0.9, initialClass:^(chrome-.*-Default)$" + "opacity 1 1, initialClass:^(chrome-youtube.*-Default)$" + "opacity 1 1, class:^(zoom|vlc|org.kde.kdenlive|com.obsproject.Studio)$" + "opacity 1 1, class:^(com.libretro.RetroArch|steam)$" + "nofocus,class:^$,title:^$,xwayland:1,floating:1,fullscreen:0,pinned:0" + "float, class:(clipse)" + "size 622 652, class:(clipse)" + "stayfocused, class:(clipse)" + ]; + + layerrule = [ + "blur,wofi" + "blur,waybar" + ]; + }; +} diff --git a/home/programs/desktop/hyprlock.nix b/home/programs/desktop/hyprlock.nix new file mode 100644 index 0000000..71b8a02 --- /dev/null +++ b/home/programs/desktop/hyprlock.nix @@ -0,0 +1,70 @@ +# ABOUTME: Hyprlock screen locker configuration with nix-colors theming +# ABOUTME: Configures lock screen appearance with fingerprint support + +{ config, pkgs, nix-colors, ... }: +let + cfg = import ./config.nix; + palette = config.colorScheme.palette; + convert = nix-colors.lib.conversions.hexToRGBString; + wallpaperPath = "~/Pictures/Wallpapers/${cfg.wallpaper}"; + + backgroundRgb = "rgba(${convert ", " palette.base00}, 0.8)"; + surfaceRgb = "rgb(${convert ", " palette.base02})"; + foregroundRgb = "rgb(${convert ", " palette.base05})"; + foregroundMutedRgb = "rgb(${convert ", " palette.base04})"; +in +{ + programs.hyprlock = { + enable = true; + settings = { + general = { + disable_loading_bar = true; + no_fade_in = false; + }; + auth = { + fingerprint.enabled = true; + }; + background = { + monitor = ""; + path = wallpaperPath; + }; + + input-field = { + monitor = ""; + size = "600, 100"; + position = "0, 0"; + halign = "center"; + valign = "center"; + + inner_color = surfaceRgb; + outer_color = foregroundRgb; + outline_thickness = 4; + + font_family = cfg.monoFont; + font_size = 32; + font_color = foregroundRgb; + + placeholder_color = foregroundMutedRgb; + placeholder_text = " Enter Password 󰈷 "; + check_color = "rgba(131, 192, 146, 1.0)"; + fail_text = "Wrong"; + + rounding = 0; + shadow_passes = 0; + fade_on_empty = false; + }; + + label = { + monitor = ""; + text = "$FPRINTPROMPT"; + text_align = "center"; + color = "rgb(211, 198, 170)"; + font_size = 24; + font_family = cfg.monoFont; + position = "0, -100"; + halign = "center"; + valign = "center"; + }; + }; + }; +} diff --git a/home/programs/desktop/hyprpaper.nix b/home/programs/desktop/hyprpaper.nix new file mode 100644 index 0000000..851ff3f --- /dev/null +++ b/home/programs/desktop/hyprpaper.nix @@ -0,0 +1,23 @@ +# ABOUTME: Hyprpaper wallpaper service configuration +# ABOUTME: Sets up wallpaper based on theme selection + +{ config, pkgs, ... }: +let + cfg = import ./config.nix; + wallpaperPath = "~/Pictures/Wallpapers/${cfg.wallpaper}"; +in +{ + # Copy wallpapers to Pictures directory + home.file."Pictures/Wallpapers" = { + source = ../../../common/desktop/assets/wallpapers; + recursive = true; + }; + + services.hyprpaper = { + enable = true; + settings = { + preload = [ wallpaperPath ]; + wallpaper = [ ",${wallpaperPath}" ]; + }; + }; +} diff --git a/home/programs/desktop/mako.nix b/home/programs/desktop/mako.nix new file mode 100644 index 0000000..a7fa9f5 --- /dev/null +++ b/home/programs/desktop/mako.nix @@ -0,0 +1,41 @@ +# ABOUTME: Mako notification daemon configuration with nix-colors theming +# ABOUTME: Configures notification appearance and behavior + +{ config, pkgs, ... }: +let + palette = config.colorScheme.palette; +in +{ + services.mako = { + enable = true; + + settings = { + background-color = "#${palette.base00}"; + text-color = "#${palette.base05}"; + border-color = "#${palette.base04}"; + progress-color = "#${palette.base0D}"; + + width = 420; + height = 110; + padding = "10"; + margin = "10"; + border-size = 2; + border-radius = 0; + + anchor = "top-right"; + layer = "overlay"; + + default-timeout = 5000; + ignore-timeout = false; + max-visible = 5; + sort = "-time"; + + group-by = "app-name"; + + actions = true; + + format = "%s\\n%b"; + markup = true; + }; + }; +} diff --git a/home/programs/desktop/starship.nix b/home/programs/desktop/starship.nix new file mode 100644 index 0000000..b3850d6 --- /dev/null +++ b/home/programs/desktop/starship.nix @@ -0,0 +1,7 @@ +# ABOUTME: Starship prompt configuration +# ABOUTME: Enables the cross-shell prompt with default settings + +{ config, pkgs, ... }: +{ + programs.starship.enable = true; +} diff --git a/home/programs/desktop/themes.nix b/home/programs/desktop/themes.nix new file mode 100644 index 0000000..c85d5b6 --- /dev/null +++ b/home/programs/desktop/themes.nix @@ -0,0 +1,32 @@ +# ABOUTME: Theme definitions mapping theme names to base16 and VSCode themes +# ABOUTME: Used by vscode and other apps that need theme name mapping + +{ + "tokyo-night" = { + base16Theme = "tokyo-night-dark"; + vscodeTheme = "Tokyo Night"; + }; + "catppuccin-macchiato" = { + vscodeTheme = "Catppuccin Macchiato"; + }; + "kanagawa" = { + base16Theme = "kanagawa"; + vscodeTheme = "Kanagawa"; + }; + "everforest" = { + base16Theme = "everforest"; + vscodeTheme = "Everforest Dark"; + }; + "nord" = { + base16Theme = "nord"; + vscodeTheme = "Nord"; + }; + "gruvbox" = { + base16Theme = "gruvbox-dark-hard"; + vscodeTheme = "Gruvbox Dark Hard"; + }; + "gruvbox-light" = { + base16Theme = "gruvbox-light-medium"; + vscodeTheme = "Gruvbox Light Medium"; + }; +} diff --git a/home/programs/desktop/vscode.nix b/home/programs/desktop/vscode.nix new file mode 100644 index 0000000..045dc9a --- /dev/null +++ b/home/programs/desktop/vscode.nix @@ -0,0 +1,54 @@ +# ABOUTME: VSCode configuration with theme extensions +# ABOUTME: Installs vim keybindings and color scheme extensions + +{ config, pkgs, ... }: +let + cfg = import ./config.nix; + themes = import ./themes.nix; + theme = themes.${cfg.theme}; +in +{ + programs.vscode = { + enable = true; + profiles.default = { + extensions = + with pkgs.vscode-extensions; + [ + bbenoist.nix + vscodevim.vim + ] + ++ pkgs.vscode-utils.extensionsFromVscodeMarketplace [ + { + name = "everforest"; + publisher = "sainnhe"; + version = "0.3.0"; + sha256 = "sha256-nZirzVvM160ZTpBLTimL2X35sIGy5j2LQOok7a2Yc7U="; + } + { + name = "tokyo-night"; + publisher = "enkia"; + version = "1.1.2"; + sha256 = "sha256-oW0bkLKimpcjzxTb/yjShagjyVTUFEg198oPbY5J2hM="; + } + { + name = "kanagawa"; + publisher = "qufiwefefwoyn"; + version = "1.5.1"; + sha256 = "sha256-AGGioXcK/fjPaFaWk2jqLxovUNR59gwpotcSpGNbj1c="; + } + { + name = "nord-visual-studio-code"; + publisher = "arcticicestudio"; + version = "0.19.0"; + sha256 = "sha256-awbqFv6YuYI0tzM/QbHRTUl4B2vNUdy52F4nPmv+dRU="; + } + { + name = "gruvbox"; + publisher = "jdinhlife"; + version = "1.28.0"; + sha256 = "sha256-XwQzbbZU6MfYcT50/0YgQp8UaOeQskEvEQPZXG72lLk="; + } + ]; + }; + }; +} diff --git a/home/programs/desktop/waybar.nix b/home/programs/desktop/waybar.nix new file mode 100644 index 0000000..e461f31 --- /dev/null +++ b/home/programs/desktop/waybar.nix @@ -0,0 +1,182 @@ +# ABOUTME: Waybar status bar configuration with nix-colors theming +# ABOUTME: Configures system tray, workspaces, and status indicators + +{ config, pkgs, nix-colors, ... }: +let + palette = config.colorScheme.palette; + convert = nix-colors.lib.conversions.hexToRGBString; + backgroundRgb = "rgb(${convert ", " palette.base00})"; + foregroundRgb = "rgb(${convert ", " palette.base05})"; +in +{ + home.file.".config/waybar/theme.css".text = '' + @define-color background ${backgroundRgb}; + * { + color: ${foregroundRgb}; + } + + window#waybar { + background-color: ${backgroundRgb}; + } + ''; + + home.file.".config/waybar/style.css".text = '' + @import "./theme.css"; + * { + border: none; + border-radius: 0; + min-height: 0; + font-family: CaskaydiaMono Nerd Font; + font-size: 14px; + } + + #workspaces { + margin-left: 7px; + } + + #workspaces button { + all: initial; + padding: 2px 6px; + margin-right: 3px; + } + + #custom-dropbox, + #cpu, + #power-profiles-daemon, + #battery, + #network, + #bluetooth, + #wireplumber, + #tray, + #clock { + background-color: transparent; + min-width: 12px; + margin-right: 13px; + } + + tooltip { + padding: 2px; + } + + tooltip label { + padding: 2px; + } + ''; + + programs.waybar = { + enable = true; + settings = [ + { + layer = "top"; + position = "top"; + spacing = 0; + height = 26; + modules-left = [ "hyprland/workspaces" ]; + modules-center = [ "clock" ]; + modules-right = [ + "tray" + "bluetooth" + "network" + "wireplumber" + "cpu" + "power-profiles-daemon" + "battery" + ]; + "hyprland/workspaces" = { + on-click = "activate"; + format = "{icon}"; + format-icons = { + default = ""; + "1" = "1"; + "2" = "2"; + "3" = "3"; + "4" = "4"; + "5" = "5"; + "6" = "6"; + "7" = "7"; + "8" = "8"; + "9" = "9"; + active = "󱓻"; + }; + persistent-workspaces = { + "1" = [ ]; + "2" = [ ]; + "3" = [ ]; + "4" = [ ]; + "5" = [ ]; + }; + }; + cpu = { + interval = 5; + format = "󰍛"; + on-click = "ghostty -e btop"; + }; + clock = { + format = "{:%A %I:%M %p}"; + format-alt = "{:%d %B W%V %Y}"; + tooltip = false; + }; + network = { + format-icons = [ "󰤯" "󰤟" "󰤢" "󰤥" "󰤨" ]; + format = "{icon}"; + format-wifi = "{icon}"; + format-ethernet = "󰀂"; + format-disconnected = "󰖪"; + tooltip-format-wifi = "{essid} ({frequency} GHz)\n⇣{bandwidthDownBytes} ⇡{bandwidthUpBytes}"; + tooltip-format-ethernet = "⇣{bandwidthDownBytes} ⇡{bandwidthUpBytes}"; + tooltip-format-disconnected = "Disconnected"; + interval = 3; + nospacing = 1; + on-click = "ghostty -e nmcli"; + }; + battery = { + interval = 5; + format = "{capacity}% {icon}"; + format-discharging = "{icon}"; + format-charging = "{icon}"; + format-plugged = ""; + format-icons = { + charging = [ "󰢜" "󰂆" "󰂇" "󰂈" "󰢝" "󰂉" "󰢞" "󰂊" "󰂋" "󰂅" ]; + default = [ "󰁺" "󰁻" "󰁼" "󰁽" "󰁾" "󰁿" "󰂀" "󰂁" "󰂂" "󰁹" ]; + }; + format-full = "Charged "; + tooltip-format-discharging = "{power:>1.0f}W↓ {capacity}%"; + tooltip-format-charging = "{power:>1.0f}W↑ {capacity}%"; + states = { + warning = 20; + critical = 10; + }; + }; + bluetooth = { + format = "󰂯"; + format-disabled = "󰂲"; + format-connected = ""; + tooltip-format = "Devices connected: {num_connections}"; + on-click = "blueberry"; + }; + wireplumber = { + format = ""; + format-muted = "󰝟"; + scroll-step = 5; + on-click = "pavucontrol"; + tooltip-format = "Playing at {volume}%"; + on-click-right = "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"; + max-volume = 150; + }; + tray = { + spacing = 13; + }; + power-profiles-daemon = { + format = "{icon}"; + tooltip-format = "Power profile: {profile}"; + tooltip = true; + format-icons = { + power-saver = "󰡳"; + balanced = "󰊚"; + performance = "󰡴"; + }; + }; + } + ]; + }; +} diff --git a/home/programs/desktop/wofi.nix b/home/programs/desktop/wofi.nix new file mode 100644 index 0000000..ddfb0f6 --- /dev/null +++ b/home/programs/desktop/wofi.nix @@ -0,0 +1,102 @@ +# ABOUTME: Wofi application launcher configuration with nix-colors theming +# ABOUTME: Configures the drun launcher appearance and behavior + +{ config, pkgs, ... }: +let + cfg = import ./config.nix; + palette = config.colorScheme.palette; +in +{ + home.file.".config/wofi/style.css".text = '' + * { + font-family: '${cfg.monoFont}', monospace; + font-size: 18px; + } + + window { + margin: 0px; + padding: 20px; + background-color: #${palette.base00}; + opacity: 0.95; + } + + #inner-box { + margin: 0; + padding: 0; + border: none; + background-color: #${palette.base00}; + } + + #outer-box { + margin: 0; + padding: 20px; + border: none; + background-color: #${palette.base00}; + } + + #scroll { + margin: 0; + padding: 0; + border: none; + background-color: #${palette.base00}; + } + + #input { + margin: 0; + padding: 10px; + border: none; + background-color: #${palette.base00}; + color: @text; + } + + #input:focus { + outline: none; + box-shadow: none; + border: none; + } + + #text { + margin: 5px; + border: none; + color: #${palette.base06}; + } + + #entry { + background-color: #${palette.base00}; + } + + #entry:selected { + outline: none; + border: none; + } + + #entry:selected #text { + color: #${palette.base02}; + } + + #entry image { + -gtk-icon-transform: scale(0.7); + } + ''; + + programs.wofi = { + enable = true; + settings = { + width = 600; + height = 350; + location = "center"; + show = "drun"; + prompt = "Search..."; + filter_rate = 100; + allow_markup = true; + no_actions = true; + halign = "fill"; + orientation = "vertical"; + content_halign = "fill"; + insensitive = true; + allow_images = true; + image_size = 40; + gtk_dark = true; + }; + }; +} diff --git a/hosts/beefy/default.nix b/hosts/beefy/default.nix index 0e4a1cf..2419905 100644 --- a/hosts/beefy/default.nix +++ b/hosts/beefy/default.nix @@ -3,7 +3,7 @@ imports = [ ../../common/encrypted-btrfs-layout.nix ../../common/global - ../../common/desktop-node.nix # Hyprland + GUI environment + # Desktop environment is imported via flake.nix for desktop profile ../../common/cluster-member.nix # Consul + storage clients ../../common/cluster-tools.nix # Nomad CLI (no service) ./hardware.nix