# WILS v2.0 tokens · contrast report

Direction 1 Colour Field. Computed with the WCAG 2.1 relative-luminance formula (sRGB linearisation, threshold 0.04045) for every text/background pair the tokens allow. Light only. Requirement: every text pair at least 4.5:1 (AA, normal text). AAA = 7:1 or more.

**Result:       36 pairs checked, 0 below 4.5:1.** Lowest pair: trees-on on trees 5.02:1.

## Changes made to reach 4.5:1

- **None.** Every pairing on the Colour Field board already passes; all board hex values are used unchanged. The four hardscape fields (Mineral palette) also pass as given.

Constants: Ink `#121417`, Paper `#FFFFFF`, Delta Teal `#00666F`, plant groups Trees `#16803C`, Palms `#F2A20C`, Shrubs `#C93A17`, Groundcovers `#86C8F0`, Climbers `#B2176E`, hardscape groups Surfaces `#D6B07A` (Sandstone), Edges & walls `#5B6470` (Granite), Water & soil `#1D4E9E` (Cobalt), Furniture & light `#8C4A1F` (Corten), and their -on colours.

## Text pairs

| Text token | Background token | Text | Ground | Ratio | Level | Use |
|---|---|---|---|---:|---|---|
| `--wils-color-text` | `--wils-color-bg` | `#121417` | `#FFFFFF` | 18.45:1 | AAA | Body, tables, headlines |
| `--wils-color-text-muted` | `--wils-color-bg` | `#575B63` | `#FFFFFF` | 6.81:1 | AA | Captions, labels, placeholders |
| `--wils-color-link` | `--wils-color-bg` | `#00666F` | `#FFFFFF` | 6.71:1 | AA | Links, active tab, labels |
| `--wils-color-action-text` | `--wils-color-action-bg` | `#FFFFFF` | `#00666F` | 6.71:1 | AA | Home hero, buttons, reversed lock-up |
| `--wils-color-text` | `--wils-color-lead-tint` | `#121417` | `#E6F0F1` | 15.90:1 | AAA | Clear-space zone, tags, callouts |
| `--wils-color-text-muted` | `--wils-color-lead-tint` | `#575B63` | `#E6F0F1` | 5.87:1 | AA | Captions on teal tint |
| `--wils-color-link` | `--wils-color-lead-tint` | `#00666F` | `#E6F0F1` | 5.78:1 | AA | Clear-space H marks |
| `--wils-color-inverse-text` | `--wils-color-inverse-bg` | `#FFFFFF` | `#121417` | 18.45:1 | AAA | Source numbers, footer |
| `--wils-color-inverse-muted` | `--wils-color-inverse-bg` | `#A9ACB3` | `#121417` | 8.12:1 | AAA | Footer captions |
| `--wils-trees-on` | `--wils-trees` | `#FFFFFF` | `#16803C` | 5.02:1 | AA | Trees section field |
| `--wils-color-text` | `--wils-color-trees-tint` | `#121417` | `#E8F2EC` | 16.12:1 | AAA | Illustration ground, table banding |
| `--wils-color-text-muted` | `--wils-color-trees-tint` | `#575B63` | `#E8F2EC` | 5.95:1 | AA | Captions on tint |
| `--wils-palms-on` | `--wils-palms` | `#121417` | `#F2A20C` | 8.74:1 | AAA | Palms section field |
| `--wils-color-text` | `--wils-color-palms-tint` | `#121417` | `#FEF6E7` | 17.18:1 | AAA | Illustration ground, table banding |
| `--wils-color-text-muted` | `--wils-color-palms-tint` | `#575B63` | `#FEF6E7` | 6.34:1 | AA | Captions on tint |
| `--wils-shrubs-on` | `--wils-shrubs` | `#FFFFFF` | `#C93A17` | 5.12:1 | AA | Shrubs section field |
| `--wils-color-text` | `--wils-color-shrubs-tint` | `#121417` | `#FAEBE8` | 15.91:1 | AAA | Illustration ground, table banding |
| `--wils-color-text-muted` | `--wils-color-shrubs-tint` | `#575B63` | `#FAEBE8` | 5.88:1 | AA | Captions on tint |
| `--wils-groundcovers-on` | `--wils-groundcovers` | `#FFFFFF` | `#86C8F0` | 1.82:1 | Below AA (owner choice 2026-11-08) | Groundcovers section field |
| `--wils-color-text` | `--wils-color-groundcovers-tint` | `#121417` | `#F3FAFE` | 17.50:1 | AAA | Illustration ground, table banding |
| `--wils-color-text-muted` | `--wils-color-groundcovers-tint` | `#575B63` | `#F3FAFE` | 6.46:1 | AA | Captions on tint |
| `--wils-climbers-on` | `--wils-climbers` | `#FFFFFF` | `#B2176E` | 6.48:1 | AA | Climbers section field |
| `--wils-color-text` | `--wils-color-climbers-tint` | `#121417` | `#F7E8F0` | 15.60:1 | AAA | Illustration ground, table banding |
| `--wils-color-text-muted` | `--wils-color-climbers-tint` | `#575B63` | `#F7E8F0` | 5.76:1 | AA | Captions on tint |
| `--wils-surfaces-on` | `--wils-surfaces` | `#121417` | `#D6B07A` | 9.09:1 | AAA | Surfaces section field |
| `--wils-color-text` | `--wils-color-surfaces-tint` | `#121417` | `#FBF7F2` | 17.30:1 | AAA | Illustration ground, table banding |
| `--wils-color-text-muted` | `--wils-color-surfaces-tint` | `#575B63` | `#FBF7F2` | 6.39:1 | AA | Captions on tint |
| `--wils-edges-on` | `--wils-edges` | `#FFFFFF` | `#5B6470` | 6.00:1 | AA | Edges & walls section field |
| `--wils-color-text` | `--wils-color-edges-tint` | `#121417` | `#EFF0F1` | 16.17:1 | AAA | Illustration ground, table banding |
| `--wils-color-text-muted` | `--wils-color-edges-tint` | `#575B63` | `#EFF0F1` | 5.97:1 | AA | Captions on tint |
| `--wils-water-on` | `--wils-water` | `#FFFFFF` | `#1D4E9E` | 7.97:1 | AAA | Water & soil section field |
| `--wils-color-text` | `--wils-color-water-tint` | `#121417` | `#E8EDF5` | 15.70:1 | AAA | Illustration ground, table banding |
| `--wils-color-text-muted` | `--wils-color-water-tint` | `#575B63` | `#E8EDF5` | 5.80:1 | AA | Captions on tint |
| `--wils-furniture-on` | `--wils-furniture` | `#FFFFFF` | `#8C4A1F` | 6.74:1 | AA | Furniture & light section field |
| `--wils-color-text` | `--wils-color-furniture-tint` | `#121417` | `#F4EDE9` | 15.94:1 | AAA | Illustration ground, table banding |
| `--wils-color-text-muted` | `--wils-color-furniture-tint` | `#575B63` | `#F4EDE9` | 5.89:1 | AA | Captions on tint |

## Non-text contrast (information only, WCAG 1.4.11 asks 3:1)

| Element | Colour | Ground | Ratio |
|---|---|---|---:|
| focus/lead | `#00666F` | `#FFFFFF` | 6.71:1 |
| rule-strong | `#121417` | `#FFFFFF` | 18.45:1 |
| trees dot | `#16803C` | `#FFFFFF` | 5.02:1 |
| palms dot | `#F2A20C` | `#FFFFFF` | 2.11:1 |
| shrubs dot | `#C93A17` | `#FFFFFF` | 5.12:1 |
| groundcovers dot | `#86C8F0` | `#FFFFFF` | 1.82:1 |
| climbers dot | `#B2176E` | `#FFFFFF` | 6.48:1 |
| surfaces dot | `#D6B07A` | `#FFFFFF` | 2.03:1 |
| edges dot | `#5B6470` | `#FFFFFF` | 6.00:1 |
| water dot | `#1D4E9E` | `#FFFFFF` | 7.97:1 |
| furniture dot | `#8C4A1F` | `#FFFFFF` | 6.74:1 |

Group dots below 3:1 (Palms 2.11, Groundcovers 1.82 and Surfaces 2.03 on Paper) are acceptable only because a dot never carries meaning alone: it always sits next to the group name in text. Hairline rules (`--wils-color-rule`) are decorative separators and are exempt. Focus rings use `--wils-color-focus` and pass 3:1.

## Rules the ratios depend on

- Group colours are never text, on Paper, on Ink or on their own tints. On a group field use only `--wils-<group>-on`.
- Palms and Surfaces (Sandstone) are light fields: their text is Ink. Groundcovers carries Paper by owner choice (1.82:1). Edges & walls, Water & soil and Furniture & light carry Paper.
- Muted text is allowed on Paper, Ink-ground and every tint listed above, nowhere else (not on group fields).

## Method

Script: `contrast.py` (pair list and luminance maths) and `build.py` (parses tokens.css, resolves the tokens and fails if any hex in tokens.css differs from the checked pair). Kept in the session scratchpad, not in the brand folder. To recheck after editing tokens: run both with Python 3; the check exits non-zero on any pair below 4.5:1 or any CSS/report mismatch.
