Create an enable option for each module

Fixes #7
This commit is contained in:
Daniel Thwaites 2022-07-25 20:38:43 +01:00
parent cd7b686352
commit a1c4e8179b
No known key found for this signature in database
GPG key ID: D8AFC4BF05670F9D
18 changed files with 498 additions and 385 deletions

View file

@ -91,3 +91,15 @@ a NixOS module; how to do this is shown in the example above.
};
}
```
### Enabling and disabling module
Each file in `modules/` corresponds to a single target, with the same name as
the file. A target is just something which can have styling applied to it.
Each target has an option like `stylix.targets.«target».enable` to turn its
styling on or off. By default, styling is turned on automatically when the
target is installed.
You can set `stylix.autoEnable = false` to opt out of this behaviour, in which
case you'll need to manually enable each target you want to be styled.

View file

@ -69,6 +69,7 @@
})
./stylix/fonts.nix
./stylix/pixel.nix
./stylix/target.nix
];
};
};

View file

@ -13,15 +13,20 @@ let
};
in
{
home-manager.sharedModules = [{
programs.alacritty.settings = {
font = {
normal = {
family = monospace.name;
style = "Regular";
options.stylix.targets.alacritty.enable =
config.lib.stylix.mkEnableTarget "Alacritty" true;
config = lib.mkIf config.stylix.targets.alacritty.enable {
home-manager.sharedModules = [{
programs.alacritty.settings = {
font = {
normal = {
family = monospace.name;
style = "Regular";
};
};
import = [ themeFile ];
};
import = [ themeFile ];
};
}];
}];
};
}

View file

@ -1,26 +1,27 @@
{ config, ... }:
{ config, lib, ... }:
with config.lib.stylix.colors;
{
console = {
colors = [
base00-hex
base08-hex
base0B-hex
base0A-hex
base0D-hex
base0E-hex
base0C-hex
base05-hex
base03-hex
base09-hex
base01-hex
base02-hex
base04-hex
base06-hex
base0F-hex
base07-hex
];
};
options.stylix.targets.console.enable =
config.lib.stylix.mkEnableTarget "the Linux kernel console" true;
config.console.colors = lib.mkIf config.stylix.targets.console.enable [
base00-hex
base08-hex
base0B-hex
base0A-hex
base0D-hex
base0E-hex
base0C-hex
base05-hex
base03-hex
base09-hex
base01-hex
base02-hex
base04-hex
base06-hex
base0F-hex
base07-hex
];
}

View file

@ -1,33 +1,38 @@
{ config, ... }:
{ config, lib, ... }:
with config.lib.stylix.colors.withHashtag;
with config.stylix.fonts;
{
home-manager.sharedModules = [{
services.dunst.settings = {
global = {
separator_color = base02;
font = sansSerif.name;
};
options.stylix.targets.dunst.enable =
config.lib.stylix.mkEnableTarget "Dunst" true;
urgency_low = {
background = base01;
foreground = base05;
frame_color = base0B;
};
config = lib.mkIf config.stylix.targets.dunst.enable {
home-manager.sharedModules = [{
services.dunst.settings = {
global = {
separator_color = base02;
font = sansSerif.name;
};
urgency_normal = {
background = base01;
foreground = base05;
frame_color = base0E;
};
urgency_low = {
background = base01;
foreground = base05;
frame_color = base0B;
};
urgency_critical = {
background = base01;
foreground = base05;
frame_color = base08;
urgency_normal = {
background = base01;
foreground = base05;
frame_color = base0E;
};
urgency_critical = {
background = base01;
foreground = base05;
frame_color = base08;
};
};
};
}];
}];
};
}

View file

@ -1,11 +1,12 @@
{ pkgs, config, lib, ... }:
with lib;
{
options.stylix.targets.feh.enable =
config.lib.stylix.mkEnableTarget
"the desktop background using Feh"
(with config.services.xserver.windowManager; xmonad.enable || i3.enable);
with config.services.xserver.windowManager;
let enable = xmonad.enable || i3.enable;
in {
services.xserver.displayManager.sessionCommands = mkIf enable
config.services.xserver.displayManager.sessionCommands =
lib.mkIf config.stylix.targets.feh.enable
"${pkgs.feh}/bin/feh --no-fehbg --bg-scale ${config.stylix.image}";
}

View file

@ -1,4 +1,4 @@
{ pkgs, config, ... }:
{ pkgs, config, lib, ... }:
let
theme = config.lib.stylix.colors {
@ -16,9 +16,14 @@ let
'';
in {
programs.fish.promptInit = promptInit;
options.stylix.targets.fish.enable =
config.lib.stylix.mkEnableTarget "Fish" true;
home-manager.sharedModules = [{
programs.fish.interactiveShellInit = promptInit;
}];
config = lib.mkIf config.stylix.targets.fish.enable {
programs.fish.promptInit = promptInit;
home-manager.sharedModules = [{
programs.fish.interactiveShellInit = promptInit;
}];
};
}

View file

@ -1,4 +1,4 @@
{ pkgs, config, ... }:
{ pkgs, config, lib, ... }:
with config.lib.stylix;
with config.stylix.fonts;
@ -23,7 +23,10 @@ let
'';
in {
boot.loader.grub = {
options.stylix.targets.grub.enable =
config.lib.stylix.mkEnableTarget "GRUB" true;
config.boot.loader.grub = lib.mkIf config.stylix.targets.grub.enable {
backgroundColor = base00;
# Need to override the NixOS splash, this will match the background
splashImage = pixel "base00";

View file

@ -140,21 +140,27 @@ let
name = "Materia-compact";
};
# GTK will probably be unused without Xorg / Wayland.
# There isn't a single option which covers all Wayload compositors,
# and many of them don't have NixOS modules at all. Therefore, we use
# OpenGL as the next best condition to detect that Wayland is enabled.
in lib.mkIf (config.services.xserver.enable || config.hardware.opengl.enable) {
# Required for Home Manager's GTK settings to work
programs.dconf.enable = true;
in {
options.stylix.targets.gtk.enable =
config.lib.stylix.mkEnableTarget "the GTK theme"
# GTK will probably be unused without Xorg / Wayland.
# There isn't a single option which covers all Wayload compositors,
# and many of them don't have NixOS modules at all. Therefore, we use
# OpenGL as the next best condition to detect that Wayland is enabled.
(config.services.xserver.enable || config.hardware.opengl.enable);
home-manager.sharedModules = [{
gtk = {
enable = true;
inherit theme;
font = config.stylix.fonts.sansSerif;
};
}];
config = lib.mkIf config.stylix.targets.gtk.enable {
# Required for Home Manager's GTK settings to work
programs.dconf.enable = true;
services.xserver.displayManager.lightdm.greeters.gtk.theme = theme;
home-manager.sharedModules = [{
gtk = {
enable = true;
inherit theme;
font = config.stylix.fonts.sansSerif;
};
}];
services.xserver.displayManager.lightdm.greeters.gtk.theme = theme;
};
}

View file

@ -1,4 +1,4 @@
{ config, ... }:
{ config, lib, ... }:
with config.lib.stylix.colors.withHashtag;
@ -99,10 +99,15 @@ let theme = {
};
in {
home-manager.sharedModules = [{
programs.helix = {
settings.theme = "stylix";
themes.stylix = theme;
};
}];
options.stylix.targets.helix.enable =
config.lib.stylix.mkEnableTarget "Helix" true;
config = lib.mkIf config.stylix.targets.helix.enable {
home-manager.sharedModules = [{
programs.helix = {
settings.theme = "stylix";
themes.stylix = theme;
};
}];
};
}

View file

@ -1,43 +1,48 @@
{ config, ... }:
{ config, lib, ... }:
{
home-manager.sharedModules = [{
programs.kitty = {
font = config.stylix.fonts.monospace;
options.stylix.targets.kitty.enable =
config.lib.stylix.mkEnableTarget "Kitty" true;
settings = with config.lib.stylix.colors.withHashtag; {
# Based on https://github.com/kdrag0n/base16-kitty/
active_border_color = base03;
active_tab_background = base00;
active_tab_foreground = base05;
background = base00;
cursor = base05;
foreground = base05;
inactive_border_color = base01;
inactive_tab_background = base01;
inactive_tab_foreground = base04;
selection_background = base05;
selection_foreground = base00;
tab_bar_background = base01;
url_color = base04;
config = lib.mkIf config.stylix.targets.kitty.enable {
home-manager.sharedModules = [{
programs.kitty = {
font = config.stylix.fonts.monospace;
color0 = base00;
color1 = base08;
color2 = base0B;
color3 = base0A;
color4 = base0D;
color5 = base0E;
color6 = base0C;
color7 = base05;
color8 = base03;
color9 = base09;
color10 = base01;
color11 = base02;
color12 = base04;
color13 = base06;
color14 = base0F;
color15 = base07;
settings = with config.lib.stylix.colors.withHashtag; {
# Based on https://github.com/kdrag0n/base16-kitty/
active_border_color = base03;
active_tab_background = base00;
active_tab_foreground = base05;
background = base00;
cursor = base05;
foreground = base05;
inactive_border_color = base01;
inactive_tab_background = base01;
inactive_tab_foreground = base04;
selection_background = base05;
selection_foreground = base00;
tab_bar_background = base01;
url_color = base04;
color0 = base00;
color1 = base08;
color2 = base0B;
color3 = base0A;
color4 = base0D;
color5 = base0E;
color6 = base0C;
color7 = base05;
color8 = base03;
color9 = base09;
color10 = base01;
color11 = base02;
color12 = base04;
color13 = base06;
color14 = base0F;
color15 = base07;
};
};
};
}];
}];
};
}

View file

@ -1,5 +1,9 @@
{ config, ... }:
{ config, lib, ... }:
{
services.xserver.displayManager.lightdm.background = config.stylix.image;
options.stylix.targets.lightdm.enable =
config.lib.stylix.mkEnableTarget "LightDM" true;
config.services.xserver.displayManager.lightdm.background =
lib.mkIf config.stylix.targets.lightdm.enable config.stylix.image;
}

View file

@ -1,4 +1,4 @@
{ config, pkgs, ... }:
{ config, pkgs, lib, ... }:
with config.lib.stylix.colors;
@ -26,7 +26,10 @@ let
'';
in {
boot.plymouth = {
options.stylix.targets.plymouth.enable =
config.lib.stylix.mkEnableTarget "the Plymouth boot screen" true;
config.boot.plymouth = lib.mkIf config.stylix.targets.plymouth.enable {
theme = "stylix";
themePackages = [ theme ];
};

View file

@ -1,4 +1,4 @@
{ config, ... }:
{ config, lib, ... }:
with config.stylix.fonts;
with config.lib.stylix.colors.withHashtag;
@ -15,160 +15,175 @@ let
error = base08;
in {
home-manager.sharedModules = [{
programs.qutebrowser.settings = {
hints.border = background;
colors = {
completion = {
fg = foreground;
odd.bg = secondary-background;
even.bg = background;
match.fg = info;
category = {
fg = info;
bg = background;
border.top = background;
border.bottom = background;
};
item.selected = {
options.stylix.targets.qutebrowser.enable =
config.lib.stylix.mkEnableTarget "Qutebrowser" true;
config = lib.mkIf config.stylix.targets.qutebrowser.enable {
home-manager.sharedModules = [{
programs.qutebrowser.settings = {
hints.border = background;
colors = {
completion = {
fg = foreground;
bg = selection-background;
border.top = selection-background;
border.bottom = selection-background;
odd.bg = secondary-background;
even.bg = background;
match.fg = info;
category = {
fg = info;
bg = background;
border.top = background;
border.bottom = background;
};
item.selected = {
fg = foreground;
bg = selection-background;
border.top = selection-background;
border.bottom = selection-background;
};
scrollbar = {
fg = foreground;
bg = background;
};
};
scrollbar = {
fg = foreground;
bg = background;
contextmenu = {
disabled = {
fg = inverted-foreground;
bg = secondary-background;
};
menu = {
bg = background;
fg = foreground;
};
selected = {
bg = selection-background;
fg = foreground;
};
};
};
contextmenu = {
disabled = {
fg = inverted-foreground;
bg = secondary-background;
downloads = {
bar.bg = background;
start = {
fg = inverted-foreground;
bg = info;
};
stop = {
fg = inverted-foreground;
bg = secondary-info;
};
error = {
fg = inverted-foreground;
bg = error;
};
};
menu = {
bg = background;
fg = foreground;
};
selected = {
bg = selection-background;
fg = foreground;
};
};
downloads = {
bar.bg = background;
start = {
fg = inverted-foreground;
bg = info;
};
stop = {
fg = inverted-foreground;
bg = secondary-info;
};
error = {
fg = inverted-foreground;
bg = error;
};
};
hints = {
fg = foreground;
bg = secondary-background;
match.fg = info;
};
keyhint = {
fg = foreground;
bg = background;
suffix.fg = foreground;
};
messages = {
error = {
fg = inverted-foreground;
bg = error;
border = error;
};
warning = {
fg = inverted-foreground;
bg = warning;
border = warning;
};
info = {
fg = inverted-foreground;
bg = info;
border = info;
};
};
prompts = {
fg = foreground;
bg = background;
border = background;
selected.bg = secondary-background;
};
statusbar = {
normal = {
fg = foreground;
bg = background;
};
insert = {
fg = inverted-foreground;
bg = info;
};
passthrough = {
fg = inverted-foreground;
bg = secondary-info;
};
private = {
hints = {
fg = foreground;
bg = secondary-background;
match.fg = info;
};
command = {
keyhint = {
fg = foreground;
bg = background;
suffix.fg = foreground;
};
messages = {
error = {
fg = inverted-foreground;
bg = error;
border = error;
};
warning = {
fg = inverted-foreground;
bg = warning;
border = warning;
};
info = {
fg = inverted-foreground;
bg = info;
border = info;
};
};
prompts = {
fg = foreground;
bg = background;
border = background;
selected.bg = secondary-background;
};
statusbar = {
normal = {
fg = foreground;
bg = background;
};
insert = {
fg = inverted-foreground;
bg = info;
};
passthrough = {
fg = inverted-foreground;
bg = secondary-info;
};
private = {
fg = foreground;
bg = secondary-background;
};
};
caret = {
fg = foreground;
bg = selection-background;
selection = {
command = {
fg = foreground;
bg = background;
private = {
fg = foreground;
bg = secondary-background;
};
};
caret = {
fg = foreground;
bg = selection-background;
selection = {
fg = foreground;
bg = selection-background;
};
};
progress.bg = info;
url = {
fg = foreground;
error.fg = error;
hover.fg = foreground;
success.http.fg = secondary-info;
success.https.fg = info;
warn.fg = warning;
};
};
progress.bg = info;
url = {
fg = foreground;
error.fg = error;
hover.fg = foreground;
success.http.fg = secondary-info;
success.https.fg = info;
warn.fg = warning;
};
};
tabs = {
bar.bg = background;
indicator = {
start = secondary-info;
stop = info;
error = error;
};
odd = {
fg = foreground;
bg = background;
};
even = {
fg = foreground;
bg = secondary-background;
};
pinned = {
even = {
fg = inverted-foreground;
bg = info;
tabs = {
bar.bg = background;
indicator = {
start = secondary-info;
stop = info;
error = error;
};
odd = {
fg = inverted-foreground;
bg = secondary-info;
fg = foreground;
bg = background;
};
even = {
fg = foreground;
bg = secondary-background;
};
pinned = {
even = {
fg = inverted-foreground;
bg = info;
};
odd = {
fg = inverted-foreground;
bg = secondary-info;
};
selected = {
even = {
fg = foreground;
bg = selection-background;
};
odd = {
fg = foreground;
bg = selection-background;
};
};
};
selected = {
even = {
@ -181,30 +196,20 @@ in {
};
};
};
selected = {
even = {
fg = foreground;
bg = selection-background;
};
odd = {
fg = foreground;
bg = selection-background;
};
};
fonts = {
default_family = sansSerif.name;
web.family = {
cursive = serif.name;
fantasy = serif.name;
fixed = monospace.name;
sans_serif = sansSerif.name;
serif = serif.name;
standard = sansSerif.name;
};
};
};
fonts = {
default_family = sansSerif.name;
web.family = {
cursive = serif.name;
fantasy = serif.name;
fixed = monospace.name;
sans_serif = sansSerif.name;
serif = serif.name;
standard = sansSerif.name;
};
};
};
}];
}];
};
}

View file

@ -1,4 +1,4 @@
{ config, ... }:
{ config, lib, ... }:
with config.lib.stylix.colors.withHashtag;
@ -14,77 +14,82 @@ let
};
in {
home-manager.sharedModules = [{
wayland.windowManager.sway.config = {
options.stylix.targets.sway.enable =
config.lib.stylix.mkEnableTarget "Sway" true;
config = {
home-manager.sharedModules = lib.mkIf config.stylix.targets.sway.enable [{
wayland.windowManager.sway.config = {
inherit fonts;
colors = let
background = base00;
indicator = base0B;
in {
inherit background;
urgent = {
inherit background indicator text;
border = urgent;
childBorder = urgent;
};
focused = {
inherit background indicator text;
border = focused;
childBorder = focused;
};
focusedInactive = {
inherit background indicator text;
border = unfocused;
childBorder = unfocused;
};
unfocused = {
inherit background indicator text;
border = unfocused;
childBorder = unfocused;
};
placeholder = {
inherit background indicator text;
border = unfocused;
childBorder = unfocused;
};
};
output."*".bg = "${config.stylix.image} fill";
};
}];
# Merge this with your bar configuration using //config.lib.stylix.sway.bar
lib.stylix.sway.bar = {
inherit fonts;
colors = let
background = base00;
indicator = base0B;
background = base01;
border = background;
in {
inherit background;
urgent = {
inherit background indicator text;
border = urgent;
childBorder = urgent;
statusline = text;
separator = base03;
focusedWorkspace = {
inherit text border;
background = focused;
};
focused = {
inherit background indicator text;
border = focused;
childBorder = focused;
activeWorkspace = {
inherit text border;
background = unfocused;
};
focusedInactive = {
inherit background indicator text;
border = unfocused;
childBorder = unfocused;
inactiveWorkspace = {
inherit text border;
background = unfocused;
};
unfocused = {
inherit background indicator text;
border = unfocused;
childBorder = unfocused;
urgentWorkspace = {
inherit text border;
background = urgent;
};
placeholder = {
inherit background indicator text;
border = unfocused;
childBorder = unfocused;
bindingMode = {
inherit text border;
background = urgent;
};
};
output."*".bg = "${config.stylix.image} fill";
};
}];
# Merge this with your bar configuration using //config.lib.stylix.sway.bar
lib.stylix.sway.bar = {
inherit fonts;
colors = let
background = base01;
border = background;
in {
inherit background;
statusline = text;
separator = base03;
focusedWorkspace = {
inherit text border;
background = focused;
};
activeWorkspace = {
inherit text border;
background = unfocused;
};
inactiveWorkspace = {
inherit text border;
background = unfocused;
};
urgentWorkspace = {
inherit text border;
background = urgent;
};
bindingMode = {
inherit text border;
background = urgent;
};
};
};
}

View file

@ -10,36 +10,41 @@ let
negative = base08-hex;
in {
home-manager.sharedModules = [(
{ options, ... }:
{
# See https://github.com/danth/stylix/issues/8#issuecomment-1194484544
# This check can be removed when programs.swaylock is in a stable release
programs.swaylock.settings = lib.mkIf (options.programs ? swaylock) {
image = config.stylix.image;
scaling = "fill";
inside-color = inside;
inside-clear-color = inside;
inside-caps-lock-color = inside;
inside-ver-color = inside;
inside-wrong-color = inside;
key-hl-color = positive;
layout-bg-color = inside;
layout-border-color = ring;
layout-text-color = text;
line-uses-inside = true;
ring-color = ring;
ring-clear-color = negative;
ring-caps-lock-color = ring;
ring-ver-color = positive;
ring-wrong-color = negative;
separator-color = "00000000";
text-color = text;
text-clear-color = text;
text-caps-lock-color = text;
text-ver-color = text;
text-wrong-color = text;
};
}
)];
options.stylix.targets.swaylock.enable =
config.lib.stylix.mkEnableTarget "Swaylock" true;
config = lib.mkIf config.stylix.targets.swaylock.enable {
home-manager.sharedModules = [(
{ options, ... }:
{
# See https://github.com/danth/stylix/issues/8#issuecomment-1194484544
# This check can be removed when programs.swaylock is in a stable release
programs.swaylock.settings = lib.mkIf (options.programs ? swaylock) {
image = config.stylix.image;
scaling = "fill";
inside-color = inside;
inside-clear-color = inside;
inside-caps-lock-color = inside;
inside-ver-color = inside;
inside-wrong-color = inside;
key-hl-color = positive;
layout-bg-color = inside;
layout-border-color = ring;
layout-text-color = text;
line-uses-inside = true;
ring-color = ring;
ring-clear-color = negative;
ring-caps-lock-color = ring;
ring-ver-color = positive;
ring-wrong-color = negative;
separator-color = "00000000";
text-color = text;
text-clear-color = text;
text-caps-lock-color = text;
text-ver-color = text;
text-wrong-color = text;
};
}
)];
};
}

View file

@ -34,8 +34,13 @@ let
};
in {
home-manager.sharedModules = [{
programs.vim = vimOptions;
programs.neovim = vimOptions;
}];
options.stylix.targets.vim.enable =
config.lib.stylix.mkEnableTarget "Vim and/or Neovim" true;
config = lib.mkIf config.stylix.targets.vim.enable {
home-manager.sharedModules = [{
programs.vim = vimOptions;
programs.neovim = vimOptions;
}];
};
}

37
stylix/target.nix Normal file
View file

@ -0,0 +1,37 @@
{ config, lib, ... }@args:
with lib;
{
options.stylix.autoEnable = mkOption {
description = "Whether to automatically enable styling for installed targets.";
type = types.bool;
default = true;
};
config.lib.stylix.mkEnableTarget =
humanName:
# If the module only touches options under its target (programs.target.*)
# then this can simply be `true`, as those options are already gated by the
# upstream enable option.
#
# Otherwise, use `config` to check whether the target is enabled.
#
# If some manual setup is required, or the module leads to the target
# being installed if it wasn't already, set this to `false`.
autoEnable:
mkOption {
description = "Whether to style ${humanName}.";
type = types.bool;
defaultText = ''
When <literal>stylix.autoEnable</literal> is <literal>true</literal>:
Enabled when ${humanName} is installed.
When <literal>stylix.autoEnable</literal> is <literal>false</literal>:
Defaults to <literal>false</literal>.
'';
default = config.stylix.autoEnable && autoEnable;
};
}