🍯 Glaze

local M = {}

local function hl(name, spec)
  vim.api.nvim_set_hl(0, name, spec)
end

function M.InitialStatuslineColors()
  hl("StatusLine",   { bg = "lightgrey", fg = "grey", ctermbg = 8, ctermfg = 0 })
  hl("StatusLineNC", { bg = "grey",      fg = "grey", ctermbg = 8, ctermfg = 0 })

  hl("User1", { bg = "grey",      fg = "lightblue", ctermbg = 8,  ctermfg = 4  })
  hl("User2", { bg = "lightblue", fg = "black",     ctermbg = 4,  ctermfg = 0  })
  hl("User3", { bg = "#e78f00",   fg = "lightblue", ctermbg = 11, ctermfg = 4  })
  hl("User4", { bg = "#e78f00",   fg = "lightyellow", ctermbg = 11, ctermfg = 11 })
  hl("User5", { bg = "darkmagenta", fg = "#e78f00", ctermbg = 5,  ctermfg = 11 })
  hl("User6", { bg = "grey",      fg = "#e78f00",   ctermbg = 8,  ctermfg = 11 })
end

function M.InsertStatuslineColor(insertmode)
  if insertmode == "i" then
    hl("User1", { bg = "grey", fg = "lightgreen", ctermbg = 8, ctermfg = 10 })
    hl("User2", { bg = "lightgreen", fg = "black", ctermbg = 10, ctermfg = 0 })
    hl("User3", { bg = "#e78f00", fg = "lightgreen", ctermbg = 11, ctermfg = 10 })
  else
    hl("User1", { bg = "grey", fg = "red", ctermbg = 8, ctermfg = 1 })
    hl("User2", { bg = "red", fg = "black", ctermbg = 1, ctermfg = 0 })
    hl("User3", { bg = "#e78f00", fg = "red", ctermbg = 11, ctermfg = 1 })
  end
end

function _G.Statusline(mode)
  local cEdgeSlant   = "%1*"
  local cEdgeContent = "%2*"
  local cMidSlant    = "%3*"
  local cMidContent  = "%4*"

  local cCenterBarSlant
  if mode == "active" then
    cCenterBarSlant = "%5*"
  else
    cCenterBarSlant = "%6*"
  end

  local line = ""

  line = line .. "%6*" .. cMidContent .. cMidSlant .. ""
  line = line .. cEdgeContent .. " %t%m%r "
  line = line .. cMidSlant .. "" .. cMidContent .. cCenterBarSlant .. ""
  line = line .. "%="
  line = line .. "" .. cMidContent .. cMidSlant .. "" .. cEdgeContent
  line = line .. " %c#%l/%L " .. cMidSlant .. "" .. cMidContent .. "%6*%*"

  return line
end

-- Autocmds
local grp = vim.api.nvim_create_augroup("statusline", { clear = true })

vim.api.nvim_create_autocmd({ "InsertEnter", "InsertChange" }, {
  group = grp,
  callback = function()
    M.InsertStatuslineColor(vim.v.insertmode)
  end,
})

vim.api.nvim_create_autocmd("InsertLeave", {
  group = grp,
  callback = function()
    M.InitialStatuslineColors()
  end,
})

vim.api.nvim_create_autocmd({ "WinEnter", "BufEnter" }, {
  group = grp,
  callback = function()
    vim.opt_local.statusline = "%!v:lua.Statusline('active')"
  end,
})

vim.api.nvim_create_autocmd({ "WinLeave", "BufLeave" }, {
  group = grp,
  callback = function()
    vim.opt_local.statusline = "%!v:lua.Statusline('inactive')"
  end,
})

vim.api.nvim_create_autocmd("ColorScheme", {
  group = grp,
  callback = function()
    M.InitialStatuslineColors()
    if vim.fn.mode():match("^i") then
      M.InsertStatuslineColor("i")
    end
  end,
})

M.InitialStatuslineColors()

return M