{ lib, namespace, config, ... }: let inherit (lib) types mkOption literalMD mkIf mkDefault ; cfg = config.${namespace}.theme; colorThemes = lib.types.enum [ "rose-pine" ]; colorThemeType = types.submodule { options = { base = mkOption { type = colorThemes; example = "rose-pine"; description = literalMD '' The color theme to use. This should match the base of the enable options provided by the input's module. For instance, the rose-pine home-manager module provides the {option}`rose-pine.enable` base option and the {option}`programs.gtk.rose-pine.enable` option. ''; }; flavor = mkOption { type = with types; nullOr str; default = null; example = "moon"; description = "The theme flavor to use, if applicable."; }; accent = mkOption { type = with types; nullOr str; default = null; example = "rose"; description = "The theme accent to use, if applicable."; }; }; }; mkColorThemeOpt = mode: flavor: (mkOption { type = with types; either str colorThemeType; default = { base = "rose-pine"; inherit flavor; }; description = "The color theme to use in ${mode} mode."; }); # https://github.com/nix-community/home-manager/blob/master/modules/misc/gtk.nix iconThemeType = types.submodule { options = { package = mkOption { type = with types; nullOr package; default = null; example = "pkgs.gnome.adwaita-icon-theme"; description = '' Package providing the icon theme. This package will be installed to your profile. If `null` then the theme is assumed to already be available in your profile. ''; }; name = mkOption { type = with types; str; example = "Adwaita"; description = "The name of the icon theme within the package."; }; }; }; in { options.${namespace}.theme = { colors = rec { default = mkOption { type = with types; str; default = "dark"; description = "Whether to prefer the light or dark theme."; }; light = mkColorThemeOpt "light" "dawn"; dark = mkColorThemeOpt "dark" "main"; inherit ("${default}") base; inherit ("${default}") flavor; inherit ("${default}") accent; }; icons = mkOption { type = with types; nullOr iconThemeType; default = null; description = "The icon theme to use."; }; }; config = mkIf (cfg.icons != null) { gtk = mkIf config.gtk.enable (mkDefault { iconTheme = { inherit (cfg.icons) name; package = mkIf (cfg.icons.package != null) cfg.package; }; }); services.dunst = mkIf config.services.dunst.enable (mkDefault { iconTheme = { inherit (cfg.icons) name; package = mkIf (cfg.icons.package != null) cfg.package; }; }); }; }