Accessibility: WCAG 2.2 Level AA: all brand surfaces

Conformance statement

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.


Core theme - dark (default)
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

Light theme ([data-theme="light"])
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.


Ground rule: Fandango and Jazzberry

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.


AA-aware tokens (asserted facts, not comments)
Aa
fandango-700
#5A2173
AA text on fandango-100
Aa
jazzberry-700
#B01E5A
AA text on jazzberry-100
Aa
magenta-700 alias
#B01E5A
AA text on magenta-100
Aa
neon-400
#B3FF00
AA on co-black (15.3:1)

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.


Focus visible

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.


Authoring guidance

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.