22 roles · 37 measured pairs
Colour
Backgrounds, inks, lines, the action colour and the audit states. The subject of the product is contrast, so it became its form: no image, no gradient, no drop shadow; structure comes from the line and the empty space. Colour never carries meaning alone (criterion 3.1): wherever a state is coloured, a word or a symbol goes with it. The action colour is reserved for what can be activated and never decorates; no state colour ever serves as an accent.
The roles
A role is a custom property, --rl-*, with one value per set. The light set is the value; dark, print and
forced colours redefine it on the same selectors. A component references the role, never a hex.
- lightdark
--rl-bgThe page. A slightly warm white, not a pure one: three points of contrast given up against ink (17.92:1 instead of 21:1) for an interface that does not burn the eyes after three hours of audit.
- Light
#fbfaf8- Dark
#141310#ffffff- Forced colours
Canvas
- lightdark
--rl-surfaceAn element laid on the page: a card, a field, a button's own background.
- Light
#ffffff- Dark
#1c1a16#ffffff- Forced colours
Canvas
- lightdark
--rl-sunkenA hollow: a table header, an inert zone, a control that is busy.
- Light
#f4f2ee- Dark
#100f0d#f4f2ee- Forced colours
Canvas
- lightdark
--rl-inkBody text. Ink black rather than absolute black.
- Light
#14120f- Dark
#f3f0ea#14120f- Forced colours
CanvasText
- lightdark
--rl-ink-softCaptions and metadata. Balanced by measurement across the two sets: 7.33:1 light, 7.32:1 dark.
- Light
#57534c- Dark
#a8a296#57534c- Forced colours
CanvasText
- lightdark
--rl-on-fillText on a filled surface: a primary button, a status toggle that is pressed.
- Light
#ffffff- Dark
#141310#ffffff- Forced colours
ButtonFace
- lightdark
--rl-lineThe ordinary hairline, 1px. It carries no information and stays below 3:1 on purpose; a control never uses it as its edge.
- Light
#d9d5cd- Dark
#322e28#b8b3aa- Forced colours
GrayText
- lightdark
--rl-line-strongA line of structure, 1.5px: the rule under a section heading, the top of a table.
- Light
#14120f- Dark
#f3f0ea#14120f- Forced colours
CanvasText
- lightdark
--rl-line-controlThe edge of a control: button, field, list. Distinct from the hairline for a measured reason: the hairline gives 1.46:1 on the surface, fine for a separator, not for what bounds an interactive element, which criterion 3.3 wants at 3:1. Born in the extension panel, where the defect was measured on twenty-three controls.
- Light
#8f8779- Dark
#767066#8f8779- Forced colours
ButtonBorder
- lightdark
--rl-actionReserved for what can be activated: links, primary buttons, the current item. Never decorative.
- Light
#1b3a8c- Dark
#8fa8f0#1b3a8c- Forced colours
LinkText
- lightdark
--rl-action-hover- Light
#142c6b- Dark
#b0c1f6#142c6b- Forced colours
LinkText
- lightdark
--rl-ncNon-conforme. Also the colour of a destructive action, because it shares the meaning: this damages.
- Light
#a32e1e- Dark
#f08a78#a32e1e- Forced colours
CanvasText
- lightdark
--rl-cConforme.
- Light
#1e5c3f- Dark
#6fc49a#1e5c3f- Forced colours
CanvasText
- lightdark
--rl-naNon applicable. The neutral ink: an absence of verdict, not a judgement.
- Light
#57534c- Dark
#a8a296#57534c- Forced colours
CanvasText
- lightdark
--rl-ntNon testé. Same ink as non applicable; the chip distinguishes it with a dashed edge, never with a hue.
- Light
#57534c- Dark
#a8a296#57534c- Forced colours
CanvasText
- lightdark
--rl-attentionAn answer to check again: neither a verdict nor its absence, but work that remains. Came from the extension panel, where it used to be written by hand in one hue for both themes.
- Light
#7a4a00- Dark
#e0b062#7a4a00- Forced colours
CanvasText
- lightdark
--rl-derogationA derogated criterion, which a report must tell apart from a non applicable one without giving it the hue of a verdict. Always accompanied by the ⊘ symbol and the word.
- Light
#a15c00- Dark
#e39a5a#a15c00- Forced colours
CanvasText
- lightdark
--rl-hoverThe background of a row or a control under the pointer. Hovering darkens on the light set and lightens on the dark set; both values come from the set itself.
- Light
#f4f2ee- Dark
#1c1a16#f4f2ee- Forced colours
Canvas
- lightdark
--rl-canvasThe surface an audited image is viewed on. It does not follow the theme: a transparent logo or a dark pictogram must read as on paper, or the auditor judges an image they cannot see.
- Light
#ffffff- Dark
#ffffff#ffffff- Forced colours
Canvas
- lightdark
--rl-canvas-inkText on the viewing surface. Does not follow the theme either, for the same reason.
- Light
#14120f- Dark
#14120f#14120f- Forced colours
CanvasText
- lightdark
--rl-backdropThe veil under a modal. The one place translucency is allowed: it must show that the dialog sits on the page and not in its place, and it never sits under text of ours.
- Light
#14120f8c- Dark
#00000099#14120f8c- Forced colours
Canvas
- lightdark
--rl-focusThe focus ring. The action colour, never a state colour: a red ring on a field would read as an error.
- Light
#1b3a8c- Dark
#8fa8f0#1b3a8c- Forced colours
Highlight
Every pair, measured
The colour pairs the product relies on, with the floor each must hold. The generator measures every pair in the light, dark and print sets and fails the build below the floor; the ratios it writes into tokens.css come from here, so they can never lie. `min` is a floor; `max` is a ceiling, for the one line that must stay a separator. Thresholds: 4.5 for text (criteria 3.2), 3 for the edge of a control and for the focus ring (criterion 3.3).
| Text or edge | On | Floor | Light | Dark | Why | |
|---|---|---|---|---|---|---|
ink | bg | 4.5:1 at least | 17.92:1 | 16.33:1 | 18.69:1 | body text on the page |
ink | surface | 4.5:1 at least | 18.69:1 | 15.27:1 | 18.69:1 | |
ink | sunken | 4.5:1 at least | 16.72:1 | 16.84:1 | 16.72:1 | |
ink-soft | bg | 4.5:1 at least | 7.32:1 | 7.31:1 | 7.64:1 | captions |
ink-soft | surface | 4.5:1 at least | 7.64:1 | 6.84:1 | 7.64:1 | |
ink-soft | sunken | 4.5:1 at least | 6.83:1 | 7.54:1 | 6.83:1 | the label of a busy button |
on-fill | action | 4.5:1 at least | 10.34:1 | 7.98:1 | 10.34:1 | a primary button |
on-fill | nc | 4.5:1 at least | 7.07:1 | 7.61:1 | 7.07:1 | a destructive button under the pointer, a pressed NC toggle |
on-fill | c | 4.5:1 at least | 7.90:1 | 8.88:1 | 7.90:1 | a pressed C toggle |
on-fill | na | 4.5:1 at least | 7.64:1 | 7.31:1 | 7.64:1 | a pressed NA toggle |
on-fill | attention | 4.5:1 at least | 7.48:1 | 9.33:1 | 7.48:1 | |
action | bg | 4.5:1 at least | 9.91:1 | 7.98:1 | 10.34:1 | a link |
action | surface | 4.5:1 at least | 10.34:1 | 7.46:1 | 10.34:1 | |
action-hover | bg | 4.5:1 at least | 12.56:1 | 10.44:1 | 13.10:1 | |
action-hover | surface | 4.5:1 at least | 13.10:1 | 9.76:1 | 13.10:1 | |
nc | bg | 4.5:1 at least | 6.78:1 | 7.61:1 | 7.07:1 | |
nc | surface | 4.5:1 at least | 7.07:1 | 7.12:1 | 7.07:1 | |
nc | sunken | 4.5:1 at least | 6.33:1 | 7.85:1 | 6.33:1 | |
c | bg | 4.5:1 at least | 7.57:1 | 8.88:1 | 7.90:1 | |
c | surface | 4.5:1 at least | 7.90:1 | 8.30:1 | 7.90:1 | |
c | sunken | 4.5:1 at least | 7.06:1 | 9.15:1 | 7.06:1 | |
na | bg | 4.5:1 at least | 7.32:1 | 7.31:1 | 7.64:1 | |
nt | bg | 4.5:1 at least | 7.32:1 | 7.31:1 | 7.64:1 | |
attention | bg | 4.5:1 at least | 7.17:1 | 9.33:1 | 7.48:1 | |
attention | surface | 4.5:1 at least | 7.48:1 | 8.73:1 | 7.48:1 | |
attention | sunken | 4.5:1 at least | 6.69:1 | 9.62:1 | 6.69:1 | |
derogation | bg | 4.5:1 at least | 4.97:1 | 7.99:1 | 5.18:1 | |
derogation | surface | 4.5:1 at least | 5.18:1 | 7.47:1 | 5.18:1 | |
derogation | sunken | 4.5:1 at least | 4.64:1 | 8.24:1 | 4.64:1 | |
canvas-ink | canvas | 4.5:1 at least | 18.69:1 | 18.69:1 | 18.69:1 | a caption on the image viewing surface |
line-control | surface | 3:1 at least | 3.55:1 | 3.54:1 | 3.55:1 | the edge of a control, criterion 3.3 |
line-control | sunken | 3:1 at least | 3.17:1 | 3.90:1 | 3.17:1 | |
line-control | bg | 3:1 at least | 3.40:1 | 3.78:1 | 3.55:1 | |
line-strong | bg | 3:1 at least | 17.92:1 | 16.33:1 | 18.69:1 | |
focus | bg | 3:1 at least | 9.91:1 | 7.98:1 | 10.34:1 | the focus ring |
focus | surface | 3:1 at least | 10.34:1 | 7.46:1 | 10.34:1 | |
line | surface | under 3:1 | 1.46:1 | 1.28:1 | 2.08:1 | a separator is a separator: if it ever reached 3:1 a control could pass its edge check with the wrong line |
Ratios are truncated, never rounded: a stated ratio is never higher than the measured one. The build refuses to write the stylesheet when a pair drops below its floor, so a value here that failed would not have been built.