{ config, pkgs, lib, ... }: let cfg = config.alqueva.fonts; inherit (lib) types mkOption; fontSubmodule = fontPackages: fontNames: { options = { packages = mkOption { type = types.listOf types.package; default = fontPackages; description = "Package of the font used."; }; names = mkOption { type = types.listOf types.str; default = fontNames; description = "Name of the default font you will be using."; }; }; }; mkFontOption = fontType: fontPackages: fontNames: mkOption { type = types.submodule (fontSubmodule fontPackages fontNames); description = "Options for the ${fontType} letterform."; }; in { options.alqueva.fonts = { sansSerif = mkFontOption "sans-serif" [pkgs.roboto] ["Roboto"]; monospace = mkFontOption "monospace" [pkgs.roboto-mono] ["Roboto Mono"]; serif = mkFontOption "serif" [pkgs.roboto-serif] ["Roboto Serif"]; emoji = mkFontOption "emoji" [pkgs.noto-fonts-color-emoji] ["Noto Color Emoji"]; extraPackages = mkOption { type = types.listOf types.package; default = []; description = "Extra font packages to be installed."; }; }; config = { fonts = { packages = builtins.concatLists [ cfg.extraPackages cfg.sansSerif.packages cfg.monospace.packages cfg.serif.packages cfg.emoji.packages ]; fontconfig = { defaultFonts = { sansSerif = cfg.sansSerif.names; monospace = cfg.monospace.names; serif = cfg.serif.names; emoji = cfg.emoji.names; }; enable = true; }; }; }; }