Skip to content

The [palette] table

An optional top-level table that selects the gradient. Give either a built-in name or custom stops — not both (setting both, or neither, is a load error).

Built-in palettes — name

[palette]
name = "ember"
NameGradient
spectrumThe classic full-hue iq cosine — the default.
emberWarm embers: deep red → orange → pale gold.
iceCool ice: deep blue → cyan → near-white.
monoGrayscale black → white.
auroraDeep green → teal → violet.

Custom gradient stops — stops

A gradient through your own colour stops. Each stop is { at = <0..1>, color = <colour> }, where <colour> is a #rrggbb hex string or an [r, g, b] array of 0..1 floats. Both are sRGB — the colour a picker or an eyedropper gives you, and the colour that renders:

[palette]
stops = [
{ at = 0.0, color = "#0b0b2a" }, # deep night blue
{ at = 0.5, color = "#ff5500" }, # hot orange
{ at = 1.0, color = [1.0, 0.87, 0.53] }, # pale gold
]

Validated at load: at least two stops, each at in 0..=1 and sorted ascending, every colour parseable. Any violation is a surfaced error and the engine keeps the last good preset (it never crashes).

The stop is decoded to light once, when the LUT is baked (ADR-0151), so what you write is what the frame carries: a plateau authored #c81423 comes back #c81423. That is exact below the tonemap’s knee at linear 0.6, where the curve is the identity and the load decode and the display encode are inverses — to within the LUT’s own 8-bit storage, which costs up to two levels on a very dark channel. Above the knee all three channels scale together, so the plateau survives as the same ink at a lower level. There is no opt-out and no second reading of a hex triple.

Everything after that decode is a linear-light colour, and it stays one all the way to the display. The scene multiplies the decoded stop by whatever luminance it has and writes the result into a floating-point composite that is free to exceed 1.0, and the engine tonemap at the end of the frame is the only place anything is compressed. So what a preset does to a palette colour is arithmetic on light rather than on bytes, and two consequences follow for authoring: a stop is never silently clipped on its way through the composite, and the roll-off that finally applies is hue-preserving (see the ramp notes below).

The gradient repeats past its ends: a colour coordinate that wraps past 1 comes back around at 0.

[!IMPORTANT] Repeating is not the same as continuous. The wrap is seamless only if the gradient’s last stop is the same colour as its first. The spectrum cosine is genuinely periodic, so it wraps invisibly; all four stop-list palettes (ember, ice, mono, aurora) run from a dark end to a light one, so the wrap is the sharpest transition in the gradient, not the softest. That does not matter when the coordinate stays inside 0..1 — which is the usual case — but it matters a great deal anywhere the whole gradient is walked around a closed figure (see Spectrum). If you need a cyclic gradient, write custom stops that return to the starting colour at at = 1.0.


Built from a8ce055 at version 0.115.0. This site tracks main and is not versioned per release.