{
  pkgs,
  config,
  lib,
  ...
}: let
  palette = config.colorScheme.palette;
  betterTransition = "all 0.3s cubic-bezier(.55,-0.68,.48,1.682)";
in
  with pkgs; {
    home.packages = [
      wl-clipboard-rs
    ];

    programs = {
      rofi = {
        enable = true;
        catppuccin.enable = true;
        package = pkgs.rofi-wayland;

        extraConfig = {
          modi = "run,drun,window";
          icon-theme = "Oranchelo";
          show-icons = true;
          terminal = "wezterm";
          drun-display-format = "{icon} {name}";
          location = 0;
          disable-history = false;
          hide-scrollbar = true;
          display-drun = "   Apps ";
          display-run = "   Run ";
          display-window = " 󰍲  Window";
          display-Network = " 󰤨  Network";
          sidebar-mode = true;
        };

        theme = {
          "*".font = "Maple Mono NF 14";
          window.border-radius = 10;
        };
      };

      waybar = {
        enable = true;
        package = pkgs.waybar;
        settings = [
          {
            layer = "top";
            position = "top";

            modules-center = ["hyprland/workspaces"];

            modules-left = [
              "custom/startmenu"
              "hyprland/window"
              "pulseaudio"
              "cpu"
              "memory"
            ];

            modules-right = [
              "mpris"
              "network"
              "custom/notification"
              "tray"
              "clock"
            ];

            "mpris" = {
              format = "{player_icon} {title} - {artist}";
              format-paused = "{status_icon} {title} - {artist}";
              player-icons.default = "󰝚";
              status-icons.paused = "󰏤";
              max-length = 40;
            };

            "hyprland/workspaces" = {
              format = "{name}";
              format-icons = {
                default = " ";
                active = " ";
                urgent = " ";
              };
              on-scroll-up = "hyprctl dispatch workspace e-1";
              on-scroll-down = "hyprctl dispatch workspace e+1";
            };

            "clock" = {
              format = " {:L%I:%M %p}";
              tooltip = true;
              tooltip-format = "<big>{:%A, %d.%B %Y }</big>\n<tt><small>{calendar}</small></tt>";
            };

            "hyprland/window" = {
              max-length = 22;
              rewrite = {
                "" = "Desktop";
                "(.*) — Firefox Nightly" = "󰈹 $1";
                ".*?Discord \\| @?(.*)" = "  $1";
                "WezTerm - (?:\\[.*] ?)?(.*)" = " $1";
              };
            };

            "memory" = {
              interval = 5;
              format = " {}%";
              tooltip = true;
            };

            "cpu" = {
              interval = 5;
              format = " {usage:2}%";
              tooltip = true;
            };

            "disk" = {
              format = " {free}";
              tooltip = true;
            };

            "network" = {
              format-icons = [
                "󰤯"
                "󰤟"
                "󰤢"
                "󰤥"
                "󰤨"
              ];
              format-ethernet = " {bandwidthDownOctets}";
              format-wifi = "{icon} {essid}";
              format-disconnected = "󰤮";
              tooltip = false;
            };

            "tray" = {
              spacing = 12;
            };

            "pulseaudio" = {
              format = "{icon} {volume}% {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-icons = {
                headphone = "";
                hands-free = "";
                headset = "󰋎";
                phone = "";
                portable = "";
                car = "";
                default = [
                  ""
                  ""
                  ""
                ];
              };
              on-click = "sleep 0.1 && pavucontrol";
            };

            "custom/startmenu" = {
              tooltip = false;
              format = " ";
              on-click = "rofi -show drun";
            };

            "custom/notification" = {
              tooltip = false;
              format = "{icon} {}";
              format-icons = {
                notification = "<span foreground='red'><sup></sup></span>";
                none = "";
                dnd-notification = "<span foreground='red'><sup></sup></span>";
                dnd-none = "";
                inhibited-notification = "<span foreground='red'><sup></sup></span>";
                inhibited-none = "";
                dnd-inhibited-notification = "<span foreground='red'><sup></sup></span>";
                dnd-inhibited-none = "";
              };
              return-type = "json";
              exec = "swaync-client -swb";
              on-click = "swaync-client -t &";
              escape = true;
            };
          }
        ];

        style = lib.concatStrings [
          ''
            * {
              border:        none;
              border-radius: 0px;
              font-family:   Maple Mono NF;
              font-size:     16px;
              min-height:    0px;
            }

            window#waybar {
              background-color: #${palette.base00};
            }

            #workspaces {
              background:    #${palette.base01};
              border-radius: 16px;
              color:         #${palette.base00};
              margin:        4px 4px;
              padding:       8px 5px;
            }

            #workspaces button {
              animation:       gradient_horizontal 15s ease infinite;
              background:      linear-gradient(45deg, #${palette.base0E}, #${palette.base0F}, #${palette.base0D}, #${palette.base09});
              background-size: 300% 300%;
              border-radius:   16px;
              color:           #${palette.base00};
              font-weight:     bold;
              margin:          0px 3px;
              opacity:         0.5;
              padding:         0px 5px;
              transition:      ${betterTransition};
            }

            #workspaces button.active {
              animation:       gradient_horizontal 15s ease infinite;
              background:      linear-gradient(45deg, #${palette.base0E}, #${palette.base0F}, #${palette.base0D}, #${palette.base09});
              background-size: 300% 300%;
              border-radius:   16px;
              color:           #${palette.base00};
              font-weight:     bold;
              margin:          0px 3px;
              min-width:       40px;
              opacity:         1.0;
              padding:         0px 5px;
              transition:      ${betterTransition};
            }

            #workspaces button:hover {
              animation:       gradient_horizontal 15s ease infinite;
              background:      linear-gradient(45deg, #${palette.base0E}, #${palette.base0F}, #${palette.base0D}, #${palette.base09});
              background-size: 300% 300%;
              border-radius:   16px;
              color:           #${palette.base00};
              font-weight:     bold;
              opacity:         0.8;
              transition:      ${betterTransition};
            }

            @keyframes gradient_horizontal {
              0%   { background-position: 0%   50%; }
              50%  { background-position: 100% 50%; }
              100% { background-position: 0%   50%; }
            }

            @keyframes swiping {
              0%   { background-position: 0%   200%; }
              100% { background-position: 200% 200%; }
            }

            tooltip {
              background:    #${palette.base00};
              border:        1px solid #${palette.base0E};
              border-radius: 12px;
            }

            tooltip label {
              color: #${palette.base07};
            }

            #window, #pulseaudio, #cpu, #memory, #idle_inhibitor {
              background:    #${palette.base01};
              border-radius: 24px 10px 24px 10px;
              color:         #${palette.base05};
              font-weight:   bold;
              margin:        4px 0px;
              margin-left:   7px;
              padding:       0px 18px;
            }

            #custom-startmenu {
              background:    #${palette.base01};
              border-radius: 0px 0px 40px 0px;
              color:         #${palette.base0D};
              font-size:     28px;
              margin:        0px;
              padding:       0px 30px 0px 15px;
            }

            #mpris, #network, #custom-notification, #tray {
              background:    #${palette.base01};
              border-radius: 10px 24px 10px 24px;
              color:         #${palette.base05};
              font-weight:   bold;
              margin:        4px 0px;
              margin-right:  7px;
              padding:       0px 18px;
            }

            #clock {
              animation:       gradient_horizontal 15s ease infinite;
              background:      linear-gradient(45deg, #${palette.base0C}, #${palette.base0F}, #${palette.base0B}, #${palette.base08});
              background-size: 300% 300%;
              border-radius:   0px 0px 0px 40px;
              color:           #${palette.base00};
              font-weight:     bold;
              margin:          0px;
              padding:         0px 15px 0px 30px;
            }
          ''
        ];
      };
    };

    services = {
      udiskie.enable = true;

      swaync = {
        enable = true;
        style = builtins.fetchurl {
          url = "https://github.com/catppuccin/swaync/releases/download/v0.2.3/mocha.css";
          sha256 = "1xr1wkg4zb467b35xhsfqiwhimfnn88i3ml5rf173rkm7fyby9qy";
        };
      };
    };

    wayland.windowManager.hyprland = {
      enable = true;
      systemd.variables = ["--all"];

      settings = let
        mod = "SUPER";
        modC = "SUPER CTRL";
        modS = "SUPER SHIFT";

        browser = "firefox-nightly";
        colorPicker = "notify-send -i gtk-color-picker $(${hyprpicker}/bin/hyprpicker -a) 'Copied to clipboard.'";
        fileManager = "nautilus";
        launcher = "rofi -show drun";
        terminal = "wezterm";

        screenshot = mode: "${
          hyprshot.overrideAttrs {
            # Fixes cursors showing in region shots
            src = pkgs.fetchFromGitHub {
              owner = "BenCarmichael01";
              repo = "Hyprshot";
              rev = "84e2adcd5dd9060178d0d028ad032734797fba23";
              hash = "sha256-XDKwBiUMWvxoWpkdJ0EK4kEqPSTZLcF6axHjom3c5Jk=";
            };
          }
        }/bin/hyprshot --clipboard-only -m ${mode}";
      in {
        decoration.rounding = 10;
        dwindle.preserve_split = true;
        gestures.workspace_swipe = true;
        input = {
          sensitivity = -0.4;
          touchpad.natural_scroll = true;
        };

        layerrule = [
          "dimaround, rofi"
        ];

        animations = {
          enabled = true;

          bezier = [
            "overshot,0.7,0.6,0.1,1.1"
            "bounce,1,1.6,0.1,0.85"
          ];

          animation = [
            "windows,1,5,bounce,popin"
            "border,1,20,default"
            "fade,1,5,default"
            "workspaces,1,5,overshot,slide"
          ];
        };

        general = {
          border_size = 2;
          gaps_in = 10;
          resize_on_border = true;

          "col.active_border" = "rgba(33ccffee) rgba(00ff99ee) 45deg";
          "col.inactive_border" = "rgba(595959aa)";
        };

        exec-once = [
          "waybar"
          "${mpvpaper}/bin/mpvpaper -vp -o 'no-audio loop' DP-1 ${builtins.toString ./wall.mp4}"
          "mullvad connect"
        ];

        misc = {
          force_default_wallpaper = 0;
          disable_hyprland_logo = true;
        };

        monitor = [
          "eDP-1, disable"
          "DP-1,  2560x1440@165, auto, auto"
        ];

        env = [
          # Nvidia stuff
          "GBM_BACKEND,               nvidia-drm"
          "__GLX_VENDOR_LIBRARY_NAME, nvidia"
          "LIBVA_DRIVER_NAME,         nvidia"
          "WLR_DRM_DEVICES,           $HOME/.config/hypr/card"

          # Cursors
          "HYPRCURSOR_SIZE, 24"
          "XCURSOR_SIZE, 24"
        ];

        bindm = [
          "${mod},  mouse:272, movewindow"
          "${mod},  mouse:273, resizewindow"
        ];

        bind =
          [
            # Apps
            "${mod},      c, exec, ${colorPicker}"
            "${mod},      w, exec, ${browser}"
            "${mod},      e, exec, ${fileManager}"
            "${mod},      r, exec, ${launcher}"
            "${mod}, Return, exec, ${terminal}"

            # Screenshots
            "${modS}, s, exec, ${screenshot "window"}"
            "${modC}, 3, exec, ${screenshot "output -c"}"
            "${modC}, 4, exec, ${screenshot "region -C 0,0"}"

            # Mouse controls
            "${mod}, mouse_down, workspace, e-1"
            "${mod},   mouse_up, workspace, e+1"

            # Quitting
            "${mod},  q, killactive"
            "${modS}, q, exit"

            # Toggles
            "${mod},     j, togglesplit"
            "${mod}, Space, togglefloating"

            # Focus movements
            "${mod}, h, movefocus, l"
            "${mod}, j, movefocus, d"
            "${mod}, k, movefocus, u"
            "${mod}, l, movefocus, r"

            # Window movements
            "${modS}, h, movewindow, l"
            "${modS}, j, movewindow, d"
            "${modS}, k, movewindow, u"
            "${modS}, l, movewindow, r"
          ]
          ++ (
            builtins.concatLists (builtins.genList (
                x: let
                  ws = let
                    c = (x + 1) / 10;
                  in
                    builtins.toString (x + 1 - (c * 10));
                in [
                  # Workspaces
                  "${mod},  ${ws}, workspace,       ${builtins.toString (x + 1)}"
                  "${modS}, ${ws}, movetoworkspace, ${builtins.toString (x + 1)}"
                ]
              )
              10)
          );
      };
    };
  }
