From 8010cea0bc1895e9c507e20a4cea4325a60c9a36 Mon Sep 17 00:00:00 2001 From: Anish Govind Date: Sat, 19 Sep 2026 00:48:19 -0700 Subject: [PATCH] home: centralize theme and make home-manager feature-aware - add home/theme.nix as the single Silicon Volt palette and pass it to home modules via extraSpecialArgs - drive foot, hyprland, hyprlock, mako, fzf, starship, rofi and the herdr picker from that palette; raw config files use @color@ tokens substituted at build time - pass my = config.my into home-manager; add my.pi.enable, my.flakeDir - gate home/pi.nix on my.pi.enable (enabled on hades) - route zshconf/hyprconf aliases and FLAKE_CONFIG through my.flakeDir - rename the hyprland monitor option volt.monitors -> hypr.monitors - fix use_auto_tmux command-substitution bug in zsh/init.zsh - track home/nvim/config/lazy-lock.json for reproducible plugins - document theming and toggles in the README --- README.md | 15 +++++- flake.nix | 6 ++- home/foot.nix | 87 ++++++++++++++++++++++----------- home/hypr/default.nix | 16 +++--- home/hypr/hyprland.nix | 25 +++++----- home/hypr/hyprlock.nix | 20 ++++---- home/nvim/config/lazy-lock.json | 39 +++++++++++++++ home/nvim/default.nix | 6 ++- home/pi.nix | 6 +-- home/rofi.nix | 43 +++++++++++++++- home/rofi/volt.rasi | 18 +++---- home/scripts/herdr-picker.sh | 6 +-- home/starship/starship.toml | 24 ++++----- home/theme.nix | 36 ++++++++++++++ home/zsh.nix | 26 +++++++--- home/zsh/init.zsh | 2 +- hosts/hades/default.nix | 3 +- modules/options.nix | 9 ++++ 18 files changed, 287 insertions(+), 100 deletions(-) create mode 100644 home/nvim/config/lazy-lock.json create mode 100644 home/theme.nix diff --git a/README.md b/README.md index 1281b80..4b619ab 100644 --- a/README.md +++ b/README.md @@ -36,13 +36,14 @@ my = { username = "anish"; # default; change for a different primary user gaming.enable = false; # Steam, Gamemode, MangoHud ai.local.enable = false; # Ollama, ComfyUI, Open WebUI + pi.enable = false; # pi coding agent (home-manager) }; ``` 4. Declare host-specific displays in `hosts//default.nix`: ```nix -home-manager.users.anish.volt.monitors = [ +home-manager.users.anish.hypr.monitors = [ { output = "eDP-1"; # or "desc:" mode = "2880x1800@120Hz"; # or "preferred" @@ -54,7 +55,7 @@ home-manager.users.anish.volt.monitors = [ ]; ``` -The `volt.monitors` default (any output @ preferred) keeps every machine working +The `hypr.monitors` default (any output @ preferred) keeps every machine working out of the box; hosts override only what they need. Hosts without an NVIDIA GPU simply don't import `modules/hardware/nvidia.nix` — all vendor env vars live there, while the vendor-neutral `hardware.graphics` stack lives in `modules/graphical`. @@ -68,7 +69,17 @@ import lists: | Option | Enables | | --- | --- | | `my.username` | Primary user (users, home-manager, getty autologin) | +| `my.flakeDir` | Checkout path used by the `rebuild` helper and `zshconf`/`hyprconf` aliases | | `my.gaming.enable` | Steam, Gamemode, MangoHud | | `my.ai.local.enable` | Ollama (CUDA), ComfyUI, Open WebUI | +| `my.pi.enable` | pi coding agent (home-manager) | Hardware modules remain explicit imports per host (e.g. `modules/hardware/nvidia.nix`). + +## Theming + +The Silicon Volt palette lives in one place, `home/theme.nix`, and is passed to +every home-manager module through `extraSpecialArgs`. Tools that only accept a +raw config file (starship, rofi, the herdr picker) carry `@color@` placeholders +that are substituted from the same palette at build time, so changing an accent +means editing one file. diff --git a/flake.nix b/flake.nix index a6d1992..d699638 100644 --- a/flake.nix +++ b/flake.nix @@ -44,6 +44,7 @@ inputs: let system = "x86_64-linux"; + theme = import ./home/theme.nix; commonModules = [ ./modules/core @@ -56,7 +57,10 @@ home-manager = { useGlobalPkgs = true; useUserPackages = true; - extraSpecialArgs = { inherit inputs; }; + extraSpecialArgs = { + inherit inputs theme; + my = config.my; + }; backupFileExtension = "backup"; users.${config.my.username} = import ./home; }; diff --git a/home/foot.nix b/home/foot.nix index cf6bf8d..974bfe1 100644 --- a/home/foot.nix +++ b/home/foot.nix @@ -1,4 +1,10 @@ -{ pkgs, inputs, ... }: +{ + pkgs, + lib, + inputs, + theme, + ... +}: let herdrPkg = @@ -13,7 +19,35 @@ let else (pkgs.herdr or null); - herdrPicker = pkgs.writeShellScriptBin "herdr-picker" (builtins.readFile ./scripts/herdr-picker.sh); + # Inject the shared palette into the picker script (see home/theme.nix). + herdrPicker = pkgs.writeShellScriptBin "herdr-picker" ( + lib.replaceStrings + [ + "@bg@" + "@glass@" + "@fg@" + "@fgBright@" + "@muted@" + "@volt@" + "@voltLight@" + "@coral@" + "@blue@" + "@surface@" + ] + [ + theme.colors.bgPrimary + theme.colors.glassBg + theme.colors.textSecondary + theme.colors.textPrimary + theme.colors.textMuted + theme.colors.accentVolt + theme.colors.accentVoltLight + theme.colors.accentCoral + theme.colors.accentBlue + theme.colors.surfaceVariant + ] + (builtins.readFile ./scripts/herdr-picker.sh) + ); in { home.packages = (if herdrPkg != null then [ herdrPkg ] else [ ]) ++ [ @@ -47,41 +81,38 @@ in hide-when-typing = "yes"; }; + # Silicon Volt palette, sourced from home/theme.nix. colors-dark = { - # Silicon Volt palette (matches home/hypr theme + mako): - # bgPrimary #131313, bgSecondary #0e0e0e, glassBg #1c1b1b, - # textPrimary #ffffff, textSecondary #e5e2e1, textMuted #adaaaa, - # accents: volt #cffc00, coral #ff7a59, blue #00bfff alpha = 0.92; - background = "131313"; - foreground = "e5e2e1"; + background = theme.bare.bgPrimary; + foreground = theme.bare.textSecondary; # Cursor text and cursor (background) colors - cursor = "0e0e0e cffc00"; + cursor = "${theme.bare.bgSecondary} ${theme.bare.accentVolt}"; - regular0 = "0e0e0e"; # bgSecondary - regular1 = "ff7a59"; # accentCoral - regular2 = "cffc00"; # accentVolt (green) - regular3 = "e3ff66"; # accentVoltLight (yellow) - regular4 = "00bfff"; # accentBlue - regular5 = "c6c6c7"; # Neutral Gray (magenta) - regular6 = "66d9ff"; # Light Cyan - regular7 = "e5e2e1"; # textSecondary + regular0 = theme.bare.bgSecondary; + regular1 = theme.bare.accentCoral; + regular2 = theme.bare.accentVolt; + regular3 = theme.bare.accentVoltLight; + regular4 = theme.bare.accentBlue; + regular5 = theme.bare.neutralGray; + regular6 = theme.bare.lightCyan; + regular7 = theme.bare.textSecondary; # Bright Colors - bright0 = "2a2929"; # surfaceVariant - bright1 = "ff9a82"; # Bright Coral - bright2 = "dfff66"; # Bright Lime - bright3 = "f0ff8c"; # Bright Volt - bright4 = "66d9ff"; # Bright Blue - bright5 = "e0e0e1"; # Bright Gray - bright6 = "99e6ff"; # Bright Cyan - bright7 = "ffffff"; # textPrimary + bright0 = theme.bare.surfaceVariant; + bright1 = theme.bare.brightCoral; + bright2 = theme.bare.brightLime; + bright3 = theme.bare.brightVolt; + bright4 = theme.bare.lightCyan; + bright5 = theme.bare.brightGray; + bright6 = theme.bare.brightCyan; + bright7 = theme.bare.textPrimary; # Selection & URLs - volt lime selection like the site - selection-foreground = "0e0e0e"; - selection-background = "cffc00"; - urls = "00bfff"; + selection-foreground = theme.bare.bgSecondary; + selection-background = theme.bare.accentVolt; + urls = theme.bare.accentBlue; }; }; }; diff --git a/home/hypr/default.nix b/home/hypr/default.nix index 4598b32..3020b0a 100644 --- a/home/hypr/default.nix +++ b/home/hypr/default.nix @@ -1,7 +1,7 @@ { pkgs, - lib, config, + theme, ... }: @@ -58,9 +58,9 @@ in enable = true; settings = { - background-color = "#1c1b1bee"; - text-color = "#e5e2e1"; - border-color = "#cffc00"; + background-color = "${theme.colors.glassBg}ee"; + text-color = theme.colors.textSecondary; + border-color = theme.colors.accentVolt; border-size = 1; border-radius = 0; width = 420; @@ -73,13 +73,13 @@ in max-icon-size = 48; "urgency=critical" = { - border-color = "#ff7a59"; - text-color = "#ffffff"; + border-color = theme.colors.accentCoral; + text-color = theme.colors.textPrimary; default-timeout = 0; }; "urgency=low" = { - border-color = "#2a2929"; - text-color = "#adaaaa"; + border-color = theme.colors.surfaceVariant; + text-color = theme.colors.textMuted; }; }; }; diff --git a/home/hypr/hyprland.nix b/home/hypr/hyprland.nix index e5c9743..febe876 100644 --- a/home/hypr/hyprland.nix +++ b/home/hypr/hyprland.nix @@ -1,6 +1,7 @@ { lib, config, + theme, ... }: @@ -12,11 +13,11 @@ in # Per-host monitor configuration. # # Hosts declare their displays once, in hosts//default.nix, via: - # home-manager.users..volt.monitors = [ { ... } ]; + # home-manager.users..hypr.monitors = [ { ... } ]; # and the setting flows into Hyprland here. The default (empty output + # preferred mode) works on any machine with any display. # ------------------------------------------------------------------------- - options.volt.monitors = lib.mkOption { + options.hypr.monitors = lib.mkOption { description = "Hyprland monitor rules for this host"; type = lib.types.listOf ( lib.types.submodule { @@ -69,7 +70,7 @@ in ; } // (lib.optionalAttrs (m.vrr != null) { inherit (m) vrr; }) - ) config.volt.monitors; + ) config.hypr.monitors; wayland.windowManager.hyprland = { enable = true; @@ -91,7 +92,7 @@ in }; # ----------------------------------------------------------------------- - # 2. Monitors (hl.monitor) - declared per-host via volt.monitors + # 2. Monitors (hl.monitor) - declared per-host via hypr.monitors # (see hosts//default.nix); defaults to any display @ preferred. # ----------------------------------------------------------------------- @@ -143,12 +144,12 @@ in # Silicon Volt: electric lime gradient on focus, glass gray at rest active_border = { colors = [ - "rgba(cffc00ee)" - "rgba(e3ff66ee)" + "rgba(${theme.bare.accentVolt}ee)" + "rgba(${theme.bare.accentVoltLight}ee)" ]; angle = 45; }; - inactive_border = "rgba(ffffff14)"; + inactive_border = "rgba(${theme.bare.textPrimary}14)"; }; layout = "dwindle"; }; @@ -158,20 +159,20 @@ in font_size = 14; font_family = "JetBrainsMono Nerd Font"; col = { - active = "rgba(cffc0022)"; - inactive = "rgba(ffffff08)"; + active = "rgba(${theme.bare.accentVolt}22)"; + inactive = "rgba(${theme.bare.textPrimary}08)"; }; }; col = { border_active = { colors = [ - "rgba(cffc00ee)" - "rgba(e3ff66ee)" + "rgba(${theme.bare.accentVolt}ee)" + "rgba(${theme.bare.accentVoltLight}ee)" ]; angle = 45; }; - border_inactive = "rgba(ffffff14)"; + border_inactive = "rgba(${theme.bare.textPrimary}14)"; }; }; diff --git a/home/hypr/hyprlock.nix b/home/hypr/hyprlock.nix index adadb38..b41ae3f 100644 --- a/home/hypr/hyprlock.nix +++ b/home/hypr/hyprlock.nix @@ -1,4 +1,4 @@ -{ pkgs, ... }: +{ theme, ... }: { programs.hyprlock = { @@ -32,7 +32,7 @@ { monitor = ""; text = "$TIME"; - color = "rgba(ffffffdd)"; + color = "rgba(${theme.bare.textPrimary}dd)"; font_size = 90; font_family = "JetBrainsMono Nerd Font"; position = "0, 220"; @@ -43,7 +43,7 @@ { monitor = ""; text = "cmd[update:1000] echo \" $(date +'%A, %B %d') \""; - color = "rgba(adaaaaff)"; + color = "rgba(${theme.bare.textMuted}ff)"; font_size = 20; font_family = "JetBrainsMono Nerd Font"; position = "0, 120"; @@ -54,7 +54,7 @@ { monitor = ""; text = "NIXOS // SILICON VOLT"; - color = "rgba(cffc00ee)"; + color = "rgba(${theme.bare.accentVolt}ee)"; font_size = 14; font_family = "JetBrainsMono Nerd Font"; position = "0, 60"; @@ -65,7 +65,7 @@ { monitor = ""; text = "cmd[update:3600000] echo \" $USER @ $(hostname) \""; - color = "rgba(adaaaa99)"; + color = "rgba(${theme.bare.textMuted}99)"; font_size = 13; font_family = "JetBrainsMono Nerd Font"; position = "0, -160"; @@ -84,11 +84,11 @@ dots_spacing = 0.2; dots_center = true; # Volt lime outline, dark glass interior - outer_color = "rgba(cffc00ee)"; - inner_color = "rgba(1c1b1b, 0.9)"; - check_color = "rgba(e3ff66ee)"; - fail_color = "rgba(ff7a59ee)"; - font_color = "rgba(e5e2e1ff)"; + outer_color = "rgba(${theme.bare.accentVolt}ee)"; + inner_color = "rgba(${theme.bare.glassBg}, 0.9)"; + check_color = "rgba(${theme.bare.accentVoltLight}ee)"; + fail_color = "rgba(${theme.bare.accentCoral}ee)"; + font_color = "rgba(${theme.bare.textSecondary}ff)"; fail_text = "$FAIL (attempts: $ATTEMPTS)"; fade_on_empty = false; placeholder_text = " Enter Password..."; diff --git a/home/nvim/config/lazy-lock.json b/home/nvim/config/lazy-lock.json new file mode 100644 index 0000000..bf179a7 --- /dev/null +++ b/home/nvim/config/lazy-lock.json @@ -0,0 +1,39 @@ +{ + "LazyVim": { "branch": "main", "commit": "c10948c50b18fae7f256433afdef09e432410480" }, + "SchemaStore.nvim": { "branch": "main", "commit": "7e3f6dd6ef6da93f74974521c81d8d5bff0443c5" }, + "blink.cmp": { "branch": "main", "commit": "78336bc89ee5365633bcf754d93df01678b5c08f" }, + "bufferline.nvim": { "branch": "main", "commit": "655133c3b4c3e5e05ec549b9f8cc2894ac6f51b3" }, + "catppuccin": { "branch": "main", "commit": "edefef779ab08ce1a4a404713e3012b0d202bd35" }, + "conform.nvim": { "branch": "master", "commit": "016802de402556da54c36bd7359b441266b01cdd" }, + "crates.nvim": { "branch": "main", "commit": "694357861ec9ebf12475ddcdd04ea45a0923c32d" }, + "flash.nvim": { "branch": "main", "commit": "b6346946d10d07998efee029fb0f7a593806d0cd" }, + "friendly-snippets": { "branch": "main", "commit": "6cd7280adead7f586db6fccbd15d2cac7e2188b9" }, + "gitsigns.nvim": { "branch": "main", "commit": "5be654f2232c10ddcad19c1607a67b6b4b78fc29" }, + "grug-far.nvim": { "branch": "main", "commit": "11595bf747edc270bce2069d1020502ad4ae56cf" }, + "lazy.nvim": { "branch": "main", "commit": "85c7ff3711b730b4030d03144f6db6375044ae82" }, + "lazydev.nvim": { "branch": "main", "commit": "ff2cbcba459b637ec3fd165a2be59b7bbaeedf0d" }, + "lualine.nvim": { "branch": "master", "commit": "221ce6b2d999187044529f49da6554a92f740a96" }, + "mason-lspconfig.nvim": { "branch": "main", "commit": "67029ccdac1ef8941e13b826417bc0ffac24cc86" }, + "mason.nvim": { "branch": "main", "commit": "2a6940af80375532e5e9e7c1f2fc6319a1b7a69d" }, + "mini.ai": { "branch": "main", "commit": "25248c6aa002391936a6200f12d1466015987133" }, + "mini.icons": { "branch": "main", "commit": "98faae31e9be1cc054ae63485e58ceb185efcad0" }, + "mini.pairs": { "branch": "main", "commit": "b1c5a726921b7a8c9321e9a7a208aa0571de5810" }, + "noice.nvim": { "branch": "main", "commit": "7bfd942445fb63089b59f97ca487d605e715f155" }, + "nui.nvim": { "branch": "main", "commit": "a25dd472316d806eb38a5dd667c2e40da5570c75" }, + "nvim-lint": { "branch": "master", "commit": "9b99aad869102ac01775187abd8d49017b148612" }, + "nvim-lspconfig": { "branch": "master", "commit": "51dbf5359da86721662c87ca10eb73add973737b" }, + "nvim-treesitter": { "branch": "main", "commit": "074aa4422bf029908338e855d0c0f71470a971bb" }, + "nvim-treesitter-textobjects": { "branch": "main", "commit": "898ee307df58f854d11cd7edd06472574d48014e" }, + "nvim-ts-autotag": { "branch": "main", "commit": "88c1453db4ba7dd24131086fe51fdf74e587d275" }, + "persistence.nvim": { "branch": "main", "commit": "b20b2a7887bd39c1a356980b45e03250f3dce49c" }, + "plenary.nvim": { "branch": "master", "commit": "74b06c6c75e4eeb3108ec01852001636d85a932b" }, + "rustaceanvim": { "branch": "main", "commit": "f659765f93e207b8c44ee4a90eb88bd6e93bf05f" }, + "snacks.nvim": { "branch": "main", "commit": "882c996cf28183f4d63640de0b4c02ec886d01f2" }, + "telescope.nvim": { "branch": "master", "commit": "427b576c16792edad01a92b89721d923c19ad60f" }, + "todo-comments.nvim": { "branch": "main", "commit": "31e3c38ce9b29781e4422fc0322eb0a21f4e8668" }, + "tokyonight.nvim": { "branch": "main", "commit": "cdc07ac78467a233fd62c493de29a17e0cf2b2b6" }, + "trouble.nvim": { "branch": "main", "commit": "bd67efe408d4816e25e8491cc5ad4088e708a69a" }, + "ts-comments.nvim": { "branch": "main", "commit": "a59d6092213447450191122c9346f309161504cb" }, + "venv-selector.nvim": { "branch": "main", "commit": "cc4bb3975de8835291f9bb45889e96c6b2795fc4" }, + "which-key.nvim": { "branch": "main", "commit": "3aab2147e74890957785941f0c1ad87d0a44c15a" } +} diff --git a/home/nvim/default.nix b/home/nvim/default.nix index 595a0f9..5f1ce84 100644 --- a/home/nvim/default.nix +++ b/home/nvim/default.nix @@ -72,7 +72,11 @@ in ]; }; - # Symlink LazyVim configuration to ~/.config/nvim recursively + # Symlink LazyVim configuration to ~/.config/nvim recursively. This includes + # lazy-lock.json, which pins every plugin to a specific commit for + # reproducible builds. To update plugins, run `:Lazy update` in a writable + # copy and commit the resulting lazy-lock.json back to this repo, since the + # linked file is read-only. xdg.configFile."nvim" = { source = ./config; recursive = true; diff --git a/home/pi.nix b/home/pi.nix index 80e5fbd..a0bcd21 100644 --- a/home/pi.nix +++ b/home/pi.nix @@ -1,7 +1,5 @@ -{ inputs, config, ... }: +{ inputs, my, ... }: { imports = [ inputs.pi.homeModules.default ]; - programs.pi.coding-agent = { - enable = true; - }; + programs.pi.coding-agent.enable = my.pi.enable; } diff --git a/home/rofi.nix b/home/rofi.nix index 3cf5fc3..aa8a409 100644 --- a/home/rofi.nix +++ b/home/rofi.nix @@ -1,16 +1,55 @@ -{ pkgs, ... }: +{ + pkgs, + lib, + theme, + ... +}: let # Rofi script-mode indexer: exposes every executable user script # (shell, python, whatever) so the launcher finds "everything". rofiScripts = pkgs.writeShellScriptBin "rofi-scripts" (builtins.readFile ./rofi/rofi-scripts.sh); + + # Inject the shared palette into the rasi theme (see home/theme.nix). + # `/. +` turns the generated derivation into a path, which the rofi module + # treats as a theme file to link into its data directory. + rofiThemeText = pkgs.writeText "volt.rasi" ( + lib.replaceStrings + [ + "@bg0@" + "@bg1@" + "@fg0@" + "@fg1@" + "@fg2@" + "@volt@" + "@voltDim@" + "@coral@" + "@border0@" + ] + [ + "${theme.colors.bgSecondary}f2" + "${theme.colors.glassBg}f2" + theme.colors.textSecondary + theme.colors.textPrimary + theme.colors.textMuted + theme.colors.accentVolt + "${theme.colors.accentVolt}1a" + theme.colors.accentCoral + "${theme.colors.textPrimary}14" + ] + (builtins.readFile ./rofi/volt.rasi) + ); in { + # Install the generated theme under the rofi theme search path and select + # it by name (passing a derivation directly is treated as a rasi attrset). + xdg.dataFile."rofi/themes/volt.rasi".source = rofiThemeText; + programs.rofi = { enable = true; terminal = "${pkgs.foot}/bin/foot"; cycle = true; - theme = ./rofi/volt.rasi; + theme = "volt"; extraConfig = { # Combi mode searches .desktop apps (drun), binaries (run), diff --git a/home/rofi/volt.rasi b/home/rofi/volt.rasi index a29acfa..d6da5e9 100644 --- a/home/rofi/volt.rasi +++ b/home/rofi/volt.rasi @@ -2,15 +2,15 @@ // Flat brutalist-glass: dark glass surfaces, volt-lime selection, 0 radius. * { - bg0: rgba( 14, 14, 14, 95 % ); - bg1: rgba( 28, 27, 27, 95 % ); - fg0: #e5e2e1; - fg1: #ffffff; - fg2: #adaaaa; - volt: #CFFC00; - volt-dim: rgba( 207, 252, 0, 10 % ); - coral: #FF7A59; - border0: rgba( 255, 255, 255, 8 % ); + bg0: @bg0@; + bg1: @bg1@; + fg0: @fg0@; + fg1: @fg1@; + fg2: @fg2@; + volt: @volt@; + volt-dim: @voltDim@; + coral: @coral@; + border0: @border0@; background-color: transparent; text-color: @fg0; diff --git a/home/scripts/herdr-picker.sh b/home/scripts/herdr-picker.sh index 5e3ad40..535d0ca 100755 --- a/home/scripts/herdr-picker.sh +++ b/home/scripts/herdr-picker.sh @@ -48,9 +48,9 @@ if command -v fzf &>/dev/null; then --layout=reverse \ --border=rounded \ --prompt=" Herdr Session > " \ - --color=fg:#e5e2e1,bg:#131313,hl:#CFFC00,fg+:#ffffff,bg+:#1c1b1b,hl+:#e3ff66 \ - --color=info:#ADAAAA,prompt:#CFFC00,pointer:#FF7A59,marker:#CFFC00,spinner:#00BFFF \ - --color=border:#2a2929,gutter:#131313 \ + --color=fg:@fg@,bg:@bg@,hl:@volt@,fg+:@fgBright@,bg+:@glass@,hl+:@voltLight@ \ + --color=info:@muted@,prompt:@volt@,pointer:@coral@,marker:@volt@,spinner:@blue@ \ + --color=border:@surface@,gutter:@bg@ \ --header="Select Herdr session to attach / create | Esc for plain shell" \ --header-first) else diff --git a/home/starship/starship.toml b/home/starship/starship.toml index 16beae3..acd2500 100644 --- a/home/starship/starship.toml +++ b/home/starship/starship.toml @@ -6,22 +6,22 @@ format = "$os$directory$git_branch$git_status$nix_shell$rust$c$python$cmd_durati [os] disabled = false -style = "bold #e5e2e1" +style = "bold @text@" symbols = { NixOS = "󱄅 " } [directory] truncation_length = 3 truncate_to_repo = true -style = "bold #CFFC00" +style = "bold @volt@" format = "[ $path]($style) " [git_branch] symbol = " " -style = "bold #00BFFF" +style = "bold @blue@" format = "on [$symbol$branch]($style) " [git_status] -style = "bold #FF7A59" +style = "bold @coral@" format = "([$all_status$ahead_behind]($style) )" conflicted = " " ahead = " " @@ -30,35 +30,35 @@ diverged = " " untracked = " " stashed = " " modified = " " -staged = " [](bold #CFFC00)" +staged = " [](bold @volt@)" renamed = " " deleted = " " [nix_shell] symbol = " " -style = "bold #e3ff66" +style = "bold @voltLight@" format = "via [$symbol$state]($style) " [rust] symbol = " " -style = "bold #e3ff66" +style = "bold @voltLight@" format = "[$symbol($version )]($style)" [c] symbol = " " -style = "bold #00BFFF" +style = "bold @blue@" format = "[$symbol($version )]($style)" [python] symbol = " " -style = "bold #CFFC00" +style = "bold @volt@" format = "[$symbol($version )]($style)" [cmd_duration] min_time = 2000 -style = "bold #FF7A59" +style = "bold @coral@" format = "[ $duration]($style) " [character] -success_symbol = "[❯ ](bold #CFFC00) " -error_symbol = "[❯ ](bold #FF7A59) " +success_symbol = "[❯ ](bold @volt@) " +error_symbol = "[❯ ](bold @coral@) " diff --git a/home/theme.nix b/home/theme.nix new file mode 100644 index 0000000..214a845 --- /dev/null +++ b/home/theme.nix @@ -0,0 +1,36 @@ +# Silicon Volt palette. Single source of truth for the shared home-manager +# configuration. This is a plain attrset expression, not a home-manager module: +# it is passed to every home module through `extraSpecialArgs`. +# +# theme.colors. -> "#rrggbb" (most tools) +# theme.bare. -> "rrggbb" (foot and other bare-hex tools) +let + colors = { + bgPrimary = "#131313"; + bgSecondary = "#0e0e0e"; + glassBg = "#1c1b1b"; + surfaceVariant = "#2a2929"; + textPrimary = "#ffffff"; + textSecondary = "#e5e2e1"; + textMuted = "#adaaaa"; + accentVolt = "#cffc00"; + accentVoltLight = "#e3ff66"; + accentCoral = "#ff7a59"; + accentBlue = "#00bfff"; + + # Foot-specific ANSI shades + neutralGray = "#c6c6c7"; + lightCyan = "#66d9ff"; + brightCoral = "#ff9a82"; + brightLime = "#dfff66"; + brightVolt = "#f0ff8c"; + brightGray = "#e0e0e1"; + brightCyan = "#99e6ff"; + }; + + stripHash = c: builtins.substring 1 (builtins.stringLength c) c; +in +{ + inherit colors; + bare = builtins.mapAttrs (_: stripHash) colors; +} diff --git a/home/zsh.nix b/home/zsh.nix index 0462b4b..a85021b 100644 --- a/home/zsh.nix +++ b/home/zsh.nix @@ -2,6 +2,8 @@ config, pkgs, lib, + theme, + my, ... }: @@ -23,9 +25,9 @@ enableZshIntegration = true; defaultOptions = [ "--color=dark" - "--color=fg:#e5e2e1,bg:-1,hl:#CFFC00,fg+:#ffffff,bg+:#1c1b1b,hl+:#e3ff66" - "--color=info:#ADAAAA,prompt:#CFFC00,pointer:#FF7A59,marker:#CFFC00,spinner:#00BFFF,header:#00BFFF" - "--color=border:#2a2929,bg+:-1,gutter:-1" + "--color=fg:${theme.colors.textSecondary},bg:-1,hl:${theme.colors.accentVolt},fg+:${theme.colors.textPrimary},bg+:${theme.colors.glassBg},hl+:${theme.colors.accentVoltLight}" + "--color=info:${theme.colors.textMuted},prompt:${theme.colors.accentVolt},pointer:${theme.colors.accentCoral},marker:${theme.colors.accentVolt},spinner:${theme.colors.accentBlue},header:${theme.colors.accentBlue}" + "--color=border:${theme.colors.surfaceVariant},bg+:-1,gutter:-1" ]; }; @@ -41,7 +43,18 @@ programs.starship = { enable = true; enableZshIntegration = true; - settings = builtins.fromTOML (builtins.readFile ./starship/starship.toml); + settings = builtins.fromTOML ( + lib.replaceStrings + [ "@text@" "@volt@" "@blue@" "@coral@" "@voltLight@" ] + [ + theme.colors.textSecondary + theme.colors.accentVolt + theme.colors.accentBlue + theme.colors.accentCoral + theme.colors.accentVoltLight + ] + (builtins.readFile ./starship/starship.toml) + ); }; programs.zsh = { @@ -95,6 +108,7 @@ ZSH_TMUX_FIXTERM = "true"; GPG_TTY = "$(tty)"; PNPM_HOME = "$HOME/.local/share/pnpm"; + FLAKE_CONFIG = my.flakeDir; }; shellAliases = { @@ -104,8 +118,8 @@ l = "ls -al"; clear = "clear -x"; rm = "rm -I"; - zshconf = "$EDITOR $HOME/NixOS-Configs/home/zsh.nix"; - hyprconf = "$EDITOR $HOME/NixOS-Configs/home/hypr/hyprland.nix"; + zshconf = "$EDITOR ${my.flakeDir}/home/zsh.nix"; + hyprconf = "$EDITOR ${my.flakeDir}/home/hypr/hyprland.nix"; setup = "source ./setup_env.sh"; gpuenv = "__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia"; digital = "$HOME/Tools/Digital/Digital.sh"; diff --git a/home/zsh/init.zsh b/home/zsh/init.zsh index 42270b4..83e4040 100644 --- a/home/zsh/init.zsh +++ b/home/zsh/init.zsh @@ -18,7 +18,7 @@ fi # Auto-tmux configuration use_auto_tmux () { - ! ([ -z "$DISPLAY" ] && [ -z "$WAYLAND_DISPLAY" ] || $(pgrep -x "i3" > /dev/null || pgrep -x "sway" > /dev/null || pgrep -x "Hyprland" > /dev/null)) + ! ([ -z "$DISPLAY" ] && [ -z "$WAYLAND_DISPLAY" ] || pgrep -x i3 >/dev/null || pgrep -x sway >/dev/null || pgrep -x Hyprland >/dev/null) } if use_auto_tmux; then diff --git a/hosts/hades/default.nix b/hosts/hades/default.nix index 92266f9..09c55c9 100644 --- a/hosts/hades/default.nix +++ b/hosts/hades/default.nix @@ -20,12 +20,13 @@ my = { gaming.enable = true; ai.local.enable = true; + pi.enable = true; }; # --------------------------------------------------------------------------- # Host display configuration (absorbed by home/hypr/hyprland.nix) # --------------------------------------------------------------------------- - home-manager.users.${config.my.username}.volt.monitors = [ + home-manager.users.${config.my.username}.hypr.monitors = [ { # Samsung Odyssey Ark - matched by description so it survives port changes output = "desc:Samsung Electric Company Odyssey Ark H1AK500000"; diff --git a/modules/options.nix b/modules/options.nix index 1a1e6c9..8c3b699 100644 --- a/modules/options.nix +++ b/modules/options.nix @@ -1,4 +1,5 @@ { + config, lib, ... }: @@ -13,8 +14,16 @@ description = "Primary interactive user account."; }; + flakeDir = lib.mkOption { + type = lib.types.str; + default = "/home/${config.my.username}/NixOS-Configs"; + description = "Checkout location of this flake on the machine."; + }; + gaming.enable = lib.mkEnableOption "Steam, Gamemode and gaming tooling"; ai.local.enable = lib.mkEnableOption "local AI services (Ollama, ComfyUI, Open WebUI)"; + + pi.enable = lib.mkEnableOption "the pi coding agent (home-manager)"; }; }