main
 1{lib, ...}: {
 2  den.aspects.desktop.aesthetic.fonts = {
 3    settings.host = let
 4      inherit (lib) mkOption types;
 5
 6      fontType = types.submodule {
 7        options = {
 8          name = mkOption {
 9            type = types.str;
10          };
11          package = mkOption {
12            type = types.functionTo types.package;
13            example = lib.literalExpression "pkgs: pkgs.dejavu_fonts";
14          };
15        };
16      };
17    in {
18      size = mkOption {
19        type = types.ints.positive;
20        default = 12;
21      };
22      serif = mkOption {
23        type = types.listOf fontType;
24        default = [
25          {
26            name = "Noto Serif CJK SC";
27            package = pkgs: pkgs.noto-fonts-cjk-serif;
28          }
29        ];
30      };
31      sansSerif = mkOption {
32        type = types.listOf fontType;
33        default = [
34          {
35            name = "Sarasa Gothic SC";
36            package = pkgs: pkgs.sarasa-gothic;
37          }
38          {
39            name = "Noto Sans CJK SC";
40            package = pkgs: pkgs.noto-fonts-cjk-sans;
41          }
42        ];
43      };
44      monospace = mkOption {
45        type = types.listOf fontType;
46        default = [
47          {
48            name = "Maple Mono NF CN";
49            package = pkgs: pkgs.maple-mono.NF-CN;
50          }
51        ];
52      };
53      emoji = mkOption {
54        type = types.listOf fontType;
55        default = [
56          {
57            name = "Noto Color Emoji";
58            package = pkgs: pkgs.noto-fonts-color-emoji;
59          }
60        ];
61      };
62    };
63
64    nixos = {
65      host,
66      pkgs,
67      ...
68    }: let
69      cfg = host.settings.desktop.aesthetic.fonts;
70    in {
71      fonts = {
72        enableDefaultPackages = false;
73        fontDir.enable = true;
74
75        packages =
76          (map (x: x.package pkgs)
77            (lib.concatMap (x: cfg.${x}) ["serif" "sansSerif" "monospace" "emoji"]))
78          ++ (with pkgs; [
79            dejavu_fonts
80            noto-fonts-lgc-plus
81          ]);
82        fontconfig.defaultFonts =
83          lib.genAttrs ["serif" "sansSerif" "monospace" "emoji"]
84          (x: lib.unique (map (x: x.name) cfg.${x}));
85      };
86    };
87  };
88}