# `Expresso.Palette.Builtin`
[🔗](https://github.com/rellen/expresso/blob/main/lib/expresso/palette/builtin.ex#L1)

Holds the built-in themes, each one adjusted to the minimums of `Expresso.Palette`

`assets/themes/` holds the base16 schemes of the Tinted Theming project,
unchanged, and `assets/themes/LICENSE` gives their license. This module reads
each file when it compiles, and `Expresso.Palette.adjust/1` changes the
lightness of each color that fails a minimum. The name of a theme is the
name of its file, such as `:catppuccin_mocha` for `catppuccin-mocha.yaml`.

A theme is built in only when no color of its adjusted roles moves more than
0.4 in the lightness of OKLab, which is two fifths of the way from black to
white. A larger change gives a color that the reader does not know as a color
of the scheme. The compile stops for a file that needs a larger change. The
comments of a dark scheme need the largest change, because most schemes give
them a low contrast. A comment has little chroma, so it stays a gray of the
scheme.
`docs/reference/theme-option.md` lists the themes, and the schemes that this
limit leaves out.

The theme `:default` is the theme of Expresso. It has black text on white,
and its code colors come from the Tango style of Makeup. Tango gives
`base0C` and `base0E` the same blue, so `base0C` is the cyan of the Tango
palette. The roles `binder` and `argument` of a β-reduction thus have
different colors.

# `fetch!`

```elixir
@spec fetch!(atom()) :: Expresso.Palette.t()
```

Return the adjusted palette of a built-in theme

    iex> Expresso.Palette.Builtin.fetch!(:dracula).name
    "Dracula"

# `limit`

```elixir
@spec limit() :: float()
```

Return the largest change of lightness that a built-in theme may need

# `names`

```elixir
@spec names() :: [atom()]
```

Return the names of the built-in themes, in alphabetical order

---

*Consult [api-reference.md](api-reference.md) for complete listing*
