{ lib, config, pkgs, hostConfig, ... }: let palettes = { midnight = { bg = "#121212"; fg = "#e0e0e0"; bgAlt = "#2d2d2d"; fgAlt = "#666666"; border = "#3d3d3d"; accent = "#7aa2f7"; green = "#98c379"; red = "#ff6b6b"; yellow = "#e5c07b"; blue = "#7aa2f7"; magenta = "#c678dd"; cyan = "#56b6c2"; bellFg = "#ff6b6b"; activityFg = "#7aa2f7"; }; daylight = { bg = "#f5f5f5"; fg = "#1a1a1a"; bgAlt = "#ebebeb"; fgAlt = "#999999"; border = "#e8e8e8"; accent = "#3b5bdb"; green = "#2d7f3e"; red = "#c7254e"; yellow = "#996800"; blue = "#3b5bdb"; magenta = "#ae3ec9"; cyan = "#1098ad"; bellFg = "#c7254e"; activityFg = "#3b5bdb"; }; }; mkFzfTheme = palette: '' --color=fg:${palette.fg},bg:${palette.bg},hl:${palette.accent} --color=fg+:${palette.fg},bg+:${palette.bgAlt},hl+:${palette.accent} --color=info:${palette.green},prompt:${palette.accent},pointer:${palette.fg},marker:${palette.green},spinner:${palette.fg} ''; in { options.theme = lib.mkOption { type = lib.types.enum [ "midnight" "daylight" ]; default = "midnight"; }; options.palettes = lib.mkOption { type = lib.types.attrsOf (lib.types.attrsOf lib.types.str); readOnly = true; }; options.colors = lib.mkOption { type = lib.types.attrsOf lib.types.str; readOnly = true; }; config = { inherit palettes; colors = palettes.${config.theme}; home.pointerCursor = lib.mkIf hostConfig.isLinux { name = "macOS"; package = pkgs.apple-cursor; size = 24; gtk.enable = true; x11.enable = false; }; gtk = lib.mkIf hostConfig.isLinux { enable = true; gtk2.configLocation = "${config.xdg.configHome}/gtk-2.0/gtkrc"; font = { name = "SF Pro Display"; size = 11; }; }; home.file.".local/share/fonts" = lib.mkIf hostConfig.isLinux { source = config.lib.file.mkOutOfStoreSymlink "${config.home.homeDirectory}/.config/nix/fonts"; }; home.activation.checkFonts = lib.hm.dag.entryAfter [ "writeBoundary" ] '' if [ ! -d "${config.home.homeDirectory}/.config/nix/fonts" ] || \ [ -z "$(ls -A "${config.home.homeDirectory}/.config/nix/fonts" 2>/dev/null)" ]; then echo "WARNING: ~/.config/nix/fonts is missing or empty — fonts will not be available" echo " copy your fonts into ~/.config/nix/fonts/ and rebuild" fi ''; xdg.configFile."fzf/themes/midnight".text = mkFzfTheme palettes.midnight; xdg.configFile."fzf/themes/daylight".text = mkFzfTheme palettes.daylight; home.activation.linkTheme = lib.hm.dag.entryAfter [ "writeBoundary" ] '' cfg="${config.xdg.configHome}" theme="${config.theme}" link() { [ -e "$2" ] || $DRY_RUN_CMD ln -sf "$1" "$2"; } ${lib.optionalString hostConfig.isLinux '' link "$cfg/hypr/themes/$theme.conf" "$cfg/hypr/themes/theme.conf" link "$cfg/waybar/themes/$theme.css" "$cfg/waybar/themes/theme.css" link "$cfg/fuzzel/themes/$theme.ini" "$cfg/fuzzel/themes/theme.ini" $DRY_RUN_CMD mkdir -p "$cfg/dunst/dunstrc.d" link "$cfg/dunst/themes/$theme.conf" "$cfg/dunst/dunstrc.d/theme.conf" ''} link "$cfg/sioyek/themes/$theme.config" "$cfg/sioyek/themes/theme.config" link "$cfg/fzf/themes/$theme" "$cfg/fzf/themes/theme" ''; }; }