From c119257a025ef5eeae7d36f37ddaf645fd39abd7 Mon Sep 17 00:00:00 2001 From: Ray Andrew Date: Sun, 30 Nov 2025 01:33:41 -0600 Subject: [PATCH] feat: cool colorschemes and themes --- config/aerospace/aerospace.toml | 24 + config/ghostty/config | 4 +- config/ghostty/themes/noctis | 59 +++ config/ghostty/themes/noctis-azureus | 59 +++ config/nvim/colors/noctis.lua | 49 ++ config/nvim/colors/noctis_azureus.lua | 44 ++ config/nvim/colors/noctis_azureus_ghostty.lua | 44 ++ config/nvim/colors/noctis_ghostty.lua | 44 ++ config/nvim/init.lua | 21 +- config/nvim/lua/raytheme.lua | 424 ++++++++++++++++++ config/sketchybar/bar.lua | 2 +- config/sketchybar/items/spaces.lua | 6 +- config/tmux/tmux.conf | 58 ++- config/yazi/.luarc.json | 15 +- 14 files changed, 825 insertions(+), 28 deletions(-) create mode 100644 config/ghostty/themes/noctis create mode 100644 config/ghostty/themes/noctis-azureus create mode 100644 config/nvim/colors/noctis.lua create mode 100644 config/nvim/colors/noctis_azureus.lua create mode 100644 config/nvim/colors/noctis_azureus_ghostty.lua create mode 100644 config/nvim/colors/noctis_ghostty.lua create mode 100644 config/nvim/lua/raytheme.lua diff --git a/config/aerospace/aerospace.toml b/config/aerospace/aerospace.toml index 20e491a..31cb8e3 100644 --- a/config/aerospace/aerospace.toml +++ b/config/aerospace/aerospace.toml @@ -134,10 +134,22 @@ on-focus-changed = [ if.app-id = 'com.apple.ActivityMonitor' run = ['layout floating'] +[[on-window-detected]] + if.app-id = 'com.openai.chat' + run = ['move-node-to-workspace 3'] + +[[on-window-detected]] + if.app-id = 'com.anthropic.claudefordesktop' + run = ['move-node-to-workspace 3'] + [[on-window-detected]] if.app-id = 'com.1password.1password' run = ['move-node-to-workspace 5'] +[[on-window-detected]] + if.app-id = 'com.apple.MobileSMS' + run = ['move-node-to-workspace 5'] + [[on-window-detected]] if.app-id = 'com.spotify.client' run = ['move-node-to-workspace 7'] @@ -153,3 +165,15 @@ on-focus-changed = [ [[on-window-detected]] if.app-id = 'com.tinyspeck.slackmacgap' run = ['move-node-to-workspace 9'] + +[[on-window-detected]] + if.app-id = 'org.mozilla.firefox' + run = ['move-node-to-workspace 10'] + +[[on-window-detected]] + if.app-id = 'com.apple.Safari' + run = ['move-node-to-workspace 10'] + +[[on-window-detected]] + if.app-id = 'org.zotero.zotero' + run = ['move-node-to-workspace 6'] diff --git a/config/ghostty/config b/config/ghostty/config index 654e181..366e8c5 100644 --- a/config/ghostty/config +++ b/config/ghostty/config @@ -8,12 +8,14 @@ gtk-adwaita = false font-family = Consolas font-size = 14 app-notifications = no-clipboard-copy -theme = nightfox macos-option-as-alt = left keybind = alt+left=unbind keybind = alt+right=unbind +# theme = nightfox +theme = noctis-azureus + # theme = gruber-darker # theme = xcodelighthc # theme = zenburned diff --git a/config/ghostty/themes/noctis b/config/ghostty/themes/noctis new file mode 100644 index 0000000..a1d0bac --- /dev/null +++ b/config/ghostty/themes/noctis @@ -0,0 +1,59 @@ +# Noctis +# Based on https://github.com/liviuschera/noctis + +# Terminal Colors +# --------------------------- +# terminal.background +background = 03191b +# terminal.foreground +foreground = b2cacd + +# Cursor +# --------------------------- +# terminalCursor.foreground +cursor-color = b2cacd + +# Selection +# --------------------------- +# selection.background +selection-background = 107684 +# terminal.foreground +selection-foreground = b2cacd + +# ANSI Colors +# --------------------------- +# Regular Colors +# terminal.ansiBlack +palette = 0=#324a4d +# terminal.ansiRed +palette = 1=#e66533 +# terminal.ansiGreen +palette = 2=#49e9a6 +# terminal.ansiYellow +palette = 3=#e4b781 +# terminal.ansiBlue +palette = 4=#49ace9 +# terminal.ansiMagenta +palette = 5=#df769b +# terminal.ansiCyan +palette = 6=#49d6e9 +# terminal.ansiWhite +palette = 7=#b2cacd + +# Bright Colors +# terminal.ansiBrightBlack +palette = 8=#47686c +# terminal.ansiBrightRed +palette = 9=#e97749 +# terminal.ansiBrightGreen +palette = 10=#60ebb1 +# terminal.ansiBrightYellow +palette = 11=#e69533 +# terminal.ansiBrightBlue +palette = 12=#60b6eb +# terminal.ansiBrightMagenta +palette = 13=#e798b3 +# terminal.ansiBrightCyan +palette = 14=#60dbeb +# terminal.ansiBrightWhite +palette = 15=#c1d4d7 diff --git a/config/ghostty/themes/noctis-azureus b/config/ghostty/themes/noctis-azureus new file mode 100644 index 0000000..a6da0b9 --- /dev/null +++ b/config/ghostty/themes/noctis-azureus @@ -0,0 +1,59 @@ +# Noctis Azureus +# Based on https://github.com/liviuschera/noctis + +# Terminal Colors +# --------------------------- +# terminal.background +background = 051b29 +# terminal.foreground +foreground = becfda + +# Cursor +# --------------------------- +# terminalCursor.foreground +cursor-color = becfda + +# Selection +# --------------------------- +# selection.background +selection-background = 1679b6 +# terminal.foreground +selection-foreground = becfda + +# ANSI Colors +# --------------------------- +# Regular Colors +# terminal.ansiBlack +palette = 0=#28353e +# terminal.ansiRed +palette = 1=#e66533 +# terminal.ansiGreen +palette = 2=#49e9a6 +# terminal.ansiYellow +palette = 3=#e4b781 +# terminal.ansiBlue +palette = 4=#49ace9 +# terminal.ansiMagenta +palette = 5=#df769b +# terminal.ansiCyan +palette = 6=#49d6e9 +# terminal.ansiWhite +palette = 7=#aec3d0 + +# Bright Colors +# terminal.ansiBrightBlack +palette = 8=#475e6c +# terminal.ansiBrightRed +palette = 9=#e97749 +# terminal.ansiBrightGreen +palette = 10=#60ebb1 +# terminal.ansiBrightYellow +palette = 11=#e69533 +# terminal.ansiBrightBlue +palette = 12=#60b6eb +# terminal.ansiBrightMagenta +palette = 13=#e798b3 +# terminal.ansiBrightCyan +palette = 14=#60dbeb +# terminal.ansiBrightWhite +palette = 15=#becfda diff --git a/config/nvim/colors/noctis.lua b/config/nvim/colors/noctis.lua new file mode 100644 index 0000000..0b15072 --- /dev/null +++ b/config/nvim/colors/noctis.lua @@ -0,0 +1,49 @@ +-- Noctis palette (original) +-- Source: https://github.com/liviuschera/noctis + +local palette = { + -- UI backgrounds + bg = '#052529', + bg_dark = '#041d20', + bg_darker = '#03191b', + bg_float = '#083d44', + bg_highlight = '#0a4a52', + bg_visual = '#169fb1', + -- Diff backgrounds + diff_add = '#16b67327', + diff_delete = '#e6653341', + diff_change = '#169fb133', + -- Foreground + fg = '#b2cacd', + fg_dark = '#a5b5b5', + fg_gutter = '#4e6b6e', + -- Syntax colors (from tokenColors) + comment = '#5b858b', + keyword = '#df769b', + tag = '#e66533', + variable = '#e4b781', + string = '#49e9a6', + string_escape = '#16b673', + number = '#7060eb', + func = '#16a3b6', + type = '#d67e5c', + constant = '#d5971a', + support = '#49d6e9', + misc = '#49ace9', + error = '#e34e1c', + warning = '#ffa857', + info = '#49ace9', + hint = '#16b673', + -- UI accents + border = '#083d44', + cursor = '#85efff', + search = '#49e9a6', + match = '#e4b781', +} + +-- Fix diff backgrounds (remove alpha, blend with bg) +palette.diff_add = '#1a3328' +palette.diff_delete = '#3d2a2a' +palette.diff_change = '#153a5b' + +require('raytheme').load(palette, 'noctis') diff --git a/config/nvim/colors/noctis_azureus.lua b/config/nvim/colors/noctis_azureus.lua new file mode 100644 index 0000000..252e8a1 --- /dev/null +++ b/config/nvim/colors/noctis_azureus.lua @@ -0,0 +1,44 @@ +-- Noctis Azureus palette +-- Source: https://github.com/liviuschera/noctis + +local palette = { + -- UI backgrounds + bg = '#07273b', + bg_dark = '#051b29', + bg_darker = '#062132', + bg_float = '#09334e', + bg_highlight = '#0c3f5f', + bg_visual = '#1679b6', + -- Diff backgrounds + diff_add = '#1a3328', + diff_delete = '#3d2a2a', + diff_change = '#153a5b', + -- Foreground + fg = '#becfda', + fg_dark = '#9fb6c6', + fg_gutter = '#4d6c80', + -- Syntax colors + comment = '#5988a6', + keyword = '#df769b', + tag = '#e66533', + variable = '#e4b781', + string = '#49e9a6', + string_escape = '#16b673', + number = '#7060eb', + func = '#16a3b6', + type = '#d67e5c', + constant = '#d5971a', + support = '#49d6e9', + misc = '#49ace9', + error = '#e34e1c', + warning = '#ffa857', + info = '#49ace9', + hint = '#16b673', + -- UI accents + border = '#09334e', + cursor = '#b3e2ff', + search = '#40bf6a', + match = '#e4b781', +} + +require('raytheme').load(palette, 'noctis_azureus') diff --git a/config/nvim/colors/noctis_azureus_ghostty.lua b/config/nvim/colors/noctis_azureus_ghostty.lua new file mode 100644 index 0000000..980806d --- /dev/null +++ b/config/nvim/colors/noctis_azureus_ghostty.lua @@ -0,0 +1,44 @@ +-- Noctis Azureus Ghostty palette +-- Based on https://github.com/EastSun5566/ghostty-noctis-themes + +local palette = { + -- UI backgrounds (from ghostty theme) + bg = '#051b29', + bg_dark = '#041520', + bg_darker = '#030f18', + bg_float = '#07273b', + bg_highlight = '#0c3f5f', + bg_visual = '#1679b6', + -- Diff backgrounds + diff_add = '#1a3328', + diff_delete = '#3d2a2a', + diff_change = '#153a5b', + -- Foreground + fg = '#becfda', + fg_dark = '#aec3d0', + fg_gutter = '#475e6c', + -- Syntax colors (from terminal palette) + comment = '#475e6c', -- bright black + keyword = '#df769b', -- magenta + tag = '#e66533', -- red + variable = '#e4b781', -- yellow + string = '#49e9a6', -- green + string_escape = '#60ebb1', -- bright green + number = '#49ace9', -- blue + func = '#49d6e9', -- cyan + type = '#e97749', -- bright red + constant = '#e69533', -- bright yellow + support = '#60dbeb', -- bright cyan + misc = '#60b6eb', -- bright blue + error = '#e66533', -- red + warning = '#e4b781', -- yellow + info = '#49ace9', -- blue + hint = '#49e9a6', -- green + -- UI accents + border = '#28353e', -- black + cursor = '#becfda', + search = '#49e9a6', + match = '#e4b781', +} + +require('raytheme').load(palette, 'noctis_azureus_ghostty') diff --git a/config/nvim/colors/noctis_ghostty.lua b/config/nvim/colors/noctis_ghostty.lua new file mode 100644 index 0000000..71b38b1 --- /dev/null +++ b/config/nvim/colors/noctis_ghostty.lua @@ -0,0 +1,44 @@ +-- Noctis Ghostty palette +-- Based on https://github.com/EastSun5566/ghostty-noctis-themes + +local palette = { + -- UI backgrounds (from ghostty theme) + bg = '#03191b', + bg_dark = '#021314', + bg_darker = '#010e0f', + bg_float = '#0a2628', + bg_highlight = '#107684', + bg_visual = '#107684', + -- Diff backgrounds + diff_add = '#1a3328', + diff_delete = '#3d2a2a', + diff_change = '#153a5b', + -- Foreground + fg = '#b2cacd', + fg_dark = '#c1d4d7', + fg_gutter = '#47686c', + -- Syntax colors (from terminal palette) + comment = '#47686c', -- bright black + keyword = '#df769b', -- magenta + tag = '#e66533', -- red + variable = '#e4b781', -- yellow + string = '#49e9a6', -- green + string_escape = '#60ebb1', -- bright green + number = '#49ace9', -- blue + func = '#49d6e9', -- cyan + type = '#e97749', -- bright red + constant = '#e69533', -- bright yellow + support = '#60dbeb', -- bright cyan + misc = '#60b6eb', -- bright blue + error = '#e66533', -- red + warning = '#e4b781', -- yellow + info = '#49ace9', -- blue + hint = '#49e9a6', -- green + -- UI accents + border = '#324a4d', -- black + cursor = '#b2cacd', + search = '#49e9a6', + match = '#e4b781', +} + +require('raytheme').load(palette, 'noctis_ghostty') diff --git a/config/nvim/init.lua b/config/nvim/init.lua index d976e3a..0c74f57 100644 --- a/config/nvim/init.lua +++ b/config/nvim/init.lua @@ -20,6 +20,7 @@ vim.opt.inccommand = 'split' vim.opt.autoread = true vim.opt.cursorline = true vim.opt.scrolloff = 10 +vim.opt.termguicolors = true local path_package = vim.fn.stdpath 'data' .. '/site/' local mini_path = path_package .. 'pack/deps/start/mini.nvim' @@ -37,7 +38,6 @@ add 'folke/snacks.nvim' add 'stevearc/quicker.nvim' add 'stevearc/oil.nvim' add 'A7Lavinraj/fyler.nvim' -add 'EdenEast/nightfox.nvim' add 'williamboman/mason.nvim' add 'williamboman/mason-lspconfig.nvim' add 'neovim/nvim-lspconfig' @@ -57,7 +57,14 @@ add 'aserowy/tmux.nvim' add 'NMAC427/guess-indent.nvim' add 'wakatime/vim-wakatime' +-- color themes +add 'EdenEast/nightfox.nvim' + now(function() + require('mini.statusline').setup { + use_icons = true, + } + require('mini.icons').setup { extension = { lua = { glyph = '󰢱', hl = 'MiniIconsAzure' }, @@ -70,8 +77,14 @@ now(function() directory = { glyph = '󰉋', hl = 'MiniIconsBlue' }, }, } - require('nightfox').setup {} - vim.cmd 'colorscheme nightfox' + -- require('nightfox').setup {} + -- vim.cmd.colorscheme 'nightfox' + require('raytheme').setup { + transparent = false, + italic_comments = true, + bold_keywords = false, + } + vim.cmd.colorscheme 'noctis_azureus_ghostty' end) later(function() @@ -382,7 +395,7 @@ later(function() vim.keymap.set('n', 'gai', function() require('snacks').picker.lsp_incoming_calls() end, vim.tbl_extend('force', opts, { desc = 'C[a]lls Incoming' })) vim.keymap.set('n', 'gao', function() require('snacks').picker.lsp_outgoing_calls() end, vim.tbl_extend('force', opts, { desc = 'C[a]lls Outgoing' })) vim.keymap.set('n', 'K', vim.lsp.buf.hover, vim.tbl_extend('force', opts, { desc = 'Hover documentation (press K again to focus)' })) - vim.keymap.set('n', '', vim.lsp.buf.signature_help, vim.tbl_extend('force', opts, { desc = 'Signature help' })) + -- vim.keymap.set('n', '', vim.lsp.buf.signature_help, vim.tbl_extend('force', opts, { desc = 'Signature help' })) vim.keymap.set('n', 'rn', vim.lsp.buf.rename, vim.tbl_extend('force', opts, { desc = 'Rename symbol' })) vim.keymap.set({ 'n', 'v' }, 'ca', vim.lsp.buf.code_action, vim.tbl_extend('force', opts, { desc = 'Code action' })) vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, vim.tbl_extend('force', opts, { desc = 'Previous diagnostic' })) diff --git a/config/nvim/lua/raytheme.lua b/config/nvim/lua/raytheme.lua new file mode 100644 index 0000000..76ccd32 --- /dev/null +++ b/config/nvim/lua/raytheme.lua @@ -0,0 +1,424 @@ +-- raytheme.lua - Personal colorscheme framework +-- A theme engine that applies palettes defined in colors/ + +local M = {} + +---@class RaythemePalette +---@field bg string +---@field bg_dark string +---@field bg_darker string +---@field bg_float string +---@field bg_highlight string +---@field bg_visual string +---@field diff_add string +---@field diff_delete string +---@field diff_change string +---@field fg string +---@field fg_dark string +---@field fg_gutter string +---@field comment string +---@field keyword string +---@field tag string +---@field variable string +---@field string string +---@field string_escape string +---@field number string +---@field func string +---@field type string +---@field constant string +---@field support string +---@field misc string +---@field error string +---@field warning string +---@field info string +---@field hint string +---@field border string +---@field cursor string +---@field search string +---@field match string + +---@class RaythemeConfig +---@field transparent boolean +---@field italic_comments boolean +---@field bold_keywords boolean +---@field overrides? table + +---@type RaythemeConfig +M.defaults = { + transparent = false, + italic_comments = true, + bold_keywords = false, + overrides = {}, +} + +---@type RaythemeConfig? +M.config = nil + +---@type RaythemePalette? +M.palette = nil + +local function hi(group, opts) vim.api.nvim_set_hl(0, group, opts) end + +---@param c RaythemePalette +---@param opts RaythemeConfig +local function apply_highlights(c, opts) + local bg = opts.transparent and 'NONE' or c.bg + local bg_dark = opts.transparent and 'NONE' or c.bg_dark + local bg_darker = opts.transparent and 'NONE' or c.bg_darker + local comment_style = opts.italic_comments and { fg = c.comment, italic = true } or { fg = c.comment } + local keyword_style = opts.bold_keywords and { fg = c.keyword, bold = true } or { fg = c.keyword } + + -- Editor UI + hi('Normal', { fg = c.fg, bg = bg }) + hi('NormalFloat', { fg = c.fg, bg = c.bg_float }) + hi('FloatBorder', { fg = c.border, bg = c.bg_float }) + hi('Cursor', { fg = c.bg, bg = c.cursor }) + hi('CursorLine', { bg = c.bg_float }) + hi('CursorColumn', { bg = c.bg_float }) + hi('ColorColumn', { bg = bg_dark }) + hi('LineNr', { fg = c.fg_gutter }) + hi('CursorLineNr', { fg = c.misc, bold = true }) + hi('SignColumn', { fg = c.fg_gutter, bg = bg }) + hi('VertSplit', { fg = c.border }) + hi('WinSeparator', { fg = c.border }) + hi('Folded', { fg = c.comment, bg = bg_dark }) + hi('FoldColumn', { fg = c.fg_gutter }) + hi('NonText', { fg = c.fg_gutter }) + hi('SpecialKey', { fg = c.fg_gutter }) + hi('Whitespace', { fg = c.fg_gutter }) + hi('EndOfBuffer', { fg = c.bg }) + hi('Directory', { fg = c.misc }) + hi('Conceal', { fg = c.fg_gutter }) + hi('MatchParen', { fg = c.match, bold = true }) + + -- Selection & Search + hi('Visual', { bg = c.bg_highlight }) + hi('VisualNOS', { bg = c.bg_highlight }) + hi('Search', { fg = c.bg, bg = c.search }) + hi('IncSearch', { fg = c.bg, bg = c.match }) + hi('CurSearch', { fg = c.bg, bg = c.match }) + hi('Substitute', { fg = c.bg, bg = c.error }) + + -- Pmenu (completion menu) + hi('Pmenu', { fg = c.fg, bg = bg_dark }) + hi('PmenuSel', { fg = c.fg, bg = c.bg_highlight }) + hi('PmenuSbar', { bg = c.bg_float }) + hi('PmenuThumb', { bg = c.fg_gutter }) + + -- Statusline & Tabline + hi('StatusLine', { fg = c.fg, bg = c.bg_float }) + hi('StatusLineNC', { fg = c.fg_dark, bg = c.bg_float }) + hi('TabLine', { fg = c.fg_dark, bg = bg_darker }) + hi('TabLineFill', { bg = bg_darker }) + hi('TabLineSel', { fg = c.fg, bg = bg }) + hi('WinBar', { fg = c.fg, bg = bg_darker }) + hi('WinBarNC', { fg = c.fg_dark, bg = bg_darker }) + + -- Messages + hi('ModeMsg', { fg = c.fg, bold = true }) + hi('MsgArea', { fg = c.fg }) + hi('MoreMsg', { fg = c.string }) + hi('Question', { fg = c.string }) + hi('WarningMsg', { fg = c.warning }) + hi('ErrorMsg', { fg = c.error }) + hi('Title', { fg = c.tag, bold = true }) + + -- Diff + hi('DiffAdd', { bg = c.diff_add }) + hi('DiffChange', { bg = c.diff_change }) + hi('DiffDelete', { bg = c.diff_delete }) + hi('DiffText', { bg = c.bg_highlight }) + hi('diffAdded', { fg = c.string }) + hi('diffRemoved', { fg = c.error }) + hi('diffChanged', { fg = c.misc }) + hi('diffFile', { fg = c.tag }) + hi('diffIndexLine', { fg = c.comment }) + + -- Spelling + hi('SpellBad', { undercurl = true, sp = c.error }) + hi('SpellCap', { undercurl = true, sp = c.warning }) + hi('SpellLocal', { undercurl = true, sp = c.info }) + hi('SpellRare', { undercurl = true, sp = c.hint }) + + -- Diagnostics + hi('DiagnosticError', { fg = c.error }) + hi('DiagnosticWarn', { fg = c.warning }) + hi('DiagnosticInfo', { fg = c.info }) + hi('DiagnosticHint', { fg = c.hint }) + hi('DiagnosticOk', { fg = c.string }) + hi('DiagnosticUnderlineError', { undercurl = true, sp = c.error }) + hi('DiagnosticUnderlineWarn', { undercurl = true, sp = c.warning }) + hi('DiagnosticUnderlineInfo', { undercurl = true, sp = c.info }) + hi('DiagnosticUnderlineHint', { undercurl = true, sp = c.hint }) + hi('DiagnosticUnderlineOk', { undercurl = true, sp = c.string }) + hi('DiagnosticVirtualTextError', { fg = c.error, bg = c.diff_delete }) + hi('DiagnosticVirtualTextWarn', { fg = c.warning, bg = c.diff_change }) + hi('DiagnosticVirtualTextInfo', { fg = c.info, bg = c.bg_float }) + hi('DiagnosticVirtualTextHint', { fg = c.hint, bg = c.bg_float }) + + -- Syntax highlighting + hi('Comment', comment_style) + hi('Constant', { fg = c.constant }) + hi('String', { fg = c.string }) + hi('Character', { fg = c.string }) + hi('Number', { fg = c.number }) + hi('Boolean', { fg = c.number }) + hi('Float', { fg = c.number }) + hi('Identifier', { fg = c.variable }) + hi('Function', { fg = c.func }) + hi('Statement', keyword_style) + hi('Conditional', keyword_style) + hi('Repeat', keyword_style) + hi('Label', keyword_style) + hi('Operator', { fg = c.tag }) + hi('Keyword', keyword_style) + hi('Exception', keyword_style) + hi('PreProc', { fg = c.support }) + hi('Include', keyword_style) + hi('Define', { fg = c.support }) + hi('Macro', { fg = c.support }) + hi('PreCondit', { fg = c.support }) + hi('Type', { fg = c.type }) + hi('StorageClass', keyword_style) + hi('Structure', { fg = c.type }) + hi('Typedef', { fg = c.type }) + hi('Special', { fg = c.misc }) + hi('SpecialChar', { fg = c.string_escape }) + hi('Tag', { fg = c.tag }) + hi('Delimiter', { fg = c.fg }) + hi('SpecialComment', { fg = c.comment, bold = true }) + hi('Debug', { fg = c.warning }) + hi('Underlined', { underline = true }) + hi('Error', { fg = c.error }) + hi('Todo', { fg = c.bg, bg = c.misc, bold = true }) + + -- Treesitter + hi('@variable', { fg = c.variable }) + hi('@variable.builtin', { fg = c.tag }) + hi('@variable.parameter', { fg = c.variable }) + hi('@variable.member', { fg = c.variable }) + hi('@constant', { fg = c.constant }) + hi('@constant.builtin', { fg = c.constant }) + hi('@module', { fg = c.support }) + hi('@label', { fg = c.misc }) + hi('@string', { fg = c.string }) + hi('@string.escape', { fg = c.string_escape }) + hi('@string.regexp', { fg = c.string_escape }) + hi('@string.special', { fg = c.string_escape }) + hi('@string.special.url', { fg = c.misc, underline = true }) + hi('@character', { fg = c.string }) + hi('@number', { fg = c.number }) + hi('@boolean', { fg = c.number }) + hi('@float', { fg = c.number }) + hi('@function', { fg = c.func }) + hi('@function.builtin', { fg = c.func }) + hi('@function.call', { fg = c.func }) + hi('@function.method', { fg = c.func }) + hi('@function.method.call', { fg = c.func }) + hi('@constructor', { fg = c.support }) + hi('@keyword', keyword_style) + hi('@keyword.function', keyword_style) + hi('@keyword.operator', keyword_style) + hi('@keyword.import', keyword_style) + hi('@keyword.return', keyword_style) + hi('@keyword.conditional', keyword_style) + hi('@keyword.repeat', keyword_style) + hi('@keyword.exception', keyword_style) + hi('@keyword.modifier', keyword_style) + hi('@operator', { fg = c.tag }) + hi('@punctuation', { fg = c.fg }) + hi('@punctuation.bracket', { fg = c.fg }) + hi('@punctuation.delimiter', { fg = c.fg }) + hi('@punctuation.special', { fg = c.misc }) + hi('@comment', comment_style) + hi('@comment.todo', { fg = c.bg, bg = c.misc, bold = true }) + hi('@comment.note', { fg = c.bg, bg = c.info, bold = true }) + hi('@comment.warning', { fg = c.bg, bg = c.warning, bold = true }) + hi('@comment.error', { fg = c.bg, bg = c.error, bold = true }) + hi('@type', { fg = c.type }) + hi('@type.builtin', { fg = c.type }) + hi('@type.definition', { fg = c.type }) + hi('@attribute', { fg = c.type }) + hi('@property', { fg = c.variable }) + hi('@tag', { fg = c.tag }) + hi('@tag.attribute', { fg = c.variable }) + hi('@tag.delimiter', { fg = c.fg }) + hi('@diff.plus', { fg = c.string }) + hi('@diff.minus', { fg = c.error }) + hi('@diff.delta', { fg = c.misc }) + + -- LSP semantic tokens + hi('@lsp.type.class', { fg = c.type }) + hi('@lsp.type.decorator', { fg = c.func }) + hi('@lsp.type.enum', { fg = c.type }) + hi('@lsp.type.enumMember', { fg = c.constant }) + hi('@lsp.type.function', { fg = c.func }) + hi('@lsp.type.interface', { fg = c.type }) + hi('@lsp.type.macro', { fg = c.support }) + hi('@lsp.type.method', { fg = c.func }) + hi('@lsp.type.namespace', { fg = c.support }) + hi('@lsp.type.parameter', { fg = c.variable }) + hi('@lsp.type.property', { fg = c.variable }) + hi('@lsp.type.struct', { fg = c.type }) + hi('@lsp.type.type', { fg = c.type }) + hi('@lsp.type.typeParameter', { fg = c.type }) + hi('@lsp.type.variable', { fg = c.variable }) + hi('@lsp.mod.deprecated', { strikethrough = true }) + hi('@lsp.mod.readonly', { italic = true }) + + -- LSP references + hi('LspReferenceText', { bg = c.bg_highlight }) + hi('LspReferenceRead', { bg = c.bg_highlight }) + hi('LspReferenceWrite', { bg = c.bg_highlight }) + hi('LspSignatureActiveParameter', { fg = c.match, bold = true }) + hi('LspCodeLens', { fg = c.comment }) + hi('LspInlayHint', { fg = c.fg_gutter, bg = c.bg_dark, italic = true }) + + -- Git signs + hi('GitSignsAdd', { fg = c.string }) + hi('GitSignsChange', { fg = c.misc }) + hi('GitSignsDelete', { fg = c.error }) + hi('GitSignsCurrentLineBlame', { fg = c.fg_gutter }) + + -- Neogit / Diffview + hi('NeogitDiffAdd', { fg = c.string, bg = c.diff_add }) + hi('NeogitDiffDelete', { fg = c.error, bg = c.diff_delete }) + hi('NeogitDiffContext', { bg = c.bg_dark }) + hi('NeogitHunkHeader', { fg = c.misc, bg = c.bg_float }) + hi('NeogitBranch', { fg = c.keyword }) + hi('NeogitRemote', { fg = c.support }) + hi('DiffviewFilePanelTitle', { fg = c.tag, bold = true }) + hi('DiffviewFilePanelCounter', { fg = c.misc }) + + -- Which-key + hi('WhichKey', { fg = c.func }) + hi('WhichKeyGroup', { fg = c.keyword }) + hi('WhichKeyDesc', { fg = c.fg }) + hi('WhichKeySeparator', { fg = c.comment }) + hi('WhichKeyFloat', { bg = c.bg_float }) + hi('WhichKeyBorder', { fg = c.border }) + hi('WhichKeyValue', { fg = c.fg_dark }) + + -- Telescope / Snacks picker + hi('TelescopeBorder', { fg = c.border }) + hi('TelescopePromptBorder', { fg = c.border }) + hi('TelescopeResultsBorder', { fg = c.border }) + hi('TelescopePreviewBorder', { fg = c.border }) + hi('TelescopeMatching', { fg = c.match, bold = true }) + hi('TelescopeSelection', { bg = c.bg_highlight }) + hi('TelescopePromptPrefix', { fg = c.misc }) + hi('TelescopeSelectionCaret', { fg = c.misc }) + hi('TelescopeTitle', { fg = c.tag, bold = true }) + + -- Blink.cmp + hi('BlinkCmpMenu', { fg = c.fg, bg = bg_dark }) + hi('BlinkCmpMenuBorder', { fg = c.border }) + hi('BlinkCmpMenuSelection', { bg = c.bg_highlight }) + hi('BlinkCmpLabel', { fg = c.fg }) + hi('BlinkCmpLabelMatch', { fg = c.match, bold = true }) + hi('BlinkCmpKind', { fg = c.support }) + hi('BlinkCmpDoc', { fg = c.fg, bg = c.bg_float }) + hi('BlinkCmpDocBorder', { fg = c.border }) + + -- Oil.nvim + hi('OilDir', { fg = c.misc }) + hi('OilDirIcon', { fg = c.misc }) + hi('OilFile', { fg = c.fg }) + hi('OilCreate', { fg = c.string }) + hi('OilDelete', { fg = c.error }) + hi('OilMove', { fg = c.warning }) + hi('OilCopy', { fg = c.info }) + hi('OilChange', { fg = c.misc }) + + -- Grapple + hi('GrappleTitle', { fg = c.tag, bold = true }) + hi('GrappleBorder', { fg = c.border }) + hi('GrappleCurrent', { fg = c.misc, bold = true }) + hi('GrappleFooter', { fg = c.comment }) + + -- Mini.statusline + hi('MiniStatuslineModeNormal', { fg = c.bg, bg = c.misc, bold = true }) + hi('MiniStatuslineModeInsert', { fg = c.bg, bg = c.string, bold = true }) + hi('MiniStatuslineModeVisual', { fg = c.bg, bg = c.keyword, bold = true }) + hi('MiniStatuslineModeReplace', { fg = c.bg, bg = c.error, bold = true }) + hi('MiniStatuslineModeCommand', { fg = c.bg, bg = c.warning, bold = true }) + hi('MiniStatuslineModeOther', { fg = c.bg, bg = c.support, bold = true }) + hi('MiniStatuslineDevinfo', { fg = c.fg, bg = c.bg_highlight }) + hi('MiniStatuslineFilename', { fg = c.fg, bg = c.bg_float }) + hi('MiniStatuslineFileinfo', { fg = c.fg, bg = c.bg_highlight }) + hi('MiniStatuslineInactive', { fg = c.fg_dark, bg = c.bg_float }) + + -- Mini.icons + hi('MiniIconsAzure', { fg = c.info }) + hi('MiniIconsBlue', { fg = c.misc }) + hi('MiniIconsCyan', { fg = c.support }) + hi('MiniIconsGreen', { fg = c.string }) + hi('MiniIconsGrey', { fg = c.fg_dark }) + hi('MiniIconsOrange', { fg = c.tag }) + hi('MiniIconsPurple', { fg = c.number }) + hi('MiniIconsRed', { fg = c.error }) + hi('MiniIconsYellow', { fg = c.warning }) + + -- Find-file (custom) + hi('FindFilePrompt', { fg = c.tag, bold = true }) + hi('FindFileSep', { fg = c.comment }) + hi('FindFileMatch', { fg = c.fg, bg = c.bg_float }) + hi('FindFileMatchSelected', { fg = c.fg, bg = c.bg_highlight }) + hi('FindFileMatchChar', { fg = c.match, bold = true }) + + -- Markdown + hi('@markup.heading', { fg = c.tag, bold = true }) + hi('@markup.heading.1', { fg = c.tag, bold = true }) + hi('@markup.heading.2', { fg = c.keyword, bold = true }) + hi('@markup.heading.3', { fg = c.func, bold = true }) + hi('@markup.heading.4', { fg = c.type, bold = true }) + hi('@markup.heading.5', { fg = c.constant, bold = true }) + hi('@markup.heading.6', { fg = c.misc, bold = true }) + hi('@markup.link', { fg = c.misc, underline = true }) + hi('@markup.link.url', { fg = c.comment, underline = true }) + hi('@markup.link.label', { fg = c.misc }) + hi('@markup.raw', { fg = c.string }) + hi('@markup.raw.block', { fg = c.string }) + hi('@markup.list', { fg = c.tag }) + hi('@markup.list.checked', { fg = c.string }) + hi('@markup.list.unchecked', { fg = c.fg_gutter }) + hi('@markup.italic', { italic = true }) + hi('@markup.strong', { bold = true }) + hi('@markup.strikethrough', { strikethrough = true }) + hi('@markup.quote', { fg = c.comment, italic = true }) + + -- Apply user overrides + if opts.overrides then + for group, hl in pairs(opts.overrides) do + hi(group, hl) + end + end +end + +---@param opts? RaythemeConfig +function M.setup(opts) M.config = vim.tbl_deep_extend('force', M.defaults, opts or {}) end + +---@param palette RaythemePalette +---@param name string +function M.load(palette, name) + if not palette then + vim.notify('raytheme: palette is required', vim.log.levels.ERROR) + return + end + + local config = M.config or M.defaults + + if vim.g.colors_name then vim.cmd 'highlight clear' end + + vim.opt.background = 'dark' + vim.g.colors_name = name or 'raytheme' + + M.palette = palette + apply_highlights(palette, config) +end + +--- Get current palette colors +---@return RaythemePalette? +function M.colors() return M.palette end + +return M diff --git a/config/sketchybar/bar.lua b/config/sketchybar/bar.lua index 6aea5b2..36b8a5a 100644 --- a/config/sketchybar/bar.lua +++ b/config/sketchybar/bar.lua @@ -10,6 +10,6 @@ sbar.bar { margin = settings.dimens.padding.bar, corner_radius = settings.dimens.graphics.background.corner_radius, y_offset = settings.dimens.graphics.bar.offset, - -- blur_radius = settings.dimens.graphics.blur_radius, + blur_radius = settings.dimens.graphics.blur_radius, border_width = 0, } diff --git a/config/sketchybar/items/spaces.lua b/config/sketchybar/items/spaces.lua index 3737a0e..04bf54d 100644 --- a/config/sketchybar/items/spaces.lua +++ b/config/sketchybar/items/spaces.lua @@ -21,11 +21,11 @@ local currentWorkspaceWatcher = sbar.add('item', { -- https://www.nerdfonts.com/cheat-sheet local spaceConfigs = { ['1'] = { icon = '󱞁', name = 'Main' }, - ['2'] = { icon = '', name = '' }, - ['3'] = { icon = '', name = '' }, + ['2'] = { icon = '󰘦 ', name = 'Dev' }, + ['3'] = { icon = '󰧑', name = 'AI' }, ['4'] = { icon = '', name = '' }, ['5'] = { icon = '󰌾', name = 'Misc' }, - ['6'] = { icon = '', name = '' }, + ['6'] = { icon = '󱉟', name = 'Library' }, ['7'] = { icon = '󰎆', name = 'Music' }, ['8'] = { icon = '󰇮', name = 'Mail' }, ['9'] = { icon = '󰭹', name = 'Chat' }, diff --git a/config/tmux/tmux.conf b/config/tmux/tmux.conf index 8e9d40b..fd8fd33 100644 --- a/config/tmux/tmux.conf +++ b/config/tmux/tmux.conf @@ -18,7 +18,7 @@ set -s escape-time 500 set -g history-limit 2000 set-option -g detach-on-destroy off -set-option -g status-position bottom # top +set-option -g status-position top set-option -g default-terminal 'xterm-256color' set-option -sa terminal-features ',xterm-kitty:RGB:extkeys' @@ -138,20 +138,6 @@ if -b 'command -v reattach-to-user-namespace > /dev/null 2>&1' 'bind y run -b "t if -b 'command -v clip.exe > /dev/null 2>&1' 'bind y run -b "tmux save-buffer - | clip.exe"' if -b '[ -c /dev/clipboard ]' 'bind y run -b "tmux save-buffer - > /dev/clipboard"' -# status line -set -g status "on" -set -g status-justify "left" - -set -g status-left-length "100" -set -g status-right-length "100" - -set -g status-left-style NONE -set -g status-right-style NONE - -# set -g status-style bg=default -set -g status-right "#H" -# set -g status-interval 10 # redraw status line every 10 seconds - # https://github.com/christoomey/vim-tmux-navigator # disable wrapping is_vim="ps -o state= -o comm= -t '#{pane_tty}' \ @@ -165,3 +151,45 @@ bind-key -T copy-mode-vi 'C-h' if-shell -F '#{pane_at_left}' {} { select-pane bind-key -T copy-mode-vi 'C-j' if-shell -F '#{pane_at_bottom}' {} { select-pane -D } bind-key -T copy-mode-vi 'C-k' if-shell -F '#{pane_at_top}' {} { select-pane -U } bind-key -T copy-mode-vi 'C-l' if-shell -F '#{pane_at_right}' {} { select-pane -R } + +################ +#### THEMES #### +################ + +# status line +set -g status "on" +set -g status-justify "left" + +set -g status-left-length "100" +set -g status-right-length "100" + +set -g status-left-style NONE +set -g status-right-style NONE + +# Colors (Noctis Azureus) +%hidden TMUX_BG="#051b29" +%hidden TMUX_FG="#becfda" +%hidden TMUX_ACCENT="#49ace9" +%hidden TMUX_INACTIVE="#475e6c" + +set -g status-style "bg=default,fg=#{TMUX_FG}" + +# Left side - TMUX label +set -g status-left "#[bg=#{TMUX_ACCENT},fg=#{TMUX_BG},bold] TMUX #[bg=default,fg=default] " + +# Window format - "1 :: name" +set -g window-status-format "#[fg=#{TMUX_INACTIVE}] #I :: #W " +set -g window-status-current-format "#[fg=#{TMUX_ACCENT},bold] #I :: #W #[fg=#{TMUX_FG}]*" + +# Window separator +set -g window-status-separator "" + +# Right side +set -g status-right "#[fg=#{TMUX_FG}]#H " +# set -g status-interval 10 # redraw status line every 10 seconds + +# Add padding below status bar (2-line status) +set -g status 2 +set -g 'status-format[1]' '' + + diff --git a/config/yazi/.luarc.json b/config/yazi/.luarc.json index ec3a02b..033e3eb 100644 --- a/config/yazi/.luarc.json +++ b/config/yazi/.luarc.json @@ -1,7 +1,14 @@ { "$schema": "https://raw.githubusercontent.com/LuaLS/vscode-lua/master/setting/schema.json", - "runtime.version": "Lua 5.4", - "workspace.library": [ - "~/.config/yazi/plugins/types.yazi/", - ], + "runtime": { + "version": "LuaJIT" + }, + "workspace": { + "library": [ + "~/.config/yazi/plugins/types.yazi/" + ] + }, + "diagnostics": { + "disable": ["undefined-field"] + } }