An architecture for building themes based on carefully chosen syntax highlighting using a base of sixteen colours. Base16 provides a set of guidelines detailing how to style syntax and how to code a builder for compiling base16 schemes and templates.Download Base16 for your Favourite Applications
k to move through schemes and keys
l to move through languages.
Note: Your editor may not be capable of highlighting code exactly as it appears in the preview above. Therefore, there may be some discrepancies between this preview and your editor.
Base16 aims to group similar language constructs with a single color. For example, floats, ints, and doubles would belong to the same colour group. The colors for the default theme were chosen to be easily separable, but scheme designers should pick whichever colours they desire, e.g. base0B (green by default) could be replaced with red. There are, however, some general guidelines below that stipulate which base0B should be used to highlight each construct when designing templates for editors.
Since describing syntax highlighting can be tricky, please see base16-vim and base16-textmate for reference. Though it should be noted that each editor will have some discrepancies due the fact that editors generally have different syntax highlighting engines.
Colors base00 to base07 are typically variations of a shade and run from darkest to lightest. These colors are used for foreground and background, status bars, line highlighting and such. Colors base08 to base0F are typically individual colors used for types, operators, names and variables. In order to create a dark theme, colors base00 to base07 should span from dark to light. For a light theme, these colours should span from light to dark.
A base16 builder is an application that can build syntax highlighting definition files for text editors by using base16 scheme files which contain a collection of colours and base16 template files which contain syntax highlighting rules. A builder uses Git as the mechanism to download and keep up-to-date syntax files and template files.
/- Contains anything you consider appropriate for your builder
/sources.yaml- Holds a list of source repositories for schemes and templates
/sources/schemes/list.yaml- Holds a list of scheme repositories
/sources/templates/list.yaml- Holds a list of template repositories
/schemes/[name]/*.yaml- A scheme file (there may be multiples of these)
/templates/[name]/templates/*.mustache- A template file (there may be multiples of these)
/templates/[name]/templates/config.yaml- A template configuration file
The first job a just-installed builder has is to populate a list of scheme sources and template sources. It does this by parsing the
/sources.yaml file and using Git to clone the repositories defined within to
/sources. Next, the builder will parse the downloaded
/sources/schemes/list.yaml and use Git to clone the defined repositories to
/schemes. Finally, the builder will parse the downloaded
/sources/templates/list.yaml and use Git to clone the defined repositories to
/templates. This task is performed by the
builder update command, which can be used to update sources, schemes, and templates.
When building themes by running
builder without any arguments, a base16 builder should first clear out any old output then iterate through all the scheme files in
/schemes and for each scheme should iterate through all the template files in
/templates producing themes that will be output to the template directories specified in
/templates/template_name/template/config.yaml. The theme filename should look like
base16-[slug][extension]. Where the slug is taken from the scheme filename made lowercase with spaces replaced with dashes and extension is taken from
In the case where schemes share the same name, a builder will overwrite a perviously generated template file. Should this happen, a builder should show warning messages listing the overwritten template files.
A builder should provide the following variables to a template file:
scheme-name- obtained from the scheme file
scheme-author- obtained from the scheme file
scheme-slug- obtained from the scheme filename, as described above
base0F-hex-r- built from the hex value in the scheme file e.g "7c"
base0F-hex-g- built from the hex value in the scheme file e.g "af"
base0F-hex-b- built from the hex value in the scheme file e.g "c2"
base0F-rgb-r- converted from the hex value in the scheme file e.g "124"
base0F-rgb-g- converted from the hex value in the scheme file e.g "175"
base0F-rgb-b- converted from the hex value in the scheme file e.g "194"
base0F-dec-r- converted from the rgb value in the scheme file e.g "0.87..."
base0F-dec-g- converted from the rgb value in the scheme file e.g "0.50..."
base0F-dec-b- converted from the rgb value in the scheme file e.g "0.21..."
Builders should also provide the following variables for convenience:
base0F-hex- obtained from the scheme file e.g "7cafc2"
base0F-hex-bgr- built from a reversed version of all the hex values e.g "c2af7c"
There is no outline for a recommended code structure that a base16 theme builder should follow but a design goal should be to keep the application as simple as possible providing only the functionality described in this document. If you feel you have a great idea for additional functionality please raise an issue in the base16 repository.
Mustache was chosen as the templating language due to its simplicity and widespread adoption across languages. YAML was chosen to describe scheme and configuration files for the same reasons.