All checks were successful
Check / eval (push) Successful in 3m39s
theme.nix now resolves nomarchy.theme.iconThemePackage from a small icon-pack registry (Papirus/Tela/Qogir/Reversal/Numix, matched by name prefix). Default themes name Papirus-*, so the resolved package is the plain papirus-icon-theme derivation — byte-identical closure, zero added MB. Only when a theme's `icons` names a set from another pack is that pack (and only it) symlinkJoined alongside papirus. stylix.nix consumes it via mkDefault. Adding a pack is one iconPacks row. Deliberately NOT shipping more packs by default: papirus alone is already ~1 GiB and each extra pack adds ~hundreds of MB, so variety is opt-in per install (set `icons` in theme-state.json), not a default closure cost. Documented in templates/downstream/home.nix + ROADMAP § Icon themes. Verification: V1 (HM activationPackage builds). Eval proofs — default resolves to plain papirus (zero delta); icons="Tela-dark" -> nomarchy-icon-themes symlinkJoin (papirus+tela) with the name flowing, without building tela; all 5 pack attrs exist in the pinned nixpkgs; template-sot + option-docs + flake check green. No default visual change (same papirus), so no screenshot; the opt-in render is downstream. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
104 lines
3.6 KiB
Nix
104 lines
3.6 KiB
Nix
# Stylix — themes the long tail of applications (GTK, Qt, cursors,
|
|
# fonts) from the same theme-state.json that drives the live engine.
|
|
#
|
|
# Division of labour: the hot-reload trio (Hyprland, Waybar, Ghostty)
|
|
# is owned by the Nomarchy engine and updates instantly; everything
|
|
# Stylix touches updates on the next home-manager switch. That is why
|
|
# autoEnable is off and the trio's Stylix targets stay disabled.
|
|
#
|
|
# Note: the stylix home module itself is imported by homeModules.nomarchy
|
|
# in flake.nix (it needs the stylix flake input).
|
|
{ config, lib, pkgs, ... }:
|
|
|
|
let
|
|
cfg = config.nomarchy;
|
|
t = cfg.theme;
|
|
c = t.colors;
|
|
hex = lib.removePrefix "#";
|
|
|
|
# Map the Nomarchy palette onto base16 roles.
|
|
base16 = {
|
|
base00 = hex c.base; # default background
|
|
base01 = hex c.mantle; # darker background (status bars)
|
|
base02 = hex c.surface; # selection background
|
|
base03 = hex c.muted; # comments
|
|
base04 = hex c.subtext; # dark foreground
|
|
base05 = hex c.text; # default foreground
|
|
base06 = hex c.text; # light foreground
|
|
base07 = hex c.text; # lightest foreground
|
|
base08 = hex c.bad; # red
|
|
base09 = hex c.warn; # orange
|
|
base0A = hex c.warn; # yellow
|
|
base0B = hex c.good; # green
|
|
base0C = hex (builtins.elemAt t.ansi 6); # cyan
|
|
base0D = hex c.accent; # blue
|
|
base0E = hex c.accentAlt;# magenta
|
|
base0F = hex c.bad; # brown/deprecated
|
|
};
|
|
in
|
|
{
|
|
config = lib.mkIf cfg.stylix.enable {
|
|
stylix = {
|
|
enable = true;
|
|
autoEnable = false; # explicit targets only — the engine owns the rest
|
|
polarity = if t.mode == "light" then "light" else "dark";
|
|
base16Scheme = base16;
|
|
|
|
targets = {
|
|
gtk.enable = true;
|
|
qt.enable = true;
|
|
# No-op unless programs.zathura is on (viewers.nix enables it).
|
|
zathura.enable = true;
|
|
};
|
|
|
|
cursor = {
|
|
name = lib.mkDefault "Bibata-Modern-Classic";
|
|
package = lib.mkDefault pkgs.bibata-cursors;
|
|
size = lib.mkDefault 24;
|
|
};
|
|
|
|
# GTK/file-manager/rofi icon theme, resolved from the JSON in
|
|
# theme.nix (per-theme `icons`, else Papirus-Dark/Light by mode).
|
|
# Stylix sets gtk.iconTheme from this; both dark/light point at the
|
|
# already-mode-resolved name. The package is papirus by default and
|
|
# only unions in another pack when a theme's `icons` names one
|
|
# (theme.nix — opt-in, no default closure bloat).
|
|
icons = {
|
|
enable = true;
|
|
package = lib.mkDefault t.iconThemePackage;
|
|
dark = t.iconTheme;
|
|
light = t.iconTheme;
|
|
};
|
|
|
|
fonts = {
|
|
monospace = {
|
|
name = t.fonts.mono;
|
|
package = lib.mkDefault pkgs.nerd-fonts.jetbrains-mono;
|
|
};
|
|
sansSerif = {
|
|
name = t.fonts.ui;
|
|
package = lib.mkDefault pkgs.inter;
|
|
};
|
|
serif = {
|
|
name = t.fonts.ui;
|
|
package = lib.mkDefault pkgs.inter;
|
|
};
|
|
emoji = {
|
|
name = "Noto Color Emoji";
|
|
package = lib.mkDefault pkgs.noto-fonts-color-emoji;
|
|
};
|
|
sizes.terminal = t.fonts.size;
|
|
};
|
|
};
|
|
|
|
# GTK4/libadwaita and Qt6 apps decide dark vs light from the XDG
|
|
# portal's color-scheme (org.freedesktop.appearance), which
|
|
# xdg-desktop-portal-gtk sources from this gsettings key. Stylix sets
|
|
# the GTK theme and `polarity` but not this, so a light theme still
|
|
# rendered libadwaita/Qt apps dark (and vice-versa). Drive it from the
|
|
# palette mode. (programs.dconf.enable is already on system-side.)
|
|
dconf.settings."org/gnome/desktop/interface".color-scheme =
|
|
if t.mode == "light" then "prefer-light" else "prefer-dark";
|
|
};
|
|
}
|