Accessibility: WCAG 2.2 Level AA: all brand surfaces
Every Crash Override brand surface targets WCAG 2.2 Level AA (SC 1.4.3 Contrast Minimum for normal and large text; SC 1.4.11 Non-Text Contrast for interactive and graphical elements; SC 1.4.4 Resize Text; SC 2.4.7 Focus Visible). AA is the floor, not an aspirational goal. Every semantic role pair in every published theme variant must clear it before merging.
CI enforcement: contrast is checked by
scripts/check-contrast.mjs against the role pairs declared in
scripts/contrast-pairs.json on every pull request. A failing
pair blocks merge. AA-aware token values such as
--color-fandango-700 (#5A2173) are asserted facts
baked into the token source, not advisory comments.
| Role pair | Foreground token | Background token | Resolved fg | Resolved bg | Ratio | AA |
|---|---|---|---|---|---|---|
| Primary text on surface | --text-primary |
--surface-primary |
#FCFCFB | #0B1221 | 18.22:1 | pass |
| Secondary text on surface | --text-secondary |
--surface-primary |
hsl(225,25%,80%) | #0B1221 | 10.92:1 | pass |
| Tertiary text on surface | --text-tertiary |
--surface-primary |
hsl(225,25%,58%) | #0B1221 | 5.23:1 | pass |
| Emphasis text (Atomic lime) | --text-emphasis (#B3FF00) |
--surface-primary |
#B3FF00 | #0B1221 | 15.34:1 | pass |
| Primary button text on Atomic lime | #0B0F19 | --btn-primary-bg (#B3FF00) |
#0B0F19 | #B3FF00 | 15.70:1 | pass |
| Error text on surface | --text-error (#F44747) |
--surface-primary |
#F44747 | #0B1221 | 5.20:1 | pass |
| Role pair | Foreground token | Background token | Resolved fg | Resolved bg | Ratio | AA |
|---|---|---|---|---|---|---|
| Primary text on surface | --text-primary |
--surface-primary |
#1A1A1A | #FCFCFB | 16.95:1 | pass |
| Fandango text on light tint | --color-fandango-700 (#5A2173) |
--color-fandango-100 (#F1E7F7) |
#5A2173 | #F1E7F7 | 9.22:1 | pass |
| Jazzberry text on light tint | --color-jazzberry-700 (#B01E5A) |
--color-jazzberry-100 (#FFE3EE) |
#B01E5A | #FFE3EE | 5.50:1 | pass |
| Atomic lime on light surface: DO NOT use | #B3FF00 | --surface-primary |
#B3FF00 | #FCFCFB | 1.19:1 | fail |
Note: Atomic lime (#B3FF00) is illegible as a text or fill color on light
surfaces. The brand has no white: the light surface is Thunder tint-10 (#FCFCFB). Use --color-fandango-700 as the primary action token in
light mode. This is why the light-theme primary button uses Fandango, not lime.
Ratios computed by scripts/check-contrast.mjs logic against current tokens; CI re-verifies the governed pairs on every PR.
Fandango is a light-ground text colour. Jazzberry is a dark-ground text colour. Neither is text on the wrong ground. On the wrong ground each is a non-text colour only: fills, bars, borders, chart marks, and decoration. The brand values are not lightened or darkened to pass; usage is restricted per ground instead (brand-owner decision, resolves brand-visual#5).
| Colour | On Black #0B1221 | On light surface #FCFCFB | On Thunder #E6E2DC | Use as text |
|---|---|---|---|---|
| Fandango #523AA4 | 2.23:1 | 8.18:1 | 6.51:1 | light grounds only |
| Jazzberry #FF2F8E | 5.39:1 | 3.38:1 | 2.69:1 | dark grounds only |
| Atomic lime #B3FF00 | 15.34:1 | 1.19:1 | 1.06:1 | dark grounds only |
Text on brand fills: the white role (#FCFCFB) on a Fandango fill is 8.18:1; Black on a Jazzberry fill is 5.39:1. Do not put the white role on Jazzberry (3.38:1) or Black on Fandango (2.23:1).
Non-text on the wrong ground: Jazzberry on the light surface clears the 3:1 non-text minimum (SC 1.4.11) at 3.38:1, so it can carry an icon or a component boundary there. Fandango on Black (2.23:1) and Jazzberry on Thunder (2.69:1) do not: use them as fills or decoration, never as the only cue that identifies a control.
In the tokens: the capability label roles already follow the rule. On dark,
--text-label-cobalt (Monitor) and --text-label-teal are
neutral text (--text-secondary); the capability colour moves to the
card bar or border. On light they are Fandango-family. --text-label-magenta
and --text-label-accent are Jazzberry on dark. CI asserts every label
role and both brand colours on their own ground
(scripts/contrast-pairs.json). Ratios from npm run report:contrast.
fandango-700jazzberry-700magenta-700 aliasneon-400
These token values encode a passing contrast ratio. The comment
/* AA text on light tints */ in tokens/colors.css is a
declaration that the value itself was chosen to guarantee the ratio, not a
suggestion to check it manually. CI (check-contrast.mjs) asserts this
claim on every PR.
All interactive elements must have a visible focus indicator at 3:1 contrast against
adjacent colors (SC 2.4.11 Focus Appearance, targeting AA). The design system uses
Atomic lime (#B3FF00) as the focus ring color on dark surfaces and
Fandango-700 (#5A2173) on light surfaces. Do not suppress
:focus-visible outlines without providing a custom replacement that
meets the ratio.
Always: Use semantic role tokens (--text-primary,
--text-secondary, --surface-primary) rather than raw
palette values when styling text and surfaces. The semantic layer is designed to pass
AA in every supported theme variant; raw palette values may not.
Never: Place Atomic lime text or filled elements on light surfaces
(Thunder and its tints, including the light surface #FCFCFB). The
contrast is insufficient for any WCAG level. Swap to --color-fandango-700 for light-mode actions.
Deck and marketing artifacts: Apply the same role-pair rules. Use
--text-primary on --surface-primary (Black) for body
copy on dark slides; use Fandango-700 on fandango-100 tint blocks for callouts on
light slides. Provide alt text on all non-decorative images; see the skill
reference references/accessibility.md for alt-text guidance.