├── .gitattributes
├── .gitignore
├── .vscode
├── clarion.code-workspace
├── launch.json
└── tasks.json
├── .vscodeignore
├── CHANGELOG.md
├── LICENSE
├── Makefile
├── README.md
├── SPEC.md
├── icon.png
├── img
├── Clarion-Blue.jpg
├── Clarion-Orange.jpg
├── Clarion-Peach.jpg
├── Clarion-Red.jpg
├── Clarion-White.jpg
└── logo.png
├── mktheme
├── .vscode
│ └── settings.json
├── build_screenshots.go
├── build_themes.go
├── color_math.go
├── config.go
├── go.mod
├── go.sum
├── main.go
├── mktheme_conf.yml
├── screenshot_scripts
│ ├── change_theme.scpt.tmpl
│ ├── close_window.scpt
│ ├── colors.sh
│ └── prep_screenshots.scpt
├── spec.go
├── templates
│ ├── README.md.tmpl
│ ├── clarion-color-theme.json
│ ├── nvim
│ │ ├── autoload
│ │ │ └── lightline
│ │ │ │ └── colorscheme
│ │ │ │ └── gruvbox.vim
│ │ ├── colors
│ │ │ └── gruvbox.lua
│ │ └── lua
│ │ │ └── gruvbox
│ │ │ ├── groups.lua
│ │ │ ├── init.lua
│ │ │ ├── lightline.lua
│ │ │ └── palette.lua
│ └── package.json.tmpl
├── term_colors.go
└── theme.go
├── package.json
├── screenshot_themes.scpt
├── syntaxes
└── landmarks.tmLanguage.json
└── themes
├── clarion-color-theme-blue.json
├── clarion-color-theme-orange.json
├── clarion-color-theme-peach.json
├── clarion-color-theme-red.json
└── clarion-color-theme-white.json
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Set default behavior to automatically normalize line endings.
2 | * text=auto
3 |
4 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | *.vsix
3 | mktheme/mktheme
4 | .DS_Store
5 |
--------------------------------------------------------------------------------
/.vscode/clarion.code-workspace:
--------------------------------------------------------------------------------
1 | {
2 | "folders": [
3 | {
4 | "path": "."
5 | }
6 | ]
7 | }
--------------------------------------------------------------------------------
/.vscode/launch.json:
--------------------------------------------------------------------------------
1 | // A launch configuration that launches the extension inside a new window
2 | // Use IntelliSense to learn about possible attributes.
3 | // Hover to view descriptions of existing attributes.
4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5 | {
6 | "version": "0.2.0",
7 | "configurations": [
8 | {
9 | "name": "Test Clarion",
10 | "type": "extensionHost",
11 | "request": "launch",
12 | "args": [
13 | "${workspaceFolder}/mktheme",
14 | "--extensionDevelopmentPath=${workspaceFolder}",
15 | "--goto",
16 | "${workspaceFolder}/mktheme/build_themes.go:98:48"
17 | ],
18 | "preLaunchTask": "Watch Theme",
19 | "postDebugTask": "Terminate Tasks",
20 | },
21 | {
22 | "name": "Rebuild Theme and Screenshots",
23 | "type": "extensionHost",
24 | "request": "launch",
25 | "args": [
26 | "${workspaceFolder}/mktheme",
27 | "--extensionDevelopmentPath=${workspaceFolder}",
28 | "--goto",
29 | "${workspaceFolder}/mktheme/build_themes.go:98:63"
30 | ],
31 | "preLaunchTask": "Rebuild Everything",
32 | "postDebugTask": "Terminate Tasks",
33 | },
34 | {
35 | "name": "Debug mktheme",
36 | "type": "go",
37 | "request": "launch",
38 | "mode": "auto",
39 | "program": "${workspaceFolder}/mktheme",
40 | "args": [
41 | "${workspaceFolder}/SPEC.md"
42 | ],
43 | }
44 | ]
45 | }
--------------------------------------------------------------------------------
/.vscode/tasks.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "2.0.0",
3 | "tasks": [
4 | {
5 | "label": "Build mktheme",
6 | "type": "shell",
7 | "group": {
8 | "kind": "build",
9 | "isDefault": true
10 | },
11 | "options": {
12 | "cwd": "${workspaceFolder}/mktheme"
13 | },
14 | "command": "go",
15 | "args": [
16 | "build"
17 | ],
18 | "problemMatcher": [
19 | "$go"
20 | ]
21 | },
22 | {
23 | "label": "Watch Theme",
24 | "dependsOn": [
25 | "Build mktheme"
26 | ],
27 | "dependsOrder": "sequence",
28 | "type": "shell",
29 | "options": {
30 | "cwd": "${workspaceFolder}/mktheme",
31 | "env": {
32 | "CLARION_DEBUG": "1"
33 | }
34 | },
35 | "isBackground": true,
36 | "command": "./mktheme",
37 | "args": [
38 | "-watch",
39 | "../SPEC.md"
40 | ],
41 | "problemMatcher": {
42 | "owner": "mktheme",
43 | "fileLocation": [
44 | "relative",
45 | "${workspaceFolder}"
46 | ],
47 | "pattern": {
48 | "regexp": "^mktheme error:"
49 | },
50 | "background": {
51 | "activeOnStart": true,
52 | "beginsPattern": "building themes...",
53 | "endsPattern": "complete!"
54 | }
55 | }
56 | },
57 | {
58 | "label": "Rebuild Everything",
59 | "dependsOn": [
60 | "Build mktheme"
61 | ],
62 | "dependsOrder": "sequence",
63 | "type": "shell",
64 | "options": {
65 | "cwd": "${workspaceFolder}/mktheme",
66 | "env": {
67 | "CLARION_DEBUG": "1"
68 | }
69 | },
70 | "isBackground": true,
71 | "command": "./mktheme",
72 | "args": [
73 | "-makeshots",
74 | "../SPEC.md",
75 | ".."
76 | ],
77 | "problemMatcher": {
78 | "owner": "mktheme",
79 | "fileLocation": [
80 | "relative",
81 | "${workspaceFolder}"
82 | ],
83 | "pattern": {
84 | "regexp": "^mktheme error:"
85 | },
86 | "background": {
87 | "activeOnStart": true,
88 | "beginsPattern": "building themes...",
89 | "endsPattern": "complete!"
90 | }
91 | }
92 | },
93 | {
94 | "label": "colors",
95 | "type": "shell",
96 | "options": {
97 | "cwd": "${workspaceFolder}/build"
98 | },
99 | "isBackground": false,
100 | "command": "./colors.sh",
101 | "problemMatcher": []
102 | },
103 | {
104 | "label": "Terminate Tasks",
105 | "command": "echo ${input:terminate}",
106 | "type": "shell",
107 | "problemMatcher": []
108 | }
109 | ],
110 | "inputs": [
111 | {
112 | "id": "terminate",
113 | "type": "command",
114 | "command": "workbench.action.tasks.terminate",
115 | "args": "terminateAll"
116 | }
117 | ]
118 | }
--------------------------------------------------------------------------------
/.vscodeignore:
--------------------------------------------------------------------------------
1 | .vscode/**
2 | .vscode-test/**
3 | .gitignore
4 | vsc-extension-quickstart.md
5 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Change Log
2 |
3 | All notable changes to the "clarion" extension will be documented in this file.
4 |
5 | Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file.
6 |
7 | ## [Unreleased]
8 |
9 | - Initial release
10 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2020 Andrew Walker
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.
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | ROOT_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
2 | CHDIR_SHELL := $(SHELL)
3 | define chdir
4 | $(eval _D=$(firstword $(1) $(@D)))
5 | $(info $(MAKE): cd $(_D)) $(eval SHELL = cd $(_D); $(CHDIR_SHELL))
6 | endef
7 |
8 | .PHONY: all
9 | all : buildtheme screenshots clean
10 |
11 | .PHONY: buildtheme
12 | buildtheme :
13 | cd mktheme; go run . ../SPEC.md; cd $(ROOT_DIR)
14 |
15 | .PHONY: pkg
16 | pkg :
17 | vsce package -o clarion.vsix
18 |
19 |
20 | .PHONY: screenshots
21 | screenshots : pkg
22 | docker run --rm -t \
23 | -v $(ROOT_DIR)/img:/home/codeuser/shots \
24 | -v $(ROOT_DIR)/clarion.vsix:/home/codeuser/extensions/clarion.vsix \
25 | -v $(ROOT_DIR):/home/codeuser/code \
26 | flowchartsman/vscode-docker-screenshots \
27 | ./makeshots --samplefile mktheme/theme.go --fileline 273 \
28 | "Clarion White,Clarion-White.jpg" \
29 | "Clarion Blue,Clarion-Blue.jpg" \
30 | "Clarion Orange,Clarion-Orange.jpg" \
31 | "Clarion Peach,Clarion-Peach.jpg" \
32 | "Clarion Red,Clarion-Red.jpg"
33 |
34 |
35 | .PHONY: clean
36 | clean :
37 | rm clarion.vsix
38 |
39 | .PHONY: install_local
40 | install_local : pkg
41 | code --install-extension clarion.vsix
42 | rm clarion.vsix
43 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Clarion - A Monochrome Theme Inspired By 🧑🔬
2 | 
3 |
4 | Clarion is a mostly-monochromatic, minimally-highlighted colorscheme, clearing
5 | away the rainbow madness and allowing you to concentrate on what matters the
6 | most: your code.
7 |
8 |
10 |
12 |
14 |
16 |
18 |
19 | ## Guiding Principles
20 |
21 | ### Readability is Paramount
22 | Programmers spend the majority of their careers looking at text. Your eyes are an important resource, so a good theme should be as readable as possible, minimizing eyestrain and maximizing comprehension. Research overwhelmingly suggests that no single background color is better or worse for readability, so long as an good contrast ratio is maintained with monochromatic text.
23 |
24 | *See [the specification](SPEC.md) for more information.*
25 |
26 | ### Minimal Syntax Highlighting
27 | If everything is important, nothing is! Color is an important tool for conveying important information, but the more it's used, the less meaningful it becomes. There are only a finite amount of colors you can distinguish easily, and the more syntax elements that get a color, the greater the chance of overlap, and the less it will mean. Clarion tries to avoid using color as much as possible, concentrating instead on carefully-chosen font weights for certain landmark elements to help you orient yourself in your ccode.
28 |
29 | As semantic highlighting and advanced language server features become more prevelant, Clarion will embrace this preferentially insofar as it is not distracting.
30 |
31 | ### Spec-Driven
32 | A specification keeps things centralized and consistent. Inspired by the [Dracula](https://draculatheme.com/) [Theme's specification](https://spec.draculatheme.com/). Clarion is driven by a [similar spec](SPEC.md), and in fact uses this doc to generate the theme itself, making the spec the source of truth.
33 |
34 | ### Conceptual Palette
35 | Rather than simply picking values from a color palette and arbitrarily assigning them to syntax or UI elements, Clarion seeks to define a "conceptual palette", where each color has a specific meaning that applies consistently across contexts.
36 |
37 | If you see `problem`, there is a serious problem of some kind within that context. Similarly, if you see `new`, something has been added or is otherwise "new". Correspondingly, if something doesn't have a spceial meaning, it will not have a color.
38 |
39 | ## Status
40 | Clarion is an untested proof-of-concept, and very much a work in progress. The specification is very bare-bones and its format and content will likely change as more values are codified into it. These include such things that currently only exist in templates or the spec generation code, such as editor-specific styling identifiers.
41 |
42 | The current stable target is a published VSCoce colorscheme in the Visual Studio marketplace. This alone is a large undertaking, since there are hundreds of different color directives in VSCode, many of which are derivied or are simple alpha deltas, so care must be taken to exhaustively specify as many of these as possible to avoid "surprise" colors that are inconsistent with the goal of a very limited palette.
43 |
44 | For this reason, creating themes for other editors is beyond the current scope and will rely on more tooling for spec extraction and templating. Community contributions are very much desired, and Go template functions already exist to render hex values as well as 256-color terminal approximations.
45 |
46 | It is still an open question as to whether the "conceptual palette" is a meaningful abstraction and how well it conforms to what science tells us about color and reading comprehension.
47 |
48 | While the primary source work that Clarion is based off of targeted Dyslexia, more research on visual ergonomics should be explored, and other disabilities related to reading comprehension, such as colorblindness, should be accomodated as much as possible.
49 |
50 | ## Development/Contributing
51 | TBD.
52 |
--------------------------------------------------------------------------------
/SPEC.md:
--------------------------------------------------------------------------------
1 | # Clarion Spec
2 | This is the specification for Clarion. This file is parsed to generate the color scheme, and so represents the current state of the theme.
3 |
4 | It is based on an interpretation of the best research available to the author at the time of this writing.
5 |
6 | ## Background Colors
7 | Research overwhelmingly suggests that contrast, not color is the primary factor in readbility and retention.[[1]] Black text on a white background provides the greatest contrast, so this is Clarion's primary theme choice.
8 |
9 | So long as contrast is maintained, studies indicate that background hue has minimal to no impact on reading performance[[2]], so a variety of background hues are provided across the color wheel to suit user prefecence.
10 |
11 | ### White
12 | * Swatch: 
13 | * Hex: #ffffff
14 |
15 | Clarion's primary background color. Provides the highest contrast.
16 |
17 | ### Orange
18 | * Swatch: 
19 | * Hex: #fff1d6
20 |
21 | ### Red
22 | * Swatch: 
23 | * Hex: #ffebeb
24 |
25 | ### Blue
26 | * Swatch: 
27 | * Hex: #ebf3ff
28 |
29 | ### Peach
30 | * Swatch: 
31 | * Hex: #edd1b0
32 |
33 | Secondary color "Peach" taken from the paper **Good Background Colors for Readers: A Study of People with and without Dyslexia**. Peach was listed highest in both test groups.[[3]]
34 |
35 | ## Foreground Colors
36 |
37 | Black was chosen as the primary foreground color for its ubiqity and contrast.
38 |
39 | ### Black
40 | * Swatch: 
41 | * Hex: #000000
42 |
43 | ### LightFG
44 |
45 | LightFG is generated by calling the contrast-levels generation function with the background as both arguments, generating a WCAG-AA(minumum) contrast color based on the background.
46 |
47 | ## Color Contrast
48 |
49 | At the time of this writing (Feb, 2022), the W3C Web Content Accessibility Guidelines (WCAG version 2.1) are the canonical source Clarion uses for determining an acceptable level of text:background contrast.[[4]] Of relevance to color schemes are the following success critereon:
50 |
51 | * 1.4.3 - Contrast (Minimum) for text and images of text (Level AA)
52 | * 1.4.6 - Contrast (Enhanced) for text and images of text (Level AAA)
53 | * 1.4.11 - Non-text Contrast
54 |
55 | Compliance requirements define "minumum" (AA) and "enhanced" (AAA) text:background contrast ratios:
56 |
57 | * Text (Minumum - AA): 4.5:1
58 | * Text (Maxumum - AAA): 7:1
59 | * Non-text: 3:1
60 |
61 | Because text at both text contrast ratios can be difficult to distinguish from the FG color, Clarion makes every effort to restrict color usage to badges and graphical elements, which can use the much more permissive non-text contrast ratio.
62 |
63 | [//]: # "TODO: include when high-contrast themes are implemented: AAA is the most restrictive, defining a minimum text:background contrast ratio of 7:1, however this means that colors will be much closer to black, and potentially difficult to distinguish... TODO: implementation"
64 |
65 | ### Ratio Calculation
66 |
67 | These ratios are determined using the formula:
68 |
69 | `(L1 + 0.05) / (L2 + 0.05)`
70 |
71 | Where L1 and L2 are the base luminance values of the lighter and darker colors, respectively.[[40]].
72 |
73 | ### Base Luminance Calculation
74 |
75 | Base luminance, in turn, is calculated in the sRGB colorspace using the following formula:
76 |
77 | `L = 0.2126 * R + 0.7152 * G + 0.0722 * B`
78 |
79 | Where component values are calculated first by determining the sRGB value using the underlying 8-bit representation such that:
80 |
81 | ` = /255`
82 |
83 | Then assigned a value based off of the following table:
84 |
85 | | If `sRGB <= 0.03928` | Otherwise |
86 | |-------------------------------------------|----------------------------------------------------------|
87 | | `component = sRGB/12.92` | `component = ((sRGB+0.055)/1.055) ^ 2.4` |
88 |
89 | ## Color Permutations
90 | * ΔETarget: 3
91 | * LStep: 0.005
92 | * Variations: 4
93 |
94 | To generate lighter or darker variants, colors are translated along the L (lightniess) axis of the CIELAB color space until they are "noticeably different", as measured by the CIE Distance metric ΔE* derived using CIEDE2000.[[5]][[6]]
95 |
96 | A ΔE* of 1.0 is described as a "just noticable difference" (JND), so Clarion opts for a higher target **ΔETarget** in an attempt to provide greater distinctions. Currently this is done by increasing or decreasing the L value by **LStep** until ΔE* to the prior color meets or exceeds **ΔETarget**.
97 |
98 | Background colors get **Variations** lighter variants and **Variations** darker ones. Foreground colors get **Variations** lighter variants.
99 |
100 | ## Conceptual Colors
101 | TODO: Derivation
102 |
103 | * Restrictions: WCAG Standard - AA
104 | * Font Size: 18px
105 | * Font Weight: 400
106 |
107 | ### Problem
108 | * Swatch: 
109 | * Sample: 
110 | * Hex: #b50000
111 |
112 | #### Rationale
113 | TBD
114 |
115 | #### Example Usage
116 | * errors
117 | * fatal problems
118 |
119 | ### Notice
120 | * Swatch: 
121 | * Sample: 
122 | * Hex: #804600
123 |
124 | #### Rationale
125 | TBD
126 |
127 | #### Example Usage
128 | * notable warnings
129 | * failed tests
130 |
131 | ### New
132 | * Swatch: 
133 | * Sample: 
134 | * Hex: #4b6319
135 |
136 | #### Rationale
137 | TBD
138 |
139 | #### Example Usage
140 | * Diff additions
141 | * Untracked files
142 |
143 | ### Modified
144 | * Swatch: 
145 | * Sample: 
146 | * Hex: #3a599b
147 |
148 | #### Rationale
149 | TBD
150 |
151 | #### Example Usage
152 | * Diff modifications
153 | * modified files
154 |
155 | ### Excluded
156 | * Swatch: 
157 | * Sample: 
158 | * Hex: #886288
159 |
160 | #### Rationale
161 | TBD
162 |
163 | #### Example Usage
164 | * Ignored files
165 | * Diff removals
166 | * Skipped tests
167 |
168 | ## Terminal Colors
169 |
170 | Bright terminal colors are based on the following values, and are then darkened until minimal test contrast is reached. Dark terminal colors are derived by applying `ΔETarget`.
171 |
172 | The only exception is Bright Black, which applies a ΔETarget of 2 upwards against black, and then sanity checks the contrast against the darkest background color.
173 |
174 | ### Red
175 | * Swatch: 
176 | * Hex: #ff0000
177 |
178 | ### Green
179 | * Swatch: 
180 | * Hex: #00ff00
181 |
182 | ### Yellow
183 | * Swatch: 
184 | * Hex: #ffff00
185 |
186 | ### Blue
187 | * Swatch: 
188 | * Hex: #0000ff
189 |
190 | ### Magenta
191 | * Swatch: 
192 | * Hex: #ff00ff
193 |
194 | ### Cyan
195 | * Swatch: 
196 | * Hex: #00ffff
197 |
198 | ### White
199 | * Swatch: 
200 | * Hex: #ffffff
201 |
202 | ## Outstanding Issues
203 |
204 | ### Background Color Adjustement
205 | Because background colors are adjusted using steps in the CIELAB L(lightness) dimension, the results do not always map to the RGB color space, and must be "clamped", which is lossy. It's probably better to make adjustments in another color space.
206 |
207 | ### Semantic Color Consistency
208 | It is a well-known phenomenon that different colors appear differently against varying color backgrounds. This is known as "simultaneous color contrast". [[7]][[8]] Because conceptual colors are an important principle of Clarion's design, it would be ideal to programmatically correct for this in background variations. If a good technique for this is available, it should be implemented.
209 |
210 | ### Semantic Palette Derivation
211 | While the distribution of the Conceptual Palette colors in the CIELAB space is derived from research, the Colorgorical implementation used is not deterministic, and the current color palette was derived through trial-and error and choices are fiat from the author's (Andy Walker) own ideas about what concepts are important. Therefore, personal bias towards "notable concepts" and "good concept:color concordance" played a significant role in the selection of the current conceptual palette, making this by far the weakest part of the spec with respect to actual science. It would be better to generate them automatically somehow, such as is done in the medialab.io "iwanthue" implementation.[[9]]
212 |
213 | Colors were formerly based off of **Colorgorical: Creating discriminable and preferable color palettes for information visualization** paper, using the online implementation with all sliders maxed out.[[10]][[11]], and this work should be revisited if the conceptual paletted needs additions or to be systemitized further.
214 |
215 | ## Caveats
216 | I (Andy Walker) am not an expert in ergonomics, reading comprehension, color theory or related disciplines. I'm just a programmer interpreting the work of actual experts.
217 |
218 | I welcome all forms of feedback, informed correction and collaboration with actual experts in the relevant fields, and will readily incorporate suggested changes to this specification, and grant primary credit for any contributions. All I care about is having the most informed colorscheme possible to ease the life of my fellow programmers and anyone who needs to stare at text all day.
219 |
220 | ## Links and Citations
221 | [[1]] Hall, R. H. & Hanna, P. (2004). The Impact of Web Page Text-Background Colour Combinations on Readability, Retention, Aesthetics and Behavioural Intention. Behaviour & Information Technology, 23(1), 183-195.
222 | [(alternate source)](https://tecfa.unige.ch/tecfa/maltt/cosys-2/textes/hall04.pdf)
223 |
224 | [[2]] Knoblauch et al. (1991). Effect of Vhromatic and Luminance Contrast on Reading. Journal of the Optical Society of America. A, Optics and image science 8(2), 428-439.
225 |
226 | [[3]] Rello, L. & Bigham, J. P. (2017). Good Background Colors for Readers: A Study of People with and without Dyslexia. Proceedings of the 19th International ACM SIGACCESS Conference on Computers and Accessibility, 72-89.
227 | [(alternate source)](https://www.cs.cmu.edu/~jbigham/pubs/pdfs/2017/colors.pdf)
228 |
229 | [[4]] WCAG 2.1 Success Criteria - W3C Web Accessibility Initiative (WAI)
230 |
231 | [[40]] WCAG 2.1 Understanding Success Criterion 1.4.3: Contrast (Minimum) - W3C Web Accessibility Initiative (WAI)
232 |
233 | [[5]] Wikiepedia Page on Color difference - Section on ΔE*
234 |
235 | [[6]] Wikiepedia Page on Color difference - Section on the CIEDE2000 formula for calculating ΔE*
236 |
237 | [[7]] Simultaneous and Successive Contrast - Color Usage Research Lab, Nasa Ames Research Center
238 |
239 | [[8]] Color Discrimination and Identification - Color Usage Research Lab, Nasa Ames Research Center
240 |
241 | [[9]] iwanthue - Colors for data scientists. - https://medialab.github.io/iwanthue/
242 |
243 | [[10]] Gramazio, C. C. et al. (2016). Colorgorical: Creating discriminable and preferable color palettes for information visualization. IEEE Transactions on Visualization and Computer Graphics, 23(1), 521-530. [(alternate source)](http://vrl.cs.brown.edu/color/pdf/colorgorical.pdf)
244 |
245 | [[11]] http://vrl.cs.brown.edu/color
246 |
247 | [1]: https://doi.org/10.1080/01449290410001669932
248 | [2]: http://dx.doi.org/10.1364/JOSAA.8.000428
249 | [3]: https://doi.org/10.1145/3132525.3132546
250 | [4]: https://www.w3.org/TR/WCAG21/
251 | [40]: https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum.html#dfn-contrast-ratio
252 | [5]: https://en.wikipedia.org/wiki/Color_difference#CIELAB_%CE%94E*
253 | [6]: https://en.wikipedia.org/wiki/Color_difference#CIEDE2000
254 | [7]: https://colorusage.arc.nasa.gov/Simult_and_succ_cont.php
255 | [8]: https://colorusage.arc.nasa.gov/discrim.php
256 | [9]: https://medialab.github.io/iwanthue/
257 | [10]: https://doi.org/10.1109/TVCG.2016.2598918
258 | [11]: http://vrl.cs.brown.edu/color
259 |
--------------------------------------------------------------------------------
/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/flowchartsman/clarion/a3421591e9ca30024843f601c9b33843ecbc8636/icon.png
--------------------------------------------------------------------------------
/img/Clarion-Blue.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/flowchartsman/clarion/a3421591e9ca30024843f601c9b33843ecbc8636/img/Clarion-Blue.jpg
--------------------------------------------------------------------------------
/img/Clarion-Orange.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/flowchartsman/clarion/a3421591e9ca30024843f601c9b33843ecbc8636/img/Clarion-Orange.jpg
--------------------------------------------------------------------------------
/img/Clarion-Peach.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/flowchartsman/clarion/a3421591e9ca30024843f601c9b33843ecbc8636/img/Clarion-Peach.jpg
--------------------------------------------------------------------------------
/img/Clarion-Red.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/flowchartsman/clarion/a3421591e9ca30024843f601c9b33843ecbc8636/img/Clarion-Red.jpg
--------------------------------------------------------------------------------
/img/Clarion-White.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/flowchartsman/clarion/a3421591e9ca30024843f601c9b33843ecbc8636/img/Clarion-White.jpg
--------------------------------------------------------------------------------
/img/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/flowchartsman/clarion/a3421591e9ca30024843f601c9b33843ecbc8636/img/logo.png
--------------------------------------------------------------------------------
/mktheme/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "editor.rulers": [80,120]
3 | }
--------------------------------------------------------------------------------
/mktheme/build_screenshots.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bytes"
5 | "fmt"
6 | "html/template"
7 | "io"
8 | "os/exec"
9 | "path/filepath"
10 | "strings"
11 | "time"
12 | )
13 |
14 | type cmdRunner struct {
15 | cmdNumber int
16 | pause time.Duration
17 | err error
18 | }
19 |
20 | func newCmdRunner(pause time.Duration) *cmdRunner {
21 | return &cmdRunner{
22 | cmdNumber: 0,
23 | pause: pause,
24 | }
25 | }
26 |
27 | func (c *cmdRunner) runWithInput(input []byte, cmd string, args ...string) *cmdRunner {
28 | if c.err == nil {
29 | ec := exec.Command(cmd, args...)
30 | inpipe, err := ec.StdinPipe()
31 | if err != nil {
32 | c.err = err
33 | return c
34 | }
35 | if input != nil {
36 | go func() {
37 | io.Copy(inpipe, bytes.NewReader(input))
38 | inpipe.Close()
39 | }()
40 | }
41 | cmdStr := cmd + " " + strings.Join(args, " ")
42 | themeDebug("run: %s", cmdStr)
43 | if err := ec.Run(); err != nil {
44 | output, _ := ec.CombinedOutput()
45 | outputStr := string(output)
46 | if outputStr == "" {
47 | outputStr = ""
48 | }
49 | c.err = fmt.Errorf("command `%s` failed: %s - %s", cmdStr, err, outputStr)
50 | } else {
51 | time.Sleep(c.pause)
52 | }
53 | }
54 | return c
55 | }
56 |
57 | func (c *cmdRunner) run(cmd string, args ...string) *cmdRunner {
58 | return c.runWithInput(nil, cmd, args...)
59 | }
60 |
61 | func (c *cmdRunner) Err() error {
62 | return c.err
63 | }
64 |
65 | func buildScreenshots(spec *spec, outputPath string) error {
66 | tmpl, err := template.New("").ParseFiles(`screenshot_scripts/change_theme.scpt.tmpl`)
67 | if err != nil {
68 | return err
69 | }
70 | themescripts := make([][]byte, 0, len(spec.themeBases))
71 | for _, base := range spec.themeBases {
72 | // generate the individual keystrokes needed to change the theme
73 | themechars := strings.Split(base, "")
74 | var buf bytes.Buffer
75 | if err := tmpl.ExecuteTemplate(&buf, "change_theme.scpt.tmpl", map[string][]string{"themechars": themechars}); err != nil {
76 | return err
77 | }
78 | themescripts = append(themescripts, buf.Bytes())
79 | }
80 | themeLog("waiting for a moment for debug session to start...")
81 | time.Sleep(5 * time.Second)
82 | themeLog("prepping for screenshots...")
83 | c := newCmdRunner(2 * time.Second)
84 | c.run("osascript", "screenshot_scripts/prep_screenshots.scpt")
85 | themeLog("generating screenshots...")
86 | for i, s := range themescripts {
87 | c.runWithInput(s, "osascript")
88 | // need to run it twice for some reason sometimes. vscode debug extension bug maybe?
89 | c.runWithInput(s, "osascript")
90 | screenshotFilename := "img/Clarion-" + spec.themeBases[i] + ".jpg"
91 | c.run("screencapture", "-x", "-R0,23,1300,900", filepath.Join(outputPath, screenshotFilename))
92 | }
93 | c.run("osascript", "screenshot_scripts/close_window.scpt")
94 | if c.Err() != nil {
95 | return c.Err()
96 | }
97 | themeLog("done!")
98 | return nil
99 | }
100 |
--------------------------------------------------------------------------------
/mktheme/build_themes.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bufio"
5 | "fmt"
6 | "html/template"
7 | "io"
8 | "os"
9 | "path/filepath"
10 | "regexp"
11 | "sort"
12 | )
13 |
14 | type ThemePkg struct {
15 | Version string
16 | ThemeContribs []ThemeContrib
17 | }
18 |
19 | type ThemeContrib struct {
20 | Label string
21 | File string
22 | }
23 |
24 | func buildThemes(config *MkthemeConfig, spec *spec) error {
25 | pkg := &ThemePkg{
26 | Version: config.themeVersion,
27 | }
28 |
29 | // get all theme themes
30 | themes, err := generateVariants(config, spec)
31 | if err != nil {
32 | return err
33 | }
34 | // for targets
35 | // do the different generation types here
36 |
37 | for _, theme := range themes {
38 | // do the different generation
39 | themeFilename := fmt.Sprintf("clarion-color-theme-%s.json", theme.Variant)
40 | pkg.ThemeContribs = append(pkg.ThemeContribs, ThemeContrib{
41 | Label: theme.ThemeName,
42 | File: themeFilename,
43 | })
44 | outPath := filepath.Join(config.themeRoot, "themes", themeFilename)
45 | outFile, err := newFileWriter(outPath)
46 | if err != nil {
47 | return fmt.Errorf("unable to create output file %q: %v", outPath, err)
48 | }
49 | tmpl, err := template.New("").ParseFiles("templates/clarion-color-theme.json")
50 | if err != nil {
51 | return fmt.Errorf("template parse error: %v", err)
52 | }
53 | //
54 | if err := tmpl.ExecuteTemplate(outFile, "clarion-color-theme.json", theme); err != nil {
55 | return fmt.Errorf("template execution error: %v", err)
56 | }
57 | outFile.Close()
58 | }
59 | pkgPath := filepath.Join(config.themeRoot, "package.json")
60 | outPkg, err := os.Create(pkgPath)
61 | if err != nil {
62 | return fmt.Errorf("unable to create package output file %q: %v", pkgPath, err)
63 | }
64 | defer outPkg.Close()
65 | tmpl, err := template.New("").ParseFiles("templates/package.json.tmpl")
66 | if err != nil {
67 | return fmt.Errorf("package template parse error: %v", err)
68 | }
69 | if err := tmpl.ExecuteTemplate(outPkg, "package.json.tmpl", pkg); err != nil {
70 | return fmt.Errorf("package template execution error: %v", err)
71 | }
72 | // generate readme
73 | previews := []map[string]string{}
74 | for _, base := range spec.themeBases {
75 | previews = append(previews, map[string]string{
76 | "themename": "Clarion " + base,
77 | "screenshot": fmt.Sprintf("Clarion-%s.jpg", base),
78 | })
79 | }
80 | sort.Slice(previews, func(i, j int) bool {
81 | if previews[i]["themename"] == "Clarion White" {
82 | return true
83 | }
84 | if previews[j]["themename"] == "Clarion White" {
85 | return false
86 | }
87 | return previews[i]["themename"] < previews[j]["themename"]
88 | })
89 |
90 | readmeData := map[string]interface{}{
91 | "previews": previews,
92 | "baseTheme": themes[0],
93 | }
94 | tmpl, err = template.New("").ParseFiles(`templates/README.md.tmpl`)
95 | if err != nil {
96 | return err
97 | }
98 | readmeout, err := os.Create(filepath.Join(config.themeRoot, "README.md"))
99 | if err != nil {
100 | return err
101 | }
102 | defer readmeout.Close()
103 | if err := tmpl.ExecuteTemplate(readmeout, "README.md.tmpl", readmeData); err != nil {
104 | return err
105 | }
106 | return nil
107 | }
108 |
109 | var commentLine = regexp.MustCompile(`^\s*//`)
110 |
111 | func newFileWriter(outputFile string) (io.WriteCloser, error) {
112 | output, err := os.Create(outputFile)
113 | if err != nil {
114 | return nil, err
115 | }
116 | pr, pw := io.Pipe()
117 | go func() {
118 | s := bufio.NewScanner(pr)
119 | for s.Scan() {
120 | if commentLine.MatchString(s.Text()) {
121 | continue
122 | }
123 | output.WriteString(s.Text() + "\n")
124 | }
125 | if err != nil {
126 | panic("scanner: " + err.Error())
127 | }
128 | if err := output.Close(); err != nil {
129 | panic("closing file: " + err.Error())
130 | }
131 | }()
132 | return pw, nil
133 | }
134 |
--------------------------------------------------------------------------------
/mktheme/color_math.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 |
6 | "github.com/lucasb-eyer/go-colorful"
7 | )
8 |
9 | type adjustmentDirection int
10 |
11 | const (
12 | _ adjustmentDirection = iota
13 | lighter
14 | darker
15 | )
16 |
17 | // func rev(s []string) {
18 | // for i := len(s)/2 - 1; i >= 0; i-- {
19 | // opp := len(s) - 1 - i
20 | // s[i], s[opp] = s[opp], s[i]
21 | // }
22 | // }
23 |
24 | func sRGBLuminance(color colorful.Color) float64 {
25 | r, g, b := color.LinearRgb()
26 | return 0.2126*r + 0.7152*g + 0.0722*b
27 | }
28 |
29 | func contrast(c1 colorful.Color, c2 colorful.Color) float64 {
30 | l1 := sRGBLuminance(c1)
31 | l2 := sRGBLuminance(c2)
32 | if l2 > l1 {
33 | l1, l2 = l2, l1
34 | }
35 | return (l1 + 0.05) / (l2 + 0.05)
36 | }
37 |
38 | const lStep = 0.001
39 |
40 | func getContrastingColors(bg, fg colorful.Color) (ui, minimum, enhanced colorful.Color) {
41 | current := fg
42 | targetContrasts := [3]float64{3.0, 4.5, 7}
43 | outputs := [3]*colorful.Color{&ui, &minimum, &enhanced}
44 | levelStr := [3]string{"ui", "minimum", "maximum"}
45 | for i := 0; i < 3; i++ {
46 | for contrast(bg, current) < targetContrasts[i] {
47 | if current.R == 0 && current.G == 0 && current.B == 0 {
48 | themeDebug("fg color has bottomed out bg[%s] fg[%s] variant[%s]", bg.Hex(), fg.Hex(), levelStr[i])
49 | for ii := i; ii < 3; ii++ {
50 | *outputs[ii] = current
51 | }
52 | return
53 | }
54 | h, s, l := current.HSLuv()
55 | l -= lStep
56 | current = colorful.HSLuv(h, s, l)
57 | }
58 | *outputs[i] = current
59 | }
60 | return
61 | }
62 |
63 | // CIELAB ΔE* is the latest iteration of the CIE's color distance function, and
64 | // is intended to meaure the perceived distance between two colors, where a
65 | // value of 1.0 represents a "just noticeable difference".
66 | // ref: https://en.wikipedia.org/wiki/Color_difference#CIEDE2000
67 |
68 | func generateBrightnessVariations(baseColor colorful.Color, numVariations int, ΔETarget float64, LStep float64, direction adjustmentDirection) (variations []colorful.Color, err error) {
69 | variations = make([]colorful.Color, numVariations)
70 | lastVariation := baseColor
71 | for i := 0; i < numVariations; i++ {
72 | variation := lastVariation
73 | var distance float64
74 | for distance < ΔETarget {
75 | l, a, b := variation.Lab()
76 | if direction == lighter {
77 | l += LStep
78 | } else {
79 | l -= LStep
80 | }
81 | switch {
82 | case l >= 100:
83 | return nil, fmt.Errorf("overflow L for variant %d", i)
84 | case l <= 0:
85 | return nil, fmt.Errorf("underflow L for variant %d", i)
86 | }
87 | variation = colorful.Lab(l, a, b)
88 | distance = lastVariation.DistanceCIEDE2000(variation)
89 | }
90 | if !variation.IsValid() {
91 | variation = variation.Clamped()
92 | }
93 | variations[i] = variation
94 | lastVariation = variation
95 | }
96 | return variations, nil
97 | }
98 |
99 | func getNextBrightest(baseColor colorful.Color, ΔETarget float64, LStep float64) (colorful.Color, error) {
100 | brigherColors, err := generateBrightnessVariations(baseColor, 1, ΔETarget, LStep, lighter)
101 | if err != nil {
102 | return colorful.Color{}, err
103 | }
104 | return brigherColors[0], nil
105 | }
106 |
107 | func getNextDarkest(baseColor colorful.Color, ΔETarget float64, LStep float64) (colorful.Color, error) {
108 | darkerColors, err := generateBrightnessVariations(baseColor, 1, ΔETarget, LStep, darker)
109 | if err != nil {
110 | return colorful.Color{}, err
111 | }
112 | return darkerColors[0], nil
113 | }
114 |
--------------------------------------------------------------------------------
/mktheme/config.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bytes"
5 | "fmt"
6 | "os"
7 | "os/exec"
8 | "strings"
9 |
10 | "gopkg.in/yaml.v3"
11 | )
12 |
13 | type MkthemeConfig struct {
14 | themeRoot string
15 | themeVersion string
16 | Targets []TemplateTarget `yaml:"targets"`
17 | }
18 |
19 | type templateMode string
20 |
21 | const (
22 | ModeSimple templateMode = "simple"
23 | ModeMulti templateMode = "multi"
24 | ModeTree templateMode = "tree"
25 | )
26 |
27 | type TemplateTarget struct {
28 | Mode templateMode `yaml:"mode"`
29 | Input string `yaml:"input"`
30 | Output string `yaml:"output"`
31 | }
32 |
33 | func loadConfig() (*MkthemeConfig, error) {
34 | var config MkthemeConfig
35 | configFile, err := os.Open("mktheme_conf.yml")
36 | if err != nil {
37 | themeLogFatal(fmt.Errorf("loading config: %v", err))
38 | if err := yaml.NewDecoder(configFile).Decode(&config); err != nil {
39 | themeLogFatal(fmt.Errorf("invalid config: %v", err))
40 | }
41 | configFile.Close()
42 | }
43 | config.themeRoot = mustOutput("git", "rev-parse", "--show-toplevel")
44 | config.themeVersion = mustOutput("git", "describe", "--tags")
45 | return &config, nil
46 | }
47 |
48 | func mustOutput(command ...string) string {
49 | cmd := exec.Command(command[0], command[1:]...)
50 | cmdOut, err := cmd.CombinedOutput()
51 | if err != nil {
52 | themeLogFatal(fmt.Errorf(`error while running "%s": %v`, strings.Join(command, " "), err))
53 | }
54 | s := string(bytes.TrimSpace(cmdOut))
55 | if s == "" {
56 | themeLogFatal(fmt.Errorf(`output from "%s" is empty, expected result`, strings.Join(command, " ")))
57 | }
58 | return s
59 | }
60 |
--------------------------------------------------------------------------------
/mktheme/go.mod:
--------------------------------------------------------------------------------
1 | module github.com/flowchartsman/clarion-theme/mktheme
2 |
3 | go 1.16
4 |
5 | require (
6 | github.com/lucasb-eyer/go-colorful v1.2.0
7 | github.com/radovskyb/watcher v1.0.7
8 | gopkg.in/yaml.v3 v3.0.1
9 | )
10 |
--------------------------------------------------------------------------------
/mktheme/go.sum:
--------------------------------------------------------------------------------
1 | github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
2 | github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
3 | github.com/radovskyb/watcher v1.0.7 h1:AYePLih6dpmS32vlHfhCeli8127LzkIgwJGcwwe8tUE=
4 | github.com/radovskyb/watcher v1.0.7/go.mod h1:78okwvY5wPdzcb1UYnip1pvrZNIVEIh/Cm+ZuvsUYIg=
5 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
6 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
7 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
8 |
--------------------------------------------------------------------------------
/mktheme/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "flag"
5 | "log"
6 | "os"
7 | "strings"
8 | "time"
9 |
10 | "github.com/radovskyb/watcher"
11 | //"text/template"
12 | )
13 |
14 | var doDebug bool
15 |
16 | func themeLog(format string, v ...interface{}) {
17 | log.Printf("mktheme: "+format, v...)
18 | }
19 |
20 | func themeDebug(format string, v ...interface{}) {
21 | if doDebug {
22 | themeLog(format, v...)
23 | }
24 | }
25 |
26 | func themeLogErr(format string, v ...interface{}) {
27 | log.Printf("mktheme error: "+format, v...)
28 | }
29 |
30 | func themeLogFatal(err error) {
31 | log.Fatalf("mktheme error: %s", err)
32 | }
33 |
34 | func main() {
35 | log.SetFlags(0)
36 | dbg := strings.ToLower(os.Getenv("CLARION_DEBUG"))
37 | switch dbg {
38 | case "y", "yes", "true", "1":
39 | doDebug = true
40 | }
41 | var watchFiles bool
42 | var makeScreenshots bool
43 | flag.BoolVar(&watchFiles, "watch", false, "watch files for changes and rebuild theme")
44 | flag.BoolVar(&makeScreenshots, "makeshots", false, "make the screenshots using applescript")
45 | if watchFiles && makeScreenshots {
46 | log.Fatalf("cannot use -watch and -makeshots together")
47 | }
48 | flag.Parse()
49 | if len(flag.Args()) != 1 {
50 | log.Fatalf("usage: mktheme ")
51 | }
52 | specPath := flag.Args()[0]
53 | spec, err := loadSpec(specPath)
54 | if err != nil {
55 | log.Fatalf("error loading specification: %s", err)
56 | }
57 |
58 | config, err := loadConfig()
59 | if err != nil {
60 | log.Fatalf("loading config: %v", err)
61 | }
62 |
63 | themeLog("building themes...")
64 | if err := buildThemes(config, spec); err != nil {
65 | themeLogFatal(err)
66 | }
67 | themeLog("complete!")
68 | if watchFiles {
69 | themeLog("watching for changes...")
70 | w := watcher.New()
71 | w.SetMaxEvents(1)
72 | w.FilterOps(watcher.Write)
73 | w.Add("../SPEC.md")
74 | w.Add("../syntaxes")
75 | w.Add("templates")
76 | go func() {
77 | for {
78 | select {
79 | case <-w.Event:
80 | themeLog("rebuilding themes...")
81 | if err := buildThemes(config, spec); err != nil {
82 | themeLogFatal(err)
83 | }
84 | themeLog("complete!")
85 | case err := <-w.Error:
86 | themeLogFatal(err)
87 | case <-w.Closed:
88 | return
89 | }
90 | }
91 | }()
92 | if err := w.Start(time.Millisecond * 500); err != nil {
93 | themeLogFatal(err)
94 | }
95 | }
96 | if makeScreenshots {
97 | if err := buildScreenshots(spec, config.themeRoot); err != nil {
98 | themeLogFatal(err)
99 | }
100 | }
101 | }
102 |
--------------------------------------------------------------------------------
/mktheme/mktheme_conf.yml:
--------------------------------------------------------------------------------
1 | ---
2 | targets:
3 | vscode:
4 | mode: multi
5 | input: clarion-color-theme.json
6 | output: /themes/clarion-color-theme-{{.themeName | lc}}
7 | packagefile:
8 | mode: simple
9 | input: package.json.tmpl
10 | output /package.json
11 | readme:
12 | mode: simple
13 | input: README.md.tmpl
14 | output: /README.md
15 | nvim:
16 | mode: tree
17 | input: nvim
18 | output: /themes-contrib/clarion.nvim
--------------------------------------------------------------------------------
/mktheme/screenshot_scripts/change_theme.scpt.tmpl:
--------------------------------------------------------------------------------
1 | activate application "Code"
2 | tell application "System Events"
3 | keystroke "p" using {command down, shift down}
4 | delay 1
5 | keystroke "p"
6 | keystroke "r"
7 | keystroke "e"
8 | keystroke "f"
9 | keystroke "c"
10 | keystroke "o"
11 | keystroke "l"
12 | keystroke "o"
13 | keystroke "r"
14 | key code 36
15 | delay 3
16 | keystroke "c"
17 | keystroke "l"
18 | keystroke "a"
19 | keystroke "r"
20 | keystroke "i"
21 | keystroke "o"
22 | keystroke "n"
23 | {{- range .themechars }}
24 | keystroke "{{.}}"
25 | {{- end}}
26 | key code 36
27 | end tell
28 |
--------------------------------------------------------------------------------
/mktheme/screenshot_scripts/close_window.scpt:
--------------------------------------------------------------------------------
1 | tell application "System Events"
2 | if exists (window "[Extension Development Host] - build_themes.go — mktheme" of process "Code") then
3 | set clarionWindow to (window "[Extension Development Host] - build_themes.go — mktheme" of process "Code")
4 | perform action "AXRaise" of clarionWindow
5 | set position of clarionWindow to {0, 0}
6 | else
7 | error "Theme debug window not found"
8 | end if
9 | end tell
10 | tell application "System Events"
11 | keystroke "q" using command down
12 | end tell
13 |
--------------------------------------------------------------------------------
/mktheme/screenshot_scripts/colors.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | clear
3 | echo
4 | echo
5 | echo
6 | echo
7 | echo -e "\033[1;37mWHITE\t\033[0;37mBRIGHT_WHITE"
8 | echo -e "\033[0;30mBLACK\t\033[1;30mBRIGHT_BLACK"
9 | echo -e "\033[0;34mBLUE\t\033[1;34mBRIGHT_BLUE"
10 | echo -e "\033[0;32mGREEN\t\033[1;32mBRIGHT_GREEN"
11 | echo -e "\033[0;36mCYAN\t\033[1;36mBRIGHT_CYAN"
12 | echo -e "\033[0;31mRED\t\033[1;31mBRIGHT_RED"
13 | echo -e "\033[0;35mMAGENTA\t\033[1;35mBRIGHT_MAGENTA"
14 | echo -e "\033[0;33mYELLOW\t\033[1;33mBRIGHT_YELLOW\033[0m"
15 | read -p "Default Foreground "
--------------------------------------------------------------------------------
/mktheme/screenshot_scripts/prep_screenshots.scpt:
--------------------------------------------------------------------------------
1 | tell application "System Events"
2 | if exists (window "[Extension Development Host] - build_themes.go — mktheme" of process "Code") then
3 | set clarionWindow to (window "[Extension Development Host] - build_themes.go — mktheme" of process "Code")
4 | perform action "AXRaise" of clarionWindow
5 | set position of clarionWindow to {0, 0}
6 | else
7 | error "Theme debug window not found"
8 | end if
9 | end tell
10 | activate application "Code"
11 | tell application "System Events"
12 | tell process "Code"
13 | set the size of front window to {1300,900}
14 | end tell
15 | end tell
16 | tell application "System Events"
17 | keystroke "p" using {command down, shift down}
18 | delay 1
19 | -- kill all old terminals
20 | keystroke "p" using {command down, shift down}
21 | delay 1
22 | keystroke "t"
23 | keystroke "e"
24 | keystroke "r"
25 | keystroke "m"
26 | keystroke "i"
27 | keystroke "n"
28 | keystroke "a"
29 | keystroke "l"
30 | keystroke "k"
31 | keystroke "i"
32 | keystroke "l"
33 | keystroke "l"
34 | keystroke "a"
35 | keystroke "l"
36 | keystroke "l"
37 | key code 36
38 | delay 3
39 | -- Create new terminal for colors
40 | keystroke "p" using {command down, shift down}
41 | delay 1
42 | keystroke "t"
43 | keystroke "e"
44 | keystroke "r"
45 | keystroke "m"
46 | keystroke "i"
47 | keystroke "n"
48 | keystroke "a"
49 | keystroke "l"
50 | keystroke "c"
51 | keystroke "r"
52 | keystroke "e"
53 | key code 36
54 | delay 3
55 | keystroke "."
56 | keystroke "/"
57 | keystroke "s"
58 | keystroke "c"
59 | keystroke "r"
60 | keystroke "e"
61 | keystroke "e"
62 | keystroke "n"
63 | keystroke "s"
64 | keystroke "h"
65 | keystroke "o"
66 | keystroke "t"
67 | keystroke "_"
68 | keystroke "s"
69 | keystroke "c"
70 | keystroke "r"
71 | keystroke "i"
72 | keystroke "p"
73 | keystroke "t"
74 | keystroke "s"
75 | keystroke "/"
76 | keystroke "c"
77 | keystroke "o"
78 | keystroke "l"
79 | keystroke "o"
80 | keystroke "r"
81 | keystroke "s"
82 | keystroke "."
83 | keystroke "s"
84 | keystroke "h"
85 | key code 36
86 | -- switch back to the editor
87 | delay 1
88 | key code 18 using control down
89 | end tell
90 | --do shell script "screencapture -x -R0,23,900,900 \"foo.png\""
91 | --tell application "System Events"
92 | -- tell process "Code"
93 | -- click at {100,100}
94 | -- end tell
95 | --end tell
96 | --tell application "Finder" to get the bounds of clarionWindow
97 |
--------------------------------------------------------------------------------
/mktheme/spec.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bufio"
5 | "fmt"
6 | "os"
7 | "strconv"
8 | "strings"
9 |
10 | "github.com/lucasb-eyer/go-colorful"
11 | )
12 |
13 | type spec struct {
14 | themeBases []string
15 | fgColor colorful.Color
16 | baseColors map[string]colorful.Color
17 | conceptColors map[string]colorful.Color
18 | ansiColors map[string]colorful.Color
19 | ΔETarget float64
20 | Lstep float64
21 | variations int
22 | }
23 |
24 | // primitive, expect-like scanner that only works because markdown is easy. If
25 | // the spec becomes more complicated, a full parser will likely be required.
26 | func loadSpec(specPath string) (*spec, error) {
27 | file, err := os.Open(specPath)
28 | if err != nil {
29 | return nil, err
30 | }
31 | spec := &spec{
32 | baseColors: map[string]colorful.Color{},
33 | conceptColors: map[string]colorful.Color{},
34 | ansiColors: map[string]colorful.Color{},
35 | }
36 | scanner := bufio.NewScanner(file)
37 | section := "none"
38 | target := ""
39 | for scanner.Scan() {
40 | fields := strings.Fields(scanner.Text())
41 | if len(fields) == 0 {
42 | continue
43 | }
44 | switch fields[0] {
45 | case `##`:
46 | section = scanner.Text()[3:]
47 | continue
48 | case `###`:
49 | target = scanner.Text()[4:]
50 | case `*`:
51 | switch fields[1] {
52 | case "ΔETarget:":
53 | f, err := strconv.ParseFloat(fields[2], 64)
54 | if err != nil {
55 | return nil, fmt.Errorf("couldn't parse ΔETarget as float: %s", err)
56 | }
57 | spec.ΔETarget = f / 100 //apparently the colorful library is a
58 | //couple orders of magnitude smaller than the literature
59 | case "LStep:":
60 | f, err := strconv.ParseFloat(fields[2], 64)
61 | if err != nil {
62 | return nil, fmt.Errorf("couldn't parse LStep as float: %s", err)
63 | }
64 | spec.Lstep = f / 100
65 | case "Variations:":
66 | i, err := strconv.Atoi(fields[2])
67 | if err != nil {
68 | return nil, fmt.Errorf("couldn't parse Variations as int")
69 | }
70 | spec.variations = i
71 | case "Hex:":
72 | switch section {
73 | case "Background Colors":
74 | spec.themeBases = append(spec.themeBases, target)
75 | bgHex := fields[2]
76 | bgColor, err := colorful.Hex(bgHex)
77 | if err != nil {
78 | return nil, fmt.Errorf("invalid hex [%s] for background color [%s]", bgHex, target)
79 | }
80 | spec.baseColors[target] = bgColor
81 | case "Foreground Colors":
82 | fgHex := fields[2]
83 | fgColor, err := colorful.Hex(fgHex)
84 | if err != nil {
85 | return nil, fmt.Errorf("invalid hex [%s] for foreground color", fgHex)
86 | }
87 | spec.fgColor = fgColor
88 | case "Conceptual Colors":
89 | ccHex := fields[2]
90 | cColor, err := colorful.Hex(ccHex)
91 | if err != nil {
92 | return nil, fmt.Errorf("invalid hex [%s] for concept color [%s]", ccHex, target)
93 | }
94 | spec.conceptColors[strings.ToLower(target)] = cColor
95 | case "Terminal Colors":
96 | tHex := fields[2]
97 | tColor, err := colorful.Hex(tHex)
98 | if err != nil {
99 | return nil, fmt.Errorf("invalid hex [%s] for terminal color [%s]", tHex, target)
100 | }
101 | spec.ansiColors[target] = tColor
102 | }
103 | }
104 | }
105 | }
106 | if err := scanner.Err(); err != nil {
107 | return nil, fmt.Errorf("scanner error: %s", err)
108 | }
109 | return spec, nil
110 | }
111 |
--------------------------------------------------------------------------------
/mktheme/templates/README.md.tmpl:
--------------------------------------------------------------------------------
1 | # Clarion - A Monochrome Theme Inspired By 🧑🔬
2 | 
3 |
4 | Clarion is a mostly-monochromatic, minimally-highlighted colorscheme, clearing
5 | away the rainbow madness and allowing you to concentrate on what matters the
6 | most: your code.
7 | {{ range $index, $element := .previews}}
8 |
10 | {{- end}}
11 |
12 | ## Guiding Principles
13 |
14 | ### Readability is Paramount
15 | Programmers spend the majority of their careers looking at text. Your eyes are an important resource, so a good theme should be as readable as possible, minimizing eyestrain and maximizing comprehension. Research overwhelmingly suggests that no single background color is better or worse for readability, so long as an good contrast ratio is maintained with monochromatic text.
16 |
17 | *See [the specification](SPEC.md) for more information.*
18 |
19 | ### Minimal Syntax Highlighting
20 | If everything is important, nothing is! Color is an important tool for conveying important information, but the more it's used, the less meaningful it becomes. There are only a finite amount of colors you can distinguish easily, and the more syntax elements that get a color, the greater the chance of overlap, and the less it will mean. Clarion tries to avoid using color as much as possible, concentrating instead on carefully-chosen font weights for certain landmark elements to help you orient yourself in your ccode.
21 |
22 | As semantic highlighting and advanced language server features become more prevelant, Clarion will embrace this preferentially insofar as it is not distracting.
23 |
24 | ### Spec-Driven
25 | A specification keeps things centralized and consistent. Inspired by the [Dracula](https://draculatheme.com/) [Theme's specification](https://spec.draculatheme.com/). Clarion is driven by a [similar spec](SPEC.md), and in fact uses this doc to generate the theme itself, making the spec the source of truth.
26 |
27 | ### Conceptual Palette
28 | Rather than simply picking values from a color palette and arbitrarily assigning them to syntax or UI elements, Clarion seeks to define a "conceptual palette", where each color has a specific meaning that applies consistently across contexts.
29 |
30 | If you see `problem`, there is a serious problem of some kind within that context. Similarly, if you see `new`, something has been added or is otherwise "new". Correspondingly, if something doesn't have a spceial meaning, it will not have a color.
31 |
32 | ## Status
33 | Clarion is an untested proof-of-concept, and very much a work in progress. The specification is very bare-bones and its format and content will likely change as more values are codified into it. These include such things that currently only exist in templates or the spec generation code, such as editor-specific styling identifiers.
34 |
35 | The current stable target is a published VSCoce colorscheme in the Visual Studio marketplace. This alone is a large undertaking, since there are hundreds of different color directives in VSCode, many of which are derivied or are simple alpha deltas, so care must be taken to exhaustively specify as many of these as possible to avoid "surprise" colors that are inconsistent with the goal of a very limited palette.
36 |
37 | For this reason, creating themes for other editors is beyond the current scope and will rely on more tooling for spec extraction and templating. Community contributions are very much desired, and Go template functions already exist to render hex values as well as 256-color terminal approximations.
38 |
39 | It is still an open question as to whether the "conceptual palette" is a meaningful abstraction and how well it conforms to what science tells us about color and reading comprehension.
40 |
41 | While the primary source work that Clarion is based off of targeted Dyslexia, more research on visual ergonomics should be explored, and other disabilities related to reading comprehension, such as colorblindness, should be accomodated as much as possible.
42 |
43 | ## Development/Contributing
44 | TBD.
45 |
--------------------------------------------------------------------------------
/mktheme/templates/clarion-color-theme.json:
--------------------------------------------------------------------------------
1 | // all bgs are negative, so convert to negative idx
2 | {
3 | "name": "{{.ThemeName}}",
4 | "type": "light",
5 | "semanticHighlighting": true,
6 | "colors": {
7 | //{{with .Base }}
8 | "window.activeBorder": "{{.Fg.Hex}}",
9 | "window.inactiveBorder": "{{.Excluded.Gfx.Hex}}",
10 | "titleBar.border": "{{.Fg.Hex}}",
11 | "diffEditor.insertedTextBackground": "{{.Excluded.Gfx.HexAlpha 19}}",
12 | "diffEditor.removedTextBackground": "{{.Excluded.Gfx.HexAlpha 19}}",
13 | "editor.foreground": "{{.Fg.Hex}}",
14 | "editor.background": "{{.Hex}}",
15 | "editor.findMatchBackground": "#ffca0099",
16 | "editor.findMatchHighlightBackground": "#ffca004c",
17 | "editor.focusedStackFrameHighlightBackground": "#f909",
18 | "editor.lineHighlightBackground": "{{.Darker.Hex}}",
19 | "editor.lineHighlightBorder": "{{.Darker.Darker.Hex}}",
20 | "editor.selectionBackground": "{{.Darker.Darker.Hex}}",
21 | "editorIndentGuide.activeBackground1": "{{.Fg.Hex}}",
22 | "editorIndentGuide.background1": "{{.FgUI.HexAlpha 50}}",
23 | "editor.selectionForeground": "{{.Hex}}",
24 | "editor.selectionHighlightBorder": "{{.Darker.Hex}}",
25 | "editor.selectionHighlightBackground": "{{.Darker.Darker.Hex}}",
26 | "editor.stackFrameHighlightBackground": "#ff99004c",
27 | "editor.wordHighlightBackground": "#0064ff26",
28 | "editor.wordHighlightStrongBackground": "#0064ff4c",
29 | "editorBracketMatch.background": "{{.Darker.Darker.Hex}}",
30 | //"editorCursor.foreground": "#004bff",
31 | // no squiggles
32 | "editorError.foreground": "#00000000",
33 | "editorWarning.foreground": "#00000000",
34 | "editorInfo.foreground": "#00000000",
35 | // block highlights instead
36 | "editorInfo.background": "#0000ff20",
37 | "editorWarning.background": "{{.Notice.Gfx.HexAlpha 20}}",
38 | "editorError.background": "{{.Problem.Gfx.HexAlpha 20}}",
39 | "editorGroup.border": "{{.Fg.Hex}}",
40 | "sash.hoverBorder": "{{.Modified.Gfx.Hex}}",
41 | "editorGroupHeader.tabsBackground": "{{.Hex}}",
42 | "editorGroupHeader.tabsBorder": "{{.Fg.Hex}}",
43 | "editorGutter.background": "{{.Darker.Hex}}",
44 | "editorGutter.addedBackground": "{{.Excluded.Txt.Hex}}",
45 | "editorGutter.deletedBackground": "{{.Excluded.Txt.Hex}}",
46 | "editorGutter.modifiedBackground": "{{.Modified.Gfx.Hex}}",
47 | "editorLineNumber.activeForeground": "{{.Fg.Hex}}",
48 | "editorLineNumber.foreground": "{{.Fg.Hex}}",
49 | "editorLink.activeForeground": "{{.FgLight.Hex}}",
50 | "editorOverviewRuler.addedForeground": "{{.Fg.Hex}}",
51 | "editorOverviewRuler.border": "{{.Fg.Hex}}",
52 | "editorOverviewRuler.bracketMatchForeground": "#0064ff4c",
53 | "editorOverviewRuler.errorForeground": "{{.Problem.Gfx.Hex}}",
54 | "editorOverviewRuler.warningForeground": "{{.Notice.Gfx.Hex}}",
55 | "editorOverviewRuler.infoForeground": "#0000ff",
56 | "editorOverviewRuler.findMatchForeground": "#ffca0099",
57 | "editorOverviewRuler.modifiedForeground": "{{.Modified.Gfx.Hex}}",
58 | "editorOverviewRuler.selectionHighlightForeground": "#0064ff4c",
59 | "editorOverviewRuler.wordHighlightForeground": "#0064ff26",
60 | "editorOverviewRuler.wordHighlightStrongForeground": "#0064ff4c",
61 | "editorRuler.foreground": "{{.Darker.Hex}}",
62 | "editorSuggestWidget.foreground": "{{.Fg.Hex}}",
63 | "editorWidget.background": "{{.Darker.Hex}}",
64 | "editorWidget.border": "{{.Fg.Hex}}",
65 | "scrollbar.shadow": "{{.Fg.Hex}}",
66 | "scrollbarSlider.background": "{{.Fg.Hex}}20",
67 | "scrollbarSlider.hoverBackground": "{{.Fg.Hex}}30",
68 | "titleBar.activeBackground": "{{.Hex}}",
69 | "titleBar.activeForeground": "{{.Fg.Hex}}",
70 | "titleBar.inactiveBackground": "{{.Hex}}",
71 | "titleBar.inactiveForeground": "{{.Fg.Hex}}",
72 | "widget.shadow": "{{.Fg.Hex}}",
73 | "settings.headerForeground": "{{.Notice.Txt.Hex}}",
74 | "symbolIcon.arrayForeground": "{{.Fg.Hex}}",
75 | "symbolIcon.booleanForeground": "{{.Fg.Hex}}",
76 | "symbolIcon.classForeground": "{{.Fg.Hex}}",
77 | "symbolIcon.colorForeground": "{{.Fg.Hex}}",
78 | "symbolIcon.constantForeground": "{{.Fg.Hex}}",
79 | "symbolIcon.constructorForeground": "{{.Fg.Hex}}",
80 | "symbolIcon.enumeratorForeground": "{{.Fg.Hex}}",
81 | "symbolIcon.enumeratorMemberForeground": "{{.Fg.Hex}}",
82 | "symbolIcon.eventForeground": "{{.Fg.Hex}}",
83 | "symbolIcon.fieldForeground": "{{.Fg.Hex}}",
84 | "symbolIcon.fileForeground": "{{.Fg.Hex}}",
85 | "symbolIcon.folderForeground": "{{.Fg.Hex}}",
86 | "symbolIcon.functionForeground": "{{.Fg.Hex}}",
87 | "symbolIcon.interfaceForeground": "{{.Fg.Hex}}",
88 | "symbolIcon.keyForeground": "{{.Fg.Hex}}",
89 | "symbolIcon.keywordForeground": "{{.Fg.Hex}}",
90 | "symbolIcon.methodForeground": "{{.Fg.Hex}}",
91 | "symbolIcon.moduleForeground": "{{.Fg.Hex}}",
92 | "symbolIcon.namespaceForeground": "{{.Fg.Hex}}",
93 | "symbolIcon.nullForeground": "{{.Fg.Hex}}",
94 | "symbolIcon.numberForeground": "{{.Fg.Hex}}",
95 | "symbolIcon.objectForeground": "{{.Fg.Hex}}",
96 | "symbolIcon.operatorForeground": "{{.Fg.Hex}}",
97 | "symbolIcon.packageForeground": "{{.Fg.Hex}}",
98 | "symbolIcon.propertyForeground": "{{.Fg.Hex}}",
99 | "symbolIcon.referenceForeground": "{{.Fg.Hex}}",
100 | "symbolIcon.snippetForeground": "{{.Fg.Hex}}",
101 | "symbolIcon.stringForeground": "{{.Fg.Hex}}",
102 | "symbolIcon.structForeground": "{{.Fg.Hex}}",
103 | "symbolIcon.textForeground": "{{.Fg.Hex}}",
104 | "symbolIcon.typeParameterForeground": "{{.Fg.Hex}}",
105 | "symbolIcon.unitForeground": "{{.Fg.Hex}}",
106 | "symbolIcon.variableForeground": "{{.Fg.Hex}}",
107 | "errorForeground": "{{.Excluded.Txt.Hex}}",
108 | "extensionButton.background": "{{.Fg.Hex}}",
109 | "extensionButton.foreground": "{{.Hex}}",
110 | "extensionButton.prominentBackground": "{{.Notice.Gfx.Hex}}",
111 | "extensionButton.prominentForeground": "{{.Hex}}",
112 | "extensionButton.prominentHoverBackground": "{{.Lighter.Lighter.Notice.Gfx.Hex}}",
113 | "focusBorder": "{{.Fg.Hex}}",
114 | "foreground": "{{.Fg.Hex}}",
115 | "gitDecoration.ignoredResourceForeground": "{{.Excluded.Txt.Hex}}",
116 | "gitDecoration.modifiedResourceForeground": "{{.Modified.Txt.Hex}}",
117 | "gitDecoration.untrackedResourceForeground": "{{.Excluded.Txt.Hex}}",
118 | "textLink.activeForeground": "{{.Fg.Hex}}",
119 | "textLink.foreground": "{{.Fg.Hex}}",
120 | //{{end}}
121 | //{{with .Bg -1}}
122 | "activityBar.background": "{{.Hex}}",
123 | "activityBar.border": "{{.Fg.Hex}}",
124 | "activityBar.foreground": "{{.Fg.Hex}}",
125 | "activityBarBadge.background": "{{.Fg.Hex}}",
126 | "activityBarBadge.foreground": "{{.Lighter.Hex}}",
127 | //{{end}}
128 | "badge.background": "{{.Base.Fg.Hex}}",
129 | "badge.foreground": "{{.Base.Hex}}",
130 | "button.background": "{{.Base.Hex}}",
131 | "button.foreground": "{{.Base.Fg.Hex}}",
132 | "contrastBorder": "{{.Base.Fg.Hex}}",
133 | //{{with .Bg -3}}
134 | "debugToolBar.background": "{{.Hex}}",
135 | "dropdown.background": "{{.Hex}}",
136 | "dropdown.border": "{{.Fg.Hex}}",
137 | "dropdown.foreground": "{{.Fg.Hex}}",
138 | //{{end}}
139 | //{{with .Bg -2}}
140 | "panel.background": "{{.Hex}}",
141 | "panel.border": "{{.Fg.Hex}}",
142 | "panel.dropBorder": "{{.Modified.Gfx.Hex}}",
143 | "panelTitle.activeForeground": "{{.Fg.Hex}}",
144 | "panelTitle.inactiveForeground": "{{.FgLight.Hex}}",
145 | "panelTitle.activeBorder": "{{.Fg.Hex}}",
146 | //{{end}}
147 | //{{with .Bg -2}}
148 | "peekView.border": "{{.Fg.Hex}}",
149 | "peekViewEditor.background": "{{.Hex}}",
150 | "peekViewEditor.matchHighlightBackground": "#ffca0099",
151 | //{{end}}
152 | //{{with .Bg -1}}
153 | "peekViewTitle.background": "{{.Hex}}",
154 | "peekViewTitleDescription.foreground": "{{.FgLight.Hex}}",
155 | "peekViewTitleLabel.foreground": "{{.Fg.Hex}}",
156 | //{{end}}
157 | //{{with .Bg -2}}
158 | "peekViewResult.background": "{{.Hex}}",
159 | "peekViewResult.fileForeground": "{{.Fg.Hex}}",
160 | "peekViewResult.lineForeground": "{{.FgLight.Hex}}",
161 | "peekViewResult.matchHighlightBackground": "#ffca0099",
162 | //{{end}}
163 | //{{with .Bg -2}}
164 | "peekViewResult.selectionBackground": "{{.Hex}}",
165 | "peekViewResult.selectionForeground": "{{.Fg.Hex}}",
166 | //{{end}}
167 | //{{with .Base}}
168 | "input.background": "{{.Hex}}",
169 | "input.border": "{{.Fg.Hex}}",
170 | "input.foreground": "{{.Fg.Hex}}",
171 | "input.placeholderForeground": "{{.FgLight.Hex}}",
172 | //{{end}}
173 | //{{with .Bg -4}}
174 | "list.activeSelectionBackground": "{{.Lighter.Hex}}",
175 | "list.activeSelectionForeground": "{{.Lighter.Fg.Hex}}",
176 | "list.dropBackground": "{{.Modified.Gfx.HexAlpha 80}}",
177 | "list.focusBackground": "{{.Hex}}",
178 | "list.focusOutline": "{{.Fg.Hex}}",
179 | "list.focusForeground": "{{.Fg.Hex}}",
180 | "list.highlightForeground": "{{.Fg.Hex}}",
181 | "list.hoverBackground": "{{.Lighter.Hex}}",
182 | "list.inactiveSelectionBackground": "{{.Hex}}",
183 | "list.inactiveSelectionForeground": "{{.Fg.Hex}}",
184 | //{{end}}
185 | "progressBar.background": "#004bff",
186 | //{{with .Bg -1}}
187 | "sideBar.background": "{{.Hex}}",
188 | "sideBar.foreground": "{{.Fg.Hex}}",
189 | "sideBarSectionHeader.background": "{{.Darker.Darker.Hex}}",
190 | "sideBarSectionHeader.foreground": "{{.Fg.Hex}}",
191 | "sideBarTitle.foreground": "{{.Fg.Hex}}",
192 | //{{end}}
193 | //{{with .Bg -4}}
194 | "statusBar.background": "{{.Hex}}",
195 | "statusBar.debuggingBackground": "#f90",
196 | "statusBar.debuggingForeground": "{{.Fg.Hex}}",
197 | "statusBar.foreground": "{{.Fg.Hex}}",
198 | "statusBar.noFolderBackground": "{{.Fg.Hex}}",
199 | //{{end}}
200 | //{{with .Base}}
201 | "tab.activeBackground": "{{.Lighter.Hex}}",
202 | "tab.activeForeground": "{{.Fg.Hex}}",
203 | "tab.activeModifiedBorder": "{{.Fg.Hex}}",
204 | "tab.border": "{{.Fg.Hex}}",
205 | "tab.inactiveBackground": "{{.Darker.Hex}}",
206 | "tab.inactiveForeground": "{{.Fg.Hex}}",
207 | "tab.inactiveModifiedBorder": "{{.Fg.Hex}}",
208 | //{{end}}
209 | //{{with .Bg -3}}
210 | "terminal.foreground": "{{.AnsiBlack.Hex}}",
211 | "terminal.background": "{{.Hex}}",
212 | "terminal.border": "{{.FgLight.Hex}}",
213 | "terminal.ansiBlack": "{{.AnsiBlack.Hex}}",
214 | "terminal.ansiBrightBlack": "{{.AnsiBrBlack.Hex}}",
215 | "terminal.ansiBlue": "{{.AnsiBlue.Hex}}",
216 | "terminal.ansiBrightBlue": "{{.AnsiBrBlue.Hex}}",
217 | "terminal.ansiCyan": "{{.AnsiCyan.Hex}}",
218 | "terminal.ansiBrightCyan": "{{.AnsiBrCyan.Hex}}",
219 | "terminal.ansiGreen": "{{.AnsiGreen.Hex}}",
220 | "terminal.ansiBrightGreen": "{{.AnsiBrGreen.Hex}}",
221 | "terminal.ansiMagenta": "{{.AnsiMagenta.Hex}}",
222 | "terminal.ansiBrightMagenta": "{{.AnsiBrMagenta.Hex}}",
223 | "terminal.ansiRed": "{{.AnsiRed.Hex}}",
224 | "terminal.ansiBrightRed": "{{.AnsiBrRed.Hex}}",
225 | "terminal.ansiWhite": "{{.AnsiWhite.Hex}}",
226 | "terminal.ansiBrightWhite": "{{.AnsiBrWhite.Hex}}",
227 | "terminal.ansiYellow": "{{.AnsiYellow.Hex}}",
228 | "terminal.ansiBrightYellow": "{{.AnsiBrYellow.Hex}}",
229 | "terminal.selectionBackground": "#0064ff4c",
230 | "terminalCursor.foreground": "{{.Fg.Hex}}",
231 | "editorBracketHighlight.foreground1": "{{.Fg.Hex}}",
232 | "editorBracketHighlight.foreground2": "{{.Fg.Hex}}",
233 | "editorBracketHighlight.foreground3": "{{.Fg.Hex}}",
234 | "editorBracketHighlight.foreground4": "{{.Fg.Hex}}",
235 | "editorBracketHighlight.foreground5": "{{.Fg.Hex}}",
236 | "editorBracketHighlight.foreground6": "{{.Fg.Hex}}",
237 | "editorBracketHighlight.unexpectedBracket.foreground": "{{.Fg.Hex}}"
238 | //{{end}}
239 | },
240 | //{{with .Base}}
241 | "semanticTokenColors": {
242 | // "namespace": {
243 | // "bold": true,
244 | // "italic": false
245 | // },
246 | "function.definition": {
247 | "fontStyle": "bold"
248 | },
249 | "type.definition": {
250 | "fontStyle": "bold"
251 | },
252 | "variable.definition": {
253 | "foreground": "{{.Fg.HexAlpha 58}}"
254 | },
255 | "variable.readonly": {
256 | "foreground": "{{.Fg.Hex}}",
257 | "fontStyle": "italic"
258 | },
259 | "variable.defaultLibrary": {
260 | "foreground": "{{.Fg.Hex}}",
261 | "fontStyle": "italic"
262 | },
263 | "variable": {}
264 | },
265 | "tokenColors": [
266 | {
267 | "scope": [
268 | "string entity.name.import.go"
269 | ],
270 | "settings": {
271 | "foreground": "{{.Fg.Hex}}"
272 | }
273 | },
274 | {
275 | "scope": [
276 | "comment.block",
277 | "comment.block.documentation",
278 | "comment.line",
279 | "comment",
280 | "string.quoted.docstring"
281 | ],
282 | "settings": {
283 | //"foreground": "{{.Darker.Darker.Darker.Hex}}",
284 | //"foreground": "{{.FgLight.Hex}}",
285 | "foreground": "{{.Fg.HexAlpha 30}}",
286 | "fontStyle": "italic"
287 | }
288 | },
289 | {
290 | "scope": [
291 | "string"
292 | ],
293 | "settings": {
294 | "foreground": "{{.FgLight.Hex}}"
295 | }
296 | },
297 | {
298 | "scope": [
299 | "constant.other.placeholder",
300 | "constant.character.escape"
301 | ],
302 | "settings": {
303 | "foreground": "{{.Fg.Hex}}",
304 | "fontStyle": "italic"
305 | }
306 | },
307 | {
308 | "scope": [
309 | "punctuation.definition.string",
310 | "storage.type.string.python"
311 | ],
312 | "settings": {
313 | "foreground": "{{.Fg.Hex}}"
314 | }
315 | },
316 | {
317 | "scope": [
318 | "markup.italic"
319 | ],
320 | "settings": {
321 | "fontStyle": "italic"
322 | }
323 | },
324 | //landmarks
325 | {
326 | "scope": [
327 | "entity.name.section.group-title",
328 | "keyword.const",
329 | "keyword.package",
330 | //"keyword.function",
331 | //"keyword.var",
332 | //"keyword.type",
333 | "markup.heading",
334 | "storage.type.function",
335 | "storage.type.import",
336 | "storage.type.namespace",
337 | "support.type.object.module",
338 | "markup.bold",
339 | "markup.inline.raw",
340 | "markup.raw.monospace",
341 | "markup.fenced_code.block",
342 | "keyword.control.landmark"
343 | ],
344 | "settings": {
345 | "fontStyle": "bold"
346 | }
347 | },
348 | {
349 | "scope": [
350 | "support.type.property-name"
351 | ],
352 | "settings": {
353 | "foreground": "{{.Fg.Hex}}",
354 | "fontStyle": "bold"
355 | }
356 | }
357 | ]
358 | // {{end}}
359 | }
--------------------------------------------------------------------------------
/mktheme/templates/nvim/autoload/lightline/colorscheme/gruvbox.vim:
--------------------------------------------------------------------------------
1 | let s:palette = v:lua.require('gruvbox.lightline')
2 | let g:lightline#colorscheme#gruvbox#palette = lightline#colorscheme#fill(s:palette)
3 |
--------------------------------------------------------------------------------
/mktheme/templates/nvim/colors/gruvbox.lua:
--------------------------------------------------------------------------------
1 | require("gruvbox").load()
2 |
--------------------------------------------------------------------------------
/mktheme/templates/nvim/lua/gruvbox/groups.lua:
--------------------------------------------------------------------------------
1 | local M = {}
2 |
3 | -- neovim terminal mode colors
4 | local function set_terminal_colors(colors)
5 | vim.g.terminal_color_0 = colors.bg0
6 | vim.g.terminal_color_8 = colors.gray
7 | vim.g.terminal_color_1 = colors.neutral_red
8 | vim.g.terminal_color_9 = colors.red
9 | vim.g.terminal_color_2 = colors.neutral_green
10 | vim.g.terminal_color_10 = colors.green
11 | vim.g.terminal_color_3 = colors.neutral_yellow
12 | vim.g.terminal_color_11 = colors.yellow
13 | vim.g.terminal_color_4 = colors.neutral_blue
14 | vim.g.terminal_color_12 = colors.blue
15 | vim.g.terminal_color_5 = colors.neutral_purple
16 | vim.g.terminal_color_13 = colors.purple
17 | vim.g.terminal_color_6 = colors.neutral_aqua
18 | vim.g.terminal_color_14 = colors.aqua
19 | vim.g.terminal_color_7 = colors.fg4
20 | vim.g.terminal_color_15 = colors.fg1
21 | end
22 |
23 | M.setup = function()
24 | local config = require("gruvbox").config
25 | local colors = require("gruvbox.palette").get_base_colors(vim.o.background, config.contrast)
26 |
27 | set_terminal_colors(colors)
28 |
29 | local groups = {
30 | -- Base groups
31 | GruvboxFg0 = { fg = colors.fg0 },
32 | GruvboxFg1 = { fg = colors.fg1 },
33 | GruvboxFg2 = { fg = colors.fg2 },
34 | GruvboxFg3 = { fg = colors.fg3 },
35 | GruvboxFg4 = { fg = colors.fg4 },
36 | GruvboxGray = { fg = colors.gray },
37 | GruvboxBg0 = { fg = colors.bg0 },
38 | GruvboxBg1 = { fg = colors.bg1 },
39 | GruvboxBg2 = { fg = colors.bg2 },
40 | GruvboxBg3 = { fg = colors.bg3 },
41 | GruvboxBg4 = { fg = colors.bg4 },
42 | GruvboxRed = { fg = colors.red },
43 | GruvboxRedBold = { fg = colors.red, bold = config.bold },
44 | GruvboxGreen = { fg = colors.green },
45 | GruvboxGreenBold = { fg = colors.green, bold = config.bold },
46 | GruvboxYellow = { fg = colors.yellow },
47 | GruvboxYellowBold = { fg = colors.yellow, bold = config.bold },
48 | GruvboxBlue = { fg = colors.blue },
49 | GruvboxBlueBold = { fg = colors.blue, bold = config.bold },
50 | GruvboxPurple = { fg = colors.purple },
51 | GruvboxPurpleBold = { fg = colors.purple, bold = config.bold },
52 | GruvboxAqua = { fg = colors.aqua },
53 | GruvboxAquaBold = { fg = colors.aqua, bold = config.bold },
54 | GruvboxOrange = { fg = colors.orange },
55 | GruvboxOrangeBold = { fg = colors.orange, bold = config.bold },
56 | GruvboxRedSign = config.transparent_mode and { fg = colors.red, reverse = config.invert_signs }
57 | or { fg = colors.red, bg = colors.bg1, reverse = config.invert_signs },
58 | GruvboxGreenSign = config.transparent_mode and { fg = colors.green, reverse = config.invert_signs }
59 | or { fg = colors.green, bg = colors.bg1, reverse = config.invert_signs },
60 | GruvboxYellowSign = config.transparent_mode and { fg = colors.yellow, reverse = config.invert_signs }
61 | or { fg = colors.yellow, bg = colors.bg1, reverse = config.invert_signs },
62 | GruvboxBlueSign = config.transparent_mode and { fg = colors.blue, reverse = config.invert_signs }
63 | or { fg = colors.blue, bg = colors.bg1, reverse = config.invert_signs },
64 | GruvboxPurpleSign = config.transparent_mode and { fg = colors.purple, reverse = config.invert_signs }
65 | or { fg = colors.purple, bg = colors.bg1, reverse = config.invert_signs },
66 | GruvboxAquaSign = config.transparent_mode and { fg = colors.aqua, reverse = config.invert_signs }
67 | or { fg = colors.aqua, bg = colors.bg1, reverse = config.invert_signs },
68 | GruvboxOrangeSign = config.transparent_mode and { fg = colors.orange, reverse = config.invert_signs }
69 | or { fg = colors.orange, bg = colors.bg1, reverse = config.invert_signs },
70 | GruvboxRedUnderline = { undercurl = config.undercurl, sp = colors.red },
71 | GruvboxGreenUnderline = { undercurl = config.undercurl, sp = colors.green },
72 | GruvboxYellowUnderline = { undercurl = config.undercurl, sp = colors.yellow },
73 | GruvboxBlueUnderline = { undercurl = config.undercurl, sp = colors.blue },
74 | GruvboxPurpleUnderline = { undercurl = config.undercurl, sp = colors.purple },
75 | GruvboxAquaUnderline = { undercurl = config.undercurl, sp = colors.aqua },
76 | GruvboxOrangeUnderline = { undercurl = config.undercurl, sp = colors.orange },
77 | Normal = config.transparent_mode and { fg = colors.fg1, bg = nil } or { fg = colors.fg1, bg = colors.bg0 },
78 | NormalFloat = config.transparent_mode and { fg = colors.fg1, bg = nil } or { fg = colors.fg1, bg = colors.bg1 },
79 | NormalNC = config.dim_inactive and { fg = colors.fg0, bg = colors.bg1 } or { link = "Normal" },
80 | CursorLine = { bg = colors.bg1 },
81 | CursorColumn = { link = "CursorLine" },
82 | TabLineFill = { fg = colors.bg4, bg = colors.bg1, reverse = config.invert_tabline },
83 | TabLineSel = { fg = colors.green, bg = colors.bg1, reverse = config.invert_tabline },
84 | TabLine = { link = "TabLineFill" },
85 | MatchParen = { bg = colors.bg3, bold = config.bold },
86 | ColorColumn = { bg = colors.bg1 },
87 | Conceal = { fg = colors.blue },
88 | CursorLineNr = { fg = colors.yellow, bg = colors.bg1 },
89 | NonText = { link = "GruvboxBg2" },
90 | SpecialKey = { link = "GruvboxFg4" },
91 | Visual = { bg = colors.bg3, reverse = config.invert_selection },
92 | VisualNOS = { link = "Visual" },
93 | Search = { fg = colors.yellow, bg = colors.bg0, reverse = config.inverse },
94 | IncSearch = { fg = colors.orange, bg = colors.bg0, reverse = config.inverse },
95 | CurSearch = { link = "IncSearch" },
96 | QuickFixLine = { fg = colors.bg0, bg = colors.yellow, bold = config.bold },
97 | Underlined = { fg = colors.blue, underline = config.underline },
98 | StatusLine = { fg = colors.bg2, bg = colors.fg1, reverse = config.inverse },
99 | StatusLineNC = { fg = colors.bg1, bg = colors.fg4, reverse = config.inverse },
100 | WinBar = { fg = colors.fg4, bg = colors.bg0 },
101 | WinBarNC = { fg = colors.fg3, bg = colors.bg1 },
102 | WinSeparator = config.transparent_mode and { fg = colors.bg3, bg = nil } or { fg = colors.bg3, bg = colors.bg0 },
103 | WildMenu = { fg = colors.blue, bg = colors.bg2, bold = config.bold },
104 | Directory = { link = "GruvboxBlueBold" },
105 | Title = { link = "GruvboxGreenBold" },
106 | ErrorMsg = { fg = colors.bg0, bg = colors.red, bold = config.bold },
107 | MoreMsg = { link = "GruvboxYellowBold" },
108 | ModeMsg = { link = "GruvboxYellowBold" },
109 | Question = { link = "GruvboxOrangeBold" },
110 | WarningMsg = { link = "GruvboxRedBold" },
111 | LineNr = { fg = colors.bg4 },
112 | SignColumn = config.transparent_mode and { bg = nil } or { bg = colors.bg1 },
113 | Folded = { fg = colors.gray, bg = colors.bg1, italic = config.italic.folds },
114 | FoldColumn = config.transparent_mode and { fg = colors.gray, bg = nil } or { fg = colors.gray, bg = colors.bg1 },
115 | Cursor = { reverse = config.inverse },
116 | vCursor = { link = "Cursor" },
117 | iCursor = { link = "Cursor" },
118 | lCursor = { link = "Cursor" },
119 | Special = { link = "GruvboxOrange" },
120 | Comment = { fg = colors.gray, italic = config.italic.comments },
121 | -- Todo anything that needs extra attention; mostly the
122 | -- keywords TODO FIXME and XXX
123 | Todo = { fg = colors.bg0, bg = colors.yellow, bold = config.bold, italic = config.italic.comments },
124 | Done = { fg = colors.orange, bold = config.bold, italic = config.italic.comments },
125 | Error = { fg = colors.red, bold = config.bold, reverse = config.inverse },
126 | Statement = { link = "GruvboxRed" },
127 | Conditional = { link = "GruvboxRed" },
128 | Repeat = { link = "GruvboxRed" },
129 | Label = { link = "GruvboxRed" },
130 | Exception = { link = "GruvboxRed" },
131 | Operator = { fg = colors.orange, italic = config.italic.operators },
132 | Keyword = { link = "GruvboxRed" },
133 | Identifier = { link = "GruvboxBlue" },
134 | Function = { link = "GruvboxGreenBold" },
135 | PreProc = { link = "GruvboxAqua" },
136 | Include = { link = "GruvboxAqua" },
137 | Define = { link = "GruvboxAqua" },
138 | Macro = { link = "GruvboxAqua" },
139 | PreCondit = { link = "GruvboxAqua" },
140 | Constant = { link = "GruvboxPurple" },
141 | Character = { link = "GruvboxPurple" },
142 | String = { fg = colors.green, italic = config.italic.strings },
143 | Boolean = { link = "GruvboxPurple" },
144 | Number = { link = "GruvboxPurple" },
145 | Float = { link = "GruvboxPurple" },
146 | Type = { link = "GruvboxYellow" },
147 | StorageClass = { link = "GruvboxOrange" },
148 | Structure = { link = "GruvboxAqua" },
149 | Typedef = { link = "GruvboxYellow" },
150 | Pmenu = { fg = colors.fg1, bg = colors.bg2 },
151 | PmenuSel = { fg = colors.bg2, bg = colors.blue, bold = config.bold },
152 | PmenuSbar = { bg = colors.bg2 },
153 | PmenuThumb = { bg = colors.bg4 },
154 | DiffDelete = { fg = colors.red, bg = colors.bg0, reverse = config.inverse },
155 | DiffAdd = { fg = colors.green, bg = colors.bg0, reverse = config.inverse },
156 | DiffChange = { fg = colors.aqua, bg = colors.bg0, reverse = config.inverse },
157 | DiffText = { fg = colors.yellow, bg = colors.bg0, reverse = config.inverse },
158 | SpellCap = { link = "GruvboxBlueUnderline" },
159 | SpellBad = { link = "GruvboxRedUnderline" },
160 | SpellLocal = { link = "GruvboxAquaUnderline" },
161 | SpellRare = { link = "GruvboxPurpleUnderline" },
162 | Whitespace = { fg = colors.bg2 },
163 | -- LSP Diagnostic
164 | DiagnosticError = { link = "GruvboxRed" },
165 | DiagnosticSignError = { link = "GruvboxRedSign" },
166 | DiagnosticUnderlineError = { link = "GruvboxRedUnderline" },
167 | DiagnosticWarn = { link = "GruvboxYellow" },
168 | DiagnosticSignWarn = { link = "GruvboxYellowSign" },
169 | DiagnosticUnderlineWarn = { link = "GruvboxYellowUnderline" },
170 | DiagnosticInfo = { link = "GruvboxBlue" },
171 | DiagnosticSignInfo = { link = "GruvboxBlueSign" },
172 | DiagnosticUnderlineInfo = { link = "GruvboxBlueUnderline" },
173 | DiagnosticHint = { link = "GruvboxAqua" },
174 | DiagnosticSignHint = { link = "GruvboxAquaSign" },
175 | DiagnosticUnderlineHint = { link = "GruvboxAquaUnderline" },
176 | DiagnosticFloatingError = { link = "GruvboxRed" },
177 | DiagnosticFloatingWarn = { link = "GruvboxOrange" },
178 | DiagnosticFloatingInfo = { link = "GruvboxBlue" },
179 | DiagnosticFloatingHint = { link = "GruvboxAqua" },
180 | DiagnosticVirtualTextError = { link = "GruvboxRed" },
181 | DiagnosticVirtualTextWarn = { link = "GruvboxYellow" },
182 | DiagnosticVirtualTextInfo = { link = "GruvboxBlue" },
183 | DiagnosticVirtualTextHint = { link = "GruvboxAqua" },
184 | LspReferenceRead = { link = "GruvboxYellowBold" },
185 | LspReferenceText = { link = "GruvboxYellowBold" },
186 | LspReferenceWrite = { link = "GruvboxOrangeBold" },
187 | LspCodeLens = { link = "GruvboxGray" },
188 | LspSignatureActiveParameter = { link = "Search" },
189 |
190 | -- nvim-treesitter
191 | -- See `nvim-treesitter/CONTRIBUTING.md`
192 |
193 | --
194 | -- Misc
195 | --
196 | -- @comment ; line and block comments
197 | ["@comment"] = { link = "Comment" },
198 | -- @comment.documentation ; comments documenting code
199 | -- @none ; completely disable the highlight
200 | ["@none"] = { bg = "NONE", fg = "NONE" },
201 | -- @preproc ; various preprocessor directives & shebangs
202 | ["@preproc"] = { link = "PreProc" },
203 | -- @define ; preprocessor definition directives
204 | ["@define"] = { link = "Define" },
205 | -- @operator ; symbolic operators (e.g. `+` / `*`)
206 | ["@operator"] = { link = "Operator" },
207 |
208 | --
209 | -- Punctuation
210 | --
211 | -- @punctuation.delimiter ; delimiters (e.g. `;` / `.` / `,`)
212 | ["@punctuation.delimiter"] = { link = "Delimiter" },
213 | -- @punctuation.bracket ; brackets (e.g. `()` / `{}` / `[]`)
214 | ["@punctuation.bracket"] = { link = "Delimiter" },
215 | -- @punctuation.special ; special symbols (e.g. `{}` in string interpolation)
216 | ["@punctuation.special"] = { link = "Delimiter" },
217 |
218 | --
219 | -- Literals
220 | --
221 | -- @string ; string literals
222 | ["@string"] = { link = "String" },
223 | -- @string.documentation ; string documenting code (e.g. Python docstrings)
224 | -- @string.regex ; regular expressions
225 | ["@string.regex"] = { link = "String" },
226 | -- @string.escape ; escape sequences
227 | ["@string.escape"] = { link = "SpecialChar" },
228 | -- @string.special ; other special strings (e.g. dates)
229 | ["@string.special"] = { link = "SpecialChar" },
230 |
231 | -- @character ; character literals
232 | ["@character"] = { link = "Character" },
233 | -- @character.special ; special characters (e.g. wildcards)
234 | ["@character.special"] = { link = "SpecialChar" },
235 |
236 | -- @boolean ; boolean literals
237 | ["@boolean"] = { link = "Boolean" },
238 | -- @number ; numeric literals
239 | ["@number"] = { link = "Number" },
240 | -- @float ; floating-point number literals
241 | ["@float"] = { link = "Float" },
242 |
243 | --
244 | -- Functions
245 | --
246 | -- @function ; function definitions
247 | ["@function"] = { link = "Function" },
248 | -- @function.builtin ; built-in functions
249 | ["@function.builtin"] = { link = "Special" },
250 | -- @function.call ; function calls
251 | ["@function.call"] = { link = "Function" },
252 | -- @function.macro ; preprocessor macros
253 | ["@function.macro"] = { link = "Macro" },
254 |
255 | -- @method ; method definitions
256 | ["@method"] = { link = "Function" },
257 | -- @method.call ; method calls
258 | ["@method.call"] = { link = "Function" },
259 |
260 | -- @constructor ; constructor calls and definitions
261 | ["@constructor"] = { link = "Special" },
262 | -- @parameter ; parameters of a function
263 | ["@parameter"] = { link = "Identifier" },
264 |
265 | --
266 | -- Keywords
267 | --
268 | -- @keyword ; various keywords
269 | ["@keyword"] = { link = "Keyword" },
270 | -- @keyword.coroutine ; keywords related to coroutines (e.g. `go` in Go, `async/await` in Python)
271 | -- @keyword.function ; keywords that define a function (e.g. `func` in Go, `def` in Python)
272 | ["@keyword.function"] = { link = "Keyword" },
273 | -- @keyword.operator ; operators that are English words (e.g. `and` / `or`)
274 | ["@keyword.operator"] = { link = "GruvboxRed" },
275 | -- @keyword.return ; keywords like `return` and `yield`
276 | ["@keyword.return"] = { link = "Keyword" },
277 |
278 | -- @conditional ; keywords related to conditionals (e.g. `if` / `else`)
279 | ["@conditional"] = { link = "Conditional" },
280 | -- @conditional.ternary ; ternary operator (e.g. `?` / `:`)
281 |
282 | -- @repeat ; keywords related to loops (e.g. `for` / `while`)
283 | ["@repeat"] = { link = "Repeat" },
284 | -- @debug ; keywords related to debugging
285 | ["@debug"] = { link = "Debug" },
286 | -- @label ; GOTO and other labels (e.g. `label:` in C)
287 | ["@label"] = { link = "Label" },
288 | -- @include ; keywords for including modules (e.g. `import` / `from` in Python)
289 | ["@include"] = { link = "Include" },
290 | -- @exception ; keywords related to exceptions (e.g. `throw` / `catch`)
291 | ["@exception"] = { link = "Exception" },
292 |
293 | --
294 | -- Types
295 | --
296 | -- @type ; type or class definitions and annotations
297 | ["@type"] = { link = "Type" },
298 | -- @type.builtin ; built-in types
299 | ["@type.builtin"] = { link = "Type" },
300 | -- @type.definition ; type definitions (e.g. `typedef` in C)
301 | ["@type.definition"] = { link = "Typedef" },
302 | -- @type.qualifier ; type qualifiers (e.g. `const`)
303 | ["@type.qualifier"] = { link = "Type" },
304 |
305 | -- @storageclass ; modifiers that affect storage in memory or life-time
306 | ["@storageclass"] = { link = "StorageClass" },
307 | -- @attribute ; attribute annotations (e.g. Python decorators)
308 | ["@attribute"] = { link = "PreProc" },
309 | -- @field ; object and struct fields
310 | ["@field"] = { link = "Identifier" },
311 | -- @property ; similar to `@field`
312 | ["@property"] = { link = "Identifier" },
313 |
314 | --
315 | -- Identifiers
316 | --
317 | -- @variable ; various variable names
318 | ["@variable"] = { link = "GruvboxFg1" },
319 | -- @variable.builtin ; built-in variable names (e.g. `this`)
320 | ["@variable.builtin"] = { link = "Special" },
321 |
322 | -- @constant ; constant identifiers
323 | ["@constant"] = { link = "Constant" },
324 | -- @constant.builtin ; built-in constant values
325 | ["@constant.builtin"] = { link = "Special" },
326 | -- @constant.macro ; constants defined by the preprocessor
327 | ["@constant.macro"] = { link = "Define" },
328 |
329 | -- @namespace ; modules or namespaces
330 | ["@namespace"] = { link = "GruvboxFg1" },
331 | -- @symbol ; symbols or atoms
332 | ["@symbol"] = { link = "Identifier" },
333 |
334 | --
335 | -- Text
336 | --
337 | -- @text ; non-structured text
338 | ["@text"] = { link = "GruvboxFg1" },
339 | -- @text.strong ; bold text
340 | ["@text.strong"] = { bold = config.bold },
341 | -- @text.emphasis ; text with emphasis
342 | ["@text.emphasis"] = { italic = config.italic.strings },
343 | -- @text.underline ; underlined text
344 | ["@text.underline"] = { underline = config.underline },
345 | -- @text.strike ; strikethrough text
346 | ["@text.strike"] = { strikethrough = config.strikethrough },
347 | -- @text.title ; text that is part of a title
348 | ["@text.title"] = { link = "Title" },
349 | -- @text.literal ; literal or verbatim text (e.g., inline code)
350 | ["@text.literal"] = { link = "String" },
351 | -- @text.quote ; text quotations
352 | -- @text.uri ; URIs (e.g. hyperlinks)
353 | ["@text.uri"] = { link = "Underlined" },
354 | -- @text.math ; math environments (e.g. `$ ... $` in LaTeX)
355 | ["@text.math"] = { link = "Special" },
356 | -- @text.environment ; text environments of markup languages
357 | ["@text.environment"] = { link = "Macro" },
358 | -- @text.environment.name ; text indicating the type of an environment
359 | ["@text.environment.name"] = { link = "Type" },
360 | -- @text.reference ; text references, footnotes, citations, etc.
361 | ["@text.reference"] = { link = "Constant" },
362 |
363 | -- @text.todo ; todo notes
364 | ["@text.todo"] = { link = "Todo" },
365 | -- @text.note ; info notes
366 | ["@text.note"] = { link = "SpecialComment" },
367 | -- @text.note.comment ; XXX in comments
368 | ["@text.note.comment"] = { fg = colors.purple, bold = config.bold },
369 | -- @text.warning ; warning notes
370 | ["@text.warning"] = { link = "WarningMsg" },
371 | -- @text.danger ; danger/error notes
372 | ["@text.danger"] = { link = "ErrorMsg" },
373 | -- @text.danger.comment ; FIXME in comments
374 | ["@text.danger.comment"] = { fg = colors.fg0, bg = colors.red, bold = config.bold },
375 |
376 | -- @text.diff.add ; added text (for diff files)
377 | ["@text.diff.add"] = { link = "diffAdded" },
378 | -- @text.diff.delete ; deleted text (for diff files)
379 | ["@text.diff.delete"] = { link = "diffRemoved" },
380 |
381 | --
382 | -- Tags
383 | --
384 | -- @tag ; XML tag names
385 | ["@tag"] = { link = "Tag" },
386 | -- @tag.attribute ; XML tag attributes
387 | ["@tag.attribute"] = { link = "Identifier" },
388 | -- @tag.delimiter ; XML tag delimiters
389 | ["@tag.delimiter"] = { link = "Delimiter" },
390 |
391 | --
392 | -- Conceal
393 | --
394 | -- @conceal ; for captures that are only used for concealing
395 |
396 | --
397 | -- Spell
398 | --
399 | -- @spell ; for defining regions to be spellchecked
400 | -- @nospell ; for defining regions that should NOT be spellchecked
401 |
402 | -- Treesitter
403 | -- See `:help treesitter`
404 | -- Those are not part of the nvim-treesitter
405 | ["@punctuation"] = { link = "Delimiter" },
406 | ["@macro"] = { link = "Macro" },
407 | ["@structure"] = { link = "Structure" },
408 |
409 | -- Semantic token
410 | -- See `:help lsp-semantic-highlight`
411 | ["@lsp.type.class"] = { link = "@constructor" },
412 | ["@lsp.type.comment"] = {}, -- do not overwrite comments
413 | ["@lsp.type.decorator"] = { link = "@parameter" },
414 | ["@lsp.type.enum"] = { link = "@type" },
415 | ["@lsp.type.enumMember"] = { link = "@constant" },
416 | ["@lsp.type.function"] = { link = "@function" },
417 | ["@lsp.type.interface"] = { link = "@keyword" },
418 | ["@lsp.type.macro"] = { link = "@macro" },
419 | ["@lsp.type.method"] = { link = "@method" },
420 | ["@lsp.type.namespace"] = { link = "@namespace" },
421 | ["@lsp.type.parameter"] = { link = "@parameter" },
422 | ["@lsp.type.property"] = { link = "@property" },
423 | ["@lsp.type.struct"] = { link = "@constructor" },
424 | ["@lsp.type.type"] = { link = "@type" },
425 | ["@lsp.type.typeParameter"] = { link = "@type.definition" },
426 | ["@lsp.type.variable"] = { link = "@variable" },
427 |
428 | -- gitcommit
429 | gitcommitSelectedFile = { link = "GruvboxGreen" },
430 | gitcommitDiscardedFile = { link = "GruvboxRed" },
431 | -- gitsigns.nvim
432 | GitSignsAdd = { link = "GruvboxGreenSign" },
433 | GitSignsChange = { link = "GruvboxAquaSign" },
434 | GitSignsDelete = { link = "GruvboxRedSign" },
435 | -- nvim-tree
436 | NvimTreeSymlink = { fg = colors.neutral_aqua },
437 | NvimTreeRootFolder = { fg = colors.neutral_purple, bold = true },
438 | NvimTreeFolderIcon = { fg = colors.neutral_blue, bold = true },
439 | NvimTreeFileIcon = { fg = colors.light2 },
440 | NvimTreeExecFile = { fg = colors.neutral_green, bold = true },
441 | NvimTreeOpenedFile = { fg = colors.bright_red, bold = true },
442 | NvimTreeSpecialFile = { fg = colors.neutral_yellow, bold = true, underline = true },
443 | NvimTreeImageFile = { fg = colors.neutral_purple },
444 | NvimTreeIndentMarker = { fg = colors.dark3 },
445 | NvimTreeGitDirty = { fg = colors.neutral_yellow },
446 | NvimTreeGitStaged = { fg = colors.neutral_yellow },
447 | NvimTreeGitMerge = { fg = colors.neutral_purple },
448 | NvimTreeGitRenamed = { fg = colors.neutral_purple },
449 | NvimTreeGitNew = { fg = colors.neutral_yellow },
450 | NvimTreeGitDeleted = { fg = colors.neutral_red },
451 | NvimTreeWindowPicker = { bg = colors.faded_aqua },
452 | -- termdebug
453 | debugPC = { bg = colors.faded_blue },
454 | debugBreakpoint = { link = "GruvboxRedSign" },
455 | -- vim-startify
456 | StartifyBracket = { link = "GruvboxFg3" },
457 | StartifyFile = { link = "GruvboxFg1" },
458 | StartifyNumber = { link = "GruvboxBlue" },
459 | StartifyPath = { link = "GruvboxGray" },
460 | StartifySlash = { link = "GruvboxGray" },
461 | StartifySection = { link = "GruvboxYellow" },
462 | StartifySpecial = { link = "GruvboxBg2" },
463 | StartifyHeader = { link = "GruvboxOrange" },
464 | StartifyFooter = { link = "GruvboxBg2" },
465 | StartifyVar = { link = "StartifyPath" },
466 | StartifySelect = { link = "Title" },
467 | -- vim-dirvish
468 | DirvishPathTail = { link = "GruvboxAqua" },
469 | DirvishArg = { link = "GruvboxYellow" },
470 | -- netrw
471 | netrwDir = { link = "GruvboxAqua" },
472 | netrwClassify = { link = "GruvboxAqua" },
473 | netrwLink = { link = "GruvboxGray" },
474 | netrwSymLink = { link = "GruvboxFg1" },
475 | netrwExe = { link = "GruvboxYellow" },
476 | netrwComment = { link = "GruvboxGray" },
477 | netrwList = { link = "GruvboxBlue" },
478 | netrwHelpCmd = { link = "GruvboxAqua" },
479 | netrwCmdSep = { link = "GruvboxFg3" },
480 | netrwVersion = { link = "GruvboxGreen" },
481 | -- nerdtree
482 | NERDTreeDir = { link = "GruvboxAqua" },
483 | NERDTreeDirSlash = { link = "GruvboxAqua" },
484 | NERDTreeOpenable = { link = "GruvboxOrange" },
485 | NERDTreeClosable = { link = "GruvboxOrange" },
486 | NERDTreeFile = { link = "GruvboxFg1" },
487 | NERDTreeExecFile = { link = "GruvboxYellow" },
488 | NERDTreeUp = { link = "GruvboxGray" },
489 | NERDTreeCWD = { link = "GruvboxGreen" },
490 | NERDTreeHelp = { link = "GruvboxFg1" },
491 | NERDTreeToggleOn = { link = "GruvboxGreen" },
492 | NERDTreeToggleOff = { link = "GruvboxRed" },
493 | -- coc.nvim
494 | CocErrorSign = { link = "GruvboxRedSign" },
495 | CocWarningSign = { link = "GruvboxOrangeSign" },
496 | CocInfoSign = { link = "GruvboxBlueSign" },
497 | CocHintSign = { link = "GruvboxAquaSign" },
498 | CocErrorFloat = { link = "GruvboxRed" },
499 | CocWarningFloat = { link = "GruvboxOrange" },
500 | CocInfoFloat = { link = "GruvboxBlue" },
501 | CocHintFloat = { link = "GruvboxAqua" },
502 | CocDiagnosticsError = { link = "GruvboxRed" },
503 | CocDiagnosticsWarning = { link = "GruvboxOrange" },
504 | CocDiagnosticsInfo = { link = "GruvboxBlue" },
505 | CocDiagnosticsHint = { link = "GruvboxAqua" },
506 | CocSelectedText = { link = "GruvboxRed" },
507 | CocMenuSel = { link = "PmenuSel" },
508 | CocCodeLens = { link = "GruvboxGray" },
509 | CocErrorHighlight = { link = "GruvboxRedUnderline" },
510 | CocWarningHighlight = { link = "GruvboxOrangeUnderline" },
511 | CocInfoHighlight = { link = "GruvboxBlueUnderline" },
512 | CocHintHighlight = { link = "GruvboxAquaUnderline" },
513 | -- telescope.nvim
514 | TelescopeNormal = { link = "GruvboxFg1" },
515 | TelescopeSelection = { link = "GruvboxOrangeBold" },
516 | TelescopeSelectionCaret = { link = "GruvboxRed" },
517 | TelescopeMultiSelection = { link = "GruvboxGray" },
518 | TelescopeBorder = { link = "TelescopeNormal" },
519 | TelescopePromptBorder = { link = "TelescopeNormal" },
520 | TelescopeResultsBorder = { link = "TelescopeNormal" },
521 | TelescopePreviewBorder = { link = "TelescopeNormal" },
522 | TelescopeMatching = { link = "GruvboxBlue" },
523 | TelescopePromptPrefix = { link = "GruvboxRed" },
524 | TelescopePrompt = { link = "TelescopeNormal" },
525 | -- nvim-cmp
526 | CmpItemAbbr = { link = "GruvboxFg0" },
527 | CmpItemAbbrDeprecated = { link = "GruvboxFg1" },
528 | CmpItemAbbrMatch = { link = "GruvboxBlueBold" },
529 | CmpItemAbbrMatchFuzzy = { link = "GruvboxBlueUnderline" },
530 | CmpItemMenu = { link = "GruvboxGray" },
531 | CmpItemKindText = { link = "GruvboxOrange" },
532 | CmpItemKindVariable = { link = "GruvboxOrange" },
533 | CmpItemKindMethod = { link = "GruvboxBlue" },
534 | CmpItemKindFunction = { link = "GruvboxBlue" },
535 | CmpItemKindConstructor = { link = "GruvboxYellow" },
536 | CmpItemKindUnit = { link = "GruvboxBlue" },
537 | CmpItemKindField = { link = "GruvboxBlue" },
538 | CmpItemKindClass = { link = "GruvboxYellow" },
539 | CmpItemKindInterface = { link = "GruvboxYellow" },
540 | CmpItemKindModule = { link = "GruvboxBlue" },
541 | CmpItemKindProperty = { link = "GruvboxBlue" },
542 | CmpItemKindValue = { link = "GruvboxOrange" },
543 | CmpItemKindEnum = { link = "GruvboxYellow" },
544 | CmpItemKindOperator = { link = "GruvboxYellow" },
545 | CmpItemKindKeyword = { link = "GruvboxPurple" },
546 | CmpItemKindEvent = { link = "GruvboxPurple" },
547 | CmpItemKindReference = { link = "GruvboxPurple" },
548 | CmpItemKindColor = { link = "GruvboxPurple" },
549 | CmpItemKindSnippet = { link = "GruvboxGreen" },
550 | CmpItemKindFile = { link = "GruvboxBlue" },
551 | CmpItemKindFolder = { link = "GruvboxBlue" },
552 | CmpItemKindEnumMember = { link = "GruvboxAqua" },
553 | CmpItemKindConstant = { link = "GruvboxOrange" },
554 | CmpItemKindStruct = { link = "GruvboxYellow" },
555 | CmpItemKindTypeParameter = { link = "GruvboxYellow" },
556 | diffAdded = { link = "GruvboxGreen" },
557 | diffRemoved = { link = "GruvboxRed" },
558 | diffChanged = { link = "GruvboxAqua" },
559 | diffFile = { link = "GruvboxOrange" },
560 | diffNewFile = { link = "GruvboxYellow" },
561 | diffOldFile = { link = "GruvboxOrange" },
562 | diffLine = { link = "GruvboxBlue" },
563 | diffIndexLine = { link = "diffChanged" },
564 | -- navic (highlight icons)
565 | NavicIconsFile = { link = "GruvboxBlue" },
566 | NavicIconsModule = { link = "GruvboxOrange" },
567 | NavicIconsNamespace = { link = "GruvboxBlue" },
568 | NavicIconsPackage = { link = "GruvboxAqua" },
569 | NavicIconsClass = { link = "GruvboxYellow" },
570 | NavicIconsMethod = { link = "GruvboxBlue" },
571 | NavicIconsProperty = { link = "GruvboxAqua" },
572 | NavicIconsField = { link = "GruvboxPurple" },
573 | NavicIconsConstructor = { link = "GruvboxBlue" },
574 | NavicIconsEnum = { link = "GruvboxPurple" },
575 | NavicIconsInterface = { link = "GruvboxGreen" },
576 | NavicIconsFunction = { link = "GruvboxBlue" },
577 | NavicIconsVariable = { link = "GruvboxPurple" },
578 | NavicIconsConstant = { link = "GruvboxOrange" },
579 | NavicIconsString = { link = "GruvboxGreen" },
580 | NavicIconsNumber = { link = "GruvboxOrange" },
581 | NavicIconsBoolean = { link = "GruvboxOrange" },
582 | NavicIconsArray = { link = "GruvboxOrange" },
583 | NavicIconsObject = { link = "GruvboxOrange" },
584 | NavicIconsKey = { link = "GruvboxAqua" },
585 | NavicIconsNull = { link = "GruvboxOrange" },
586 | NavicIconsEnumMember = { link = "GruvboxYellow" },
587 | NavicIconsStruct = { link = "GruvboxPurple" },
588 | NavicIconsEvent = { link = "GruvboxYellow" },
589 | NavicIconsOperator = { link = "GruvboxRed" },
590 | NavicIconsTypeParameter = { link = "GruvboxRed" },
591 | NavicText = { link = "GruvboxWhite" },
592 | NavicSeparator = { link = "GruvboxWhite" },
593 | -- html
594 | htmlTag = { link = "GruvboxAquaBold" },
595 | htmlEndTag = { link = "GruvboxAquaBold" },
596 | htmlTagName = { link = "GruvboxBlue" },
597 | htmlArg = { link = "GruvboxOrange" },
598 | htmlTagN = { link = "GruvboxFg1" },
599 | htmlSpecialTagName = { link = "GruvboxBlue" },
600 | htmlLink = { fg = colors.fg4, underline = config.underline },
601 | htmlSpecialChar = { link = "GruvboxRed" },
602 | htmlBold = { fg = colors.fg0, bg = colors.bg0, bold = config.bold },
603 | htmlBoldUnderline = { fg = colors.fg0, bg = colors.bg0, bold = config.bold, underline = config.underline },
604 | htmlBoldItalic = { fg = colors.fg0, bg = colors.bg0, bold = config.bold, italic = true },
605 | htmlBoldUnderlineItalic = {
606 | fg = colors.fg0,
607 | bg = colors.bg0,
608 | bold = config.bold,
609 | italic = true,
610 | underline = config.underline,
611 | },
612 | htmlUnderline = { fg = colors.fg0, bg = colors.bg0, underline = config.underline },
613 | htmlUnderlineItalic = {
614 | fg = colors.fg0,
615 | bg = colors.bg0,
616 | italic = true,
617 | underline = config.underline,
618 | },
619 | htmlItalic = { fg = colors.fg0, bg = colors.bg0, italic = true },
620 | -- xml
621 | xmlTag = { link = "GruvboxAquaBold" },
622 | xmlEndTag = { link = "GruvboxAquaBold" },
623 | xmlTagName = { link = "GruvboxBlue" },
624 | xmlEqual = { link = "GruvboxBlue" },
625 | docbkKeyword = { link = "GruvboxAquaBold" },
626 | xmlDocTypeDecl = { link = "GruvboxGray" },
627 | xmlDocTypeKeyword = { link = "GruvboxPurple" },
628 | xmlCdataStart = { link = "GruvboxGray" },
629 | xmlCdataCdata = { link = "GruvboxPurple" },
630 | dtdFunction = { link = "GruvboxGray" },
631 | dtdTagName = { link = "GruvboxPurple" },
632 | xmlAttrib = { link = "GruvboxOrange" },
633 | xmlProcessingDelim = { link = "GruvboxGray" },
634 | dtdParamEntityPunct = { link = "GruvboxGray" },
635 | dtdParamEntityDPunct = { link = "GruvboxGray" },
636 | xmlAttribPunct = { link = "GruvboxGray" },
637 | xmlEntity = { link = "GruvboxRed" },
638 | xmlEntityPunct = { link = "GruvboxRed" },
639 | -- clojure
640 | clojureKeyword = { link = "GruvboxBlue" },
641 | clojureCond = { link = "GruvboxOrange" },
642 | clojureSpecial = { link = "GruvboxOrange" },
643 | clojureDefine = { link = "GruvboxOrange" },
644 | clojureFunc = { link = "GruvboxYellow" },
645 | clojureRepeat = { link = "GruvboxYellow" },
646 | clojureCharacter = { link = "GruvboxAqua" },
647 | clojureStringEscape = { link = "GruvboxAqua" },
648 | clojureException = { link = "GruvboxRed" },
649 | clojureRegexp = { link = "GruvboxAqua" },
650 | clojureRegexpEscape = { link = "GruvboxAqua" },
651 | clojureRegexpCharClass = { fg = colors.fg3, bold = config.bold },
652 | clojureRegexpMod = { link = "clojureRegexpCharClass" },
653 | clojureRegexpQuantifier = { link = "clojureRegexpCharClass" },
654 | clojureParen = { link = "GruvboxFg3" },
655 | clojureAnonArg = { link = "GruvboxYellow" },
656 | clojureVariable = { link = "GruvboxBlue" },
657 | clojureMacro = { link = "GruvboxOrange" },
658 | clojureMeta = { link = "GruvboxYellow" },
659 | clojureDeref = { link = "GruvboxYellow" },
660 | clojureQuote = { link = "GruvboxYellow" },
661 | clojureUnquote = { link = "GruvboxYellow" },
662 | -- C
663 | cOperator = { link = "GruvboxPurple" },
664 | cppOperator = { link = "GruvboxPurple" },
665 | cStructure = { link = "GruvboxOrange" },
666 | -- python
667 | pythonBuiltin = { link = "GruvboxOrange" },
668 | pythonBuiltinObj = { link = "GruvboxOrange" },
669 | pythonBuiltinFunc = { link = "GruvboxOrange" },
670 | pythonFunction = { link = "GruvboxAqua" },
671 | pythonDecorator = { link = "GruvboxRed" },
672 | pythonInclude = { link = "GruvboxBlue" },
673 | pythonImport = { link = "GruvboxBlue" },
674 | pythonRun = { link = "GruvboxBlue" },
675 | pythonCoding = { link = "GruvboxBlue" },
676 | pythonOperator = { link = "GruvboxRed" },
677 | pythonException = { link = "GruvboxRed" },
678 | pythonExceptions = { link = "GruvboxPurple" },
679 | pythonBoolean = { link = "GruvboxPurple" },
680 | pythonDot = { link = "GruvboxFg3" },
681 | pythonConditional = { link = "GruvboxRed" },
682 | pythonRepeat = { link = "GruvboxRed" },
683 | pythonDottedName = { link = "GruvboxGreenBold" },
684 | -- CSS
685 | cssBraces = { link = "GruvboxBlue" },
686 | cssFunctionName = { link = "GruvboxYellow" },
687 | cssIdentifier = { link = "GruvboxOrange" },
688 | cssClassName = { link = "GruvboxGreen" },
689 | cssColor = { link = "GruvboxBlue" },
690 | cssSelectorOp = { link = "GruvboxBlue" },
691 | cssSelectorOp2 = { link = "GruvboxBlue" },
692 | cssImportant = { link = "GruvboxGreen" },
693 | cssVendor = { link = "GruvboxFg1" },
694 | cssTextProp = { link = "GruvboxAqua" },
695 | cssAnimationProp = { link = "GruvboxAqua" },
696 | cssUIProp = { link = "GruvboxYellow" },
697 | cssTransformProp = { link = "GruvboxAqua" },
698 | cssTransitionProp = { link = "GruvboxAqua" },
699 | cssPrintProp = { link = "GruvboxAqua" },
700 | cssPositioningProp = { link = "GruvboxYellow" },
701 | cssBoxProp = { link = "GruvboxAqua" },
702 | cssFontDescriptorProp = { link = "GruvboxAqua" },
703 | cssFlexibleBoxProp = { link = "GruvboxAqua" },
704 | cssBorderOutlineProp = { link = "GruvboxAqua" },
705 | cssBackgroundProp = { link = "GruvboxAqua" },
706 | cssMarginProp = { link = "GruvboxAqua" },
707 | cssListProp = { link = "GruvboxAqua" },
708 | cssTableProp = { link = "GruvboxAqua" },
709 | cssFontProp = { link = "GruvboxAqua" },
710 | cssPaddingProp = { link = "GruvboxAqua" },
711 | cssDimensionProp = { link = "GruvboxAqua" },
712 | cssRenderProp = { link = "GruvboxAqua" },
713 | cssColorProp = { link = "GruvboxAqua" },
714 | cssGeneratedContentProp = { link = "GruvboxAqua" },
715 | -- javascript
716 | javaScriptBraces = { link = "GruvboxFg1" },
717 | javaScriptFunction = { link = "GruvboxAqua" },
718 | javaScriptIdentifier = { link = "GruvboxRed" },
719 | javaScriptMember = { link = "GruvboxBlue" },
720 | javaScriptNumber = { link = "GruvboxPurple" },
721 | javaScriptNull = { link = "GruvboxPurple" },
722 | javaScriptParens = { link = "GruvboxFg3" },
723 | -- typescript
724 | typescriptReserved = { link = "GruvboxAqua" },
725 | typescriptLabel = { link = "GruvboxAqua" },
726 | typescriptFuncKeyword = { link = "GruvboxAqua" },
727 | typescriptIdentifier = { link = "GruvboxOrange" },
728 | typescriptBraces = { link = "GruvboxFg1" },
729 | typescriptEndColons = { link = "GruvboxFg1" },
730 | typescriptDOMObjects = { link = "GruvboxFg1" },
731 | typescriptAjaxMethods = { link = "GruvboxFg1" },
732 | typescriptLogicSymbols = { link = "GruvboxFg1" },
733 | typescriptDocSeeTag = { link = "Comment" },
734 | typescriptDocParam = { link = "Comment" },
735 | typescriptDocTags = { link = "vimCommentTitle" },
736 | typescriptGlobalObjects = { link = "GruvboxFg1" },
737 | typescriptParens = { link = "GruvboxFg3" },
738 | typescriptOpSymbols = { link = "GruvboxFg3" },
739 | typescriptHtmlElemProperties = { link = "GruvboxFg1" },
740 | typescriptNull = { link = "GruvboxPurple" },
741 | typescriptInterpolationDelimiter = { link = "GruvboxAqua" },
742 | -- purescript
743 | purescriptModuleKeyword = { link = "GruvboxAqua" },
744 | purescriptModuleName = { link = "GruvboxFg1" },
745 | purescriptWhere = { link = "GruvboxAqua" },
746 | purescriptDelimiter = { link = "GruvboxFg4" },
747 | purescriptType = { link = "GruvboxFg1" },
748 | purescriptImportKeyword = { link = "GruvboxAqua" },
749 | purescriptHidingKeyword = { link = "GruvboxAqua" },
750 | purescriptAsKeyword = { link = "GruvboxAqua" },
751 | purescriptStructure = { link = "GruvboxAqua" },
752 | purescriptOperator = { link = "GruvboxBlue" },
753 | purescriptTypeVar = { link = "GruvboxFg1" },
754 | purescriptConstructor = { link = "GruvboxFg1" },
755 | purescriptFunction = { link = "GruvboxFg1" },
756 | purescriptConditional = { link = "GruvboxOrange" },
757 | purescriptBacktick = { link = "GruvboxOrange" },
758 | -- coffescript
759 | coffeeExtendedOp = { link = "GruvboxFg3" },
760 | coffeeSpecialOp = { link = "GruvboxFg3" },
761 | coffeeCurly = { link = "GruvboxOrange" },
762 | coffeeParen = { link = "GruvboxFg3" },
763 | coffeeBracket = { link = "GruvboxOrange" },
764 | -- ruby
765 | rubyStringDelimiter = { link = "GruvboxGreen" },
766 | rubyInterpolationDelimiter = { link = "GruvboxAqua" },
767 | rubyDefinedOperator = { link = "rubyKeyword" },
768 | -- objc
769 | objcTypeModifier = { link = "GruvboxRed" },
770 | objcDirective = { link = "GruvboxBlue" },
771 | -- go
772 | goDirective = { link = "GruvboxAqua" },
773 | goConstants = { link = "GruvboxPurple" },
774 | goDeclaration = { link = "GruvboxRed" },
775 | goDeclType = { link = "GruvboxBlue" },
776 | goBuiltins = { link = "GruvboxOrange" },
777 | -- lua
778 | luaIn = { link = "GruvboxRed" },
779 | luaFunction = { link = "GruvboxAqua" },
780 | luaTable = { link = "GruvboxOrange" },
781 | -- moonscript
782 | moonSpecialOp = { link = "GruvboxFg3" },
783 | moonExtendedOp = { link = "GruvboxFg3" },
784 | moonFunction = { link = "GruvboxFg3" },
785 | moonObject = { link = "GruvboxYellow" },
786 | -- java
787 | javaAnnotation = { link = "GruvboxBlue" },
788 | javaDocTags = { link = "GruvboxAqua" },
789 | javaCommentTitle = { link = "vimCommentTitle" },
790 | javaParen = { link = "GruvboxFg3" },
791 | javaParen1 = { link = "GruvboxFg3" },
792 | javaParen2 = { link = "GruvboxFg3" },
793 | javaParen3 = { link = "GruvboxFg3" },
794 | javaParen4 = { link = "GruvboxFg3" },
795 | javaParen5 = { link = "GruvboxFg3" },
796 | javaOperator = { link = "GruvboxOrange" },
797 | javaVarArg = { link = "GruvboxGreen" },
798 | -- elixir
799 | elixirDocString = { link = "Comment" },
800 | elixirStringDelimiter = { link = "GruvboxGreen" },
801 | elixirInterpolationDelimiter = { link = "GruvboxAqua" },
802 | elixirModuleDeclaration = { link = "GruvboxYellow" },
803 | -- scala
804 | scalaNameDefinition = { link = "GruvboxFg1" },
805 | scalaCaseFollowing = { link = "GruvboxFg1" },
806 | scalaCapitalWord = { link = "GruvboxFg1" },
807 | scalaTypeExtension = { link = "GruvboxFg1" },
808 | scalaKeyword = { link = "GruvboxRed" },
809 | scalaKeywordModifier = { link = "GruvboxRed" },
810 | scalaSpecial = { link = "GruvboxAqua" },
811 | scalaOperator = { link = "GruvboxFg1" },
812 | scalaTypeDeclaration = { link = "GruvboxYellow" },
813 | scalaTypeTypePostDeclaration = { link = "GruvboxYellow" },
814 | scalaInstanceDeclaration = { link = "GruvboxFg1" },
815 | scalaInterpolation = { link = "GruvboxAqua" },
816 | -- markdown
817 | markdownItalic = { fg = colors.fg3, italic = true },
818 | markdownBold = { fg = colors.fg3, bold = config.bold },
819 | markdownBoldItalic = { fg = colors.fg3, bold = config.bold, italic = true },
820 | markdownH1 = { link = "GruvboxGreenBold" },
821 | markdownH2 = { link = "GruvboxGreenBold" },
822 | markdownH3 = { link = "GruvboxYellowBold" },
823 | markdownH4 = { link = "GruvboxYellowBold" },
824 | markdownH5 = { link = "GruvboxYellow" },
825 | markdownH6 = { link = "GruvboxYellow" },
826 | markdownCode = { link = "GruvboxAqua" },
827 | markdownCodeBlock = { link = "GruvboxAqua" },
828 | markdownCodeDelimiter = { link = "GruvboxAqua" },
829 | markdownBlockquote = { link = "GruvboxGray" },
830 | markdownListMarker = { link = "GruvboxGray" },
831 | markdownOrderedListMarker = { link = "GruvboxGray" },
832 | markdownRule = { link = "GruvboxGray" },
833 | markdownHeadingRule = { link = "GruvboxGray" },
834 | markdownUrlDelimiter = { link = "GruvboxFg3" },
835 | markdownLinkDelimiter = { link = "GruvboxFg3" },
836 | markdownLinkTextDelimiter = { link = "GruvboxFg3" },
837 | markdownHeadingDelimiter = { link = "GruvboxOrange" },
838 | markdownUrl = { link = "GruvboxPurple" },
839 | markdownUrlTitleDelimiter = { link = "GruvboxGreen" },
840 | markdownLinkText = { fg = colors.gray, underline = config.underline },
841 | markdownIdDeclaration = { link = "markdownLinkText" },
842 | -- haskell
843 | haskellType = { link = "GruvboxBlue" },
844 | haskellIdentifier = { link = "GruvboxAqua" },
845 | haskellSeparator = { link = "GruvboxFg4" },
846 | haskellDelimiter = { link = "GruvboxOrange" },
847 | haskellOperators = { link = "GruvboxPurple" },
848 | haskellBacktick = { link = "GruvboxOrange" },
849 | haskellStatement = { link = "GruvboxPurple" },
850 | haskellConditional = { link = "GruvboxPurple" },
851 | haskellLet = { link = "GruvboxRed" },
852 | haskellDefault = { link = "GruvboxRed" },
853 | haskellWhere = { link = "GruvboxRed" },
854 | haskellBottom = { link = "GruvboxRedBold" },
855 | haskellImportKeywords = { link = "GruvboxPurpleBold" },
856 | haskellDeclKeyword = { link = "GruvboxOrange" },
857 | haskellDecl = { link = "GruvboxOrange" },
858 | haskellDeriving = { link = "GruvboxPurple" },
859 | haskellAssocType = { link = "GruvboxAqua" },
860 | haskellNumber = { link = "GruvboxAqua" },
861 | haskellPragma = { link = "GruvboxRedBold" },
862 | haskellTH = { link = "GruvboxAquaBold" },
863 | haskellForeignKeywords = { link = "GruvboxGreen" },
864 | haskellKeyword = { link = "GruvboxRed" },
865 | haskellFloat = { link = "GruvboxAqua" },
866 | haskellInfix = { link = "GruvboxPurple" },
867 | haskellQuote = { link = "GruvboxGreenBold" },
868 | haskellShebang = { link = "GruvboxYellowBold" },
869 | haskellLiquid = { link = "GruvboxPurpleBold" },
870 | haskellQuasiQuoted = { link = "GruvboxBlueBold" },
871 | haskellRecursiveDo = { link = "GruvboxPurple" },
872 | haskellQuotedType = { link = "GruvboxRed" },
873 | haskellPreProc = { link = "GruvboxFg4" },
874 | haskellTypeRoles = { link = "GruvboxRedBold" },
875 | haskellTypeForall = { link = "GruvboxRed" },
876 | haskellPatternKeyword = { link = "GruvboxBlue" },
877 | -- json
878 | jsonKeyword = { link = "GruvboxGreen" },
879 | jsonQuote = { link = "GruvboxGreen" },
880 | jsonBraces = { link = "GruvboxFg1" },
881 | jsonString = { link = "GruvboxFg1" },
882 | -- mail
883 | mailQuoted1 = { link = "GruvboxAqua" },
884 | mailQuoted2 = { link = "GruvboxPurple" },
885 | mailQuoted3 = { link = "GruvboxYellow" },
886 | mailQuoted4 = { link = "GruvboxGreen" },
887 | mailQuoted5 = { link = "GruvboxRed" },
888 | mailQuoted6 = { link = "GruvboxOrange" },
889 | mailSignature = { link = "Comment" },
890 | -- c#
891 | csBraces = { link = "GruvboxFg1" },
892 | csEndColon = { link = "GruvboxFg1" },
893 | csLogicSymbols = { link = "GruvboxFg1" },
894 | csParens = { link = "GruvboxFg3" },
895 | csOpSymbols = { link = "GruvboxFg3" },
896 | csInterpolationDelimiter = { link = "GruvboxFg3" },
897 | csInterpolationAlignDel = { link = "GruvboxAquaBold" },
898 | csInterpolationFormat = { link = "GruvboxAqua" },
899 | csInterpolationFormatDel = { link = "GruvboxAquaBold" },
900 | -- rust btw
901 | rustSigil = { link = "GruvboxOrange" },
902 | rustEscape = { link = "GruvboxAqua" },
903 | rustStringContinuation = { link = "GruvboxAqua" },
904 | rustEnum = { link = "GruvboxAqua" },
905 | rustStructure = { link = "GruvboxAqua" },
906 | rustModPathSep = { link = "GruvboxFg2" },
907 | rustCommentLineDoc = { link = "Comment" },
908 | rustDefault = { link = "GruvboxAqua" },
909 | -- ocaml
910 | ocamlOperator = { link = "GruvboxFg1" },
911 | ocamlKeyChar = { link = "GruvboxOrange" },
912 | ocamlArrow = { link = "GruvboxOrange" },
913 | ocamlInfixOpKeyword = { link = "GruvboxRed" },
914 | ocamlConstructor = { link = "GruvboxOrange" },
915 | -- lspsaga.nvim
916 | LspSagaCodeActionTitle = { link = "Title" },
917 | LspSagaCodeActionBorder = { link = "GruvboxFg1" },
918 | LspSagaCodeActionContent = { fg = colors.green, bold = config.bold },
919 | LspSagaLspFinderBorder = { link = "GruvboxFg1" },
920 | LspSagaAutoPreview = { link = "GruvboxOrange" },
921 | TargetWord = { fg = colors.blue, bold = config.bold },
922 | FinderSeparator = { link = "GruvboxAqua" },
923 | LspSagaDefPreviewBorder = { link = "GruvboxBlue" },
924 | LspSagaHoverBorder = { link = "GruvboxOrange" },
925 | LspSagaRenameBorder = { link = "GruvboxBlue" },
926 | LspSagaDiagnosticSource = { link = "GruvboxOrange" },
927 | LspSagaDiagnosticBorder = { link = "GruvboxPurple" },
928 | LspSagaDiagnosticHeader = { link = "GruvboxGreen" },
929 | LspSagaSignatureHelpBorder = { link = "GruvboxGreen" },
930 | SagaShadow = { link = "GruvboxBg0" },
931 |
932 | -- dashboard-nvim
933 | DashboardShortCut = { link = "GruvboxOrange" },
934 | DashboardHeader = { link = "GruvboxAqua" },
935 | DashboardCenter = { link = "GruvboxYellow" },
936 | DashboardFooter = { fg = colors.purple, italic = true },
937 | -- mason
938 | MasonHighlight = { link = "GruvboxAqua" },
939 | MasonHighlightBlock = { fg = colors.bg0, bg = colors.blue },
940 | MasonHighlightBlockBold = { fg = colors.bg0, bg = colors.blue, bold = true },
941 | MasonHighlightSecondary = { fg = colors.yellow },
942 | MasonHighlightBlockSecondary = { fg = colors.bg0, bg = colors.yellow },
943 | MasonHighlightBlockBoldSecondary = { fg = colors.bg0, bg = colors.yellow, bold = true },
944 | MasonHeader = { link = "MasonHighlightBlockBoldSecondary" },
945 | MasonHeaderSecondary = { link = "MasonHighlightBlockBold" },
946 | MasonMuted = { fg = colors.fg4 },
947 | MasonMutedBlock = { fg = colors.bg0, bg = colors.fg4 },
948 | MasonMutedBlockBold = { fg = colors.bg0, bg = colors.fg4, bold = true },
949 | -- lsp-inlayhints.nvim
950 | LspInlayHint = { link = "comment" },
951 | -- carbon.nvim
952 | CarbonFile = { link = "GruvboxFg1" },
953 | CarbonExe = { link = "GruvboxYellow" },
954 | CarbonSymlink = { link = "GruvboxAqua" },
955 | CarbonBrokenSymlink = { link = "GruvboxRed" },
956 | CarbonIndicator = { link = "GruvboxGray" },
957 | CarbonDanger = { link = "GruvboxRed" },
958 | CarbonPending = { link = "GruvboxYellow" },
959 | -- noice.nvim
960 | NoiceCursor = { link = "TermCursor" },
961 | -- notify.nvim
962 | NotifyDEBUGBorder = { link = "GruvboxBlue" },
963 | NotifyDEBUGIcon = { link = "GruvboxBlue" },
964 | NotifyDEBUGTitle = { link = "GruvboxBlue" },
965 | NotifyERRORBorder = { link = "GruvboxRed" },
966 | NotifyERRORIcon = { link = "GruvboxRed" },
967 | NotifyERRORTitle = { link = "GruvboxRed" },
968 | NotifyINFOBorder = { link = "GruvboxAqua" },
969 | NotifyINFOIcon = { link = "GruvboxAqua" },
970 | NotifyINFOTitle = { link = "GruvboxAqua" },
971 | NotifyTRACEBorder = { link = "GruvboxGreen" },
972 | NotifyTRACEIcon = { link = "GruvboxGreen" },
973 | NotifyTRACETitle = { link = "GruvboxGreen" },
974 | NotifyWARNBorder = { link = "GruvboxYellow" },
975 | NotifyWARNIcon = { link = "GruvboxYellow" },
976 | NotifyWARNTitle = { link = "GruvboxYellow" },
977 |
978 | -- ts-rainbow2 (maintained fork)
979 | TSRainbowRed = { fg = colors.red },
980 | TSRainbowOrange = { fg = colors.orange },
981 | TSRainbowYellow = { fg = colors.yellow },
982 | TSRainbowGreen = { fg = colors.green },
983 | TSRainbowBlue = { fg = colors.blue },
984 | TSRainbowViolet = { fg = colors.purple },
985 | TSRainbowCyan = { fg = colors.cyan },
986 | }
987 |
988 | for group, hl in pairs(config.overrides) do
989 | if groups[group] then
990 | -- "link" should not mix with other configs (:h hi-link)
991 | groups[group].link = nil
992 | end
993 |
994 | groups[group] = vim.tbl_extend("force", groups[group] or {}, hl)
995 | end
996 |
997 | return groups
998 | end
999 |
1000 | return M
1001 |
--------------------------------------------------------------------------------
/mktheme/templates/nvim/lua/gruvbox/init.lua:
--------------------------------------------------------------------------------
1 | local M = {}
2 |
3 | -- default configs
4 | M.config = {
5 | undercurl = true,
6 | underline = true,
7 | bold = true,
8 | italic = {
9 | strings = true,
10 | comments = true,
11 | operators = false,
12 | folds = true,
13 | },
14 | strikethrough = true,
15 | invert_selection = false,
16 | invert_signs = false,
17 | invert_tabline = false,
18 | invert_intend_guides = false,
19 | inverse = true, -- invert background for search, diffs, statuslines and errors
20 | contrast = "", -- can be "hard", "soft" or empty string
21 | palette_overrides = {},
22 | overrides = {},
23 | dim_inactive = false,
24 | transparent_mode = false,
25 | }
26 |
27 | function M.setup(config)
28 | if config ~= nil and type(config.italic) == "boolean" then
29 | vim.notify(
30 | "[gruvbox] italic config has change. please check https://github.com/ellisonleao/gruvbox.nvim/issues/220",
31 | vim.log.levels.WARN
32 | )
33 | config.italic = M.config.italic
34 | end
35 | M.config = vim.tbl_deep_extend("force", M.config, config or {})
36 | end
37 |
38 | M.load = function()
39 | if vim.version().minor < 8 then
40 | vim.notify_once("gruvbox.nvim: you must use neovim 0.8 or higher")
41 | return
42 | end
43 |
44 | -- reset colors
45 | if vim.g.colors_name then
46 | vim.cmd.hi("clear")
47 | end
48 |
49 | vim.g.colors_name = "gruvbox"
50 | vim.o.termguicolors = true
51 |
52 | local groups = require("gruvbox.groups").setup()
53 |
54 | -- add highlights
55 | for group, settings in pairs(groups) do
56 | vim.api.nvim_set_hl(0, group, settings)
57 | end
58 | end
59 |
60 | return M
61 |
--------------------------------------------------------------------------------
/mktheme/templates/nvim/lua/gruvbox/lightline.lua:
--------------------------------------------------------------------------------
1 | -- lightline support
2 | local theme = require("gruvbox.groups").setup()
3 |
4 | local bg0 = theme.GruvboxBg0.fg
5 | local bg1 = theme.GruvboxBg1.fg
6 | local bg2 = theme.GruvboxBg2.fg
7 | local bg4 = theme.GruvboxBg4.fg
8 | local fg1 = theme.GruvboxFg1.fg
9 | local fg4 = theme.GruvboxFg4.fg
10 |
11 | local yellow = theme.GruvboxYellow.fg
12 | local blue = theme.GruvboxBlue.fg
13 | local aqua = theme.GruvboxAqua.fg
14 | local orange = theme.GruvboxOrange.fg
15 | local red = theme.GruvboxRed.fg
16 | local green = theme.GruvboxGreen.fg
17 |
18 | local lightline_theme = {
19 | normal = {
20 | left = { { bg0, fg4, "bold" }, { fg4, bg2 } },
21 | middle = { { fg4, bg1 } },
22 | right = { { bg0, fg4 }, { fg4, bg2 } },
23 | error = { { bg0, red } },
24 | warning = { { bg0, yellow } },
25 | },
26 | insert = {
27 | left = { { bg0, blue, "bold" }, { fg1, bg2 } },
28 | middle = { { fg4, bg1 } },
29 | right = { { bg0, blue }, { fg1, bg2 } },
30 | },
31 | inactive = {
32 | left = { { bg4, bg1 } },
33 | middle = { { bg4, bg1 } },
34 | right = { { bg4, bg1 }, { bg4, bg1 } },
35 | },
36 | terminal = {
37 | left = { { bg0, green, "bold" }, { fg1, bg2 } },
38 | middle = { { fg4, bg1 } },
39 | right = { { bg0, green }, { fg1, bg2 } },
40 | },
41 | replace = {
42 | left = { { bg0, aqua, "bold" }, { fg1, bg2 } },
43 | middle = { { fg4, bg1 } },
44 | right = { { bg0, aqua }, { fg1, bg2 } },
45 | },
46 | visual = {
47 | left = { { bg0, orange, "bold" }, { bg0, bg4 } },
48 | middle = { { fg4, bg1 } },
49 | right = { { bg0, orange }, { bg0, bg4 } },
50 | },
51 | tabline = {
52 | left = { { fg4, bg2 } },
53 | middle = { { bg0, bg4 } },
54 | right = { { bg0, orange } },
55 | tabsel = { { bg0, fg4 } },
56 | },
57 | }
58 | return lightline_theme
59 |
--------------------------------------------------------------------------------
/mktheme/templates/nvim/lua/gruvbox/palette.lua:
--------------------------------------------------------------------------------
1 | -- gruvbox palette
2 | local M = {}
3 |
4 | M.colors = {
5 | dark0_hard = "#1d2021",
6 | dark0 = "#282828",
7 | dark0_soft = "#32302f",
8 | dark1 = "#3c3836",
9 | dark2 = "#504945",
10 | dark3 = "#665c54",
11 | dark4 = "#7c6f64",
12 | light0_hard = "#f9f5d7",
13 | light0 = "#fbf1c7",
14 | light0_soft = "#f2e5bc",
15 | light1 = "#ebdbb2",
16 | light2 = "#d5c4a1",
17 | light3 = "#bdae93",
18 | light4 = "#a89984",
19 | bright_red = "#fb4934",
20 | bright_green = "#b8bb26",
21 | bright_yellow = "#fabd2f",
22 | bright_blue = "#83a598",
23 | bright_purple = "#d3869b",
24 | bright_aqua = "#8ec07c",
25 | bright_orange = "#fe8019",
26 | neutral_red = "#cc241d",
27 | neutral_green = "#98971a",
28 | neutral_yellow = "#d79921",
29 | neutral_blue = "#458588",
30 | neutral_purple = "#b16286",
31 | neutral_aqua = "#689d6a",
32 | neutral_orange = "#d65d0e",
33 | faded_red = "#9d0006",
34 | faded_green = "#79740e",
35 | faded_yellow = "#b57614",
36 | faded_blue = "#076678",
37 | faded_purple = "#8f3f71",
38 | faded_aqua = "#427b58",
39 | faded_orange = "#af3a03",
40 | gray = "#928374",
41 | }
42 |
43 | M.get_base_colors = function(bg, contrast)
44 | local config = require("gruvbox").config
45 | local p = M.colors
46 |
47 | for color, hex in pairs(config.palette_overrides) do
48 | p[color] = hex
49 | end
50 |
51 | if bg == nil then
52 | bg = vim.o.background
53 | end
54 |
55 | local colors = {
56 | dark = {
57 | bg0 = p.dark0,
58 | bg1 = p.dark1,
59 | bg2 = p.dark2,
60 | bg3 = p.dark3,
61 | bg4 = p.dark4,
62 | fg0 = p.light0,
63 | fg1 = p.light1,
64 | fg2 = p.light2,
65 | fg3 = p.light3,
66 | fg4 = p.light4,
67 | red = p.bright_red,
68 | green = p.bright_green,
69 | yellow = p.bright_yellow,
70 | blue = p.bright_blue,
71 | purple = p.bright_purple,
72 | aqua = p.bright_aqua,
73 | orange = p.bright_orange,
74 | neutral_red = p.neutral_red,
75 | neutral_green = p.neutral_green,
76 | neutral_yellow = p.neutral_yellow,
77 | neutral_blue = p.neutral_blue,
78 | neutral_purple = p.neutral_purple,
79 | neutral_aqua = p.neutral_aqua,
80 | gray = p.gray,
81 | },
82 | light = {
83 | bg0 = p.light0,
84 | bg1 = p.light1,
85 | bg2 = p.light2,
86 | bg3 = p.light3,
87 | bg4 = p.light4,
88 | fg0 = p.dark0,
89 | fg1 = p.dark1,
90 | fg2 = p.dark2,
91 | fg3 = p.dark3,
92 | fg4 = p.dark4,
93 | red = p.faded_red,
94 | green = p.faded_green,
95 | yellow = p.faded_yellow,
96 | blue = p.faded_blue,
97 | purple = p.faded_purple,
98 | aqua = p.faded_aqua,
99 | orange = p.faded_orange,
100 | neutral_red = p.neutral_red,
101 | neutral_green = p.neutral_green,
102 | neutral_yellow = p.neutral_yellow,
103 | neutral_blue = p.neutral_blue,
104 | neutral_purple = p.neutral_purple,
105 | neutral_aqua = p.neutral_aqua,
106 | gray = p.gray,
107 | },
108 | }
109 |
110 | if contrast ~= nil and contrast ~= "" then
111 | colors[bg].bg0 = p[bg .. string.format("0_%s", contrast)]
112 | end
113 |
114 | return colors[bg]
115 | end
116 |
117 | return M
118 |
--------------------------------------------------------------------------------
/mktheme/templates/package.json.tmpl:
--------------------------------------------------------------------------------
1 | {
2 | "name": "clarion",
3 | "displayName": "clarion",
4 | "description": "A minimalist theme focusing on clarity and semantic content.",
5 | "publisher": "flowchartsman",
6 | "repository": "https://github.com/flowchartsman/clarion",
7 | "license": "MIT",
8 | "icon": "icon.png",
9 | "keywords": [
10 | "monochrome",
11 | "light",
12 | "clarity",
13 | "readable",
14 | "readability",
15 | "contrast",
16 | "science"
17 | ],
18 | "version": "{{.Version}}",
19 | "engines": {
20 | "vscode": "^1.55.0"
21 | },
22 | "categories": [
23 | "Themes"
24 | ],
25 | "contributes": {
26 | "grammars": [
27 | {
28 | "path": "./syntaxes/landmarks.tmLanguage.json",
29 | "scopeName": "clarion.landmarks",
30 | "injectTo": ["source.go","source.c","source.cpp"]
31 | }
32 | ],
33 | "themes": [
34 | {{- range $index, $element := .ThemeContribs}}
35 | {{- if $index}},{{end}}
36 | {
37 | "label": "{{.Label}}",
38 | "uiTheme": "vs",
39 | "path": "./themes/{{.File}}"
40 | }
41 | {{- end}}
42 | ]
43 | }
44 | }
--------------------------------------------------------------------------------
/mktheme/term_colors.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "math"
6 |
7 | "github.com/lucasb-eyer/go-colorful"
8 | )
9 |
10 | // The following has been cribbed from
11 | // https://github.com/gookit/color/blob/master/convert.go
12 |
13 | var (
14 | // rgb to 256 color look-up table
15 | // RGB hex => 256 code
16 | hexTo256Table = map[string]uint8{
17 | // Primary 3-bit (8 colors). Unique representation!
18 | "000000": 0,
19 | "800000": 1,
20 | "008000": 2,
21 | "808000": 3,
22 | "000080": 4,
23 | "800080": 5,
24 | "008080": 6,
25 | "c0c0c0": 7,
26 |
27 | // Equivalent "bright" versions of original 8 colors.
28 | "808080": 8,
29 | "ff0000": 9,
30 | "00ff00": 10,
31 | "ffff00": 11,
32 | "0000ff": 12,
33 | "ff00ff": 13,
34 | "00ffff": 14,
35 | "ffffff": 15,
36 |
37 | // values commented out below are duplicates from the prior sections
38 |
39 | // Strictly ascending.
40 | // "000000": 16,
41 | "000001": 16, // up: avoid key conflicts, value + 1
42 | "00005f": 17,
43 | "000087": 18,
44 | "0000af": 19,
45 | "0000d7": 20,
46 | // "0000ff": 21,
47 | "0000fe": 21, // up: avoid key conflicts, value - 1
48 | "005f00": 22,
49 | "005f5f": 23,
50 | "005f87": 24,
51 | "005faf": 25,
52 | "005fd7": 26,
53 | "005fff": 27,
54 | "008700": 28,
55 | "00875f": 29,
56 | "008787": 30,
57 | "0087af": 31,
58 | "0087d7": 32,
59 | "0087ff": 33,
60 | "00af00": 34,
61 | "00af5f": 35,
62 | "00af87": 36,
63 | "00afaf": 37,
64 | "00afd7": 38,
65 | "00afff": 39,
66 | "00d700": 40,
67 | "00d75f": 41,
68 | "00d787": 42,
69 | "00d7af": 43,
70 | "00d7d7": 44,
71 | "00d7ff": 45,
72 | // "00ff00": 46,
73 | "00ff01": 46, // up: avoid key conflicts, value + 1
74 | "00ff5f": 47,
75 | "00ff87": 48,
76 | "00ffaf": 49,
77 | "00ffd7": 50,
78 | // "00ffff": 51,
79 | "00fffe": 51, // up: avoid key conflicts, value - 1
80 | "5f0000": 52,
81 | "5f005f": 53,
82 | "5f0087": 54,
83 | "5f00af": 55,
84 | "5f00d7": 56,
85 | "5f00ff": 57,
86 | "5f5f00": 58,
87 | "5f5f5f": 59,
88 | "5f5f87": 60,
89 | "5f5faf": 61,
90 | "5f5fd7": 62,
91 | "5f5fff": 63,
92 | "5f8700": 64,
93 | "5f875f": 65,
94 | "5f8787": 66,
95 | "5f87af": 67,
96 | "5f87d7": 68,
97 | "5f87ff": 69,
98 | "5faf00": 70,
99 | "5faf5f": 71,
100 | "5faf87": 72,
101 | "5fafaf": 73,
102 | "5fafd7": 74,
103 | "5fafff": 75,
104 | "5fd700": 76,
105 | "5fd75f": 77,
106 | "5fd787": 78,
107 | "5fd7af": 79,
108 | "5fd7d7": 80,
109 | "5fd7ff": 81,
110 | "5fff00": 82,
111 | "5fff5f": 83,
112 | "5fff87": 84,
113 | "5fffaf": 85,
114 | "5fffd7": 86,
115 | "5fffff": 87,
116 | "870000": 88,
117 | "87005f": 89,
118 | "870087": 90,
119 | "8700af": 91,
120 | "8700d7": 92,
121 | "8700ff": 93,
122 | "875f00": 94,
123 | "875f5f": 95,
124 | "875f87": 96,
125 | "875faf": 97,
126 | "875fd7": 98,
127 | "875fff": 99,
128 | "878700": 100,
129 | "87875f": 101,
130 | "878787": 102,
131 | "8787af": 103,
132 | "8787d7": 104,
133 | "8787ff": 105,
134 | "87af00": 106,
135 | "87af5f": 107,
136 | "87af87": 108,
137 | "87afaf": 109,
138 | "87afd7": 110,
139 | "87afff": 111,
140 | "87d700": 112,
141 | "87d75f": 113,
142 | "87d787": 114,
143 | "87d7af": 115,
144 | "87d7d7": 116,
145 | "87d7ff": 117,
146 | "87ff00": 118,
147 | "87ff5f": 119,
148 | "87ff87": 120,
149 | "87ffaf": 121,
150 | "87ffd7": 122,
151 | "87ffff": 123,
152 | "af0000": 124,
153 | "af005f": 125,
154 | "af0087": 126,
155 | "af00af": 127,
156 | "af00d7": 128,
157 | "af00ff": 129,
158 | "af5f00": 130,
159 | "af5f5f": 131,
160 | "af5f87": 132,
161 | "af5faf": 133,
162 | "af5fd7": 134,
163 | "af5fff": 135,
164 | "af8700": 136,
165 | "af875f": 137,
166 | "af8787": 138,
167 | "af87af": 139,
168 | "af87d7": 140,
169 | "af87ff": 141,
170 | "afaf00": 142,
171 | "afaf5f": 143,
172 | "afaf87": 144,
173 | "afafaf": 145,
174 | "afafd7": 146,
175 | "afafff": 147,
176 | "afd700": 148,
177 | "afd75f": 149,
178 | "afd787": 150,
179 | "afd7af": 151,
180 | "afd7d7": 152,
181 | "afd7ff": 153,
182 | "afff00": 154,
183 | "afff5f": 155,
184 | "afff87": 156,
185 | "afffaf": 157,
186 | "afffd7": 158,
187 | "afffff": 159,
188 | "d70000": 160,
189 | "d7005f": 161,
190 | "d70087": 162,
191 | "d700af": 163,
192 | "d700d7": 164,
193 | "d700ff": 165,
194 | "d75f00": 166,
195 | "d75f5f": 167,
196 | "d75f87": 168,
197 | "d75faf": 169,
198 | "d75fd7": 170,
199 | "d75fff": 171,
200 | "d78700": 172,
201 | "d7875f": 173,
202 | "d78787": 174,
203 | "d787af": 175,
204 | "d787d7": 176,
205 | "d787ff": 177,
206 | "d7af00": 178,
207 | "d7af5f": 179,
208 | "d7af87": 180,
209 | "d7afaf": 181,
210 | "d7afd7": 182,
211 | "d7afff": 183,
212 | "d7d700": 184,
213 | "d7d75f": 185,
214 | "d7d787": 186,
215 | "d7d7af": 187,
216 | "d7d7d7": 188,
217 | "d7d7ff": 189,
218 | "d7ff00": 190,
219 | "d7ff5f": 191,
220 | "d7ff87": 192,
221 | "d7ffaf": 193,
222 | "d7ffd7": 194,
223 | "d7ffff": 195,
224 | // "ff0000": 196,
225 | "ff0001": 196, // up: avoid key conflicts, value + 1
226 | "ff005f": 197,
227 | "ff0087": 198,
228 | "ff00af": 199,
229 | "ff00d7": 200,
230 | // "ff00ff": 201,
231 | "ff00fe": 201, // up: avoid key conflicts, value - 1
232 | "ff5f00": 202,
233 | "ff5f5f": 203,
234 | "ff5f87": 204,
235 | "ff5faf": 205,
236 | "ff5fd7": 206,
237 | "ff5fff": 207,
238 | "ff8700": 208,
239 | "ff875f": 209,
240 | "ff8787": 210,
241 | "ff87af": 211,
242 | "ff87d7": 212,
243 | "ff87ff": 213,
244 | "ffaf00": 214,
245 | "ffaf5f": 215,
246 | "ffaf87": 216,
247 | "ffafaf": 217,
248 | "ffafd7": 218,
249 | "ffafff": 219,
250 | "ffd700": 220,
251 | "ffd75f": 221,
252 | "ffd787": 222,
253 | "ffd7af": 223,
254 | "ffd7d7": 224,
255 | "ffd7ff": 225,
256 | // "ffff00": 226,
257 | "ffff01": 226, // up: avoid key conflicts, value + 1
258 | "ffff5f": 227,
259 | "ffff87": 228,
260 | "ffffaf": 229,
261 | "ffffd7": 230,
262 | // "ffffff": 231,
263 | "fffffe": 231, // up: avoid key conflicts, value - 1
264 |
265 | // Gray-scale range.
266 | "080808": 232,
267 | "121212": 233,
268 | "1c1c1c": 234,
269 | "262626": 235,
270 | "303030": 236,
271 | "3a3a3a": 237,
272 | "444444": 238,
273 | "4e4e4e": 239,
274 | "585858": 240,
275 | "626262": 241,
276 | "6c6c6c": 242,
277 | "767676": 243,
278 | // "808080": 244,
279 | "808081": 244, // up: avoid key conflicts, value + 1
280 | "8a8a8a": 245,
281 | "949494": 246,
282 | "9e9e9e": 247,
283 | "a8a8a8": 248,
284 | "b2b2b2": 249,
285 | "bcbcbc": 250,
286 | "c6c6c6": 251,
287 | "d0d0d0": 252,
288 | "dadada": 253,
289 | "e4e4e4": 254,
290 | "eeeeee": 255,
291 | }
292 |
293 | incs = []uint8{0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff}
294 | )
295 |
296 | // RgbTo256 convert RGB-code to 256-code
297 | //func RgbTo256(r, g, b uint8) uint8 {
298 | func toTerminal(c colorful.Color) string {
299 | r, g, b := c.RGB255()
300 | res := make([]uint8, 3)
301 | for partI, part := range [3]uint8{r, g, b} {
302 | i := 0
303 | for i < len(incs)-1 {
304 | s, b := incs[i], incs[i+1] // smaller, bigger
305 | if s <= part && part <= b {
306 | s1 := math.Abs(float64(s) - float64(part))
307 | b1 := math.Abs(float64(b) - float64(part))
308 | var closest uint8
309 | if s1 < b1 {
310 | closest = s
311 | } else {
312 | closest = b
313 | }
314 | res[partI] = closest
315 | break
316 | }
317 | i++
318 | }
319 | }
320 | hex := fmt.Sprintf("%02x%02x%02x", res[0], res[1], res[2])
321 | equiv := hexTo256Table[hex]
322 | return fmt.Sprintf("%d", equiv)
323 | }
324 |
--------------------------------------------------------------------------------
/mktheme/theme.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "fmt"
5 | "math"
6 | "strings"
7 |
8 | "github.com/lucasb-eyer/go-colorful"
9 | )
10 |
11 | // todo:
12 | // allow for .BG(1) and .BG(1).Problem
13 | // this can be done by making the colors methods of the BG, such that *BGType
14 | // has .String()string method and methods for colors This would allow a really
15 | // nice
16 | // {{ with .BG 1}}bg = {{.}} fg = {{.Problem.Txt}}{{end}}
17 | // or {{ with .Level 1}}...{{end}}
18 |
19 | type themeColor struct {
20 | c colorful.Color
21 | }
22 |
23 | func (tc *themeColor) Hex() string {
24 | return tc.c.Clamped().Hex()
25 | }
26 |
27 | func (tc *themeColor) HexT() string {
28 | return tc.Hex()[1:]
29 | }
30 |
31 | // X * Y/100. x percent of y
32 | func (tc *themeColor) HexAlpha(transPct float64) string {
33 | return fmt.Sprintf("%s%02x", tc.Hex(), int(math.Round(transPct*255.0/100.0)))
34 | }
35 |
36 | func (tc *themeColor) Term256() string {
37 | if tc.c.IsValid() {
38 | return toTerminal(tc.c.Clamped())
39 | }
40 | return toTerminal(tc.c)
41 | }
42 |
43 | type Background struct {
44 | *themeColor
45 | Fg *themeColor
46 | FgLight *themeColor
47 | FgUI *themeColor
48 | cColors map[string]*colorElement
49 | ansi map[string]*themeColor
50 | mytheme *Theme
51 | myIdx int
52 | }
53 |
54 | func (b *Background) Darker() *Background {
55 | dIdx := b.myIdx - 1
56 | if dIdx < 0 {
57 | themeLogErr("Darker(): idx is <0: %d", dIdx)
58 | return ErrColor
59 | }
60 | return b.mytheme.backgrounds[dIdx]
61 | }
62 |
63 | func (b *Background) Lighter() *Background {
64 | lIdx := b.myIdx + 1
65 | if lIdx >= len(b.mytheme.backgrounds) {
66 | themeLogErr("Lighter(): idx is out of bounds: %d", lIdx)
67 | return ErrColor
68 | }
69 | return b.mytheme.backgrounds[lIdx]
70 | }
71 |
72 | // new methods here, as needed
73 | func (b *Background) Problem() *colorElement {
74 | return b.cColors["problem"]
75 | }
76 |
77 | func (b *Background) Notice() *colorElement {
78 | return b.cColors["notice"]
79 | }
80 |
81 | func (b *Background) New() *colorElement {
82 | return b.cColors["new"]
83 | }
84 |
85 | func (b *Background) Modified() *colorElement {
86 | return b.cColors["modified"]
87 | }
88 |
89 | func (b *Background) Excluded() *colorElement {
90 | return b.cColors["excluded"]
91 | }
92 |
93 | func (b *Background) AnsiBlack() *themeColor {
94 | return b.ansi["Black"]
95 | }
96 |
97 | func (b *Background) AnsiBrBlack() *themeColor {
98 | return b.ansi["BrBlack"]
99 | }
100 |
101 | func (b *Background) AnsiRed() *themeColor {
102 | return b.ansi["Red"]
103 | }
104 |
105 | func (b *Background) AnsiBrRed() *themeColor {
106 | return b.ansi["BrRed"]
107 | }
108 |
109 | func (b *Background) AnsiGreen() *themeColor {
110 | return b.ansi["Green"]
111 | }
112 |
113 | func (b *Background) AnsiBrGreen() *themeColor {
114 | return b.ansi["BrGreen"]
115 | }
116 |
117 | func (b *Background) AnsiBlue() *themeColor {
118 | return b.ansi["Blue"]
119 | }
120 |
121 | func (b *Background) AnsiBrBlue() *themeColor {
122 | return b.ansi["BrBlue"]
123 | }
124 |
125 | func (b *Background) AnsiYellow() *themeColor {
126 | return b.ansi["Yellow"]
127 | }
128 |
129 | func (b *Background) AnsiBrYellow() *themeColor {
130 | return b.ansi["BrYellow"]
131 | }
132 |
133 | func (b *Background) AnsiMagenta() *themeColor {
134 | return b.ansi["Magenta"]
135 | }
136 |
137 | func (b *Background) AnsiBrMagenta() *themeColor {
138 | return b.ansi["BrMagenta"]
139 | }
140 |
141 | func (b *Background) AnsiCyan() *themeColor {
142 | return b.ansi["Cyan"]
143 | }
144 |
145 | func (b *Background) AnsiBrCyan() *themeColor {
146 | return b.ansi["BrCyan"]
147 | }
148 |
149 | func (b *Background) AnsiWhite() *themeColor {
150 | return b.ansi["White"]
151 | }
152 |
153 | func (b *Background) AnsiBrWhite() *themeColor {
154 | return b.ansi["BrWhite"]
155 | }
156 |
157 | type colorElement struct {
158 | Unmodified *themeColor
159 | Txt *themeColor
160 | // enhanced colorful.Color // rename text (but as variant)
161 | Gfx *themeColor
162 | }
163 |
164 | type Theme struct {
165 | // Variant is the name for this theme variant, based on its primary
166 | // seed (background) color
167 | Variant string
168 | // ThemeName is the full name for this variant for display
169 | ThemeName string
170 | // Version is the overall version of the theme as tagged in Git (or the hash)
171 | Version string
172 | baseIdx int
173 | backgrounds []*Background
174 | }
175 |
176 | func (t *Theme) Base() *Background {
177 | return t.backgrounds[t.baseIdx]
178 | }
179 |
180 | // BG represents a background variant indexed by positive integer (lighter) or
181 | // negative integer (darker). Invalid indices will return ErrColor and a warning
182 | // Bg(0) is the same a Base()
183 | func (t *Theme) Bg(idx int) *Background {
184 | if idx == 0 {
185 | return t.backgrounds[t.baseIdx]
186 | }
187 | idx = t.baseIdx + idx
188 | if idx < 0 || idx >= len(t.backgrounds) {
189 | return ErrColor
190 | }
191 | return t.backgrounds[idx]
192 | }
193 |
194 | // func (v *variant) Problem() colorful
195 |
196 | // TODO generate AA and AAA variants as "" and " - High
197 | // Contrast", respectively
198 | func generateVariants(config *MkthemeConfig, spec *spec) ([]*Theme, error) {
199 | variants := make([]*Theme, 0, len(spec.baseColors))
200 | for baseColorName, baseColor := range spec.baseColors {
201 | variantName := strings.ToLower(baseColorName)
202 |
203 | vErr := func(s string, v ...interface{}) error {
204 | return fmt.Errorf("variant %s - %s", variantName, fmt.Sprintf(s, v...))
205 | }
206 |
207 | // generate background color variations
208 | darks, err := generateBrightnessVariations(baseColor, spec.variations, spec.ΔETarget, spec.Lstep, darker)
209 | if err != nil {
210 | return nil, err
211 | }
212 | lights, err := generateBrightnessVariations(baseColor, spec.variations, spec.ΔETarget, spec.Lstep, lighter)
213 | if err != nil {
214 | return nil, err
215 | }
216 | // sanity check the foreground against the darkest background color
217 | lowestFGContrast := contrast(spec.fgColor, darks[len(darks)-1])
218 | if lowestFGContrast < 4.5 {
219 | return nil, vErr("contrast ratio of foreground color (%s) to darkest background variant (%s) is too low %f < 4.5", spec.fgColor.Hex(), darks[len(darks)-1].Hex(), lowestFGContrast)
220 | }
221 |
222 | // combine them to make the loop easier
223 | allBgs := make([]*Background, 0, len(darks)+len(lights)+1)
224 | for di := len(darks) - 1; di >= 0; di-- {
225 | allBgs = append(allBgs, &Background{themeColor: &themeColor{darks[di]}})
226 | }
227 | allBgs = append(allBgs, &Background{themeColor: &themeColor{baseColor}})
228 |
229 | for li := range lights {
230 | allBgs = append(allBgs, &Background{themeColor: &themeColor{lights[li]}})
231 | }
232 |
233 | // generate the theme-specific concept colors, for each background
234 | // TODO: extra loop for High contrast
235 | // TODO: fail if ΔE is too low from FG or others in the same BG cohort
236 | // (AA level only, warn for AAA)
237 | for bi, bg := range allBgs {
238 | bgColor := bg.c
239 |
240 | // generate colors at the upper two contrast levels for use as a
241 | // light foregrund text color and a UI element color.
242 | // TODO: consider color wheel transforms.
243 | fgUI, fgLight, _ := getContrastingColors(bgColor, bgColor)
244 | bg.FgUI = &themeColor{fgUI}
245 | bg.FgLight = &themeColor{fgLight}
246 | bg.Fg = &themeColor{spec.fgColor}
247 |
248 | // Concept Colors
249 | bg.cColors = map[string]*colorElement{}
250 | for ccName, ccColor := range spec.conceptColors {
251 | ccGfx, ccTxt, _ := getContrastingColors(bgColor, ccColor)
252 | bg.cColors[ccName] = &colorElement{
253 | Unmodified: &themeColor{ccColor},
254 | Txt: &themeColor{ccTxt},
255 | Gfx: &themeColor{ccGfx},
256 | }
257 | }
258 |
259 | // Get ANSI Colors
260 | ansiColors := map[string]*themeColor{
261 | "Black": {black},
262 | }
263 | brBlack, err := getNextBrightest(black, 0.02, spec.Lstep)
264 | if err != nil {
265 | return nil, vErr("generating brightness variations for ansiBlack: %v", err)
266 | }
267 | ansiColors["BrBlack"] = &themeColor{brBlack}
268 | // sanity check brightBlack against the background color
269 | brBlackContrast := contrast(brBlack, bgColor)
270 | if brBlackContrast < float64(4.5) {
271 | return nil, vErr("contrast ratio of ansiBrightBlack color (%s) to background (%s) is too low %f < 4.5", brBlack.Hex(), bgColor.Hex(), brBlackContrast)
272 | }
273 | for ansiColorName, ansiColorSpec := range spec.ansiColors {
274 | ansiColorBright, _, _ := getContrastingColors(bgColor, ansiColorSpec) // br color at Ui contrast level TODO: Fix
275 | ansiColors["Br"+ansiColorName] = &themeColor{ansiColorBright}
276 | // darken for normal ansi variant
277 | ansiColor, err := getNextDarkest(ansiColorBright, spec.ΔETarget, spec.Lstep)
278 | if err != nil {
279 | vErr("generating brightness variations for %s: %v", ansiColorName, err)
280 | }
281 | ansiColors[ansiColorName] = &themeColor{ansiColor}
282 | }
283 | bg.ansi = ansiColors
284 | bg.myIdx = bi
285 | }
286 |
287 | newTheme := &Theme{
288 | Variant: variantName,
289 | ThemeName: "Clarion " + baseColorName,
290 | Version: config.themeVersion,
291 | baseIdx: len(darks),
292 | backgrounds: allBgs,
293 | }
294 | for bi := range allBgs {
295 | allBgs[bi].mytheme = newTheme
296 | }
297 | variants = append(variants, newTheme)
298 | }
299 | return variants, nil
300 | }
301 |
302 | var (
303 | errColor = colorful.Hsl(300, 1, 0.5) // ugly ol' magenta
304 | black = colorful.Hsl(0, 0, 0)
305 | ErrColor = &Background{
306 | themeColor: &themeColor{errColor},
307 | Fg: &themeColor{errColor},
308 | FgLight: &themeColor{errColor},
309 | FgUI: &themeColor{errColor},
310 | cColors: map[string]*colorElement{
311 | "problem": errElement,
312 | "notice": errElement,
313 | "new": errElement,
314 | "modified": errElement,
315 | "excluded": errElement,
316 | },
317 | }
318 | errElement = &colorElement{
319 | Unmodified: &themeColor{errColor},
320 | Txt: &themeColor{black},
321 | Gfx: &themeColor{black},
322 | }
323 | )
324 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "clarion",
3 | "displayName": "clarion",
4 | "description": "A minimalist theme focusing on clarity and semantic content.",
5 | "publisher": "flowchartsman",
6 | "repository": "https://github.com/flowchartsman/clarion",
7 | "license": "MIT",
8 | "icon": "icon.png",
9 | "keywords": [
10 | "monochrome",
11 | "light",
12 | "clarity",
13 | "readable",
14 | "readability",
15 | "contrast",
16 | "science"
17 | ],
18 | "version": "0.0.1-3-g3381bc7",
19 | "engines": {
20 | "vscode": "^1.55.0"
21 | },
22 | "categories": [
23 | "Themes"
24 | ],
25 | "contributes": {
26 | "grammars": [
27 | {
28 | "path": "./syntaxes/landmarks.tmLanguage.json",
29 | "scopeName": "clarion.landmarks",
30 | "injectTo": ["source.go","source.c","source.cpp"]
31 | }
32 | ],
33 | "themes": [
34 | {
35 | "label": "Clarion White",
36 | "uiTheme": "vs",
37 | "path": "./themes/clarion-color-theme-white.json"
38 | },
39 | {
40 | "label": "Clarion Orange",
41 | "uiTheme": "vs",
42 | "path": "./themes/clarion-color-theme-orange.json"
43 | },
44 | {
45 | "label": "Clarion Red",
46 | "uiTheme": "vs",
47 | "path": "./themes/clarion-color-theme-red.json"
48 | },
49 | {
50 | "label": "Clarion Blue",
51 | "uiTheme": "vs",
52 | "path": "./themes/clarion-color-theme-blue.json"
53 | },
54 | {
55 | "label": "Clarion Peach",
56 | "uiTheme": "vs",
57 | "path": "./themes/clarion-color-theme-peach.json"
58 | }
59 | ]
60 | }
61 | }
--------------------------------------------------------------------------------
/screenshot_themes.scpt:
--------------------------------------------------------------------------------
1 | tell application "System Events"
2 | set allWindows to name of window of process whose visible is true
3 | end tell
4 | return allWindows
5 |
6 | set theWindowList to my subListsToOneList(myList) -- Flattening a list of lists
7 | return theWindowList
8 |
9 | on subListsToOneList(l)
10 | set newL to {}
11 | repeat with i in l
12 | set newL to newL & i
13 | end repeat
14 | return newL
15 | end subListsToOneList
16 |
--------------------------------------------------------------------------------
/syntaxes/landmarks.tmLanguage.json:
--------------------------------------------------------------------------------
1 | {
2 | "scopeName": "clarion.landmarks",
3 | "injectionSelector": [
4 | "L:source.go -string -comment",
5 | "L:source.c -string -comment",
6 | "L:source.cpp -string -comment"
7 | ],
8 | "patterns": [
9 | {
10 | "include": "#landmark-keyword"
11 | }
12 | ],
13 | "repository": {
14 | "landmark-keyword": {
15 | "match": "\\b(return|break|continue|goto|panic)\\b",
16 | "name": "keyword.control.landmark"
17 | }
18 | }
19 | }
--------------------------------------------------------------------------------
/themes/clarion-color-theme-blue.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Clarion Blue",
3 | "type": "light",
4 | "semanticHighlighting": true,
5 | "colors": {
6 | "window.activeBorder": "#000000",
7 | "window.inactiveBorder": "#886288",
8 | "titleBar.border": "#000000",
9 | "diffEditor.insertedTextBackground": "#88628830",
10 | "diffEditor.removedTextBackground": "#88628830",
11 | "editor.foreground": "#000000",
12 | "editor.background": "#ebf3ff",
13 | "editor.findMatchBackground": "#ffca0099",
14 | "editor.findMatchHighlightBackground": "#ffca004c",
15 | "editor.focusedStackFrameHighlightBackground": "#f909",
16 | "editor.lineHighlightBackground": "#dde5f1",
17 | "editor.lineHighlightBorder": "#d0d8e3",
18 | "editor.selectionBackground": "#d0d8e3",
19 | "editorIndentGuide.activeBackground": "#000000",
20 | "editorIndentGuide.background": "#0093e180",
21 | "editor.selectionForeground": "#ebf3ff",
22 | "editor.selectionHighlightBorder": "#dde5f1",
23 | "editor.selectionHighlightBackground": "#d0d8e3",
24 | "editor.stackFrameHighlightBackground": "#ff99004c",
25 | "editor.wordHighlightBackground": "#0064ff26",
26 | "editor.wordHighlightStrongBackground": "#0064ff4c",
27 | "editorBracketMatch.background": "#d0d8e3",
28 | "editorError.foreground": "#00000000",
29 | "editorWarning.foreground": "#00000000",
30 | "editorInfo.foreground": "#00000000",
31 | "editorInfo.background": "#0000ff20",
32 | "editorWarning.background": "#80460033",
33 | "editorError.background": "#b5000033",
34 | "editorGroup.border": "#000000",
35 | "sash.hoverBorder": "#3a599b",
36 | "editorGroupHeader.tabsBackground": "#ebf3ff",
37 | "editorGroupHeader.tabsBorder": "#000000",
38 | "editorGutter.background": "#dde5f1",
39 | "editorGutter.addedBackground": "#886288",
40 | "editorGutter.deletedBackground": "#886288",
41 | "editorGutter.modifiedBackground": "#3a599b",
42 | "editorLineNumber.activeForeground": "#000000",
43 | "editorLineNumber.foreground": "#000000",
44 | "editorLink.activeForeground": "#0074b4",
45 | "editorOverviewRuler.addedForeground": "#000000",
46 | "editorOverviewRuler.border": "#000000",
47 | "editorOverviewRuler.bracketMatchForeground": "#0064ff4c",
48 | "editorOverviewRuler.errorForeground": "#b50000",
49 | "editorOverviewRuler.warningForeground": "#804600",
50 | "editorOverviewRuler.infoForeground": "#0000ff",
51 | "editorOverviewRuler.findMatchForeground": "#ffca0099",
52 | "editorOverviewRuler.modifiedForeground": "#3a599b",
53 | "editorOverviewRuler.selectionHighlightForeground": "#0064ff4c",
54 | "editorOverviewRuler.wordHighlightForeground": "#0064ff26",
55 | "editorOverviewRuler.wordHighlightStrongForeground": "#0064ff4c",
56 | "editorRuler.foreground": "#dde5f1",
57 | "editorSuggestWidget.foreground": "#000000",
58 | "editorWidget.background": "#dde5f1",
59 | "editorWidget.border": "#000000",
60 | "scrollbar.shadow": "#000000",
61 | "scrollbarSlider.background": "#00000020",
62 | "scrollbarSlider.hoverBackground": "#00000030",
63 | "titleBar.activeBackground": "#ebf3ff",
64 | "titleBar.activeForeground": "#000000",
65 | "titleBar.inactiveBackground": "#ebf3ff",
66 | "titleBar.inactiveForeground": "#000000",
67 | "widget.shadow": "#000000",
68 | "settings.headerForeground": "#804600",
69 | "symbolIcon.arrayForeground": "#000000",
70 | "symbolIcon.booleanForeground": "#000000",
71 | "symbolIcon.classForeground": "#000000",
72 | "symbolIcon.colorForeground": "#000000",
73 | "symbolIcon.constantForeground": "#000000",
74 | "symbolIcon.constructorForeground": "#000000",
75 | "symbolIcon.enumeratorForeground": "#000000",
76 | "symbolIcon.enumeratorMemberForeground": "#000000",
77 | "symbolIcon.eventForeground": "#000000",
78 | "symbolIcon.fieldForeground": "#000000",
79 | "symbolIcon.fileForeground": "#000000",
80 | "symbolIcon.folderForeground": "#000000",
81 | "symbolIcon.functionForeground": "#000000",
82 | "symbolIcon.interfaceForeground": "#000000",
83 | "symbolIcon.keyForeground": "#000000",
84 | "symbolIcon.keywordForeground": "#000000",
85 | "symbolIcon.methodForeground": "#000000",
86 | "symbolIcon.moduleForeground": "#000000",
87 | "symbolIcon.namespaceForeground": "#000000",
88 | "symbolIcon.nullForeground": "#000000",
89 | "symbolIcon.numberForeground": "#000000",
90 | "symbolIcon.objectForeground": "#000000",
91 | "symbolIcon.operatorForeground": "#000000",
92 | "symbolIcon.packageForeground": "#000000",
93 | "symbolIcon.propertyForeground": "#000000",
94 | "symbolIcon.referenceForeground": "#000000",
95 | "symbolIcon.snippetForeground": "#000000",
96 | "symbolIcon.stringForeground": "#000000",
97 | "symbolIcon.structForeground": "#000000",
98 | "symbolIcon.textForeground": "#000000",
99 | "symbolIcon.typeParameterForeground": "#000000",
100 | "symbolIcon.unitForeground": "#000000",
101 | "symbolIcon.variableForeground": "#000000",
102 | "errorForeground": "#886288",
103 | "extensionButton.prominentBackground": "#004bff",
104 | "extensionButton.prominentForeground": "#ebf3ff",
105 | "extensionButton.prominentHoverBackground": "#004bff",
106 | "focusBorder": "#000000",
107 | "foreground": "#000000",
108 | "gitDecoration.ignoredResourceForeground": "#886288",
109 | "gitDecoration.modifiedResourceForeground": "#3a599b",
110 | "gitDecoration.untrackedResourceForeground": "#886288",
111 | "textLink.activeForeground": "#000000",
112 | "textLink.foreground": "#000000",
113 | "activityBar.background": "#dde5f1",
114 | "activityBar.border": "#000000",
115 | "activityBar.foreground": "#000000",
116 | "activityBarBadge.background": "#000000",
117 | "activityBarBadge.foreground": "#ebf3ff",
118 | "badge.background": "#000000",
119 | "badge.foreground": "#ebf3ff",
120 | "button.background": "#ebf3ff",
121 | "button.foreground": "#000000",
122 | "contrastBorder": "#000000",
123 | "debugToolBar.background": "#c3cbd7",
124 | "dropdown.background": "#c3cbd7",
125 | "dropdown.border": "#000000",
126 | "dropdown.foreground": "#000000",
127 | "panel.background": "#d0d8e3",
128 | "panel.border": "#000000",
129 | "panel.dropBorder": "#3a599b",
130 | "panelTitle.activeForeground": "#000000",
131 | "panelTitle.inactiveForeground": "#525f71",
132 | "panelTitle.activeBorder": "#000000",
133 | "peekView.border": "#000000",
134 | "peekViewEditor.background": "#d0d8e3",
135 | "peekViewEditor.matchHighlightBackground": "#ffca0099",
136 | "peekViewTitle.background": "#dde5f1",
137 | "peekViewTitleDescription.foreground": "#506885",
138 | "peekViewTitleLabel.foreground": "#000000",
139 | "peekViewResult.background": "#d0d8e3",
140 | "peekViewResult.fileForeground": "#000000",
141 | "peekViewResult.lineForeground": "#525f71",
142 | "peekViewResult.matchHighlightBackground": "#ffca0099",
143 | "peekViewResult.selectionBackground": "#d0d8e3",
144 | "peekViewResult.selectionForeground": "#000000",
145 | "input.background": "#ebf3ff",
146 | "input.border": "#000000",
147 | "input.foreground": "#000000",
148 | "input.placeholderForeground": "#0074b4",
149 | "list.activeSelectionBackground": "#c3cbd7",
150 | "list.activeSelectionForeground": "#000000",
151 | "list.dropBackground": "#3a599bcc",
152 | "list.focusBackground": "#b7bfcb",
153 | "list.focusOutline": "#000000",
154 | "list.focusForeground": "#000000",
155 | "list.highlightForeground": "#000000",
156 | "list.hoverBackground": "#c3cbd7",
157 | "list.inactiveSelectionBackground": "#b7bfcb",
158 | "list.inactiveSelectionForeground": "#000000",
159 | "progressBar.background": "#004bff",
160 | "sideBar.background": "#dde5f1",
161 | "sideBar.foreground": "#000000",
162 | "sideBarSectionHeader.background": "#c3cbd7",
163 | "sideBarSectionHeader.foreground": "#000000",
164 | "sideBarTitle.foreground": "#000000",
165 | "statusBar.background": "#b7bfcb",
166 | "statusBar.debuggingBackground": "#f90",
167 | "statusBar.debuggingForeground": "#000000",
168 | "statusBar.foreground": "#000000",
169 | "statusBar.noFolderBackground": "#000000",
170 | "tab.activeBackground": "#dde5f1",
171 | "tab.activeForeground": "#000000",
172 | "tab.activeModifiedBorder": "#000000",
173 | "tab.border": "#000000",
174 | "tab.inactiveBackground": "#faffff",
175 | "tab.inactiveForeground": "#000000",
176 | "tab.inactiveModifiedBorder": "#000000",
177 | "terminal.foreground": "#000000",
178 | "terminal.background": "#c3cbd7",
179 | "terminal.border": "#4e5663",
180 | "terminal.ansiBlack": "#000000",
181 | "terminal.ansiBrightBlack": "#0c0c0c",
182 | "terminal.ansiBlue": "#0000f3",
183 | "terminal.ansiBrightBlue": "#0000ff",
184 | "terminal.ansiCyan": "#007676",
185 | "terminal.ansiBrightCyan": "#007e7e",
186 | "terminal.ansiGreen": "#007b00",
187 | "terminal.ansiBrightGreen": "#008300",
188 | "terminal.ansiMagenta": "#be00bf",
189 | "terminal.ansiBrightMagenta": "#c700c7",
190 | "terminal.ansiRed": "#d90000",
191 | "terminal.ansiBrightRed": "#e30000",
192 | "terminal.ansiWhite": "#696969",
193 | "terminal.ansiBrightWhite": "#717171",
194 | "terminal.ansiYellow": "#6c6d00",
195 | "terminal.ansiBrightYellow": "#757500",
196 | "terminal.selectionBackground": "#0064ff4c",
197 | "terminalCursor.foreground": "#000000",
198 | "editorBracketHighlight.foreground1": "#000000",
199 | "editorBracketHighlight.foreground2": "#000000",
200 | "editorBracketHighlight.foreground3": "#000000",
201 | "editorBracketHighlight.foreground4": "#000000",
202 | "editorBracketHighlight.foreground5": "#000000",
203 | "editorBracketHighlight.foreground6": "#000000",
204 | "editorBracketHighlight.unexpectedBracket.foreground": "#000000"
205 | },
206 | "semanticTokenColors": {
207 | "function.definition": {
208 | "fontStyle": "bold"
209 | },
210 | "type.definition": {
211 | "fontStyle": "bold"
212 | },
213 | "variable.definition": {
214 | "foreground": "#00000094"
215 | },
216 | "variable.readonly": {
217 | "foreground": "#000000",
218 | "fontStyle": "italic"
219 | },
220 | "variable.defaultLibrary": {
221 | "foreground": "#000000",
222 | "fontStyle": "italic"
223 | },
224 | "variable": {}
225 | },
226 | "tokenColors": [
227 | {
228 | "scope": [
229 | "string entity.name.import.go"
230 | ],
231 | "settings": {
232 | "foreground": "#000000"
233 | }
234 | },
235 | {
236 | "scope": [
237 | "comment.block",
238 | "comment.block.documentation",
239 | "comment.line",
240 | "comment",
241 | "string.quoted.docstring"
242 | ],
243 | "settings": {
244 | "foreground": "#0000004d",
245 | "fontStyle": "italic"
246 | }
247 | },
248 | {
249 | "scope": [
250 | "string"
251 | ],
252 | "settings": {
253 | "foreground": "#0074b4"
254 | }
255 | },
256 | {
257 | "scope": [
258 | "constant.other.placeholder",
259 | "constant.character.escape"
260 | ],
261 | "settings": {
262 | "foreground": "#000000",
263 | "fontStyle": "italic"
264 | }
265 | },
266 | {
267 | "scope": [
268 | "punctuation.definition.string",
269 | "storage.type.string.python"
270 | ],
271 | "settings": {
272 | "foreground": "#000000"
273 | }
274 | },
275 | {
276 | "scope": [
277 | "markup.italic"
278 | ],
279 | "settings": {
280 | "fontStyle": "italic"
281 | }
282 | },
283 | {
284 | "scope": [
285 | "entity.name.section.group-title",
286 | "keyword.const",
287 | "keyword.package",
288 | "markup.heading",
289 | "storage.type.function",
290 | "storage.type.import",
291 | "storage.type.namespace",
292 | "support.type.object.module",
293 | "markup.bold",
294 | "markup.inline.raw",
295 | "markup.raw.monospace",
296 | "markup.fenced_code.block",
297 | "keyword.control.landmark"
298 | ],
299 | "settings": {
300 | "fontStyle": "bold"
301 | }
302 | },
303 | {
304 | "scope": [
305 | "support.type.property-name"
306 | ],
307 | "settings": {
308 | "foreground": "#000000",
309 | "fontStyle": "bold"
310 | }
311 | }
312 | ]
313 | }
314 |
--------------------------------------------------------------------------------
/themes/clarion-color-theme-orange.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Clarion Orange",
3 | "type": "light",
4 | "semanticHighlighting": true,
5 | "colors": {
6 | "window.activeBorder": "#000000",
7 | "window.inactiveBorder": "#886288",
8 | "titleBar.border": "#000000",
9 | "diffEditor.insertedTextBackground": "#88628830",
10 | "diffEditor.removedTextBackground": "#88628830",
11 | "editor.foreground": "#000000",
12 | "editor.background": "#fff1d6",
13 | "editor.findMatchBackground": "#ffca0099",
14 | "editor.findMatchHighlightBackground": "#ffca004c",
15 | "editor.focusedStackFrameHighlightBackground": "#f909",
16 | "editor.lineHighlightBackground": "#f1e3c8",
17 | "editor.lineHighlightBorder": "#e3d6bb",
18 | "editor.selectionBackground": "#e3d6bb",
19 | "editorIndentGuide.activeBackground": "#000000",
20 | "editorIndentGuide.background": "#a9890080",
21 | "editor.selectionForeground": "#fff1d6",
22 | "editor.selectionHighlightBorder": "#f1e3c8",
23 | "editor.selectionHighlightBackground": "#e3d6bb",
24 | "editor.stackFrameHighlightBackground": "#ff99004c",
25 | "editor.wordHighlightBackground": "#0064ff26",
26 | "editor.wordHighlightStrongBackground": "#0064ff4c",
27 | "editorBracketMatch.background": "#e3d6bb",
28 | "editorError.foreground": "#00000000",
29 | "editorWarning.foreground": "#00000000",
30 | "editorInfo.foreground": "#00000000",
31 | "editorInfo.background": "#0000ff20",
32 | "editorWarning.background": "#80460033",
33 | "editorError.background": "#b5000033",
34 | "editorGroup.border": "#000000",
35 | "sash.hoverBorder": "#3a599b",
36 | "editorGroupHeader.tabsBackground": "#fff1d6",
37 | "editorGroupHeader.tabsBorder": "#000000",
38 | "editorGutter.background": "#f1e3c8",
39 | "editorGutter.addedBackground": "#886288",
40 | "editorGutter.deletedBackground": "#886288",
41 | "editorGutter.modifiedBackground": "#3a599b",
42 | "editorLineNumber.activeForeground": "#000000",
43 | "editorLineNumber.foreground": "#000000",
44 | "editorLink.activeForeground": "#866c00",
45 | "editorOverviewRuler.addedForeground": "#000000",
46 | "editorOverviewRuler.border": "#000000",
47 | "editorOverviewRuler.bracketMatchForeground": "#0064ff4c",
48 | "editorOverviewRuler.errorForeground": "#b50000",
49 | "editorOverviewRuler.warningForeground": "#804600",
50 | "editorOverviewRuler.infoForeground": "#0000ff",
51 | "editorOverviewRuler.findMatchForeground": "#ffca0099",
52 | "editorOverviewRuler.modifiedForeground": "#3a599b",
53 | "editorOverviewRuler.selectionHighlightForeground": "#0064ff4c",
54 | "editorOverviewRuler.wordHighlightForeground": "#0064ff26",
55 | "editorOverviewRuler.wordHighlightStrongForeground": "#0064ff4c",
56 | "editorRuler.foreground": "#f1e3c8",
57 | "editorSuggestWidget.foreground": "#000000",
58 | "editorWidget.background": "#f1e3c8",
59 | "editorWidget.border": "#000000",
60 | "scrollbar.shadow": "#000000",
61 | "scrollbarSlider.background": "#00000020",
62 | "scrollbarSlider.hoverBackground": "#00000030",
63 | "titleBar.activeBackground": "#fff1d6",
64 | "titleBar.activeForeground": "#000000",
65 | "titleBar.inactiveBackground": "#fff1d6",
66 | "titleBar.inactiveForeground": "#000000",
67 | "widget.shadow": "#000000",
68 | "settings.headerForeground": "#804600",
69 | "symbolIcon.arrayForeground": "#000000",
70 | "symbolIcon.booleanForeground": "#000000",
71 | "symbolIcon.classForeground": "#000000",
72 | "symbolIcon.colorForeground": "#000000",
73 | "symbolIcon.constantForeground": "#000000",
74 | "symbolIcon.constructorForeground": "#000000",
75 | "symbolIcon.enumeratorForeground": "#000000",
76 | "symbolIcon.enumeratorMemberForeground": "#000000",
77 | "symbolIcon.eventForeground": "#000000",
78 | "symbolIcon.fieldForeground": "#000000",
79 | "symbolIcon.fileForeground": "#000000",
80 | "symbolIcon.folderForeground": "#000000",
81 | "symbolIcon.functionForeground": "#000000",
82 | "symbolIcon.interfaceForeground": "#000000",
83 | "symbolIcon.keyForeground": "#000000",
84 | "symbolIcon.keywordForeground": "#000000",
85 | "symbolIcon.methodForeground": "#000000",
86 | "symbolIcon.moduleForeground": "#000000",
87 | "symbolIcon.namespaceForeground": "#000000",
88 | "symbolIcon.nullForeground": "#000000",
89 | "symbolIcon.numberForeground": "#000000",
90 | "symbolIcon.objectForeground": "#000000",
91 | "symbolIcon.operatorForeground": "#000000",
92 | "symbolIcon.packageForeground": "#000000",
93 | "symbolIcon.propertyForeground": "#000000",
94 | "symbolIcon.referenceForeground": "#000000",
95 | "symbolIcon.snippetForeground": "#000000",
96 | "symbolIcon.stringForeground": "#000000",
97 | "symbolIcon.structForeground": "#000000",
98 | "symbolIcon.textForeground": "#000000",
99 | "symbolIcon.typeParameterForeground": "#000000",
100 | "symbolIcon.unitForeground": "#000000",
101 | "symbolIcon.variableForeground": "#000000",
102 | "errorForeground": "#886288",
103 | "extensionButton.prominentBackground": "#004bff",
104 | "extensionButton.prominentForeground": "#fff1d6",
105 | "extensionButton.prominentHoverBackground": "#004bff",
106 | "focusBorder": "#000000",
107 | "foreground": "#000000",
108 | "gitDecoration.ignoredResourceForeground": "#886288",
109 | "gitDecoration.modifiedResourceForeground": "#3a599b",
110 | "gitDecoration.untrackedResourceForeground": "#886288",
111 | "textLink.activeForeground": "#000000",
112 | "textLink.foreground": "#000000",
113 | "activityBar.background": "#f1e3c8",
114 | "activityBar.border": "#000000",
115 | "activityBar.foreground": "#000000",
116 | "activityBarBadge.background": "#000000",
117 | "activityBarBadge.foreground": "#fff1d6",
118 | "badge.background": "#000000",
119 | "badge.foreground": "#fff1d6",
120 | "button.background": "#fff1d6",
121 | "button.foreground": "#000000",
122 | "contrastBorder": "#000000",
123 | "debugToolBar.background": "#d6c9af",
124 | "dropdown.background": "#d6c9af",
125 | "dropdown.border": "#000000",
126 | "dropdown.foreground": "#000000",
127 | "panel.background": "#e3d6bb",
128 | "panel.border": "#000000",
129 | "panel.dropBorder": "#3a599b",
130 | "panelTitle.activeForeground": "#000000",
131 | "panelTitle.inactiveForeground": "#645d50",
132 | "panelTitle.activeBorder": "#000000",
133 | "peekView.border": "#000000",
134 | "peekViewEditor.background": "#e3d6bb",
135 | "peekViewEditor.matchHighlightBackground": "#ffca0099",
136 | "peekViewTitle.background": "#f1e3c8",
137 | "peekViewTitleDescription.foreground": "#71654b",
138 | "peekViewTitleLabel.foreground": "#000000",
139 | "peekViewResult.background": "#e3d6bb",
140 | "peekViewResult.fileForeground": "#000000",
141 | "peekViewResult.lineForeground": "#645d50",
142 | "peekViewResult.matchHighlightBackground": "#ffca0099",
143 | "peekViewResult.selectionBackground": "#e3d6bb",
144 | "peekViewResult.selectionForeground": "#000000",
145 | "input.background": "#fff1d6",
146 | "input.border": "#000000",
147 | "input.foreground": "#000000",
148 | "input.placeholderForeground": "#866c00",
149 | "list.activeSelectionBackground": "#d6c9af",
150 | "list.activeSelectionForeground": "#000000",
151 | "list.dropBackground": "#3a599bcc",
152 | "list.focusBackground": "#cabda3",
153 | "list.focusOutline": "#000000",
154 | "list.focusForeground": "#000000",
155 | "list.highlightForeground": "#000000",
156 | "list.hoverBackground": "#d6c9af",
157 | "list.inactiveSelectionBackground": "#cabda3",
158 | "list.inactiveSelectionForeground": "#000000",
159 | "progressBar.background": "#004bff",
160 | "sideBar.background": "#f1e3c8",
161 | "sideBar.foreground": "#000000",
162 | "sideBarSectionHeader.background": "#d6c9af",
163 | "sideBarSectionHeader.foreground": "#000000",
164 | "sideBarTitle.foreground": "#000000",
165 | "statusBar.background": "#cabda3",
166 | "statusBar.debuggingBackground": "#f90",
167 | "statusBar.debuggingForeground": "#000000",
168 | "statusBar.foreground": "#000000",
169 | "statusBar.noFolderBackground": "#000000",
170 | "tab.activeBackground": "#f1e3c8",
171 | "tab.activeForeground": "#000000",
172 | "tab.activeModifiedBorder": "#000000",
173 | "tab.border": "#000000",
174 | "tab.inactiveBackground": "#ffffe5",
175 | "tab.inactiveForeground": "#000000",
176 | "tab.inactiveModifiedBorder": "#000000",
177 | "terminal.foreground": "#000000",
178 | "terminal.background": "#d6c9af",
179 | "terminal.border": "#5b5549",
180 | "terminal.ansiBlack": "#000000",
181 | "terminal.ansiBrightBlack": "#0c0c0c",
182 | "terminal.ansiBlue": "#0000f3",
183 | "terminal.ansiBrightBlue": "#0000ff",
184 | "terminal.ansiCyan": "#007676",
185 | "terminal.ansiBrightCyan": "#007e7e",
186 | "terminal.ansiGreen": "#007b00",
187 | "terminal.ansiBrightGreen": "#008300",
188 | "terminal.ansiMagenta": "#bf00bf",
189 | "terminal.ansiBrightMagenta": "#c800c8",
190 | "terminal.ansiRed": "#d90000",
191 | "terminal.ansiBrightRed": "#e30000",
192 | "terminal.ansiWhite": "#696969",
193 | "terminal.ansiBrightWhite": "#717171",
194 | "terminal.ansiYellow": "#6c6d00",
195 | "terminal.ansiBrightYellow": "#757500",
196 | "terminal.selectionBackground": "#0064ff4c",
197 | "terminalCursor.foreground": "#000000",
198 | "editorBracketHighlight.foreground1": "#000000",
199 | "editorBracketHighlight.foreground2": "#000000",
200 | "editorBracketHighlight.foreground3": "#000000",
201 | "editorBracketHighlight.foreground4": "#000000",
202 | "editorBracketHighlight.foreground5": "#000000",
203 | "editorBracketHighlight.foreground6": "#000000",
204 | "editorBracketHighlight.unexpectedBracket.foreground": "#000000"
205 | },
206 | "semanticTokenColors": {
207 | "function.definition": {
208 | "fontStyle": "bold"
209 | },
210 | "type.definition": {
211 | "fontStyle": "bold"
212 | },
213 | "variable.definition": {
214 | "foreground": "#00000094"
215 | },
216 | "variable.readonly": {
217 | "foreground": "#000000",
218 | "fontStyle": "italic"
219 | },
220 | "variable.defaultLibrary": {
221 | "foreground": "#000000",
222 | "fontStyle": "italic"
223 | },
224 | "variable": {}
225 | },
226 | "tokenColors": [
227 | {
228 | "scope": [
229 | "string entity.name.import.go"
230 | ],
231 | "settings": {
232 | "foreground": "#000000"
233 | }
234 | },
235 | {
236 | "scope": [
237 | "comment.block",
238 | "comment.block.documentation",
239 | "comment.line",
240 | "comment",
241 | "string.quoted.docstring"
242 | ],
243 | "settings": {
244 | "foreground": "#0000004d",
245 | "fontStyle": "italic"
246 | }
247 | },
248 | {
249 | "scope": [
250 | "string"
251 | ],
252 | "settings": {
253 | "foreground": "#866c00"
254 | }
255 | },
256 | {
257 | "scope": [
258 | "constant.other.placeholder",
259 | "constant.character.escape"
260 | ],
261 | "settings": {
262 | "foreground": "#000000",
263 | "fontStyle": "italic"
264 | }
265 | },
266 | {
267 | "scope": [
268 | "punctuation.definition.string",
269 | "storage.type.string.python"
270 | ],
271 | "settings": {
272 | "foreground": "#000000"
273 | }
274 | },
275 | {
276 | "scope": [
277 | "markup.italic"
278 | ],
279 | "settings": {
280 | "fontStyle": "italic"
281 | }
282 | },
283 | {
284 | "scope": [
285 | "entity.name.section.group-title",
286 | "keyword.const",
287 | "keyword.package",
288 | "markup.heading",
289 | "storage.type.function",
290 | "storage.type.import",
291 | "storage.type.namespace",
292 | "support.type.object.module",
293 | "markup.bold",
294 | "markup.inline.raw",
295 | "markup.raw.monospace",
296 | "markup.fenced_code.block",
297 | "keyword.control.landmark"
298 | ],
299 | "settings": {
300 | "fontStyle": "bold"
301 | }
302 | },
303 | {
304 | "scope": [
305 | "support.type.property-name"
306 | ],
307 | "settings": {
308 | "foreground": "#000000",
309 | "fontStyle": "bold"
310 | }
311 | }
312 | ]
313 | }
314 |
--------------------------------------------------------------------------------
/themes/clarion-color-theme-peach.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Clarion Peach",
3 | "type": "light",
4 | "semanticHighlighting": true,
5 | "colors": {
6 | "window.activeBorder": "#000000",
7 | "window.inactiveBorder": "#886288",
8 | "titleBar.border": "#000000",
9 | "diffEditor.insertedTextBackground": "#88628830",
10 | "diffEditor.removedTextBackground": "#88628830",
11 | "editor.foreground": "#000000",
12 | "editor.background": "#edd1b0",
13 | "editor.findMatchBackground": "#ffca0099",
14 | "editor.findMatchHighlightBackground": "#ffca004c",
15 | "editor.focusedStackFrameHighlightBackground": "#f909",
16 | "editor.lineHighlightBackground": "#e0c5a4",
17 | "editor.lineHighlightBorder": "#d4b999",
18 | "editor.selectionBackground": "#d4b999",
19 | "editorIndentGuide.activeBackground": "#000000",
20 | "editorIndentGuide.background": "#8e745280",
21 | "editor.selectionForeground": "#edd1b0",
22 | "editor.selectionHighlightBorder": "#e0c5a4",
23 | "editor.selectionHighlightBackground": "#d4b999",
24 | "editor.stackFrameHighlightBackground": "#ff99004c",
25 | "editor.wordHighlightBackground": "#0064ff26",
26 | "editor.wordHighlightStrongBackground": "#0064ff4c",
27 | "editorBracketMatch.background": "#d4b999",
28 | "editorError.foreground": "#00000000",
29 | "editorWarning.foreground": "#00000000",
30 | "editorInfo.foreground": "#00000000",
31 | "editorInfo.background": "#0000ff20",
32 | "editorWarning.background": "#80460033",
33 | "editorError.background": "#b5000033",
34 | "editorGroup.border": "#000000",
35 | "sash.hoverBorder": "#3a599b",
36 | "editorGroupHeader.tabsBackground": "#edd1b0",
37 | "editorGroupHeader.tabsBorder": "#000000",
38 | "editorGutter.background": "#e0c5a4",
39 | "editorGutter.addedBackground": "#735273",
40 | "editorGutter.deletedBackground": "#735273",
41 | "editorGutter.modifiedBackground": "#3a599b",
42 | "editorLineNumber.activeForeground": "#000000",
43 | "editorLineNumber.foreground": "#000000",
44 | "editorLink.activeForeground": "#6e5a3e",
45 | "editorOverviewRuler.addedForeground": "#000000",
46 | "editorOverviewRuler.border": "#000000",
47 | "editorOverviewRuler.bracketMatchForeground": "#0064ff4c",
48 | "editorOverviewRuler.errorForeground": "#b50000",
49 | "editorOverviewRuler.warningForeground": "#804600",
50 | "editorOverviewRuler.infoForeground": "#0000ff",
51 | "editorOverviewRuler.findMatchForeground": "#ffca0099",
52 | "editorOverviewRuler.modifiedForeground": "#3a599b",
53 | "editorOverviewRuler.selectionHighlightForeground": "#0064ff4c",
54 | "editorOverviewRuler.wordHighlightForeground": "#0064ff26",
55 | "editorOverviewRuler.wordHighlightStrongForeground": "#0064ff4c",
56 | "editorRuler.foreground": "#e0c5a4",
57 | "editorSuggestWidget.foreground": "#000000",
58 | "editorWidget.background": "#e0c5a4",
59 | "editorWidget.border": "#000000",
60 | "scrollbar.shadow": "#000000",
61 | "scrollbarSlider.background": "#00000020",
62 | "scrollbarSlider.hoverBackground": "#00000030",
63 | "titleBar.activeBackground": "#edd1b0",
64 | "titleBar.activeForeground": "#000000",
65 | "titleBar.inactiveBackground": "#edd1b0",
66 | "titleBar.inactiveForeground": "#000000",
67 | "widget.shadow": "#000000",
68 | "settings.headerForeground": "#804600",
69 | "symbolIcon.arrayForeground": "#000000",
70 | "symbolIcon.booleanForeground": "#000000",
71 | "symbolIcon.classForeground": "#000000",
72 | "symbolIcon.colorForeground": "#000000",
73 | "symbolIcon.constantForeground": "#000000",
74 | "symbolIcon.constructorForeground": "#000000",
75 | "symbolIcon.enumeratorForeground": "#000000",
76 | "symbolIcon.enumeratorMemberForeground": "#000000",
77 | "symbolIcon.eventForeground": "#000000",
78 | "symbolIcon.fieldForeground": "#000000",
79 | "symbolIcon.fileForeground": "#000000",
80 | "symbolIcon.folderForeground": "#000000",
81 | "symbolIcon.functionForeground": "#000000",
82 | "symbolIcon.interfaceForeground": "#000000",
83 | "symbolIcon.keyForeground": "#000000",
84 | "symbolIcon.keywordForeground": "#000000",
85 | "symbolIcon.methodForeground": "#000000",
86 | "symbolIcon.moduleForeground": "#000000",
87 | "symbolIcon.namespaceForeground": "#000000",
88 | "symbolIcon.nullForeground": "#000000",
89 | "symbolIcon.numberForeground": "#000000",
90 | "symbolIcon.objectForeground": "#000000",
91 | "symbolIcon.operatorForeground": "#000000",
92 | "symbolIcon.packageForeground": "#000000",
93 | "symbolIcon.propertyForeground": "#000000",
94 | "symbolIcon.referenceForeground": "#000000",
95 | "symbolIcon.snippetForeground": "#000000",
96 | "symbolIcon.stringForeground": "#000000",
97 | "symbolIcon.structForeground": "#000000",
98 | "symbolIcon.textForeground": "#000000",
99 | "symbolIcon.typeParameterForeground": "#000000",
100 | "symbolIcon.unitForeground": "#000000",
101 | "symbolIcon.variableForeground": "#000000",
102 | "errorForeground": "#735273",
103 | "extensionButton.prominentBackground": "#004bff",
104 | "extensionButton.prominentForeground": "#edd1b0",
105 | "extensionButton.prominentHoverBackground": "#004bff",
106 | "focusBorder": "#000000",
107 | "foreground": "#000000",
108 | "gitDecoration.ignoredResourceForeground": "#735273",
109 | "gitDecoration.modifiedResourceForeground": "#3a599b",
110 | "gitDecoration.untrackedResourceForeground": "#735273",
111 | "textLink.activeForeground": "#000000",
112 | "textLink.foreground": "#000000",
113 | "activityBar.background": "#e0c5a4",
114 | "activityBar.border": "#000000",
115 | "activityBar.foreground": "#000000",
116 | "activityBarBadge.background": "#000000",
117 | "activityBarBadge.foreground": "#edd1b0",
118 | "badge.background": "#000000",
119 | "badge.foreground": "#edd1b0",
120 | "button.background": "#edd1b0",
121 | "button.foreground": "#000000",
122 | "contrastBorder": "#000000",
123 | "debugToolBar.background": "#c8ae8e",
124 | "dropdown.background": "#c8ae8e",
125 | "dropdown.border": "#000000",
126 | "dropdown.foreground": "#000000",
127 | "panel.background": "#d4b999",
128 | "panel.border": "#000000",
129 | "panel.dropBorder": "#3a599b",
130 | "panelTitle.activeForeground": "#000000",
131 | "panelTitle.inactiveForeground": "#574b3d",
132 | "panelTitle.activeBorder": "#000000",
133 | "peekView.border": "#000000",
134 | "peekViewEditor.background": "#d4b999",
135 | "peekViewEditor.matchHighlightBackground": "#ffca0099",
136 | "peekViewTitle.background": "#e0c5a4",
137 | "peekViewTitleDescription.foreground": "#605342",
138 | "peekViewTitleLabel.foreground": "#000000",
139 | "peekViewResult.background": "#d4b999",
140 | "peekViewResult.fileForeground": "#000000",
141 | "peekViewResult.lineForeground": "#574b3d",
142 | "peekViewResult.matchHighlightBackground": "#ffca0099",
143 | "peekViewResult.selectionBackground": "#d4b999",
144 | "peekViewResult.selectionForeground": "#000000",
145 | "input.background": "#edd1b0",
146 | "input.border": "#000000",
147 | "input.foreground": "#000000",
148 | "input.placeholderForeground": "#6e5a3e",
149 | "list.activeSelectionBackground": "#c8ae8e",
150 | "list.activeSelectionForeground": "#000000",
151 | "list.dropBackground": "#385595cc",
152 | "list.focusBackground": "#bda384",
153 | "list.focusOutline": "#000000",
154 | "list.focusForeground": "#000000",
155 | "list.highlightForeground": "#000000",
156 | "list.hoverBackground": "#c8ae8e",
157 | "list.inactiveSelectionBackground": "#bda384",
158 | "list.inactiveSelectionForeground": "#000000",
159 | "progressBar.background": "#004bff",
160 | "sideBar.background": "#e0c5a4",
161 | "sideBar.foreground": "#000000",
162 | "sideBarSectionHeader.background": "#c8ae8e",
163 | "sideBarSectionHeader.foreground": "#000000",
164 | "sideBarTitle.foreground": "#000000",
165 | "statusBar.background": "#bda384",
166 | "statusBar.debuggingBackground": "#f90",
167 | "statusBar.debuggingForeground": "#000000",
168 | "statusBar.foreground": "#000000",
169 | "statusBar.noFolderBackground": "#000000",
170 | "tab.activeBackground": "#e0c5a4",
171 | "tab.activeForeground": "#000000",
172 | "tab.activeModifiedBorder": "#000000",
173 | "tab.border": "#000000",
174 | "tab.inactiveBackground": "#fbdebd",
175 | "tab.inactiveForeground": "#000000",
176 | "tab.inactiveModifiedBorder": "#000000",
177 | "terminal.foreground": "#000000",
178 | "terminal.background": "#c8ae8e",
179 | "terminal.border": "#4f4335",
180 | "terminal.ansiBlack": "#000000",
181 | "terminal.ansiBrightBlack": "#0c0c0c",
182 | "terminal.ansiBlue": "#0000f3",
183 | "terminal.ansiBrightBlue": "#0000ff",
184 | "terminal.ansiCyan": "#006262",
185 | "terminal.ansiBrightCyan": "#006a6a",
186 | "terminal.ansiGreen": "#006700",
187 | "terminal.ansiBrightGreen": "#006f00",
188 | "terminal.ansiMagenta": "#a000a1",
189 | "terminal.ansiBrightMagenta": "#aa00aa",
190 | "terminal.ansiRed": "#b70000",
191 | "terminal.ansiBrightRed": "#c20000",
192 | "terminal.ansiWhite": "#575757",
193 | "terminal.ansiBrightWhite": "#5f5f5f",
194 | "terminal.ansiYellow": "#595a00",
195 | "terminal.ansiBrightYellow": "#636300",
196 | "terminal.selectionBackground": "#0064ff4c",
197 | "terminalCursor.foreground": "#000000",
198 | "editorBracketHighlight.foreground1": "#000000",
199 | "editorBracketHighlight.foreground2": "#000000",
200 | "editorBracketHighlight.foreground3": "#000000",
201 | "editorBracketHighlight.foreground4": "#000000",
202 | "editorBracketHighlight.foreground5": "#000000",
203 | "editorBracketHighlight.foreground6": "#000000",
204 | "editorBracketHighlight.unexpectedBracket.foreground": "#000000"
205 | },
206 | "semanticTokenColors": {
207 | "function.definition": {
208 | "fontStyle": "bold"
209 | },
210 | "type.definition": {
211 | "fontStyle": "bold"
212 | },
213 | "variable.definition": {
214 | "foreground": "#00000094"
215 | },
216 | "variable.readonly": {
217 | "foreground": "#000000",
218 | "fontStyle": "italic"
219 | },
220 | "variable.defaultLibrary": {
221 | "foreground": "#000000",
222 | "fontStyle": "italic"
223 | },
224 | "variable": {}
225 | },
226 | "tokenColors": [
227 | {
228 | "scope": [
229 | "string entity.name.import.go"
230 | ],
231 | "settings": {
232 | "foreground": "#000000"
233 | }
234 | },
235 | {
236 | "scope": [
237 | "comment.block",
238 | "comment.block.documentation",
239 | "comment.line",
240 | "comment",
241 | "string.quoted.docstring"
242 | ],
243 | "settings": {
244 | "foreground": "#0000004d",
245 | "fontStyle": "italic"
246 | }
247 | },
248 | {
249 | "scope": [
250 | "string"
251 | ],
252 | "settings": {
253 | "foreground": "#6e5a3e"
254 | }
255 | },
256 | {
257 | "scope": [
258 | "constant.other.placeholder",
259 | "constant.character.escape"
260 | ],
261 | "settings": {
262 | "foreground": "#000000",
263 | "fontStyle": "italic"
264 | }
265 | },
266 | {
267 | "scope": [
268 | "punctuation.definition.string",
269 | "storage.type.string.python"
270 | ],
271 | "settings": {
272 | "foreground": "#000000"
273 | }
274 | },
275 | {
276 | "scope": [
277 | "markup.italic"
278 | ],
279 | "settings": {
280 | "fontStyle": "italic"
281 | }
282 | },
283 | {
284 | "scope": [
285 | "entity.name.section.group-title",
286 | "keyword.const",
287 | "keyword.package",
288 | "markup.heading",
289 | "storage.type.function",
290 | "storage.type.import",
291 | "storage.type.namespace",
292 | "support.type.object.module",
293 | "markup.bold",
294 | "markup.inline.raw",
295 | "markup.raw.monospace",
296 | "markup.fenced_code.block",
297 | "keyword.control.landmark"
298 | ],
299 | "settings": {
300 | "fontStyle": "bold"
301 | }
302 | },
303 | {
304 | "scope": [
305 | "support.type.property-name"
306 | ],
307 | "settings": {
308 | "foreground": "#000000",
309 | "fontStyle": "bold"
310 | }
311 | }
312 | ]
313 | }
314 |
--------------------------------------------------------------------------------
/themes/clarion-color-theme-red.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Clarion Red",
3 | "type": "light",
4 | "semanticHighlighting": true,
5 | "colors": {
6 | "window.activeBorder": "#000000",
7 | "window.inactiveBorder": "#886288",
8 | "titleBar.border": "#000000",
9 | "diffEditor.insertedTextBackground": "#88628830",
10 | "diffEditor.removedTextBackground": "#88628830",
11 | "editor.foreground": "#000000",
12 | "editor.background": "#ffebeb",
13 | "editor.findMatchBackground": "#ffca0099",
14 | "editor.findMatchHighlightBackground": "#ffca004c",
15 | "editor.focusedStackFrameHighlightBackground": "#f909",
16 | "editor.lineHighlightBackground": "#f1dddd",
17 | "editor.lineHighlightBorder": "#e4d0d0",
18 | "editor.selectionBackground": "#e4d0d0",
19 | "editorIndentGuide.activeBackground": "#000000",
20 | "editorIndentGuide.background": "#ff424280",
21 | "editor.selectionForeground": "#ffebeb",
22 | "editor.selectionHighlightBorder": "#f1dddd",
23 | "editor.selectionHighlightBackground": "#e4d0d0",
24 | "editor.stackFrameHighlightBackground": "#ff99004c",
25 | "editor.wordHighlightBackground": "#0064ff26",
26 | "editor.wordHighlightStrongBackground": "#0064ff4c",
27 | "editorBracketMatch.background": "#e4d0d0",
28 | "editorError.foreground": "#00000000",
29 | "editorWarning.foreground": "#00000000",
30 | "editorInfo.foreground": "#00000000",
31 | "editorInfo.background": "#0000ff20",
32 | "editorWarning.background": "#80460033",
33 | "editorError.background": "#b5000033",
34 | "editorGroup.border": "#000000",
35 | "sash.hoverBorder": "#3a599b",
36 | "editorGroupHeader.tabsBackground": "#ffebeb",
37 | "editorGroupHeader.tabsBorder": "#000000",
38 | "editorGutter.background": "#f1dddd",
39 | "editorGutter.addedBackground": "#866186",
40 | "editorGutter.deletedBackground": "#866186",
41 | "editorGutter.modifiedBackground": "#3a599b",
42 | "editorLineNumber.activeForeground": "#000000",
43 | "editorLineNumber.foreground": "#000000",
44 | "editorLink.activeForeground": "#dd0000",
45 | "editorOverviewRuler.addedForeground": "#000000",
46 | "editorOverviewRuler.border": "#000000",
47 | "editorOverviewRuler.bracketMatchForeground": "#0064ff4c",
48 | "editorOverviewRuler.errorForeground": "#b50000",
49 | "editorOverviewRuler.warningForeground": "#804600",
50 | "editorOverviewRuler.infoForeground": "#0000ff",
51 | "editorOverviewRuler.findMatchForeground": "#ffca0099",
52 | "editorOverviewRuler.modifiedForeground": "#3a599b",
53 | "editorOverviewRuler.selectionHighlightForeground": "#0064ff4c",
54 | "editorOverviewRuler.wordHighlightForeground": "#0064ff26",
55 | "editorOverviewRuler.wordHighlightStrongForeground": "#0064ff4c",
56 | "editorRuler.foreground": "#f1dddd",
57 | "editorSuggestWidget.foreground": "#000000",
58 | "editorWidget.background": "#f1dddd",
59 | "editorWidget.border": "#000000",
60 | "scrollbar.shadow": "#000000",
61 | "scrollbarSlider.background": "#00000020",
62 | "scrollbarSlider.hoverBackground": "#00000030",
63 | "titleBar.activeBackground": "#ffebeb",
64 | "titleBar.activeForeground": "#000000",
65 | "titleBar.inactiveBackground": "#ffebeb",
66 | "titleBar.inactiveForeground": "#000000",
67 | "widget.shadow": "#000000",
68 | "settings.headerForeground": "#804600",
69 | "symbolIcon.arrayForeground": "#000000",
70 | "symbolIcon.booleanForeground": "#000000",
71 | "symbolIcon.classForeground": "#000000",
72 | "symbolIcon.colorForeground": "#000000",
73 | "symbolIcon.constantForeground": "#000000",
74 | "symbolIcon.constructorForeground": "#000000",
75 | "symbolIcon.enumeratorForeground": "#000000",
76 | "symbolIcon.enumeratorMemberForeground": "#000000",
77 | "symbolIcon.eventForeground": "#000000",
78 | "symbolIcon.fieldForeground": "#000000",
79 | "symbolIcon.fileForeground": "#000000",
80 | "symbolIcon.folderForeground": "#000000",
81 | "symbolIcon.functionForeground": "#000000",
82 | "symbolIcon.interfaceForeground": "#000000",
83 | "symbolIcon.keyForeground": "#000000",
84 | "symbolIcon.keywordForeground": "#000000",
85 | "symbolIcon.methodForeground": "#000000",
86 | "symbolIcon.moduleForeground": "#000000",
87 | "symbolIcon.namespaceForeground": "#000000",
88 | "symbolIcon.nullForeground": "#000000",
89 | "symbolIcon.numberForeground": "#000000",
90 | "symbolIcon.objectForeground": "#000000",
91 | "symbolIcon.operatorForeground": "#000000",
92 | "symbolIcon.packageForeground": "#000000",
93 | "symbolIcon.propertyForeground": "#000000",
94 | "symbolIcon.referenceForeground": "#000000",
95 | "symbolIcon.snippetForeground": "#000000",
96 | "symbolIcon.stringForeground": "#000000",
97 | "symbolIcon.structForeground": "#000000",
98 | "symbolIcon.textForeground": "#000000",
99 | "symbolIcon.typeParameterForeground": "#000000",
100 | "symbolIcon.unitForeground": "#000000",
101 | "symbolIcon.variableForeground": "#000000",
102 | "errorForeground": "#866186",
103 | "extensionButton.prominentBackground": "#004bff",
104 | "extensionButton.prominentForeground": "#ffebeb",
105 | "extensionButton.prominentHoverBackground": "#004bff",
106 | "focusBorder": "#000000",
107 | "foreground": "#000000",
108 | "gitDecoration.ignoredResourceForeground": "#866186",
109 | "gitDecoration.modifiedResourceForeground": "#3a599b",
110 | "gitDecoration.untrackedResourceForeground": "#866186",
111 | "textLink.activeForeground": "#000000",
112 | "textLink.foreground": "#000000",
113 | "activityBar.background": "#f1dddd",
114 | "activityBar.border": "#000000",
115 | "activityBar.foreground": "#000000",
116 | "activityBarBadge.background": "#000000",
117 | "activityBarBadge.foreground": "#ffebeb",
118 | "badge.background": "#000000",
119 | "badge.foreground": "#ffebeb",
120 | "button.background": "#ffebeb",
121 | "button.foreground": "#000000",
122 | "contrastBorder": "#000000",
123 | "debugToolBar.background": "#d7c4c4",
124 | "dropdown.background": "#d7c4c4",
125 | "dropdown.border": "#000000",
126 | "dropdown.foreground": "#000000",
127 | "panel.background": "#e4d0d0",
128 | "panel.border": "#000000",
129 | "panel.dropBorder": "#3a599b",
130 | "panelTitle.activeForeground": "#000000",
131 | "panelTitle.inactiveForeground": "#884b4b",
132 | "panelTitle.activeBorder": "#000000",
133 | "peekView.border": "#000000",
134 | "peekViewEditor.background": "#e4d0d0",
135 | "peekViewEditor.matchHighlightBackground": "#ffca0099",
136 | "peekViewTitle.background": "#f1dddd",
137 | "peekViewTitleDescription.foreground": "#a64646",
138 | "peekViewTitleLabel.foreground": "#000000",
139 | "peekViewResult.background": "#e4d0d0",
140 | "peekViewResult.fileForeground": "#000000",
141 | "peekViewResult.lineForeground": "#884b4b",
142 | "peekViewResult.matchHighlightBackground": "#ffca0099",
143 | "peekViewResult.selectionBackground": "#e4d0d0",
144 | "peekViewResult.selectionForeground": "#000000",
145 | "input.background": "#ffebeb",
146 | "input.border": "#000000",
147 | "input.foreground": "#000000",
148 | "input.placeholderForeground": "#dd0000",
149 | "list.activeSelectionBackground": "#d7c4c4",
150 | "list.activeSelectionForeground": "#000000",
151 | "list.dropBackground": "#3a599bcc",
152 | "list.focusBackground": "#cbb8b8",
153 | "list.focusOutline": "#000000",
154 | "list.focusForeground": "#000000",
155 | "list.highlightForeground": "#000000",
156 | "list.hoverBackground": "#d7c4c4",
157 | "list.inactiveSelectionBackground": "#cbb8b8",
158 | "list.inactiveSelectionForeground": "#000000",
159 | "progressBar.background": "#004bff",
160 | "sideBar.background": "#f1dddd",
161 | "sideBar.foreground": "#000000",
162 | "sideBarSectionHeader.background": "#d7c4c4",
163 | "sideBarSectionHeader.foreground": "#000000",
164 | "sideBarTitle.foreground": "#000000",
165 | "statusBar.background": "#cbb8b8",
166 | "statusBar.debuggingBackground": "#f90",
167 | "statusBar.debuggingForeground": "#000000",
168 | "statusBar.foreground": "#000000",
169 | "statusBar.noFolderBackground": "#000000",
170 | "tab.activeBackground": "#f1dddd",
171 | "tab.activeForeground": "#000000",
172 | "tab.activeModifiedBorder": "#000000",
173 | "tab.border": "#000000",
174 | "tab.inactiveBackground": "#fffafa",
175 | "tab.inactiveForeground": "#000000",
176 | "tab.inactiveModifiedBorder": "#000000",
177 | "terminal.foreground": "#000000",
178 | "terminal.background": "#d7c4c4",
179 | "terminal.border": "#744949",
180 | "terminal.ansiBlack": "#000000",
181 | "terminal.ansiBrightBlack": "#0c0c0c",
182 | "terminal.ansiBlue": "#0000f3",
183 | "terminal.ansiBrightBlue": "#0000ff",
184 | "terminal.ansiCyan": "#007474",
185 | "terminal.ansiBrightCyan": "#007c7c",
186 | "terminal.ansiGreen": "#007900",
187 | "terminal.ansiBrightGreen": "#008200",
188 | "terminal.ansiMagenta": "#bb00bc",
189 | "terminal.ansiBrightMagenta": "#c500c5",
190 | "terminal.ansiRed": "#d60000",
191 | "terminal.ansiBrightRed": "#e00000",
192 | "terminal.ansiWhite": "#676767",
193 | "terminal.ansiBrightWhite": "#6f6f6f",
194 | "terminal.ansiYellow": "#6a6b00",
195 | "terminal.ansiBrightYellow": "#737300",
196 | "terminal.selectionBackground": "#0064ff4c",
197 | "terminalCursor.foreground": "#000000",
198 | "editorBracketHighlight.foreground1": "#000000",
199 | "editorBracketHighlight.foreground2": "#000000",
200 | "editorBracketHighlight.foreground3": "#000000",
201 | "editorBracketHighlight.foreground4": "#000000",
202 | "editorBracketHighlight.foreground5": "#000000",
203 | "editorBracketHighlight.foreground6": "#000000",
204 | "editorBracketHighlight.unexpectedBracket.foreground": "#000000"
205 | },
206 | "semanticTokenColors": {
207 | "function.definition": {
208 | "fontStyle": "bold"
209 | },
210 | "type.definition": {
211 | "fontStyle": "bold"
212 | },
213 | "variable.definition": {
214 | "foreground": "#00000094"
215 | },
216 | "variable.readonly": {
217 | "foreground": "#000000",
218 | "fontStyle": "italic"
219 | },
220 | "variable.defaultLibrary": {
221 | "foreground": "#000000",
222 | "fontStyle": "italic"
223 | },
224 | "variable": {}
225 | },
226 | "tokenColors": [
227 | {
228 | "scope": [
229 | "string entity.name.import.go"
230 | ],
231 | "settings": {
232 | "foreground": "#000000"
233 | }
234 | },
235 | {
236 | "scope": [
237 | "comment.block",
238 | "comment.block.documentation",
239 | "comment.line",
240 | "comment",
241 | "string.quoted.docstring"
242 | ],
243 | "settings": {
244 | "foreground": "#0000004d",
245 | "fontStyle": "italic"
246 | }
247 | },
248 | {
249 | "scope": [
250 | "string"
251 | ],
252 | "settings": {
253 | "foreground": "#dd0000"
254 | }
255 | },
256 | {
257 | "scope": [
258 | "constant.other.placeholder",
259 | "constant.character.escape"
260 | ],
261 | "settings": {
262 | "foreground": "#000000",
263 | "fontStyle": "italic"
264 | }
265 | },
266 | {
267 | "scope": [
268 | "punctuation.definition.string",
269 | "storage.type.string.python"
270 | ],
271 | "settings": {
272 | "foreground": "#000000"
273 | }
274 | },
275 | {
276 | "scope": [
277 | "markup.italic"
278 | ],
279 | "settings": {
280 | "fontStyle": "italic"
281 | }
282 | },
283 | {
284 | "scope": [
285 | "entity.name.section.group-title",
286 | "keyword.const",
287 | "keyword.package",
288 | "markup.heading",
289 | "storage.type.function",
290 | "storage.type.import",
291 | "storage.type.namespace",
292 | "support.type.object.module",
293 | "markup.bold",
294 | "markup.inline.raw",
295 | "markup.raw.monospace",
296 | "markup.fenced_code.block",
297 | "keyword.control.landmark"
298 | ],
299 | "settings": {
300 | "fontStyle": "bold"
301 | }
302 | },
303 | {
304 | "scope": [
305 | "support.type.property-name"
306 | ],
307 | "settings": {
308 | "foreground": "#000000",
309 | "fontStyle": "bold"
310 | }
311 | }
312 | ]
313 | }
314 |
--------------------------------------------------------------------------------
/themes/clarion-color-theme-white.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Clarion White",
3 | "type": "light",
4 | "semanticHighlighting": true,
5 | "colors": {
6 | "window.activeBorder": "#000000",
7 | "window.inactiveBorder": "#886288",
8 | "titleBar.border": "#000000",
9 | "diffEditor.insertedTextBackground": "#88628830",
10 | "diffEditor.removedTextBackground": "#88628830",
11 | "editor.foreground": "#000000",
12 | "editor.background": "#ffffff",
13 | "editor.findMatchBackground": "#ffca0099",
14 | "editor.findMatchHighlightBackground": "#ffca004c",
15 | "editor.focusedStackFrameHighlightBackground": "#f909",
16 | "editor.lineHighlightBackground": "#f0f0f0",
17 | "editor.lineHighlightBorder": "#e2e2e2",
18 | "editor.selectionBackground": "#e2e2e2",
19 | "editorIndentGuide.activeBackground": "#000000",
20 | "editorIndentGuide.background": "#95959580",
21 | "editor.selectionForeground": "#ffffff",
22 | "editor.selectionHighlightBorder": "#f0f0f0",
23 | "editor.selectionHighlightBackground": "#e2e2e2",
24 | "editor.stackFrameHighlightBackground": "#ff99004c",
25 | "editor.wordHighlightBackground": "#0064ff26",
26 | "editor.wordHighlightStrongBackground": "#0064ff4c",
27 | "editorBracketMatch.background": "#e2e2e2",
28 | "editorError.foreground": "#00000000",
29 | "editorWarning.foreground": "#00000000",
30 | "editorInfo.foreground": "#00000000",
31 | "editorInfo.background": "#0000ff20",
32 | "editorWarning.background": "#80460033",
33 | "editorError.background": "#b5000033",
34 | "editorGroup.border": "#000000",
35 | "sash.hoverBorder": "#3a599b",
36 | "editorGroupHeader.tabsBackground": "#ffffff",
37 | "editorGroupHeader.tabsBorder": "#000000",
38 | "editorGutter.background": "#f0f0f0",
39 | "editorGutter.addedBackground": "#886288",
40 | "editorGutter.deletedBackground": "#886288",
41 | "editorGutter.modifiedBackground": "#3a599b",
42 | "editorLineNumber.activeForeground": "#000000",
43 | "editorLineNumber.foreground": "#000000",
44 | "editorLink.activeForeground": "#767676",
45 | "editorOverviewRuler.addedForeground": "#000000",
46 | "editorOverviewRuler.border": "#000000",
47 | "editorOverviewRuler.bracketMatchForeground": "#0064ff4c",
48 | "editorOverviewRuler.errorForeground": "#b50000",
49 | "editorOverviewRuler.warningForeground": "#804600",
50 | "editorOverviewRuler.infoForeground": "#0000ff",
51 | "editorOverviewRuler.findMatchForeground": "#ffca0099",
52 | "editorOverviewRuler.modifiedForeground": "#3a599b",
53 | "editorOverviewRuler.selectionHighlightForeground": "#0064ff4c",
54 | "editorOverviewRuler.wordHighlightForeground": "#0064ff26",
55 | "editorOverviewRuler.wordHighlightStrongForeground": "#0064ff4c",
56 | "editorRuler.foreground": "#f0f0f0",
57 | "editorSuggestWidget.foreground": "#000000",
58 | "editorWidget.background": "#f0f0f0",
59 | "editorWidget.border": "#000000",
60 | "scrollbar.shadow": "#000000",
61 | "scrollbarSlider.background": "#00000020",
62 | "scrollbarSlider.hoverBackground": "#00000030",
63 | "titleBar.activeBackground": "#ffffff",
64 | "titleBar.activeForeground": "#000000",
65 | "titleBar.inactiveBackground": "#ffffff",
66 | "titleBar.inactiveForeground": "#000000",
67 | "widget.shadow": "#000000",
68 | "settings.headerForeground": "#804600",
69 | "symbolIcon.arrayForeground": "#000000",
70 | "symbolIcon.booleanForeground": "#000000",
71 | "symbolIcon.classForeground": "#000000",
72 | "symbolIcon.colorForeground": "#000000",
73 | "symbolIcon.constantForeground": "#000000",
74 | "symbolIcon.constructorForeground": "#000000",
75 | "symbolIcon.enumeratorForeground": "#000000",
76 | "symbolIcon.enumeratorMemberForeground": "#000000",
77 | "symbolIcon.eventForeground": "#000000",
78 | "symbolIcon.fieldForeground": "#000000",
79 | "symbolIcon.fileForeground": "#000000",
80 | "symbolIcon.folderForeground": "#000000",
81 | "symbolIcon.functionForeground": "#000000",
82 | "symbolIcon.interfaceForeground": "#000000",
83 | "symbolIcon.keyForeground": "#000000",
84 | "symbolIcon.keywordForeground": "#000000",
85 | "symbolIcon.methodForeground": "#000000",
86 | "symbolIcon.moduleForeground": "#000000",
87 | "symbolIcon.namespaceForeground": "#000000",
88 | "symbolIcon.nullForeground": "#000000",
89 | "symbolIcon.numberForeground": "#000000",
90 | "symbolIcon.objectForeground": "#000000",
91 | "symbolIcon.operatorForeground": "#000000",
92 | "symbolIcon.packageForeground": "#000000",
93 | "symbolIcon.propertyForeground": "#000000",
94 | "symbolIcon.referenceForeground": "#000000",
95 | "symbolIcon.snippetForeground": "#000000",
96 | "symbolIcon.stringForeground": "#000000",
97 | "symbolIcon.structForeground": "#000000",
98 | "symbolIcon.textForeground": "#000000",
99 | "symbolIcon.typeParameterForeground": "#000000",
100 | "symbolIcon.unitForeground": "#000000",
101 | "symbolIcon.variableForeground": "#000000",
102 | "errorForeground": "#886288",
103 | "extensionButton.prominentBackground": "#004bff",
104 | "extensionButton.prominentForeground": "#ffffff",
105 | "extensionButton.prominentHoverBackground": "#004bff",
106 | "focusBorder": "#000000",
107 | "foreground": "#000000",
108 | "gitDecoration.ignoredResourceForeground": "#886288",
109 | "gitDecoration.modifiedResourceForeground": "#3a599b",
110 | "gitDecoration.untrackedResourceForeground": "#886288",
111 | "textLink.activeForeground": "#000000",
112 | "textLink.foreground": "#000000",
113 | "activityBar.background": "#f0f0f0",
114 | "activityBar.border": "#000000",
115 | "activityBar.foreground": "#000000",
116 | "activityBarBadge.background": "#000000",
117 | "activityBarBadge.foreground": "#ffffff",
118 | "badge.background": "#000000",
119 | "badge.foreground": "#ffffff",
120 | "button.background": "#ffffff",
121 | "button.foreground": "#000000",
122 | "contrastBorder": "#000000",
123 | "debugToolBar.background": "#d5d5d5",
124 | "dropdown.background": "#d5d5d5",
125 | "dropdown.border": "#000000",
126 | "dropdown.foreground": "#000000",
127 | "panel.background": "#e2e2e2",
128 | "panel.border": "#000000",
129 | "panel.dropBorder": "#3a599b",
130 | "panelTitle.activeForeground": "#000000",
131 | "panelTitle.inactiveForeground": "#656565",
132 | "panelTitle.activeBorder": "#000000",
133 | "peekView.border": "#000000",
134 | "peekViewEditor.background": "#e2e2e2",
135 | "peekViewEditor.matchHighlightBackground": "#ffca0099",
136 | "peekViewTitle.background": "#f0f0f0",
137 | "peekViewTitleDescription.foreground": "#6e6e6e",
138 | "peekViewTitleLabel.foreground": "#000000",
139 | "peekViewResult.background": "#e2e2e2",
140 | "peekViewResult.fileForeground": "#000000",
141 | "peekViewResult.lineForeground": "#656565",
142 | "peekViewResult.matchHighlightBackground": "#ffca0099",
143 | "peekViewResult.selectionBackground": "#e2e2e2",
144 | "peekViewResult.selectionForeground": "#000000",
145 | "input.background": "#ffffff",
146 | "input.border": "#000000",
147 | "input.foreground": "#000000",
148 | "input.placeholderForeground": "#767676",
149 | "list.activeSelectionBackground": "#d5d5d5",
150 | "list.activeSelectionForeground": "#000000",
151 | "list.dropBackground": "#3a599bcc",
152 | "list.focusBackground": "#c9c9c9",
153 | "list.focusOutline": "#000000",
154 | "list.focusForeground": "#000000",
155 | "list.highlightForeground": "#000000",
156 | "list.hoverBackground": "#d5d5d5",
157 | "list.inactiveSelectionBackground": "#c9c9c9",
158 | "list.inactiveSelectionForeground": "#000000",
159 | "progressBar.background": "#004bff",
160 | "sideBar.background": "#f0f0f0",
161 | "sideBar.foreground": "#000000",
162 | "sideBarSectionHeader.background": "#d5d5d5",
163 | "sideBarSectionHeader.foreground": "#000000",
164 | "sideBarTitle.foreground": "#000000",
165 | "statusBar.background": "#c9c9c9",
166 | "statusBar.debuggingBackground": "#f90",
167 | "statusBar.debuggingForeground": "#000000",
168 | "statusBar.foreground": "#000000",
169 | "statusBar.noFolderBackground": "#000000",
170 | "tab.activeBackground": "#f0f0f0",
171 | "tab.activeForeground": "#000000",
172 | "tab.activeModifiedBorder": "#000000",
173 | "tab.border": "#000000",
174 | "tab.inactiveBackground": "#ffffff",
175 | "tab.inactiveForeground": "#000000",
176 | "tab.inactiveModifiedBorder": "#000000",
177 | "terminal.foreground": "#000000",
178 | "terminal.background": "#d5d5d5",
179 | "terminal.border": "#5d5d5d",
180 | "terminal.ansiBlack": "#000000",
181 | "terminal.ansiBrightBlack": "#0c0c0c",
182 | "terminal.ansiBlue": "#0000f3",
183 | "terminal.ansiBrightBlue": "#0000ff",
184 | "terminal.ansiCyan": "#007e7f",
185 | "terminal.ansiBrightCyan": "#008686",
186 | "terminal.ansiGreen": "#008400",
187 | "terminal.ansiBrightGreen": "#008c00",
188 | "terminal.ansiMagenta": "#cb00cc",
189 | "terminal.ansiBrightMagenta": "#d400d4",
190 | "terminal.ansiRed": "#e70000",
191 | "terminal.ansiBrightRed": "#f10000",
192 | "terminal.ansiWhite": "#717171",
193 | "terminal.ansiBrightWhite": "#787878",
194 | "terminal.ansiYellow": "#747500",
195 | "terminal.ansiBrightYellow": "#7c7c00",
196 | "terminal.selectionBackground": "#0064ff4c",
197 | "terminalCursor.foreground": "#000000",
198 | "editorBracketHighlight.foreground1": "#000000",
199 | "editorBracketHighlight.foreground2": "#000000",
200 | "editorBracketHighlight.foreground3": "#000000",
201 | "editorBracketHighlight.foreground4": "#000000",
202 | "editorBracketHighlight.foreground5": "#000000",
203 | "editorBracketHighlight.foreground6": "#000000",
204 | "editorBracketHighlight.unexpectedBracket.foreground": "#000000"
205 | },
206 | "semanticTokenColors": {
207 | "function.definition": {
208 | "fontStyle": "bold"
209 | },
210 | "type.definition": {
211 | "fontStyle": "bold"
212 | },
213 | "variable.definition": {
214 | "foreground": "#00000094"
215 | },
216 | "variable.readonly": {
217 | "foreground": "#000000",
218 | "fontStyle": "italic"
219 | },
220 | "variable.defaultLibrary": {
221 | "foreground": "#000000",
222 | "fontStyle": "italic"
223 | },
224 | "variable": {}
225 | },
226 | "tokenColors": [
227 | {
228 | "scope": [
229 | "string entity.name.import.go"
230 | ],
231 | "settings": {
232 | "foreground": "#000000"
233 | }
234 | },
235 | {
236 | "scope": [
237 | "comment.block",
238 | "comment.block.documentation",
239 | "comment.line",
240 | "comment",
241 | "string.quoted.docstring"
242 | ],
243 | "settings": {
244 | "foreground": "#0000004d",
245 | "fontStyle": "italic"
246 | }
247 | },
248 | {
249 | "scope": [
250 | "string"
251 | ],
252 | "settings": {
253 | "foreground": "#767676"
254 | }
255 | },
256 | {
257 | "scope": [
258 | "constant.other.placeholder",
259 | "constant.character.escape"
260 | ],
261 | "settings": {
262 | "foreground": "#000000",
263 | "fontStyle": "italic"
264 | }
265 | },
266 | {
267 | "scope": [
268 | "punctuation.definition.string",
269 | "storage.type.string.python"
270 | ],
271 | "settings": {
272 | "foreground": "#000000"
273 | }
274 | },
275 | {
276 | "scope": [
277 | "markup.italic"
278 | ],
279 | "settings": {
280 | "fontStyle": "italic"
281 | }
282 | },
283 | {
284 | "scope": [
285 | "entity.name.section.group-title",
286 | "keyword.const",
287 | "keyword.package",
288 | "markup.heading",
289 | "storage.type.function",
290 | "storage.type.import",
291 | "storage.type.namespace",
292 | "support.type.object.module",
293 | "markup.bold",
294 | "markup.inline.raw",
295 | "markup.raw.monospace",
296 | "markup.fenced_code.block",
297 | "keyword.control.landmark"
298 | ],
299 | "settings": {
300 | "fontStyle": "bold"
301 | }
302 | },
303 | {
304 | "scope": [
305 | "support.type.property-name"
306 | ],
307 | "settings": {
308 | "foreground": "#000000",
309 | "fontStyle": "bold"
310 | }
311 | }
312 | ]
313 | }
314 |
--------------------------------------------------------------------------------