diff --git a/config/desktop.nix b/config/desktop.nix index c3c4cdea..d38ec9b1 100644 --- a/config/desktop.nix +++ b/config/desktop.nix @@ -115,4 +115,9 @@ in { enabled = "ibus"; ibus.engines = with pkgs.ibus-engines; [anthy]; }; + security.polkit.enable = true; + security.pam.services.kwallet = { + name = "kwallet"; + enableKwallet = true; + }; } diff --git a/config/programs/foot.nix b/config/programs/foot.nix new file mode 100644 index 00000000..4d62c65c --- /dev/null +++ b/config/programs/foot.nix @@ -0,0 +1,13 @@ +{...}: { + programs.foot = { + enable = true; + server.enable = true; + settings = { + main = { + term = "xterm-256color"; + font = "FiraCode Nerd Font:size=12"; + dpi-aware = "yes"; + }; + }; + }; +} diff --git a/config/programs/helix/default.nix b/config/programs/helix/default.nix index 70f4f0c3..d96deb24 100644 --- a/config/programs/helix/default.nix +++ b/config/programs/helix/default.nix @@ -16,171 +16,16 @@ desktop: { programs.helix = { enable = true; settings = { - theme = "gruvbox"; editor = { line-number = "relative"; - }; - }; - themes = { - gruvbox = { - # Author : Jakub Bartodziej - # The theme uses the gruvbox dark palette with standard contrast: github.com/morhetz/gruvbox - "attribute" = "aqua1"; - "keyword" = {fg = "red1";}; - "keyword.directive" = "red0"; - "namespace" = "aqua1"; - "punctuation" = "orange1"; - "punctuation.delimiter" = "orange1"; - "operator" = "purple1"; - "special" = "purple0"; - "variable.other.member" = "blue1"; - "variable" = "fg1"; - "variable.builtin" = "orange1"; - "variable.parameter" = "fg2"; - "type" = "yellow1"; - "type.builtin" = "yellow1"; - "constructor" = { - fg = "purple1"; - modifiers = ["bold"]; - }; - "function" = { - fg = "green1"; - modifiers = ["bold"]; - }; - "function.macro" = "aqua1"; - "function.builtin" = "yellow1"; - "tag" = "red1"; - "comment" = { - fg = "gray1"; - modifiers = ["italic"]; - }; - "constant" = {fg = "purple1";}; - "constant.builtin" = { - fg = "purple1"; - modifiers = ["bold"]; - }; - "string" = "green1"; - "constant.numeric" = "purple1"; - "constant.character.escape" = { - fg = "fg2"; - modifiers = ["bold"]; - }; - "label" = "aqua1"; - "module" = "aqua1"; - - "diff.plus" = "green1"; - "diff.delta" = "orange1"; - "diff.minus" = "red1"; - - "warning" = { - fg = "orange1"; - bg = "bg1"; - }; - "error" = { - fg = "red1"; - bg = "bg1"; - }; - "info" = { - fg = "aqua1"; - bg = "bg1"; - }; - "hint" = { - fg = "blue1"; - bg = "bg1"; - }; - - "ui.background" = {bg = "bg0";}; - "ui.linenr" = {fg = "bg4";}; - "ui.linenr.selected" = {fg = "yellow1";}; - "ui.cursorline" = {bg = "bg1";}; - "ui.statusline" = { - fg = "fg1"; - bg = "bg2"; - }; - "ui.statusline.normal" = { - fg = "fg1"; - bg = "bg2"; - }; - "ui.statusline.insert" = { - fg = "fg1"; - bg = "blue0"; - }; - "ui.statusline.select" = { - fg = "fg1"; - bg = "orange0"; - }; - "ui.statusline.inactive" = { - fg = "fg4"; - bg = "bg1"; - }; - "ui.popup" = {bg = "bg1";}; - "ui.window" = {bg = "bg1";}; - "ui.help" = { - bg = "bg1"; - fg = "fg1"; - }; - "ui.text" = {fg = "fg1";}; - "ui.text.focus" = {fg = "fg1";}; - "ui.selection" = { - bg = "bg3"; - modifiers = ["reversed"]; - }; - "ui.cursor.primary" = {modifiers = ["reversed"];}; - "ui.cursor.match" = {bg = "bg2";}; - "ui.menu" = { - fg = "fg1"; - bg = "bg2"; - }; - "ui.menu.selected" = { - fg = "bg2"; - bg = "blue1"; - modifiers = ["bold"]; - }; - "ui.virtual.whitespace" = "bg2"; - "ui.virtual.ruler" = {bg = "bg1";}; - - "diagnostic" = {modifiers = ["underlined"];}; - - "markup.heading" = "aqua1"; - "markup.bold" = {modifiers = ["bold"];}; - "markup.italic" = {modifiers = ["italic"];}; - "markup.link.url" = { - fg = "green1"; - modifiers = ["underlined"]; - }; - "markup.link.text" = "red1"; - "markup.raw" = "red1"; - palette = { - bg0 = "#282828"; # main background - bg1 = "#3c3836"; - bg2 = "#504945"; - bg3 = "#665c54"; - bg4 = "#7c6f64"; - - fg0 = "#fbf1c7"; - fg1 = "#ebdbb2"; # main foreground - fg2 = "#d5c4a1"; - fg3 = "#bdae93"; - fg4 = "#a89984"; # gray0 - - gray0 = "#a89984"; - gray1 = "#928374"; - - red0 = "#cc241d"; # neutral - red1 = "#fb4934"; # bright - green0 = "#98971a"; - green1 = "#b8bb26"; - yellow0 = "#d79921"; - yellow1 = "#fabd2f"; - blue0 = "#458588"; - blue1 = "#83a598"; - purple0 = "#b16286"; - purple1 = "#d3869b"; - aqua0 = "#689d6a"; - aqua1 = "#8ec07c"; - orange0 = "#d65d0e"; - orange1 = "#fe8019"; + cursorline = true; + color-modes = true; + cursor-shape = { + insert = "bar"; + normal = "block"; + select = "underline"; }; + indent-guides.render = true; }; }; }; diff --git a/config/programs/keepass.nix b/config/programs/keepass.nix index 5c12611a..000346d9 100644 --- a/config/programs/keepass.nix +++ b/config/programs/keepass.nix @@ -10,51 +10,9 @@ After = ["graphical-session-pre.target"]; PartOf = ["graphical-session.target"]; }; - Install = { - WantedBy = ["graphical-session.target"]; - }; + Install.WantedBy = ["graphical-session.target"]; Service = { ExecStart = "${pkgs.keepassxc}/bin/keepassxc"; }; }; - xdg.configFile."keepassxc/keepassxc.ini".text = '' - [General] - ConfigVersion=1 - - [Browser] - CustomProxyLocation= - Enabled=true - - [FdoSecrets] - Enabled=true - - [GUI] - AdvancedSettings=true - ApplicationTheme=dark - TrayIconAppearance=monochrome-light - - [KeeShare] - Active="\n\n \n\n" - Foreign="\n\n \n\n" - Own="\n\n \n \n\n" - QuietSuccess=true - - [PasswordGenerator] - AdditionalChars= - AdvancedMode=true - Braces=true - Dashes=true - EASCII=false - EnsureEvery=false - ExcludedChars= - Length=10 - Logograms=true - Math=true - Punctuation=true - Quotes=true - SpecialChars=true - - [Security] - IconDownloadFallback=true - ''; } diff --git a/config/programs/mako.nix b/config/programs/mako.nix index 9b228491..3ff2bdfc 100644 --- a/config/programs/mako.nix +++ b/config/programs/mako.nix @@ -1,14 +1,17 @@ {pkgs, ...}: { + programs.mako = { + enable = true; + defaultTimeout = 30000; + }; systemd.user.services.mako = { Unit = { Description = "mako"; + After = ["graphical-session-pre.target"]; PartOf = ["graphical-session.target"]; }; - Install = { - WantedBy = ["graphical-session.target"]; - }; + Install.WantedBy = ["graphical-session.target"]; Service = { - ExecStart = "${pkgs.mako}/bin/mako --default-timeout 30000"; + ExecStart = "mako"; }; }; } diff --git a/config/programs/plover.nix b/config/programs/plover.nix index be2d9f22..9ecd1c6b 100644 --- a/config/programs/plover.nix +++ b/config/programs/plover.nix @@ -70,13 +70,10 @@ in { systemd.user.services.plover = { Unit = { Description = "plover"; - After = ["tray.target"]; + After = ["graphical-session-pre.target"]; PartOf = ["graphical-session.target"]; - Requires = ["tray.target"]; - }; - Install = { - WantedBy = ["graphical-session.target"]; }; + Install.WantedBy = ["graphical-session.target"]; Service = { ExecStart = "${plover-env}/bin/plover"; }; diff --git a/config/programs/rofi.nix b/config/programs/rofi.nix new file mode 100644 index 00000000..7268b51f --- /dev/null +++ b/config/programs/rofi.nix @@ -0,0 +1,11 @@ +{pkgs, ...}: { + programs.rofi = { + enable = true; + font = "Noto Sans"; + extraConfig = { + display-drun = "  Apps "; + display-run = "  Run "; + }; + terminal = "${pkgs.foot}/bin/foot"; + }; +} diff --git a/config/programs/sway.nix b/config/programs/sway.nix index 47a42948..290e9268 100644 --- a/config/programs/sway.nix +++ b/config/programs/sway.nix @@ -4,35 +4,24 @@ lib, ... }: let + c = "$"; switch_window = pkgs.writeScript "switchWindow" '' - # https://www.reddit.com/r/swaywm/comments/krd0sq/comment/gib6z73/?context=3 - jq_filter=' - # descend to workspace or scratchpad - .nodes[].nodes[] - # save workspace name as .w - | {"w": .name} + ( - if (.nodes|length) > 0 then # workspace - [recurse(.nodes[])] - else # scratchpad - [] - end - + .floating_nodes - | .[] - # select nodes with no children (windows) - | select(.nodes==[]) - ) - | [ - "\(.id)", - # remove markup and index from workspace name, replace scratch with "[S]" - "\(.w | gsub("^[^:]*:|<[^>]*>"; "") | sub("__i3_scratch"; "[S]"))", - # get app name (or window class if xwayland) - "\(if .app_id == null then .window_properties.class else .app_id end)", - "\(.name)" - ] | @tsv - ' - ${pkgs.sway}/bin/swaymsg -t get_tree | ${pkgs.jq}/bin/jq -r "$jq_filter" | ${pkgs.wofi}/bin/wofi -m --insensitive --show dmenu --prompt='Focus a window' | { - read -r id name && swaymsg "[con_id=$id]" focus + set -euo pipefail + + tree=$(${pkgs.sway}/bin/swaymsg -t get_tree) + readarray -t win_ids <<< "$(${pkgs.jq}/bin/jq -r '.. | objects | select(has("app_id")) | .id' <<< "$tree")" + readarray -t win_names <<< "$(${pkgs.jq}/bin/jq -r '.. | objects | select(has("app_id")) | .name' <<< "$tree")" + readarray -t win_types <<< "$(${pkgs.jq}/bin/jq -r '.. | objects | select(has("app_id")) | .app_id // .window_properties.class' <<< "$tree")" + + switch () { + local k + read -r k + swaymsg "[con_id=${c}{win_ids[$k]}] focus" } + + for k in $(seq 0 $((${c}{#win_ids[@]} - 1))); do + echo -e "\\${c}{win_types[$k]} - ${c}{win_names[$k]}" + done | rofi -dmenu -markup-rows -i -p window -format i | switch ''; screenshot_then_switch = pkgs.writeScript "screenshotThenSwitch" '' ${pkgs.sway-contrib.grimshot}/bin/grimshot "$@" @@ -59,23 +48,6 @@ ''; installPhase = "true"; }; - # bash script to let dbus know about important env variables and - # propogate them to relevent services run at the end of sway config - # see - # https://github.com/emersion/xdg-desktop-portal-wlr/wiki/"It-doesn't-work"-Troubleshooting-Checklist - # note: this is pretty much the same as /etc/sway/config.d/nixos.conf but also restarts - # some user services to make sure they have the correct environment variables - dbus-sway-environment = pkgs.writeTextFile { - name = "dbus-sway-environment"; - destination = "/bin/dbus-sway-environment"; - executable = true; - - text = '' - ${pkgs.dbus}/bin/dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=sway - ${pkgs.systemd}/bin/systemctl --user stop pipewire pipewire-media-session xdg-desktop-portal xdg-desktop-portal-wlr - ${pkgs.systemd}/bin/systemctl --user start pipewire pipewire-media-session xdg-desktop-portal xdg-desktop-portal-wlr - ''; - }; # currently, there is some friction between sway and gtk: # https://github.com/swaywm/sway/wiki/GTK-3-settings-on-Wayland # the suggested way to set gtk settings is with gsettings @@ -100,11 +72,9 @@ in { ./wl-clipboard.nix ./mako.nix ./swayidle.nix + ./foot.nix + ./rofi.nix ]; - home.file.".config/wofi/config".text = '' - allow_markup = true - dmenu-parse_action = true - ''; wayland.windowManager.sway = { enable = true; config = { @@ -138,7 +108,8 @@ in { inherit (config.wayland.windowManager.sway.config) modifier; in lib.mkOptionDefault { - "${modifier}+d" = "exec ${pkgs.wofi}/bin/wofi --show drun"; + "${modifier}+Return" = "exec ${pkgs.foot}/bin/foot"; + "${modifier}+d" = "exec ${pkgs.rofi}/bin/rofi --show drun"; "Print" = "mode screenshot"; "XF86AudioRaiseVolume" = "exec ${pkgs.pulseaudio}/bin/pactl set-sink-volume @DEFAULT_SINK@ +5%"; "XF86AudioLowerVolume" = "exec ${pkgs.pulseaudio}/bin/pactl set-sink-volume @DEFAULT_SINK@ -5%"; @@ -160,15 +131,15 @@ in { modes = { screenshot = { Print = "exec ${screenshot_then_switch} copy area"; - "Shift+Print" = "exec ${screenshot_then_switch} save area $HOME/Pictures/grim-$(date --iso=s).png"; + "Shift+Print" = "exec ${screenshot_then_switch} save area $HOME/Pictures/grim-$(date --iso=s | sed 's/:/-/g').png"; a = "exec ${screenshot_then_switch} copy active"; - "Shift+a" = "exec ${screenshot_then_switch} save active $HOME/Pictures/grim-$(date --iso=s).png"; + "Shift+a" = "exec ${screenshot_then_switch} save active $HOME/Pictures/grim-$(date --iso=s | sed 's/:/-/g').png"; s = "exec ${screenshot_then_switch} copy screen"; - "Shift+s" = "exec ${screenshot_then_switch} save screen $HOME/Pictures/grim-$(date --iso=s).png"; + "Shift+s" = "exec ${screenshot_then_switch} save screen $HOME/Pictures/grim-$(date --iso=s | sed 's/:/-/g').png"; o = "exec ${screenshot_then_switch} copy output"; - "Shift+o" = "exec ${screenshot_then_switch} save output $HOME/Pictures/grim-$(date --iso=s).png"; + "Shift+o" = "exec ${screenshot_then_switch} save output $HOME/Pictures/grim-$(date --iso=s | sed 's/:/-/g').png"; w = "exec ${screenshot_then_switch} copy window"; - "Shift+w" = "exec ${screenshot_then_switch} save window $HOME/Pictures/grim-$(date --iso=s).png"; + "Shift+w" = "exec ${screenshot_then_switch} save window $HOME/Pictures/grim-$(date --iso=s | sed 's/:/-/g').png"; Escape = ''mode "default"''; Return = ''mode "default"''; }; @@ -185,9 +156,10 @@ in { export GTK_USE_PORTAL=1 ''; extraConfig = '' - exec ${dbus-sway-environment}/bin/dbus-sway-environment exec ${configure-gtk}/bin/configure-gtk exec ${pkgs.systemd}/bin/systemctl --user import-environment + gaps outer 8 + gaps inner 4 ''; }; diff --git a/config/programs/swayidle.nix b/config/programs/swayidle.nix index 0814a463..b7a69e8e 100644 --- a/config/programs/swayidle.nix +++ b/config/programs/swayidle.nix @@ -17,16 +17,36 @@ ${pkgs.mpc-cli}/bin/mpc play ''; in { - systemd.user.services.swayidle = { - Unit = { - Description = "swayidle"; - PartOf = ["graphical-session.target"]; - }; - Install = { - WantedBy = ["graphical-session.target"]; - }; - Service = { - ExecStart = "${pkgs.swayidle}/bin/swayidle -w timeout 300 ${lock-script} timeout 305 ${screen-off-script} resume ${resume-script} before-sleep ${lock-script} timeout 900 ${suspend-script} lock ${lock-script} unlock ${unlock-script}"; - }; + services.swayidle = { + enable = true; + events = [ + { + event = "before-sleep"; + command = "${lock-script}"; + } + { + event = "lock"; + command = "${lock-script}"; + } + { + event = "unlock"; + command = "${unlock-script}"; + } + ]; + timeouts = [ + { + timeout = 300; + command = "${lock-script}"; + } + { + timeout = 305; + command = "${screen-off-script}"; + resumeCommand = "${resume-script}"; + } + { + timeout = 900; + command = "${suspend-script}"; + } + ]; }; } diff --git a/config/programs/theming.nix b/config/programs/theming.nix index 9ff8355f..6f819cb9 100644 --- a/config/programs/theming.nix +++ b/config/programs/theming.nix @@ -1,83 +1,532 @@ -{pkgs, ...}: let +{pkgs, config, ...}: let theme = import ../../extra/theme.nix; + inherit (config.lib.formats.rasi) mkLiteral; + rasiColor = c: mkLiteral (theme.cssColor c); in { gtk = { enable = true; cursorTheme = { - package = null; - name = "breeze_cursors"; + package = pkgs.libsForQt5.breeze-icons; + name = "breeze-dark"; size = 24; }; font = { - package = null; + package = pkgs.noto-fonts; name = "Noto Sans"; size = 10; }; iconTheme = { - package = null; + package = pkgs.libsForQt5.breeze-icons; name = "breeze-dark"; }; theme = { - package = null; + package = pkgs.libsForQt5.breeze-gtk; name = "Breeze-Dark"; }; }; qt.enable = true; qt.style.package = pkgs.libsForQt5.breeze-qt5; qt.style.name = "BreezeDark"; - + # Taken from https://github.com/jakehamilton/dotfiles/blob/master/waybar/style.css programs.waybar.style = with theme; '' * { border: none; - border-radius: 0; + border-radius: 0; + font-size: 14px; + min-height: 24px; font-family: "NotoSansDisplay Nerd Font", "Noto Sans Mono CJK JP"; - } - - window.HDMI-A-1 * { - font-size: 12px; + color: ${cssColor base}; } window#waybar { - background: ${cssColor bg}; + background: tranparent; + opacity: 0.9; } - #mpd, #cpu { - background: ${cssColor green}; - color: ${cssColor bg}; + window#waybar.hidden { + opacity: 0.2; } - #pulseaudio { - background: ${cssColor yellow}; - color: ${cssColor bg}; - } - - #network, #tray { - background: ${cssColor blue}; - color: ${cssColor bg}; - } - - #memory, #workspaces button.focused { - background: ${cssColor magenta}; - } - - #language { - background: ${cssColor cyan}; - } - - #clock { - background: ${cssColor light-grey}; - } - - .urgent { - background: ${cssColor red}; - } - - #workspaces button { + #window { + margin-top: 8px; + padding: 0px 16px 0px 16px; + border-radius: 24px; + transition: none; background: transparent; } - label { - color: #fff; + #workspaces { + margin-top: 8px; + margin-left: 12px; + margin-bottom: 0; + border-radius: 24px; + background: ${cssColor surface0}; + transition: none; + } + + #workspaces button { + transition: none; + background: transparent; + font-size: 16px; + color: ${cssColor text}; + } + + #workspaces button.focused { + background: ${cssColor mauve}; + color: ${cssColor base}; + } + + #workspaces button:hover { + background: ${cssColor sapphire}; + color: ${cssColor base}; + } + + #mpd { + margin-top: 8px; + margin-left: 8px; + padding-left: 16px; + padding-right: 16px; + margin-bottom: 0; + border-radius: 24px; + background: ${cssColor green}; + transition: none; + } + + #mpd.disconnected, + #mpd.stopped { + background: ${cssColor red}; + } + + #network { + margin-top: 8px; + margin-left: 8px; + padding-left: 16px; + padding-right: 16px; + margin-bottom: 0; + border-radius: 24px; + transition: none; + background: ${cssColor mauve}; + } + + #pulseaudio { + margin-top: 8px; + margin-left: 8px; + padding-left: 16px; + padding-right: 16px; + margin-bottom: 0; + border-radius: 24px; + transition: none; + background: ${cssColor teal}; + } + + #temperature, #battery { + margin-top: 8px; + margin-left: 8px; + padding-left: 16px; + padding-right: 16px; + margin-bottom: 0; + border-radius: 24px; + transition: none; + background: ${cssColor green}; + } + + #cpu, #backlight, #battery.warning { + margin-top: 8px; + margin-left: 8px; + padding-left: 16px; + padding-right: 16px; + margin-bottom: 0; + border-radius: 24px; + transition: none; + background: ${cssColor yellow}; + } + + #memory, #battery.critical { + margin-top: 8px; + margin-left: 8px; + padding-left: 16px; + padding-right: 16px; + margin-bottom: 0; + border-radius: 24px; + transition: none; + background: ${cssColor red}; + } + + #clock { + margin-top: 8px; + margin-left: 8px; + margin-right: 12px; + padding-left: 16px; + padding-right: 16px; + margin-bottom: 0; + border-radius: 26px; + transition: none; + background: ${cssColor surface0}; + color: ${cssColor text}; } ''; + + wayland.windowManager.sway.extraConfig = with theme; '' + # target title bg text indicator border + client.focused ${cssColor pink} ${cssColor base} ${cssColor text} ${cssColor rosewater} ${cssColor pink} + client.focused_inactive ${cssColor mauve} ${cssColor base} ${cssColor text} ${cssColor rosewater} ${cssColor mauve} + client.unfocused ${cssColor mauve} ${cssColor base} ${cssColor text} ${cssColor rosewater} ${cssColor mauve} + client.urgent ${cssColor peach} ${cssColor base} ${cssColor peach} ${cssColor overlay0} ${cssColor peach} + client.placeholder ${cssColor overlay0} ${cssColor base} ${cssColor text} ${cssColor overlay0} ${cssColor overlay0} + client.background ${cssColor base} + ''; + + programs.foot.settings.colors = with theme; { + alpha = 0.9; + background = base; + foreground = text; + regular0 = surface1; + regular1 = red; + regular2 = green; + regular3 = yellow; + regular4 = blue; + regular5 = pink; + regular6 = teal; + regular7 = subtext1; + bright0 = surface2; + bright1 = red; + bright2 = green; + bright3 = yellow; + bright4 = blue; + bright5 = pink; + bright6 = teal; + bright7 = subtext0; + }; + + programs.rofi.theme = with theme; let + element = { + background-color = mkLiteral "inherit"; + text-color = mkLiteral "inherit"; + }; + in { + "*" = { + bg-col = rasiColor base; + bg-col-light = rasiColor base; + border-col = rasiColor base; + selected-col = rasiColor base; + blue = rasiColor blue; + fg-col = rasiColor text; + fg-col2 = rasiColor red; + grey = rasiColor overlay0; + width = 600; + }; + element-text = element; + window = { + height = mkLiteral "360px"; + border = mkLiteral "3px"; + border-color = mkLiteral "@border-col"; + background-color = mkLiteral "@bg-col"; + opacity = mkLiteral "0.9"; + }; + mainbox = { + background-color = mkLiteral "@bg-col"; + }; + inputbar = { + children = map mkLiteral ["prompt" "entry"]; + background-color = mkLiteral "@bg-col"; + border-radius = mkLiteral "5px"; + padding = mkLiteral "2px"; + }; + prompt = { + background-color = mkLiteral "@blue"; + padding = mkLiteral "6px"; + text-color = mkLiteral "@bg-col"; + border-radius = mkLiteral "3px"; + margin = mkLiteral "20px 0px 0px 20px"; + }; + + textbox-prompt-colon = { + expand = mkLiteral "false"; + str = ":"; + }; + + entry = { + padding = mkLiteral "6px"; + margin = mkLiteral "20px 0px 0px 10px"; + text-color = mkLiteral "@fg-col"; + background-color = mkLiteral "@bg-col"; + }; + + listview = { + border = mkLiteral "0px 0px 0px"; + padding = mkLiteral "6px 0px 0px"; + margin = mkLiteral "10px 0px 0px 20px"; + columns = 2; + lines = 5; + background-color = mkLiteral "@bg-col"; + }; + + element = { + padding = mkLiteral "5px"; + background-color = mkLiteral "@bg-col"; + text-color = mkLiteral "@fg-col"; + }; + + element-icon = element // { + size = mkLiteral "25px"; + }; + + "element selected" = { + background-color = mkLiteral "@selected-col"; + text-color = mkLiteral "@fg-col2"; + }; + + mode-switcher = element // { + spacing = 0; + }; + + button = { + padding = mkLiteral "10px"; + background-color = mkLiteral "@bg-col-light"; + text-color = mkLiteral "@grey"; + vertical-align = mkLiteral "0.5"; + horizontal-align = mkLiteral "0.5"; + }; + + "button selected" = { + background-color = mkLiteral "@bg-col"; + text-color = mkLiteral "@blue"; + }; + + message = { + background-color = mkLiteral "@bg-col-light"; + margin = mkLiteral "2px"; + padding = mkLiteral "2px"; + border-radius = mkLiteral "5px"; + }; + + textbox = { + padding = mkLiteral "6px"; + margin = mkLiteral "20px 0px 0px 20px"; + text-color = mkLiteral "@blue"; + background-color = mkLiteral "@bg-col-light"; + }; + }; + programs.helix = { + settings.theme = "catppuccin"; + themes.catppucchin = { + # Syntax highlighting + # ------------------- + "type" = "yellow"; + + "constructor" = "sapphire"; + + "constant" = "peach"; + "constant.builtin" = "peach"; + "constant.character" = "teal"; + "constant.character.escape" = "pink"; + + "string" = "green"; + "string.regexp" = "peach"; + "string.special" = "blue"; + + "comment" = { + fg = "surface2"; + modifiers = ["italic"]; + }; + + "variable" = "text"; + "variable.parameter" = { + fg = "maroon"; + modifiers = ["italic"]; + }; + "variable.builtin" = "red"; + "variable.other.member" = "teal"; + + "label" = "sapphire"; # used for lifetimes + + "punctuation" = "overlay2"; + "punctuation.special" = "sky"; + + "keyword" = "mauve"; + "keyword.control.conditional" = { + fg = "mauve"; + modifiers = ["italic"]; + }; + + "operator" = "sky"; + + "function" = "blue"; + "function.builtin" = "peach"; + "function.macro" = "mauve"; + + "tag" = "mauve"; + + "namespace" = { + fg = "blue"; + modifiers = ["italic"]; + }; + + "special" = "blue"; # fuzzy highlight + + "markup.heading.marker" = { + fg = "peach"; + modifiers = ["bold"]; + }; + "markup.heading.1" = "lavender"; + "markup.heading.2" = "mauve"; + "markup.heading.3" = "green"; + "markup.heading.4" = "yellow"; + "markup.heading.5" = "pink"; + "markup.heading.6" = "teal"; + "markup.list" = "mauve"; + "markup.bold" = {modifiers = ["bold"];}; + "markup.italic" = {modifiers = ["italic"];}; + "markup.link.url" = { + fg = "rosewater"; + modifiers = ["italic" "underlined"]; + }; + "markup.link.text" = "blue"; + "markup.raw" = "flamingo"; + + "diff.plus" = "green"; + "diff.minus" = "red"; + "diff.delta" = "blue"; + + # User Interface + # -------------- + "ui.background" = { + fg = "text"; + bg = "base"; + }; + + "ui.linenr" = {fg = "surface1";}; + "ui.linenr.selected" = {fg = "lavender";}; + + "ui.statusline" = { + fg = "text"; + bg = "mantle"; + }; + "ui.statusline.inactive" = { + fg = "surface2"; + bg = "mantle"; + }; + "ui.statusline.normal" = { + fg = "base"; + bg = "lavender"; + modifiers = ["bold"]; + }; + "ui.statusline.insert" = { + fg = "base"; + bg = "green"; + modifiers = ["bold"]; + }; + "ui.statusline.select" = { + fg = "base"; + bg = "flamingo"; + modifiers = ["bold"]; + }; + + "ui.popup" = { + fg = "text"; + bg = "surface0"; + }; + "ui.window" = {fg = "crust";}; + "ui.help" = { + fg = "overlay2"; + bg = "surface0"; + }; + + "ui.bufferline" = { + fg = "surface1"; + bg = "mantle"; + }; + "ui.bufferline.active" = { + fg = "text"; + bg = "base"; + modifiers = ["bold" "italic"]; + }; + "ui.bufferline.background" = {bg = "surface0";}; + + "ui.text" = "text"; + "ui.text.focus" = { + fg = "text"; + bg = "surface0"; + modifiers = ["bold"]; + }; + + "ui.virtual" = "overlay0"; + "ui.virtual.ruler" = {bg = "surface0";}; + "ui.virtual.indent-guide" = "surface0"; + + "ui.selection" = {bg = "surface1";}; + + "ui.cursor" = { + fg = "base"; + bg = "secondary_cursor"; + }; + "ui.cursor.primary" = { + fg = "base"; + bg = "rosewater"; + }; + "ui.cursor.match" = { + fg = "peach"; + modifiers = ["bold"]; + }; + + "ui.cursorline.primary" = {bg = "cursorline";}; + + "ui.highlight" = { + bg = "surface1"; + modifiers = ["bold"]; + }; + + "ui.menu" = { + fg = "overlay2"; + bg = "surface0"; + }; + "ui.menu.selected" = { + fg = "text"; + bg = "surface1"; + modifiers = ["bold"]; + }; + + diagnostic = {modifiers = ["underlined"];}; + "diagnostic.error" = "red"; + "diagnostic.warn" = "yellow"; + "diagnostic.info" = "sky"; + "diagnostic.hint" = "teal"; + + error = "red"; + warning = "yellow"; + info = "sky"; + hint = "teal"; + palette = with theme; { + rosewater = cssColor rosewater; + flamingo = cssColor flamingo; + pink = cssColor pink; + mauve = cssColor mauve; + red = cssColor red; + maroon = cssColor maroon; + peach = cssColor peach; + yellow = cssColor yellow; + green = cssColor green; + teal = cssColor teal; + sky = cssColor sky; + sapphire = cssColor sapphire; + blue = cssColor blue; + lavender = cssColor lavender; + text = cssColor text; + subtext1 = cssColor subtext1; + subtext0 = cssColor subtext0; + overlay2 = cssColor overlay2; + overlay1 = cssColor overlay1; + overlay0 = cssColor overlay0; + surface2 = cssColor surface2; + surface1 = cssColor surface1; + surface0 = cssColor surface0; + base = cssColor base; + mantle = cssColor mantle; + crust = cssColor crust; + + cursorline = "#2a2b3c"; + secondary_cursor = "#b5a6a8"; + }; + }; + }; } diff --git a/config/programs/tmux.nix b/config/programs/tmux.nix index ab27c22f..5e2c2581 100644 --- a/config/programs/tmux.nix +++ b/config/programs/tmux.nix @@ -5,37 +5,5 @@ clock24 = true; prefix = "C-a"; sensibleOnTop = true; - plugins = with pkgs.tmuxPlugins; [ - power-theme - cpu - { - plugin = resurrect; - extraConfig = "set -g @resurrect-strategy-nvim 'session'"; - } - { - plugin = continuum; - extraConfig = '' - set -g @continuum-restore 'on' - ''; - } - ]; - - extraConfig = '' - set-window-option -g automatic-rename on - set-option -g set-titles on - - bind -n M-Left select-pane -L - bind -n M-Right select-pane -R - bind -n M-Up select-pane -U - bind -n M-Down select-pane -D - - bind -n S-Left previous-window - bind -n S-Right next-window - - set -sg escape-time 0 - - set -g mouse on - set -g default-terminal "screen-256color" - ''; }; } diff --git a/config/programs/vscode/default.nix b/config/programs/vscode/default.nix index 8802f02f..f375f756 100644 --- a/config/programs/vscode/default.nix +++ b/config/programs/vscode/default.nix @@ -106,7 +106,8 @@ "editor.fontFamily" = "\"FiraCode Nerd Font Mono\", \"Noto Sans Mono CJK JP\", monospace"; "rust-analyzer.checkOnSave.command" = "clippy"; "ledger.binary" = "${pkgs.hledger}/bin/hledger"; - "workbench.colorTheme" = "Gruvbox Dark Hard"; + "workbench.colorTheme" = "Catppuccin Mocha"; + "window.titleBarStyle" = "custom"; "rust-analyzer.hoverActions.references" = true; "rust-analyzer.lens.methodReferences" = true; "rust-analyzer.workspace.symbol.search.scope" = "workspace_and_dependencies"; @@ -289,6 +290,7 @@ bierner.markdown-mermaid bradlc.vscode-tailwindcss bungcip.better-toml + catppuccin.catppuccin-vsc christian-kohler.path-intellisense codezombiech.gitignore davidanson.vscode-markdownlint @@ -304,7 +306,6 @@ github.vscode-pull-request-github golang.go haskell.haskell - jdinhlife.gruvbox jnoortheen.nix-ide justusadam.language-haskell mkhl.direnv diff --git a/config/programs/waybar.nix b/config/programs/waybar.nix index c0321014..411546d3 100644 --- a/config/programs/waybar.nix +++ b/config/programs/waybar.nix @@ -33,12 +33,12 @@ format = "{name} {icon}"; }; "sway/mode" = { - format = "{}"; + format = "{}"; }; mpd = { - format = "{stateIcon} {consumeIcon}{randomIcon}{repeatIcon}{singleIcon}{artist} - {album} - {title} ({elapsedTime:%M:%S}/{totalTime:%M:%S}) ⸨{songPosition}|{queueLength}⸩ {volume}% "; - format-disconnected = "Disconnected "; - format-stopped = "{consumeIcon}{randomIcon}{repeatIcon}{singleIcon}Stopped "; + format = "{stateIcon} {artist} - {album} - {title} ({elapsedTime:%M:%S}/{totalTime:%M:%S})"; + format-disconnected = "ﳌ"; + format-stopped = ""; unknown-tag = "N/A"; interval = 2; consume-icons = { @@ -60,6 +60,11 @@ }; tooltip-format = "MPD (connected)"; tooltip-format-disconnected = "MPD (disconnected)"; + on-click = "${pkgs.mpc-cli}/bin/mpc toggle"; + on-click-middle = "${pkgs.foot}/bin/foot ${pkgs.ncmpcpp}/bin/ncmpcpp"; + on-click-right = "${pkgs.mpc-cli}/bin/mpc stop"; + on-scroll-up = "${pkgs.mpc-cli}/bin/mpc seekthrough +00:00:10"; + on-scroll-down = "${pkgs.mpc-cli}/bin/mpc seekthrough -00:00:10"; }; idle_inhibitor = { format = "{icon}"; @@ -106,20 +111,11 @@ bat = "BAT2"; }; network = { - format-wifi = "{essid} ({signalStrength}%) "; - format-ethernet = "{ipaddr}/{cidr} "; - tooltip-format = "{ifname} via {gwaddr} "; - format-linked = "{ifname} (No IP) "; - format-disconnected = "Disconnected ⚠"; - format-alt = "{ifname}: {ipaddr}/{cidr}"; + format-wifi = " {essid} {ipaddr}"; + format-ethernet = " {ipaddr}"; }; pulseaudio = { - format = "{volume}% {icon} {format_source}"; - format-bluetooth = "{volume}% {icon} {format_source}"; - format-bluetooth-muted = " {icon} {format_source}"; - format-muted = " {format_source}"; - format-source = "{volume}% "; - format-source-muted = ""; + format = "{icon} {volume}%"; format-icons = { headphone = ""; hands-free = ""; diff --git a/config/programs/wl-clipboard.nix b/config/programs/wl-clipboard.nix index dbac3071..d02c3b20 100644 --- a/config/programs/wl-clipboard.nix +++ b/config/programs/wl-clipboard.nix @@ -2,11 +2,10 @@ systemd.user.services.wl-clipboard = { Unit = { Description = "wl-clipboard"; + After = ["graphical-session-pre.target"]; PartOf = ["graphical-session.target"]; }; - Install = { - WantedBy = ["graphical-session.target"]; - }; + Install.WantedBy = ["graphical-session.target"]; Service = { ExecStart = "${pkgs.wl-clipboard}/bin/wl-paste --watch ${pkgs.clipman}/bin/clipman store --no-persist"; }; diff --git a/config/services/cifs.nix b/config/services/cifs.nix index e8a17eaf..63d4544d 100644 --- a/config/services/cifs.nix +++ b/config/services/cifs.nix @@ -1,5 +1,5 @@ {pkgs, ...}: { - environment.systemPackages = [ pkgs.cifs-utils pkgs.lxqt.lxqt-policykit ]; + environment.systemPackages = [pkgs.cifs-utils pkgs.lxqt.lxqt-policykit]; networking.firewall.extraCommands = ''iptables -t raw -A OUTPUT -p udp -m udp --dport 137 -j CT --helper netbios-ns''; services.gvfs.enable = true; } diff --git a/config/services/gitea.nix b/config/services/gitea.nix index 5a329d9d..dfad66d9 100644 --- a/config/services/gitea.nix +++ b/config/services/gitea.nix @@ -1,4 +1,8 @@ -{pkgs, config, ...}: { +{ + pkgs, + config, + ... +}: { imports = [ ../../modules/gitea.nix (import ../../modules/gateway-st.nix {name = "gitea";}) diff --git a/default.nix b/default.nix index 000100d5..3c49a9ee 100644 --- a/default.nix +++ b/default.nix @@ -5,7 +5,6 @@ # containing 'defaultNix' (to be used in 'default.nix'), 'shellNix' # (to be used in 'shell.nix'). let - src = ./.; system = builtins.currentSystem or "unknown-system"; @@ -13,169 +12,251 @@ let lockFile = builtins.fromJSON (builtins.readFile lockFilePath); - fetchTree = - info: - if info.type == "github" then - { outPath = - fetchTarball - ({ url = "https://api.${info.host or "github.com"}/repos/${info.owner}/${info.repo}/tarball/${info.rev}"; } - // (if info ? narHash then { sha256 = info.narHash; } else {}) - ); - rev = info.rev; - shortRev = builtins.substring 0 7 info.rev; - lastModified = info.lastModified; - lastModifiedDate = formatSecondsSinceEpoch info.lastModified; - narHash = info.narHash; - } - else if info.type == "git" then - { outPath = - builtins.fetchGit - ({ url = info.url; } - // (if info ? rev then { inherit (info) rev; } else {}) - // (if info ? ref then { inherit (info) ref; } else {}) - // (if info ? submodules then { inherit (info) submodules; } else {}) - ); - lastModified = info.lastModified; - lastModifiedDate = formatSecondsSinceEpoch info.lastModified; - narHash = info.narHash; - } // (if info ? rev then { - rev = info.rev; - shortRev = builtins.substring 0 7 info.rev; - } else { - }) - else if info.type == "path" then - { outPath = builtins.path { path = info.path; }; - narHash = info.narHash; - } - else if info.type == "tarball" then - { outPath = - fetchTarball - ({ inherit (info) url; } - // (if info ? narHash then { sha256 = info.narHash; } else {}) - ); - } - else if info.type == "gitlab" then - { inherit (info) rev narHash lastModified; + fetchTree = info: + if info.type == "github" + then { + outPath = + fetchTarball + ( + {url = "https://api.${info.host or "github.com"}/repos/${info.owner}/${info.repo}/tarball/${info.rev}";} + // ( + if info ? narHash + then {sha256 = info.narHash;} + else {} + ) + ); + rev = info.rev; + shortRev = builtins.substring 0 7 info.rev; + lastModified = info.lastModified; + lastModifiedDate = formatSecondsSinceEpoch info.lastModified; + narHash = info.narHash; + } + else if info.type == "git" + then + { outPath = - fetchTarball - ({ url = "https://${info.host or "gitlab.com"}/api/v4/projects/${info.owner}%2F${info.repo}/repository/archive.tar.gz?sha=${info.rev}"; } - // (if info ? narHash then { sha256 = info.narHash; } else {}) - ); - shortRev = builtins.substring 0 7 info.rev; + builtins.fetchGit + ( + {url = info.url;} + // ( + if info ? rev + then {inherit (info) rev;} + else {} + ) + // ( + if info ? ref + then {inherit (info) ref;} + else {} + ) + // ( + if info ? submodules + then {inherit (info) submodules;} + else {} + ) + ); + lastModified = info.lastModified; + lastModifiedDate = formatSecondsSinceEpoch info.lastModified; + narHash = info.narHash; } + // ( + if info ? rev + then { + rev = info.rev; + shortRev = builtins.substring 0 7 info.rev; + } + else { + } + ) + else if info.type == "path" + then { + outPath = builtins.path {path = info.path;}; + narHash = info.narHash; + } + else if info.type == "tarball" + then { + outPath = + fetchTarball + ( + {inherit (info) url;} + // ( + if info ? narHash + then {sha256 = info.narHash;} + else {} + ) + ); + } + else if info.type == "gitlab" + then { + inherit (info) rev narHash lastModified; + outPath = + fetchTarball + ( + {url = "https://${info.host or "gitlab.com"}/api/v4/projects/${info.owner}%2F${info.repo}/repository/archive.tar.gz?sha=${info.rev}";} + // ( + if info ? narHash + then {sha256 = info.narHash;} + else {} + ) + ); + shortRev = builtins.substring 0 7 info.rev; + } else # FIXME: add Mercurial, tarball inputs. throw "flake input has unsupported input type '${info.type}'"; - callFlake4 = flakeSrc: locks: - let - flake = import (flakeSrc + "/flake.nix"); + callFlake4 = flakeSrc: locks: let + flake = import (flakeSrc + "/flake.nix"); - inputs = builtins.mapAttrs (n: v: - if v.flake or true - then callFlake4 (fetchTree (v.locked // v.info)) v.inputs - else fetchTree (v.locked // v.info)) locks; + inputs = builtins.mapAttrs (n: v: + if v.flake or true + then callFlake4 (fetchTree (v.locked // v.info)) v.inputs + else fetchTree (v.locked // v.info)) + locks; - outputs = flakeSrc // (flake.outputs (inputs // {self = outputs;})); - in - assert flake.edition == 201909; - outputs; + outputs = flakeSrc // (flake.outputs (inputs // {self = outputs;})); + in + assert flake.edition == 201909; outputs; - callLocklessFlake = flakeSrc: - let - flake = import (flakeSrc + "/flake.nix"); - outputs = flakeSrc // (flake.outputs ({ self = outputs; })); - in outputs; + callLocklessFlake = flakeSrc: let + flake = import (flakeSrc + "/flake.nix"); + outputs = flakeSrc // (flake.outputs {self = outputs;}); + in + outputs; rootSrc = let # Try to clean the source tree by using fetchGit, if this source # tree is a valid git repository. tryFetchGit = src: if isGit && !isShallow - then - let res = builtins.fetchGit src; - in if res.rev == "0000000000000000000000000000000000000000" then removeAttrs res ["rev" "shortRev"] else res - else { outPath = src; }; + then let + res = builtins.fetchGit src; + in + if res.rev == "0000000000000000000000000000000000000000" + then removeAttrs res ["rev" "shortRev"] + else res + else {outPath = src;}; # NB git worktrees have a file for .git, so we don't check the type of .git isGit = builtins.pathExists (src + "/.git"); isShallow = builtins.pathExists (src + "/.git/shallow"); - in - { lastModified = 0; lastModifiedDate = formatSecondsSinceEpoch 0; } - // (if src ? outPath then src else tryFetchGit src); + { + lastModified = 0; + lastModifiedDate = formatSecondsSinceEpoch 0; + } + // ( + if src ? outPath + then src + else tryFetchGit src + ); # Format number of seconds in the Unix epoch as %Y%m%d%H%M%S. - formatSecondsSinceEpoch = t: - let - rem = x: y: x - x / y * y; - days = t / 86400; - secondsInDay = rem t 86400; - hours = secondsInDay / 3600; - minutes = (rem secondsInDay 3600) / 60; - seconds = rem t 60; + formatSecondsSinceEpoch = t: let + rem = x: y: x - x / y * y; + days = t / 86400; + secondsInDay = rem t 86400; + hours = secondsInDay / 3600; + minutes = (rem secondsInDay 3600) / 60; + seconds = rem t 60; - # Courtesy of https://stackoverflow.com/a/32158604. - z = days + 719468; - era = (if z >= 0 then z else z - 146096) / 146097; - doe = z - era * 146097; - yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365; - y = yoe + era * 400; - doy = doe - (365 * yoe + yoe / 4 - yoe / 100); - mp = (5 * doy + 2) / 153; - d = doy - (153 * mp + 2) / 5 + 1; - m = mp + (if mp < 10 then 3 else -9); - y' = y + (if m <= 2 then 1 else 0); + # Courtesy of https://stackoverflow.com/a/32158604. + z = days + 719468; + era = + ( + if z >= 0 + then z + else z - 146096 + ) + / 146097; + doe = z - era * 146097; + yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365; + y = yoe + era * 400; + doy = doe - (365 * yoe + yoe / 4 - yoe / 100); + mp = (5 * doy + 2) / 153; + d = doy - (153 * mp + 2) / 5 + 1; + m = + mp + + ( + if mp < 10 + then 3 + else -9 + ); + y' = + y + + ( + if m <= 2 + then 1 + else 0 + ); - pad = s: if builtins.stringLength s < 2 then "0" + s else s; - in "${toString y'}${pad (toString m)}${pad (toString d)}${pad (toString hours)}${pad (toString minutes)}${pad (toString seconds)}"; + pad = s: + if builtins.stringLength s < 2 + then "0" + s + else s; + in "${toString y'}${pad (toString m)}${pad (toString d)}${pad (toString hours)}${pad (toString minutes)}${pad (toString seconds)}"; allNodes = builtins.mapAttrs - (key: node: - let - sourceInfo = - if key == lockFile.root - then rootSrc - else fetchTree (node.info or {} // removeAttrs node.locked ["dir"]); + ( + key: node: let + sourceInfo = + if key == lockFile.root + then rootSrc + else fetchTree (node.info or {} // removeAttrs node.locked ["dir"]); - subdir = if key == lockFile.root then "" else node.locked.dir or ""; + subdir = + if key == lockFile.root + then "" + else node.locked.dir or ""; - flake = import (sourceInfo + (if subdir != "" then "/" else "") + subdir + "/flake.nix"); + flake = import (sourceInfo + + ( + if subdir != "" + then "/" + else "" + ) + + subdir + + "/flake.nix"); - inputs = builtins.mapAttrs - (inputName: inputSpec: allNodes.${resolveInput inputSpec}) - (node.inputs or {}); + inputs = + builtins.mapAttrs + (inputName: inputSpec: allNodes.${resolveInput inputSpec}) + (node.inputs or {}); - # Resolve a input spec into a node name. An input spec is - # either a node name, or a 'follows' path from the root - # node. - resolveInput = inputSpec: - if builtins.isList inputSpec - then getInputByPath lockFile.root inputSpec - else inputSpec; + # Resolve a input spec into a node name. An input spec is + # either a node name, or a 'follows' path from the root + # node. + resolveInput = inputSpec: + if builtins.isList inputSpec + then getInputByPath lockFile.root inputSpec + else inputSpec; - # Follow an input path (e.g. ["dwarffs" "nixpkgs"]) from the - # root node, returning the final node. - getInputByPath = nodeName: path: - if path == [] - then nodeName - else - getInputByPath - # Since this could be a 'follows' input, call resolveInput. - (resolveInput lockFile.nodes.${nodeName}.inputs.${builtins.head path}) - (builtins.tail path); - - outputs = flake.outputs (inputs // { self = result; }); - - result = outputs // sourceInfo // { inherit inputs; inherit outputs; inherit sourceInfo; }; - in - if node.flake or true then - assert builtins.isFunction flake.outputs; - result + # Follow an input path (e.g. ["dwarffs" "nixpkgs"]) from the + # root node, returning the final node. + getInputByPath = nodeName: path: + if path == [] + then nodeName else - sourceInfo - ) - lockFile.nodes; + getInputByPath + # Since this could be a 'follows' input, call resolveInput. + (resolveInput lockFile.nodes.${nodeName}.inputs.${builtins.head path}) + (builtins.tail path); + + outputs = flake.outputs (inputs // {self = result;}); + + result = + outputs + // sourceInfo + // { + inherit inputs; + inherit outputs; + inherit sourceInfo; + }; + in + if node.flake or true + then assert builtins.isFunction flake.outputs; result + else sourceInfo + ) + lockFile.nodes; result = if !(builtins.pathExists lockFilePath) @@ -185,4 +266,5 @@ let else if lockFile.version >= 5 && lockFile.version <= 7 then allNodes.${lockFile.root} else throw "lock file '${lockFilePath}' has unsupported version ${toString lockFile.version}"; - in result.outputs +in + result.outputs diff --git a/extra/theme.nix b/extra/theme.nix index f883c765..edc4dcd8 100644 --- a/extra/theme.nix +++ b/extra/theme.nix @@ -1,26 +1,33 @@ rec { - authors = [ - "Chris Kempson" - ]; - name = "Paraiso (dark)"; - black = "2f1e2e"; - dark-red = red; - dark-green = green; - dark-yellow = yellow; - dark-blue = blue; - dark-magenta = magenta; - dark-cyan = cyan; - light-grey = "998299"; - dark-grey = "737373"; - red = "ef6155"; - green = "48b685"; - yellow = "fec418"; - blue = "06b6ef"; - magenta = "815ba4"; - cyan = "5bc4bf"; - white = "e7e9db"; - bg = black; - fg = white; + name = "Catppuccin Mocha Theme"; + + rosewater = "f5e0dc"; + flamingo = "f2cdcd"; + pink = "f5c2e7"; + mauve = "cba6f7"; + red = "f38ba8"; + maroon = "eba0ac"; + peach = "fab387"; + yellow = "f9e2af"; + green = "a6e3a1"; + teal = "94e2d5"; + sky = "89dceb"; + sapphire = "74c7ec"; + blue = "89b4fa"; + lavender = "b4befe"; + text = "cdd6f4"; + subtext1 = "bac2de"; + subtext0 = "a6adc8"; + overlay2 = "9399b2"; + overlay1 = "7f849c"; + overlay0 = "6c7086"; + surface2 = "585b70"; + surface1 = "45475a"; + surface0 = "313244"; + base = "1e1e2e"; + mantle = "181825"; + crust = "11111b"; + cssColor = color: "#${color}"; alacrittyColor = color: "0x${color}"; }