feat(themes): declaratively manage icons, cursors, and dark/light modes

- Automatically detect light mode via 'light.mode' file in theme folder
- Read icon theme name from 'icons.theme' file in theme folder
- Switch Stylix polarity and iconTheme based on theme selection
- Add yaru-theme and bibata-cursors to default packages
- Remove obsolete imperative nomarchy-theme-set-gnome script
This commit is contained in:
Bernardo Magri
2026-04-04 18:33:00 +01:00
parent 0bd67f1ee0
commit 42f515f4a9
5 changed files with 47 additions and 23 deletions

View File

@@ -1,18 +0,0 @@
#!/bin/bash
# Change gnome modes
if [[ -f ~/.config/nomarchy/current/theme/light.mode ]]; then
gsettings set org.gnome.desktop.interface color-scheme "prefer-light"
gsettings set org.gnome.desktop.interface gtk-theme "Adwaita"
else
gsettings set org.gnome.desktop.interface color-scheme "prefer-dark"
gsettings set org.gnome.desktop.interface gtk-theme "Adwaita-dark"
fi
# Change gnome icon theme color
GNOME_ICONS_THEME=~/.config/nomarchy/current/theme/icons.theme
if [[ -f $GNOME_ICONS_THEME ]]; then
gsettings set org.gnome.desktop.interface icon-theme "$(<$GNOME_ICONS_THEME)"
else
gsettings set org.gnome.desktop.interface icon-theme "Yaru-blue"
fi

View File

@@ -49,6 +49,8 @@ in
mise
jq
xmlstarlet
yaru-theme
bibata-cursors
nerd-fonts.jetbrains-mono
nerd-fonts.roboto-mono
nerd-fonts.fira-code

View File

@@ -1,4 +1,4 @@
{ lib, ... }:
{ lib, pkgs, ... }:
{
options.nomarchy = {
@@ -73,6 +73,28 @@
description = "System monospace font.";
};
};
iconsTheme = lib.mkOption {
type = lib.types.str;
default = "Yaru-blue";
description = "System icon theme name.";
};
isLightMode = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Whether the current theme is light mode.";
};
cursor = {
name = lib.mkOption {
type = lib.types.str;
default = "Bibata-Modern-Ice";
description = "Mouse cursor theme name.";
};
package = lib.mkOption {
type = lib.types.package;
default = pkgs.bibata-cursors;
description = "Package providing the cursor theme.";
};
};
configOverrides = lib.mkOption {
type = lib.types.nullOr lib.types.path;
default = null;

View File

@@ -117,6 +117,15 @@ in
border_size = togglesState.hyprland.border_size or 2;
};
fonts.monospace = togglesState.font or "JetBrainsMono Nerd Font";
# Derived properties from the theme directory
isLightMode = builtins.pathExists (../../themes + "/${togglesState.theme or "nord"}/light.mode");
iconsTheme = let
iconsFile = ../../themes + "/${togglesState.theme or "nord"}/icons.theme";
in
if builtins.pathExists iconsFile
then lib.removeSuffix "\n" (builtins.readFile iconsFile)
else "Yaru-blue";
};
};
}

View File

@@ -21,12 +21,12 @@ in
image = activeWallpaper;
base16Scheme = currentPalette;
# Force dark/light mode based on theme name if possible, or just default to dark
polarity = if lib.strings.hasInfix "light" activeThemeName then "light" else "dark";
# Use detected light mode state
polarity = if config.nomarchy.isLightMode then "light" else "dark";
cursor = {
package = pkgs.bibata-cursors;
name = "Bibata-Modern-Ice";
package = config.nomarchy.cursor.package;
name = config.nomarchy.cursor.name;
size = 24;
};
@@ -65,4 +65,13 @@ in
gnome.enable = true;
};
};
# GTK Icon Theme configuration
gtk = {
enable = true;
iconTheme = {
package = pkgs.yaru-theme;
name = config.nomarchy.iconsTheme;
};
};
}