├── 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 |
10 |
11 | ### Elixir
12 |
13 |
14 | ### Typescript/React
15 |
16 |
17 | ### Java
18 |
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 |
--------------------------------------------------------------------------------