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
This commit is contained in:
15
README.md
15
README.md
@@ -36,13 +36,14 @@ my = {
|
|||||||
username = "anish"; # default; change for a different primary user
|
username = "anish"; # default; change for a different primary user
|
||||||
gaming.enable = false; # Steam, Gamemode, MangoHud
|
gaming.enable = false; # Steam, Gamemode, MangoHud
|
||||||
ai.local.enable = false; # Ollama, ComfyUI, Open WebUI
|
ai.local.enable = false; # Ollama, ComfyUI, Open WebUI
|
||||||
|
pi.enable = false; # pi coding agent (home-manager)
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Declare host-specific displays in `hosts/<name>/default.nix`:
|
4. Declare host-specific displays in `hosts/<name>/default.nix`:
|
||||||
|
|
||||||
```nix
|
```nix
|
||||||
home-manager.users.anish.volt.monitors = [
|
home-manager.users.anish.hypr.monitors = [
|
||||||
{
|
{
|
||||||
output = "eDP-1"; # or "desc:<panel description>"
|
output = "eDP-1"; # or "desc:<panel description>"
|
||||||
mode = "2880x1800@120Hz"; # or "preferred"
|
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
|
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,
|
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`.
|
while the vendor-neutral `hardware.graphics` stack lives in `modules/graphical`.
|
||||||
@@ -68,7 +69,17 @@ import lists:
|
|||||||
| Option | Enables |
|
| Option | Enables |
|
||||||
| --- | --- |
|
| --- | --- |
|
||||||
| `my.username` | Primary user (users, home-manager, getty autologin) |
|
| `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.gaming.enable` | Steam, Gamemode, MangoHud |
|
||||||
| `my.ai.local.enable` | Ollama (CUDA), ComfyUI, Open WebUI |
|
| `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`).
|
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.
|
||||||
|
|||||||
@@ -44,6 +44,7 @@
|
|||||||
inputs:
|
inputs:
|
||||||
let
|
let
|
||||||
system = "x86_64-linux";
|
system = "x86_64-linux";
|
||||||
|
theme = import ./home/theme.nix;
|
||||||
|
|
||||||
commonModules = [
|
commonModules = [
|
||||||
./modules/core
|
./modules/core
|
||||||
@@ -56,7 +57,10 @@
|
|||||||
home-manager = {
|
home-manager = {
|
||||||
useGlobalPkgs = true;
|
useGlobalPkgs = true;
|
||||||
useUserPackages = true;
|
useUserPackages = true;
|
||||||
extraSpecialArgs = { inherit inputs; };
|
extraSpecialArgs = {
|
||||||
|
inherit inputs theme;
|
||||||
|
my = config.my;
|
||||||
|
};
|
||||||
backupFileExtension = "backup";
|
backupFileExtension = "backup";
|
||||||
users.${config.my.username} = import ./home;
|
users.${config.my.username} = import ./home;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,4 +1,10 @@
|
|||||||
{ pkgs, inputs, ... }:
|
{
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
inputs,
|
||||||
|
theme,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
let
|
let
|
||||||
herdrPkg =
|
herdrPkg =
|
||||||
@@ -13,7 +19,35 @@ let
|
|||||||
else
|
else
|
||||||
(pkgs.herdr or null);
|
(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
|
in
|
||||||
{
|
{
|
||||||
home.packages = (if herdrPkg != null then [ herdrPkg ] else [ ]) ++ [
|
home.packages = (if herdrPkg != null then [ herdrPkg ] else [ ]) ++ [
|
||||||
@@ -47,41 +81,38 @@ in
|
|||||||
hide-when-typing = "yes";
|
hide-when-typing = "yes";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# Silicon Volt palette, sourced from home/theme.nix.
|
||||||
colors-dark = {
|
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;
|
alpha = 0.92;
|
||||||
background = "131313";
|
background = theme.bare.bgPrimary;
|
||||||
foreground = "e5e2e1";
|
foreground = theme.bare.textSecondary;
|
||||||
|
|
||||||
# Cursor text and cursor (background) colors
|
# Cursor text and cursor (background) colors
|
||||||
cursor = "0e0e0e cffc00";
|
cursor = "${theme.bare.bgSecondary} ${theme.bare.accentVolt}";
|
||||||
|
|
||||||
regular0 = "0e0e0e"; # bgSecondary
|
regular0 = theme.bare.bgSecondary;
|
||||||
regular1 = "ff7a59"; # accentCoral
|
regular1 = theme.bare.accentCoral;
|
||||||
regular2 = "cffc00"; # accentVolt (green)
|
regular2 = theme.bare.accentVolt;
|
||||||
regular3 = "e3ff66"; # accentVoltLight (yellow)
|
regular3 = theme.bare.accentVoltLight;
|
||||||
regular4 = "00bfff"; # accentBlue
|
regular4 = theme.bare.accentBlue;
|
||||||
regular5 = "c6c6c7"; # Neutral Gray (magenta)
|
regular5 = theme.bare.neutralGray;
|
||||||
regular6 = "66d9ff"; # Light Cyan
|
regular6 = theme.bare.lightCyan;
|
||||||
regular7 = "e5e2e1"; # textSecondary
|
regular7 = theme.bare.textSecondary;
|
||||||
|
|
||||||
# Bright Colors
|
# Bright Colors
|
||||||
bright0 = "2a2929"; # surfaceVariant
|
bright0 = theme.bare.surfaceVariant;
|
||||||
bright1 = "ff9a82"; # Bright Coral
|
bright1 = theme.bare.brightCoral;
|
||||||
bright2 = "dfff66"; # Bright Lime
|
bright2 = theme.bare.brightLime;
|
||||||
bright3 = "f0ff8c"; # Bright Volt
|
bright3 = theme.bare.brightVolt;
|
||||||
bright4 = "66d9ff"; # Bright Blue
|
bright4 = theme.bare.lightCyan;
|
||||||
bright5 = "e0e0e1"; # Bright Gray
|
bright5 = theme.bare.brightGray;
|
||||||
bright6 = "99e6ff"; # Bright Cyan
|
bright6 = theme.bare.brightCyan;
|
||||||
bright7 = "ffffff"; # textPrimary
|
bright7 = theme.bare.textPrimary;
|
||||||
|
|
||||||
# Selection & URLs - volt lime selection like the site
|
# Selection & URLs - volt lime selection like the site
|
||||||
selection-foreground = "0e0e0e";
|
selection-foreground = theme.bare.bgSecondary;
|
||||||
selection-background = "cffc00";
|
selection-background = theme.bare.accentVolt;
|
||||||
urls = "00bfff";
|
urls = theme.bare.accentBlue;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
pkgs,
|
pkgs,
|
||||||
lib,
|
|
||||||
config,
|
config,
|
||||||
|
theme,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
|
|
||||||
@@ -58,9 +58,9 @@ in
|
|||||||
enable = true;
|
enable = true;
|
||||||
|
|
||||||
settings = {
|
settings = {
|
||||||
background-color = "#1c1b1bee";
|
background-color = "${theme.colors.glassBg}ee";
|
||||||
text-color = "#e5e2e1";
|
text-color = theme.colors.textSecondary;
|
||||||
border-color = "#cffc00";
|
border-color = theme.colors.accentVolt;
|
||||||
border-size = 1;
|
border-size = 1;
|
||||||
border-radius = 0;
|
border-radius = 0;
|
||||||
width = 420;
|
width = 420;
|
||||||
@@ -73,13 +73,13 @@ in
|
|||||||
max-icon-size = 48;
|
max-icon-size = 48;
|
||||||
|
|
||||||
"urgency=critical" = {
|
"urgency=critical" = {
|
||||||
border-color = "#ff7a59";
|
border-color = theme.colors.accentCoral;
|
||||||
text-color = "#ffffff";
|
text-color = theme.colors.textPrimary;
|
||||||
default-timeout = 0;
|
default-timeout = 0;
|
||||||
};
|
};
|
||||||
"urgency=low" = {
|
"urgency=low" = {
|
||||||
border-color = "#2a2929";
|
border-color = theme.colors.surfaceVariant;
|
||||||
text-color = "#adaaaa";
|
text-color = theme.colors.textMuted;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
lib,
|
lib,
|
||||||
config,
|
config,
|
||||||
|
theme,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
|
|
||||||
@@ -12,11 +13,11 @@ in
|
|||||||
# Per-host monitor configuration.
|
# Per-host monitor configuration.
|
||||||
#
|
#
|
||||||
# Hosts declare their displays once, in hosts/<host>/default.nix, via:
|
# Hosts declare their displays once, in hosts/<host>/default.nix, via:
|
||||||
# home-manager.users.<my.username>.volt.monitors = [ { ... } ];
|
# home-manager.users.<my.username>.hypr.monitors = [ { ... } ];
|
||||||
# and the setting flows into Hyprland here. The default (empty output +
|
# and the setting flows into Hyprland here. The default (empty output +
|
||||||
# preferred mode) works on any machine with any display.
|
# 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";
|
description = "Hyprland monitor rules for this host";
|
||||||
type = lib.types.listOf (
|
type = lib.types.listOf (
|
||||||
lib.types.submodule {
|
lib.types.submodule {
|
||||||
@@ -69,7 +70,7 @@ in
|
|||||||
;
|
;
|
||||||
}
|
}
|
||||||
// (lib.optionalAttrs (m.vrr != null) { inherit (m) vrr; })
|
// (lib.optionalAttrs (m.vrr != null) { inherit (m) vrr; })
|
||||||
) config.volt.monitors;
|
) config.hypr.monitors;
|
||||||
|
|
||||||
wayland.windowManager.hyprland = {
|
wayland.windowManager.hyprland = {
|
||||||
enable = true;
|
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/<host>/default.nix); defaults to any display @ preferred.
|
# (see hosts/<host>/default.nix); defaults to any display @ preferred.
|
||||||
# -----------------------------------------------------------------------
|
# -----------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -143,12 +144,12 @@ in
|
|||||||
# Silicon Volt: electric lime gradient on focus, glass gray at rest
|
# Silicon Volt: electric lime gradient on focus, glass gray at rest
|
||||||
active_border = {
|
active_border = {
|
||||||
colors = [
|
colors = [
|
||||||
"rgba(cffc00ee)"
|
"rgba(${theme.bare.accentVolt}ee)"
|
||||||
"rgba(e3ff66ee)"
|
"rgba(${theme.bare.accentVoltLight}ee)"
|
||||||
];
|
];
|
||||||
angle = 45;
|
angle = 45;
|
||||||
};
|
};
|
||||||
inactive_border = "rgba(ffffff14)";
|
inactive_border = "rgba(${theme.bare.textPrimary}14)";
|
||||||
};
|
};
|
||||||
layout = "dwindle";
|
layout = "dwindle";
|
||||||
};
|
};
|
||||||
@@ -158,20 +159,20 @@ in
|
|||||||
font_size = 14;
|
font_size = 14;
|
||||||
font_family = "JetBrainsMono Nerd Font";
|
font_family = "JetBrainsMono Nerd Font";
|
||||||
col = {
|
col = {
|
||||||
active = "rgba(cffc0022)";
|
active = "rgba(${theme.bare.accentVolt}22)";
|
||||||
inactive = "rgba(ffffff08)";
|
inactive = "rgba(${theme.bare.textPrimary}08)";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
col = {
|
col = {
|
||||||
border_active = {
|
border_active = {
|
||||||
colors = [
|
colors = [
|
||||||
"rgba(cffc00ee)"
|
"rgba(${theme.bare.accentVolt}ee)"
|
||||||
"rgba(e3ff66ee)"
|
"rgba(${theme.bare.accentVoltLight}ee)"
|
||||||
];
|
];
|
||||||
angle = 45;
|
angle = 45;
|
||||||
};
|
};
|
||||||
border_inactive = "rgba(ffffff14)";
|
border_inactive = "rgba(${theme.bare.textPrimary}14)";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
{ pkgs, ... }:
|
{ theme, ... }:
|
||||||
|
|
||||||
{
|
{
|
||||||
programs.hyprlock = {
|
programs.hyprlock = {
|
||||||
@@ -32,7 +32,7 @@
|
|||||||
{
|
{
|
||||||
monitor = "";
|
monitor = "";
|
||||||
text = "$TIME";
|
text = "$TIME";
|
||||||
color = "rgba(ffffffdd)";
|
color = "rgba(${theme.bare.textPrimary}dd)";
|
||||||
font_size = 90;
|
font_size = 90;
|
||||||
font_family = "JetBrainsMono Nerd Font";
|
font_family = "JetBrainsMono Nerd Font";
|
||||||
position = "0, 220";
|
position = "0, 220";
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
{
|
{
|
||||||
monitor = "";
|
monitor = "";
|
||||||
text = "cmd[update:1000] echo \" $(date +'%A, %B %d') \"";
|
text = "cmd[update:1000] echo \" $(date +'%A, %B %d') \"";
|
||||||
color = "rgba(adaaaaff)";
|
color = "rgba(${theme.bare.textMuted}ff)";
|
||||||
font_size = 20;
|
font_size = 20;
|
||||||
font_family = "JetBrainsMono Nerd Font";
|
font_family = "JetBrainsMono Nerd Font";
|
||||||
position = "0, 120";
|
position = "0, 120";
|
||||||
@@ -54,7 +54,7 @@
|
|||||||
{
|
{
|
||||||
monitor = "";
|
monitor = "";
|
||||||
text = "NIXOS // SILICON VOLT";
|
text = "NIXOS // SILICON VOLT";
|
||||||
color = "rgba(cffc00ee)";
|
color = "rgba(${theme.bare.accentVolt}ee)";
|
||||||
font_size = 14;
|
font_size = 14;
|
||||||
font_family = "JetBrainsMono Nerd Font";
|
font_family = "JetBrainsMono Nerd Font";
|
||||||
position = "0, 60";
|
position = "0, 60";
|
||||||
@@ -65,7 +65,7 @@
|
|||||||
{
|
{
|
||||||
monitor = "";
|
monitor = "";
|
||||||
text = "cmd[update:3600000] echo \" $USER @ $(hostname) \"";
|
text = "cmd[update:3600000] echo \" $USER @ $(hostname) \"";
|
||||||
color = "rgba(adaaaa99)";
|
color = "rgba(${theme.bare.textMuted}99)";
|
||||||
font_size = 13;
|
font_size = 13;
|
||||||
font_family = "JetBrainsMono Nerd Font";
|
font_family = "JetBrainsMono Nerd Font";
|
||||||
position = "0, -160";
|
position = "0, -160";
|
||||||
@@ -84,11 +84,11 @@
|
|||||||
dots_spacing = 0.2;
|
dots_spacing = 0.2;
|
||||||
dots_center = true;
|
dots_center = true;
|
||||||
# Volt lime outline, dark glass interior
|
# Volt lime outline, dark glass interior
|
||||||
outer_color = "rgba(cffc00ee)";
|
outer_color = "rgba(${theme.bare.accentVolt}ee)";
|
||||||
inner_color = "rgba(1c1b1b, 0.9)";
|
inner_color = "rgba(${theme.bare.glassBg}, 0.9)";
|
||||||
check_color = "rgba(e3ff66ee)";
|
check_color = "rgba(${theme.bare.accentVoltLight}ee)";
|
||||||
fail_color = "rgba(ff7a59ee)";
|
fail_color = "rgba(${theme.bare.accentCoral}ee)";
|
||||||
font_color = "rgba(e5e2e1ff)";
|
font_color = "rgba(${theme.bare.textSecondary}ff)";
|
||||||
fail_text = "$FAIL (<b>attempts: $ATTEMPTS</b>)";
|
fail_text = "$FAIL (<b>attempts: $ATTEMPTS</b>)";
|
||||||
fade_on_empty = false;
|
fade_on_empty = false;
|
||||||
placeholder_text = "<i> Enter Password...</i>";
|
placeholder_text = "<i> Enter Password...</i>";
|
||||||
|
|||||||
39
home/nvim/config/lazy-lock.json
Normal file
39
home/nvim/config/lazy-lock.json
Normal file
@@ -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" }
|
||||||
|
}
|
||||||
@@ -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" = {
|
xdg.configFile."nvim" = {
|
||||||
source = ./config;
|
source = ./config;
|
||||||
recursive = true;
|
recursive = true;
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
{ inputs, config, ... }:
|
{ inputs, my, ... }:
|
||||||
{
|
{
|
||||||
imports = [ inputs.pi.homeModules.default ];
|
imports = [ inputs.pi.homeModules.default ];
|
||||||
programs.pi.coding-agent = {
|
programs.pi.coding-agent.enable = my.pi.enable;
|
||||||
enable = true;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,55 @@
|
|||||||
{ pkgs, ... }:
|
{
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
theme,
|
||||||
|
...
|
||||||
|
}:
|
||||||
|
|
||||||
let
|
let
|
||||||
# Rofi script-mode indexer: exposes every executable user script
|
# Rofi script-mode indexer: exposes every executable user script
|
||||||
# (shell, python, whatever) so the launcher finds "everything".
|
# (shell, python, whatever) so the launcher finds "everything".
|
||||||
rofiScripts = pkgs.writeShellScriptBin "rofi-scripts" (builtins.readFile ./rofi/rofi-scripts.sh);
|
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
|
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 = {
|
programs.rofi = {
|
||||||
enable = true;
|
enable = true;
|
||||||
terminal = "${pkgs.foot}/bin/foot";
|
terminal = "${pkgs.foot}/bin/foot";
|
||||||
cycle = true;
|
cycle = true;
|
||||||
theme = ./rofi/volt.rasi;
|
theme = "volt";
|
||||||
|
|
||||||
extraConfig = {
|
extraConfig = {
|
||||||
# Combi mode searches .desktop apps (drun), binaries (run),
|
# Combi mode searches .desktop apps (drun), binaries (run),
|
||||||
|
|||||||
@@ -2,15 +2,15 @@
|
|||||||
// Flat brutalist-glass: dark glass surfaces, volt-lime selection, 0 radius.
|
// Flat brutalist-glass: dark glass surfaces, volt-lime selection, 0 radius.
|
||||||
|
|
||||||
* {
|
* {
|
||||||
bg0: rgba( 14, 14, 14, 95 % );
|
bg0: @bg0@;
|
||||||
bg1: rgba( 28, 27, 27, 95 % );
|
bg1: @bg1@;
|
||||||
fg0: #e5e2e1;
|
fg0: @fg0@;
|
||||||
fg1: #ffffff;
|
fg1: @fg1@;
|
||||||
fg2: #adaaaa;
|
fg2: @fg2@;
|
||||||
volt: #CFFC00;
|
volt: @volt@;
|
||||||
volt-dim: rgba( 207, 252, 0, 10 % );
|
volt-dim: @voltDim@;
|
||||||
coral: #FF7A59;
|
coral: @coral@;
|
||||||
border0: rgba( 255, 255, 255, 8 % );
|
border0: @border0@;
|
||||||
|
|
||||||
background-color: transparent;
|
background-color: transparent;
|
||||||
text-color: @fg0;
|
text-color: @fg0;
|
||||||
|
|||||||
@@ -48,9 +48,9 @@ if command -v fzf &>/dev/null; then
|
|||||||
--layout=reverse \
|
--layout=reverse \
|
||||||
--border=rounded \
|
--border=rounded \
|
||||||
--prompt=" Herdr Session > " \
|
--prompt=" Herdr Session > " \
|
||||||
--color=fg:#e5e2e1,bg:#131313,hl:#CFFC00,fg+:#ffffff,bg+:#1c1b1b,hl+:#e3ff66 \
|
--color=fg:@fg@,bg:@bg@,hl:@volt@,fg+:@fgBright@,bg+:@glass@,hl+:@voltLight@ \
|
||||||
--color=info:#ADAAAA,prompt:#CFFC00,pointer:#FF7A59,marker:#CFFC00,spinner:#00BFFF \
|
--color=info:@muted@,prompt:@volt@,pointer:@coral@,marker:@volt@,spinner:@blue@ \
|
||||||
--color=border:#2a2929,gutter:#131313 \
|
--color=border:@surface@,gutter:@bg@ \
|
||||||
--header="Select Herdr session to attach / create | Esc for plain shell" \
|
--header="Select Herdr session to attach / create | Esc for plain shell" \
|
||||||
--header-first)
|
--header-first)
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -6,22 +6,22 @@ format = "$os$directory$git_branch$git_status$nix_shell$rust$c$python$cmd_durati
|
|||||||
|
|
||||||
[os]
|
[os]
|
||||||
disabled = false
|
disabled = false
|
||||||
style = "bold #e5e2e1"
|
style = "bold @text@"
|
||||||
symbols = { NixOS = " " }
|
symbols = { NixOS = " " }
|
||||||
|
|
||||||
[directory]
|
[directory]
|
||||||
truncation_length = 3
|
truncation_length = 3
|
||||||
truncate_to_repo = true
|
truncate_to_repo = true
|
||||||
style = "bold #CFFC00"
|
style = "bold @volt@"
|
||||||
format = "[ $path]($style) "
|
format = "[ $path]($style) "
|
||||||
|
|
||||||
[git_branch]
|
[git_branch]
|
||||||
symbol = " "
|
symbol = " "
|
||||||
style = "bold #00BFFF"
|
style = "bold @blue@"
|
||||||
format = "on [$symbol$branch]($style) "
|
format = "on [$symbol$branch]($style) "
|
||||||
|
|
||||||
[git_status]
|
[git_status]
|
||||||
style = "bold #FF7A59"
|
style = "bold @coral@"
|
||||||
format = "([$all_status$ahead_behind]($style) )"
|
format = "([$all_status$ahead_behind]($style) )"
|
||||||
conflicted = " "
|
conflicted = " "
|
||||||
ahead = " "
|
ahead = " "
|
||||||
@@ -30,35 +30,35 @@ diverged = " "
|
|||||||
untracked = " "
|
untracked = " "
|
||||||
stashed = " "
|
stashed = " "
|
||||||
modified = " "
|
modified = " "
|
||||||
staged = " [](bold #CFFC00)"
|
staged = " [](bold @volt@)"
|
||||||
renamed = " "
|
renamed = " "
|
||||||
deleted = " "
|
deleted = " "
|
||||||
|
|
||||||
[nix_shell]
|
[nix_shell]
|
||||||
symbol = " "
|
symbol = " "
|
||||||
style = "bold #e3ff66"
|
style = "bold @voltLight@"
|
||||||
format = "via [$symbol$state]($style) "
|
format = "via [$symbol$state]($style) "
|
||||||
|
|
||||||
[rust]
|
[rust]
|
||||||
symbol = " "
|
symbol = " "
|
||||||
style = "bold #e3ff66"
|
style = "bold @voltLight@"
|
||||||
format = "[$symbol($version )]($style)"
|
format = "[$symbol($version )]($style)"
|
||||||
|
|
||||||
[c]
|
[c]
|
||||||
symbol = " "
|
symbol = " "
|
||||||
style = "bold #00BFFF"
|
style = "bold @blue@"
|
||||||
format = "[$symbol($version )]($style)"
|
format = "[$symbol($version )]($style)"
|
||||||
|
|
||||||
[python]
|
[python]
|
||||||
symbol = " "
|
symbol = " "
|
||||||
style = "bold #CFFC00"
|
style = "bold @volt@"
|
||||||
format = "[$symbol($version )]($style)"
|
format = "[$symbol($version )]($style)"
|
||||||
|
|
||||||
[cmd_duration]
|
[cmd_duration]
|
||||||
min_time = 2000
|
min_time = 2000
|
||||||
style = "bold #FF7A59"
|
style = "bold @coral@"
|
||||||
format = "[ $duration]($style) "
|
format = "[ $duration]($style) "
|
||||||
|
|
||||||
[character]
|
[character]
|
||||||
success_symbol = "[❯ ](bold #CFFC00) "
|
success_symbol = "[❯ ](bold @volt@) "
|
||||||
error_symbol = "[❯ ](bold #FF7A59) "
|
error_symbol = "[❯ ](bold @coral@) "
|
||||||
|
|||||||
36
home/theme.nix
Normal file
36
home/theme.nix
Normal file
@@ -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.<name> -> "#rrggbb" (most tools)
|
||||||
|
# theme.bare.<name> -> "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;
|
||||||
|
}
|
||||||
26
home/zsh.nix
26
home/zsh.nix
@@ -2,6 +2,8 @@
|
|||||||
config,
|
config,
|
||||||
pkgs,
|
pkgs,
|
||||||
lib,
|
lib,
|
||||||
|
theme,
|
||||||
|
my,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
|
|
||||||
@@ -23,9 +25,9 @@
|
|||||||
enableZshIntegration = true;
|
enableZshIntegration = true;
|
||||||
defaultOptions = [
|
defaultOptions = [
|
||||||
"--color=dark"
|
"--color=dark"
|
||||||
"--color=fg:#e5e2e1,bg:-1,hl:#CFFC00,fg+:#ffffff,bg+:#1c1b1b,hl+:#e3ff66"
|
"--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:#ADAAAA,prompt:#CFFC00,pointer:#FF7A59,marker:#CFFC00,spinner:#00BFFF,header:#00BFFF"
|
"--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:#2a2929,bg+:-1,gutter:-1"
|
"--color=border:${theme.colors.surfaceVariant},bg+:-1,gutter:-1"
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -41,7 +43,18 @@
|
|||||||
programs.starship = {
|
programs.starship = {
|
||||||
enable = true;
|
enable = true;
|
||||||
enableZshIntegration = 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 = {
|
programs.zsh = {
|
||||||
@@ -95,6 +108,7 @@
|
|||||||
ZSH_TMUX_FIXTERM = "true";
|
ZSH_TMUX_FIXTERM = "true";
|
||||||
GPG_TTY = "$(tty)";
|
GPG_TTY = "$(tty)";
|
||||||
PNPM_HOME = "$HOME/.local/share/pnpm";
|
PNPM_HOME = "$HOME/.local/share/pnpm";
|
||||||
|
FLAKE_CONFIG = my.flakeDir;
|
||||||
};
|
};
|
||||||
|
|
||||||
shellAliases = {
|
shellAliases = {
|
||||||
@@ -104,8 +118,8 @@
|
|||||||
l = "ls -al";
|
l = "ls -al";
|
||||||
clear = "clear -x";
|
clear = "clear -x";
|
||||||
rm = "rm -I";
|
rm = "rm -I";
|
||||||
zshconf = "$EDITOR $HOME/NixOS-Configs/home/zsh.nix";
|
zshconf = "$EDITOR ${my.flakeDir}/home/zsh.nix";
|
||||||
hyprconf = "$EDITOR $HOME/NixOS-Configs/home/hypr/hyprland.nix";
|
hyprconf = "$EDITOR ${my.flakeDir}/home/hypr/hyprland.nix";
|
||||||
setup = "source ./setup_env.sh";
|
setup = "source ./setup_env.sh";
|
||||||
gpuenv = "__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia";
|
gpuenv = "__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia";
|
||||||
digital = "$HOME/Tools/Digital/Digital.sh";
|
digital = "$HOME/Tools/Digital/Digital.sh";
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ fi
|
|||||||
|
|
||||||
# Auto-tmux configuration
|
# Auto-tmux configuration
|
||||||
use_auto_tmux () {
|
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
|
if use_auto_tmux; then
|
||||||
|
|||||||
@@ -20,12 +20,13 @@
|
|||||||
my = {
|
my = {
|
||||||
gaming.enable = true;
|
gaming.enable = true;
|
||||||
ai.local.enable = true;
|
ai.local.enable = true;
|
||||||
|
pi.enable = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# Host display configuration (absorbed by home/hypr/hyprland.nix)
|
# 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
|
# Samsung Odyssey Ark - matched by description so it survives port changes
|
||||||
output = "desc:Samsung Electric Company Odyssey Ark H1AK500000";
|
output = "desc:Samsung Electric Company Odyssey Ark H1AK500000";
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
{
|
{
|
||||||
|
config,
|
||||||
lib,
|
lib,
|
||||||
...
|
...
|
||||||
}:
|
}:
|
||||||
@@ -13,8 +14,16 @@
|
|||||||
description = "Primary interactive user account.";
|
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";
|
gaming.enable = lib.mkEnableOption "Steam, Gamemode and gaming tooling";
|
||||||
|
|
||||||
ai.local.enable = lib.mkEnableOption "local AI services (Ollama, ComfyUI, Open WebUI)";
|
ai.local.enable = lib.mkEnableOption "local AI services (Ollama, ComfyUI, Open WebUI)";
|
||||||
|
|
||||||
|
pi.enable = lib.mkEnableOption "the pi coding agent (home-manager)";
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user