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}