Files
dotfiles/.claude/tasks/0022-stylix-nord-theming.md
alexion 27a28b1ae7 feat(desktop): theme the graphical layer Nord with Stylix (task 0022)
Add Stylix as a flake input and a desktop theming module that resolves a
single Nord base16 scheme across the graphical surface: GTK, Qt, cursor,
and the system monospace font, plus a static Nord wallpaper drawn as a
Polar Night gradient.

Scope the theming to the graphical layer alone. The Stylix targets for
fish (at both system and home-manager level), tmux, and nixvim stay off
so the terminal tools keep their hand-written themes.
2026-07-22 10:28:03 -04:00

47 lines
3.0 KiB
Markdown

---
spec: hyprland-desktop
blocked-by: 0021-desktop-group-and-hyprland-session
---
## What to build
Theme the whole new graphical layer Nord from a single source, and set the wallpaper.
Add Stylix as a flake input and a desktop theming module that drives colors, system fonts, and cursor from one Nord base16 scheme across the graphical surface (GTK, Qt, and the compositor colors), plus a single static Nord wallpaper set by Stylix.
Scope Stylix to the graphical layer only: leave its targets for the existing terminal tools (nvim, tmux, fish) off so their established hand-themes stand unchanged.
The theming is reversible per target, so individual surfaces can migrate toward or away from manual theming later.
## Acceptance criteria
- [x] Stylix is a flake input, wired into the host build.
- [x] A desktop theming module resolves a single Nord base16 scheme and applies it to GTK, Qt, cursor, and system fonts.
- [x] A single static Nord wallpaper is set by Stylix; no dynamic, animated, or cycling wallpaper.
- [x] Stylix targets for nvim, tmux, and fish are off, leaving their existing themes untouched.
- [x] neogaia builds green under `nix flake check`, and an eval probe confirms the resolved scheme is Nord.
## Implementation Notes
- **Wallpaper is a generated Nord gradient, not a shipped image.**
Stylix requires an `image`, and the spec asks only for "a single static Nord wallpaper".
Rather than commit a binary blob or fetch one over the network at build time, the module draws a vertical gradient across the Nord Polar Night shades (`#2E3440``#3B4252`) with ImageMagick.
It is static, genuinely Nord, and fully reproducible with no external dependency beyond a cached build tool.
Swapping in a picture later is a one-line change to `image`.
- **The nvim target is `nixvim`, not `neovim`.**
nvim here is configured through nixvim, so the Stylix target that would theme it is `nixvim`.
Disabling `neovim` would have been a no-op and left nvim themed.
- **fish is disabled at two levels.**
fish is enabled both at system level (`programs.fish`, for `/etc/shells` and vendor completions) and in home-manager, so its theming has a target in each scope.
Both are turned off, so the hand-written fish theme stands.
- **Cursor generation switched on explicitly.**
home-manager now wants `home.pointerCursor.enable` set explicitly rather than inferring it from the presence of cursor settings, so the module sets it to silence the deprecation and keep the build warning-clean (bar the pre-existing benign nixvim `nixpkgs.follows` notice).
- **System font pinned to JetBrains Mono.**
The acceptance criterion asks for "system fonts" without naming one, so the monospace is pinned to JetBrains Mono and the serif/sans/emoji families are left at Stylix's Nord-coherent defaults.
- **Stylix module imported unconditionally.**
`lib.nix` adds `inputs.stylix.nixosModules.stylix` to every host's module set, matching how the other input modules are wired.
It stays inert until `stylix.enable` is set, which only the theming module does, only when the desktop is on.