return {
  -- nvim-surround: manipulate surroundings
  {
    "kylechui/nvim-surround",
    version = "*",
    event = "VeryLazy",
    dependencies = {
      "nvim-treesitter/nvim-treesitter",
      "nvim-treesitter/nvim-treesitter-textobjects",
    },
    config = function()
      require("nvim-surround").setup({
        -- Note: keymaps table removed for v4 compatibility

        -- Custom surrounds
        surrounds = {
          -- Function call surround
          ["f"] = {
            add = function()
              local result = require("nvim-surround.config").get_input("Enter function name: ")
              if result then
                return { { result .. "(" }, { ")" } }
              end
            end,
            find = function()
              return require("nvim-surround.config").get_selection({ motion = "a(" })
            end,
            delete = "^([^(]+%()().-(%))()$",
            change = {
              target = "^([^(]+%()().-(%))()$",
              replacement = function()
                local result = require("nvim-surround.config").get_input("Enter function name: ")
                if result then
                  return { { result .. "(" }, { ")" } }
                end
              end,
            },
          },
          -- Markdown code block
          ["c"] = {
            add = function()
              local lang = require("nvim-surround.config").get_input("Enter language: ")
              return { { "```" .. (lang or "") }, { "```" } }
            end,
          },
          -- HTML/JSX tag with class
          ["C"] = {
            add = function()
              local class = require("nvim-surround.config").get_input("Enter class name: ")
              if class then
                return { { '<div class="' .. class .. '">' }, { "</div>" } }
              end
            end,
          },
          -- Template literal (JavaScript/TypeScript) - SYNTAX FIXED
          ["`"] = {
            add = { "`", "`" },
            find = "`.-`",
            delete = "^(`)().-(`)()$",
          },
        },
        -- Use treesitter for better text object detection
        move_cursor = "begin",
        indent_lines = function(start, stop)
          local b = vim.bo
          -- Only indent if the buffer is not a special filetype
          if b.ft ~= "help" and b.ft ~= "man" and b.ft ~= "qf" then
            vim.cmd(string.format("silent normal! %dG=%dG", start, stop))
          end
        end,
      })
    end,
  },
  -- nvim-autopairs: auto-close brackets with integration
  {
    "windwp/nvim-autopairs",
    event = "InsertEnter",
    dependencies = { "hrsh7th/nvim-cmp" },
    config = function()
      local npairs = require("nvim-autopairs")
      local Rule = require("nvim-autopairs.rule")
      local cond = require("nvim-autopairs.conds")
      npairs.setup({
        check_ts = true, -- Use treesitter
        ts_config = {
          lua = { "string", "source" },
          javascript = { "string", "template_string" },
          java = false,
        },
        disable_filetype = { "TelescopePrompt", "spectre_panel" },
        fast_wrap = {
          map = "<M-e>",
          chars = { "{", "[", "(", '"', "'" },
          pattern = string.gsub([[ [%'%"%)%>%]%)%}%,] ]], "%s+", ""),
          offset = 0,
          end_key = "$",
          keys = "qwertyuiopzxcvbnmasdfghjkl",
          check_comma = true,
          highlight = "PmenuSel",
          highlight_grey = "LineNr",
        },
        enable_moveright = true,
        enable_afterquote = true,
        enable_check_bracket_line = true,
        enable_bracket_in_quote = true,
        enable_abbr = false,
        break_undo = true,
        map_cr = true,
        map_bs = true,
        map_c_h = false,
        map_c_w = false,
      })
      -- Add spacing inside pairs
      local brackets = { { "(", ")" }, { "[", "]" }, { "{", "}" } }
      npairs.add_rules({
        Rule(" ", " "):with_pair(function(opts)
          local pair = opts.line:sub(opts.col - 1, opts.col)
          return vim.tbl_contains({
            brackets[1][1] .. brackets[1][2],
            brackets[2][1] .. brackets[2][2],
            brackets[3][1] .. brackets[3][2],
          }, pair)
        end),
      })
      for _, bracket in pairs(brackets) do
        npairs.add_rules({
          Rule(bracket[1] .. " ", " " .. bracket[2])
            :with_pair(function()
              return false
            end)
            :with_move(function(opts)
              return opts.prev_char:match(".%" .. bracket[2]) ~= nil
            end)
            :use_key(bracket[2]),
        })
      end
      -- Add arrow function for JavaScript/TypeScript
      npairs.add_rules({
        Rule("%(.*%)%s*=>$", " {  }", { "typescript", "typescriptreact", "javascript", "javascriptreact" })
          :use_regex(true)
          :set_end_pair_length(2),
      })
      -- Integration with nvim-cmp
      local cmp_autopairs = require("nvim-autopairs.completion.cmp")
      local cmp = require("cmp")
      cmp.event:on("confirm_done", cmp_autopairs.on_confirm_done())
    end,
  },
  -- -- Comment.nvim: smart commenting with treesitter
  -- {
  --   "numToStr/Comment.nvim",
  --   event = { "BufReadPre", "BufNewFile" },
  --   dependencies = {
  --     "nvim-treesitter/nvim-treesitter",
  --     "JoosepAlviste/nvim-ts-context-commentstring", -- For better JSX/TSX comments
  --   },
  --   config = function()
  --     require("Comment").setup({
  --       -- Use treesitter for comment detection
  --       pre_hook = require("ts_context_commentstring.integrations.comment_nvim").create_pre_hook(),
  --       padding = true,
  --       sticky = true,
  --       ignore = "^$", -- Ignore empty lines
  --       -- LHS of toggle mappings in NORMAL mode
  --       toggler = {
  --         line = "gcc", -- Line-comment toggle
  --         block = "gbc", -- Block-comment toggle
  --       },
  --       -- LHS of operator-pending mappings in NORMAL and VISUAL mode
  --       opleader = {
  --         line = "gc", -- Line-comment keymap
  --         block = "gb", -- Block-comment keymap
  --       },
  --       -- LHS of extra mappings
  --       extra = {
  --         above = "gcO", -- Add comment on the line above
  --         below = "gco", -- Add comment on the line below
  --         eol = "gcA", -- Add comment at the end of line
  --       },
  --       mappings = {
  --         basic = true,
  --         extra = true,
  --       },
  --     })
  --   end,
  -- },
  -- nvim-ts-context-commentstring: JSX/TSX comment support
  {
    "JoosepAlviste/nvim-ts-context-commentstring",
    lazy = true,
    opts = {
      enable_autocmd = false, -- Disable auto commands, Comment.nvim handles it
    },
  },
}
