From fb1ad8d919d3c245c462702f1021f21f1f5ea9e1 Mon Sep 17 00:00:00 2001 From: alisceon Date: Fri, 22 May 2026 19:48:24 +0200 Subject: [PATCH] deprecate stylix, fix minor gripes and bugs --- flake.lock | 518 ------------------ flake.nix | 31 +- home/modules/programs/foot.nix | 38 +- home/modules/programs/qutebrowser.nix | 6 - home/modules/programs/qutebrowser/colors.nix | 58 ++ .../qutebrowser/colors/completion.nix | 34 ++ .../programs/qutebrowser/colors/downloads.nix | 22 + .../programs/qutebrowser/colors/messages.nix | 24 + .../programs/qutebrowser/colors/statusbar.nix | 52 ++ .../programs/qutebrowser/colors/tabs.nix | 53 ++ home/modules/programs/qutebrowser/default.nix | 8 + home/modules/programs/qutebrowser/fonts.nix | 23 + home/modules/programs/rofi.nix | 12 - home/modules/programs/rofi/default.nix | 21 + home/modules/programs/rofi/theme.nix | 108 ++++ home/modules/programs/swaylock.nix | 29 +- home/modules/programs/vscode.nix | 35 +- .../{waybar.nix => waybar/default.nix} | 15 +- home/modules/programs/waybar/style.nix | 62 +++ home/modules/services/mako.nix | 23 +- home/modules/services/swayidle.nix | 24 +- home/modules/theme/cursor.nix | 11 + home/modules/theme/dconf.nix | 22 + home/modules/theme/default.nix | 8 + home/modules/theme/fonts.nix | 13 + home/modules/theme/gtk.nix | 24 + home/modules/wm/sway/default.nix | 3 +- home/modules/wm/sway/shells/default.nix | 4 +- home/modules/wm/sway/theme.nix | 45 ++ home/modules/wm/sway/xdg.nix | 4 +- home/profiles/workstation.nix | 19 +- nixos/hosts/electra/configuration.nix | 1 + nixos/modules/base.nix | 29 +- nixos/modules/profiles/server.nix | 8 +- nixos/modules/profiles/workstation.nix | 25 +- nixos/modules/theme/colors.nix | 88 +++ nixos/modules/theme/default.nix | 6 + nixos/modules/theme/fonts.nix | 13 + nixos/modules/theme/home-manager.nix | 15 + nixos/modules/theme/stylix.nix | 65 --- nixos/modules/wm/sway.nix | 4 +- util/pre_commit_nix_eval.sh | 36 ++ 42 files changed, 951 insertions(+), 688 deletions(-) delete mode 100644 flake.lock delete mode 100644 home/modules/programs/qutebrowser.nix create mode 100644 home/modules/programs/qutebrowser/colors.nix create mode 100644 home/modules/programs/qutebrowser/colors/completion.nix create mode 100644 home/modules/programs/qutebrowser/colors/downloads.nix create mode 100644 home/modules/programs/qutebrowser/colors/messages.nix create mode 100644 home/modules/programs/qutebrowser/colors/statusbar.nix create mode 100644 home/modules/programs/qutebrowser/colors/tabs.nix create mode 100644 home/modules/programs/qutebrowser/default.nix create mode 100644 home/modules/programs/qutebrowser/fonts.nix delete mode 100644 home/modules/programs/rofi.nix create mode 100644 home/modules/programs/rofi/default.nix create mode 100644 home/modules/programs/rofi/theme.nix rename home/modules/programs/{waybar.nix => waybar/default.nix} (90%) create mode 100644 home/modules/programs/waybar/style.nix create mode 100644 home/modules/theme/cursor.nix create mode 100644 home/modules/theme/dconf.nix create mode 100644 home/modules/theme/default.nix create mode 100644 home/modules/theme/fonts.nix create mode 100644 home/modules/theme/gtk.nix create mode 100644 home/modules/wm/sway/theme.nix create mode 100644 nixos/modules/theme/colors.nix create mode 100644 nixos/modules/theme/default.nix create mode 100644 nixos/modules/theme/fonts.nix create mode 100644 nixos/modules/theme/home-manager.nix delete mode 100644 nixos/modules/theme/stylix.nix create mode 100644 util/pre_commit_nix_eval.sh diff --git a/flake.lock b/flake.lock deleted file mode 100644 index a063814..0000000 --- a/flake.lock +++ /dev/null @@ -1,518 +0,0 @@ -{ - "nodes": { - "base16": { - "inputs": { - "fromYaml": "fromYaml" - }, - "locked": { - "lastModified": 1755819240, - "narHash": "sha256-qcMhnL7aGAuFuutH4rq9fvAhCpJWVHLcHVZLtPctPlo=", - "owner": "SenchoPens", - "repo": "base16.nix", - "rev": "75ed5e5e3fce37df22e49125181fa37899c3ccd6", - "type": "github" - }, - "original": { - "owner": "SenchoPens", - "repo": "base16.nix", - "type": "github" - } - }, - "base16-fish": { - "flake": false, - "locked": { - "lastModified": 1765809053, - "narHash": "sha256-XCUQLoLfBJ8saWms2HCIj4NEN+xNsWBlU1NrEPcQG4s=", - "owner": "tomyun", - "repo": "base16-fish", - "rev": "86cbea4dca62e08fb7fd83a70e96472f92574782", - "type": "github" - }, - "original": { - "owner": "tomyun", - "repo": "base16-fish", - "rev": "86cbea4dca62e08fb7fd83a70e96472f92574782", - "type": "github" - } - }, - "base16-helix": { - "flake": false, - "locked": { - "lastModified": 1776754714, - "narHash": "sha256-E3OAK27smtATTmX45uoTSRsVD+Y+ZiVVfgM/tjpbtYg=", - "owner": "tinted-theming", - "repo": "base16-helix", - "rev": "4d508123037e7851ad36ebf7d9c48b0e9e1eb581", - "type": "github" - }, - "original": { - "owner": "tinted-theming", - "repo": "base16-helix", - "type": "github" - } - }, - "base16-vim": { - "flake": false, - "locked": { - "lastModified": 1732806396, - "narHash": "sha256-e0bpPySdJf0F68Ndanwm+KWHgQiZ0s7liLhvJSWDNsA=", - "owner": "tinted-theming", - "repo": "base16-vim", - "rev": "577fe8125d74ff456cf942c733a85d769afe58b7", - "type": "github" - }, - "original": { - "owner": "tinted-theming", - "repo": "base16-vim", - "rev": "577fe8125d74ff456cf942c733a85d769afe58b7", - "type": "github" - } - }, - "firefox-gnome-theme": { - "flake": false, - "locked": { - "lastModified": 1776136500, - "narHash": "sha256-r0gN2brVWA351zwMV0Flmlcd6SGMvYqFbvC3DfKFM8Y=", - "owner": "rafaelmardojai", - "repo": "firefox-gnome-theme", - "rev": "0f8ba203d475587f477e7ae12661bd8459e225b7", - "type": "github" - }, - "original": { - "owner": "rafaelmardojai", - "repo": "firefox-gnome-theme", - "type": "github" - } - }, - "flake-compat": { - "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": [ - "nur", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1733312601, - "narHash": "sha256-4pDvzqnegAfRkPwO3wmwBhVi/Sye1mzps0zHWYnP88c=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "205b12d8b7cd4802fbcb8e8ef6a0f1408781a4f9", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" - } - }, - "flake-parts_2": { - "inputs": { - "nixpkgs-lib": [ - "stylix", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1775087534, - "narHash": "sha256-91qqW8lhL7TLwgQWijoGBbiD4t7/q75KTi8NxjVmSmA=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "3107b77cd68437b9a76194f0f7f9c55f2329ca5b", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" - } - }, - "fromYaml": { - "flake": false, - "locked": { - "lastModified": 1731966426, - "narHash": "sha256-lq95WydhbUTWig/JpqiB7oViTcHFP8Lv41IGtayokA8=", - "owner": "SenchoPens", - "repo": "fromYaml", - "rev": "106af9e2f715e2d828df706c386a685698f3223b", - "type": "github" - }, - "original": { - "owner": "SenchoPens", - "repo": "fromYaml", - "type": "github" - } - }, - "gnome-shell": { - "flake": false, - "locked": { - "lastModified": 1767737596, - "narHash": "sha256-eFujfIUQDgWnSJBablOuG+32hCai192yRdrNHTv0a+s=", - "owner": "GNOME", - "repo": "gnome-shell", - "rev": "ef02db02bf0ff342734d525b5767814770d85b49", - "type": "github" - }, - "original": { - "owner": "GNOME", - "repo": "gnome-shell", - "rev": "ef02db02bf0ff342734d525b5767814770d85b49", - "type": "github" - } - }, - "home-manager": { - "inputs": { - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1778501066, - "narHash": "sha256-T0vB/D3DqGGe+ent3+3jDTIFl2SeXcga3FMcI6AxiMU=", - "owner": "nix-community", - "repo": "home-manager", - "rev": "c0729fa3f060008080b2124fd0c3b9285d53b393", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "home-manager", - "type": "github" - } - }, - "nix-minecraft": { - "inputs": { - "flake-compat": "flake-compat", - "nixpkgs": "nixpkgs", - "systems": "systems" - }, - "locked": { - "lastModified": 1778039471, - "narHash": "sha256-Arjg44jFcpSqOKK05EIxbKIjhfjou/EGF12COFU+9QA=", - "owner": "Infinidoge", - "repo": "nix-minecraft", - "rev": "87611ef4788116de05f851920c5958f0c37d5b05", - "type": "github" - }, - "original": { - "owner": "Infinidoge", - "repo": "nix-minecraft", - "type": "github" - } - }, - "nixpkgs": { - "locked": { - "lastModified": 1769461804, - "narHash": "sha256-msG8SU5WsBUfVVa/9RPLaymvi5bI8edTavbIq3vRlhI=", - "owner": "nixos", - "repo": "nixpkgs", - "rev": "bfc1b8a4574108ceef22f02bafcf6611380c100d", - "type": "github" - }, - "original": { - "owner": "nixos", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_2": { - "locked": { - "lastModified": 1777954456, - "narHash": "sha256-hGdgeU2Nk87RAuZyYjyDjFL6LK7dAZN5RE9+hrDTkDU=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "549bd84d6279f9852cae6225e372cc67fb91a4c1", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "noctalia": { - "inputs": { - "nixpkgs": [ - "nixpkgs" - ], - "noctalia-qs": [ - "noctalia-qs" - ] - }, - "locked": { - "lastModified": 1778464608, - "narHash": "sha256-tZRvyaKVP0DJ9DSFrr6K/l3X74Orfirk3Jjo7+br4Qs=", - "owner": "noctalia-dev", - "repo": "noctalia-shell", - "rev": "761869a561548874fe7e293b157fd7841576b367", - "type": "github" - }, - "original": { - "owner": "noctalia-dev", - "repo": "noctalia-shell", - "type": "github" - } - }, - "noctalia-qs": { - "inputs": { - "nixpkgs": [ - "nixpkgs" - ], - "systems": "systems_2", - "treefmt-nix": "treefmt-nix" - }, - "locked": { - "lastModified": 1778377995, - "narHash": "sha256-uUzHDHqQF1rdVNiTa05L0mML3/d7fpbAShjCRWxbrBQ=", - "owner": "noctalia-dev", - "repo": "noctalia-qs", - "rev": "d8327a723eed6dd9aebe8e0b162126f390e827df", - "type": "github" - }, - "original": { - "owner": "noctalia-dev", - "repo": "noctalia-qs", - "type": "github" - } - }, - "nur": { - "inputs": { - "flake-parts": "flake-parts", - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1778498727, - "narHash": "sha256-+36aIJntGC1irkJZX5VHQNCRZpPM1XstFbooJ7Jt7l8=", - "owner": "nix-community", - "repo": "NUR", - "rev": "eb5c3f6ac768a4be604513ef9d4cc1770ab77d66", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "NUR", - "type": "github" - } - }, - "nur_2": { - "inputs": { - "flake-parts": [ - "stylix", - "flake-parts" - ], - "nixpkgs": [ - "stylix", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1777598946, - "narHash": "sha256-X239dAGaU1+gfDj8jKH8GzlqKMcxaVfXOio+uzBOkeE=", - "owner": "nix-community", - "repo": "NUR", - "rev": "5d55af01c0f86be583931fe99207fc56c14134b3", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "NUR", - "type": "github" - } - }, - "root": { - "inputs": { - "home-manager": "home-manager", - "nix-minecraft": "nix-minecraft", - "nixpkgs": "nixpkgs_2", - "noctalia": "noctalia", - "noctalia-qs": "noctalia-qs", - "nur": "nur", - "stylix": "stylix" - } - }, - "stylix": { - "inputs": { - "base16": "base16", - "base16-fish": "base16-fish", - "base16-helix": "base16-helix", - "base16-vim": "base16-vim", - "firefox-gnome-theme": "firefox-gnome-theme", - "flake-parts": "flake-parts_2", - "gnome-shell": "gnome-shell", - "nixpkgs": [ - "nixpkgs" - ], - "nur": "nur_2", - "systems": "systems_3", - "tinted-kitty": "tinted-kitty", - "tinted-schemes": "tinted-schemes", - "tinted-tmux": "tinted-tmux", - "tinted-zed": "tinted-zed" - }, - "locked": { - "lastModified": 1778104276, - "narHash": "sha256-/DSSnU0LLmOTG/OCgGwYpxP6+5YvxRx2g/GhI4x6aCU=", - "owner": "nix-community", - "repo": "stylix", - "rev": "18ed8d270231e067fe2739998479ed5d7c659c2c", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "stylix", - "type": "github" - } - }, - "systems": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, - "systems_2": { - "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" - } - }, - "systems_3": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, - "tinted-kitty": { - "flake": false, - "locked": { - "lastModified": 1735730497, - "narHash": "sha256-4KtB+FiUzIeK/4aHCKce3V9HwRvYaxX+F1edUrfgzb8=", - "owner": "tinted-theming", - "repo": "tinted-kitty", - "rev": "de6f888497f2c6b2279361bfc790f164bfd0f3fa", - "type": "github" - }, - "original": { - "owner": "tinted-theming", - "repo": "tinted-kitty", - "type": "github" - } - }, - "tinted-schemes": { - "flake": false, - "locked": { - "lastModified": 1777041405, - "narHash": "sha256-BAGZ7ObFV/9Z61OJZun7ifPyhkuHqNuW1QIhQ8LuzCo=", - "owner": "tinted-theming", - "repo": "schemes", - "rev": "5f868b3a338b6904c47f3833b9c411be641983a8", - "type": "github" - }, - "original": { - "owner": "tinted-theming", - "repo": "schemes", - "type": "github" - } - }, - "tinted-tmux": { - "flake": false, - "locked": { - "lastModified": 1777169200, - "narHash": "sha256-h7dDbIzP5hDr9v97w9PL6jdAgXawmj6krcH+959rqpU=", - "owner": "tinted-theming", - "repo": "tinted-tmux", - "rev": "f798c2dce44ef815bb6b8f05a82135c7942d35ac", - "type": "github" - }, - "original": { - "owner": "tinted-theming", - "repo": "tinted-tmux", - "type": "github" - } - }, - "tinted-zed": { - "flake": false, - "locked": { - "lastModified": 1777463218, - "narHash": "sha256-Bhkozqtq3BKLqWTlmKm8uAptfX4aRGI8QX3eEL54Vpc=", - "owner": "tinted-theming", - "repo": "base16-zed", - "rev": "5768d08ed2e7944a26a958868cdb073cb8856dae", - "type": "github" - }, - "original": { - "owner": "tinted-theming", - "repo": "base16-zed", - "type": "github" - } - }, - "treefmt-nix": { - "inputs": { - "nixpkgs": [ - "noctalia-qs", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1775636079, - "narHash": "sha256-pc20NRoMdiar8oPQceQT47UUZMBTiMdUuWrYu2obUP0=", - "owner": "numtide", - "repo": "treefmt-nix", - "rev": "790751ff7fd3801feeaf96d7dc416a8d581265ba", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "treefmt-nix", - "type": "github" - } - } - }, - "root": "root", - "version": 7 -} diff --git a/flake.nix b/flake.nix index c634fe3..8af6420 100644 --- a/flake.nix +++ b/flake.nix @@ -2,17 +2,14 @@ description = "NixOS configuration for all hosts"; inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + nixpkgs.url = "github:NixOS/nixpkgs/nixos-25.11"; + nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixos-unstable"; nur = { url = "github:nix-community/NUR"; inputs.nixpkgs.follows = "nixpkgs"; }; home-manager = { - url = "github:nix-community/home-manager"; - inputs.nixpkgs.follows = "nixpkgs"; - }; - stylix = { - url = "github:nix-community/stylix"; + url = "github:nix-community/home-manager/release-25.11"; inputs.nixpkgs.follows = "nixpkgs"; }; noctalia = { @@ -30,6 +27,7 @@ outputs = inputs @ { self, nixpkgs, + nixpkgs-unstable, ... }: let @@ -42,13 +40,6 @@ overlays = [ inputs.nur.overlays.default - (_final: prev: { - # openldap 2.6.13 currently flakes in its test suite when bottles pulls - # in the i686 variant for its multi-arch FHS environment. - openldap = prev.openldap.overrideAttrs (old: { - doCheck = if old.version == "2.6.13" then false else old.doCheck; - }); - }) ]; pkgs = import nixpkgs { @@ -58,20 +49,26 @@ inherit overlays; }; + pkgs-unstable = import nixpkgs { + inherit system; + config.allowUnfree = true; + flake.setFlakeRegistry = true; + inherit overlays; + }; + sharedSpecialArgs = { - inherit repoLocalPath; + inherit repoLocalPath pkgs-unstable; repoRoot = self; }; sharedModules = [ ./nixos/modules/base.nix - inputs.stylix.nixosModules.stylix inputs.home-manager.nixosModules.home-manager ({ ... }: { home-manager.useGlobalPkgs = true; home-manager.useUserPackages = true; home-manager.extraSpecialArgs = { - inherit pkgs repoLocalPath; + inherit pkgs repoLocalPath pkgs-unstable; repoRoot = self; }; home-manager.backupFileExtension = "backup"; @@ -110,7 +107,7 @@ workstationModules = [ ./nixos/modules/profiles/workstation.nix ./nixos/modules/wm/sway.nix - ./nixos/modules/theme/stylix.nix + ./nixos/modules/theme ]; workstationHomeModules = [ diff --git a/home/modules/programs/foot.nix b/home/modules/programs/foot.nix index e0ebbb7..b6ad8a5 100644 --- a/home/modules/programs/foot.nix +++ b/home/modules/programs/foot.nix @@ -1,4 +1,10 @@ -{ ... }: +{ theme, ... }: + +let + n = theme.paletteNoHash; + fonts = theme.fonts; + terminalFontSize = toString fonts.sizes.terminal; +in { programs.foot = { enable = true; @@ -6,9 +12,39 @@ settings = { main = { app-id = "footclient"; + dpi-aware = "no"; + font = "${fonts.monospace.name}:size=${terminalFontSize}"; + initial-color-theme = 1; workers = 32; }; bell.system = "no"; + colors = { + alpha = 1.0; + background = n.darkestGray; + foreground = n.lightGray; + regular0 = n.darkestGray; + regular1 = n.red; + regular2 = n.green; + regular3 = n.yellow; + regular4 = n.purple; + regular5 = n.blue; + regular6 = n.magenta; + regular7 = n.lightGray; + bright0 = n.gray; + bright1 = n.red; + bright2 = n.green; + bright3 = n.yellow; + bright4 = n.purple; + bright5 = n.blue; + bright6 = n.magenta; + bright7 = n.white; + "16" = n.orange; + "17" = n.cyan; + "18" = n.darkerGray; + "19" = n.darkGray; + "20" = n.mutedGray; + "21" = n.lighterGray; + }; scrollback.lines = 100000; }; }; diff --git a/home/modules/programs/qutebrowser.nix b/home/modules/programs/qutebrowser.nix deleted file mode 100644 index a2217d4..0000000 --- a/home/modules/programs/qutebrowser.nix +++ /dev/null @@ -1,6 +0,0 @@ -{ ... }: -{ - programs.qutebrowser = { - enable = true; - }; -} diff --git a/home/modules/programs/qutebrowser/colors.nix b/home/modules/programs/qutebrowser/colors.nix new file mode 100644 index 0000000..a225f42 --- /dev/null +++ b/home/modules/programs/qutebrowser/colors.nix @@ -0,0 +1,58 @@ +{ theme, ... }: + +let + p = theme.palette; +in +{ + imports = [ + ./colors/completion.nix + ./colors/downloads.nix + ./colors/messages.nix + ./colors/statusbar.nix + ./colors/tabs.nix + ]; + + programs.qutebrowser.settings = { + colors = { + contextmenu = { + disabled = { + bg = p.darkerGray; + fg = p.darkestGray; + }; + menu = { + bg = p.darkestGray; + fg = p.lightGray; + }; + selected = { + bg = p.gray; + fg = p.lightGray; + }; + }; + hints = { + bg = p.darkerGray; + fg = p.lightGray; + match.fg = p.green; + }; + keyhint = { + bg = p.darkestGray; + fg = p.lightGray; + suffix.fg = p.lightGray; + }; + prompts = { + bg = p.darkestGray; + border = "1px solid ${p.darkestGray}"; + fg = p.lightGray; + selected = { + bg = p.darkerGray; + fg = p.lightGray; + }; + }; + tooltip = { + bg = p.darkestGray; + fg = p.lightGray; + }; + webpage.preferred_color_scheme = theme.polarity; + }; + hints.border = "1px solid ${p.darkestGray}"; + }; +} diff --git a/home/modules/programs/qutebrowser/colors/completion.nix b/home/modules/programs/qutebrowser/colors/completion.nix new file mode 100644 index 0000000..ed319d7 --- /dev/null +++ b/home/modules/programs/qutebrowser/colors/completion.nix @@ -0,0 +1,34 @@ +{ theme, ... }: + +let + p = theme.palette; +in +{ + programs.qutebrowser.settings.colors.completion = { + category = { + bg = p.darkestGray; + border = { + bottom = p.darkestGray; + top = p.darkestGray; + }; + fg = p.green; + }; + even.bg = p.darkestGray; + fg = p.lightGray; + item.selected = { + bg = p.gray; + border = { + bottom = p.gray; + top = p.gray; + }; + fg = p.lightGray; + match.fg = p.green; + }; + match.fg = p.green; + odd.bg = p.darkerGray; + scrollbar = { + bg = p.darkestGray; + fg = p.lightGray; + }; + }; +} diff --git a/home/modules/programs/qutebrowser/colors/downloads.nix b/home/modules/programs/qutebrowser/colors/downloads.nix new file mode 100644 index 0000000..e0195cb --- /dev/null +++ b/home/modules/programs/qutebrowser/colors/downloads.nix @@ -0,0 +1,22 @@ +{ theme, ... }: + +let + p = theme.palette; +in +{ + programs.qutebrowser.settings.colors.downloads = { + bar.bg = p.darkestGray; + error = { + bg = p.red; + fg = p.darkestGray; + }; + start = { + bg = p.green; + fg = p.darkestGray; + }; + stop = { + bg = p.magenta; + fg = p.darkestGray; + }; + }; +} diff --git a/home/modules/programs/qutebrowser/colors/messages.nix b/home/modules/programs/qutebrowser/colors/messages.nix new file mode 100644 index 0000000..7097c73 --- /dev/null +++ b/home/modules/programs/qutebrowser/colors/messages.nix @@ -0,0 +1,24 @@ +{ theme, ... }: + +let + p = theme.palette; +in +{ + programs.qutebrowser.settings.colors.messages = { + error = { + bg = p.red; + border = p.red; + fg = p.darkestGray; + }; + info = { + bg = p.green; + border = p.green; + fg = p.darkestGray; + }; + warning = { + bg = p.blue; + border = p.blue; + fg = p.darkestGray; + }; + }; +} diff --git a/home/modules/programs/qutebrowser/colors/statusbar.nix b/home/modules/programs/qutebrowser/colors/statusbar.nix new file mode 100644 index 0000000..11813df --- /dev/null +++ b/home/modules/programs/qutebrowser/colors/statusbar.nix @@ -0,0 +1,52 @@ +{ theme, ... }: + +let + p = theme.palette; +in +{ + programs.qutebrowser.settings.colors.statusbar = { + caret = { + bg = p.gray; + fg = p.lightGray; + selection = { + bg = p.gray; + fg = p.lightGray; + }; + }; + command = { + bg = p.darkestGray; + fg = p.lightGray; + private = { + bg = p.darkerGray; + fg = p.lightGray; + }; + }; + insert = { + bg = p.green; + fg = p.darkestGray; + }; + normal = { + bg = p.darkestGray; + fg = p.lightGray; + }; + passthrough = { + bg = p.magenta; + fg = p.darkestGray; + }; + private = { + bg = p.darkerGray; + fg = p.lightGray; + }; + progress.bg = p.green; + url = { + error.fg = p.red; + fg = p.lightGray; + hover.fg = p.lightGray; + success = { + http.fg = p.magenta; + https.fg = p.green; + }; + warn.fg = p.blue; + }; + }; +} diff --git a/home/modules/programs/qutebrowser/colors/tabs.nix b/home/modules/programs/qutebrowser/colors/tabs.nix new file mode 100644 index 0000000..b80b763 --- /dev/null +++ b/home/modules/programs/qutebrowser/colors/tabs.nix @@ -0,0 +1,53 @@ +{ theme, ... }: + +let + p = theme.palette; +in +{ + programs.qutebrowser.settings.colors.tabs = { + bar.bg = p.darkestGray; + even = { + bg = p.darkerGray; + fg = p.lightGray; + }; + indicator = { + error = p.red; + start = p.magenta; + stop = p.green; + }; + odd = { + bg = p.darkestGray; + fg = p.lightGray; + }; + pinned = { + even = { + bg = p.green; + fg = p.darkestGray; + }; + odd = { + bg = p.magenta; + fg = p.darkestGray; + }; + selected = { + even = { + bg = p.gray; + fg = p.lightGray; + }; + odd = { + bg = p.gray; + fg = p.lightGray; + }; + }; + }; + selected = { + even = { + bg = p.gray; + fg = p.lightGray; + }; + odd = { + bg = p.gray; + fg = p.lightGray; + }; + }; + }; +} diff --git a/home/modules/programs/qutebrowser/default.nix b/home/modules/programs/qutebrowser/default.nix new file mode 100644 index 0000000..533fb42 --- /dev/null +++ b/home/modules/programs/qutebrowser/default.nix @@ -0,0 +1,8 @@ +{ + imports = [ + ./colors.nix + ./fonts.nix + ]; + + programs.qutebrowser.enable = true; +} diff --git a/home/modules/programs/qutebrowser/fonts.nix b/home/modules/programs/qutebrowser/fonts.nix new file mode 100644 index 0000000..32085fe --- /dev/null +++ b/home/modules/programs/qutebrowser/fonts.nix @@ -0,0 +1,23 @@ +{ theme, ... }: + +let + fonts = theme.fonts; + fontSize = toString fonts.sizes.applications; +in +{ + programs.qutebrowser.settings.fonts = { + default_family = fonts.sansSerif.name; + default_size = "${fontSize}pt"; + web = { + family = { + cursive = fonts.serif.name; + fantasy = fonts.serif.name; + fixed = fonts.monospace.name; + sans_serif = fonts.sansSerif.name; + serif = fonts.serif.name; + standard = fonts.sansSerif.name; + }; + size.default = 18; + }; + }; +} diff --git a/home/modules/programs/rofi.nix b/home/modules/programs/rofi.nix deleted file mode 100644 index 20a2971..0000000 --- a/home/modules/programs/rofi.nix +++ /dev/null @@ -1,12 +0,0 @@ -{ pkgs, ... }: -let - commands = import ../../../lib/commands.nix { inherit pkgs; }; - inherit (commands) term; -in -{ - programs.rofi = { - enable = true; - package = pkgs.rofi-unwrapped; - terminal = term; - }; -} diff --git a/home/modules/programs/rofi/default.nix b/home/modules/programs/rofi/default.nix new file mode 100644 index 0000000..8f0bd39 --- /dev/null +++ b/home/modules/programs/rofi/default.nix @@ -0,0 +1,21 @@ +{ pkgs, ... }: + +let + commands = import ../../../../lib/commands.nix { inherit pkgs; }; + inherit (commands) term; +in +{ + imports = [ + ./theme.nix + ]; + + programs.rofi = { + enable = true; + package = pkgs.rofi-unwrapped; + terminal = term; + extraConfig = { + "run-command" = "${commands.uwsm} {cmd}"; + "run-shell-command" = "${commands.uwsm} ${term} -e {cmd}"; + }; + }; +} diff --git a/home/modules/programs/rofi/theme.nix b/home/modules/programs/rofi/theme.nix new file mode 100644 index 0000000..28ab3c8 --- /dev/null +++ b/home/modules/programs/rofi/theme.nix @@ -0,0 +1,108 @@ +{ config, theme, ... }: +let + inherit (config.lib.formats.rasi) mkLiteral; + p = theme.palette; +in +{ + programs.rofi.theme = { + "*" = { + background = mkLiteral p.darkestGray; + background-color = mkLiteral p.darkestGray; + foreground = mkLiteral p.lightGray; + lightbg = mkLiteral p.darkerGray; + lightfg = mkLiteral p.lighterGray; + red = mkLiteral p.red; + blue = mkLiteral p.purple; + border-color = mkLiteral "@foreground"; + separatorcolor = mkLiteral "@foreground"; + normal-background = mkLiteral "@background"; + normal-foreground = mkLiteral "@foreground"; + normal-text = mkLiteral p.lightGray; + alternate-normal-background = mkLiteral "@lightbg"; + alternate-normal-foreground = mkLiteral "@foreground"; + alternate-normal-text = mkLiteral p.lightGray; + selected-normal-background = mkLiteral "@lightfg"; + selected-normal-foreground = mkLiteral "@lightbg"; + selected-normal-text = mkLiteral p.darkerGray; + active-background = mkLiteral "@background"; + active-foreground = mkLiteral "@blue"; + active-text = mkLiteral p.purple; + alternate-active-background = mkLiteral "@lightbg"; + alternate-active-foreground = mkLiteral "@blue"; + alternate-active-text = mkLiteral p.purple; + selected-active-background = mkLiteral "@blue"; + selected-active-foreground = mkLiteral "@background"; + selected-active-text = mkLiteral p.darkestGray; + urgent-background = mkLiteral "@background"; + urgent-foreground = mkLiteral "@red"; + urgent-text = mkLiteral p.red; + alternate-urgent-background = mkLiteral "@lightbg"; + alternate-urgent-foreground = mkLiteral "@red"; + alternate-urgent-text = mkLiteral p.red; + selected-urgent-background = mkLiteral "@red"; + selected-urgent-foreground = mkLiteral "@background"; + selected-urgent-text = mkLiteral p.darkestGray; + base-text = mkLiteral p.lightGray; + }; + "button".text-color = mkLiteral "@normal-text"; + "button selected" = { + background-color = mkLiteral "@selected-normal-background"; + text-color = mkLiteral "@selected-normal-text"; + }; + "case-indicator".text-color = mkLiteral "@normal-text"; + "element alternate.active" = { + background-color = mkLiteral "@alternate-active-background"; + text-color = mkLiteral "@alternate-active-text"; + }; + "element alternate.normal" = { + background-color = mkLiteral "@alternate-normal-background"; + text-color = mkLiteral "@alternate-normal-text"; + }; + "element alternate.urgent" = { + background-color = mkLiteral "@alternate-urgent-background"; + text-color = mkLiteral "@alternate-urgent-text"; + }; + "element normal.active" = { + background-color = mkLiteral "@active-background"; + text-color = mkLiteral "@active-text"; + }; + "element normal.normal" = { + background-color = mkLiteral "@normal-background"; + text-color = mkLiteral "@normal-text"; + }; + "element normal.urgent" = { + background-color = mkLiteral "@urgent-background"; + text-color = mkLiteral "@urgent-text"; + }; + "element selected.active" = { + background-color = mkLiteral "@selected-active-background"; + text-color = mkLiteral "@selected-active-text"; + }; + "element selected.normal" = { + background-color = mkLiteral "@selected-normal-background"; + text-color = mkLiteral "@selected-normal-text"; + }; + "element selected.urgent" = { + background-color = mkLiteral "@selected-urgent-background"; + text-color = mkLiteral "@selected-urgent-text"; + }; + "element-icon" = { + background-color = mkLiteral "inherit"; + text-color = mkLiteral "inherit"; + }; + "element-text" = { + background-color = mkLiteral "inherit"; + text-color = mkLiteral "inherit"; + }; + "entry".text-color = mkLiteral "@normal-text"; + "inputbar".text-color = mkLiteral "@normal-text"; + "listview".border-color = mkLiteral "@separatorcolor"; + "message".border-color = mkLiteral "@separatorcolor"; + "prompt".text-color = mkLiteral "@normal-text"; + "scrollbar".handle-color = mkLiteral "@normal-foreground"; + "sidebar".border-color = mkLiteral "@separatorcolor"; + "textbox".text-color = mkLiteral "@base-text"; + "textbox-prompt-colon".text-color = mkLiteral "inherit"; + "window".background-color = mkLiteral "@background"; + }; +} diff --git a/home/modules/programs/swaylock.nix b/home/modules/programs/swaylock.nix index 28784b7..ba4d7b2 100644 --- a/home/modules/programs/swaylock.nix +++ b/home/modules/programs/swaylock.nix @@ -1,10 +1,37 @@ -{ ... }: +{ theme, ... }: + +let + n = theme.paletteNoHash; +in { programs.swaylock = { enable = true; settings = { + color = n.darkestGray; ignore-empty-password = true; + inside-caps-lock-color = n.darkestGray; + inside-clear-color = n.darkestGray; + inside-color = n.darkestGray; + inside-ver-color = n.darkestGray; + inside-wrong-color = n.darkestGray; indicator-caps-lock = true; + key-hl-color = n.green; + layout-bg-color = n.darkestGray; + layout-border-color = n.darkerGray; + layout-text-color = n.lightGray; + line-uses-inside = true; + ring-caps-lock-color = n.darkerGray; + ring-clear-color = n.red; + ring-color = n.darkerGray; + ring-ver-color = n.green; + ring-wrong-color = n.red; + scaling = "fill"; + separator-color = "00000000"; + text-caps-lock-color = n.lightGray; + text-clear-color = n.lightGray; + text-color = n.lightGray; + text-ver-color = n.lightGray; + text-wrong-color = n.lightGray; }; }; } diff --git a/home/modules/programs/vscode.nix b/home/modules/programs/vscode.nix index 7f05447..18e8033 100644 --- a/home/modules/programs/vscode.nix +++ b/home/modules/programs/vscode.nix @@ -1,26 +1,19 @@ -{ pkgs, ... }: +{ pkgs, pkgs-unstable, ... }: + { - programs.vscodium = { + programs.vscode = { enable = true; - package = pkgs.vscodium.fhsWithPackages ( + package = pkgs-unstable.vscode.fhsWithPackages ( ps: with ps; [ git ] ); profiles.default = { - userSettings = { - "python.languageServer" = "None"; - "python.pyrefly.displayTypeErrors" = "force-on"; - "explorer.confirmDelete" = false; - "explorer.confirmDragAndDrop" = false; - "explorer.confirmPasteNative" = false; - "git.confirmSync" = false; - }; extensions = [ - pkgs.vscode-extensions.ms-python.python - pkgs.vscode-extensions.ms-python.debugpy - pkgs.vscode-extensions.ms-vscode.cpptools - pkgs.vscode-extensions.jnoortheen.nix-ide - pkgs.vscode-extensions.github.copilot - ] ++ pkgs.vscode-utils.extensionsFromVscodeMarketplace [ + pkgs-unstable.vscode-extensions.ms-python.python + pkgs-unstable.vscode-extensions.ms-python.debugpy + pkgs-unstable.vscode-extensions.ms-vscode.cpptools + pkgs-unstable.vscode-extensions.jnoortheen.nix-ide + pkgs-unstable.vscode-extensions.github.copilot + ] ++ pkgs-unstable.vscode-utils.extensionsFromVscodeMarketplace [ { name = "xonsh"; publisher = "jnoortheen"; @@ -30,14 +23,14 @@ { name = "pyrefly"; publisher = "meta"; - version = "0.57.1"; - hash = "sha256-aF7QcjpID0PE9gMBM6RGfJ3CHOpmyDuHJbbrRRvLiBI="; + version = "1.0.0"; + hash = "sha256-0HMbHW2pFYTXhJH5cJ6JJYSNWXt3t2SxPBEa1J8ThXg="; } { name = "chatgpt"; publisher = "openai"; - version = "26.5313.41514"; - hash = "sha256-kZHfcMzxqCtvkU04kDrlwaO3uHvn4+V6B5sLzlDfceo="; + version = "26.5519.32039"; + hash = "sha256-hJhmLn3AvmY3X3RlbKlpeBX94w8PPm1cuPb3GNvgL/g="; } ]; }; diff --git a/home/modules/programs/waybar.nix b/home/modules/programs/waybar/default.nix similarity index 90% rename from home/modules/programs/waybar.nix rename to home/modules/programs/waybar/default.nix index f36729d..5889e60 100644 --- a/home/modules/programs/waybar.nix +++ b/home/modules/programs/waybar/default.nix @@ -1,15 +1,19 @@ { pkgs, ... }: let - commands = import ../../../lib/commands.nix { inherit pkgs; }; + commands = import ../../../../lib/commands.nix { inherit pkgs; }; inherit (commands) uwsm term; height = 20; in { + imports = [ + ./style.nix + ]; + programs.waybar = { enable = true; systemd = { enable = true; - targets = [ "graphical-session.target" ]; + target = "graphical-session.target"; }; settings.mainBar = { layer = "bottom"; @@ -94,12 +98,5 @@ in on-click = "${uwsm} pavucontrol"; }; }; - style = '' - button { - box-shadow: inset 0 -8px transparent; - border: none; - border-radius: 0; - } - ''; }; } diff --git a/home/modules/programs/waybar/style.nix b/home/modules/programs/waybar/style.nix new file mode 100644 index 0000000..f05fd8a --- /dev/null +++ b/home/modules/programs/waybar/style.nix @@ -0,0 +1,62 @@ +{ lib, theme, ... }: + +let + p = theme.palette; + fonts = theme.fonts; + terminalFontSize = toString fonts.sizes.terminal; + defineColors = lib.concatStringsSep "\n" ( + lib.mapAttrsToList (name: value: "@define-color ${name} ${value};") p + ); +in +{ + programs.waybar.style = '' + ${defineColors} + + * { + font-family: "${fonts.monospace.name}"; + font-size: ${terminalFontSize}pt; + } + + window#waybar, tooltip { + background: alpha(@darkestGray, 1.000000); + color: @lightGray; + } + + tooltip { + border-color: @purple; + } + + tooltip label { + color: @lightGray; + } + + .modules-left #workspaces button, + .modules-center #workspaces button, + .modules-right #workspaces button { + border-bottom: 3px solid transparent; + } + + .modules-left #workspaces button.focused, + .modules-left #workspaces button.active, + .modules-center #workspaces button.focused, + .modules-center #workspaces button.active, + .modules-right #workspaces button.focused, + .modules-right #workspaces button.active { + border-bottom: 3px solid @lightGray; + } + + .modules-left #workspaces button.urgent, + .modules-center #workspaces button.urgent, + .modules-right #workspaces button.urgent { + border-bottom: 3px solid @red; + background-color: @red; + color: @darkestGray; + } + + button { + box-shadow: inset 0 -8px transparent; + border: none; + border-radius: 0; + } + ''; +} diff --git a/home/modules/services/mako.nix b/home/modules/services/mako.nix index f961f7f..d1ceb0a 100644 --- a/home/modules/services/mako.nix +++ b/home/modules/services/mako.nix @@ -1,12 +1,21 @@ -{ ... }: +{ theme, ... }: + +let + p = theme.palette; + fonts = theme.fonts; + fontSize = toString fonts.sizes.applications; +in { services.mako = { enable = true; settings = { actions = true; anchor = "top-center"; + background-color = "${p.darkestGray}FF"; + border-color = p.purple; border-radius = 0; default-timeout = 10000; + font = "${fonts.sansSerif.name} ${fontSize}"; height = 100; width = 600; icons = true; @@ -14,6 +23,18 @@ layer = "overlay"; margin = 10; markup = true; + progress-color = "over ${p.darkGray}"; + text-color = p.lightGray; + "urgency=critical" = { + background-color = "${p.darkestGray}FF"; + border-color = p.red; + text-color = p.lightGray; + }; + "urgency=low" = { + background-color = "${p.darkestGray}FF"; + border-color = p.gray; + text-color = p.lightGray; + }; }; }; } diff --git a/home/modules/services/swayidle.nix b/home/modules/services/swayidle.nix index f3c5fd0..6ec612c 100644 --- a/home/modules/services/swayidle.nix +++ b/home/modules/services/swayidle.nix @@ -25,11 +25,23 @@ in command = "${pkgs.systemd}/bin/systemctl suspend"; } ]; - events = { - before-sleep = "display off; systemctl --user stop libinput-gestures; ${lock}"; - after-resume = "display on; systemctl --user start libinput-gestures"; - lock = (display "off") + "; " + lock; - unlock = display "on"; - }; + events = [ + { + event = "before-sleep"; + command = "display off; systemctl --user stop libinput-gestures; ${lock}"; + } + { + event = "after-resume"; + command = "display on; systemctl --user start libinput-gestures"; + } + { + event = "lock"; + command = (display "off") + "; " + lock; + } + { + event = "unlock"; + command = display "on"; + } + ]; }; } diff --git a/home/modules/theme/cursor.nix b/home/modules/theme/cursor.nix new file mode 100644 index 0000000..0f00723 --- /dev/null +++ b/home/modules/theme/cursor.nix @@ -0,0 +1,11 @@ +{ theme, ... }: + +{ + home.pointerCursor = { + name = theme.cursor.name; + package = theme.cursor.package; + size = theme.cursor.size; + gtk.enable = true; + x11.enable = true; + }; +} diff --git a/home/modules/theme/dconf.nix b/home/modules/theme/dconf.nix new file mode 100644 index 0000000..5fea254 --- /dev/null +++ b/home/modules/theme/dconf.nix @@ -0,0 +1,22 @@ +{ theme, ... }: + +let + fonts = theme.fonts; + fontSize = toString fonts.sizes.applications; + terminalFontSize = toString fonts.sizes.terminal; +in +{ + dconf = { + enable = true; + settings."org/gnome/desktop/interface" = { + color-scheme = "prefer-dark"; + cursor-size = theme.cursor.size; + cursor-theme = theme.cursor.name; + document-font-name = "${fonts.serif.name} 13"; + font-name = "${fonts.sansSerif.name} ${fontSize}"; + gtk-theme = theme.gtk.theme.name; + icon-theme = theme.icons.dark; + monospace-font-name = "${fonts.monospace.name} ${terminalFontSize}"; + }; + }; +} diff --git a/home/modules/theme/default.nix b/home/modules/theme/default.nix new file mode 100644 index 0000000..e800e1b --- /dev/null +++ b/home/modules/theme/default.nix @@ -0,0 +1,8 @@ +{ + imports = [ + ./cursor.nix + ./dconf.nix + ./fonts.nix + ./gtk.nix + ]; +} diff --git a/home/modules/theme/fonts.nix b/home/modules/theme/fonts.nix new file mode 100644 index 0000000..f291f17 --- /dev/null +++ b/home/modules/theme/fonts.nix @@ -0,0 +1,13 @@ +{ theme, ... }: + +{ + fonts.fontconfig = { + enable = true; + defaultFonts = { + emoji = [ theme.fonts.emoji.name ]; + monospace = [ theme.fonts.monospace.name ]; + sansSerif = [ theme.fonts.sansSerif.name ]; + serif = [ theme.fonts.serif.name ]; + }; + }; +} diff --git a/home/modules/theme/gtk.nix b/home/modules/theme/gtk.nix new file mode 100644 index 0000000..537685d --- /dev/null +++ b/home/modules/theme/gtk.nix @@ -0,0 +1,24 @@ +{ theme, ... }: + +{ + gtk = { + enable = true; + font = { + name = theme.fonts.sansSerif.name; + package = theme.fonts.sansSerif.package; + size = theme.fonts.sizes.applications; + }; + theme = theme.gtk.theme; + iconTheme = { + name = theme.icons.dark; + package = theme.icons.package; + }; + cursorTheme = { + name = theme.cursor.name; + package = theme.cursor.package; + size = theme.cursor.size; + }; + gtk3.extraConfig.gtk-application-prefer-dark-theme = 1; + gtk4.extraConfig.gtk-application-prefer-dark-theme = 1; + }; +} diff --git a/home/modules/wm/sway/default.nix b/home/modules/wm/sway/default.nix index 6e0dde8..0b93b8c 100644 --- a/home/modules/wm/sway/default.nix +++ b/home/modules/wm/sway/default.nix @@ -6,10 +6,11 @@ in { imports = [ ./gtk.nix + ./theme.nix ./xdg.nix ./shells/default.nix ../../programs/foot.nix - ../../programs/qutebrowser.nix + ../../programs/qutebrowser ../../services/espanso.nix ../../services/gnome-keyring.nix ]; diff --git a/home/modules/wm/sway/shells/default.nix b/home/modules/wm/sway/shells/default.nix index eff3cf9..699fada 100644 --- a/home/modules/wm/sway/shells/default.nix +++ b/home/modules/wm/sway/shells/default.nix @@ -5,8 +5,8 @@ let in { imports = [ - ../../../programs/rofi.nix - ../../../programs/waybar.nix + ../../../programs/rofi + ../../../programs/waybar ../../../programs/swaylock.nix ../../../services/swayidle.nix ../../../services/mako.nix diff --git a/home/modules/wm/sway/theme.nix b/home/modules/wm/sway/theme.nix new file mode 100644 index 0000000..627c432 --- /dev/null +++ b/home/modules/wm/sway/theme.nix @@ -0,0 +1,45 @@ +{ theme, ... }: + +let + p = theme.palette; +in +{ + wayland.windowManager.sway.config.colors = { + background = p.darkestGray; + focused = { + background = p.darkestGray; + border = p.purple; + childBorder = p.purple; + indicator = p.green; + text = p.lightGray; + }; + focusedInactive = { + background = p.darkestGray; + border = p.gray; + childBorder = p.gray; + indicator = p.green; + text = p.lightGray; + }; + placeholder = { + background = p.darkestGray; + border = p.gray; + childBorder = p.gray; + indicator = p.green; + text = p.lightGray; + }; + unfocused = { + background = p.darkestGray; + border = p.gray; + childBorder = p.gray; + indicator = p.green; + text = p.lightGray; + }; + urgent = { + background = p.darkestGray; + border = p.red; + childBorder = p.red; + indicator = p.green; + text = p.lightGray; + }; + }; +} diff --git a/home/modules/wm/sway/xdg.nix b/home/modules/wm/sway/xdg.nix index af690bb..3554e5d 100644 --- a/home/modules/wm/sway/xdg.nix +++ b/home/modules/wm/sway/xdg.nix @@ -1,4 +1,4 @@ -{ pkgs, ... }: +{ pkgs, pkgs-unstable, ... }: let commands = import ../../../../lib/commands.nix { inherit pkgs; }; inherit (commands) swaymsg lock; @@ -28,7 +28,7 @@ in pkgs.vlc pkgs.loupe pkgs.nautilus - pkgs.chromium + pkgs-unstable.chromium ]; defaultApplications = { "text/*" = [ "${pkgs.gnome-text-editor}/share/applications/org.gnome.TextEditor.desktop" ]; diff --git a/home/profiles/workstation.nix b/home/profiles/workstation.nix index 7af8426..d97443e 100644 --- a/home/profiles/workstation.nix +++ b/home/profiles/workstation.nix @@ -1,4 +1,7 @@ -{ pkgs, lib, repoRoot, ... }: +{ pkgs, pkgs-unstable, lib, repoRoot, ... }: +let + bottles = pkgs.bottles.override { removeWarningPopup = true; }; +in { imports = [ ../modules/programs/chromium.nix @@ -6,26 +9,22 @@ ../modules/programs/vscode.nix ../modules/services/syncthing.nix ]; - - stylix.enableReleaseChecks = false; - xdg.configFile."obsidian/obsidian.json".source = lib.mkForce ../conf/obsidian.json; xdg = { enable = true; userDirs = { enable = true; - setSessionVariables = true; }; mime.enable = true; autostart = { enable = true; entries = [ - "${pkgs.chromium}/share/applications/chromium-browser.desktop" - "${pkgs.discord}/share/applications/discord.desktop" - "${pkgs.signal-desktop}/share/applications/signal.desktop" - "${pkgs.obsidian}/share/applications/obsidian.desktop" - "${pkgs.vscodium}/share/applications/codium.desktop" + "${pkgs-unstable.chromium}/share/applications/chromium-browser.desktop" + "${pkgs-unstable.discord}/share/applications/discord.desktop" + "${pkgs-unstable.signal-desktop}/share/applications/signal.desktop" + "${pkgs-unstable.obsidian}/share/applications/obsidian.desktop" + "${pkgs-unstable.vscode}/share/applications/code.desktop" ]; }; desktopEntries = { diff --git a/nixos/hosts/electra/configuration.nix b/nixos/hosts/electra/configuration.nix index 601f85b..b3c198b 100644 --- a/nixos/hosts/electra/configuration.nix +++ b/nixos/hosts/electra/configuration.nix @@ -9,6 +9,7 @@ loader.efi.canTouchEfiVariables = true; initrd = { enable = true; + systemd.enable = true; luks.devices."luks-654125f4-7b26-408d-b1b5-d31648ec8770".device = "/dev/disk/by-uuid/654125f4-7b26-408d-b1b5-d31648ec8770"; verbose = false; }; diff --git a/nixos/modules/base.nix b/nixos/modules/base.nix index f981cff..fe7864f 100644 --- a/nixos/modules/base.nix +++ b/nixos/modules/base.nix @@ -1,4 +1,8 @@ { config, pkgs, lib, repoLocalPath, ... }: +let + autoUpgradeUser = "alisceon"; + flakeRef = "path:${repoLocalPath}"; +in { boot = { kernelPackages = lib.mkDefault pkgs.linuxPackages_latest; @@ -18,25 +22,36 @@ system.autoUpgrade = { enable = true; persistent = true; - flake = repoLocalPath; + flake = flakeRef; + upgrade = false; flags = [ "--print-build-logs" "--no-write-lock-file" ]; - dates = "daily"; + dates = "03:40"; + fixedRandomDelay = true; + randomizedDelaySec = "2h"; + runGarbageCollection = true; }; + systemd.services.nixos-upgrade.preStart = '' + ${pkgs.util-linux}/bin/runuser -u ${autoUpgradeUser} -- ${lib.getExe config.nix.package} flake update --flake ${lib.escapeShellArg flakeRef} + ''; + nix = { settings = { experimental-features = [ "nix-command" "flakes" ]; auto-optimise-store = true; + min-free = 1024 * 1024 * 1024; + max-free = 5 * 1024 * 1024 * 1024; trusted-users = [ "root" "alisceon" ]; }; gc = { automatic = true; persistent = true; - dates = "daily"; - options = "--delete-older-than 7d"; + dates = "weekly"; + randomizedDelaySec = "2h"; + options = "--delete-older-than 14d"; }; registry = { templates.to = { @@ -47,17 +62,19 @@ type = "github"; owner = "NixOS"; repo = "nixpkgs"; - ref = "nixos-unstable"; + ref = "nixos-25.11"; }; nixpkgs-stable.to = { type = "github"; owner = "NixOS"; repo = "nixpkgs"; - ref = "nixos-25.05"; + ref = "nixos-25.11"; }; }; }; + boot.loader.systemd-boot.configurationLimit = lib.mkDefault 10; + console.keyMap = "sv-latin1"; networking.networkmanager.enable = true; time.timeZone = "Europe/Stockholm"; diff --git a/nixos/modules/profiles/server.nix b/nixos/modules/profiles/server.nix index d504151..1d7df96 100644 --- a/nixos/modules/profiles/server.nix +++ b/nixos/modules/profiles/server.nix @@ -1,6 +1,12 @@ { pkgs, ... }: { - system.autoUpgrade.allowReboot = true; + system.autoUpgrade = { + allowReboot = true; + rebootWindow = { + lower = "03:00"; + upper = "05:00"; + }; + }; services.openssh = { enable = true; diff --git a/nixos/modules/profiles/workstation.nix b/nixos/modules/profiles/workstation.nix index 7b2ba0b..c8ed2d6 100644 --- a/nixos/modules/profiles/workstation.nix +++ b/nixos/modules/profiles/workstation.nix @@ -1,7 +1,11 @@ -{ pkgs, ... }: +{ pkgs, pkgs-unstable, ... }: { boot = { - plymouth.enable = true; + plymouth = { + enable = true; + theme = "nixos-bgrt"; + themePackages = [ pkgs.nixos-bgrt-plymouth ]; + }; kernelParams = [ "quiet" "udev.log_level=3" @@ -37,6 +41,11 @@ programs.dconf.enable = true; + users = { + groups.plugdev = {}; + users.alisceon.extraGroups = [ "plugdev" ]; + }; + networking.firewall.allowedTCPPorts = [ 1312 8000 @@ -46,20 +55,20 @@ environment = { systemPackages = [ - pkgs.discord - pkgs.signal-desktop + pkgs-unstable.discord + pkgs-unstable.signal-desktop pkgs.mumble - (pkgs.chromium.override { enableWideVine = true; }) + (pkgs-unstable.chromium.override { enableWideVine = true; }) pkgs.google-chrome - pkgs.vscodium - pkgs.codex + pkgs-unstable.vscode + pkgs-unstable.codex pkgs.devenv pkgs.direnv pkgs.syncthing pkgs.steam pkgs.krita pkgs.edk2-uefi-shell - pkgs.obsidian + pkgs-unstable.obsidian pkgs.gparted pkgs.vlc pkgs.via diff --git a/nixos/modules/theme/colors.nix b/nixos/modules/theme/colors.nix new file mode 100644 index 0000000..7b15f72 --- /dev/null +++ b/nixos/modules/theme/colors.nix @@ -0,0 +1,88 @@ +{ pkgs }: + +let + dropHash = color: + builtins.substring 1 ((builtins.stringLength color) - 1) color; + + palette = { + darkestGray = "#181818"; + darkerGray = "#252525"; + darkGray = "#3b3b3b"; + gray = "#777777"; + mutedGray = "#777777"; + lightGray = "#b9b9b9"; + lighterGray = "#dedede"; + white = "#dedede"; + red = "#ed4a46"; + orange = "#e67f43"; + yellow = "#dbb32d"; + green = "#70b433"; + magenta = "#eb6eb7"; + purple = "#a580e2"; + blue = "#368aeb"; + cyan = "#3fc5b7"; + }; + + paletteNoHash = builtins.mapAttrs (_: dropHash) palette; +in +{ + inherit palette paletteNoHash; + + colors = { + background = palette.darkestGray; + backgroundAlt = palette.darkerGray; + selection = palette.gray; + foreground = palette.lightGray; + foregroundBright = palette.lighterGray; + error = palette.red; + warning = palette.yellow; + success = palette.green; + accent = palette.purple; + }; + + polarity = "dark"; + + fonts = { + monospace = { + package = pkgs.inconsolata; + name = "Inconsolata"; + }; + sansSerif = { + package = pkgs.noto-fonts; + name = "NotoSans"; + }; + serif = { + package = pkgs.noto-fonts; + name = "NotoSerif"; + }; + emoji = { + package = pkgs.noto-fonts-color-emoji; + name = "noto-fonts-color-emoji"; + }; + sizes = { + applications = 14; + terminal = 14; + desktop = 14; + popups = 14; + }; + }; + + cursor = { + package = pkgs.whitesur-cursors; + name = "WhiteSur-cursors"; + size = 20; + }; + + icons = { + package = pkgs.whitesur-icon-theme; + light = "WhiteSur-light"; + dark = "WhiteSur-dark"; + }; + + gtk = { + theme = { + package = pkgs.adw-gtk3; + name = "adw-gtk3"; + }; + }; +} diff --git a/nixos/modules/theme/default.nix b/nixos/modules/theme/default.nix new file mode 100644 index 0000000..d31653f --- /dev/null +++ b/nixos/modules/theme/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./fonts.nix + ./home-manager.nix + ]; +} diff --git a/nixos/modules/theme/fonts.nix b/nixos/modules/theme/fonts.nix new file mode 100644 index 0000000..6fa5197 --- /dev/null +++ b/nixos/modules/theme/fonts.nix @@ -0,0 +1,13 @@ +{ pkgs, ... }: + +let + theme = import ./colors.nix { inherit pkgs; }; +in +{ + fonts.packages = [ + theme.fonts.monospace.package + theme.fonts.sansSerif.package + theme.fonts.serif.package + theme.fonts.emoji.package + ]; +} diff --git a/nixos/modules/theme/home-manager.nix b/nixos/modules/theme/home-manager.nix new file mode 100644 index 0000000..3c265ec --- /dev/null +++ b/nixos/modules/theme/home-manager.nix @@ -0,0 +1,15 @@ +{ pkgs, ... }: + +let + theme = import ./colors.nix { inherit pkgs; }; +in +{ + home-manager.sharedModules = [ + ({ ... }: { + _module.args.theme = theme; + imports = [ + ../../../home/modules/theme + ]; + }) + ]; +} diff --git a/nixos/modules/theme/stylix.nix b/nixos/modules/theme/stylix.nix deleted file mode 100644 index 3fc5d42..0000000 --- a/nixos/modules/theme/stylix.nix +++ /dev/null @@ -1,65 +0,0 @@ -{ pkgs, ... }: -{ - stylix = { - enable = true; - autoEnable = true; - enableReleaseChecks = false; - base16Scheme = { - base00 = "#181818"; - base01 = "#252525"; - base02 = "#3b3b3b"; - base03 = "#777777"; - base04 = "#777777"; - base05 = "#b9b9b9"; - base06 = "#dedede"; - base07 = "#dedede"; - base08 = "#ed4a46"; - base09 = "#e67f43"; - base0A = "#dbb32d"; - base0B = "#70b433"; - base0C = "#eb6eb7"; - base0D = "#a580e2"; - base0E = "#368aeb"; - base0F = "#3fc5b7"; - }; - - polarity = "dark"; - fonts = { - monospace = { - package = pkgs.inconsolata; - name = "Inconsolata"; - }; - sansSerif = { - package = pkgs.noto-fonts; - name = "NotoSans"; - }; - serif = { - package = pkgs.noto-fonts; - name = "NotoSerif"; - }; - emoji = { - package = pkgs.noto-fonts-color-emoji; - name = "noto-fonts-color-emoji"; - }; - sizes = { - applications = 14; - terminal = 14; - desktop = 14; - popups = 14; - }; - }; - - cursor = { - package = pkgs.whitesur-cursors; - name = "WhiteSur-cursors"; - size = 20; - }; - - icons = { - enable = true; - package = pkgs.whitesur-icon-theme; - light = "WhiteSur-light"; - dark = "WhiteSur-dark"; - }; - }; -} diff --git a/nixos/modules/wm/sway.nix b/nixos/modules/wm/sway.nix index 0269b6b..31c033b 100644 --- a/nixos/modules/wm/sway.nix +++ b/nixos/modules/wm/sway.nix @@ -1,5 +1,7 @@ { pkgs, ... }: { + hardware.uinput.enable = true; + environment.systemPackages = with pkgs; [ pavucontrol libinput @@ -91,5 +93,5 @@ gvfs.enable = true; }; - users.users.alisceon.extraGroups = [ "video" "input" ]; + users.users.alisceon.extraGroups = [ "video" "input" "uinput" ]; } diff --git a/util/pre_commit_nix_eval.sh b/util/pre_commit_nix_eval.sh new file mode 100644 index 0000000..8d4beb5 --- /dev/null +++ b/util/pre_commit_nix_eval.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash +set -euo pipefail + +repo_root="$(git rev-parse --show-toplevel)" +flake_ref="path:${repo_root}" + +# Use a path flake ref so ignored files, especially the local flake.lock, are +# visible to Nix even though the repository itself is a Git worktree. +targets_text="$( + nix eval \ + --raw \ + --no-write-lock-file \ + "${flake_ref}#nixosConfigurations" \ + --apply 'configs: builtins.concatStringsSep "\n" (builtins.attrNames configs)' +)" + +targets=() +while IFS= read -r target; do + if [ -n "${target}" ]; then + targets+=("${target}") + fi +done <<< "${targets_text}" + +if [ "${#targets[@]}" -eq 0 ]; then + echo "No nixosConfigurations found to evaluate." >&2 + exit 1 +fi + +for target in "${targets[@]}"; do + echo "Evaluating nixosConfigurations.${target}.config.system.build.toplevel" + nix eval \ + --raw \ + --no-write-lock-file \ + "${flake_ref}#nixosConfigurations.${target}.config.system.build.toplevel.drvPath" \ + >/dev/null +done