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.

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.

| Role | Dusk | Moss | Use |
|---|---|---|---|
inkMain | #ede8e7 | #eaeae0 | Names, titles, the line in focus |
inkSec | #e6e0de | #e2e2d6 | Facts: size, time, length, details |
inkMeta | #dcd5d3 | #d7d7cb | A name beside a name, ordinals, counts |
inkFaint | #b9b3b1 | #b5b4aa | Disabled parts |
hairline | #5c5856 | #595a51 | The one line under a header, rail to page |
accent | #dfc0b2 | #bfcf65 | The current place, the primary action's ring, what is playing, the focus ring, the caret. Never text |
inkOnAccent | #3f2c22 | #2d3400 | Text on an accent fill |
risk | #ffbeb6 | #ffbeb6 | A destructive action, always last, always with the warning symbol |
windowGround | #1e1b1a | #1b1c15 | An app window's ground, drawn at 85 % |
container | #2c2928 | #2a2b23 | A search field in use; never a group inside content |
overlay | #2b2421 | #34381e | A menu over content: solid |
quiet | #8e8988 | #8a8b82 | Context lines: lyrics still to come, an unplayed waveform |
past | #605d5c | #5e5e57 | Lyrics already sung, the empty track of a line |
The recipes, from tokens.json:
inkSecis a quarter main ink and three quarters secondary, so it sits between them, nearer the secondary.inkMetais solved to Lc 75 on the ground under the pointer on a selected row, which is the hardest case; it is a little higher on a plain row.riskis solved along the palette's error colour to Lc 75 on the ground.accentis the palette's primary, andinkOnAccentits on-primary.windowGroundis the palette'ssurface_container_low;containeris itssurface_container_high.overlayis the window ground four parts to one part of the accent's container, so a fifth of the way from the ground to it.quietandpastare the main ink taken to an APCA contrast of 38 and 18 against the window ground.
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.

| Ink | APCA Lc | For |
|---|---|---|
| Main | 92 | Names, titles, the line in focus |
| Secondary | 85 | Facts and details |
| Meta | 75 | A name beside a name, counts. The least that small text may use |
| Faint | 60 | Disabled parts, which are not read |
| Hairline | 16 | A 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.

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.
Text and figures: CC BY 4.0. Tacit.Kit: LGPL-3.0 code, OFL fonts. The Tacit name.