├── colors └── xcodedark.lua ├── lua └── xcodedark │ ├── groups │ ├── integrations │ │ ├── blink.lua │ │ ├── which-key.lua │ │ ├── incline.lua │ │ ├── lazygit.lua │ │ ├── gitsigns.lua │ │ ├── notify.lua │ │ ├── nvim-tree.lua │ │ ├── telescope.lua │ │ ├── lsp.lua │ │ ├── snacks.lua │ │ ├── bufferline.lua │ │ └── treesitter.lua │ ├── syntax.lua │ └── editor.lua │ ├── colors.lua │ └── init.lua ├── LICENSE └── README.md /colors/xcodedark.lua: -------------------------------------------------------------------------------- 1 | require("xcodedark").load() 2 | -------------------------------------------------------------------------------- /lua/xcodedark/groups/integrations/blink.lua: -------------------------------------------------------------------------------- 1 | local M = {} 2 | 3 | function M.setup(colors) 4 | local highlights = { 5 | -- Blink completion menu 6 | BlinkCmpMenu = { 7 | bg = "NONE", 8 | fg = colors.fg, 9 | }, 10 | BlinkCmpMenuBorder = { 11 | bg = "NONE", 12 | fg = colors.keyword, -- Xcode pink for border 13 | }, 14 | BlinkCmpMenuSelection = { 15 | bg = "#4A1F3D", -- Darker pink background for selection 16 | fg = colors.keyword, 17 | }, 18 | 19 | -- Scrollbar styling to match theme 20 | PmenuSbar = { 21 | bg = "NONE", 22 | }, 23 | PmenuThumb = { 24 | bg = colors.keyword, 25 | }, 26 | 27 | -- Documentation window styling 28 | BlinkCmpDoc = { 29 | bg = "NONE", 30 | fg = colors.fg, 31 | }, 32 | BlinkCmpDocBorder = { 33 | bg = "NONE", 34 | fg = colors.keyword, 35 | }, 36 | 37 | -- Additional documentation window highlights 38 | BlinkCmpDocCursorLine = { 39 | bg = "#4A1F3D", 40 | }, 41 | } 42 | 43 | -- Apply highlights 44 | for group, opts in pairs(highlights) do 45 | vim.api.nvim_set_hl(0, group, opts) 46 | end 47 | end 48 | 49 | return M 50 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Austin Sofaer 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /lua/xcodedark/groups/integrations/which-key.lua: -------------------------------------------------------------------------------- 1 | local M = {} 2 | 3 | function M.setup(colors) 4 | -- Check if we're in transparent mode 5 | local bg = colors.bg_light 6 | if colors.bg == "NONE" then 7 | bg = "NONE" 8 | end 9 | 10 | local highlights = { 11 | -- Which-key popup window 12 | WhichKey = { 13 | fg = colors.function_name, 14 | bg = bg, 15 | bold = true, 16 | }, 17 | WhichKeyGroup = { 18 | fg = colors.keyword, 19 | bg = bg, 20 | }, 21 | WhichKeyDesc = { 22 | fg = colors.fg, 23 | bg = bg, 24 | }, 25 | WhichKeySeperator = { 26 | fg = colors.comment, 27 | bg = bg, 28 | }, 29 | WhichKeySeparator = { 30 | fg = colors.comment, 31 | bg = bg, 32 | }, 33 | WhichKeyFloat = { 34 | bg = bg, 35 | }, 36 | WhichKeyBorder = { 37 | fg = colors.border, 38 | bg = bg, 39 | }, 40 | 41 | -- Different key types 42 | WhichKeyValue = { 43 | fg = colors.string, 44 | bg = bg, 45 | }, 46 | 47 | -- Icons and symbols 48 | WhichKeyIcon = { 49 | fg = colors.function_name, 50 | bg = bg, 51 | }, 52 | WhichKeyIconAzure = { 53 | fg = colors.info, 54 | bg = bg, 55 | }, 56 | WhichKeyIconBlue = { 57 | fg = colors.function_name, 58 | bg = bg, 59 | }, 60 | WhichKeyIconCyan = { 61 | fg = colors.terminal_cyan, 62 | bg = bg, 63 | }, 64 | WhichKeyIconGreen = { 65 | fg = colors.git_add, 66 | bg = bg, 67 | }, 68 | WhichKeyIconGrey = { 69 | fg = colors.fg_dark, 70 | bg = bg, 71 | }, 72 | WhichKeyIconOrange = { 73 | fg = colors.preprocessor, 74 | bg = bg, 75 | }, 76 | WhichKeyIconPurple = { 77 | fg = colors.keyword, 78 | bg = bg, 79 | }, 80 | WhichKeyIconRed = { 81 | fg = colors.error, 82 | bg = bg, 83 | }, 84 | WhichKeyIconYellow = { 85 | fg = colors.warning, 86 | bg = bg, 87 | }, 88 | 89 | -- Title and normal elements 90 | WhichKeyTitle = { 91 | fg = colors.function_name, 92 | bg = bg, 93 | bold = true, 94 | }, 95 | WhichKeyNormal = { 96 | fg = colors.fg, 97 | bg = bg, 98 | }, 99 | } 100 | 101 | -- Apply highlights 102 | for group, opts in pairs(highlights) do 103 | vim.api.nvim_set_hl(0, group, opts) 104 | end 105 | end 106 | 107 | return M 108 | -------------------------------------------------------------------------------- /lua/xcodedark/groups/integrations/incline.lua: -------------------------------------------------------------------------------- 1 | local M = {} 2 | 3 | function M.setup(colors) 4 | -- Check if we're in transparent mode 5 | local bg = colors.bg_light 6 | if colors.bg == "NONE" then 7 | bg = "NONE" 8 | end 9 | 10 | local highlights = { 11 | -- Incline normal window 12 | InclineNormal = { 13 | fg = colors.fg_alt, 14 | bg = bg, 15 | }, 16 | InclineNormalNC = { 17 | fg = colors.fg_dark, 18 | bg = bg, 19 | }, 20 | 21 | -- For the active/focused window indicator 22 | InclineActive = { 23 | fg = colors.function_name, 24 | bg = bg, 25 | bold = true, 26 | }, 27 | 28 | -- For inactive windows 29 | InclineInactive = { 30 | fg = colors.fg_dark, 31 | bg = bg, 32 | }, 33 | 34 | -- File modification indicator 35 | InclineModified = { 36 | fg = colors.git_change, 37 | bg = bg, 38 | bold = true, 39 | }, 40 | 41 | -- Readonly file indicator 42 | InclineReadonly = { 43 | fg = colors.error, 44 | bg = bg, 45 | }, 46 | 47 | -- File type/icon 48 | InclineFileIcon = { 49 | fg = colors.function_name, 50 | bg = bg, 51 | }, 52 | 53 | -- Diagnostic indicators 54 | InclineError = { 55 | fg = colors.error, 56 | bg = bg, 57 | bold = true, 58 | }, 59 | InclineWarning = { 60 | fg = colors.warning, 61 | bg = bg, 62 | bold = true, 63 | }, 64 | InclineInfo = { 65 | fg = colors.info, 66 | bg = bg, 67 | }, 68 | InclineHint = { 69 | fg = colors.hint, 70 | bg = bg, 71 | }, 72 | 73 | -- Git branch/status 74 | InclineGit = { 75 | fg = colors.git_add, 76 | bg = bg, 77 | }, 78 | InclineGitBranch = { 79 | fg = colors.function_name, 80 | bg = bg, 81 | }, 82 | InclineGitAdded = { 83 | fg = colors.git_add, 84 | bg = bg, 85 | }, 86 | InclineGitChanged = { 87 | fg = colors.git_change, 88 | bg = bg, 89 | }, 90 | InclineGitRemoved = { 91 | fg = colors.git_delete, 92 | bg = bg, 93 | }, 94 | 95 | -- LSP status 96 | InclineLsp = { 97 | fg = colors.function_name, 98 | bg = bg, 99 | }, 100 | InclineLspError = { 101 | fg = colors.error, 102 | bg = bg, 103 | }, 104 | InclineLspWarning = { 105 | fg = colors.warning, 106 | bg = bg, 107 | }, 108 | InclineLspInfo = { 109 | fg = colors.info, 110 | bg = bg, 111 | }, 112 | InclineLspHint = { 113 | fg = colors.hint, 114 | bg = bg, 115 | }, 116 | 117 | -- Separator elements 118 | InclineSeparator = { 119 | fg = colors.fg_darker, 120 | bg = bg, 121 | }, 122 | 123 | -- Special states 124 | InclineTerminal = { 125 | fg = colors.terminal_green, 126 | bg = bg, 127 | bold = true, 128 | }, 129 | InclineHelp = { 130 | fg = colors.info, 131 | bg = bg, 132 | }, 133 | InclinePreview = { 134 | fg = colors.function_name, 135 | bg = bg, 136 | italic = true, 137 | }, 138 | } 139 | 140 | -- Apply highlights 141 | for group, opts in pairs(highlights) do 142 | vim.api.nvim_set_hl(0, group, opts) 143 | end 144 | end 145 | 146 | return M 147 | -------------------------------------------------------------------------------- /lua/xcodedark/groups/integrations/lazygit.lua: -------------------------------------------------------------------------------- 1 | local M = {} 2 | 3 | function M.setup(colors) 4 | -- Check if we're in transparent mode 5 | local bg = colors.bg 6 | local bg_light = colors.bg_light 7 | local pmenu_bg = colors.pmenu_bg 8 | 9 | if colors.bg == "NONE" then 10 | bg = "NONE" 11 | bg_light = "NONE" 12 | pmenu_bg = "NONE" 13 | end 14 | 15 | local highlights = { 16 | -- LazyGit floating window background 17 | LazyGitFloat = { 18 | fg = colors.fg, 19 | bg = bg, 20 | }, 21 | LazyGitBorder = { 22 | fg = colors.border, 23 | bg = bg, 24 | }, 25 | 26 | -- Terminal window for lazygit 27 | LazyGitNormal = { 28 | fg = colors.fg, 29 | bg = bg, 30 | }, 31 | 32 | -- Tooltips and popups in lazygit 33 | LazyGitTooltip = { 34 | fg = colors.fg, 35 | bg = bg_light, 36 | }, 37 | LazyGitTooltipBorder = { 38 | fg = colors.border, 39 | bg = bg_light, 40 | }, 41 | 42 | -- Override terminal colors for lazygit to ensure transparency 43 | -- These are applied when lazygit terminal is open 44 | TerminalNormal = { 45 | fg = colors.fg, 46 | bg = bg, 47 | }, 48 | TerminalNormalFloat = { 49 | fg = colors.fg, 50 | bg = bg, 51 | }, 52 | 53 | -- Float title 54 | FloatTitle = { 55 | fg = colors.function_name, 56 | bg = bg, 57 | bold = true, 58 | }, 59 | 60 | -- General floating window improvements 61 | NormalFloat = { 62 | fg = colors.fg, 63 | bg = bg_light, 64 | }, 65 | FloatBorder = { 66 | fg = colors.border, 67 | bg = bg_light, 68 | }, 69 | 70 | -- Popup menu (for any lazygit menus) 71 | Pmenu = { 72 | fg = colors.pmenu_fg, 73 | bg = pmenu_bg, 74 | }, 75 | PmenuSel = { 76 | fg = colors.pmenu_sel_fg, 77 | bg = colors.pmenu_sel_bg, 78 | }, 79 | PmenuBorder = { 80 | fg = colors.border, 81 | bg = pmenu_bg, 82 | }, 83 | 84 | -- Terminal cursor in lazygit 85 | TermCursor = { 86 | fg = colors.bg, 87 | bg = colors.cursor, 88 | }, 89 | TermCursorNC = { 90 | fg = colors.bg, 91 | bg = colors.cursor, 92 | }, 93 | 94 | -- Status line in terminal mode 95 | StatusLineTerm = { 96 | fg = colors.status_fg, 97 | bg = colors.status_bg, 98 | }, 99 | StatusLineTermNC = { 100 | fg = colors.fg_dark, 101 | bg = colors.status_bg, 102 | }, 103 | 104 | -- For toggleterm integration (if using toggleterm for lazygit) 105 | ToggleTermNormal = { 106 | fg = colors.fg, 107 | bg = bg, 108 | }, 109 | ToggleTermNormalFloat = { 110 | fg = colors.fg, 111 | bg = bg, 112 | }, 113 | ToggleTermBorder = { 114 | fg = colors.border, 115 | bg = bg, 116 | }, 117 | 118 | -- For any git-related highlights that might show in terminal 119 | GitSignsAdd = { 120 | fg = colors.git_add, 121 | bg = bg, 122 | }, 123 | GitSignsChange = { 124 | fg = colors.git_change, 125 | bg = bg, 126 | }, 127 | GitSignsDelete = { 128 | fg = colors.git_delete, 129 | bg = bg, 130 | }, 131 | } 132 | 133 | -- Apply highlights 134 | for group, opts in pairs(highlights) do 135 | vim.api.nvim_set_hl(0, group, opts) 136 | end 137 | end 138 | 139 | return M 140 | -------------------------------------------------------------------------------- /lua/xcodedark/groups/integrations/gitsigns.lua: -------------------------------------------------------------------------------- 1 | local M = {} 2 | 3 | function M.setup(colors) 4 | local highlights = { 5 | -- Git signs in the sign column 6 | GitSignsAdd = { fg = colors.git_add, bg = colors.gutter_bg }, 7 | GitSignsChange = { fg = colors.git_change, bg = colors.gutter_bg }, 8 | GitSignsDelete = { fg = colors.git_delete, bg = colors.gutter_bg }, 9 | GitSignsChangedelete = { fg = colors.git_change, bg = colors.gutter_bg }, 10 | GitSignsTopdelete = { fg = colors.git_delete, bg = colors.gutter_bg }, 11 | GitSignsUntracked = { fg = colors.git_ignored, bg = colors.gutter_bg }, 12 | 13 | -- Git signs with line number highlights 14 | GitSignsAddNr = { fg = colors.git_add, bg = colors.gutter_bg }, 15 | GitSignsChangeNr = { fg = colors.git_change, bg = colors.gutter_bg }, 16 | GitSignsDeleteNr = { fg = colors.git_delete, bg = colors.gutter_bg }, 17 | GitSignsChangedeleteNr = { fg = colors.git_change, bg = colors.gutter_bg }, 18 | GitSignsTopdeleteNr = { fg = colors.git_delete, bg = colors.gutter_bg }, 19 | GitSignsUntrackedNr = { fg = colors.git_ignored, bg = colors.gutter_bg }, 20 | 21 | -- Git signs with line highlights (when using line highlighting) 22 | GitSignsAddLn = { bg = colors.diff_add }, 23 | GitSignsChangeLn = { bg = colors.diff_change }, 24 | GitSignsDeleteLn = { bg = colors.diff_delete }, 25 | GitSignsChangedeleteLn = { bg = colors.diff_change }, 26 | GitSignsTopdeleteLn = { bg = colors.diff_delete }, 27 | GitSignsUntrackedLn = { bg = colors.bg_highlight }, 28 | 29 | -- Inline git blame (when using virtual text blame) 30 | GitSignsCurrentLineBlame = { fg = colors.comment, italic = true }, 31 | 32 | -- Word diff highlights (for inline diff) 33 | GitSignsAddInline = { bg = colors.diff_add }, 34 | GitSignsChangeInline = { bg = colors.diff_change }, 35 | GitSignsDeleteInline = { bg = colors.diff_delete }, 36 | 37 | -- Preview window for git hunks 38 | GitSignsAddPreview = { fg = colors.diff_add_fg, bg = colors.diff_add }, 39 | GitSignsDeletePreview = { fg = colors.diff_delete_fg, bg = colors.diff_delete }, 40 | 41 | -- Staged changes (when using staged diff) 42 | GitSignsStagedAdd = { fg = colors.git_add, bg = colors.gutter_bg }, 43 | GitSignsStagedChange = { fg = colors.git_change, bg = colors.gutter_bg }, 44 | GitSignsStagedDelete = { fg = colors.git_delete, bg = colors.gutter_bg }, 45 | GitSignsStagedChangedelete = { fg = colors.git_change, bg = colors.gutter_bg }, 46 | GitSignsStagedTopdelete = { fg = colors.git_delete, bg = colors.gutter_bg }, 47 | 48 | -- Staged changes with line number highlights 49 | GitSignsStagedAddNr = { fg = colors.git_add, bg = colors.gutter_bg }, 50 | GitSignsStagedChangeNr = { fg = colors.git_change, bg = colors.gutter_bg }, 51 | GitSignsStagedDeleteNr = { fg = colors.git_delete, bg = colors.gutter_bg }, 52 | GitSignsStagedChangedeleteNr = { fg = colors.git_change, bg = colors.gutter_bg }, 53 | GitSignsStagedTopdeleteNr = { fg = colors.git_delete, bg = colors.gutter_bg }, 54 | 55 | -- Staged changes with line highlights 56 | GitSignsStagedAddLn = { bg = colors.diff_add }, 57 | GitSignsStagedChangeLn = { bg = colors.diff_change }, 58 | GitSignsStagedDeleteLn = { bg = colors.diff_delete }, 59 | GitSignsStagedChangedeleteLn = { bg = colors.diff_change }, 60 | GitSignsStagedTopdeleteLn = { bg = colors.diff_delete }, 61 | } 62 | 63 | -- Apply highlights - gitsigns highlights work even if gitsigns isn't loaded yet 64 | for group, opts in pairs(highlights) do 65 | vim.api.nvim_set_hl(0, group, opts) 66 | end 67 | end 68 | 69 | return M 70 | -------------------------------------------------------------------------------- /lua/xcodedark/groups/integrations/notify.lua: -------------------------------------------------------------------------------- 1 | local M = {} 2 | 3 | function M.setup(colors) 4 | local highlights = { 5 | -- Notification windows 6 | NotifyBackground = { 7 | fg = colors.fg, 8 | bg = colors.bg_light, 9 | }, 10 | 11 | -- Error notifications 12 | NotifyERRORBorder = { 13 | fg = colors.error, 14 | bg = colors.bg_light, 15 | }, 16 | NotifyERRORIcon = { 17 | fg = colors.error, 18 | bg = colors.bg_light, 19 | }, 20 | NotifyERRORTitle = { 21 | fg = colors.error, 22 | bg = colors.bg_light, 23 | bold = true, 24 | }, 25 | NotifyERRORBody = { 26 | fg = colors.fg, 27 | bg = colors.bg_light, 28 | }, 29 | 30 | -- Warning notifications 31 | NotifyWARNBorder = { 32 | fg = colors.warning, 33 | bg = colors.bg_light, 34 | }, 35 | NotifyWARNIcon = { 36 | fg = colors.warning, 37 | bg = colors.bg_light, 38 | }, 39 | NotifyWARNTitle = { 40 | fg = colors.warning, 41 | bg = colors.bg_light, 42 | bold = true, 43 | }, 44 | NotifyWARNBody = { 45 | fg = colors.fg, 46 | bg = colors.bg_light, 47 | }, 48 | 49 | -- Info notifications 50 | NotifyINFOBorder = { 51 | fg = colors.info, 52 | bg = colors.bg_light, 53 | }, 54 | NotifyINFOIcon = { 55 | fg = colors.info, 56 | bg = colors.bg_light, 57 | }, 58 | NotifyINFOTitle = { 59 | fg = colors.info, 60 | bg = colors.bg_light, 61 | bold = true, 62 | }, 63 | NotifyINFOBody = { 64 | fg = colors.fg, 65 | bg = colors.bg_light, 66 | }, 67 | 68 | -- Debug notifications 69 | NotifyDEBUGBorder = { 70 | fg = colors.hint, 71 | bg = colors.bg_light, 72 | }, 73 | NotifyDEBUGIcon = { 74 | fg = colors.hint, 75 | bg = colors.bg_light, 76 | }, 77 | NotifyDEBUGTitle = { 78 | fg = colors.hint, 79 | bg = colors.bg_light, 80 | bold = true, 81 | }, 82 | NotifyDEBUGBody = { 83 | fg = colors.fg, 84 | bg = colors.bg_light, 85 | }, 86 | 87 | -- Trace notifications 88 | NotifyTRACEBorder = { 89 | fg = colors.fg_dark, 90 | bg = colors.bg_light, 91 | }, 92 | NotifyTRACEIcon = { 93 | fg = colors.fg_dark, 94 | bg = colors.bg_light, 95 | }, 96 | NotifyTRACETitle = { 97 | fg = colors.fg_dark, 98 | bg = colors.bg_light, 99 | bold = true, 100 | }, 101 | NotifyTRACEBody = { 102 | fg = colors.fg, 103 | bg = colors.bg_light, 104 | }, 105 | 106 | -- Success/OK notifications 107 | NotifyOKBorder = { 108 | fg = colors.git_add, 109 | bg = colors.bg_light, 110 | }, 111 | NotifyOKIcon = { 112 | fg = colors.git_add, 113 | bg = colors.bg_light, 114 | }, 115 | NotifyOKTitle = { 116 | fg = colors.git_add, 117 | bg = colors.bg_light, 118 | bold = true, 119 | }, 120 | NotifyOKBody = { 121 | fg = colors.fg, 122 | bg = colors.bg_light, 123 | }, 124 | 125 | -- Log level highlights 126 | NotifyLogTime = { 127 | fg = colors.comment, 128 | bg = colors.bg_light, 129 | italic = true, 130 | }, 131 | NotifyLogTitle = { 132 | fg = colors.function_name, 133 | bg = colors.bg_light, 134 | bold = true, 135 | }, 136 | 137 | -- Progress notifications 138 | NotifyProgressBorder = { 139 | fg = colors.function_name, 140 | bg = colors.bg_light, 141 | }, 142 | NotifyProgressIcon = { 143 | fg = colors.function_name, 144 | bg = colors.bg_light, 145 | }, 146 | NotifyProgressTitle = { 147 | fg = colors.function_name, 148 | bg = colors.bg_light, 149 | bold = true, 150 | }, 151 | NotifyProgressBody = { 152 | fg = colors.fg, 153 | bg = colors.bg_light, 154 | }, 155 | } 156 | 157 | -- Apply highlights 158 | for group, opts in pairs(highlights) do 159 | vim.api.nvim_set_hl(0, group, opts) 160 | end 161 | end 162 | 163 | return M 164 | -------------------------------------------------------------------------------- /lua/xcodedark/groups/integrations/nvim-tree.lua: -------------------------------------------------------------------------------- 1 | local M = {} 2 | 3 | function M.setup(colors) 4 | local highlights = { 5 | -- NvimTree main elements 6 | NvimTreeNormal = { fg = colors.fg, bg = colors.bg_alt }, 7 | NvimTreeNormalNC = { fg = colors.fg, bg = colors.bg_alt }, 8 | NvimTreeEndOfBuffer = { fg = colors.bg_alt, bg = colors.bg_alt }, 9 | NvimTreeWinSeparator = { fg = colors.separator, bg = colors.separator }, 10 | NvimTreeVertSplit = { fg = colors.separator, bg = colors.separator }, 11 | NvimTreeCursorLine = { bg = colors.selection }, 12 | NvimTreeCursorColumn = { bg = colors.selection }, 13 | 14 | -- File and folder icons 15 | NvimTreeSymlink = { fg = colors.info }, 16 | NvimTreeFolderName = { fg = colors.function_name }, 17 | NvimTreeRootFolder = { fg = colors.function_name, bold = true }, 18 | NvimTreeFolderIcon = { fg = colors.function_name }, 19 | NvimTreeEmptyFolderName = { fg = colors.fg_dark }, 20 | NvimTreeOpenedFolderName = { fg = colors.function_name, bold = true }, 21 | NvimTreeExecFile = { fg = colors.git_add, bold = true }, 22 | NvimTreeOpenedFile = { fg = colors.fg, bold = true }, 23 | NvimTreeSpecialFile = { fg = colors.attribute, underline = true }, 24 | NvimTreeImageFile = { fg = colors.string }, 25 | NvimTreeMarkdownFile = { fg = colors.info }, 26 | 27 | -- File status (git integration) 28 | NvimTreeGitDirty = { fg = colors.git_change }, 29 | NvimTreeGitStaged = { fg = colors.git_add }, 30 | NvimTreeGitMerge = { fg = colors.warning }, 31 | NvimTreeGitRenamed = { fg = colors.git_change }, 32 | NvimTreeGitNew = { fg = colors.git_add }, 33 | NvimTreeGitDeleted = { fg = colors.git_delete }, 34 | NvimTreeGitIgnored = { fg = colors.git_ignored }, 35 | 36 | -- Indent and guides 37 | NvimTreeIndentMarker = { fg = colors.fg_darker }, 38 | NvimTreeLiveFilterPrefix = { fg = colors.search_fg, bold = true }, 39 | NvimTreeLiveFilterValue = { fg = colors.search_fg, bold = true }, 40 | 41 | -- Window picker 42 | NvimTreeWindowPicker = { fg = colors.bg, bg = colors.function_name, bold = true }, 43 | 44 | -- File permissions and file info 45 | NvimTreeFileIcon = { fg = colors.fg }, 46 | NvimTreeFileDirty = { fg = colors.git_change }, 47 | NvimTreeFileStaged = { fg = colors.git_add }, 48 | NvimTreeFileMerge = { fg = colors.warning }, 49 | NvimTreeFileRenamed = { fg = colors.git_change }, 50 | NvimTreeFileNew = { fg = colors.git_add }, 51 | NvimTreeFileDeleted = { fg = colors.git_delete }, 52 | NvimTreeFileIgnored = { fg = colors.git_ignored }, 53 | 54 | -- Bookmarks 55 | NvimTreeBookmark = { fg = colors.attribute }, 56 | 57 | -- LSP diagnostics in tree 58 | NvimTreeLspDiagnosticsError = { fg = colors.error }, 59 | NvimTreeLspDiagnosticsWarning = { fg = colors.warning }, 60 | NvimTreeLspDiagnosticsInformation = { fg = colors.info }, 61 | NvimTreeLspDiagnosticsHint = { fg = colors.hint }, 62 | 63 | -- Modern nvim-tree diagnostic highlights 64 | NvimTreeDiagnosticErrorIcon = { fg = colors.error }, 65 | NvimTreeDiagnosticWarnIcon = { fg = colors.warning }, 66 | NvimTreeDiagnosticInfoIcon = { fg = colors.info }, 67 | NvimTreeDiagnosticHintIcon = { fg = colors.hint }, 68 | 69 | -- Copy/cut indicators 70 | NvimTreeCopiedHL = { fg = colors.git_add, bold = true }, 71 | NvimTreeCutHL = { fg = colors.git_delete, bold = true }, 72 | 73 | -- Modified file indicators 74 | NvimTreeModifiedIcon = { fg = colors.git_change }, 75 | NvimTreeModifiedFile = { fg = colors.git_change }, 76 | 77 | -- Hidden files 78 | NvimTreeHiddenDisplay = { fg = colors.fg_dark, italic = true }, 79 | 80 | -- Popup menu (for rename, etc.) 81 | NvimTreePopup = { fg = colors.pmenu_fg, bg = colors.pmenu_bg }, 82 | 83 | -- Folder arrow/chevron icons 84 | NvimTreeOpenedFolderIcon = { fg = colors.function_name }, 85 | NvimTreeClosedFolderIcon = { fg = colors.function_name }, 86 | 87 | -- File type specific icons (if using nvim-web-devicons) 88 | NvimTreeFileIconDefault = { fg = colors.fg }, 89 | } 90 | 91 | -- Apply highlights - nvim-tree highlights work even if nvim-tree isn't loaded yet 92 | for group, opts in pairs(highlights) do 93 | vim.api.nvim_set_hl(0, group, opts) 94 | end 95 | end 96 | 97 | return M 98 | -------------------------------------------------------------------------------- /lua/xcodedark/groups/integrations/telescope.lua: -------------------------------------------------------------------------------- 1 | local M = {} 2 | 3 | function M.setup(colors) 4 | local highlights = { 5 | -- Telescope main window (enhanced with Xcode-style colors) 6 | TelescopeNormal = { fg = colors.fg, bg = colors.bg_light }, 7 | TelescopeBorder = { fg = colors.function_name, bg = colors.bg_light }, -- Use green border like Xcode 8 | TelescopeTitle = { fg = colors.keyword, bg = colors.bg_light, bold = true }, -- Pink title for pop 9 | 10 | -- Telescope prompt (more vibrant) 11 | TelescopePromptNormal = { fg = colors.fg, bg = colors.bg_dark }, 12 | TelescopePromptBorder = { fg = colors.type, bg = colors.bg_dark }, -- Light blue border 13 | TelescopePromptTitle = { fg = colors.string, bg = colors.bg_dark, bold = true }, -- Coral title 14 | TelescopePromptPrefix = { fg = colors.keyword, bg = colors.bg_dark, bold = true }, -- Pink prefix 15 | TelescopePromptCounter = { fg = colors.number, bg = colors.bg_dark }, -- Yellow counter 16 | 17 | -- Telescope results (enhanced styling) 18 | TelescopeResultsNormal = { fg = colors.fg, bg = colors.bg_light }, 19 | TelescopeResultsBorder = { fg = colors.constant, bg = colors.bg_light }, -- Cyan border 20 | TelescopeResultsTitle = { fg = colors.purple, bg = colors.bg_light, bold = true }, -- Purple title 21 | TelescopeResultsComment = { fg = colors.comment }, 22 | TelescopeResultsSpecialComment = { fg = colors.comment, italic = true }, 23 | TelescopeResultsLineNr = { fg = colors.line_number }, 24 | TelescopeResultsIdentifier = { fg = colors.variable }, 25 | TelescopeResultsFunction = { fg = colors.function_name }, 26 | TelescopeResultsVariable = { fg = colors.variable }, 27 | TelescopeResultsConstant = { fg = colors.constant }, 28 | TelescopeResultsField = { fg = colors.property }, 29 | TelescopeResultsOperator = { fg = colors.operator }, 30 | TelescopeResultsNumber = { fg = colors.number }, 31 | TelescopeResultsString = { fg = colors.string }, 32 | TelescopeResultsBoolean = { fg = colors.boolean }, 33 | TelescopeResultsClass = { fg = colors.type }, 34 | TelescopeResultsMethod = { fg = colors.function_name }, 35 | TelescopeResultsStruct = { fg = colors.type }, 36 | 37 | -- Telescope preview (vibrant borders) 38 | TelescopePreviewNormal = { fg = colors.fg, bg = colors.bg }, 39 | TelescopePreviewBorder = { fg = colors.attribute, bg = colors.bg }, -- Orange border for preview 40 | TelescopePreviewTitle = { fg = colors.number, bg = colors.bg, bold = true }, -- Yellow title 41 | TelescopePreviewLine = { bg = colors.cursor_line }, 42 | TelescopePreviewMatch = { fg = colors.search_fg, bg = colors.search }, 43 | TelescopePreviewPipe = { fg = colors.operator }, 44 | TelescopePreviewCharDev = { fg = colors.warning }, 45 | TelescopePreviewDirectory = { fg = colors.function_name }, 46 | TelescopePreviewBlock = { fg = colors.warning }, 47 | TelescopePreviewLink = { fg = colors.info }, 48 | TelescopePreviewSocket = { fg = colors.error }, 49 | TelescopePreviewRead = { fg = colors.git_add }, 50 | TelescopePreviewWrite = { fg = colors.git_change }, 51 | TelescopePreviewExecute = { fg = colors.git_delete }, 52 | TelescopePreviewHyphen = { fg = colors.fg_dark }, 53 | TelescopePreviewSticky = { fg = colors.attribute }, 54 | TelescopePreviewSize = { fg = colors.number }, 55 | TelescopePreviewUser = { fg = colors.type }, 56 | TelescopePreviewGroup = { fg = colors.type }, 57 | TelescopePreviewDate = { fg = colors.comment }, 58 | 59 | -- Telescope selection and matching (enhanced visibility) 60 | TelescopeSelection = { fg = colors.fg, bg = colors.selection, bold = true }, 61 | TelescopeSelectionCaret = { fg = colors.keyword, bg = colors.selection, bold = true }, -- Pink caret 62 | TelescopeMultiSelection = { fg = colors.fg, bg = colors.selection }, 63 | TelescopeMultiIcon = { fg = colors.string, bold = true }, -- Coral multi-select icon 64 | TelescopeMatching = { fg = colors.number, bg = colors.search, bold = true }, -- Yellow matching with background 65 | 66 | -- Telescope file browser specific 67 | TelescopePathSeparator = { fg = colors.fg_dark }, 68 | 69 | -- Telescope git specific 70 | TelescopeResultsDiffAdd = { fg = colors.git_add }, 71 | TelescopeResultsDiffChange = { fg = colors.git_change }, 72 | TelescopeResultsDiffDelete = { fg = colors.git_delete }, 73 | TelescopeResultsDiffUntracked = { fg = colors.git_ignored }, 74 | 75 | -- Additional telescope elements (these are already defined above, removing duplicates) 76 | } 77 | 78 | -- Apply highlights - telescope highlights work even if telescope isn't loaded yet 79 | for group, opts in pairs(highlights) do 80 | vim.api.nvim_set_hl(0, group, opts) 81 | end 82 | end 83 | 84 | return M 85 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Xcodedark Theme for Neovim 2 | 3 | A neovim theme that mimics xcodedark from xcode16. I was inspired by xcode theme as I thought it was super clean in my iOS development course in university, so I decided to make a version that is kind of accurate for my main languages (Go, Typescript, and hopefully Java soon). 4 | 5 | > **NOTE:** This theme works best in transparent mode as shown in the screenshots. For the best autocomplete experience with properly styled transparent menus, we highly recommend using [blink.cmp](https://github.com/saghen/blink.cmp) - the theme includes built-in integration that provides beautiful completion menus matching the Xcode aesthetic! 6 | 7 | ## Language Previews 8 | ### Go 9 | go 10 | 11 | ### Elixir 12 | elixir 13 | 14 | ### Typescript/React 15 | typescript 16 | 17 | ### Java 18 | java 19 | 20 | ## Installation 21 | 22 | ### LazyVim 23 | 24 | ```lua 25 | { 26 | "V4N1LLA-1CE/xcodedark.nvim", 27 | lazy = false, 28 | priority = 1000, 29 | config = function() 30 | require("xcodedark").setup({ 31 | -- New color scheme with your specifications 32 | transparent = true, -- or false if you prefer solid background 33 | 34 | integrations = { 35 | telescope = true, 36 | nvim_tree = true, 37 | gitsigns = true, 38 | bufferline = true, 39 | incline = true, 40 | lazygit = true, 41 | which_key = true, 42 | notify = true, 43 | snacks = true, 44 | blink = true, -- blink.cmp completion menu 45 | }, 46 | 47 | -- Font weight customization 48 | styles = { 49 | comments = { italic = true }, 50 | keywords = { bold = true }, 51 | functions = {}, 52 | variables = {}, 53 | strings = {}, 54 | booleans = { bold = true }, 55 | types = {}, 56 | constants = {}, 57 | operators = {}, 58 | punctuation = {}, 59 | }, 60 | 61 | terminal_colors = true, 62 | }) 63 | vim.cmd.colorscheme("xcodedark") 64 | end, 65 | } 66 | ``` 67 | 68 | ### Packer.nvim 69 | 70 | ```lua 71 | use { 72 | "V4N1LLA-1CE/xcodedark.nvim", 73 | config = function() 74 | require("xcodedark").setup({ 75 | transparent = true, 76 | styles = { 77 | keywords = { bold = true }, -- Bold keywords by default 78 | comments = { italic = true }, -- Italic comments, normal weight 79 | } 80 | }) 81 | vim.cmd.colorscheme("xcodedark") 82 | end 83 | } 84 | ``` 85 | 86 | 87 | ## Configuration 88 | 89 | ### Default Options 90 | 91 | ```lua 92 | require("xcodedark").setup({ 93 | -- Plugin integrations 94 | integrations = { 95 | telescope = true, -- Telescope fuzzy finder 96 | nvim_tree = true, -- File explorer 97 | gitsigns = true, -- Git signs in gutter 98 | bufferline = true, -- Buffer/tab line 99 | incline = true, -- Floating filename 100 | lazygit = true, -- LazyGit integration 101 | which_key = true, -- Which-key popup 102 | notify = true, -- Notification popups 103 | snacks = true, -- Snacks.nvim picker 104 | blink = true, -- blink.cmp completion menu 105 | }, 106 | 107 | -- Style customization 108 | styles = { 109 | comments = { italic = true }, 110 | keywords = {}, 111 | functions = {}, 112 | variables = {}, 113 | strings = {}, 114 | }, 115 | 116 | -- Additional options 117 | terminal_colors = true, -- Set terminal colors 118 | transparent = false, -- Transparent background 119 | }) 120 | ``` 121 | 122 | ### Transparent Background 123 | 124 | For a transparent background that works with terminal transparency: 125 | 126 | ```lua 127 | require("xcodedark").setup({ 128 | transparent = true, 129 | }) 130 | ``` 131 | 132 | ### blink.cmp Integration 133 | 134 | The theme includes built-in styling for [blink.cmp](https://github.com/saghen/blink.cmp). For configuration examples, see [`blink-completion.lua`](https://github.com/V4N1LLA-1CE/dotfiles/tree/main/nvim) in my dotfiles. 135 | 136 | ## Contributing 137 | 138 | Contributions are welcome! Please feel free to submit issues and pull requests. 139 | 140 | When reporting issues, please include: 141 | - Plugin manager and configuration 142 | - Screenshots if applicable 143 | - Minimal reproduction steps 144 | 145 | ## Acknowledgments 146 | 147 | Inspired by Xcode 16's Default Dark theme. Created during iOS development coursework when I fell in love with Xcode's clean syntax highlighting. 148 | 149 | *for developers who appreciate clean, consistent code highlighting* 150 | 151 | -------------------------------------------------------------------------------- /lua/xcodedark/groups/integrations/lsp.lua: -------------------------------------------------------------------------------- 1 | local M = {} 2 | 3 | function M.setup(colors) 4 | local highlights = { 5 | -- LSP semantic tokens 6 | ["@lsp.type.class"] = { fg = colors.type }, 7 | ["@lsp.type.decorator"] = { fg = colors.attribute }, 8 | ["@lsp.type.enum"] = { fg = colors.type }, 9 | ["@lsp.type.enumMember"] = { fg = colors.constant }, 10 | ["@lsp.type.function"] = { fg = colors.function_name }, 11 | ["@lsp.type.interface"] = { fg = colors.type }, 12 | ["@lsp.type.macro"] = { fg = colors.function_name }, 13 | ["@lsp.type.method"] = { fg = colors.function_name }, 14 | ["@lsp.type.namespace"] = { fg = colors.type }, 15 | ["@lsp.type.parameter"] = { fg = colors.parameter }, 16 | ["@lsp.type.property"] = { fg = colors.property }, 17 | ["@lsp.type.struct"] = { fg = colors.type }, 18 | ["@lsp.type.type"] = { fg = colors.type }, 19 | ["@lsp.type.typeParameter"] = { fg = colors.type }, 20 | ["@lsp.type.variable"] = { fg = colors.variable }, 21 | 22 | -- LSP semantic token modifiers 23 | ["@lsp.mod.readonly"] = { fg = colors.constant }, 24 | ["@lsp.mod.static"] = { fg = colors.constant }, 25 | ["@lsp.mod.deprecated"] = { fg = colors.fg_dark, strikethrough = true }, 26 | ["@lsp.mod.abstract"] = { italic = true }, 27 | ["@lsp.mod.async"] = { italic = true }, 28 | ["@lsp.mod.modification"] = { underline = true }, 29 | ["@lsp.mod.documentation"] = { fg = colors.comment }, 30 | ["@lsp.mod.defaultLibrary"] = { fg = colors.type }, 31 | 32 | -- Python specific LSP highlights 33 | ["@lsp.type.function.python"] = { fg = colors.function_name }, 34 | ["@lsp.type.method.python"] = { fg = colors.function_name }, 35 | ["@lsp.type.property.python"] = { fg = colors.property }, 36 | ["@lsp.type.variable.python"] = { fg = colors.variable }, 37 | ["@lsp.type.parameter.python"] = { fg = colors.parameter }, 38 | ["@lsp.type.class.python"] = { fg = colors.type }, 39 | ["@lsp.type.decorator.python"] = { fg = colors.attribute }, 40 | ["@lsp.type.selfParameter.python"] = { fg = colors.keyword }, 41 | ["@lsp.type.clsParameter.python"] = { fg = colors.keyword }, 42 | 43 | -- JavaScript/TypeScript specific LSP highlights 44 | ["@lsp.type.function.javascript"] = { fg = colors.function_name }, 45 | ["@lsp.type.function.typescript"] = { fg = colors.function_name }, 46 | ["@lsp.type.method.javascript"] = { fg = colors.function_name }, 47 | ["@lsp.type.method.typescript"] = { fg = colors.function_name }, 48 | ["@lsp.type.property.javascript"] = { fg = colors.property }, 49 | ["@lsp.type.property.typescript"] = { fg = colors.property }, 50 | ["@lsp.type.variable.javascript"] = { fg = colors.variable }, 51 | ["@lsp.type.variable.typescript"] = { fg = colors.variable }, 52 | ["@lsp.type.parameter.javascript"] = { fg = colors.parameter }, 53 | ["@lsp.type.parameter.typescript"] = { fg = colors.parameter }, 54 | ["@lsp.type.class.javascript"] = { fg = colors.type }, 55 | ["@lsp.type.class.typescript"] = { fg = colors.type }, 56 | ["@lsp.type.interface.typescript"] = { fg = colors.type }, 57 | ["@lsp.type.enum.typescript"] = { fg = colors.type }, 58 | ["@lsp.type.enumMember.typescript"] = { fg = colors.constant }, 59 | ["@lsp.type.namespace.typescript"] = { fg = colors.type }, 60 | ["@lsp.type.typeParameter.typescript"] = { fg = colors.type }, 61 | 62 | -- Go specific LSP highlights 63 | ["@lsp.type.function.go"] = { fg = colors.function_name }, 64 | ["@lsp.type.method.go"] = { fg = colors.function_name }, 65 | ["@lsp.type.property.go"] = { fg = colors.property }, 66 | ["@lsp.type.variable.go"] = { fg = colors.variable }, 67 | ["@lsp.type.parameter.go"] = { fg = colors.parameter }, 68 | ["@lsp.type.struct.go"] = { fg = colors.type }, 69 | ["@lsp.type.interface.go"] = { fg = colors.type }, 70 | ["@lsp.type.typeAlias.go"] = { fg = colors.type }, 71 | 72 | -- Lua specific LSP highlights 73 | ["@lsp.type.function.lua"] = { fg = colors.function_name }, 74 | ["@lsp.type.method.lua"] = { fg = colors.function_name }, 75 | ["@lsp.type.property.lua"] = { fg = colors.property }, 76 | ["@lsp.type.variable.lua"] = { fg = colors.variable }, 77 | ["@lsp.type.parameter.lua"] = { fg = colors.parameter }, 78 | 79 | -- LSP references and definitions 80 | LspReferenceText = { bg = colors.bg_highlight }, 81 | LspReferenceRead = { bg = colors.bg_highlight }, 82 | LspReferenceWrite = { bg = colors.bg_highlight, underline = true }, 83 | 84 | -- LSP code lens 85 | LspCodeLens = { fg = colors.fg_dark, italic = true }, 86 | LspCodeLensSeparator = { fg = colors.fg_darker }, 87 | 88 | -- LSP signature help 89 | LspSignatureActiveParameter = { fg = colors.parameter, bold = true }, 90 | 91 | -- LSP inlay hints 92 | LspInlayHint = { fg = colors.fg_darker, italic = true }, 93 | 94 | -- LSP progress 95 | LspProgressSpinner = { fg = colors.info }, 96 | LspProgressTitle = { fg = colors.fg }, 97 | LspProgressMessage = { fg = colors.fg_alt }, 98 | LspProgressPercentage = { fg = colors.fg_dark }, 99 | 100 | -- Document highlights 101 | DocumentHighlight = { bg = colors.bg_highlight }, 102 | DocumentHighlightText = { bg = colors.bg_highlight }, 103 | DocumentHighlightRead = { bg = colors.bg_highlight }, 104 | DocumentHighlightWrite = { bg = colors.bg_highlight, underline = true }, 105 | } 106 | 107 | -- Apply highlights 108 | for group, opts in pairs(highlights) do 109 | vim.api.nvim_set_hl(0, group, opts) 110 | end 111 | end 112 | 113 | return M 114 | -------------------------------------------------------------------------------- /lua/xcodedark/groups/integrations/snacks.lua: -------------------------------------------------------------------------------- 1 | local colors = require("xcodedark.colors") 2 | 3 | local M = {} 4 | 5 | M.setup = function() 6 | return { 7 | -- Main picker UI elements 8 | SnacksPickerFile = { fg = colors.fg, bg = "NONE" }, 9 | SnacksPickerDir = { fg = colors.type, bold = true }, -- Bright blue for directories 10 | SnacksPickerPath = { fg = colors.fg_dark }, 11 | SnacksPickerPathHidden = { fg = colors.comment, italic = true }, 12 | SnacksPickerPathIgnored = { fg = colors.comment, italic = true }, 13 | 14 | -- Picker UI elements 15 | SnacksPickerPrompt = { fg = colors.keyword, bold = true }, -- Pink prompt 16 | SnacksPickerMatch = { fg = colors.search_fg, bg = colors.search, bold = true }, -- Yellow matches 17 | SnacksPickerBorder = { fg = colors.border }, 18 | SnacksPickerList = { fg = colors.fg, bg = colors.bg_light }, 19 | SnacksPickerListCursorLine = { bg = colors.bg_highlight }, 20 | SnacksPickerTitle = { fg = colors.function_name, bold = true }, -- Green title 21 | SnacksPickerPreview = { fg = colors.fg }, 22 | SnacksPickerPreviewBorder = { fg = colors.border }, 23 | 24 | -- Git status highlights (vibrant colors) 25 | SnacksPickerGitStatusStaged = { fg = colors.git_add, bold = true }, 26 | SnacksPickerGitStatusAdded = { fg = colors.git_add, bold = true }, 27 | SnacksPickerGitStatusDeleted = { fg = colors.git_delete, bold = true }, 28 | SnacksPickerGitStatusIgnored = { fg = colors.git_ignored, italic = true }, 29 | SnacksPickerGitStatusModified = { fg = colors.git_change, bold = true }, 30 | SnacksPickerGitStatusRenamed = { fg = colors.purple, bold = true }, 31 | SnacksPickerGitStatusUnmerged = { fg = colors.error, bold = true }, 32 | SnacksPickerGitStatusUntracked = { fg = colors.constant, bold = true }, -- Light blue for untracked 33 | 34 | -- Diagnostic highlights 35 | SnacksPickerDiagnosticError = { fg = colors.error, bold = true }, 36 | SnacksPickerDiagnosticWarn = { fg = colors.warning, bold = true }, 37 | SnacksPickerDiagnosticHint = { fg = colors.hint, bold = true }, 38 | SnacksPickerDiagnosticInfo = { fg = colors.info, bold = true }, 39 | 40 | -- LSP status highlights 41 | SnacksPickerLspUnavailable = { fg = colors.fg_darker, italic = true }, 42 | SnacksPickerLspEnabled = { fg = colors.git_add, bold = true }, 43 | SnacksPickerLspDisabled = { fg = colors.error, italic = true }, 44 | SnacksPickerLspAttached = { fg = colors.function_name, bold = true }, 45 | 46 | -- File type and symbol highlights (using vibrant xcode colors) 47 | SnacksPickerIconArray = { fg = colors.constant }, -- Light blue 48 | SnacksPickerIconBoolean = { fg = colors.boolean }, -- Pink 49 | SnacksPickerIconClass = { fg = colors.type }, -- Light blue 50 | SnacksPickerIconConstant = { fg = colors.constant }, -- Light blue 51 | SnacksPickerIconConstructor = { fg = colors.function_name }, -- Green 52 | SnacksPickerIconEnum = { fg = colors.type }, -- Light blue 53 | SnacksPickerIconEnumMember = { fg = colors.constant }, -- Light blue 54 | SnacksPickerIconEvent = { fg = colors.attribute }, -- Orange 55 | SnacksPickerIconField = { fg = colors.property }, -- Green 56 | SnacksPickerIconFile = { fg = colors.fg }, 57 | SnacksPickerIconFolder = { fg = colors.type, bold = true }, -- Bright blue 58 | SnacksPickerIconFunction = { fg = colors.function_name }, -- Green 59 | SnacksPickerIconInterface = { fg = colors.type }, -- Light blue 60 | SnacksPickerIconKeyword = { fg = colors.keyword }, -- Pink 61 | SnacksPickerIconMethod = { fg = colors.function_name }, -- Green 62 | SnacksPickerIconModule = { fg = colors.preprocessor }, -- Pink 63 | SnacksPickerIconNamespace = { fg = colors.type }, -- Light blue 64 | SnacksPickerIconNull = { fg = colors.keyword }, -- Pink 65 | SnacksPickerIconNumber = { fg = colors.number }, -- Yellow 66 | SnacksPickerIconObject = { fg = colors.type }, -- Light blue 67 | SnacksPickerIconOperator = { fg = colors.operator }, -- White 68 | SnacksPickerIconPackage = { fg = colors.preprocessor }, -- Pink 69 | SnacksPickerIconProperty = { fg = colors.property }, -- Green 70 | SnacksPickerIconString = { fg = colors.string }, -- Coral red 71 | SnacksPickerIconStruct = { fg = colors.type }, -- Light blue 72 | SnacksPickerIconTypeParameter = { fg = colors.parameter }, -- Purple 73 | SnacksPickerIconVariable = { fg = colors.variable }, -- Green 74 | 75 | -- Additional vibrant highlights 76 | SnacksPickerCount = { fg = colors.number, italic = true }, -- Yellow count 77 | SnacksPickerEmpty = { fg = colors.comment, italic = true }, 78 | SnacksPickerHelp = { fg = colors.hint, italic = true }, 79 | SnacksPickerIcon = { fg = colors.function_name }, -- Default icon color 80 | SnacksPickerInfo = { fg = colors.info }, 81 | SnacksPickerInput = { fg = colors.fg, bg = colors.bg_light }, 82 | SnacksPickerInputBorder = { fg = colors.keyword }, -- Pink border for input 83 | SnacksPickerInputPrompt = { fg = colors.keyword, bold = true }, -- Pink prompt 84 | SnacksPickerLine = { fg = colors.fg }, 85 | SnacksPickerSelect = { fg = colors.selection, bold = true }, 86 | SnacksPickerStatus = { fg = colors.status_fg, bg = colors.status_bg }, 87 | SnacksPickerText = { fg = colors.fg }, 88 | 89 | -- Special vibrant accents 90 | SnacksPickerHighlight = { fg = colors.search_fg, bg = colors.search, bold = true }, 91 | SnacksPickerSelection = { bg = colors.visual, fg = colors.fg }, 92 | SnacksPickerCursor = { fg = colors.cursor, bold = true }, 93 | SnacksPickerVisual = { bg = colors.visual }, 94 | } 95 | end 96 | 97 | return M -------------------------------------------------------------------------------- /lua/xcodedark/colors.lua: -------------------------------------------------------------------------------- 1 | local colors = { 2 | -- Base colors (Updated with your specifications) 3 | bg = "#292a31", -- New background color 4 | bg_alt = "#2D2D30", -- Sidebar and secondary backgrounds 5 | bg_dark = "#171717", -- Darker variant (debugging panels, etc.) 6 | bg_light = "#252526", -- Lighter background (popups, floating windows) 7 | bg_highlight = "#2D2D30", -- Line highlight background 8 | 9 | fg = "#FFFFFF", -- Primary text (variables, identifiers) 10 | fg_alt = "#D4D4D4", -- Secondary text 11 | fg_dark = "#9D9D9D", -- Tertiary text 12 | fg_darker = "#6C7986", -- Comments and dimmed text 13 | 14 | -- Xcode 16 Syntax Colors (Default Dark Theme) - More accurate 15 | keyword = "#FF7AB2", -- Keywords (var, let, if, class, func) - Pink 16 | string = "#FF8170", -- String literals - Coral red 17 | comment = "#6C7986", -- Comments - Muted gray 18 | number = "#D9C97C", -- Numbers and numeric literals - Warm yellow 19 | boolean = "#FF7AB2", -- Booleans (true, false) - Same as keywords 20 | function_name = "#67B7A4", -- Function names and calls - Green (more accurate) 21 | variable = "#67B7A4", -- Variables and identifiers - Green (not white) 22 | constant = "#4EB0CC", -- Constants - Light blue (not yellow) 23 | type = "#6BDFFF", -- Types and classes - Light blue 24 | property = "#67B7A4", -- Object properties - Green 25 | parameter = "#D2A8FF", -- Function parameters - Lighter, easier on the eyes purple 26 | 27 | -- Additional purple for specific contexts 28 | purple = "#D2A8FF", -- Xcode-style lighter purple for parameters/argument types 29 | 30 | -- Language-specific elements 31 | preprocessor = "#FF7AB2", -- Preprocessor directives, imports - Pink like keywords 32 | attribute = "#FD8F3F", -- Attributes and decorators - Orange 33 | operator = "#FFFFFF", -- Operators (+, -, =, etc.) - White 34 | punctuation = "#FFFFFF", -- Punctuation marks - White 35 | 36 | -- Swift/Objective-C specific 37 | swift_attribute = "#FD8F3F", -- @objc, @available, etc. 38 | objc_directive = "#FF7AB2", -- #pragma, #import - Pink like keywords 39 | 40 | -- UI Elements (Updated) 41 | cursor = "#ff5257", -- New cursor color (red) 42 | cursor_visual = "#8cd0e3", -- Cursor colour for visual mode (light blue) 43 | cursor_line = "#2D2D30", -- Current line highlight 44 | selection = "#FF7AB2", -- New selection background color (matches keyword) 45 | visual = "#636f83", -- Visual selection background (keep original for text selection) 46 | visualmode_highlight_bg = "#636f83", -- Visual mode text selection background 47 | search = "#613315", -- Search match background 48 | search_fg = "#FFCC02", -- Search match text 49 | 50 | -- Gutter and line numbers 51 | line_number = "#858585", -- Line numbers 52 | gutter_bg = "#292a31", -- Updated gutter background to match new bg 53 | 54 | -- Borders and UI chrome 55 | border = "#3E3E42", -- Window borders and separators 56 | separator = "#2D2D30", -- Split window separators 57 | 58 | -- Status bar and tabs 59 | status_bg = "#2D2D30", -- Status line background 60 | status_fg = "#CCCCCC", -- Status line text 61 | tab_active_bg = "#292a31", -- Updated active tab background 62 | tab_active_fg = "#FFFFFF", -- Active tab text 63 | tab_inactive_bg = "#2D2D30", -- Inactive tab background 64 | tab_inactive_fg = "#969696", -- Inactive tab text 65 | 66 | -- Diagnostic colors (matching Xcode 16 issue navigator) 67 | error = "#F14C4C", -- Error messages - Red 68 | warning = "#F1C232", -- Warning messages - Yellow 69 | info = "#0099FF", -- Info messages - Blue 70 | hint = "#4EB0CC", -- Hint messages - Cyan 71 | 72 | -- Git version control colors 73 | git_add = "#67B7A4", -- Added/new lines - Green 74 | git_change = "#F1C232", -- Modified lines - Yellow 75 | git_delete = "#F14C4C", -- Deleted lines - Red 76 | git_ignored = "#6C7986", -- Ignored files - Gray 77 | 78 | -- Diff colors 79 | diff_add = "#263E1C", -- Diff addition background 80 | diff_add_fg = "#67B7A4", -- Diff addition text 81 | diff_delete = "#3E1F1C", -- Diff deletion background 82 | diff_delete_fg = "#F14C4C", -- Diff deletion text 83 | diff_change = "#3E3B1C", -- Diff change background 84 | diff_change_fg = "#F1C232", -- Diff change text 85 | 86 | -- Special comment types 87 | todo = "#F1C232", -- TODO comments - Yellow 88 | fixme = "#F14C4C", -- FIXME comments - Red 89 | note = "#0099FF", -- NOTE comments - Blue 90 | 91 | -- Completion and popup menus (enhanced for better visibility) 92 | pmenu_bg = "#454167", -- Popup menu background (darker for better contrast) 93 | pmenu_fg = "#CCCCCC", -- Popup menu text 94 | pmenu_sel_bg = "#FF7AB2", -- Selected popup item background (brighter blue) "#E91E63" 95 | pmenu_sel_fg = "#FFFFFF", -- Selected popup item text 96 | pmenu_scrollbar = "#3E3E42", -- Popup menu scrollbar (lighter for visibility) 97 | 98 | -- Additional UI elements 99 | scrollbar_thumb = "#686868", -- Scrollbar thumb 100 | 101 | -- Code folding 102 | fold_bg = "#2D2D30", -- Folded code background 103 | fold_fg = "#969696", -- Folded code text 104 | 105 | -- Matching elements 106 | match_paren = "#0099FF", -- Matching parentheses/brackets 107 | 108 | -- Search incremental 109 | inc_search = "#094771", -- Incremental search background 110 | 111 | -- Spell checking 112 | spell_bad = "#F14C4C", -- Misspelled words 113 | spell_cap = "#F1C232", -- Capitalization errors 114 | spell_rare = "#0099FF", -- Rare words 115 | spell_local = "#67B7A4", -- Regional spelling 116 | 117 | -- Debug and breakpoints 118 | debug_breakpoint = "#E51400", -- Breakpoint indicator 119 | debug_current_line = "#2D5016", -- Current debug line 120 | 121 | -- Terminal colors (matching Xcode's integrated terminal) 122 | terminal_black = "#292a31", -- Updated to match new background 123 | terminal_red = "#F14C4C", 124 | terminal_green = "#67B7A4", 125 | terminal_yellow = "#F1C232", 126 | terminal_blue = "#6BDFFF", 127 | terminal_magenta = "#FF7AB2", 128 | terminal_cyan = "#4EB0CC", 129 | terminal_white = "#FFFFFF", 130 | 131 | -- Bright terminal colors 132 | terminal_bright_black = "#6C7986", 133 | terminal_bright_red = "#FF6B6B", 134 | terminal_bright_green = "#5AC8FA", 135 | terminal_bright_yellow = "#FFD60A", 136 | terminal_bright_blue = "#007AFF", 137 | terminal_bright_magenta = "#AF52DE", 138 | terminal_bright_cyan = "#40E0D0", 139 | terminal_bright_white = "#FFFFFF", 140 | } 141 | 142 | return colors 143 | -------------------------------------------------------------------------------- /lua/xcodedark/groups/syntax.lua: -------------------------------------------------------------------------------- 1 | local M = {} 2 | 3 | function M.setup(colors) 4 | local highlights = { 5 | -- Comments (keep normal weight for comments) 6 | Comment = { fg = colors.comment, italic = true }, 7 | 8 | -- Constants 9 | Constant = { fg = colors.constant }, -- Light blue like Xcode 10 | String = { fg = colors.string }, 11 | Character = { fg = colors.string }, 12 | Number = { fg = colors.number }, 13 | Boolean = { fg = colors.boolean, bold = true }, -- Bold for booleans 14 | Float = { fg = colors.number }, 15 | 16 | -- Identifiers (reduce green usage) 17 | Identifier = { fg = colors.fg }, -- Most identifiers should be white 18 | Function = { fg = colors.type }, -- Function names bluish like types 19 | 20 | -- Statements (keywords bold) 21 | Statement = { fg = colors.keyword, bold = true }, 22 | Conditional = { fg = colors.keyword, bold = true }, 23 | Repeat = { fg = colors.keyword, bold = true }, 24 | Label = { fg = colors.keyword, bold = true }, 25 | Operator = { fg = colors.operator }, 26 | Keyword = { fg = colors.keyword, bold = true }, 27 | Exception = { fg = colors.keyword, bold = true }, 28 | 29 | -- PreProcessor (keywords bold) 30 | PreProc = { fg = colors.preprocessor, bold = true }, -- Pink like keywords/imports 31 | Include = { fg = colors.preprocessor, bold = true }, -- Pink for imports 32 | Define = { fg = colors.preprocessor, bold = true }, -- Pink 33 | Macro = { fg = colors.preprocessor, bold = true }, -- Pink 34 | PreCondit = { fg = colors.preprocessor, bold = true }, -- Pink 35 | 36 | -- Types 37 | Type = { fg = colors.type }, 38 | StorageClass = { fg = colors.keyword, bold = true }, 39 | Structure = { fg = colors.type }, 40 | Typedef = { fg = colors.type }, 41 | 42 | -- Special 43 | Special = { fg = colors.attribute }, 44 | SpecialChar = { fg = colors.string }, 45 | Tag = { fg = colors.keyword, bold = true }, -- Tags should be pink like keywords 46 | Delimiter = { fg = colors.punctuation }, 47 | SpecialComment = { fg = colors.comment, bold = true }, 48 | Debug = { fg = colors.error }, 49 | 50 | -- Underlined (links, etc.) 51 | Underlined = { fg = colors.info, underline = true }, 52 | 53 | -- Ignore 54 | Ignore = { fg = colors.fg_darker }, 55 | 56 | -- Error 57 | Error = { fg = colors.error, bold = true }, 58 | 59 | -- Todo 60 | Todo = { fg = colors.todo, bold = true }, 61 | 62 | -- Additional syntax groups for better coverage 63 | 64 | -- HTML/XML (tags should be pink like keywords) 65 | htmlTag = { fg = colors.keyword, bold = true }, -- Pink like keywords 66 | htmlEndTag = { fg = colors.keyword, bold = true }, -- Pink like keywords 67 | htmlTagName = { fg = colors.keyword, bold = true }, -- Pink like keywords 68 | htmlArg = { fg = colors.property }, -- Attributes stay green 69 | htmlString = { fg = colors.string }, 70 | 71 | -- CSS 72 | cssTagName = { fg = colors.keyword, bold = true }, -- CSS selectors pink 73 | cssClassName = { fg = colors.function_name }, -- Class names green 74 | cssIdentifier = { fg = colors.function_name }, -- IDs green 75 | cssProp = { fg = colors.property }, -- Properties green 76 | cssValueLength = { fg = colors.number }, 77 | cssValueNumber = { fg = colors.number }, 78 | cssColor = { fg = colors.number }, 79 | cssFunction = { fg = colors.type }, -- CSS functions bluish 80 | 81 | -- JavaScript/TypeScript (more balanced) 82 | javaScriptFunction = { fg = colors.keyword, bold = true }, 83 | javaScriptIdentifier = { fg = colors.fg }, -- Most identifiers white 84 | javaScriptMember = { fg = colors.property }, -- Object members green 85 | javaScriptNumber = { fg = colors.number }, 86 | javaScriptNull = { fg = colors.boolean, bold = true }, 87 | javaScriptUndefined = { fg = colors.boolean, bold = true }, 88 | 89 | -- JSX specific syntax highlighting 90 | jsxTag = { fg = colors.keyword, bold = true }, -- JSX tags pink 91 | jsxTagName = { fg = colors.keyword, bold = true }, -- JSX tag names pink 92 | jsxAttrib = { fg = colors.property }, -- JSX attributes green 93 | jsxString = { fg = colors.string }, 94 | jsxComponentName = { fg = colors.type }, -- React component names bluish 95 | 96 | -- Python 97 | pythonBuiltin = { fg = colors.type }, 98 | pythonException = { fg = colors.type }, 99 | pythonDecorator = { fg = colors.attribute }, 100 | pythonDecoratorName = { fg = colors.attribute }, 101 | 102 | -- Lua 103 | luaFunction = { fg = colors.keyword, bold = true }, 104 | luaTable = { fg = colors.fg }, 105 | luaIn = { fg = colors.keyword, bold = true }, 106 | 107 | -- JSON 108 | jsonKeyword = { fg = colors.property }, -- Green 109 | jsonString = { fg = colors.string }, 110 | jsonNumber = { fg = colors.number }, 111 | jsonBoolean = { fg = colors.boolean, bold = true }, 112 | jsonNull = { fg = colors.boolean, bold = true }, 113 | 114 | -- Diff 115 | diffAdded = { fg = colors.diff_add_fg, bg = colors.diff_add }, 116 | diffRemoved = { fg = colors.diff_delete_fg, bg = colors.diff_delete }, 117 | diffChanged = { fg = colors.diff_change_fg, bg = colors.diff_change }, 118 | diffFile = { fg = colors.function_name }, 119 | diffNewFile = { fg = colors.git_add }, 120 | diffOldFile = { fg = colors.git_delete }, 121 | diffLine = { fg = colors.info }, 122 | 123 | -- Git 124 | gitcommitComment = { fg = colors.comment }, 125 | gitcommitUnmerged = { fg = colors.git_change }, 126 | gitcommitOnBranch = { fg = colors.fg }, 127 | gitcommitBranch = { fg = colors.function_name }, 128 | gitcommitDiscardedType = { fg = colors.git_delete }, 129 | gitcommitSelectedType = { fg = colors.git_add }, 130 | gitcommitHeader = { fg = colors.fg }, 131 | gitcommitUntrackedFile = { fg = colors.git_ignored }, 132 | gitcommitDiscardedFile = { fg = colors.git_delete }, 133 | gitcommitSelectedFile = { fg = colors.git_add }, 134 | gitcommitUnmergedFile = { fg = colors.git_change }, 135 | gitcommitFile = { fg = colors.fg }, 136 | 137 | -- Vim script 138 | vimCommand = { fg = colors.keyword, bold = true }, 139 | vimFunction = { fg = colors.fg }, -- Function names white 140 | vimUserFunc = { fg = colors.fg }, -- User functions white 141 | vimVariable = { fg = colors.fg }, -- Variables white 142 | vimOption = { fg = colors.property }, 143 | vimHiGroup = { fg = colors.type }, 144 | vimGroup = { fg = colors.type }, 145 | vimSynType = { fg = colors.type }, 146 | } 147 | 148 | -- Apply highlights 149 | for group, opts in pairs(highlights) do 150 | vim.api.nvim_set_hl(0, group, opts) 151 | end 152 | end 153 | 154 | return M 155 | -------------------------------------------------------------------------------- /lua/xcodedark/groups/integrations/bufferline.lua: -------------------------------------------------------------------------------- 1 | local M = {} 2 | 3 | function M.setup(colors) 4 | -- Check if we're in transparent mode 5 | local tab_active_bg = colors.tab_active_bg 6 | local tab_inactive_bg = colors.tab_inactive_bg 7 | 8 | if colors.bg == "NONE" then 9 | tab_active_bg = "NONE" 10 | tab_inactive_bg = "NONE" 11 | end 12 | 13 | local highlights = { 14 | -- Background (the main tabline background) 15 | BufferLineBackground = { fg = colors.tab_inactive_fg, bg = tab_inactive_bg }, 16 | BufferLineFill = { bg = tab_inactive_bg }, 17 | 18 | -- Active/current buffer 19 | BufferLineBufferSelected = { 20 | fg = colors.tab_active_fg, 21 | bg = tab_active_bg, 22 | bold = true, 23 | }, 24 | BufferLineNumberSelected = { 25 | fg = colors.tab_active_fg, 26 | bg = tab_active_bg, 27 | bold = true, 28 | }, 29 | BufferLineCloseButtonSelected = { 30 | fg = colors.tab_active_fg, 31 | bg = tab_active_bg, 32 | }, 33 | BufferLineModifiedSelected = { 34 | fg = colors.git_change, 35 | bg = tab_active_bg, 36 | }, 37 | BufferLineDuplicateSelected = { 38 | fg = colors.tab_active_fg, 39 | bg = tab_active_bg, 40 | italic = true, 41 | }, 42 | BufferLineSeparatorSelected = { 43 | fg = tab_active_bg, 44 | bg = tab_active_bg, 45 | }, 46 | BufferLineIndicatorSelected = { 47 | fg = colors.function_name, 48 | bg = tab_active_bg, 49 | }, 50 | 51 | -- Inactive/visible buffers 52 | BufferLineBufferVisible = { 53 | fg = colors.tab_inactive_fg, 54 | bg = tab_inactive_bg, 55 | }, 56 | BufferLineNumberVisible = { 57 | fg = colors.tab_inactive_fg, 58 | bg = tab_inactive_bg, 59 | }, 60 | BufferLineCloseButtonVisible = { 61 | fg = colors.tab_inactive_fg, 62 | bg = tab_inactive_bg, 63 | }, 64 | BufferLineModifiedVisible = { 65 | fg = colors.git_change, 66 | bg = tab_inactive_bg, 67 | }, 68 | BufferLineDuplicateVisible = { 69 | fg = colors.tab_inactive_fg, 70 | bg = tab_inactive_bg, 71 | italic = true, 72 | }, 73 | BufferLineSeparatorVisible = { 74 | fg = tab_inactive_bg, 75 | bg = tab_inactive_bg, 76 | }, 77 | 78 | -- Hidden/non-visible buffers 79 | BufferLineBuffer = { 80 | fg = colors.fg_dark, 81 | bg = tab_inactive_bg, 82 | }, 83 | BufferLineNumber = { 84 | fg = colors.fg_dark, 85 | bg = tab_inactive_bg, 86 | }, 87 | BufferLineCloseButton = { 88 | fg = colors.fg_dark, 89 | bg = tab_inactive_bg, 90 | }, 91 | BufferLineModified = { 92 | fg = colors.git_change, 93 | bg = tab_inactive_bg, 94 | }, 95 | BufferLineDuplicate = { 96 | fg = colors.fg_dark, 97 | bg = tab_inactive_bg, 98 | italic = true, 99 | }, 100 | BufferLineSeparator = { 101 | fg = tab_inactive_bg, 102 | bg = tab_inactive_bg, 103 | }, 104 | 105 | -- Tabs (for tab mode) 106 | BufferLineTab = { 107 | fg = colors.tab_inactive_fg, 108 | bg = tab_inactive_bg, 109 | }, 110 | BufferLineTabSelected = { 111 | fg = colors.tab_active_fg, 112 | bg = tab_active_bg, 113 | bold = true, 114 | }, 115 | BufferLineTabClose = { 116 | fg = colors.error, 117 | bg = tab_inactive_bg, 118 | }, 119 | 120 | -- Pick mode 121 | BufferLinePick = { 122 | fg = colors.bg, 123 | bg = colors.warning, 124 | bold = true, 125 | }, 126 | BufferLinePickSelected = { 127 | fg = colors.bg, 128 | bg = colors.function_name, 129 | bold = true, 130 | }, 131 | BufferLinePickVisible = { 132 | fg = colors.bg, 133 | bg = colors.info, 134 | bold = true, 135 | }, 136 | 137 | -- Diagnostic indicators 138 | BufferLineError = { 139 | fg = colors.error, 140 | bg = tab_inactive_bg, 141 | }, 142 | BufferLineErrorSelected = { 143 | fg = colors.error, 144 | bg = tab_active_bg, 145 | }, 146 | BufferLineErrorVisible = { 147 | fg = colors.error, 148 | bg = tab_inactive_bg, 149 | }, 150 | 151 | BufferLineWarning = { 152 | fg = colors.warning, 153 | bg = tab_inactive_bg, 154 | }, 155 | BufferLineWarningSelected = { 156 | fg = colors.warning, 157 | bg = tab_active_bg, 158 | }, 159 | BufferLineWarningVisible = { 160 | fg = colors.warning, 161 | bg = tab_inactive_bg, 162 | }, 163 | 164 | BufferLineInfo = { 165 | fg = colors.info, 166 | bg = tab_inactive_bg, 167 | }, 168 | BufferLineInfoSelected = { 169 | fg = colors.info, 170 | bg = tab_active_bg, 171 | }, 172 | BufferLineInfoVisible = { 173 | fg = colors.info, 174 | bg = tab_inactive_bg, 175 | }, 176 | 177 | BufferLineHint = { 178 | fg = colors.hint, 179 | bg = tab_inactive_bg, 180 | }, 181 | BufferLineHintSelected = { 182 | fg = colors.hint, 183 | bg = tab_active_bg, 184 | }, 185 | BufferLineHintVisible = { 186 | fg = colors.hint, 187 | bg = tab_inactive_bg, 188 | }, 189 | 190 | -- Diagnostic count 191 | BufferLineErrorDiagnostic = { 192 | fg = colors.error, 193 | bg = tab_inactive_bg, 194 | }, 195 | BufferLineErrorDiagnosticSelected = { 196 | fg = colors.error, 197 | bg = tab_active_bg, 198 | }, 199 | BufferLineErrorDiagnosticVisible = { 200 | fg = colors.error, 201 | bg = tab_inactive_bg, 202 | }, 203 | 204 | BufferLineWarningDiagnostic = { 205 | fg = colors.warning, 206 | bg = tab_inactive_bg, 207 | }, 208 | BufferLineWarningDiagnosticSelected = { 209 | fg = colors.warning, 210 | bg = tab_active_bg, 211 | }, 212 | BufferLineWarningDiagnosticVisible = { 213 | fg = colors.warning, 214 | bg = tab_inactive_bg, 215 | }, 216 | 217 | BufferLineInfoDiagnostic = { 218 | fg = colors.info, 219 | bg = tab_inactive_bg, 220 | }, 221 | BufferLineInfoDiagnosticSelected = { 222 | fg = colors.info, 223 | bg = tab_active_bg, 224 | }, 225 | BufferLineInfoDiagnosticVisible = { 226 | fg = colors.info, 227 | bg = tab_inactive_bg, 228 | }, 229 | 230 | BufferLineHintDiagnostic = { 231 | fg = colors.hint, 232 | bg = tab_inactive_bg, 233 | }, 234 | BufferLineHintDiagnosticSelected = { 235 | fg = colors.hint, 236 | bg = tab_active_bg, 237 | }, 238 | BufferLineHintDiagnosticVisible = { 239 | fg = colors.hint, 240 | bg = tab_inactive_bg, 241 | }, 242 | 243 | -- DevIcon highlights (file type icons) 244 | BufferLineDevIconDefault = { 245 | fg = colors.fg, 246 | bg = tab_inactive_bg, 247 | }, 248 | BufferLineDevIconDefaultSelected = { 249 | fg = colors.fg, 250 | bg = tab_active_bg, 251 | }, 252 | BufferLineDevIconDefaultVisible = { 253 | fg = colors.fg, 254 | bg = tab_inactive_bg, 255 | }, 256 | 257 | -- Offset highlights (for side panels) 258 | BufferLineOffsetSeparator = { 259 | fg = colors.separator, 260 | bg = tab_inactive_bg, 261 | }, 262 | } 263 | 264 | -- Apply highlights 265 | for group, opts in pairs(highlights) do 266 | vim.api.nvim_set_hl(0, group, opts) 267 | end 268 | end 269 | 270 | return M 271 | -------------------------------------------------------------------------------- /lua/xcodedark/groups/editor.lua: -------------------------------------------------------------------------------- 1 | local M = {} 2 | 3 | function M.setup(colors) 4 | local highlights = { 5 | -- Editor UI (with font weight adjustments) 6 | Normal = { fg = colors.fg, bg = colors.bg }, 7 | NormalFloat = { fg = colors.fg, bg = colors.bg_light }, 8 | NormalNC = { fg = colors.fg, bg = colors.bg }, 9 | 10 | -- Cursor and lines (updated colors with enhanced cursor settings) 11 | Cursor = { fg = colors.bg, bg = colors.cursor }, 12 | CursorInsert = { fg = colors.bg, bg = colors.cursor }, 13 | CursorVisual = { fg = colors.bg, bg = colors.cursor_visual }, 14 | CursorReplace = { fg = colors.bg, bg = colors.cursor }, 15 | CursorCommand = { fg = colors.bg, bg = colors.cursor }, 16 | lCursor = { fg = colors.bg, bg = colors.cursor }, 17 | CursorLine = { bg = colors.cursor_line }, 18 | CursorLineNr = { fg = colors.cursor, bold = true, underline = true }, 19 | CursorColumn = { bg = colors.cursor_line }, 20 | 21 | -- Line numbers and gutter 22 | LineNr = { fg = colors.line_number, bg = colors.gutter_bg }, 23 | SignColumn = { bg = colors.gutter_bg }, 24 | FoldColumn = { fg = colors.line_number, bg = colors.gutter_bg }, 25 | 26 | -- Visual selections (updated colors) 27 | Visual = { bg = colors.visualmode_highlight_bg }, 28 | VisualNOS = { bg = colors.visualmode_highlight_bg }, 29 | 30 | -- Search 31 | Search = { fg = colors.search_fg, bg = colors.search }, 32 | IncSearch = { fg = colors.fg, bg = colors.inc_search }, 33 | CurSearch = { fg = colors.search_fg, bg = colors.search }, 34 | 35 | -- Windows and splits 36 | WinSeparator = { fg = colors.separator }, 37 | VertSplit = { fg = colors.separator }, 38 | 39 | -- Status line 40 | StatusLine = { fg = colors.status_fg, bg = colors.status_bg }, 41 | StatusLineNC = { fg = colors.fg_dark, bg = colors.status_bg }, 42 | 43 | -- Tabs (built-in vim tabs) 44 | TabLine = { fg = colors.tab_inactive_fg, bg = colors.tab_inactive_bg }, 45 | TabLineFill = { bg = colors.tab_inactive_bg }, 46 | TabLineSel = { fg = colors.tab_active_fg, bg = colors.tab_active_bg, bold = true }, 47 | 48 | -- Floating windows and borders (important for transparency) 49 | FloatBorder = { fg = colors.border, bg = colors.bg_light }, 50 | FloatTitle = { fg = colors.function_name, bg = colors.bg_light, bold = true }, 51 | FloatFooter = { fg = colors.fg_dark, bg = colors.bg_light }, 52 | 53 | -- Terminal colors (for integrated terminal and lazygit) 54 | Terminal = { fg = colors.fg, bg = colors.bg }, 55 | TerminalNormal = { fg = colors.fg, bg = colors.bg }, 56 | TerminalNormalFloat = { fg = colors.fg, bg = colors.bg }, 57 | TermCursor = { fg = colors.bg, bg = colors.cursor }, 58 | TermCursorNC = { fg = colors.bg, bg = colors.cursor }, 59 | 60 | -- Popup menus 61 | Pmenu = { fg = colors.pmenu_fg, bg = colors.pmenu_bg }, 62 | PmenuSel = { fg = colors.pmenu_sel_fg, bg = colors.pmenu_sel_bg }, 63 | PmenuSbar = { bg = colors.pmenu_scrollbar }, 64 | PmenuThumb = { bg = colors.scrollbar_thumb }, 65 | 66 | -- Completion menu kinds (enhanced styling) 67 | CmpItemAbbr = { fg = colors.pmenu_fg }, 68 | CmpItemAbbrDeprecated = { fg = colors.fg_dark, strikethrough = true }, 69 | CmpItemAbbrMatch = { fg = colors.function_name, bold = true }, 70 | CmpItemAbbrMatchFuzzy = { fg = colors.function_name, bold = true }, 71 | CmpItemKind = { fg = colors.type, bold = true }, 72 | CmpItemMenu = { fg = colors.fg_dark, italic = true }, 73 | 74 | -- Completion item kinds with syntax highlighting 75 | CmpItemKindText = { fg = colors.fg }, 76 | CmpItemKindMethod = { fg = colors.function_name }, 77 | CmpItemKindFunction = { fg = colors.function_name }, 78 | CmpItemKindConstructor = { fg = colors.function_name }, 79 | CmpItemKindField = { fg = colors.property }, 80 | CmpItemKindVariable = { fg = colors.variable }, 81 | CmpItemKindClass = { fg = colors.type }, 82 | CmpItemKindInterface = { fg = colors.type }, 83 | CmpItemKindModule = { fg = colors.type }, 84 | CmpItemKindProperty = { fg = colors.property }, 85 | CmpItemKindUnit = { fg = colors.constant }, 86 | CmpItemKindValue = { fg = colors.constant }, 87 | CmpItemKindEnum = { fg = colors.type }, 88 | CmpItemKindKeyword = { fg = colors.keyword }, 89 | CmpItemKindSnippet = { fg = colors.string }, 90 | CmpItemKindColor = { fg = colors.string }, 91 | CmpItemKindFile = { fg = colors.fg }, 92 | CmpItemKindReference = { fg = colors.fg }, 93 | CmpItemKindFolder = { fg = colors.function_name }, 94 | CmpItemKindEnumMember = { fg = colors.constant }, 95 | CmpItemKindConstant = { fg = colors.constant }, 96 | CmpItemKindStruct = { fg = colors.type }, 97 | CmpItemKindEvent = { fg = colors.function_name }, 98 | CmpItemKindOperator = { fg = colors.operator }, 99 | CmpItemKindTypeParameter = { fg = colors.parameter }, 100 | 101 | -- Scrollbar 102 | ScrollbarHandle = { bg = colors.scrollbar_thumb }, 103 | 104 | -- Folding 105 | Folded = { fg = colors.fold_fg, bg = colors.fold_bg }, 106 | 107 | -- Matching parentheses 108 | MatchParen = { fg = colors.match_paren, bold = true }, 109 | 110 | -- Messages 111 | ErrorMsg = { fg = colors.error }, 112 | WarningMsg = { fg = colors.warning }, 113 | ModeMsg = { fg = colors.fg }, 114 | MoreMsg = { fg = colors.info }, 115 | 116 | -- Question prompts 117 | Question = { fg = colors.info }, 118 | 119 | -- Directory listings 120 | Directory = { fg = colors.function_name }, 121 | 122 | -- Concealed text 123 | Conceal = { fg = colors.fg_dark }, 124 | 125 | -- Non-text elements 126 | NonText = { fg = colors.fg_darker }, 127 | EndOfBuffer = { fg = colors.bg }, 128 | 129 | -- Special keys 130 | SpecialKey = { fg = colors.fg_darker }, 131 | 132 | -- Wild menu (command completion) 133 | WildMenu = { fg = colors.pmenu_sel_fg, bg = colors.pmenu_sel_bg }, 134 | 135 | -- Color column 136 | ColorColumn = { bg = colors.bg_highlight }, 137 | 138 | -- Spell checking 139 | SpellBad = { fg = colors.spell_bad, undercurl = true }, 140 | SpellCap = { fg = colors.spell_cap, undercurl = true }, 141 | SpellRare = { fg = colors.spell_rare, undercurl = true }, 142 | SpellLocal = { fg = colors.spell_local, undercurl = true }, 143 | 144 | -- Diagnostic colors (built-in) 145 | DiagnosticError = { fg = colors.error }, 146 | DiagnosticWarn = { fg = colors.warning }, 147 | DiagnosticInfo = { fg = colors.info }, 148 | DiagnosticHint = { fg = colors.hint }, 149 | 150 | DiagnosticVirtualTextError = { fg = colors.error }, 151 | DiagnosticVirtualTextWarn = { fg = colors.warning }, 152 | DiagnosticVirtualTextInfo = { fg = colors.info }, 153 | DiagnosticVirtualTextHint = { fg = colors.hint }, 154 | 155 | DiagnosticUnderlineError = { undercurl = true, sp = colors.error }, 156 | DiagnosticUnderlineWarn = { undercurl = true, sp = colors.warning }, 157 | DiagnosticUnderlineInfo = { undercurl = true, sp = colors.info }, 158 | DiagnosticUnderlineHint = { undercurl = true, sp = colors.hint }, 159 | 160 | -- QuickFix and Location lists 161 | QuickFixLine = { bg = colors.bg_highlight }, 162 | 163 | -- Title 164 | Title = { fg = colors.function_name, bold = true }, 165 | 166 | -- Debug 167 | debugPC = { bg = colors.debug_current_line }, 168 | debugBreakpoint = { fg = colors.debug_breakpoint, bold = true }, 169 | } 170 | 171 | -- Apply highlights 172 | for group, opts in pairs(highlights) do 173 | vim.api.nvim_set_hl(0, group, opts) 174 | end 175 | end 176 | 177 | return M 178 | -------------------------------------------------------------------------------- /lua/xcodedark/groups/integrations/treesitter.lua: -------------------------------------------------------------------------------- 1 | local M = {} 2 | 3 | function M.setup(colors) 4 | local highlights = { 5 | -- Identifiers (more balanced approach) 6 | ["@variable"] = { fg = colors.fg }, -- Most variables should be white, not green 7 | ["@variable.builtin"] = { fg = colors.keyword, bold = true }, -- Built-ins like 'this', 'self' should be pink and bold 8 | ["@variable.parameter"] = { fg = colors.purple }, -- Parameters purple like Xcode 9 | ["@variable.member"] = { fg = colors.property }, -- Object properties stay green 10 | 11 | -- Constants 12 | ["@constant"] = { fg = colors.constant }, -- Light blue 13 | ["@constant.builtin"] = { fg = colors.constant }, -- Light blue 14 | ["@constant.macro"] = { fg = colors.constant }, -- Light blue 15 | 16 | -- Modules and namespaces 17 | ["@module"] = { fg = colors.type }, 18 | ["@module.builtin"] = { fg = colors.type }, 19 | 20 | -- Strings and characters 21 | ["@string"] = { fg = colors.string }, 22 | ["@string.documentation"] = { fg = colors.comment }, 23 | ["@string.regexp"] = { fg = colors.string }, 24 | ["@string.escape"] = { fg = colors.operator }, 25 | ["@string.special"] = { fg = colors.operator }, 26 | ["@string.special.symbol"] = { fg = colors.property }, 27 | ["@string.special.url"] = { fg = colors.info, underline = true }, 28 | ["@string.special.path"] = { fg = colors.string }, 29 | ["@character"] = { fg = colors.string }, 30 | ["@character.special"] = { fg = colors.operator }, 31 | 32 | -- Booleans and numbers 33 | ["@boolean"] = { fg = colors.boolean, bold = true }, 34 | ["@number"] = { fg = colors.number }, 35 | ["@number.float"] = { fg = colors.number }, 36 | 37 | -- Types 38 | ["@type"] = { fg = colors.type }, 39 | ["@type.builtin"] = { fg = colors.type }, 40 | ["@type.definition"] = { fg = colors.type }, 41 | ["@type.qualifier"] = { fg = colors.keyword, bold = true }, 42 | 43 | -- Attributes and properties 44 | ["@attribute"] = { fg = colors.attribute }, 45 | ["@attribute.builtin"] = { fg = colors.attribute }, 46 | ["@property"] = { fg = colors.property }, -- Keep green for actual properties 47 | 48 | -- Functions (reduce green usage) 49 | ["@function"] = { fg = colors.type }, -- Function names should be bluish in most contexts 50 | ["@function.builtin"] = { fg = colors.function_name }, -- Built-in functions can be green 51 | ["@function.call"] = { fg = colors.type }, -- Function calls bluish 52 | ["@function.macro"] = { fg = colors.function_name }, -- Macros green 53 | ["@function.method"] = { fg = colors.type }, -- Method calls bluish 54 | ["@function.method.call"] = { fg = colors.type }, -- Method calls bluish 55 | ["@constructor"] = { fg = colors.type }, -- Constructors should be type color 56 | 57 | -- Keywords and operators (BOLD keywords) 58 | ["@keyword"] = { fg = colors.keyword, bold = true }, -- Pink and BOLD 59 | ["@keyword.coroutine"] = { fg = colors.keyword, bold = true }, 60 | ["@keyword.function"] = { fg = colors.keyword, bold = true }, 61 | ["@keyword.operator"] = { fg = colors.keyword, bold = true }, 62 | ["@keyword.import"] = { fg = colors.preprocessor, bold = true }, -- Pink for imports and BOLD 63 | ["@keyword.storage"] = { fg = colors.keyword, bold = true }, 64 | ["@keyword.repeat"] = { fg = colors.keyword, bold = true }, 65 | ["@keyword.return"] = { fg = colors.keyword, bold = true }, 66 | ["@keyword.debug"] = { fg = colors.keyword, bold = true }, 67 | ["@keyword.exception"] = { fg = colors.keyword, bold = true }, 68 | ["@keyword.conditional"] = { fg = colors.keyword, bold = true }, 69 | ["@keyword.conditional.ternary"] = { fg = colors.operator }, 70 | ["@keyword.directive"] = { fg = colors.preprocessor, bold = true }, -- Pink and BOLD 71 | ["@keyword.directive.define"] = { fg = colors.preprocessor, bold = true }, -- Pink and BOLD 72 | 73 | -- Operators 74 | ["@operator"] = { fg = colors.operator }, 75 | 76 | -- Punctuation 77 | ["@punctuation.delimiter"] = { fg = colors.punctuation }, 78 | ["@punctuation.bracket"] = { fg = colors.punctuation }, 79 | ["@punctuation.special"] = { fg = colors.operator }, 80 | 81 | -- Comments 82 | ["@comment"] = { fg = colors.comment, italic = true }, 83 | ["@comment.documentation"] = { fg = colors.comment, italic = true }, 84 | ["@comment.error"] = { fg = colors.fixme, bold = true }, 85 | ["@comment.warning"] = { fg = colors.todo, bold = true }, 86 | ["@comment.todo"] = { fg = colors.todo, bold = true }, 87 | ["@comment.note"] = { fg = colors.note, bold = true }, 88 | 89 | -- Literals 90 | ["@string.doc"] = { fg = colors.comment }, 91 | 92 | -- Misc 93 | ["@error"] = { fg = colors.error }, 94 | ["@none"] = {}, 95 | ["@preproc"] = { fg = colors.preprocessor, bold = true }, -- Pink and BOLD 96 | 97 | -- Tags (HTML/XML/JSX) - Make div/tags same as keywords (pink and bold) 98 | ["@tag"] = { fg = colors.keyword, bold = true }, -- Pink like keywords and BOLD 99 | ["@tag.attribute"] = { fg = colors.property }, -- Attributes stay green 100 | ["@tag.delimiter"] = { fg = colors.punctuation }, 101 | 102 | -- Language specific adjustments 103 | 104 | -- Swift specific treesitter groups 105 | ["@keyword.modifier.swift"] = { fg = colors.keyword, bold = true }, 106 | ["@attribute.swift"] = { fg = colors.swift_attribute }, 107 | ["@parameter.swift"] = { fg = colors.purple }, -- Parameters purple 108 | ["@variable.parameter.swift"] = { fg = colors.purple }, -- Parameters purple 109 | ["@type.builtin.swift"] = { fg = colors.type }, 110 | ["@function.builtin.swift"] = { fg = colors.function_name }, 111 | ["@function.swift"] = { fg = colors.type }, -- Swift functions bluish 112 | ["@function.call.swift"] = { fg = colors.type }, -- Swift function calls bluish 113 | ["@variable.builtin.swift"] = { fg = colors.keyword, bold = true }, 114 | 115 | -- Objective-C specific treesitter groups 116 | ["@keyword.directive.objc"] = { fg = colors.objc_directive, bold = true }, -- Pink and BOLD 117 | ["@type.builtin.objc"] = { fg = colors.type }, 118 | ["@property.objc"] = { fg = colors.property }, 119 | ["@parameter.objc"] = { fg = colors.fg }, -- Parameters white 120 | 121 | -- Python specific 122 | ["@keyword.function.python"] = { fg = colors.keyword, bold = true }, 123 | ["@constructor.python"] = { fg = colors.type }, 124 | ["@function.builtin.python"] = { fg = colors.function_name }, 125 | ["@type.builtin.python"] = { fg = colors.type }, 126 | ["@variable.builtin.python"] = { fg = colors.keyword, bold = true }, -- self, cls should be pink and bold 127 | 128 | -- JavaScript/TypeScript specific 129 | ["@constructor.javascript"] = { fg = colors.type }, 130 | ["@keyword.function.javascript"] = { fg = colors.keyword, bold = true }, 131 | ["@function.javascript"] = { fg = colors.type }, -- JS functions bluish 132 | ["@function.call.javascript"] = { fg = colors.type }, -- JS function calls bluish 133 | ["@variable.builtin.javascript"] = { fg = colors.keyword, bold = true }, -- this, arguments should be pink and bold 134 | ["@variable.parameter.javascript"] = { fg = colors.purple }, -- JS parameters purple 135 | ["@parameter.javascript"] = { fg = colors.purple }, -- JS parameters purple 136 | ["@constructor.typescript"] = { fg = colors.type }, 137 | ["@keyword.function.typescript"] = { fg = colors.keyword, bold = true }, 138 | ["@function.typescript"] = { fg = colors.type }, -- TS functions bluish 139 | ["@function.call.typescript"] = { fg = colors.type }, -- TS function calls bluish 140 | ["@variable.builtin.typescript"] = { fg = colors.keyword, bold = true }, 141 | ["@variable.parameter.typescript"] = { fg = colors.purple }, -- TS parameters purple 142 | ["@parameter.typescript"] = { fg = colors.purple }, -- TS parameters purple 143 | 144 | -- Lua specific 145 | ["@constructor.lua"] = { fg = colors.fg }, 146 | ["@keyword.function.lua"] = { fg = colors.keyword, bold = true }, 147 | ["@variable.builtin.lua"] = { fg = colors.keyword, bold = true }, 148 | 149 | -- Java specific 150 | -- ["@attribute.java"] = { fg = colors.keyword, bold = false }, -- Spring Boot annotations like @RestController, @Autowired 151 | -- ["@keyword.function.java"] = { fg = colors.keyword, bold = true }, 152 | -- ["@constructor.java"] = { fg = colors.type }, 153 | -- ["@function.builtin.java"] = { fg = colors.function_name }, 154 | -- ["@type.builtin.java"] = { fg = colors.type }, 155 | -- ["@variable.parameter.java"] = { fg = colors.purple }, -- Java parameters purple 156 | 157 | -- CSS specific 158 | ["@property.css"] = { fg = colors.property }, 159 | ["@type.css"] = { fg = colors.type }, 160 | ["@string.css"] = { fg = colors.string }, 161 | ["@number.css"] = { fg = colors.number }, 162 | 163 | -- HTML specific - divs and tags should be pink like keywords and bold 164 | ["@tag.html"] = { fg = colors.keyword, bold = true }, -- Pink like keywords and BOLD 165 | ["@tag.attribute.html"] = { fg = colors.property }, -- Attributes green 166 | ["@string.html"] = { fg = colors.string }, 167 | 168 | -- JSX/TSX specific - React components and HTML tags 169 | ["@tag.jsx"] = { fg = colors.keyword, bold = true }, -- Pink like keywords and BOLD 170 | ["@tag.tsx"] = { fg = colors.keyword, bold = true }, -- Pink like keywords and BOLD 171 | ["@tag.builtin.jsx"] = { fg = colors.keyword, bold = true }, -- HTML tags in JSX (div, span, etc.) should be pink and bold 172 | ["@tag.builtin.tsx"] = { fg = colors.keyword, bold = true }, -- HTML tags in TSX (div, span, etc.) should be pink and bold 173 | ["@tag.attribute.jsx"] = { fg = colors.property }, 174 | ["@tag.attribute.tsx"] = { fg = colors.property }, 175 | 176 | -- Diff 177 | ["@diff.plus"] = { fg = colors.diff_add_fg, bg = colors.diff_add }, 178 | ["@diff.minus"] = { fg = colors.diff_delete_fg, bg = colors.diff_delete }, 179 | ["@diff.delta"] = { fg = colors.diff_change_fg, bg = colors.diff_change }, 180 | 181 | -- Git commit 182 | ["@text.gitcommit"] = { fg = colors.fg }, 183 | 184 | -- URI/URL 185 | ["@text.uri"] = { fg = colors.info, underline = true }, 186 | 187 | -- Spell 188 | ["@spell"] = {}, 189 | ["@nospell"] = {}, 190 | } 191 | 192 | -- Apply highlights 193 | for group, opts in pairs(highlights) do 194 | vim.api.nvim_set_hl(0, group, opts) 195 | end 196 | end 197 | 198 | return M 199 | -------------------------------------------------------------------------------- /lua/xcodedark/init.lua: -------------------------------------------------------------------------------- 1 | local M = {} 2 | 3 | local default_options = { 4 | -- Enable/disable specific integrations 5 | integrations = { 6 | telescope = true, 7 | nvim_tree = true, 8 | gitsigns = true, 9 | bufferline = true, -- For file tabs 10 | incline = true, -- For incline.nvim 11 | lazygit = true, -- For lazygit integration 12 | which_key = true, -- For which-key popup 13 | notify = true, -- For nvim-notify 14 | snacks = true, -- For snacks.nvim picker 15 | blink = true, -- For blink.cmp completion 16 | }, 17 | -- Style options 18 | styles = { 19 | comments = { italic = true }, -- Comments remain italic, normal weight 20 | keywords = { bold = true }, -- Keywords are bold by default 21 | functions = {}, -- Functions use default weight (SF Mono Light Medium) 22 | variables = {}, -- Variables use default weight (SF Mono Light Medium) 23 | strings = {}, -- Strings use default weight (SF Mono Light Medium) 24 | booleans = { bold = true }, -- Booleans are bold 25 | types = {}, -- Types use default weight (SF Mono Light Medium) 26 | constants = {}, -- Constants use default weight (SF Mono Light Medium) 27 | operators = {}, -- Operators use default weight (SF Mono Light Medium) 28 | punctuation = {}, -- Punctuation use default weight (SF Mono Light Medium) 29 | }, 30 | -- Font weight configuration 31 | font_weights = { 32 | -- Most code elements will use SF Mono Light Medium (your terminal default) 33 | -- Only specific elements will be bold or have different weights 34 | default = {}, -- Uses terminal default (SF Mono Light Medium) 35 | bold_elements = { -- Elements that should be bold 36 | "keywords", 37 | "booleans", 38 | "conditionals", 39 | "loops", 40 | "imports", 41 | "preprocessor", 42 | "tags", 43 | "storage_class", 44 | "function_keywords", 45 | }, 46 | italic_elements = { -- Elements that should be italic 47 | "comments", 48 | }, 49 | }, 50 | -- Terminal colors 51 | terminal_colors = true, 52 | -- Transparent background 53 | transparent = false, 54 | } 55 | 56 | function M.load(opts) 57 | opts = vim.tbl_deep_extend("force", default_options, opts or {}) 58 | 59 | -- Clear existing highlights 60 | vim.cmd("highlight clear") 61 | if vim.fn.exists("syntax_on") then 62 | vim.cmd("syntax reset") 63 | end 64 | 65 | vim.g.colours_name = "xcodedark" 66 | 67 | local colors = require("xcodedark.colors") 68 | 69 | -- Apply transparent background if enabled 70 | if opts.transparent then 71 | colors.bg = "NONE" 72 | colors.bg_alt = "NONE" 73 | colors.bg_dark = "NONE" 74 | colors.bg_light = "NONE" 75 | colors.gutter_bg = "NONE" 76 | colors.status_bg = "NONE" 77 | colors.tab_active_bg = "NONE" 78 | colors.tab_inactive_bg = "NONE" 79 | -- Keep popup menu background solid even in transparent mode for better readability 80 | -- colors.pmenu_bg = "NONE" -- Commented out to keep solid background 81 | colors.fold_bg = "NONE" 82 | -- Also make incline and which-key transparent 83 | colors.bg_highlight = "NONE" 84 | end 85 | 86 | -- Load core highlight groups 87 | require("xcodedark.groups.editor").setup(colors) 88 | require("xcodedark.groups.syntax").setup(colors) 89 | require("xcodedark.groups.integrations.treesitter").setup(colors) 90 | require("xcodedark.groups.integrations.lsp").setup(colors) 91 | 92 | -- Load optional integrations with error handling 93 | if opts.integrations.telescope then 94 | local ok, _ = pcall(require, "xcodedark.groups.integrations.telescope") 95 | if ok then 96 | require("xcodedark.groups.integrations.telescope").setup(colors) 97 | end 98 | end 99 | 100 | if opts.integrations.nvim_tree then 101 | local ok, _ = pcall(require, "xcodedark.groups.integrations.nvim-tree") 102 | if ok then 103 | require("xcodedark.groups.integrations.nvim-tree").setup(colors) 104 | end 105 | end 106 | 107 | if opts.integrations.gitsigns then 108 | local ok, _ = pcall(require, "xcodedark.groups.integrations.gitsigns") 109 | if ok then 110 | require("xcodedark.groups.integrations.gitsigns").setup(colors) 111 | end 112 | end 113 | 114 | if opts.integrations.bufferline then 115 | local ok, _ = pcall(require, "xcodedark.groups.integrations.bufferline") 116 | if ok then 117 | require("xcodedark.groups.integrations.bufferline").setup(colors) 118 | end 119 | end 120 | 121 | if opts.integrations.incline then 122 | local ok, _ = pcall(require, "xcodedark.groups.integrations.incline") 123 | if ok then 124 | require("xcodedark.groups.integrations.incline").setup(colors) 125 | end 126 | end 127 | 128 | if opts.integrations.lazygit then 129 | local ok, _ = pcall(require, "xcodedark.groups.integrations.lazygit") 130 | if ok then 131 | require("xcodedark.groups.integrations.lazygit").setup(colors) 132 | end 133 | end 134 | 135 | if opts.integrations.which_key then 136 | local ok, _ = pcall(require, "xcodedark.groups.integrations.which-key") 137 | if ok then 138 | require("xcodedark.groups.integrations.which-key").setup(colors) 139 | end 140 | end 141 | 142 | if opts.integrations.notify then 143 | local ok, _ = pcall(require, "xcodedark.groups.integrations.notify") 144 | if ok then 145 | require("xcodedark.groups.integrations.notify").setup(colors) 146 | end 147 | end 148 | 149 | if opts.integrations.snacks then 150 | local ok, _ = pcall(require, "xcodedark.groups.integrations.snacks") 151 | if ok then 152 | local snacks_highlights = require("xcodedark.groups.integrations.snacks").setup() 153 | for group, hl in pairs(snacks_highlights) do 154 | vim.api.nvim_set_hl(0, group, hl) 155 | end 156 | end 157 | end 158 | 159 | if opts.integrations.blink then 160 | local ok, _ = pcall(require, "xcodedark.groups.integrations.blink") 161 | if ok then 162 | require("xcodedark.groups.integrations.blink").setup(colors) 163 | end 164 | end 165 | 166 | -- Set terminal colors if enabled 167 | if opts.terminal_colors then 168 | vim.g.terminal_color_0 = colors.terminal_black 169 | vim.g.terminal_color_1 = colors.terminal_red 170 | vim.g.terminal_color_2 = colors.terminal_green 171 | vim.g.terminal_color_3 = colors.terminal_yellow 172 | vim.g.terminal_color_4 = colors.terminal_blue 173 | vim.g.terminal_color_5 = colors.terminal_magenta 174 | vim.g.terminal_color_6 = colors.terminal_cyan 175 | vim.g.terminal_color_7 = colors.terminal_white 176 | vim.g.terminal_color_8 = colors.terminal_bright_black 177 | vim.g.terminal_color_9 = colors.terminal_bright_red 178 | vim.g.terminal_color_10 = colors.terminal_bright_green 179 | vim.g.terminal_color_11 = colors.terminal_bright_yellow 180 | vim.g.terminal_color_12 = colors.terminal_bright_blue 181 | vim.g.terminal_color_13 = colors.terminal_bright_magenta 182 | vim.g.terminal_color_14 = colors.terminal_bright_cyan 183 | vim.g.terminal_color_15 = colors.terminal_bright_white 184 | end 185 | 186 | -- Enhanced autocomplete menu styling (always applied for better appearance) 187 | vim.api.nvim_set_hl(0, "Pmenu", { 188 | fg = colors.pmenu_fg, 189 | bg = colors.pmenu_bg, 190 | blend = 15 -- Slight transparency for better visual integration 191 | }) 192 | vim.api.nvim_set_hl(0, "PmenuSel", { 193 | fg = colors.pmenu_sel_fg, 194 | bg = colors.pmenu_sel_bg, 195 | bold = true -- Make selected item more prominent 196 | }) 197 | vim.api.nvim_set_hl(0, "PmenuSbar", { 198 | bg = colors.pmenu_scrollbar 199 | }) 200 | vim.api.nvim_set_hl(0, "PmenuThumb", { 201 | bg = colors.scrollbar_thumb 202 | }) 203 | 204 | -- Enhanced completion menu styling with borders 205 | vim.api.nvim_set_hl(0, "FloatBorder", { 206 | fg = colors.border, 207 | bg = opts.transparent and "NONE" or colors.bg_light 208 | }) 209 | vim.api.nvim_set_hl(0, "NormalFloat", { 210 | fg = colors.fg, 211 | bg = opts.transparent and colors.pmenu_bg or colors.bg_light 212 | }) 213 | 214 | -- Apply additional transparency fixes for specific elements 215 | if opts.transparent then 216 | -- Force transparency for problematic highlights 217 | vim.api.nvim_set_hl(0, "Normal", { fg = colors.fg, bg = "NONE" }) 218 | -- Keep NormalFloat with solid background for better autocomplete visibility 219 | vim.api.nvim_set_hl(0, "NormalFloat", { fg = colors.fg, bg = colors.pmenu_bg }) 220 | vim.api.nvim_set_hl(0, "FloatBorder", { fg = colors.border, bg = "NONE" }) 221 | vim.api.nvim_set_hl(0, "SignColumn", { bg = "NONE" }) 222 | vim.api.nvim_set_hl(0, "FoldColumn", { fg = colors.line_number, bg = "NONE" }) 223 | vim.api.nvim_set_hl(0, "LineNr", { fg = colors.line_number, bg = "NONE" }) 224 | vim.api.nvim_set_hl(0, "CursorLineNr", { fg = colors.cursor, bg = "NONE", bold = true, underline = true }) 225 | 226 | -- Fix incline transparency 227 | vim.api.nvim_set_hl(0, "InclineNormal", { fg = colors.fg_alt, bg = "NONE" }) 228 | vim.api.nvim_set_hl(0, "InclineNormalNC", { fg = colors.fg_dark, bg = "NONE" }) 229 | 230 | -- Fix which-key transparency 231 | vim.api.nvim_set_hl(0, "WhichKeyFloat", { bg = "NONE" }) 232 | vim.api.nvim_set_hl(0, "WhichKey", { fg = colors.function_name, bg = "NONE", bold = true }) 233 | vim.api.nvim_set_hl(0, "WhichKeyGroup", { fg = colors.keyword, bg = "NONE" }) 234 | vim.api.nvim_set_hl(0, "WhichKeyDesc", { fg = colors.fg, bg = "NONE" }) 235 | 236 | -- Fix bufferline transparency 237 | vim.api.nvim_set_hl(0, "BufferLineBackground", { fg = colors.tab_inactive_fg, bg = "NONE" }) 238 | vim.api.nvim_set_hl(0, "BufferLineFill", { bg = "NONE" }) 239 | vim.api.nvim_set_hl(0, "BufferLineBufferSelected", { fg = colors.tab_active_fg, bg = "NONE", bold = true }) 240 | vim.api.nvim_set_hl(0, "BufferLineBufferVisible", { fg = colors.tab_inactive_fg, bg = "NONE" }) 241 | vim.api.nvim_set_hl(0, "BufferLineBuffer", { fg = colors.fg_dark, bg = "NONE" }) 242 | 243 | -- Fix lazygit transparency 244 | vim.api.nvim_set_hl(0, "LazyGitFloat", { fg = colors.fg, bg = "NONE" }) 245 | vim.api.nvim_set_hl(0, "LazyGitBorder", { fg = colors.border, bg = "NONE" }) 246 | vim.api.nvim_set_hl(0, "TerminalNormal", { fg = colors.fg, bg = "NONE" }) 247 | vim.api.nvim_set_hl(0, "TerminalNormalFloat", { fg = colors.fg, bg = "NONE" }) 248 | 249 | -- Enhanced telescope borders for transparent mode (keep backgrounds transparent, make borders pop) 250 | vim.api.nvim_set_hl(0, "TelescopeBorder", { fg = colors.function_name }) 251 | vim.api.nvim_set_hl(0, "TelescopeTitle", { fg = colors.keyword, bold = true }) 252 | vim.api.nvim_set_hl(0, "TelescopePromptBorder", { fg = colors.type }) 253 | vim.api.nvim_set_hl(0, "TelescopePromptTitle", { fg = colors.string, bold = true }) 254 | vim.api.nvim_set_hl(0, "TelescopePromptPrefix", { fg = colors.keyword, bold = true }) 255 | vim.api.nvim_set_hl(0, "TelescopeResultsBorder", { fg = colors.constant }) 256 | vim.api.nvim_set_hl(0, "TelescopeResultsTitle", { fg = colors.purple, bold = true }) 257 | vim.api.nvim_set_hl(0, "TelescopePreviewBorder", { fg = colors.attribute }) 258 | vim.api.nvim_set_hl(0, "TelescopePreviewTitle", { fg = colors.number, bold = true }) 259 | vim.api.nvim_set_hl(0, "TelescopeSelectionCaret", { fg = colors.keyword, bold = true }) 260 | vim.api.nvim_set_hl(0, "TelescopeSelection", { fg = colors.fg, bg = colors.selection, bold = true }) 261 | vim.api.nvim_set_hl(0, "TelescopeMultiSelection", { fg = colors.fg, bg = colors.selection }) 262 | 263 | -- Fix nvimtree selection transparency 264 | vim.api.nvim_set_hl(0, "NvimTreeCursorLine", { bg = colors.selection }) 265 | vim.api.nvim_set_hl(0, "NvimTreeCursorColumn", { bg = colors.selection }) 266 | end 267 | 268 | -- CURSOR COLOR OVERRIDE SECTION 269 | -- Force cursor colors to override terminal settings 270 | vim.api.nvim_set_hl(0, "Cursor", { fg = colors.bg, bg = colors.cursor, blend = 0 }) 271 | vim.api.nvim_set_hl(0, "CursorInsert", { fg = colors.bg, bg = colors.cursor, blend = 0 }) 272 | vim.api.nvim_set_hl(0, "CursorVisual", { fg = colors.bg, bg = colors.cursor_visual, blend = 0 }) 273 | vim.api.nvim_set_hl(0, "CursorReplace", { fg = colors.bg, bg = colors.cursor, blend = 0 }) 274 | vim.api.nvim_set_hl(0, "CursorCommand", { fg = colors.bg, bg = colors.cursor, blend = 0 }) 275 | vim.api.nvim_set_hl(0, "lCursor", { fg = colors.bg, bg = colors.cursor, blend = 0 }) 276 | vim.api.nvim_set_hl(0, "TermCursor", { fg = colors.bg, bg = colors.cursor, blend = 0 }) 277 | vim.api.nvim_set_hl(0, "TermCursorNC", { fg = colors.bg, bg = colors.cursor, blend = 0 }) 278 | 279 | -- Set cursor shape and color for different modes 280 | vim.opt.guicursor = { 281 | "n-v-c-sm:block-Cursor", 282 | "i-ci-ve:ver25-CursorInsert", 283 | "r-cr-o:hor20-CursorReplace", 284 | "a:blinkwait700-blinkoff400-blinkon250", 285 | -- Add visual mode cursor with specific color 286 | "v:block-CursorVisual", 287 | } 288 | 289 | -- Terminal escape sequences for cursor color (may help with some terminals) 290 | if vim.fn.has("termguicolors") == 1 then 291 | vim.cmd(string.format( 292 | [[ 293 | let &t_SI = "\e]12;%s\x7" 294 | let &t_SR = "\e]12;%s\x7" 295 | let &t_EI = "\e]12;%s\x7" 296 | ]], 297 | colors.cursor, 298 | colors.cursor, 299 | colors.cursor 300 | )) 301 | end 302 | 303 | -- Create autocmd to reapply cursor color after certain events 304 | vim.api.nvim_create_autocmd({ "ColorScheme", "VimEnter", "WinEnter", "BufEnter" }, { 305 | pattern = "*", 306 | callback = function() 307 | if vim.g.colours_name == "xcodedark" then 308 | vim.api.nvim_set_hl(0, "Cursor", { fg = colors.bg, bg = colors.cursor, blend = 0 }) 309 | vim.api.nvim_set_hl(0, "CursorVisual", { fg = colors.bg, bg = colors.cursor_visual, blend = 0 }) 310 | vim.api.nvim_set_hl(0, "TermCursor", { fg = colors.bg, bg = colors.cursor, blend = 0 }) 311 | end 312 | end, 313 | }) 314 | 315 | -- Apply font weight customizations 316 | -- Note: Since your terminal already has SF Mono configured, most text will 317 | -- automatically use SF Mono Light Medium. We only need to explicitly set 318 | -- bold for specific elements that should stand out. 319 | 320 | -- The bold elements are already configured in the syntax and treesitter files 321 | -- Comments remain with normal weight but italic 322 | end 323 | 324 | function M.setup(opts) 325 | opts = opts or {} 326 | M.load(opts) 327 | end 328 | 329 | -- Convenience function to get the color palette 330 | function M.get_colors() 331 | return require("xcodedark.colors") 332 | end 333 | 334 | return M 335 | --------------------------------------------------------------------------------