{lib}: theme: let
  inherit (builtins) isAttrs mapAttrs concatStringsSep;
  inherit (lib) flatten removePrefix;

  recurse = path: f: val:
    if isAttrs val
    then mapAttrs (n: v: recurse (path + "." + n) f v) val
    else f path val;

  recurse' = recurse "theme";
in
  theme
  // {
    noHash = recurse' (_: color: removePrefix "#" color) theme;
    apps =
      {
        helix = import ./helix.nix theme;
        qutebrowser = import ./qutebrowser.nix theme;
        zellij = import ./zellij.nix theme;
      }
      // (theme.apps or {});
  }