{
  lib,
  stdenv,
  fetchFromGitHub,
  gtk-engine-murrine,
  jdupes,
  sassc,
  accent ? ["default"],
  shade ? "dark",
  size ? "standard",
  tweaks ? [],
}: let
  validAccents = ["default" "purple" "pink" "red" "orange" "yellow" "green" "teal" "grey" "all"];
  validShades = ["light" "dark"];
  validSizes = ["standard" "compact"];
  validTweaks = ["frappe" "macchiato" "black" "float" "outline" "macos"];

  single = x: lib.optional (x != null) x;
  pname = "Catppuccin-GTK";
in
  lib.checkListOfEnum "${pname} Valid theme accent(s)" validAccents accent
  lib.checkListOfEnum "${pname} Valid shades" validShades (single shade)
  lib.checkListOfEnum "${pname} Valid sizes" validSizes (single size)
  lib.checkListOfEnum "${pname} Valid tweaks" validTweaks tweaks

  stdenv.mkDerivation {
    pname = "magnetic-${lib.toLower pname}";
    version = "0-unstable-2024-06-27";

    src = fetchFromGitHub {
      owner = "Fausto-Korpsvart";
      repo = "Catppuccin-GTK-Theme";
      rev = "0bd2869e7f0fdb36c720a4fb873d4fed361b0606";
      hash = "sha256-oFVsYrJ27hYGY+x9+Z4SxVCp3w6PiLYTZaxmGhnpVHQ=";
    };

    nativeBuildInputs = [jdupes sassc];

    propagatedUserEnvPkgs = [gtk-engine-murrine];

    postPatch = ''
      find -name "*.sh" -print0 | while IFS= read -r -d ''' file; do
        patchShebangs "$file"
      done
    '';

    dontBuild = true;

    installPhase = ''
      runHook preInstall

      mkdir -p $out/share/themes

      ./themes/install.sh \
        --name ${pname} \
        ${toString (map (x: "--theme " + x) accent)} \
        ${lib.optionalString (shade != null) ("--color " + shade)} \
        ${lib.optionalString (size != null) ("--size " + size)} \
        ${toString (map (x: "--tweaks " + x) tweaks)} \
        --dest $out/share/themes

      jdupes --quiet --link-soft --recurse $out/share

      runHook postInstall
    '';

    meta = with lib; {
      description = "GTK Theme with Catppuccin colour scheme";
      homepage = "https://github.com/Fausto-Korpsvart/Catppuccin-GTK-Theme";
      license = licenses.gpl3Only;
      maintainers = with maintainers; [ icy-thought ];
      platforms = platforms.all;
    };
  }
