{ config, lib, pkgs, ... }: let cfg = config.soispha.fonts; in { options.soispha.fonts = { enable = lib.mkEnableOption "fonts"; fonts = lib.mkOption { type = lib.types.listOf lib.types.str; example = lib.literalExpression ''["SourceCodePro" "Overpass" "FiraCode"]''; default = [ "SourceCodePro" "Overpass" ]; description = "The nerd-fonts to install"; }; enableEmoji = lib.mkEnableOption "emoji font support"; }; config = lib.mkIf cfg.enable { fonts = { packages = let nerdFont = pkgs.nerdfonts.override { inherit (cfg) fonts; }; in [ nerdFont ] ++ (with pkgs; [liberation_ttf]) ++ lib.optional cfg.enableEmoji pkgs.noto-fonts-emoji; fontconfig = { # NOTE: This is responsible for color emoji support <2023-08-28> # WARNING: This could lead to broken font rendering, if the emoji font is used as # a fallback for normal characters <2024-05-16> localConf = lib.mkIf cfg.enableEmoji (builtins.readFile ./emoji_font.xml); defaultFonts = { serif = lib.mkForce (["Liberation Serif"] ++ lib.optional cfg.enableEmoji "Noto Color Emoji"); sansSerif = lib.mkForce (["Overpass Nerd Font Propo"] ++ lib.optional cfg.enableEmoji "Noto Color Emoji"); monospace = lib.mkForce (["SauceCodePro Nerd Font Mono"] ++ lib.optional cfg.enableEmoji "Noto Color Emoji"); emoji = lib.mkIf cfg.enableEmoji (lib.mkForce ["Noto Color Emoji"]); }; allowType1 = false; allowBitmaps = false; }; }; }; }