├── .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 | ![Clarion Logo](img/logo.png?raw=true) 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 | Clarion White Preview 10 | Clarion Blue Preview 12 | Clarion Orange Preview 14 | Clarion Peach Preview 16 | Clarion Red Preview 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`![problem swatch](https://via.placeholder.com/15/b50000.png?text=+), there is a serious problem of some kind within that context. Similarly, if you see `new`![new swatch](https://via.placeholder.com/15/4b6319.png?text=+), 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: ![#ffffff](https://via.placeholder.com/15/ffffff/000000?text=+) 13 | * Hex: #ffffff 14 | 15 | Clarion's primary background color. Provides the highest contrast. 16 | 17 | ### Orange 18 | * Swatch: ![#fff1d6](https://via.placeholder.com/15/fff1d6/000000?text=+) 19 | * Hex: #fff1d6 20 | 21 | ### Red 22 | * Swatch: ![#ffebeb](https://via.placeholder.com/15/ffd8d7/000000?text=+) 23 | * Hex: #ffebeb 24 | 25 | ### Blue 26 | * Swatch: ![#ebf3ff](https://via.placeholder.com/15/d7eeff/000000?text=+) 27 | * Hex: #ebf3ff 28 | 29 | ### Peach 30 | * Swatch: ![#edd1b0](https://via.placeholder.com/15/edd1b0/000000?text=+) 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: ![#000000](https://via.placeholder.com/15/000000/000000?text=+) 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: ![problem swatch](https://via.placeholder.com/15/b50000.png?text=+) 109 | * Sample: ![problem sample](https://via.placeholder.com/150x50/edd1b0/b50000.png?text=Problem) 110 | * Hex: #b50000 111 | 112 | #### Rationale 113 | TBD 114 | 115 | #### Example Usage 116 | * errors 117 | * fatal problems 118 | 119 | ### Notice 120 | * Swatch: ![notice swatch](https://via.placeholder.com/15/804600.png?text=+) 121 | * Sample: ![notice sample](https://via.placeholder.com/150x50/edd1b0/804600.png?text=Notice) 122 | * Hex: #804600 123 | 124 | #### Rationale 125 | TBD 126 | 127 | #### Example Usage 128 | * notable warnings 129 | * failed tests 130 | 131 | ### New 132 | * Swatch: ![new swatch](https://via.placeholder.com/15/4b6319.png?text=+) 133 | * Sample: ![new sample](https://via.placeholder.com/150x50/edd1b0/4b6319.png?text=New) 134 | * Hex: #4b6319 135 | 136 | #### Rationale 137 | TBD 138 | 139 | #### Example Usage 140 | * Diff additions 141 | * Untracked files 142 | 143 | ### Modified 144 | * Swatch: ![modified swatch](https://via.placeholder.com/15/3a599b.png?text=+) 145 | * Sample: ![modified sample](https://via.placeholder.com/150x50/edd1b0/3a5998.png?text=Modified) 146 | * Hex: #3a599b 147 | 148 | #### Rationale 149 | TBD 150 | 151 | #### Example Usage 152 | * Diff modifications 153 | * modified files 154 | 155 | ### Excluded 156 | * Swatch: ![excluded swatch](https://via.placeholder.com/15/886288.png?text=+) 157 | * Sample: ![excluded sample](https://via.placeholder.com/150x50/edd1b0/886288.png?text=Excluded) 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: ![excluded swatch](https://via.placeholder.com/15/ff0000.png?text=+) 176 | * Hex: #ff0000 177 | 178 | ### Green 179 | * Swatch: ![excluded swatch](https://via.placeholder.com/15/00ff00.png?text=+) 180 | * Hex: #00ff00 181 | 182 | ### Yellow 183 | * Swatch: ![excluded swatch](https://via.placeholder.com/15/ffff00.png?text=+) 184 | * Hex: #ffff00 185 | 186 | ### Blue 187 | * Swatch: ![excluded swatch](https://via.placeholder.com/15/0000ff.png?text=+) 188 | * Hex: #0000ff 189 | 190 | ### Magenta 191 | * Swatch: ![excluded swatch](https://via.placeholder.com/15/ff00ff.png?text=+) 192 | * Hex: #ff00ff 193 | 194 | ### Cyan 195 | * Swatch: ![excluded swatch](https://via.placeholder.com/15/00ffff.png?text=+) 196 | * Hex: #00ffff 197 | 198 | ### White 199 | * Swatch: ![excluded swatch](https://via.placeholder.com/15/ffffff.png?text=+) 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 | ![Clarion Logo](img/logo.png?raw=true) 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 | {{.themename }} Preview 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`![problem swatch](https://via.placeholder.com/15/{{.baseTheme.Base.Problem.Unmodified.HexT}}.png?text=+), there is a serious problem of some kind within that context. Similarly, if you see `new`![new swatch](https://via.placeholder.com/15/{{.baseTheme.Base.New.Unmodified.HexT}}.png?text=+), 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 | --------------------------------------------------------------------------------