Measured, and honest about the rest
Every colour pairing the system declares is measured on every build with the WCAG 2.x formula, and a failing pair fails the build. That proves the declared pairs clear their bars. It doesn't prove a product is accessible.
146pairings measured on every build
0failing
66family token pairings, both environments
80theme slot pairings, five themes
What the gate checks
Contrast
- Text pairs at 4.5:1, non-text at 3:1. 40 text · 22 non-text · 4 decorative · 0 seam among the family pairings.
- Decorative pairs (a card against its page) are measured and reported, never used as the only signal.
- Each product theme's slots are measured on the family grounds in both environments.
In a real browser
- Every Storybook story renders in Chromium with axe in error mode; a violation fails CI.
- Keyboard walkthroughs as play functions: Tab, Space and Enter, asserting state, names and focus.
- Every catalog page is checked with axe in both environments at desktop and phone widths, and fails CI on a violation.
- Focus rings follow the ground: ink on paper, pale in the dark. Controls are 44px tall by token. Reduced motion collapses durations.
What no gate covers
- A screen-reader pass, 200% zoom at 320px, and
forced-colors, where the depth stacks vanish and borders must carry the shape. Per release, by a person. - Colours a product uses outside the contract. Lorekeeper's and Forge's own site palettes are measured in their own repositories, not here.
- Terminals on a light background: the grammar can't detect one, so accent contrast there isn't guaranteed.
NO_COLOR=1is the escape. - Whether any of it reads well. That's a judgement, not a number.
Every theme pairing, measured
Wonder Wagon UI16 pairings · 0 failing
| Env | Rule | Colour | On | Ratio | Bar |
|---|---|---|---|---|---|
| day | accent-ink is legible on a filled accent | accent-ink #F7F0DF | accent #285A1C | 7.19 | 4.5 |
| day | link is body-legal on the page | link #285A1C | ground #FBF3DE | 7.39 | 4.5 |
| day | link is body-legal on a side panel | link #285A1C | ground-side #F9EFD6 | 7.14 | 4.5 |
| day | link is body-legal on a card | link #285A1C | surface #FFFBF0 | 7.90 | 4.5 |
| day | enamel reads as an object boundary against the page | enamel #285A1C | ground #FBF3DE | 7.39 | 3.0 |
| day | enamel reads as an object boundary against the stage | enamel #285A1C | ground-stage #F5DCA6 | 6.10 | 3.0 |
| day | ink is legible on the low accent tint | ink #2A160D | accent-low #DCE8C4 | 13.44 | 4.5 |
| day | the signal's edge clears the non-text bar against the page | signal-edge #553316 | ground #FBF3DE | 10.14 | 3.0 |
| night | accent-ink is legible on a filled accent | accent-ink #F7F0DF | accent #347A32 | 4.65 | 4.5 |
| night | link is body-legal on the page | link #8CBF63 | ground #17191C | 8.18 | 4.5 |
| night | link is body-legal on a side panel | link #8CBF63 | ground-side #1F2226 | 7.41 | 4.5 |
| night | link is body-legal on a card | link #8CBF63 | surface #1F2226 | 7.41 | 4.5 |
| night | enamel reads as an object boundary against the page | enamel #347A32 | ground #17191C | 3.33 | 3.0 |
| night | enamel reads as an object boundary against the stage | enamel #347A32 | ground-stage #17191C | 3.33 | 3.0 |
| night | ink is legible on the low accent tint | ink #F7F0DF | accent-low #1E3A16 | 11.06 | 4.5 |
| night | a bare signal clears the non-text bar against the page | signal #E2B26A | ground #17191C | 9.07 | 3.0 |
Pathfinder16 pairings · 0 failing
| Env | Rule | Colour | On | Ratio | Bar |
|---|---|---|---|---|---|
| day | accent-ink is legible on a filled accent | accent-ink #F7F0DF | accent #B34A13 | 4.73 | 4.5 |
| day | link is body-legal on the page | link #9E3F0F | ground #FBF3DE | 5.98 | 4.5 |
| day | link is body-legal on a side panel | link #9E3F0F | ground-side #F9EFD6 | 5.78 | 4.5 |
| day | link is body-legal on a card | link #9E3F0F | surface #FFFBF0 | 6.40 | 4.5 |
| day | enamel reads as an object boundary against the page | enamel #12496B | ground #FBF3DE | 8.66 | 3.0 |
| day | enamel reads as an object boundary against the stage | enamel #12496B | ground-stage #F5DCA6 | 7.15 | 3.0 |
| day | ink is legible on the low accent tint | ink #2A160D | accent-low #FBDCC9 | 13.27 | 4.5 |
| day | the signal's edge clears the non-text bar against the page | signal-edge #553316 | ground #FBF3DE | 10.14 | 3.0 |
| night | accent-ink is legible on a filled accent | accent-ink #F7F0DF | accent #B34A13 | 4.73 | 4.5 |
| night | link is body-legal on the page | link #F0A97E | ground #17191C | 8.96 | 4.5 |
| night | link is body-legal on a side panel | link #F0A97E | ground-side #1F2226 | 8.12 | 4.5 |
| night | link is body-legal on a card | link #F0A97E | surface #1F2226 | 8.12 | 4.5 |
| night | enamel reads as an object boundary against the page | enamel #1C73A8 | ground #17191C | 3.41 | 3.0 |
| night | enamel reads as an object boundary against the stage | enamel #1C73A8 | ground-stage #17191C | 3.41 | 3.0 |
| night | ink is legible on the low accent tint | ink #F7F0DF | accent-low #3A1607 | 14.24 | 4.5 |
| night | a bare signal clears the non-text bar against the page | signal #E0611F | ground #17191C | 4.95 | 3.0 |
Lorekeeper16 pairings · 0 failing
| Env | Rule | Colour | On | Ratio | Bar |
|---|---|---|---|---|---|
| day | accent-ink is legible on a filled accent | accent-ink #FAF7F1 | accent #343A8C | 9.22 | 4.5 |
| day | link is body-legal on the page | link #343A8C | ground #FBF3DE | 8.91 | 4.5 |
| day | link is body-legal on a side panel | link #343A8C | ground-side #F9EFD6 | 8.61 | 4.5 |
| day | link is body-legal on a card | link #343A8C | surface #FFFBF0 | 9.54 | 4.5 |
| day | enamel reads as an object boundary against the page | enamel #343A8C | ground #FBF3DE | 8.91 | 3.0 |
| day | enamel reads as an object boundary against the stage | enamel #343A8C | ground-stage #F5DCA6 | 7.36 | 3.0 |
| day | ink is legible on the low accent tint | ink #2A160D | accent-low #E1E3F5 | 13.54 | 4.5 |
| day | a bare signal clears the non-text bar against the page | signal #8A6212 | ground #FBF3DE | 4.95 | 3.0 |
| night | accent-ink is legible on a filled accent | accent-ink #141521 | accent #99A2F0 | 7.58 | 4.5 |
| night | link is body-legal on the page | link #99A2F0 | ground #17191C | 7.36 | 4.5 |
| night | link is body-legal on a side panel | link #99A2F0 | ground-side #1F2226 | 6.68 | 4.5 |
| night | link is body-legal on a card | link #99A2F0 | surface #1F2226 | 6.68 | 4.5 |
| night | enamel reads as an object boundary against the page | enamel #5D64C3 | ground #17191C | 3.42 | 3.0 |
| night | enamel reads as an object boundary against the stage | enamel #5D64C3 | ground-stage #17191C | 3.42 | 3.0 |
| night | ink is legible on the low accent tint | ink #F7F0DF | accent-low #1E2140 | 13.72 | 4.5 |
| night | a bare signal clears the non-text bar against the page | signal #E2B45C | ground #17191C | 9.16 | 3.0 |
Forge16 pairings · 0 failing
| Env | Rule | Colour | On | Ratio | Bar |
|---|---|---|---|---|---|
| day | accent-ink is legible on a filled accent | accent-ink #F7F0DF | accent #B03A26 | 5.31 | 4.5 |
| day | link is body-legal on the page | link #B03A26 | ground #FBF3DE | 5.45 | 4.5 |
| day | link is body-legal on a side panel | link #B03A26 | ground-side #F9EFD6 | 5.27 | 4.5 |
| day | link is body-legal on a card | link #B03A26 | surface #FFFBF0 | 5.84 | 4.5 |
| day | enamel reads as an object boundary against the page | enamel #B03A26 | ground #FBF3DE | 5.45 | 3.0 |
| day | enamel reads as an object boundary against the stage | enamel #B03A26 | ground-stage #F5DCA6 | 4.50 | 3.0 |
| day | ink is legible on the low accent tint | ink #2A160D | accent-low #F6D9D3 | 12.95 | 4.5 |
| day | a bare signal clears the non-text bar against the page | signal #85601A | ground #FBF3DE | 5.15 | 3.0 |
| night | accent-ink is legible on a filled accent | accent-ink #F7F0DF | accent #C2402A | 4.55 | 4.5 |
| night | link is body-legal on the page | link #E0B166 | ground #17191C | 8.93 | 4.5 |
| night | link is body-legal on a side panel | link #E0B166 | ground-side #1F2226 | 8.10 | 4.5 |
| night | link is body-legal on a card | link #E0B166 | surface #1F2226 | 8.10 | 4.5 |
| night | enamel reads as an object boundary against the page | enamel #C2402A | ground #17191C | 3.41 | 3.0 |
| night | enamel reads as an object boundary against the stage | enamel #C2402A | ground-stage #17191C | 3.41 | 3.0 |
| night | ink is legible on the low accent tint | ink #F7F0DF | accent-low #3A1410 | 14.36 | 4.5 |
| night | a bare signal clears the non-text bar against the page | signal #C8973F | ground #17191C | 6.67 | 3.0 |
Family tokens66 pairings · 0 failing
| Env | Colour | On | Kind | Ratio | Bar |
|---|---|---|---|---|---|
| day | surface #FFFBF0 | ground #FBF3DE | decorative | 1.07 | measured |
| day | ink #2A160D | ground #FBF3DE | text | 15.57 | 4.5 |
| day | ink #2A160D | ground-side #F9EFD6 | text | 15.05 | 4.5 |
| day | ink #2A160D | surface #FFFBF0 | text | 16.66 | 4.5 |
| day | ink #2A160D | surface-2 #F6EDD2 | text | 14.74 | 4.5 |
| day | ink #2A160D | ground-code #F1E3BF | text | 13.52 | 4.5 |
| day | ink #2A160D | well #FFFAEB | text | 16.51 | 4.5 |
| day | ink-muted #6E5740 | ground #FBF3DE | text | 6.12 | 4.5 |
| day | ink-muted #6E5740 | ground-side #F9EFD6 | text | 5.92 | 4.5 |
| day | ink-muted #6E5740 | surface #FFFBF0 | text | 6.55 | 4.5 |
| day | ink-muted #6E5740 | surface-2 #F6EDD2 | text | 5.79 | 4.5 |
| day | hairline #D9C79C | surface #FFFBF0 | decorative | 1.61 | measured |
| day | hairline-strong #8C7454 | surface #FFFBF0 | non-text | 4.28 | 3.0 |
| day | hairline-strong #8C7454 | ground #FBF3DE | non-text | 4.00 | 3.0 |
| day | metal #A96E2D | ground #FBF3DE | non-text | 3.83 | 3.0 |
| day | metal #A96E2D | ground-stage #F5DCA6 | non-text | 3.16 | 3.0 |
| day | focus #2A160D | ground #FBF3DE | non-text | 15.57 | 3.0 |
| day | focus #2A160D | surface #FFFBF0 | non-text | 16.66 | 3.0 |
| day | focus #2A160D | surface-2 #F6EDD2 | non-text | 14.74 | 3.0 |
| day | focus #2A160D | ground-side #F9EFD6 | non-text | 15.05 | 3.0 |
| day | status-ok #1F6F43 | surface #FFFBF0 | text | 5.95 | 4.5 |
| day | status-ok #1F6F43 | ground #FBF3DE | text | 5.56 | 4.5 |
| day | status-warn #7A5A0E | surface #FFFBF0 | text | 6.16 | 4.5 |
| day | status-warn #7A5A0E | ground #FBF3DE | text | 5.76 | 4.5 |
| day | status-no #A62B1E | surface #FFFBF0 | text | 6.80 | 4.5 |
| day | status-no #A62B1E | ground #FBF3DE | text | 6.36 | 4.5 |
| day | accent #285A1C | ground #FBF3DE | non-text | 7.39 | 3.0 |
| day | accent #285A1C | surface #FFFBF0 | non-text | 7.90 | 3.0 |
| day | accent-ink #F7F0DF | accent #285A1C | text | 7.19 | 4.5 |
| day | link #285A1C | ground #FBF3DE | text | 7.39 | 4.5 |
| day | link #285A1C | ground-side #F9EFD6 | text | 7.14 | 4.5 |
| day | link #285A1C | surface #FFFBF0 | text | 7.90 | 4.5 |
| day | signal-edge #553316 | ground #FBF3DE | non-text | 10.14 | 3.0 |
| night | surface #1F2226 | ground #17191C | decorative | 1.10 | measured |
| night | ink #F7F0DF | ground #17191C | text | 15.50 | 4.5 |
| night | ink #F7F0DF | ground-side #1F2226 | text | 14.06 | 4.5 |
| night | ink #F7F0DF | surface #1F2226 | text | 14.06 | 4.5 |
| night | ink #F7F0DF | surface-2 #23272C | text | 13.22 | 4.5 |
| night | ink #F7F0DF | ground-code #23272C | text | 13.22 | 4.5 |
| night | ink #F7F0DF | well #23272C | text | 13.22 | 4.5 |
| night | ink-muted #CDC2AA | ground #17191C | text | 9.98 | 4.5 |
| night | ink-muted #CDC2AA | ground-side #1F2226 | text | 9.04 | 4.5 |
| night | ink-muted #CDC2AA | surface #1F2226 | text | 9.04 | 4.5 |
| night | ink-muted #CDC2AA | surface-2 #23272C | text | 8.51 | 4.5 |
| night | hairline #33383F | surface #1F2226 | decorative | 1.35 | measured |
| night | hairline-strong #8A7E68 | surface #1F2226 | non-text | 4.00 | 3.0 |
| night | hairline-strong #8A7E68 | ground #17191C | non-text | 4.42 | 3.0 |
| night | metal #A96E2D | ground #17191C | non-text | 4.16 | 3.0 |
| night | metal #A96E2D | ground-stage #17191C | non-text | 4.16 | 3.0 |
| night | focus #FFF2A8 | ground #17191C | non-text | 15.53 | 3.0 |
| night | focus #FFF2A8 | surface #1F2226 | non-text | 14.08 | 3.0 |
| night | focus #FFF2A8 | surface-2 #23272C | non-text | 13.25 | 3.0 |
| night | focus #FFF2A8 | ground-side #1F2226 | non-text | 14.08 | 3.0 |
| night | status-ok #6FD39B | surface #1F2226 | text | 8.72 | 4.5 |
| night | status-ok #6FD39B | ground #17191C | text | 9.62 | 4.5 |
| night | status-warn #E2B26A | surface #1F2226 | text | 8.22 | 4.5 |
| night | status-warn #E2B26A | ground #17191C | text | 9.07 | 4.5 |
| night | status-no #F09085 | surface #1F2226 | text | 6.87 | 4.5 |
| night | status-no #F09085 | ground #17191C | text | 7.58 | 4.5 |
| night | accent #347A32 | ground #17191C | non-text | 3.33 | 3.0 |
| night | accent #347A32 | surface #1F2226 | non-text | 3.02 | 3.0 |
| night | accent-ink #F7F0DF | accent #347A32 | text | 4.65 | 4.5 |
| night | link #8CBF63 | ground #17191C | text | 8.18 | 4.5 |
| night | link #8CBF63 | ground-side #1F2226 | text | 7.41 | 4.5 |
| night | link #8CBF63 | surface #1F2226 | text | 7.41 | 4.5 |
| night | signal #E2B26A | ground #17191C | non-text | 9.07 | 3.0 |