{
  config,
  lib,
  pkgs,
  ...
}: let
  cfg = config.ar.home;
in {
  config = lib.mkIf cfg.apps.zed.enable {
    home.packages = [
      cfg.apps.zed.package
      pkgs.nixd
    ];

    xdg.configFile = {
      "zed/themes/stylix.json".text = let
        theme = {
          "$schema" = "https://zed.dev/schema/themes/v0.1.0.json";
          author = "Aly Raffauf";
          name = "stylix";
          themes = [
            {
              appearance = config.stylix.polarity;
              name = "Stylix";
              style = {
                background = config.lib.stylix.colors.withHashtag.base01;
                border = config.lib.stylix.colors.withHashtag.base02;
                "border.disabled" = null;
                "border.focused" = null;
                "border.selected" = null;
                "border.transparent" = null;
                "border.variant" = config.lib.stylix.colors.withHashtag.base02;
                conflict = config.lib.stylix.colors.withHashtag.base0A;
                "conflict.background" = config.lib.stylix.colors.withHashtag.base00;
                "conflict.border" = config.lib.stylix.colors.withHashtag.base0A;
                created = config.lib.stylix.colors.withHashtag.base0B;
                "created.background" = config.lib.stylix.colors.withHashtag.base00;
                "created.border" = config.lib.stylix.colors.withHashtag.base0B;
                deleted = config.lib.stylix.colors.withHashtag.base08;
                "deleted.background" = config.lib.stylix.colors.withHashtag.base00;
                "deleted.border" = config.lib.stylix.colors.withHashtag.base08;
                "drop_target.background" = config.lib.stylix.colors.withHashtag.base02;
                "editor.active_line.background" = config.lib.stylix.colors.withHashtag.base01;
                "editor.active_line_number" = config.lib.stylix.colors.withHashtag.base05;
                "editor.active_wrap_guide" = config.lib.stylix.colors.withHashtag.base03;
                "editor.background" = config.lib.stylix.colors.withHashtag.base00;
                "editor.document_highlight.read_background" = config.lib.stylix.colors.withHashtag.base01;
                "editor.document_highlight.write_background" = config.lib.stylix.colors.withHashtag.base01;
                "editor.foreground" = config.lib.stylix.colors.withHashtag.base05;
                "editor.gutter.background" = config.lib.stylix.colors.withHashtag.base00;
                "editor.highlighted_line.background" = null;
                "editor.invisible" = null;
                "editor.line_number" = config.lib.stylix.colors.withHashtag.base03;
                "editor.subheader.background" = config.lib.stylix.colors.withHashtag.base00;
                "editor.wrap_guide" = config.lib.stylix.colors.withHashtag.base01;
                "element.active" = config.lib.stylix.colors.withHashtag.base03;
                "element.background" = config.lib.stylix.colors.withHashtag.base01;
                "element.disabled" = null;
                "element.hover" = config.lib.stylix.colors.withHashtag.base02;
                "element.selected" = config.lib.stylix.colors.withHashtag.base02;
                "elevated_surface.background" = config.lib.stylix.colors.withHashtag.base01;
                error = config.lib.stylix.colors.withHashtag.base08;
                "error.background" = config.lib.stylix.colors.withHashtag.base00;
                "error.border" = config.lib.stylix.colors.withHashtag.base08;
                "ghost_element.active" = config.lib.stylix.colors.withHashtag.base02;
                "ghost_element.background" = null;
                "ghost_element.disabled" = null;
                "ghost_element.hover" = config.lib.stylix.colors.withHashtag.base01;
                "ghost_element.selected" = config.lib.stylix.colors.withHashtag.base02;
                hidden = config.lib.stylix.colors.withHashtag.base03;
                "hidden.background" = config.lib.stylix.colors.withHashtag.base00;
                "hidden.border" = config.lib.stylix.colors.withHashtag.base03;
                hint = config.lib.stylix.colors.withHashtag.base05;
                "hint.background" = config.lib.stylix.colors.withHashtag.base00;
                "hint.border" = config.lib.stylix.colors.withHashtag.base0C;
                icon = null;
                "icon.accent" = null;
                "icon.disabled" = null;
                "icon.muted" = null;
                "icon.placeholder" = null;
                ignored = config.lib.stylix.colors.withHashtag.base03;
                "ignored.background" = config.lib.stylix.colors.withHashtag.base00;
                "ignored.border" = config.lib.stylix.colors.withHashtag.base03;
                info = config.lib.stylix.colors.withHashtag.base0C;
                "info.background" = config.lib.stylix.colors.withHashtag.base00;
                "info.border" = config.lib.stylix.colors.withHashtag.base0C;
                "link_text.hover" = config.lib.stylix.colors.withHashtag.base0C;
                modified = config.lib.stylix.colors.withHashtag.base0D;
                "modified.background" = config.lib.stylix.colors.withHashtag.base00;
                "modified.border" = config.lib.stylix.colors.withHashtag.base0D;
                "pane.focused_border" = null;
                "panel.background" = config.lib.stylix.colors.withHashtag.base01;
                "panel.focused_border" = config.lib.stylix.colors.withHashtag.base02;
                players = [
                  {
                    background = null;
                    cursor = config.lib.stylix.colors.withHashtag.base05;
                    selection = config.lib.stylix.colors.withHashtag.base02;
                  }
                ];
                predictive = config.lib.stylix.colors.withHashtag.base03;
                "predictive.background" = config.lib.stylix.colors.withHashtag.base01;
                "predictive.border" = config.lib.stylix.colors.withHashtag.base02;
                renamed = config.lib.stylix.colors.withHashtag.base0A;
                "renamed.background" = config.lib.stylix.colors.withHashtag.base00;
                "renamed.border" = config.lib.stylix.colors.withHashtag.base0A;
                "scrollbar.thumb.border" = config.lib.stylix.colors.withHashtag.base02;
                "scrollbar.thumb.hover_background" = config.lib.stylix.colors.withHashtag.base03;
                "scrollbar.track.background" = config.lib.stylix.colors.withHashtag.base00;
                "scrollbar.track.border" = config.lib.stylix.colors.withHashtag.base00;
                "scrollbar_thumb.background" = config.lib.stylix.colors.withHashtag.base02;
                "search.match_background" = config.lib.stylix.colors.withHashtag.base02;
                "status_bar.background" = config.lib.stylix.colors.withHashtag.base00;
                success = config.lib.stylix.colors.withHashtag.base0B;
                "success.background" = config.lib.stylix.colors.withHashtag.base00;
                "success.border" = config.lib.stylix.colors.withHashtag.base0B;
                "surface.background" = config.lib.stylix.colors.withHashtag.base00;
                syntax = {
                  attribute = {
                    color = config.lib.stylix.colors.withHashtag.base0D;
                    font_style = null;
                    font_weight = null;
                  };
                  boolean = {
                    color = config.lib.stylix.colors.withHashtag.base09;
                    font_style = null;
                    font_weight = null;
                  };
                  comment = {
                    color = config.lib.stylix.colors.withHashtag.base03;
                    font_style = "italic";
                    font_weight = null;
                  };
                  "comment.doc" = {
                    color = config.lib.stylix.colors.withHashtag.base03;
                    font_style = "italic";
                    font_weight = null;
                  };
                  constant = {
                    color = config.lib.stylix.colors.withHashtag.base09;
                    font_style = null;
                    font_weight = null;
                  };
                  constructor = {
                    color = config.lib.stylix.colors.withHashtag.base08;
                    font_style = null;
                    font_weight = null;
                  };
                  emphasis = {
                    color = config.lib.stylix.colors.withHashtag.base08;
                    font_style = "italic";
                    font_weight = null;
                  };
                  "emphasis.strong" = {
                    color = config.lib.stylix.colors.withHashtag.base08;
                    font_style = null;
                    font_weight = 700;
                  };
                  function = {
                    color = config.lib.stylix.colors.withHashtag.base0D;
                    font_style = null;
                    font_weight = null;
                  };
                  keyword = {
                    color = config.lib.stylix.colors.withHashtag.base09;
                    font_style = null;
                    font_weight = null;
                  };
                  label = {
                    color = config.lib.stylix.colors.withHashtag.base0A;
                    font_style = null;
                    font_weight = null;
                  };
                  link_text = {
                    color = config.lib.stylix.colors.withHashtag.base08;
                    font_style = null;
                    font_weight = null;
                  };
                  link_uri = {
                    color = config.lib.stylix.colors.withHashtag.base08;
                    font_style = null;
                    font_weight = null;
                  };
                  number = {
                    color = config.lib.stylix.colors.withHashtag.base09;
                    font_style = null;
                    font_weight = null;
                  };
                  punctuation = {
                    color = config.lib.stylix.colors.withHashtag.base05;
                    font_style = null;
                    font_weight = null;
                  };
                  "punctuation.bracket" = {
                    color = config.lib.stylix.colors.withHashtag.base05;
                    font_style = null;
                    font_weight = null;
                  };
                  "punctuation.delimiter" = {
                    color = config.lib.stylix.colors.withHashtag.base05;
                    font_style = null;
                    font_weight = null;
                  };
                  "punctuation.list_marker" = {
                    color = config.lib.stylix.colors.withHashtag.base05;
                    font_style = null;
                    font_weight = null;
                  };
                  "punctuation.special" = {
                    color = config.lib.stylix.colors.withHashtag.base05;
                    font_style = null;
                    font_weight = null;
                  };
                  string = {
                    color = config.lib.stylix.colors.withHashtag.base0B;
                    font_style = null;
                    font_weight = null;
                  };
                  "string.escape" = {
                    color = config.lib.stylix.colors.withHashtag.base09;
                    font_style = null;
                    font_weight = null;
                  };
                  "string.regex" = {
                    color = config.lib.stylix.colors.withHashtag.base0B;
                    font_style = null;
                    font_weight = null;
                  };
                  "string.special" = {
                    color = config.lib.stylix.colors.withHashtag.base0B;
                    font_style = null;
                    font_weight = null;
                  };
                  "string.special.symbol" = {
                    color = config.lib.stylix.colors.withHashtag.base0B;
                    font_style = null;
                    font_weight = null;
                  };
                  tag = {
                    color = config.lib.stylix.colors.withHashtag.base08;
                    font_style = null;
                    font_weight = null;
                  };
                  "text.literal" = {
                    color = config.lib.stylix.colors.withHashtag.base0B;
                    font_style = null;
                    font_weight = null;
                  };
                  title = {
                    color = config.lib.stylix.colors.withHashtag.base0A;
                    font_style = null;
                    font_weight = null;
                  };
                  type = {
                    color = config.lib.stylix.colors.withHashtag.base0A;
                    font_style = null;
                    font_weight = null;
                  };
                  variable = {
                    color = config.lib.stylix.colors.withHashtag.base06;
                    font_style = null;
                    font_weight = null;
                  };
                  "variable.special" = {
                    color = config.lib.stylix.colors.withHashtag.base08;
                    font_style = "italic";
                    font_weight = null;
                  };
                };
                "tab.active_background" = config.lib.stylix.colors.withHashtag.base00;
                "tab.inactive_background" = config.lib.stylix.colors.withHashtag.base01;
                "tab_bar.background" = config.lib.stylix.colors.withHashtag.base00;
                "terminal.ansi.black" = config.lib.stylix.colors.withHashtag.base00;
                "terminal.ansi.blue" = config.lib.stylix.colors.withHashtag.base0D;
                "terminal.ansi.bright_black" = config.lib.stylix.colors.withHashtag.base03;
                "terminal.ansi.bright_blue" = config.lib.stylix.colors.withHashtag.base0D;
                "terminal.ansi.bright_cyan" = config.lib.stylix.colors.withHashtag.base0C;
                "terminal.ansi.bright_green" = config.lib.stylix.colors.withHashtag.base0B;
                "terminal.ansi.bright_magenta" = config.lib.stylix.colors.withHashtag.base09;
                "terminal.ansi.bright_red" = config.lib.stylix.colors.withHashtag.base08;
                "terminal.ansi.bright_white" = config.lib.stylix.colors.withHashtag.base0F;
                "terminal.ansi.bright_yellow" = config.lib.stylix.colors.withHashtag.base0A;
                "terminal.ansi.cyan" = config.lib.stylix.colors.withHashtag.base0C;
                "terminal.ansi.dim_black" = null;
                "terminal.ansi.dim_blue" = null;
                "terminal.ansi.dim_cyan" = null;
                "terminal.ansi.dim_green" = null;
                "terminal.ansi.dim_magenta" = null;
                "terminal.ansi.dim_red" = null;
                "terminal.ansi.dim_white" = null;
                "terminal.ansi.dim_yellow" = null;
                "terminal.ansi.green" = config.lib.stylix.colors.withHashtag.base0B;
                "terminal.ansi.magenta" = config.lib.stylix.colors.withHashtag.base09;
                "terminal.ansi.red" = config.lib.stylix.colors.withHashtag.base08;
                "terminal.ansi.white" = config.lib.stylix.colors.withHashtag.base05;
                "terminal.ansi.yellow" = config.lib.stylix.colors.withHashtag.base0A;
                "terminal.background" = config.lib.stylix.colors.withHashtag.base00;
                "terminal.bright_foreground" = null;
                "terminal.dim_foreground" = null;
                "terminal.foreground" = config.lib.stylix.colors.withHashtag.base05;
                text = config.lib.stylix.colors.withHashtag.base05;
                "text.accent" = config.lib.stylix.colors.withHashtag.base0C;
                "text.disabled" = config.lib.stylix.colors.withHashtag.base02;
                "text.muted" = config.lib.stylix.colors.withHashtag.base04;
                "text.placeholder" = config.lib.stylix.colors.withHashtag.base0F;
                "title_bar.background" = config.lib.stylix.colors.withHashtag.base00;
                "title_bar.inactive_background" = config.lib.stylix.colors.withHashtag.base01;
                "toolbar.background" = config.lib.stylix.colors.withHashtag.base00;
                unreachable = config.lib.stylix.colors.withHashtag.base0A;
                "unreachable.background" = config.lib.stylix.colors.withHashtag.base00;
                "unreachable.border" = config.lib.stylix.colors.withHashtag.base0A;
                warning = config.lib.stylix.colors.withHashtag.base0A;
                "warning.background" = config.lib.stylix.colors.withHashtag.base00;
                "warning.border" = config.lib.stylix.colors.withHashtag.base0A;
              };
            }
          ];
        };
      in
        lib.generators.toJSON {} theme;

      "zed/keymap.json".text = let
        defaults = [
          {
            "context" = "Workspace";
            "bindings" = {
              "alt-e" = "file_finder::Toggle";
              "ctrl-p" = "command_palette::Toggle";
              "ctrl-shift-p" = "file_finder::Toggle";
            };
          }
        ];
        keymaps = defaults ++ cfg.apps.zed.keymaps;
      in
        lib.generators.toJSON {} keymaps;

      "zed/settings.json".text = let
        defaults = {
          auto_install_extensions = {
            adwaita-pastel = true;
            basher = true;
            docker-compose = true;
            dockerfile = true;
            git-firefly = true;
            haskell = true;
            html = true;
            ini = true;
            just = true;
            log = true;
            make = true;
            nix = true;
            ruby = true;
          };

          auto_update = false;
          autosave.after_delay.milliseconds = 1000;
          buffer_font_family = config.stylix.fonts.monospace.name;
          buffer_font_size = config.stylix.fonts.sizes.applications + 2;
          current_line_highlight = "line";

          indent_guides = {
            enabled = true;
            background_coloring = "disabled";
            coloring = "indent_aware";
            line_width = 1;
          };

          languages = {
            Nix = {
              formatter.external = {
                command = lib.getExe pkgs.alejandra;
                arguments = [];
              };

              tab_size = 2;
            };
          };

          preferred_line_length = 80;
          restore_on_startup = "last_workspace";
          show_wrap_guides = true;
          soft_wrap = "preferred_line_length";

          tab_bar = {
            show = true;
            show_nav_history_buttons = false;
          };

          tabs = {
            close_position = "right";
            git_status = true;
          };

          telemetry = {
            diagnostics = false;
            metrics = false;
          };

          terminal.font_size = config.stylix.fonts.sizes.terminal + 2;

          theme = {
            dark = "Stylix";
            light = "Stylix";
            mode = "system";
          };

          ui_font_family = config.stylix.fonts.sansSerif.name;
          ui_font_size = config.stylix.fonts.sizes.applications + 4;
          use_autoclose = false;
          vim_mode = false;
        };

        settings = defaults // cfg.apps.zed.settings;
      in
        lib.generators.toJSON {} settings;
    };
  };
}
