147 lines
3.9 KiB
Nix
147 lines
3.9 KiB
Nix
{ config, options, lib, pkgs, ... }:
|
|
let
|
|
inherit (builtins) getEnv map;
|
|
inherit (lib.attrsets) attrValues mapAttrsToList;
|
|
inherit (lib.meta) getExe;
|
|
inherit (lib.modules) mkIf mkMerge;
|
|
inherit (lib.strings) concatStringsSep optionalString;
|
|
|
|
cfg = config.modules.themes;
|
|
desktop = config.modules.desktop;
|
|
in {
|
|
options.modules.themes = let
|
|
inherit (lib.options) mkOption mkPackageOption;
|
|
inherit (lib.types) attrsOf int lines listOf nullOr path package str;
|
|
inherit (lib.my) mkOpt toFilteredImage;
|
|
in {
|
|
active = mkOption {
|
|
type = nullOr str;
|
|
default = null;
|
|
apply = v: let
|
|
theme = getEnv "THEME";
|
|
in
|
|
if theme != ""
|
|
then theme
|
|
else v;
|
|
description = ''
|
|
Name of the theme which ought to be applied.
|
|
Can be overridden by the `THEME` environment variable.
|
|
'';
|
|
};
|
|
|
|
wallpaper = mkOpt (nullOr path) null;
|
|
|
|
loginWallpaper = mkOpt (nullOr path) (
|
|
if cfg.wallpaper != null
|
|
then toFilteredImage cfg.wallpaper "-gaussian-blur 0x2 -modulate 70 -level 5%"
|
|
else null
|
|
);
|
|
|
|
gtk = {
|
|
name = mkOpt str "";
|
|
package = mkPackageOption pkgs "gtk" {};
|
|
};
|
|
|
|
iconTheme = {
|
|
name = mkOpt str "";
|
|
package = mkPackageOption pkgs "icon" {};
|
|
};
|
|
|
|
pointer = {
|
|
name = mkOpt str "";
|
|
package = mkPackageOption pkgs "pointer" {};
|
|
size = mkOpt int 0;
|
|
};
|
|
|
|
onReload = mkOpt (attrsOf lines) {};
|
|
|
|
fontConfig = {
|
|
packages = mkOpt (listOf package) [];
|
|
mono = mkOpt (listOf str) [""];
|
|
sans = mkOpt (listOf str) [""];
|
|
emoji = mkOpt (listOf str) [""];
|
|
};
|
|
|
|
font = {
|
|
mono = {
|
|
family = mkOpt str "";
|
|
weight = mkOpt str "Bold";
|
|
weightAlt = mkOpt str "Bold";
|
|
weightNum = mkOpt int 700;
|
|
size = mkOpt int 13;
|
|
};
|
|
sans = {
|
|
family = mkOpt str "";
|
|
weight = mkOpt str "SemiBold";
|
|
weightAlt = mkOpt str "DemiBold";
|
|
weightNum = mkOpt int 600;
|
|
size = mkOpt int 10;
|
|
};
|
|
};
|
|
|
|
colors = {
|
|
main = {
|
|
normal = {
|
|
black = mkOpt str "#000000"; # 0
|
|
red = mkOpt str "#FF0000"; # 1
|
|
green = mkOpt str "#00FF00"; # 2
|
|
yellow = mkOpt str "#FFFF00"; # 3
|
|
blue = mkOpt str "#0000FF"; # 4
|
|
magenta = mkOpt str "#FF00FF"; # 5
|
|
cyan = mkOpt str "#00FFFF"; # 6
|
|
white = mkOpt str "#BBBBBB"; # 7
|
|
};
|
|
bright = {
|
|
black = mkOpt str "#888888"; # 8
|
|
red = mkOpt str "#FF8800"; # 9
|
|
green = mkOpt str "#00FF80"; # 10
|
|
yellow = mkOpt str "#FF8800"; # 11
|
|
blue = mkOpt str "#0088FF"; # 12
|
|
magenta = mkOpt str "#FF88FF"; # 13
|
|
cyan = mkOpt str "#88FFFF"; # 14
|
|
white = mkOpt str "#FFFFFF"; # 15
|
|
};
|
|
types = let
|
|
inherit (cfg.colors.main.normal) black red white yellow;
|
|
inherit (cfg.colors.main.types) bg fg;
|
|
in {
|
|
bg = mkOpt str black;
|
|
fg = mkOpt str white;
|
|
panelbg = mkOpt str bg;
|
|
panelfg = mkOpt str fg;
|
|
border = mkOpt str bg;
|
|
error = mkOpt str red;
|
|
warning = mkOpt str yellow;
|
|
highlight = mkOpt str white;
|
|
};
|
|
};
|
|
|
|
rofi = {
|
|
bg = {
|
|
main = mkOpt str "#FFFFFF";
|
|
alt = mkOpt str "#FFFFFF";
|
|
bar = mkOpt str "#FFFFFF";
|
|
};
|
|
fg = mkOpt str "#FFFFFF";
|
|
ribbon = {
|
|
outer = mkOpt str "#FFFFFF";
|
|
inner = mkOpt str "#FFFFFF";
|
|
};
|
|
selected = mkOpt str "#FFFFFF";
|
|
urgent = mkOpt str "#FFFFFF";
|
|
transparent = mkOpt str "#FFFFFF";
|
|
};
|
|
};
|
|
|
|
editor = {
|
|
neovim = {
|
|
light = mkOpt str "";
|
|
dark = mkOpt str "";
|
|
};
|
|
};
|
|
};
|
|
|
|
config = mkIf (cfg.active != null) (mkMerge [
|
|
(mkIf (desktop.type == "wayland") (mkMerge []))
|
|
]);
|
|
}
|