{ config, lib, pkgs, ... }: let inherit (config.stylix.inputs) firefox-gnome-theme; targets = [ { path = "firefox"; name = "Firefox"; } { path = "librewolf"; name = "LibreWolf"; } { path = "floorp"; name = "Floorp"; } ]; eachConfig = mkCfg: targets: lib.mkMerge (map mkCfg targets); eachTarget = mkCfg: lib.mkIf config.stylix.enable ( eachConfig ( target: let cfg = config.stylix.targets.${target.path}; programCfg = config.programs.${target.path}; in lib.mkIf cfg.enable (mkCfg { inherit target cfg programCfg; }) ) targets ); mkColor = color: let inherit (config.lib.stylix) colors; in { r = colors."${color}-rgb-r"; g = colors."${color}-rgb-g"; b = colors."${color}-rgb-b"; }; nur = config.stylix.inputs.nur.legacyPackages.${pkgs.system}; in { options.stylix.targets = lib.listToAttrs ( map ( target: lib.nameValuePair target.path { enable = config.lib.stylix.mkEnableTarget target.name true; profileNames = lib.mkOption { description = "The ${target.name} profile names to apply styling on."; type = lib.types.listOf lib.types.str; default = [ ]; }; colorTheme.enable = lib.mkEnableOption "[Firefox Color](https://color.firefox.com/) on ${target.name}"; firefoxGnomeTheme.enable = lib.mkEnableOption "[Firefox GNOME theme](https://github.com/rafaelmardojai/firefox-gnome-theme) on ${target.name}"; } ) targets ); # This and the below assignment aren't merged because of # https://discourse.nixos.org/t/infinite-recursion-in-module-with-mkmerge/10989 config = { programs = eachTarget ( { target, cfg, ... }: eachConfig (profileName: { ${target.path}.profiles.${profileName} = lib.mkMerge [ { settings = { "font.name.monospace.x-western" = config.stylix.fonts.monospace.name; "font.name.sans-serif.x-western" = config.stylix.fonts.sansSerif.name; "font.name.serif.x-western" = config.stylix.fonts.serif.name; }; } (lib.mkIf cfg.firefoxGnomeTheme.enable { settings = { "toolkit.legacyUserProfileCustomizations.stylesheets" = true; "svg.context-properties.content.enabled" = true; }; userChrome = let template = config.lib.stylix.colors { template = ./userChrome.css.mustache; extension = "css"; }; in '' @import "${firefox-gnome-theme}/userChrome.css"; @import "${template}"; ''; userContent = '' @import "${firefox-gnome-theme}/userContent.css"; ''; }) (lib.mkIf cfg.colorTheme.enable { extensions = { packages = [ nur.repos.rycee.firefox-addons.firefox-color ]; settings."FirefoxColor@mozilla.com".settings = { firstRunDone = true; theme = { title = "Stylix ${config.lib.stylix.colors.description}"; images.additional_backgrounds = [ "./bg-000.svg" ]; colors = { toolbar = mkColor "base00"; toolbar_text = mkColor "base05"; frame = mkColor "base01"; tab_background_text = mkColor "base05"; toolbar_field = mkColor "base02"; toolbar_field_text = mkColor "base05"; tab_line = mkColor "base0D"; popup = mkColor "base00"; popup_text = mkColor "base05"; button_background_active = mkColor "base04"; frame_inactive = mkColor "base00"; icons_attention = mkColor "base0D"; icons = mkColor "base05"; ntp_background = mkColor "base00"; ntp_text = mkColor "base05"; popup_border = mkColor "base0D"; popup_highlight_text = mkColor "base05"; popup_highlight = mkColor "base04"; sidebar_border = mkColor "base0D"; sidebar_highlight_text = mkColor "base05"; sidebar_highlight = mkColor "base0D"; sidebar_text = mkColor "base05"; sidebar = mkColor "base00"; tab_background_separator = mkColor "base0D"; tab_loading = mkColor "base05"; tab_selected = mkColor "base00"; tab_text = mkColor "base05"; toolbar_bottom_separator = mkColor "base00"; toolbar_field_border_focus = mkColor "base0D"; toolbar_field_border = mkColor "base00"; toolbar_field_focus = mkColor "base00"; toolbar_field_highlight_text = mkColor "base00"; toolbar_field_highlight = mkColor "base0D"; toolbar_field_separator = mkColor "base0D"; toolbar_vertical_separator = mkColor "base0D"; }; }; }; }; }) ]; }) cfg.profileNames ); warnings = eachTarget ( { target, ... }: lib.optional ( config.programs.${target.path}.enable && config.stylix.targets.${target.path}.profileNames == [ ] ) ''stylix: ${target.path}: `config.stylix.targets.${target.path}.profileNames` is not set. Declare profile names with 'config.stylix.targets.${target.path}.profileNames = [ "" ];'.'' ); }; }