Colour

Colour is a recipe over the wallpaper's palette, so every role has a value on every wallpaper. Apps ask for roles, never for colours.

A window on the wallpaper with a rail whose Downloads row is current, three file rows, the first selected, and two buttons: Open, with a ring in the accent, and Move to the trash in the risk ink.
The same app on either wallpaper: the accent and the inks change, the roles do not.

Roles over a palette

The shell makes a palette from the wallpaper (Material's scheme) and solves the text inks on it. Tacit.Kit names what an app may ask for, as a recipe over that palette. On dusk the accent is a pale peach; on Moss it is a green. Both are the same role.

Twelve of the roles as swatches with their names and values on this palette: the four inks, accent, ink on accent, risk, hairline, window ground, container, overlay and quiet.
The roles on this palette. Use the switch to see the other. The table has the rest.
RoleDuskMossUse
inkMain#ede8e7#eaeae0Names, titles, the line in focus
inkSec#e6e0de#e2e2d6Facts: size, time, length, details
inkMeta#dcd5d3#d7d7cbA name beside a name, ordinals, counts
inkFaint#b9b3b1#b5b4aaDisabled parts
hairline#5c5856#595a51The one line under a header, rail to page
accent#dfc0b2#bfcf65The current place, the primary action's ring, what is playing, the focus ring, the caret. Never text
inkOnAccent#3f2c22#2d3400Text on an accent fill
risk#ffbeb6#ffbeb6A destructive action, always last, always with the warning symbol
windowGround#1e1b1a#1b1c15An app window's ground, drawn at 85 %
container#2c2928#2a2b23A search field in use; never a group inside content
overlay#2b2421#34381eA menu over content: solid
quiet#8e8988#8a8b82Context lines: lyrics still to come, an unplayed waveform
past#605d5c#5e5e57Lyrics already sung, the empty track of a line

The recipes, from tokens.json:

Three more roles are for particular places. overlayMeta and overlayRisk are the meta and risk inks solved to Lc 75 on a lit menu line, so a menu's headings, details and risk line read on every line. currentHoverGround is the ground under the pointer on a selected row, which the meta ink is solved on.

The inks

Text is never dimmed with opacity. Its colour comes from one of four inks, each solved along the palette's hue to reach a fixed APCA contrast on the window ground, so the same level reads the same on every wallpaper.

Four lines of text in the main, secondary, meta and faint inks with their contrast, Lc 92, 85, 75 and 60, and a hairline at Lc 16.
The four text inks and the contrast each reaches, and the hairline.
InkAPCA LcFor
Main92Names, titles, the line in focus
Secondary85Facts and details
Meta75A name beside a name, counts. The least that small text may use
Faint60Disabled parts, which are not read
Hairline16A line, not text

Accent and risk

The accent is a mark, never text. It shows where you are (the rail's tick), the way forward (the primary action's ring), where the keyboard is (the focus ring) and what is playing. It is not used for headings, and it is not a fill behind words except in inkOnAccent. A link in running text is an InlineLink: the secondary ink, and the main ink under the pointer.

Risk is last and has a symbol. A destructive action is the last in its list, in the risk ink, with the warning symbol before its words, so a person who cannot see the colour still sees the warning.

Five small examples: the rail row for the current place with an accent tick, the Open button with an accent ring, a selected row with the keyboard ring, Move to the trash in the risk ink, and a Delete button with a quiet risk ring.
Where the accent and the risk ink appear.

On any wallpaper

An app never picks a colour. It reads Kit.tokens.accent and the rest, and they change when the user changes the wallpaper. Use the tokens for your own drawing as well; tools/lint.py in the kit reports raw colours, literal sizes and faded text in an app.

Experimental, in Tacit.Kit 0.1.