Skip to content

pauchiner/pastelnight.nvim

Repository files navigation

pastelnight logo

PastelNight

A Neovim theme inspired on the original Palenight theme, fully written in Lua.

Includes themes for Kitty, Alacritty, iTerm2 and Fish.

🎨 Colors

This palette is improved from the original 16 colors to a 40 shades of those, ensuring compability with more plugins and a smooth contrast experience.

pastelnight palette

See the figma document

✨ Features

  • Enhances terminal colors.
  • Supports all major plugins.
  • Supports the latest Neovim 0.9.0 features.
  • Provides extra themes for numerous other applications.

🍬 Extras

⚡️ Quick Start

✋ Requirements

🛠️ Installation

First install the theme with your preferred package manager:

💤 lazy.nvim

{
  "pauchiner/pastelnight.nvim",
  lazy = false,
  priority = 1000,
  opts = {},
}

🚀 Usage

VimScript
colorscheme pastelnight

" There are also a theme variant with greater contrast
colorscheme pastelnight-high-contrast
Lua
vim.api.nvim_command [[colorscheme pastelnight]]

-- There are also a theme variant with greater contrast
vim.api.nvim_command [[colorscheme pastelnight-high-contrast]]

🔌 Other supported plugins

require('barbecue').setup {
  theme = 'pastelnight',
}
require('lualine').setup {
  options = {
    theme = 'pastelnight'
  }
}
let g:lightline = {'colorscheme': 'pastelnight'}

⚙️ Configuration

Warning

Set the configuration before loading the color scheme with colorscheme pastelnight.

PastelNight uses the default options, unless setup is explicitly called.

Default options

require("pastelnight").setup({

  --- The theme comes in two styles, `default` and `highContrast`.
  style = "default"

  --- Enable this to disable setting the background color.
  transparent = false,

  --- Configure the colors used when opening a `:terminal`.
  terminal_colors = true,

  styles = {

    --- Style to be applied to different syntax groups.
    comments = { italic = true },
    keywords = { italic = true },
    functions = {},
    variables = {},

    --- Background styles. Can be 'dark', 'transparent' or 'normal'.
    sidebars = "dark",
    floats = "dark",
  },

  --- Set a darker background on sidebar-like windows. ['terminal', 'packer'...].
  sidebars = { "qf", "help" },

  --- Enabling this option, will hide inactive statuslines and replace them
  ---with a thin border instead.
  hide_inactive_statusline = false,

  --- dims inactive windows.
  dim_inactive = false,

  --- When true, section headers in the lualine theme will be bold.
  lualine_bold = false,

  --- You can override specific color groups to use other groups or a hex color,
  --- function will be called with a ColorScheme table.
  ---@param colors ColorScheme
  on_colors = function(colors) end,

  --- You can override specific highlights to use other groups or a hex color,
  --- function will be called with a Highlights and ColorScheme table.
  ---@param highlights Highlights
  ---@param colors ColorScheme
  on_highlights = function(highlights, colors) end,
})

🪓 Overriding Colors & Highlights

How the highlight groups are calculated:

  1. colors are determined based on your configuration, with the ability to override them using config.on_colors(colors).
  2. These colors are utilized to generate the highlight groups.
  3. config.on_highlights(highlights, colors) can be used to override highlight groups.

For default values of colors and highlights, please consult the colors and highlights files.

Settings and color alteration demonstration

require("pastelnight").setup({
  --- Change the "hint" color to the "orange" color, and make the "error" color bright red
  on_colors = function(colors)
    colors.hint = colors.orange
    colors.error = "#ff0000"
  end
})

Borderless Telescope example

require("pastelnight").setup({
  on_highlights = function(hl, c)
    local prompt = "#2d3149"
    hl.TelescopeNormal = {
      bg = c.bg_dark,
      fg = c.fg_dark,
    }
    hl.TelescopeBorder = {
      bg = c.bg_dark,
      fg = c.bg_dark,
    }
    hl.TelescopePromptNormal = {
      bg = prompt,
    }
    hl.TelescopePromptBorder = {
      bg = prompt,
      fg = prompt,
    }
    hl.TelescopePromptTitle = {
      bg = prompt,
      fg = prompt,
    }
    hl.TelescopePreviewTitle = {
      bg = c.bg_dark,
      fg = c.bg_dark,
    }
    hl.TelescopeResultsTitle = {
      bg = c.bg_dark,
      fg = c.bg_dark,
    }
  end,
})

⚠️ Common Issues

Fix undercurls in tmux

To have undercurls show up and in color, add the following to your Tmux configuration file:

set -g default-terminal "${TERM}"
set -as terminal-overrides ',*:Smulx=\E[4::%p1%dm'

Also you can enable undescore colors but this needs tmux 3.0

set -as terminal-overrides ',*:Setulc=\E[58::2::%p1%{65536}%/%d::%p1%{256}%/%{255}%&%d::%p1%{255}%&%d%;m'

🤝 Contributing

All contributions are welcome:

CONTRIBUTING.md

CODE_OF_CONDUCT.md

🍬 Creating new extras

For the extras, we use a simple template system that can be used to generate themes for the different styles.

How to add a new extra template:

Create a file like lua/pastelnight/extra/cool-app.lua.

Add the name and output file extension to the extras table in lua/pastelnight/extra/init.lua.

Run the following command to generate new extra themes from the pastelnight plugin directory:

nvim --headless "+lua require('pastelnight.extra').setup()" +qa

Check the newly created themes in the extra/ directory.

Caution

Please DO NOT commit them, as they are already automatically built by the CI.

📃 Credits

🎨 Original Design

This theme is highly inspired by the original theme Palenight from Olaolu Olawuyi.

🏗️ Code Structure

The structure of this plugin is based on the Tokyo Night Theme from Folke Lemaitre, take a look of his work please.

🐾 Hsl support

The way of implement and create the color palette is inspired on the new Solarized Osaka Theme from Takuya Matsuyama, see he's profile to know more.


With 💜 by Pau García Chiner