From 2ad77494b230f25647f45a2555b8b0246c9d0684 Mon Sep 17 00:00:00 2001 From: reidlab Date: Wed, 22 Apr 2026 21:32:27 -0700 Subject: [PATCH] tons of theme tweaks, +gruvbox --- default.nix | 2 +- flake.lock | 126 ++++++------------ flake.nix | 11 +- hosts/flubber-machine/default.nix | 3 +- hosts/flubber-machine/hardware.nix | 6 +- hosts/goopnet-interface/default.nix | 3 +- modules/desktop/awww.nix | 2 +- modules/desktop/cliphist.nix | 32 ----- modules/desktop/dunst.nix | 32 ++--- modules/desktop/fonts.nix | 2 + modules/desktop/fuzzel.nix | 38 ------ modules/desktop/hyprlock.nix | 12 +- modules/desktop/niri.nix | 16 +-- modules/desktop/regreet.nix | 11 +- modules/desktop/rofi.nix | 16 +++ modules/desktop/themes/catppuccin/default.nix | 45 +++---- .../themes/{catppuccin => config}/rofi.rasi | 32 ++--- .../themes/{catppuccin => config}/waybar.css | 101 +++++++------- modules/desktop/themes/default.nix | 107 ++++++++------- modules/desktop/themes/gruvbox/gruvbox.nix | 82 ++++++++++++ modules/desktop/vicinae.nix | 33 ++++- modules/desktop/waybar.nix | 21 ++- modules/hardware/rgb.nix | 2 +- modules/software/distractions/discord.nix | 4 +- modules/software/editors/micro.nix | 3 +- modules/software/system/fish.nix | 5 +- modules/software/system/mpv.nix | 4 +- modules/software/system/wezterm.nix | 2 +- packages/loveletter/default.nix | 28 ++++ packages/loveletter/loveletter.ttf | Bin 0 -> 57604 bytes 30 files changed, 410 insertions(+), 371 deletions(-) delete mode 100644 modules/desktop/cliphist.nix delete mode 100644 modules/desktop/fuzzel.nix rename modules/desktop/themes/{catppuccin => config}/rofi.rasi (66%) rename modules/desktop/themes/{catppuccin => config}/waybar.css (69%) create mode 100644 modules/desktop/themes/gruvbox/gruvbox.nix create mode 100644 packages/loveletter/default.nix create mode 100755 packages/loveletter/loveletter.ttf diff --git a/default.nix b/default.nix index 64fb9ce..35e6439 100755 --- a/default.nix +++ b/default.nix @@ -8,7 +8,7 @@ in { imports = [ inputs.home-manager.nixosModules.home-manager (mkAliasOptionModule ["hm"] ["home-manager" "users" config.user.name]) - inputs.nix-colors.homeManagerModules.default # >home manager modules >in non-hm modules + inputs.base16.nixosModule inputs.nix-index-database.nixosModules.default inputs.t2fanrd.nixosModules.t2fanrd inputs.niri.nixosModules.niri diff --git a/flake.lock b/flake.lock index 562163d..7963f91 100644 --- a/flake.lock +++ b/flake.lock @@ -1,18 +1,20 @@ { "nodes": { - "base16-schemes": { - "flake": false, + "base16": { + "inputs": { + "fromYaml": "fromYaml" + }, "locked": { - "lastModified": 1696158499, - "narHash": "sha256-5yIHgDTPjoX/3oDEfLSQ0eJZdFL1SaCfb9d6M0RmOTM=", - "owner": "tinted-theming", - "repo": "base16-schemes", - "rev": "a9112eaae86d9dd8ee6bb9445b664fba2f94037a", + "lastModified": 1755819240, + "narHash": "sha256-qcMhnL7aGAuFuutH4rq9fvAhCpJWVHLcHVZLtPctPlo=", + "owner": "senchopens", + "repo": "base16.nix", + "rev": "75ed5e5e3fce37df22e49125181fa37899c3ccd6", "type": "github" }, "original": { - "owner": "tinted-theming", - "repo": "base16-schemes", + "owner": "senchopens", + "repo": "base16.nix", "type": "github" } }, @@ -139,19 +141,19 @@ "type": "github" } }, - "fuzzel-catppuccin": { + "fromYaml": { "flake": false, "locked": { - "lastModified": 1771578346, - "narHash": "sha256-+/7lxQTRDZ0m+GAAFIjvFt8EXDeqZUtv0pLnNgaauZw=", - "owner": "catppuccin", - "repo": "fuzzel", - "rev": "879879da8a7dc58f173b4cd7987723fd19bef6d5", + "lastModified": 1731966426, + "narHash": "sha256-lq95WydhbUTWig/JpqiB7oViTcHFP8Lv41IGtayokA8=", + "owner": "SenchoPens", + "repo": "fromYaml", + "rev": "106af9e2f715e2d828df706c386a685698f3223b", "type": "github" }, "original": { - "owner": "catppuccin", - "repo": "fuzzel", + "owner": "SenchoPens", + "repo": "fromYaml", "type": "github" } }, @@ -380,25 +382,6 @@ "type": "github" } }, - "nix-colors": { - "inputs": { - "base16-schemes": "base16-schemes", - "nixpkgs-lib": "nixpkgs-lib_2" - }, - "locked": { - "lastModified": 1707825078, - "narHash": "sha256-hTfge2J2W+42SZ7VHXkf4kjU+qzFqPeC9k66jAUBMHk=", - "owner": "misterio77", - "repo": "nix-colors", - "rev": "b01f024090d2c4fc3152cd0cf12027a7b8453ba1", - "type": "github" - }, - "original": { - "owner": "misterio77", - "repo": "nix-colors", - "type": "github" - } - }, "nix-index-database": { "inputs": { "nixpkgs": [ @@ -450,21 +433,6 @@ "type": "github" } }, - "nixpkgs-lib_2": { - "locked": { - "lastModified": 1697935651, - "narHash": "sha256-qOfWjQ2JQSQL15KLh6D7xQhx0qgZlYZTYlcEiRuAMMw=", - "owner": "nix-community", - "repo": "nixpkgs.lib", - "rev": "e1e11fdbb01113d85c7f41cada9d2847660e3902", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "nixpkgs.lib", - "type": "github" - } - }, "nixpkgs-stable": { "locked": { "lastModified": 1776221942, @@ -561,40 +529,22 @@ "type": "github" } }, - "rofi-catppuccin": { - "flake": false, - "locked": { - "lastModified": 1752883501, - "narHash": "sha256-81eeFjwM/haPjIEWkZPp1JSDwhWbWDAuKtWiCg7P9Q0=", - "owner": "catppuccin", - "repo": "rofi", - "rev": "71fb15577ccb091df2f4fc1f65710edbc61b5a53", - "type": "github" - }, - "original": { - "owner": "catppuccin", - "repo": "rofi", - "type": "github" - } - }, "root": { "inputs": { + "base16": "base16", "cachyos-kernel": "cachyos-kernel", "catppuccin": "catppuccin", - "fuzzel-catppuccin": "fuzzel-catppuccin", "hardware": "hardware", "home-manager": "home-manager", "hyprlock": "hyprlock", "niri": "niri", - "nix-colors": "nix-colors", "nix-index-database": "nix-index-database", "nixpkgs": "nixpkgs_4", - "rofi-catppuccin": "rofi-catppuccin", "systems": "systems_2", "t2fanrd": "t2fanrd", + "tt-schemes": "tt-schemes", "vicinae": "vicinae", - "vicinae-extensions": "vicinae-extensions", - "waybar-catppuccin": "waybar-catppuccin" + "vicinae-extensions": "vicinae-extensions" } }, "systems": { @@ -675,6 +625,22 @@ "type": "github" } }, + "tt-schemes": { + "flake": false, + "locked": { + "lastModified": 1776808072, + "narHash": "sha256-FwuOyAWXsdG7/1TpndL0gYPzBh5XOi1gNliZB774VaA=", + "owner": "tinted-theming", + "repo": "schemes", + "rev": "d5ddce0697a91203fd3eccc40140890a69fc279e", + "type": "github" + }, + "original": { + "owner": "tinted-theming", + "repo": "schemes", + "type": "github" + } + }, "vicinae": { "inputs": { "nixpkgs": "nixpkgs_6", @@ -742,22 +708,6 @@ "type": "github" } }, - "waybar-catppuccin": { - "flake": false, - "locked": { - "lastModified": 1720870206, - "narHash": "sha256-za0y6hcN2rvN6Xjf31xLRe4PP0YyHu2i454ZPjr+lWA=", - "owner": "catppuccin", - "repo": "waybar", - "rev": "ee8ed32b4f63e9c417249c109818dcc05a2e25da", - "type": "github" - }, - "original": { - "owner": "catppuccin", - "repo": "waybar", - "type": "github" - } - }, "xwayland-satellite-stable": { "flake": false, "locked": { diff --git a/flake.nix b/flake.nix index 326097e..54fe00e 100644 --- a/flake.nix +++ b/flake.nix @@ -9,7 +9,8 @@ home-manager.inputs.nixpkgs.follows = "nixpkgs"; hardware.url = "github:nixos/nixos-hardware"; - nix-colors.url = "github:misterio77/nix-colors"; + + base16.url = "github:senchopens/base16.nix"; nix-index-database.url = "github:nix-community/nix-index-database"; nix-index-database.inputs.nixpkgs.follows = "nixpkgs"; @@ -29,12 +30,8 @@ catppuccin.url = "github:catppuccin/nix"; - waybar-catppuccin.url = "github:catppuccin/waybar"; - waybar-catppuccin.flake = false; - fuzzel-catppuccin.url = "github:catppuccin/fuzzel"; - fuzzel-catppuccin.flake = false; - rofi-catppuccin.url = "github:catppuccin/rofi"; - rofi-catppuccin.flake = false; + tt-schemes.url = "github:tinted-theming/schemes"; + tt-schemes.flake = false; }; outputs = inputs @ { self, nixpkgs, systems, ... }: diff --git a/hosts/flubber-machine/default.nix b/hosts/flubber-machine/default.nix index 09f510c..f6aad81 100755 --- a/hosts/flubber-machine/default.nix +++ b/hosts/flubber-machine/default.nix @@ -66,10 +66,9 @@ waybar.enable = true; wob.enable = true; gammastep.enable = true; - # fuzzel.enable = true; - # cliphist.enable = true; wl-clip-persist.enable = true; vicinae.enable = true; + vicinae.dmenu = true; # display manager regreet.enable = true; diff --git a/hosts/flubber-machine/hardware.nix b/hosts/flubber-machine/hardware.nix index 85398df..112917c 100755 --- a/hosts/flubber-machine/hardware.nix +++ b/hosts/flubber-machine/hardware.nix @@ -4,17 +4,19 @@ imports = [ inputs.hardware.nixosModules.common-cpu-amd + inputs.hardware.nixosModules.common-cpu-amd-zenpower inputs.hardware.nixosModules.common-gpu-amd inputs.hardware.nixosModules.common-pc-ssd inputs.hardware.nixosModules.common-pc + inputs.hardware.nixosModules.msi-b550-a-pro # pro b550m-vc, not b550-a pro, but they use mostly the same chips (modulesPath + "/installer/scan/not-detected.nix") ]; boot.initrd.availableKernelModules = [ "xhci_pci" "ehci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" "sdhci_pci" ]; boot.initrd.kernelModules = [ ]; - boot.kernelModules = [ "kvm-amd" "amdgpu" ]; - boot.extraModulePackages = [ ]; + boot.kernelModules = [ "kvm-amd" "zenergy" ]; + boot.extraModulePackages = with config.boot.kernelPackages; [ zenergy ]; boot.loader.systemd-boot.enable = true; boot.loader.efi.canTouchEfiVariables = true; diff --git a/hosts/goopnet-interface/default.nix b/hosts/goopnet-interface/default.nix index 7ceb261..d09e768 100755 --- a/hosts/goopnet-interface/default.nix +++ b/hosts/goopnet-interface/default.nix @@ -63,10 +63,9 @@ batsignal.enable = true; wob.enable = true; gammastep.enable = true; - # cliphist.enable = true; - # fuzzel.enable = true; wl-clip-persist.enable = true; vicinae.enable = true; + vicinae.dmenu = true; # display manager regreet.enable = true; diff --git a/modules/desktop/awww.nix b/modules/desktop/awww.nix index 1eca551..0745cfd 100644 --- a/modules/desktop/awww.nix +++ b/modules/desktop/awww.nix @@ -44,7 +44,7 @@ in { default = pkgs.writeShellScript "awww-swap" '' set -euo pipefail - file=$(ls ${cfg.wallpapersFolder} | ${lib.getExe config.modules.desktop.rofi.package} -dmenu -sep '\n' -i -p "select a wallpaper") + file=$(ls ${cfg.wallpapersFolder} | dmenu -p "select a wallpaper") wallpaper="${cfg.wallpapersFolder}/$file" [ ! -f "$wallpaper" ] && exit 1 diff --git a/modules/desktop/cliphist.nix b/modules/desktop/cliphist.nix deleted file mode 100644 index 241d6b2..0000000 --- a/modules/desktop/cliphist.nix +++ /dev/null @@ -1,32 +0,0 @@ -{ lib, config, pkgs, inputs, ... }: - -with lib; -let - cfg = config.modules.desktop.cliphist; -in { - options.modules.desktop.cliphist = { - enable = mkEnableOption "enable cliphist, a clipboard manager for wayland"; - package = mkOption { - type = types.package; - default = pkgs.cliphist; - }; - summonScript = mkOption { - type = types.package; - default = pkgs.writeShellScript "cliphist-summon" '' - set -euo pipefail - - ${lib.getExe cfg.package} list | ${lib.getExe config.modules.desktop.fuzzel.package} --dmenu | ${lib.getExe cfg.package} decode | wl-copy - ''; - }; - }; - - config = mkIf cfg.enable { - hm.services.cliphist = { - enable = true; - allowImages = true; - package = cfg.package; - }; - - modules.desktop.rofi.enable = true; - }; -} diff --git a/modules/desktop/dunst.nix b/modules/desktop/dunst.nix index 820255a..93b51ec 100644 --- a/modules/desktop/dunst.nix +++ b/modules/desktop/dunst.nix @@ -12,20 +12,22 @@ in { hm.services.dunst = { enable = true; - settings = with config.colorScheme.palette; { + settings = let + inherit (config.modules.desktop.themes) rounding padding; + in with config.scheme.withHashtag; { global = { follow = "mouse"; width = 300; height = 145; - frame_color = "#${base02}"; + frame_color = "${base02}"; origin = "top-right"; # various non-color theming settings - offset = "15x15"; - padding = 15; - horizontal_padding = 15; - text_icon_padding = 15; - corner_radius = 8; + offset = let offset = builtins.toString (padding * 2); in "${offset}x${offset}"; + padding = padding; + horizontal_padding = padding; + text_icon_padding = padding; + corner_radius = rounding; gap_size = 0; frame_width = 1; @@ -33,7 +35,7 @@ in { progress_bar = true; progress_bar_frame_width = 1; - progress_bar_corner_radius = 8; + progress_bar_corner_radius = rounding; alignment = "left"; markup = "full"; @@ -56,19 +58,19 @@ in { }; urgency_low = { - background = "#${base00}FF"; - foreground = "#${base05}"; + background = "${base00}FF"; + foreground = "${base05}"; }; urgency_normal = { - background = "#${base00}FF"; - foreground = "#${base05}"; + background = "${base00}FF"; + foreground = "${base05}"; }; urgency_critical = { - background = "#${base00}FF"; - foreground = "#${base05}"; - frame_color = "#${base08}"; # base16 spec says red + background = "${base00}FF"; + foreground = "${base05}"; + frame_color = "${base08}"; # base16 spec says red }; }; }; diff --git a/modules/desktop/fonts.nix b/modules/desktop/fonts.nix index 8162c65..3088db2 100644 --- a/modules/desktop/fonts.nix +++ b/modules/desktop/fonts.nix @@ -123,6 +123,8 @@ in { noto-fonts-color-emoji noto-fonts-monochrome-emoji font-awesome + + pkgs.my.loveletter ]; }) ]); diff --git a/modules/desktop/fuzzel.nix b/modules/desktop/fuzzel.nix deleted file mode 100644 index b468d24..0000000 --- a/modules/desktop/fuzzel.nix +++ /dev/null @@ -1,38 +0,0 @@ -{ lib, config, pkgs, ... }: - -with lib; -let - cfg = config.modules.desktop.fuzzel; -in { - options.modules.desktop.fuzzel = { - enable = mkEnableOption "Enable fuzzel, an application launcher similar to rofi's drun mode"; - package = mkOption { - type = types.package; - default = pkgs.fuzzel; - }; - }; - - config = mkIf cfg.enable { - hm.programs.fuzzel = { - enable = true; - package = cfg.package; - settings = { - main = { - terminal = "wezterm start"; - font = with config.modules.desktop.fonts.fonts.monospace; "${family}:pixelsize=${toString size}"; - prompt = "> "; - dpi-aware = "no"; - lines = 20; - width = 28; - letter-spacing = 0.5; - horizontal-pad = 32; - vertical-pad = 8; - }; - border = { - width = 1; - radius = config.modules.desktop.fonts.fonts.monospace.size; - }; - }; - }; - }; -} diff --git a/modules/desktop/hyprlock.nix b/modules/desktop/hyprlock.nix index b5e6849..45da687 100644 --- a/modules/desktop/hyprlock.nix +++ b/modules/desktop/hyprlock.nix @@ -20,7 +20,9 @@ in { enable = true; package = cfg.package; - settings = with config.colorScheme.palette; { + settings = let + inherit (config.modules.desktop.themes) rounding; + in with config.scheme; { general = { hide_cursor = false; text_trim = true; @@ -38,7 +40,7 @@ in { { size = "280, 280"; color = "rgb(${base00})"; - rounding = 48; + rounding = rounding; position = "0, 45"; halign = "center"; valign = "center"; @@ -52,8 +54,7 @@ in { position = "0, 105"; text = "cmd[update:1000] echo \"$(date +'%H')\""; font_size = 78; - # TODO: make more dynamic - color = "rgb(f5c2e7)"; # catppuccin pink + color = "rgb(${base05})"; font_family = config.modules.desktop.fonts.fonts.sansSerif.family; halign = "center"; valign = "center"; } @@ -100,7 +101,8 @@ in { { position = "0, -140"; size = "280, 48"; - outline_thickness = 2; + rounding = rounding; + outline_thickness = 1; dots_size = 0.3; fade_on_empty = false; placeholder_text = ""; diff --git a/modules/desktop/niri.nix b/modules/desktop/niri.nix index cded1ec..58f2d77 100644 --- a/modules/desktop/niri.nix +++ b/modules/desktop/niri.nix @@ -65,7 +65,7 @@ in { }; layout = { - gaps = 6; + gaps = config.modules.desktop.themes.padding; center-focused-column = "on-overflow"; @@ -229,7 +229,7 @@ in { # TODO: configure popups window-rules = [ { - geometry-corner-radius = allCorners 10.0; + geometry-corner-radius = allCorners (config.modules.desktop.themes.rounding * 1.0); clip-to-geometry = true; } { @@ -310,7 +310,6 @@ in { ]; # TODO: add shadows onto notifications. weird geometry beware !!! - # TODO: rounded vicinae layer-rules = [ { matches = [ @@ -318,13 +317,11 @@ in { # obliterate all dmenu-like things--too dangerous to stream (clipboard history, passwords) { namespace = "^rofi$"; } { namespace = "^vicinae$"; } - { namespace = "^launcher$"; } ]; block-out-from = "screen-capture"; } { matches = [ - { namespace = "^launcher$"; } { namespace = "^rofi$"; } { namespace = "^vicinae$"; } { namespace = "^wob$"; } @@ -339,13 +336,12 @@ in { } # shadow rounded corner cases... # defined in program config but we need to edit geometry too for shadows!! - # monospace { matches = [ - { namespace = "^launcher$"; } { namespace = "^rofi$"; } + { namespace = "^vicinae$"; } ]; - geometry-corner-radius = allCorners (config.modules.desktop.fonts.fonts.monospace.size * 1.0); # its 1em, so + geometry-corner-radius = allCorners (config.modules.desktop.themes.rounding * 1.0); } ]; @@ -354,7 +350,6 @@ in { in { "Mod+Shift+Slash".action = show-hotkey-overlay; - # "Mod+D".action = spawn "fuzzel"; "Mod+D".action = spawn "vicinae" "vicinae://toggle"; "Mod+Q".action = close-window; @@ -431,7 +426,7 @@ in { "Mod+Shift+Minus".action = set-window-height "-10%"; "Mod+Shift+Equal".action = set-window-height "+10%"; - "Print".action.screenshot = { show-pointer = false; }; + "Print".action.screenshot-screen = { show-pointer = false; }; "Mod+Grave".action = toggle-overview; @@ -457,7 +452,6 @@ in { "XF86AudioNext".action = sh "${lib.getExe pkgs.playerctl} next"; "Mod+Shift+C".action = sh "${lib.getExe pkgs.hyprpicker} -a"; - # "Mod+V".action = sh "${config.modules.desktop.cliphist.summonScript}"; "Mod+V".action = spawn "vicinae" "vicinae://extensions/vicinae/clipboard/history"; "Mod+Shift+Control+T".action = toggle-debug-tint; diff --git a/modules/desktop/regreet.nix b/modules/desktop/regreet.nix index 2e4a0ff..8246def 100644 --- a/modules/desktop/regreet.nix +++ b/modules/desktop/regreet.nix @@ -13,20 +13,25 @@ in { services.greetd = { enable = true; settings = { + # TODO: fix focus requiring a mouse click default_session = let + swaymsg = "${pkgs.sway}/bin/swaymsg"; swayConfig = let monitors = config.modules.desktop.monitors; monitorConfig = if monitors.enable && (builtins.length monitors.monitors > 0) then let firstMonitor = builtins.head monitors.monitors; - in - "output ${firstMonitor.name} scale ${toString firstMonitor.scale}" + in '' + output "${firstMonitor.name}" scale ${toString firstMonitor.scale} + workspace 1 output "${firstMonitor.name}" + for_window [all] move container to workspace 1 + '' else ""; in command: pkgs.writeText "kiosk-sway-config" '' ${monitorConfig} xwayland disable - exec '${command}; ${pkgs.sway}/bin/swaymsg exit' + exec '${swaymsg} workspace 1; ${command}; ${swaymsg} exit' ''; swayKiosk = command: "${pkgs.dbus}/bin/dbus-run-session ${lib.getExe pkgs.sway} --unsupported-gpu --config ${swayConfig command}"; in { diff --git a/modules/desktop/rofi.nix b/modules/desktop/rofi.nix index f216a8e..0309842 100644 --- a/modules/desktop/rofi.nix +++ b/modules/desktop/rofi.nix @@ -6,6 +6,7 @@ let in { options.modules.desktop.rofi = { enable = mkEnableOption "Enable rofi, a window switcher, run dialog and dmenu replacement"; + dmenu = mkEnableOption "Use as a replacement for dmenu"; package = mkOption { type = types.package; default = pkgs.rofi-unwrapped; @@ -23,5 +24,20 @@ in { show-icons = true; }; }; + + user.packages = mkIf cfg.dmenu [ (pkgs.writeShellScriptBin "dmenu" '' + set -euo pipefail + + prompt="select option" + + while [ $# -gt 0 ]; do + case "$1" in + -p) shift; prompt="$1" ;; + esac + shift + done + + rofi -dmenu -i -p "$prompt" + '') ]; }; } diff --git a/modules/desktop/themes/catppuccin/default.nix b/modules/desktop/themes/catppuccin/default.nix index 4c86288..42ac2a6 100644 --- a/modules/desktop/themes/catppuccin/default.nix +++ b/modules/desktop/themes/catppuccin/default.nix @@ -4,14 +4,16 @@ with lib; let cfg = config.modules.desktop.themes; accent = "pink"; + accentBase = "base17"; variant = "mocha"; dark = variant != "latte"; - colorScheme = inputs.nix-colors.colorSchemes.${"catppuccin-${variant}"}; + darkString = if dark then "dark" else "light"; + scheme = "${inputs.tt-schemes}/base24/catppuccin-${variant}.yaml"; pascalCase = s: (toUpper (substring 0 1 s)) + (toLower (substring 1 (stringLength s) s)); in { config = mkIf (cfg.active == "catppuccin") { - colorScheme = colorScheme; + scheme = scheme; modules.desktop.themes = { dark = dark; @@ -35,14 +37,13 @@ in { }; iconTheme = { - name = "WhiteSur-${if dark then "dark" else "light"}"; + name = "WhiteSur-${darkString}"; package = pkgs.whitesur-icon-theme; }; cursorTheme = { - name = "graphite-${if dark then "dark" else "light"}"; - package = pkgs.graphite-cursors; - size = 24; + name = "macOS"; + package = pkgs.apple-cursor; }; editor = { @@ -68,36 +69,24 @@ in { }; }; - niri = with colorScheme.palette; { - # TODO: make more dynamic - # catppuccin pink - accent = "#f5c2e7"; - inactive = "#${base02}"; - # catppuccin crust - shadow = "#11111b"; - # catppuccin crust - background = "#11111b"; + niri = let + colors = config.scheme.withHashtag; + in with colors; { + accent = colors.${accentBase}; + inactive = "${base02}"; + shadow = "${base11}"; + background = if dark then "${base11}" else "${base05}"; }; - waybar = builtins.concatStringsSep "\n" [ - "@import \"${inputs.waybar-catppuccin}/themes/${variant}.css\";" - "@define-color accent @${accent};" - (lib.readFile ./waybar.css) - ]; + waybarTop = "@define-color accent @${accentBase};"; - wob = with colorScheme.palette; { + wob = with config.scheme; { borderColor = "${base04}FF"; backgroundColor = "${base01}CC"; barColor = "${base05}FF"; }; - rofi = builtins.concatStringsSep "\n" [ - "@theme \"${inputs.rofi-catppuccin}/themes/catppuccin-${variant}.rasi\"" - "* { accent: @${accent}; }" - (lib.readFile ./rofi.rasi) - ]; - - fuzzel = "${inputs.fuzzel-catppuccin}/themes/catppuccin-${variant}/${accent}.ini"; + rofiTop = "* { accent: @${accentBase}; }"; wezterm = '' config.color_scheme = 'Catppuccin ${pascalCase variant}' diff --git a/modules/desktop/themes/catppuccin/rofi.rasi b/modules/desktop/themes/config/rofi.rasi similarity index 66% rename from modules/desktop/themes/catppuccin/rofi.rasi rename to modules/desktop/themes/config/rofi.rasi index eccabf6..0197829 100644 --- a/modules/desktop/themes/catppuccin/rofi.rasi +++ b/modules/desktop/themes/config/rofi.rasi @@ -10,27 +10,27 @@ element-text, element-icon , mode-switcher { window { height: 500px; border: 1px; - border-radius: 1em; + border-radius: @roundingpx; border-color: @accent; - background-color: @base; + background-color: @base00; } mainbox { - background-color: @base; + background-color: @base00; } inputbar { margin: 10px 5px 5px 5px; children: [prompt, entry]; - background-color: @base; + background-color: @base00; padding: 1px; } prompt { background-color: transparent; padding: 1px; - text-color: @text; - border-radius: 1.5em; + text-color: @base05; + border-radius: @roundingpx; } textbox-prompt-colon { @@ -41,8 +41,8 @@ textbox-prompt-colon { entry { padding: 1px; margin: 0px; - text-color: @text; - background-color: @base; + text-color: @base05; + background-color: @base00; } listview { @@ -50,26 +50,26 @@ listview { margin: 5px 0px 0px 10px; columns: 1; lines: 10; - background-color: @base; + background-color: @base00; } element { padding: 1px; - background-color: @base; - text-color: @text; + background-color: @base00; + text-color: @base05; } element-icon {size: 12px;} element.selected { - background-color: @surface1; + background-color: @base03; text-color: @accent; } scrollbar { width: 4px ; border: 0; - handle-color: @text; + handle-color: @base05; handle-width: 8px ; padding: 0; } @@ -78,13 +78,13 @@ mode-switcher {spacing: 0;} button { spacing: 0; - background-color: @surface0; - text-color: @subtext1; + background-color: @base02; + text-color: @base04; vertical-align: 0.5; horizontal-align: 0.5; } button.selected { - background-color: @base; + background-color: @base00; text-color: @accent; } diff --git a/modules/desktop/themes/catppuccin/waybar.css b/modules/desktop/themes/config/waybar.css similarity index 69% rename from modules/desktop/themes/catppuccin/waybar.css rename to modules/desktop/themes/config/waybar.css index 09990f0..8da7f82 100644 --- a/modules/desktop/themes/catppuccin/waybar.css +++ b/modules/desktop/themes/config/waybar.css @@ -9,21 +9,21 @@ button, button:hover { } window#waybar { - color: @text; - background: alpha(@base, 0.9999999); - border-radius: 1em; + color: @base05; + background: alpha(@base00, 0.9999999); + border-radius: @roundingpx; font-family: "CozetteVector", monospace, "FontAwesome 6 Free", "Noto Sans CJK"; - font-size: 13px; + font-size: 13px; /* TODO: make this use proper font size */ font-style: normal; - border: 1px solid @surface0; + border: 1px solid @base02; } #workspaces, .modules-right box { - background-color: @surface0; + background-color: @base02; margin: 0 0.25em; padding: 0.15em 0.25em; - border-radius: 1em; + border-radius: @roundingpx; } .modules-right label.module { margin: 0 0.5em; @@ -37,32 +37,32 @@ window#waybar { } #workspaces { - background-color: @surface0; + background-color: @base02; padding: 0; } #workspaces button { background-color: transparent; - color: @text; + color: @base05; padding: 0 0.4em; transition: none; } #workspaces button:nth-child(1) { - border-top-left-radius: 1em; - border-bottom-left-radius: 1em; + border-top-left-radius: @roundingpx; + border-bottom-left-radius: @roundingpx; } #workspaces button:nth-last-child(1) { - border-top-right-radius: 1em; - border-bottom-right-radius: 1em; + border-top-right-radius: @roundingpx; + border-bottom-right-radius: @roundingpx; } #workspaces button.empty { - color: @overlay1; + color: @base04; } #workspaces button.visible { - background: @surface1; + background: @base03; } #workspaces button.focused { @@ -71,47 +71,44 @@ window#waybar { #workspaces button.active { background: @accent; - color: @surface0; + color: @base02; } #workspaces button:hover { background: rgba(255, 255, 255, 0.1); - color: @text; + color: @base05; box-shadow: none; } #workspaces button.active:hover { background: @accent; - color: @surface0; + color: @base02; } #workspaces button.urgent { - background: @red; - color: @surface0; + background: @base08; + color: @base02; } #window { background: transparent; } -window#waybar.floating #window { - color: @pink; -} #clock { - color: @lavender; + color: @base07; } #power-profiles-daemon { - color: @teal; + color: @base0C; } #cpu, #network { - color: @sapphire; + color: @base16; } #network.disabled, #network.disconnected { - color: @overlay1; + color: @base04; } @keyframes blink { to { - color: @text; + color: @base05; } } @@ -119,15 +116,15 @@ window#waybar.floating #window { animation-timing-function: linear; animation-iteration-count: infinite; animation-direction: alternate; - color: @lavender; + color: @base07; } #memory.warning { - color: @peach; + color: @base09; animation-name: blink; animation-duration: 3s; } #memory.critical { - color: @maroon; + color: @base12; animation-name: blink; animation-duration: 2s; } @@ -136,40 +133,40 @@ window#waybar.floating #window { animation-timing-function: linear; animation-iteration-count: infinite; animation-direction: alternate; - color: @green; + color: @base0B; } /* this here is ditto */ #battery.charging { - color: @green; + color: @base0B; } #battery.warning.discharging { - color: @peach; + color: @base09; animation-name: blink; animation-duration: 3s; } #battery.critical.discharging { - color: @maroon; + color: @base12; animation-name: blink; animation-duration: 2s; } #backlight, #custom-weather { - color: @yellow; + color: @base0A; } #pulseaudio { - color: @pink; + color: @base17; } #pulseaudio.muted { - color: @overlay1; + color: @base04; } #custom-power { - color: @red; + color: @base08; } #custom-wallpaper, #custom-rgb { - color: @overlay1; + color: @base04; } #privacy { @@ -178,7 +175,7 @@ window#waybar.floating #window { } #privacy-item { padding: 0 1px; - color: @text; + color: @base05; } box#playback { @@ -188,17 +185,17 @@ box#playback { } #mpris { - background-color: @surface0; + background-color: @base02; margin: 0 0.25em; padding: 0.15em 0.5em; - border-radius: 1em; + border-radius: @roundingpx; } #mpris.playing { color: @accent; - background: @surface0; + background: @base02; } #mpris.paused, #mpris.stopped { - color: @overlay1; + color: @base04; } window decoration { @@ -206,10 +203,10 @@ window decoration { } tooltip, window.popup menu { - background: @base; - border: 1px solid @surface2; + background: @base00; + border: 1px solid @base04; font-size: 12px; - color: @text; + color: @base05; } tooltip *, window.popup { font-family: CozetteVector, monospace; @@ -217,20 +214,20 @@ tooltip *, window.popup { tooltip * { padding: 0px; margin: 0px; - color: @text; + color: @base05; } window.popup separator { - background-color: @surface0; + background-color: @base02; } window.popup menuitem:disabled { - color: @overlay1; + color: @base04; } window.popup menuitem:hover { background-color: @accent; - color: @surface0; + color: @base02; } window.popup menuitem:hover > box { diff --git a/modules/desktop/themes/default.nix b/modules/desktop/themes/default.nix index 6bce02b..b155dc9 100644 --- a/modules/desktop/themes/default.nix +++ b/modules/desktop/themes/default.nix @@ -12,35 +12,38 @@ in { description = "Name of the theme to apply; see modules/desktop/themes for a list of valid options"; }; + rounding = mkOpt int 10; + padding = mkOpt int 6; + dark = mkOpt bool false; gtkTheme = { - name = mkOpt str ""; - package = mkPackageOption pkgs "gtk" {}; + name = mkOpt (nullOr str) null; + package = mkOpt (nullOr package) null; }; kvantumTheme = { - name = mkOpt str ""; - package = mkPackageOption pkgs "kvantum" {}; + name = mkOpt (nullOr str) null; + package = mkOpt (nullOr package) null; }; iconTheme = { - name = mkOpt str ""; - package = mkPackageOption pkgs "icon" {}; + name = mkOpt (nullOr str) null; + package = mkOpt (nullOr package) null; }; cursorTheme = { - name = mkOpt str ""; - package = mkPackageOption pkgs "cursor" {}; + name = mkOpt (nullOr str) null; + package = mkOpt (nullOr package) null; size = mkOpt int 24; }; editor = { vscode = { colorTheme = { - name = mkOpt str ""; - extension = mkPackageOption pkgs "extension" {}; + name = mkOpt (nullOr str) null; + extension = mkOpt (nullOr package) null; }; iconTheme = { - name = mkOpt str ""; - extension = mkPackageOption pkgs "extension" {}; + name = mkOpt (nullOr str) null; + extension = mkOpt (nullOr package) null; }; }; }; @@ -52,7 +55,7 @@ in { background = mkOpt str ""; }; - waybar = mkOpt str ""; + waybarTop = mkOpt str ""; wob = { borderColor = mkOpt (nullOr str) null; @@ -60,9 +63,7 @@ in { barColor = mkOpt (nullOr str) null; }; - rofi = mkOpt (nullOr str) null; - - fuzzel = mkOpt (nullOr str) null; + rofiTop = mkOpt (nullOr str) null; wezterm = mkOpt (nullOr str) null; @@ -102,8 +103,8 @@ in { hm.qt = { enable = true; - platformTheme.name = "qtct"; - style.name = "kvantum"; + platformTheme.name = if (cfg.kvantumTheme.name != null) then "qtct" else "gtk3"; + style.name = mkIf (cfg.kvantumTheme.name != null) "kvantum"; }; hm.home.pointerCursor = { @@ -136,7 +137,16 @@ in { }; }; - hm.programs.waybar.style = cfg.waybar; + hm.programs.waybar.style = (builtins.replaceStrings + [ "@rounding" ] + [ (builtins.toString cfg.rounding) ] + (builtins.concatStringsSep "\n" ([ + cfg.waybarTop + (lib.readFile ./config/waybar.css) + ] + ++ lib.zipListsWith (name: hex: "@define-color base${name} #${hex};") + (builtins.genList (i: lib.fixedWidthString 2 "0" (lib.toUpper (lib.toHexString i))) 24) + config.scheme.toList))); hm.services.wob.settings."" = { border_color = cfg.wob.borderColor; @@ -144,18 +154,16 @@ in { bar_color = cfg.wob.barColor; }; - # silly litle hack--rofi hm module doesn't play nice with strings - # so, we have to write the config to a file and then read it :P - # ...and then back to a string - hm.programs.rofi.theme = "${pkgs.writeTextFile { - name = "rofi-theme.rasi"; - text = cfg.rofi; - }}"; - - hm.programs.fuzzel.settings.main = { - include = cfg.fuzzel; - icon-theme = cfg.iconTheme.name; - }; + hm.programs.rofi.theme = builtins.toFile "rofi.rasi" (builtins.replaceStrings + [ "@rounding" ] + [ (builtins.toString cfg.rounding) ] + (builtins.concatStringsSep "\n" ([ + cfg.rofiTop + (lib.readFile ./config/rofi.rasi) + ] + ++ lib.zipListsWith (name: hex: "* { base${name}: #${hex}; }") + (builtins.genList (i: lib.fixedWidthString 2 "0" (lib.toUpper (lib.toHexString i))) 24) + config.scheme.toList))); hm.services.vicinae.settings.theme = let themeConf = { @@ -179,7 +187,7 @@ in { Appearance = { icon_theme = cfg.iconTheme.name; standard_dialogs = "xdgdesktopportal"; - style = "kvantum"; + style = "kvantum"; # its ok if this is always the case, override it anyway }; Fonts = with config.modules.desktop.fonts.fonts; { @@ -187,22 +195,25 @@ in { fixed = ''"${monospace.family},-1,${toString monospace.size},5,${toString weight},${zeros},1"''; }; }; - in { - # technically could cause issues with KDE if we use that - # not a concern for now - "kdeglobals".text = '' - [Icons] - Theme=${cfg.iconTheme.name} - ''; + in mkMerge [ + { + # technically could cause issues with KDE if we use that + # not a concern for now + "kdeglobals".text = '' + [Icons] + Theme=${cfg.iconTheme.name} + ''; - "Kvantum/${cfg.kvantumTheme.name}".source = "${cfg.kvantumTheme.package}/share/Kvantum/${cfg.kvantumTheme.name}"; - "Kvantum/kvantum.kvconfig".text = '' - [General] - theme=${cfg.kvantumTheme.name} - ''; - - "qt5ct/qt5ct.conf".source = iniFmt.generate "qt5ct.conf" (mkQtctConf 5); - "qt6ct/qt6ct.conf".source = iniFmt.generate "qt6ct.conf" (mkQtctConf 6); - }; + "qt5ct/qt5ct.conf".source = iniFmt.generate "qt5ct.conf" (mkQtctConf 5); + "qt6ct/qt6ct.conf".source = iniFmt.generate "qt6ct.conf" (mkQtctConf 6); + } + (mkIf (cfg.kvantumTheme.name != null) { + "Kvantum/${cfg.kvantumTheme.name}".source = "${cfg.kvantumTheme.package}/share/Kvantum/${cfg.kvantumTheme.name}"; + "Kvantum/kvantum.kvconfig".text = '' + [General] + theme=${cfg.kvantumTheme.name} + ''; + }) + ]; }; } diff --git a/modules/desktop/themes/gruvbox/gruvbox.nix b/modules/desktop/themes/gruvbox/gruvbox.nix new file mode 100644 index 0000000..d4f5565 --- /dev/null +++ b/modules/desktop/themes/gruvbox/gruvbox.nix @@ -0,0 +1,82 @@ +{ inputs, config, lib, pkgs, system, ... }: + +with lib; +let + cfg = config.modules.desktop.themes; + # TODO: gruvbox theme doesn't use these that much + accent = "pink"; + accentBase = "base17"; + dark = true; + + darkString = if dark then "dark" else "light"; + scheme = "${inputs.tt-schemes}/base24/gruvbox-${if dark then "dark" else "light"}.yaml"; + pascalCase = s: (toUpper (substring 0 1 s)) + (toLower (substring 1 (stringLength s) s)); +in { + config = mkIf (cfg.active == "gruvbox") { + scheme = scheme; + + modules.desktop.themes = { + dark = dark; + + rounding = 0; + + gtkTheme = { + name = "Gruvbox-${pascalCase accent}-${pascalCase darkString}-Compact"; + package = pkgs.gruvbox-gtk-theme.override { + colorVariants = [ darkString ]; + themeVariants = [ accent ]; + tweakVariants = [ "macos" ]; + sizeVariants = [ "compact" ]; + }; + }; + + iconTheme = { + name = "Gruvbox-Plus-${pascalCase darkString}"; + package = pkgs.gruvbox-plus-icons; + }; + + cursorTheme = { + name = "macOS"; + package = pkgs.apple-cursor; + }; + + editor = { + vscode = { + colorTheme = { + name = "Gruvbox ${pascalCase darkString} Medium"; + extension = pkgs.vscode-extensions.jdinhlife.gruvbox; + }; + iconTheme = { + name = "material-icon-theme"; + extension = pkgs.vscode-extensions.pkief.material-icon-theme; + }; + }; + }; + + niri = let + colors = config.scheme.withHashtag; + in with colors; { + accent = colors.${accentBase}; + inactive = "${base02}"; + shadow = "${base11}"; + background = if dark then "${base11}" else "${base05}"; + }; + + waybarTop = "@define-color accent @${accentBase};"; + + wob = with config.scheme; { + borderColor = "${base04}FF"; + backgroundColor = "${base01}CC"; + barColor = "${base05}FF"; + }; + + rofiTop = "* { accent: @${accentBase}; }"; + + wezterm = '' + config.color_scheme = 'Gruvbox${pascalCase darkString}' + ''; + + vicinae = "gruvbox-${if dark then "dark" else "light"}"; + }; + }; +} diff --git a/modules/desktop/vicinae.nix b/modules/desktop/vicinae.nix index 2b6a52f..5d7c748 100644 --- a/modules/desktop/vicinae.nix +++ b/modules/desktop/vicinae.nix @@ -6,6 +6,7 @@ let in { options.modules.desktop.vicinae = { enable = mkEnableOption "Enable vicinae, a launcher built in react"; + dmenu = mkEnableOption "Use as a replacement for dmenu"; package = mkOption { type = types.package; default = inputs.vicinae.packages.${system}.default; @@ -29,14 +30,15 @@ in { # i disagree with these telemetry.system_info = false; - providers.core.entrypoints.sponsor.enable = false; pop_to_root_on_close = true; launcher_window = { opacity = 0.8; - client_side_decorations.enabled = false; + client_side_decorations.enabled = true; + client_side_decorations.border_width = 0; + client_side_decorations.rounding = config.modules.desktop.themes.rounding; layer_shell = { enabled = true; @@ -51,14 +53,24 @@ in { ]; providers = { + core.entrypoints = { + keybind-settings.enabled = false; + report-bug.enabled = false; + sponsor.enabled = false; + }; applications = { preferences = { defaultAction = "launch"; }; }; - files.enabled = false; + + manage-shortcuts.enabled = false; + theme.enabled = false; + developer.enabled = false; }; + fallbacks = [ "files:search" ]; + escape_key_behavior = "close_window"; font = let @@ -72,5 +84,20 @@ in { nix ] ++ optional config.modules.desktop.niri.enable niri; }; + + user.packages = mkIf cfg.dmenu [ (pkgs.writeShellScriptBin "dmenu" '' + set -euo pipefail + + prompt="select option" + + while [ $# -gt 0 ]; do + case "$1" in + -p) shift; prompt="$1" ;; + esac + shift + done + + vicinae dmenu --placeholder "$prompt" + '') ]; }; } diff --git a/modules/desktop/waybar.nix b/modules/desktop/waybar.nix index f63fa3a..1e71a97 100644 --- a/modules/desktop/waybar.nix +++ b/modules/desktop/waybar.nix @@ -23,16 +23,18 @@ in { systemd.enable = true; package = cfg.package; - settings = { + settings = let + inherit (config.modules.desktop.themes) padding; + in { mainBar = mkMerge [ { layer = "top"; position = "top"; spacing = 4; height = 32; - margin-top = 6; - margin-left = 6; - margin-right = 6; + margin-top = padding; + margin-left = padding; + margin-right = padding; margin-bottom = 0; modules-left = [ "niri/workspaces" @@ -81,7 +83,16 @@ in { powerMenuScript = pkgs.writeShellScript "power-menu" '' set -euo pipefail - cmd=$(echo '⏻ shutdown|↻ reboot|󰒲 sleep| hibernate| lock|⎋ exit desktop environment' | ${lib.getExe config.modules.desktop.rofi.package} -dmenu -sep '|' -i -p 'what to do ?') + cmd=$( + printf "%s\n" \ + "⏻ shutdown" \ + "↻ reboot" \ + "󰒲 sleep" \ + " hibernate" \ + " lock" \ + "⎋ exit desktop environment" \ + | dmenu -p "what to do ?" + ) case "$cmd" in "⏻ shutdown") poweroff diff --git a/modules/hardware/rgb.nix b/modules/hardware/rgb.nix index 85c8f19..6f5ec07 100644 --- a/modules/hardware/rgb.nix +++ b/modules/hardware/rgb.nix @@ -21,7 +21,7 @@ in { find /var/lib/OpenRGB -name "*.orp" 2>/dev/null ) - selected=$(printf '%s\n' "''${files[@]}" | xargs -n1 basename | ${lib.getExe config.modules.desktop.rofi.package} -dmenu -i -p "select profile") + selected=$(printf '%s\n' "''${files[@]}" | xargs -n1 basename | dmenu -p "select profile") [[ -z "$selected" ]] && exit 0 diff --git a/modules/software/distractions/discord.nix b/modules/software/distractions/discord.nix index f7f3f11..3158185 100644 --- a/modules/software/distractions/discord.nix +++ b/modules/software/distractions/discord.nix @@ -17,8 +17,6 @@ in { }; config = mkIf cfg.enable { - user.packages = [ - finalPackage - ]; + user.packages = [ finalPackage ]; }; } diff --git a/modules/software/editors/micro.nix b/modules/software/editors/micro.nix index 4f2fd23..be9fd21 100644 --- a/modules/software/editors/micro.nix +++ b/modules/software/editors/micro.nix @@ -28,7 +28,8 @@ in { }; }; - hm.xdg.configFile."micro/colorschemes/${schemeName}.micro".text = with config.colorScheme.palette; '' + # TODO: rework these.. + hm.xdg.configFile."micro/colorschemes/${schemeName}.micro".text = with config.scheme; '' color-link default "#${base05},#${base00}" color-link comment "#${base03},#${base00}" color-link identifier "#${base0D},#${base00}" diff --git a/modules/software/system/fish.nix b/modules/software/system/fish.nix index 76bbbf3..89ea33b 100644 --- a/modules/software/system/fish.nix +++ b/modules/software/system/fish.nix @@ -24,9 +24,7 @@ in { programs.fish.enable = true; users.defaultUserShell = pkgs.fish; - hm.programs.fish = let - colorScript = nix-colors-lib.shellThemeFromScheme { scheme = config.colorScheme; }; - in { + hm.programs.fish = { enable = true; plugins = let mkPlugin = name: { @@ -43,7 +41,6 @@ in { ]; interactiveShellInit = '' ${lib.getExe pkgs.nix-your-shell} fish | source - sh ${colorScript} ''; functions.fish_greeting = '' ${lib.getExe pkgs.fastfetch} --logo-type small --key-width 11 -s title:separator:os:host:kernel:uptime:memory:swap diff --git a/modules/software/system/mpv.nix b/modules/software/system/mpv.nix index b4b98b1..163a60b 100644 --- a/modules/software/system/mpv.nix +++ b/modules/software/system/mpv.nix @@ -24,10 +24,10 @@ in { visualizer = { mode = "noalbumart"; }; - modernz = with config.colorScheme.palette; { + modernz = with config.scheme.withHashtag; { bottomhover = "no"; hover_effect = ""; # these are weird lookin - seekbarfg_color = "#${base0D}"; # blue is a sane default + seekbarfg_color = "${base0D}"; # blue is a sane default }; }; diff --git a/modules/software/system/wezterm.nix b/modules/software/system/wezterm.nix index 8f96a9f..f64d193 100644 --- a/modules/software/system/wezterm.nix +++ b/modules/software/system/wezterm.nix @@ -36,7 +36,7 @@ in { config.freetype_load_flags = 'MONOCHROME' config.enable_wayland = true config.use_fancy_tab_bar = false - config.use_resize_increments = true + config.use_resize_increments = false config.initial_cols = 120 config.initial_rows = 40 config.window_background_opacity = 0.8 diff --git a/packages/loveletter/default.nix b/packages/loveletter/default.nix new file mode 100644 index 0000000..ab5a372 --- /dev/null +++ b/packages/loveletter/default.nix @@ -0,0 +1,28 @@ +{ lib, stdenvNoCC }: + +stdenvNoCC.mkDerivation { + pname = "loveletter"; + version = "1.0.0"; + + # i think i got this off of a cd collection on nyaa and it had some bootleg stuff too + # looks to be the same as http://www.konaka.com/alice6/lain/resources.html + # downloaded locally bcz the source's uptime isn't trustworthy + + src = ./.; + + installPhase = '' + runHook preInstall + + install -Dm644 -t $out/share/fonts/truetype ./loveletter.ttf + + runHook postInstall + ''; + + meta = with lib; { + description = "The LoveLetter font as featured in Serial Experiments Lain"; + homepage = "http://www.konaka.com/alice6/lain/resources.html"; + # idk what to put here: + # license = licenses.ofl; + platforms = platforms.all; + }; +} diff --git a/packages/loveletter/loveletter.ttf b/packages/loveletter/loveletter.ttf new file mode 100755 index 0000000000000000000000000000000000000000..c8774306b73b97ff88de77306f670bf30dbd500e GIT binary patch literal 57604 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↦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 literal 0 HcmV?d00001