Compare commits

...

2 commits

Author SHA1 Message Date
2ac966be49
treewide: global refactor towards a better module structure
Initially, I was using a weird combination of options in order to apply
my theme dynamically. I was setting a read-only option from inside my
modules, which was then used in every application that required it. What
I ended up doing is refactoring everything in order to be inside of my
theme module, and automatically configured when enabled, without doing
any mkMerge/mkIf shenanigans in my other pieces of configuration. This
is healthier, although it should be split up as the theme/default.nix
got quite big.
2024-11-26 18:01:46 +01:00
84c8dc0920
treewide: implement notifications with swaync
Implemented notifications with SwayNotificationCenter, as well as theming using
the custom theme module. Some Waybar code had to be updated too, and was
also simplified in order to be more consistent with the new
SwayNotificationCenter implementation.
2024-11-26 15:47:10 +01:00
17 changed files with 975 additions and 591 deletions

View file

@ -14,17 +14,6 @@
dpi-aware = "auto"; dpi-aware = "auto";
font = "monospace:size=14"; font = "monospace:size=14";
}; };
colors = let
inherit (osConfig.theme.scheme) palette;
in {
background = "${palette.base00}ff";
text = "${palette.base05}ff";
input = "${palette.base05}ff";
selection = "${palette.base02}ff";
selection-text = "${palette.base07}ff";
selection-match = "${palette.base0D}ff";
border = "${palette.base0E}ff";
};
border.width = 5; border.width = 5;
}; };
}; };

View file

@ -1,18 +1,8 @@
{ {
pkgs, pkgs,
config, config,
osConfig,
lib,
... ...
}: let }: {
isDark = osConfig.theme.scheme.variant == "dark";
in {
home.pointerCursor = {
inherit (osConfig.theme.cursorTheme) name package size;
gtk.enable = true;
x11.enable = true;
};
gtk = { gtk = {
enable = true; enable = true;
@ -24,7 +14,6 @@ in {
gtk3.extraConfig = { gtk3.extraConfig = {
gtk-decoration-layout = ":menu"; gtk-decoration-layout = ":menu";
gtk-application-prefer-dark-theme = isDark;
}; };
gtk4.extraConfig = { gtk4.extraConfig = {
@ -32,21 +21,5 @@ in {
}; };
gtk2.configLocation = "${config.xdg.configHome}/gtk-2.0/gtkrc"; gtk2.configLocation = "${config.xdg.configHome}/gtk-2.0/gtkrc";
iconTheme = {
inherit (osConfig.theme.gtk.iconTheme) name package;
};
theme = lib.mkIf (!osConfig.services.xserver.desktopManager.gnome.enable) {
inherit (osConfig.theme.gtk.theme) name package;
};
};
dconf.settings = {
"org/gnome/desktop/interface" = {
color-scheme =
if isDark
then "prefer-dark"
else "default";
};
}; };
} }

View file

@ -1,68 +1,17 @@
{ _: {
osConfig,
lib,
lib',
...
}: let
inherit (osConfig.theme.scheme) palette;
inherit (lib) mkIf mkMerge;
inherit (lib') rgba;
in {
programs.zathura = { programs.zathura = {
enable = true; enable = true;
options = mkMerge [ options = {
{ font = "Inter 12";
font = "Inter 12"; selection-notification = true;
selection-notification = true;
selection-clipboard = "clipboard"; selection-clipboard = "clipboard";
adjust-open = "best-fit"; adjust-open = "best-fit";
pages-per-row = "1"; pages-per-row = "1";
scroll-page-aware = "true"; scroll-page-aware = "true";
scroll-full-overlap = "0.01"; scroll-full-overlap = "0.01";
scroll-step = "100"; scroll-step = "100";
zoom-min = "10"; zoom-min = "10";
} };
(mkIf osConfig.theme.enable {
default-fg = palette.base05;
default-bg = palette.base00;
completion-bg = palette.base02;
completion-fg = palette.base05;
completion-highlight-bg = palette.base03;
completion-highlight-fg = palette.base05;
completion-group-bg = palette.base02;
completion-group-fg = palette.base0D;
statusbar-fg = palette.base05;
statusbar-bg = palette.base02;
notification-bg = palette.base02;
notification-fg = palette.base05;
notification-error-bg = palette.base02;
notification-error-fg = palette.base08;
notification-warning-bg = palette.base02;
notification-warning-fg = palette.base0A;
inputbar-fg = palette.base05;
inputbar-bg = palette.base02;
recolor = true;
recolor-lightcolor = palette.base00;
recolor-darkcolor = palette.base05;
index-fg = palette.base05;
index-bg = palette.base00;
index-active-fg = palette.base05;
index-active-bg = palette.base02;
render-loading-bg = palette.base00;
render-loading-fg = palette.base05;
highlight-color = rgba lib palette.base03 ".5";
highlight-fg = rgba lib palette.base0E ".5";
highlight-active-color = rgba lib palette.base0E ".5";
})
];
}; };
} }

View file

@ -2,11 +2,8 @@
lib, lib,
pkgs, pkgs,
config, config,
osConfig,
... ...
}: let }: {
inherit (lib) mkMerge mkIf;
in {
imports = [./binds.nix]; imports = [./binds.nix];
xdg.portal = { xdg.portal = {
@ -22,85 +19,78 @@ in {
}; };
}; };
programs.niri = mkMerge [ programs.niri = {
{ settings = {
settings = { input = {
input = { power-key-handling.enable = false;
power-key-handling.enable = false; keyboard.xkb = {
keyboard.xkb = { layout = "us";
layout = "us"; options = "compose:ralt";
options = "compose:ralt";
};
};
prefer-no-csd = true;
hotkey-overlay.skip-at-startup = true;
layout = {
focus-ring = {
enable = true;
};
always-center-single-column = true;
};
# https://github.com/sodiboo/system/blob/2978f4d79c51a5bd7e38a9cd75e3ec9046aa7e75/niri.mod.nix#L418-L434
outputs = let
cfg = config.programs.niri.settings.outputs;
in {
"HDMI-A-1" = {
mode = {
width = 1920;
height = 1080;
refresh = 60.0;
};
position.x = -cfg."HDMI-A-1".mode.width;
position.y = 0;
};
"DP-1" = {
mode = {
width = 2560;
height = 1440;
refresh = 144.0;
};
position.x = 0;
position.y = 0;
};
};
window-rules = [
{
draw-border-with-background = false;
geometry-corner-radius = let
r = 8.0;
in {
top-left = r;
top-right = r;
bottom-left = r;
bottom-right = r;
};
clip-to-geometry = true;
}
{
matches = [
{app-id = "foot";}
];
default-column-width = {proportion = 0.5;};
}
];
environment = {
"NIXOS_OZONE_WL" = "1";
"DISPLAY" = ":0";
"_JAVA_AWT_WM_NONREPARENTING" = "1"; # https://wiki.archlinux.org/title/Sway#Java_applications
}; };
}; };
}
(mkIf osConfig.theme.enable (let prefer-no-csd = true;
inherit (osConfig.theme.scheme) palette; hotkey-overlay.skip-at-startup = true;
in {
settings.layout.focus-ring.active.color = palette.base0E; layout = {
})) focus-ring = {
]; enable = true;
};
always-center-single-column = true;
};
# https://github.com/sodiboo/system/blob/2978f4d79c51a5bd7e38a9cd75e3ec9046aa7e75/niri.mod.nix#L418-L434
outputs = let
cfg = config.programs.niri.settings.outputs;
in {
"HDMI-A-1" = {
mode = {
width = 1920;
height = 1080;
refresh = 60.0;
};
position.x = -cfg."HDMI-A-1".mode.width;
position.y = 0;
};
"DP-1" = {
mode = {
width = 2560;
height = 1440;
refresh = 144.0;
};
position.x = 0;
position.y = 0;
};
};
window-rules = [
{
draw-border-with-background = false;
geometry-corner-radius = let
r = 8.0;
in {
top-left = r;
top-right = r;
bottom-left = r;
bottom-right = r;
};
clip-to-geometry = true;
}
{
matches = [
{app-id = "foot";}
];
default-column-width = {proportion = 0.5;};
}
];
environment = {
"NIXOS_OZONE_WL" = "1";
"DISPLAY" = ":0";
"_JAVA_AWT_WM_NONREPARENTING" = "1"; # https://wiki.archlinux.org/title/Sway#Java_applications
};
};
};
# copied from https://github.com/linyinfeng/dotfiles/blob/c00fe3b1562ad947672863a43e455bc2f01a56b6/home-manager/profiles/niri/default.nix#L594-L611 # copied from https://github.com/linyinfeng/dotfiles/blob/c00fe3b1562ad947672863a43e455bc2f01a56b6/home-manager/profiles/niri/default.nix#L594-L611
systemd.user.services.xwayland-satellite = { systemd.user.services.xwayland-satellite = {

View file

@ -1,37 +0,0 @@
{
inputs,
config,
pkgs,
...
}: {
imports = [
inputs.plasma-manager.homeManagerModules.plasma-manager
];
rograms.plasma = {
enable = true;
workspace = {
lookAndFeel = "org.kde.breezedark.desktop";
inherit (config.theme) wallpaper;
};
input = {
touchpads = [
{
enable = true;
naturalScroll = true;
vendorId = "093a";
productId = "0274";
name = "PIXA3854:00 093A:0274 Touchpad";
}
];
keyboard = {
options = [
"compose:ralt"
];
};
};
};
home.packages = with pkgs; [
qalculate-qt
];
}

View file

@ -1,64 +1,24 @@
{ {pkgs, ...}: {
pkgs,
osConfig,
lib,
...
}: let
inherit (lib) mkMerge mkIf;
in {
# requires `security.pam.services.swaylock = { };` at the system level or else # requires `security.pam.services.swaylock = { };` at the system level or else
# unlock will not work. # unlock will not work.
programs.swaylock = { programs.swaylock = {
enable = true; enable = true;
package = pkgs.swaylock-effects; package = pkgs.swaylock-effects;
settings = mkMerge [ settings = {
{ clock = true;
clock = true; timestr = "%H:%M";
timestr = "%H:%M";
indicator = true; indicator = true;
indicator-radius = 111; indicator-radius = 111;
indicator-thickness = 9; indicator-thickness = 9;
screenshots = true; screenshots = true;
effect-blur = "7x5"; effect-blur = "7x5";
effect-vignette = "0.75:0.75"; effect-vignette = "0.75:0.75";
effect-pixelate = 5; effect-pixelate = 5;
ignore-empty-password = false; # needed for PAM to work with fprintd / password ignore-empty-password = false; # needed for PAM to work with fprintd / password
} };
(mkIf
osConfig.theme.enable
(let
inherit (osConfig.theme.scheme) palette;
in {
inside-color = palette.base01;
inside-clear-color = palette.base0C;
inside-caps-lock-color = palette.base09;
inside-ver-color = palette.base0D;
inside-wrong-color = palette.base08;
key-hl-color = palette.base0B;
layout-bg-color = palette.base00;
layout-border-color = palette.base05;
layout-text-color = palette.base07;
line-color = palette.base00;
line-clear-color = palette.base0C;
line-caps-lock-color = palette.base09;
line-ver-color = palette.base0D;
line-wrong-color = palette.base08;
ring-color = palette.base02;
ring-clear-color = palette.base0C;
ring-caps-lock-color = palette.base09;
ring-ver-color = palette.base0D;
ring-wrong-color = palette.base08;
separator-color = palette.base02;
text-color = palette.base07;
text-clear-color = palette.base04;
text-caps-lock-color = palette.base04;
text-ver-color = palette.base04;
text-wrong-color = palette.base04;
}))
];
}; };
} }

View file

@ -1,152 +1,174 @@
{ {
osConfig,
pkgs, pkgs,
lib, lib,
osConfig,
config,
... ...
}: let }: let
inherit (lib) getExe; inherit (lib) getExe mkMerge mkIf;
inherit (builtins) readFile;
in { in {
imports = [./style.nix];
programs.waybar = { programs.waybar = {
enable = true; enable = true;
systemd.enable = true; systemd.enable = true;
style = readFile ./style.css;
settings = { settings = {
mainBar = { mainBar = mkMerge [
layer = "top"; {
position = "top"; layer = "top";
height = 30; position = "top";
height = 30;
margin-top = 6; margin-top = 6;
margin-left = 6; margin-left = 6;
margin-right = 6; margin-right = 6;
margin-bottom = 0; margin-bottom = 0;
modules-left = ["niri/workspaces" "niri/window"]; modules-left = ["niri/workspaces" "niri/window"];
modules-center = ["group/clock"]; modules-center = ["group/clock"];
modules-right = ["tray" "group/status" "group/power"]; modules-right =
["tray" "group/status" "group/power"]
++ lib.optional config.services.swaync.enable "custom/notification";
battery = { battery = {
interval = 10; interval = 10;
states = { states = {
warning = 30; warning = 30;
critical = 15; critical = 15;
};
format = "{icon} {capacity}%";
format-charging = " {capacity}% - {time}";
format-full = " {capacity}% - Full";
format-icons = [
""
""
""
""
""
];
max-length = 25;
}; };
format = "{icon} {capacity}%";
format-charging = " {capacity}% - {time}";
format-full = " {capacity}% - Full";
format-icons = [
""
""
""
""
""
];
max-length = 25;
};
"niri/window" = { "pulseaudio" = {
icon = true; format = "{icon} {volume}%";
}; format-bluetooth = "{icon} {volume}%";
format-muted = " ";
"pulseaudio" = { format-icons = {
format = "{icon} {volume}%"; "alsa_output.pci-0000_00_1f.3.analog-stereo" = "";
format-bluetooth = "{icon} {volume}%"; "alsa_output.pci-0000_00_1f.3.analog-stereo-muted" = "";
format-muted = " "; headphone = "";
format-icons = { hands-free = "";
"alsa_output.pci-0000_00_1f.3.analog-stereo" = ""; headset = "";
"alsa_output.pci-0000_00_1f.3.analog-stereo-muted" = ""; phone = "";
headphone = ""; phone-muted = "";
hands-free = ""; portable = "";
headset = ""; car = "";
phone = ""; default = [
phone-muted = ""; ""
portable = ""; ""
car = ""; ];
default = [ };
"" scroll-step = 1;
"" on-click = "pavucontrol";
ignored-sinks = [
"Easy Effects Sink"
]; ];
}; };
scroll-step = 1;
on-click = "pavucontrol";
ignored-sinks = [
"Easy Effects Sink"
];
};
"power-profiles-daemon" = { "power-profiles-daemon" = {
format-icons = { format-icons = {
default = ""; default = "";
performance = ""; performance = "";
balanced = ""; balanced = "";
power-saver = ""; power-saver = "";
};
}; };
};
"group/status" = { "group/status" = {
orientation = "inherit"; orientation = "inherit";
modules = [ modules = [
"pulseaudio" "pulseaudio"
"power-profiles-daemon" "power-profiles-daemon"
"network" "network"
"battery" "battery"
]; ];
}; };
"group/power" = { "group/power" = {
orientation = "inherit"; orientation = "inherit";
modules = [ modules = [
"custom/power" "custom/power"
]; ];
}; };
"group/clock" = { "group/clock" = {
orientation = "inherit"; orientation = "inherit";
modules = [ modules = [
"clock#time" "clock#time"
"clock#date" "clock#date"
]; ];
}; };
"custom/power" = { "custom/power" = {
format = ""; format = "";
tooltip = false; tooltip = false;
on-click = getExe pkgs.wlogout; on-click = getExe pkgs.wlogout;
}; };
"clock#date" = { "clock#date" = {
format = "{:%D}"; format = "{:%D}";
tooltip-format = "<tt><big>{calendar}</big></tt>"; tooltip-format = "<tt><big>{calendar}</big></tt>";
}; };
"clock#time" = { "clock#time" = {
format = "{:%H:%M}"; format = "{:%H:%M}";
tooltip-format = "{tz_list}"; tooltip-format = "{tz_list}";
timezones = [ timezones = [
osConfig.time.timeZone osConfig.time.timeZone
"US/Eastern" "US/Eastern"
]; ];
}; };
network = { network = {
interface = "wlp1s0"; interface = "wlp1s0";
format = "{ifname}"; format = "{ifname}";
format-wifi = "{icon}"; format-wifi = "{icon}";
format-ethernet = "{ipaddr}/{cidr} 󰊗"; format-ethernet = "{ipaddr}/{cidr} 󰊗";
format-disconnected = ""; format-disconnected = "";
tooltip-format = "{ifname} via {gwaddr} 󰊗"; tooltip-format = "{ifname} via {gwaddr} 󰊗";
tooltip-format-wifi = "{essid} ({signalStrength}%)"; tooltip-format-wifi = "{essid} ({signalStrength}%)";
tooltip-format-ethernet = "{ifname} "; tooltip-format-ethernet = "{ifname} ";
tooltip-format-disconnected = "Disconnected"; tooltip-format-disconnected = "Disconnected";
max-length = 50; max-length = 50;
format-icons = [ format-icons = [
"󰤟" "󰤟"
"󰤢" "󰤢"
"󰤥" "󰤥"
"󰤨" "󰤨"
]; ];
}; };
}; }
(mkIf osConfig.programs.niri.enable {
"niri/window" = {
icon = true;
};
})
(mkIf config.services.swaync.enable {
"custom/notification" = {
tooltip = false;
format = "{icon}";
format-icons = {
notification = "󱅫";
none = "󰂚";
dnd-notification = "󱏧";
dnd-none = "󱏧";
};
return-type = "json";
exec = "swaync-client -swb";
on-click = "swaync-client -t -sw";
};
})
];
}; };
}; };

View file

@ -0,0 +1,91 @@
* {
/* `otf-font-awesome` is required to be installed for icons */
border: none;
border-radius: 0px;
min-height: 0;
}
window#waybar {
border-radius: 2em;
font-family: "Symbols Nerd Font", Inter, sans-serif;
font-size: 16px;
font-style: normal;
background: alpha(
@base00,
0.9999999
); /* niri issue workaround, thanks https://github.com/oatmealine/nix-config/blob/bfdddd2cb36ef659bcddc28e0dbb542b6db8b3bc/modules/desktop/themes/catppuccin/waybar.css#L14 */
color: @base05;
}
#workspaces,
.modules-right box {
background: @base02;
padding: 0.15em 0.25em;
border-radius: 1em;
margin: 0 0.25em;
}
#workspaces {
padding: 0;
background: @base02;
}
#workspaces button:nth-child(1) {
border-top-left-radius: 1em;
border-bottom-left-radius: 1em;
}
#workspaces button:nth-last-child(1) {
border-top-right-radius: 1em;
border-bottom-right-radius: 1em;
}
#workspaces button {
padding: 0 0.5em;
background-color: transparent;
}
#workspaces button:hover {
background: rgba(255, 255, 255, 0.1);
box-shadow: none;
}
#workspaces button.active {
background: @base0E;
color: @base02;
}
#workspaces button.urgent {
background: @base08;
}
#window {
margin-left: 1em;
}
.modules-left,
.modules-right {
margin: 0.4em 0.5em;
}
#battery,
#clock,
#network,
#pulseaudio,
#tray,
#power-profiles-daemon {
padding: 0 0.5em;
}
.modules-left,
.modules-right {
margin: 0.4em 0.5em;
}
#custom-power {
padding: 0 1.2em;
color: @base08;
}
#custom-notification {
padding: 0 1.2em;
}

View file

@ -1,106 +0,0 @@
{
lib,
osConfig,
...
}: let
inherit (osConfig.theme.scheme) palette;
inherit (lib) mapAttrsToList concatLines optionalString;
generateGtkColors = palette: (concatLines
(mapAttrsToList
(name: color: "@define-color ${name} ${color};")
palette));
in {
programs.waybar.style =
optionalString osConfig.theme.enable generateGtkColors palette
+ ''
* {
/* `otf-font-awesome` is required to be installed for icons */
border: none;
border-radius: 0px;
min-height: 0;
}
window#waybar {
border-radius: 2em;
font-family: "Symbols Nerd Font", Inter, sans-serif;
font-size: 16px;
font-style: normal;
background: alpha(
@base00,
0.9999999
); /* niri issue workaround, thanks https://github.com/oatmealine/nix-config/blob/bfdddd2cb36ef659bcddc28e0dbb542b6db8b3bc/modules/desktop/themes/catppuccin/waybar.css#L14 */
color: @base05;
}
#workspaces,
.modules-right box {
background: @base02;
padding: 0.15em 0.25em;
border-radius: 1em;
margin: 0 0.25em;
}
#workspaces {
padding: 0;
background: @base02;
}
#workspaces button:nth-child(1) {
border-top-left-radius: 1em;
border-bottom-left-radius: 1em;
}
#workspaces button:nth-last-child(1) {
border-top-right-radius: 1em;
border-bottom-right-radius: 1em;
}
#workspaces button {
padding: 0 0.5em;
background-color: transparent;
}
#workspaces button:hover {
background: rgba(255, 255, 255, 0.1);
box-shadow: none;
}
#workspaces button.active {
background: @base0E;
color: @base02;
}
#workspaces button.urgent {
background: @base08;
}
#window {
margin-left: 1em;
}
.modules-left,
.modules-right {
margin: 0.4em 0.5em;
}
#battery,
#clock,
#network,
#pulseaudio,
#tray,
#power-profiles-daemon {
padding: 0 0.5em;
}
.modules-left,
.modules-right {
margin: 0.4em 0.5em;
}
#custom-power {
padding: 0 1.2em;
color: @base08;
}
'';
}

View file

@ -0,0 +1,33 @@
{
osConfig,
lib,
lib',
...
}: let
inherit (lib) optionalString;
inherit (builtins) readFile;
in {
services.swaync = {
enable = true;
style = readFile ./style.css;
settings = {
positionX = "right";
positionY = "top";
layer = "overlay";
control-center-layer = "top";
layer-shell = true;
cssPriority = "application";
control-center-margin-top = 0;
control-center-margin-bottom = 0;
control-center-margin-right = 0;
control-center-margin-left = 0;
notification-2fa-action = true;
notification-inline-replies = false;
notification-icon-size = 64;
notification-body-image-height = 100;
notification-body-image-width = 200;
};
};
# systemd.user.services.swaync.Service.Environment = "WAYLAND_DISPLAY=wayland-1";
systemd.user.services.swaync.Unit.ConditionEnvironment = lib.mkForce "";
}

View file

@ -0,0 +1,450 @@
* {
all: unset;
font-size: 14px;
font-family: "Ubuntu Nerd Font";
transition:
background 200ms,
border-radius 200ms; /* exclude color from transition so it looks more natural */
}
trough highlight {
background: @base05;
}
scale trough {
margin: 0rem 1rem;
background-color: @base02;
min-height: 8px;
min-width: 70px;
}
slider {
background-color: @base0D;
}
.floating-notifications.background .notification-row .notification-background {
box-shadow:
0 0 8px 0 rgba(0, 0, 0, 0.8),
inset 0 0 0 1px @base02;
border-radius: 12.6px;
margin: 18px;
background-color: @base00;
color: @base05;
padding: 0;
}
.floating-notifications.background
.notification-row
.notification-background
.notification {
padding: 7px;
border-radius: 12.6px;
}
.floating-notifications.background
.notification-row
.notification-background
.notification.critical {
box-shadow: inset 0 0 7px 0 @base08;
}
.floating-notifications.background
.notification-row
.notification-background
.notification
.notification-content {
margin: 7px;
}
.floating-notifications.background
.notification-row
.notification-background
.notification
.notification-content
.summary {
color: @base05;
}
.floating-notifications.background
.notification-row
.notification-background
.notification
.notification-content
.time {
color: @base03;
}
.floating-notifications.background
.notification-row
.notification-background
.notification
.notification-content
.body {
color: @base05;
}
.floating-notifications.background
.notification-row
.notification-background
.notification
> *:last-child
> * {
min-height: 3.4em;
}
.floating-notifications.background
.notification-row
.notification-background
.notification
> *:last-child
> *
.notification-action {
border-radius: 7px;
color: @base05;
background-color: @base02;
box-shadow: inset 0 0 0 1px @base03;
margin: 7px;
}
.floating-notifications.background
.notification-row
.notification-background
.notification
> *:last-child
> *
.notification-action:hover {
box-shadow: inset 0 0 0 1px @base03;
background-color: @base02;
color: @base05;
}
.floating-notifications.background
.notification-row
.notification-background
.notification
> *:last-child
> *
.notification-action:active {
box-shadow: inset 0 0 0 1px @base03;
background-color: @base0C;
color: @base05;
}
.floating-notifications.background
.notification-row
.notification-background
.close-button {
margin: 7px;
padding: 2px;
border-radius: 6.3px;
color: @base00;
background-color: @base08;
}
.floating-notifications.background
.notification-row
.notification-background
.close-button:hover {
background-color: @base08;
color: @base00;
}
.floating-notifications.background
.notification-row
.notification-background
.close-button:active {
background-color: @base08;
color: @base00;
}
.control-center {
box-shadow:
0 0 8px 0 rgba(0, 0, 0, 0.8),
inset 0 0 0 1px @base02;
border-radius: 12.6px;
margin: 18px;
background-color: @base00;
color: @base05;
padding: 14px;
}
.control-center .widget-title > label {
color: @base05;
font-size: 1.3em;
}
.control-center .widget-title button {
border-radius: 7px;
color: @base05;
background-color: @base02;
box-shadow: inset 0 0 0 1px @base03;
padding: 8px;
}
.control-center .widget-title button:hover {
box-shadow: inset 0 0 0 1px @base03;
background-color: @base04;
color: @base05;
}
.control-center .widget-title button:active {
box-shadow: inset 0 0 0 1px @base03;
background-color: @base0C;
color: @base00;
}
.control-center .notification-row .notification-background {
border-radius: 7px;
color: @base05;
background-color: @base02;
box-shadow: inset 0 0 0 1px @base03;
margin-top: 14px;
}
.control-center .notification-row .notification-background .notification {
padding: 7px;
border-radius: 7px;
}
.control-center
.notification-row
.notification-background
.notification.critical {
box-shadow: inset 0 0 7px 0 @base08;
}
.control-center
.notification-row
.notification-background
.notification
.notification-content {
margin: 7px;
}
.control-center
.notification-row
.notification-background
.notification
.notification-content
.summary {
color: @base05;
}
.control-center
.notification-row
.notification-background
.notification
.notification-content
.time {
color: @base03;
}
.control-center
.notification-row
.notification-background
.notification
.notification-content
.body {
color: @base05;
}
.control-center
.notification-row
.notification-background
.notification
> *:last-child
> * {
min-height: 3.4em;
}
.control-center
.notification-row
.notification-background
.notification
> *:last-child
> *
.notification-action {
border-radius: 7px;
color: @base05;
background-color: @base00;
box-shadow: inset 0 0 0 1px @base03;
margin: 7px;
}
.control-center
.notification-row
.notification-background
.notification
> *:last-child
> *
.notification-action:hover {
box-shadow: inset 0 0 0 1px @base03;
background-color: @base02;
color: @base05;
}
.control-center
.notification-row
.notification-background
.notification
> *:last-child
> *
.notification-action:active {
box-shadow: inset 0 0 0 1px @base03;
background-color: @base0C;
color: @base05;
}
.control-center .notification-row .notification-background .close-button {
margin: 7px;
padding: 2px;
border-radius: 6.3px;
color: @base00;
background-color: @base08;
}
.control-center .notification-row .notification-background .close-button:hover {
background-color: @base08;
color: @base00;
}
.control-center
.notification-row
.notification-background
.close-button:active {
background-color: @base08;
color: @base00;
}
.control-center .notification-row .notification-background:hover {
box-shadow: inset 0 0 0 1px @base03;
background-color: @base04;
color: @base05;
}
.control-center .notification-row .notification-background:active {
box-shadow: inset 0 0 0 1px @base03;
background-color: @base0C;
color: @base05;
}
.notification.critical progress {
background-color: @base08;
}
.notification.low progress,
.notification.normal progress {
background-color: @base0D;
}
.control-center-dnd {
margin-top: 5px;
border-radius: 8px;
background: @base02;
border: 1px solid @base03;
box-shadow: none;
}
.control-center-dnd:checked {
background: @base0C;
}
.control-center-dnd slider {
background: @base0C;
border-radius: 8px;
}
.widget-dnd {
margin: 0px;
font-size: 1.1rem;
}
.widget-dnd > switch {
font-size: initial;
border-radius: 8px;
background: @base02;
border: 1px solid @base03;
box-shadow: none;
}
.widget-dnd > switch:checked {
background: @base0C;
color: @base00;
}
.widget-dnd > switch slider {
background: @base03;
border-radius: 8px;
border: 1px solid @base03;
}
.widget-mpris .widget-mpris-player {
background: @base02;
padding: 7px;
}
.widget-mpris .widget-mpris-title {
font-size: 1.2rem;
}
.widget-mpris .widget-mpris-subtitle {
font-size: 0.8rem;
}
.widget-menubar > box > .menu-button-bar > button > label {
font-size: 3rem;
padding: 0.5rem 2rem;
}
.widget-menubar > box > .menu-button-bar > :last-child {
color: @base08;
}
.power-buttons button:hover,
.powermode-buttons button:hover,
.screenshot-buttons button:hover {
background: @base02;
}
.control-center .widget-label > label {
color: @base05;
font-size: 2rem;
}
.widget-buttons-grid {
padding-top: 1rem;
}
.widget-buttons-grid > flowbox > flowboxchild > button label {
font-size: 2.5rem;
}
.widget-volume {
padding-top: 1rem;
}
.widget-volume label {
font-size: 1.5rem;
color: @base0C;
}
.widget-volume trough highlight {
background: @base0C;
}
.widget-backlight trough highlight {
background: @base0A;
}
.widget-backlight label {
font-size: 1.5rem;
color: @base0A;
}
.widget-backlight .KB {
padding-bottom: 1rem;
}
.image {
padding-right: 0.5rem;
}

View file

@ -4,7 +4,6 @@
lib, lib,
... ...
}: let }: let
inherit (lib) mkIf;
in { in {
programs.foot = { programs.foot = {
enable = true; enable = true;
@ -14,33 +13,6 @@ in {
font = "monospace:size=14"; font = "monospace:size=14";
shell = "${lib.getExe config.programs.fish.package}"; shell = "${lib.getExe config.programs.fish.package}";
}; };
colors = mkIf osConfig.theme.enable (let
inherit (lib) mapAttrs;
inherit (lib.strings) removePrefix;
# because someone thought this was a great idea: https://github.com/tinted-theming/schemes/commit/61058a8d2e2bd4482b53d57a68feb56cdb991f0b
palette = mapAttrs (_: color: removePrefix "#" color) osConfig.theme.scheme.palette;
in {
background = palette.base00;
foreground = palette.base05;
regular0 = palette.base01;
regular1 = palette.base08;
regular2 = palette.base0B;
regular3 = palette.base0A;
regular4 = palette.base0D;
regular5 = palette.base0E;
regular6 = palette.base0C;
regular7 = palette.base06;
bright0 = palette.base02;
bright1 = palette.base08;
bright2 = palette.base0B;
bright3 = palette.base0A;
bright4 = palette.base0D;
bright5 = palette.base0E;
bright6 = palette.base0C;
bright7 = palette.base07;
});
}; };
}; };
} }

View file

@ -1,8 +1,4 @@
{ _: {
config,
inputs,
...
}: {
programs.gnome-terminal = { programs.gnome-terminal = {
enable = true; enable = true;
showMenubar = true; showMenubar = true;
@ -14,14 +10,6 @@
boldIsBright = true; boldIsBright = true;
visibleName = "default"; visibleName = "default";
font = "Intel One Mono 14"; font = "Intel One Mono 14";
colors = let
inherit (inputs.basix.schemeData.base16.${config.theme.scheme}) palette;
in {
backgroundColor = "#${palette.base00}";
foregroundColor = builtins.trace "#${palette.base05}" "#${palette.base05}";
palette = builtins.attrValues (builtins.mapAttrs (_: color: "#${color}") palette);
};
}; };
}; };
}; };

View file

@ -1,37 +0,0 @@
{
config,
inputs,
pkgs,
...
}: {
programs.konsole = let
inherit (config.theme) scheme;
schemeData = inputs.basix.schemeData.base16.${scheme};
in {
enable = true;
defaultProfile = "default";
profiles = {
default = {
font = {
name = "monospace";
size = 14;
};
colorScheme = schemeData.name;
};
};
extraConfig = {
"MainWindow" = {
"MenuBar" = "Disabled";
"ToolBarsMovable" = "Disabled";
};
"KonsoleWindow" = {
"ShowMenuBarByDefault" = "false";
};
};
customColorSchemes = {
"${schemeData.name}" = pkgs.lib.mkKonsoleColorScheme schemeData;
};
};
}

View file

@ -35,6 +35,7 @@ in {
"${home}/programs/niri" "${home}/programs/niri"
"${home}/programs/waybar" "${home}/programs/waybar"
"${home}/services/swaync"
"${home}/programs/fuzzel.nix" "${home}/programs/fuzzel.nix"
"${home}/programs/swaybg.nix" "${home}/programs/swaybg.nix"
"${home}/programs/swaylock.nix" "${home}/programs/swaylock.nix"

View file

@ -50,6 +50,11 @@ let
'' ''
magick ${path} -gaussian-blur 0x12 "$out" magick ${path} -gaussian-blur 0x12 "$out"
''; '';
generateGtkColors = lib: palette: (lib.concatLines
(lib.mapAttrsToList
(name: color: "@define-color ${name} ${color};")
palette));
in { in {
inherit blurImage rgba; inherit blurImage generateGtkColors rgba;
} }

View file

@ -2,11 +2,13 @@
inputs, inputs,
config, config,
lib, lib,
lib',
pkgs, pkgs,
... ...
}: let }: let
inherit (lib) mkEnableOption mkOption mkIf attrNames; inherit (lib) mkEnableOption mkOption mkIf attrNames;
inherit (lib.types) path package enum; inherit (lib.types) path package enum;
inherit (lib') generateGtkColors;
cfg = config.theme; cfg = config.theme;
in { in {
imports = [./gtk.nix]; imports = [./gtk.nix];
@ -21,14 +23,6 @@ in {
default = "catppuccin-macchiato"; default = "catppuccin-macchiato";
}; };
scheme = mkOption {
description = ''
Resolved scheme from the tinted-theming library.
'';
readOnly = true;
type = lib.types.attrs;
};
wallpaper = mkOption { wallpaper = mkOption {
description = '' description = ''
Location of the wallpaper that will be used throughout the system. Location of the wallpaper that will be used throughout the system.
@ -63,7 +57,154 @@ in {
}; };
}; };
}; };
config.theme = mkIf cfg.enable { config = let
scheme = inputs.basix.schemeData.base16.${config.theme.schemeName}; scheme = inputs.basix.schemeData.base16.${config.theme.schemeName};
}; in
mkIf cfg.enable
{
home-manager.users.nezia = {
home.pointerCursor = {
inherit (config.theme.cursorTheme) name package size;
};
gtk = {
iconTheme = {
inherit (config.theme.gtk.iconTheme) name package;
};
theme = lib.mkIf (!config.services.xserver.desktopManager.gnome.enable) {
inherit (config.theme.gtk.theme) name package;
};
gtk3.extraConfig = {
gtk-application-prefer-dark-theme = scheme.variant == "dark";
};
};
services.swaync.style =
generateGtkColors lib scheme.palette;
programs = {
niri = {
settings.layout.focus-ring.active.color = scheme.palette.base0E;
};
foot.settings.colors = let
inherit (lib.strings) removePrefix;
# because someone thought this was a great idea: https://github.com/tinted-theming/schemes/commit/61058a8d2e2bd4482b53d57a68feb56cdb991f0b
palette = builtins.mapAttrs (_: color: removePrefix "#" color) scheme.palette;
in {
background = palette.base00;
foreground = palette.base05;
regular0 = palette.base01;
regular1 = palette.base08;
regular2 = palette.base0B;
regular3 = palette.base0A;
regular4 = palette.base0D;
regular5 = palette.base0E;
regular6 = palette.base0C;
regular7 = palette.base06;
bright0 = palette.base02;
bright1 = palette.base08;
bright2 = palette.base0B;
bright3 = palette.base0A;
bright4 = palette.base0D;
bright5 = palette.base0E;
bright6 = palette.base0C;
bright7 = palette.base07;
};
waybar.style =
generateGtkColors lib scheme.palette;
fuzzel.settings.colors = {
background = "${scheme.palette.base00}ff";
text = "${scheme.palette.base05}ff";
input = "${scheme.palette.base05}ff";
selection = "${scheme.palette.base02}ff";
selection-text = "${scheme.palette.base07}ff";
selection-match = "${scheme.palette.base0D}ff";
border = "${scheme.palette.base0E}ff";
};
swaylock.settings = {
inside-color = scheme.palette.base01;
inside-clear-color = scheme.palette.base0C;
inside-caps-lock-color = scheme.palette.base09;
inside-ver-color = scheme.palette.base0D;
inside-wrong-color = scheme.palette.base08;
key-hl-color = scheme.palette.base0B;
layout-bg-color = scheme.palette.base00;
layout-border-color = scheme.palette.base05;
layout-text-color = scheme.palette.base07;
line-color = scheme.palette.base00;
line-clear-color = scheme.palette.base0C;
line-caps-lock-color = scheme.palette.base09;
line-ver-color = scheme.palette.base0D;
line-wrong-color = scheme.palette.base08;
ring-color = scheme.palette.base02;
ring-clear-color = scheme.palette.base0C;
ring-caps-lock-color = scheme.palette.base09;
ring-ver-color = scheme.palette.base0D;
ring-wrong-color = scheme.palette.base08;
separator-color = scheme.palette.base02;
text-color = scheme.palette.base07;
text-clear-color = scheme.palette.base04;
text-caps-lock-color = scheme.palette.base04;
text-ver-color = scheme.palette.base04;
text-wrong-color = scheme.palette.base04;
};
zathura.options = {
default-fg = scheme.palette.base05;
default-bg = scheme.palette.base00;
completion-bg = scheme.palette.base02;
completion-fg = scheme.palette.base05;
completion-highlight-bg = scheme.palette.base03;
completion-highlight-fg = scheme.palette.base05;
completion-group-bg = scheme.palette.base02;
completion-group-fg = scheme.palette.base0D;
statusbar-fg = scheme.palette.base05;
statusbar-bg = scheme.palette.base02;
notification-bg = scheme.palette.base02;
notification-fg = scheme.palette.base05;
notification-error-bg = scheme.palette.base02;
notification-error-fg = scheme.palette.base08;
notification-warning-bg = scheme.palette.base02;
notification-warning-fg = scheme.palette.base0A;
inputbar-fg = scheme.palette.base05;
inputbar-bg = scheme.palette.base02;
recolor = true;
recolor-lightcolor = scheme.palette.base00;
recolor-darkcolor = scheme.palette.base05;
index-fg = scheme.palette.base05;
index-bg = scheme.palette.base00;
index-active-fg = scheme.palette.base05;
index-active-bg = scheme.palette.base02;
render-loading-bg = scheme.palette.base00;
render-loading-fg = scheme.palette.base05;
highlight-color = lib'.rgba lib scheme.palette.base03 ".5";
highlight-fg = lib'.rgba lib scheme.palette.base0E ".5";
highlight-active-color = lib'.rgba lib scheme.palette.base0E ".5";
};
gnome-terminal.profile = {
"4621184a-b921-42cf-80a0-7784516606f2".colors = {
backgroundColor = "#${scheme.palette.base00}";
foregroundColor = "#${scheme.palette.base05}" "#${scheme.palette.base05}";
palette = builtins.attrValues (builtins.mapAttrs (_: color: "#${color}") scheme.palette);
};
};
};
};
};
} }