-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
-
33
-
34
-
35
-
36
-
37
-
38
-
39
-
40
-
41
-
42
-
43
-
44
-
45
-
46
-
47
-
48
-
49
-
50
-
51
-
52
-
53
-
54
-
55
-
56
-
57
-
58
-
59
-
60
-
61
-
62
-
63
-
64
-
65
-
66
# Dynamically generates a wallpaper (PNG) based on specified Catppuccin flavor.
#
# -- Why `mocha` is required?
# The `source.svg` hard-codes mocha colors.
# Mocha palette is required for replace those with specified flavor.
{ pkgs, flavor, colors, mocha, width, height }:
pkgs.stdenv.mkDerivation rec {
version = "0.0.1";
pname = "catppuccin-${flavor}-wallpaper";
src = ./.;
builtInputs = [ pkgs.resvg pkgs.replace ];
phases = [ "buildPhase" "installPhase" ];
# ┌─────────────────────┐
# │Is it "mocha" flavor?│
# └─┬───────────┬───────┘
# │Yes No │
# │ ┌───▼─────────────────────┐
# │ │Replace SVG fills/strokes│
# │ └───┬─────────────────────┘
# │ │
# ┌─▼───────────▼────────┐
# │Render PNG using resvg│
# └──────────────────────┘
buildPhase =
let
# Replace mocha colors to specified flavor's colors.
replaceColors = pkgs.lib.trivial.pipe mocha
[
(pkgs.lib.attrsets.mapAttrsToList (
name: value:
let
old = value.hex;
new = colors.${name}.hex;
in
# Skip the argument if same, otherwise replace-literal exits with an error
if old == new then
null
else
"\"${value.hex}\" \"${colors.${name}.hex}\""
))
(builtins.filter builtins.isString)
(pkgs.lib.strings.concatStringsSep " -a ")
];
# Skip replace-literal if there is no replace argument, otherwise it exits with an error
replaceStep =
if replaceColors == "" then
"cp $src/source.svg wallpaper.svg"
else
"cat $src/source.svg | ${pkgs.replace}/bin/replace-literal ${replaceColors} > wallpaper.svg";
in
with colors; ''
${replaceStep}
${pkgs.resvg}/bin/resvg -w ${builtins.toString width} -h ${builtins.toString height} --background "${base.hex}" wallpaper.svg out.png
'';
installPhase = ''
mkdir -p $out/usr/share/backgrounds
cp out.png $out/usr/share/backgrounds/catppuccin-${flavor}.png
'';
}