# letbe-ds — measured contrast (generated by scripts/audit-contrast.js)

Every meaningful token pairing in the shipped theme, measured per WCAG 2.x
(4.5:1 normal text, 3:1 non-text UI). Disabled pairs are listed and marked
exempt (WCAG 1.4.3 exception); advisory rows have no normative requirement
but are tracked so drift stays visible. Regenerate after any token change.

## Light theme

| status | pair | purpose | ratio | min |
|---|---|---|---|---|
| ✓ | `fg-default` on `bg-default` | body text | 17.31 | 4.5 |
| ✓ | `fg-default` on `surface-bg-default` | body text on card | 17.31 | 4.5 |
| ✓ | `fg-default` on `surface-bg-elevated` | body text on elevated surface | 15.82 | 4.5 |
| ✓ | `fg-default` on `bg-strong` | text on tinted fill (code chip) | 15.82 | 4.5 |
| ✓ | `fg-muted` on `bg-default` | muted text | 5.49 | 4.5 |
| ✓ | `fg-muted` on `surface-bg-default` | muted text on card | 5.49 | 4.5 |
| ✓ | `fg-muted` on `surface-bg-elevated` | muted text on elevated surface | 5.02 | 4.5 |
| ✓ | `fg-subtle` on `bg-default` | subtle text (captions, counts) | 9.18 | 4.5 |
| ✓ | `fg-inverse` on `bg-inverse` | inverse text on inverse surface | 17.31 | 4.5 |
| ✓ | `fg-default` on `surface-bg-elevated` | neutral toast text + action chip on its pill | 15.82 | 4.5 |
| ✓ | `fg-accent` on `bg-default` | links / accent text | 7.06 | 4.5 |
| ✓ | `fg-accent` on `bg-accent-subtle` | accent text on faint wash | 7.03 | 4.5 |
| ✓ | `fg-accent` on `bg-accent-muted` | selected-state text (chips, nav) | 5.54 | 4.5 |
| ✓ | `fg-accent-muted` on `bg-default` | muted accent text | 7.06 | 4.5 |
| ✓ | `fg-danger` on `bg-default` | danger text | 6.11 | 4.5 |
| ✓ | `fg-danger` on `bg-danger-subtle` | danger text on danger tint | 6.07 | 4.5 |
| ✓ | `fg-success` on `bg-default` | success text | 4.92 | 4.5 |
| ✓ | `fg-success` on `bg-success-subtle` | success text on success tint | 4.95 | 4.5 |
| ✓ | `fg-warning` on `bg-default` | warning text | 8.98 | 4.5 |
| ✓ | `fg-warning` on `bg-warning-subtle` | warning text on warning tint | 8.85 | 4.5 |
| ✓ | `fg-info` on `bg-default` | info text | 6.66 | 4.5 |
| ✓ | `fg-info` on `bg-info-subtle` | info text on info tint | 6.63 | 4.5 |
| ✓ | `fg-inverse-strong` on `bg-danger` | text on solid danger fill | 6.11 | 4.5 |
| ✓ | `action-fg-primary-default` on `action-bg-primary-default` | primary button | 7.06 | 4.5 |
| ✓ | `action-fg-primary-hover` on `action-bg-primary-hover` | primary button hover | 11.06 | 4.5 |
| ✓ | `action-fg-primary-pressed` on `action-bg-primary-pressed` | primary button pressed | 15.24 | 4.5 |
| ✓ | `action-fg-secondary-default` on `action-bg-secondary-default` | secondary button | 17.31 | 4.5 |
| ✓ | `action-fg-secondary-hover` on `action-bg-secondary-hover` | secondary button hover | 15.82 | 4.5 |
| ✓ | `action-fg-secondary-pressed` on `action-bg-secondary-pressed` | secondary button pressed | 13.78 | 4.5 |
| ✓ | `action-fg-ghost-default` on `action-bg-ghost-default` | ghost button | 17.31 | 4.5 |
| ✓ | `action-fg-ghost-hover` on `action-bg-ghost-hover` | ghost button hover | 15.82 | 4.5 |
| ✓ | `action-fg-ghost-pressed` on `action-bg-ghost-pressed` | ghost button pressed | 13.78 | 4.5 |
| ✓ | `action-fg-danger-default` on `action-bg-danger-default` | danger button | 6.11 | 4.5 |
| ✓ | `action-fg-danger-hover` on `action-bg-danger-hover` | danger button hover | 9.91 | 4.5 |
| ✓ | `action-fg-danger-pressed` on `action-bg-danger-pressed` | danger button pressed | 14.47 | 4.5 |
| ✓ | `action-fg-link-default` on `bg-default` | link action | 7.06 | 4.5 |
| ✓ | `action-fg-link-hover` on `bg-default` | link action hover | 7.06 | 4.5 |
| ✓ | `action-fg-selected` on `action-bg-selected` | selected action (chip, segment) | 5.54 | 4.5 |
| ✓ | `field-fg-default` on `field-bg-default` | field input text | 17.31 | 4.5 |
| ✓ | `field-fg-default` on `field-bg-hover` | field input text on hover | 15.82 | 4.5 |
| ✓ | `field-fg-placeholder` on `field-bg-default` | placeholder text | 9.18 | 4.5 |
| ✓ | `field-fg-label` on `bg-default` | field label | 17.31 | 4.5 |
| ✓ | `field-fg-hint` on `bg-default` | field hint | 5.49 | 4.5 |
| ✓ | `field-fg-error` on `bg-default` | field error text | 6.11 | 4.5 |
| ✓ | `border-focus` on `bg-default` | focus ring on page | 3.99 | 3 |
| ✓ | `border-focus` on `surface-bg-default` | focus ring on card | 3.99 | 3 |
| ✓ | `field-border-focus` on `bg-default` | field focus border | 3.99 | 3 |
| ✓ | `field-border-default` on `bg-default` | field boundary | 3.37 | 3 |
| ✓ | `field-border-error` on `bg-default` | field error border | 3.72 | 3 |
| ✓ | `action-border-secondary-default` on `bg-default` | secondary button outline | 3.37 | 3 |
| adv ✓ | `action-bg-primary-default` on `bg-default` | primary fill vs page (labeled control — shape only) | 7.06 | 3 |
| ✓ | `bg-accent-value` on `border-muted` | value fill vs slider track | 5.62 | 3 |
| ✓ | `bg-accent-value` on `bg-bolder` | value fill vs progress track | 5.62 | 3 |
| ✓ | `bg-success-value` on `bg-bolder` | success progress fill vs track | 3.92 | 3 |
| ✓ | `bg-warning-value` on `bg-bolder` | warning progress fill vs track | 3.57 | 3 |
| ✓ | `bg-danger-value` on `bg-bolder` | danger progress fill vs track | 4.86 | 3 |
| ✓ | `fg-inverse-strong` on `bg-danger` | now-pill text on danger fill | 6.11 | 4.5 |
| adv ✓ | `bg-accent` on `bg-default` | accent fill vs page | 7.06 | 3 |
| exempt | `action-fg-primary-disabled` on `action-bg-primary-disabled` | disabled primary button | 1.37 | 4.5 |
| exempt | `field-fg-disabled` on `field-bg-disabled` | disabled field | 5.02 | 4.5 |
| exempt | `fg-disabled` on `bg-default` | disabled text | 5.49 | 4.5 |
| adv ✗ | `border-default` on `bg-default` | decorative separators | 1.5 | 3 |
| adv ✓ | `data-1` on `surface-bg-default` | chart series 1 vs card | 4.23 | 3 |
| adv ✓ | `data-2` on `surface-bg-default` | chart series 2 vs card | 3.99 | 3 |

## Dark theme

| status | pair | purpose | ratio | min |
|---|---|---|---|---|
| ✓ | `fg-default` on `bg-default` | body text | 17.09 | 4.5 |
| ✓ | `fg-default` on `surface-bg-default` | body text on card | 17.09 | 4.5 |
| ✓ | `fg-default` on `surface-bg-elevated` | body text on elevated surface | 15.82 | 4.5 |
| ✓ | `fg-default` on `bg-strong` | text on tinted fill (code chip) | 15.82 | 4.5 |
| ✓ | `fg-muted` on `bg-default` | muted text | 8.81 | 4.5 |
| ✓ | `fg-muted` on `surface-bg-default` | muted text on card | 8.81 | 4.5 |
| ✓ | `fg-muted` on `surface-bg-elevated` | muted text on elevated surface | 8.15 | 4.5 |
| ✓ | `fg-subtle` on `bg-default` | subtle text (captions, counts) | 8.81 | 4.5 |
| ✓ | `fg-inverse` on `bg-inverse` | inverse text on inverse surface | 17.31 | 4.5 |
| ✓ | `fg-default` on `surface-bg-elevated` | neutral toast text + action chip on its pill | 15.82 | 4.5 |
| ✓ | `fg-accent` on `bg-default` | links / accent text | 8.48 | 4.5 |
| ✓ | `fg-accent` on `bg-accent-subtle` | accent text on faint wash | 8.5 | 4.5 |
| ✓ | `fg-accent` on `bg-accent-muted` | selected-state text (chips, nav) | 6.91 | 4.5 |
| ✓ | `fg-accent-muted` on `bg-default` | muted accent text | 12.14 | 4.5 |
| ✓ | `fg-danger` on `bg-default` | danger text | 8.24 | 4.5 |
| ✓ | `fg-danger` on `bg-danger-subtle` | danger text on danger tint | 8.27 | 4.5 |
| ✓ | `fg-success` on `bg-default` | success text | 9.35 | 4.5 |
| ✓ | `fg-success` on `bg-success-subtle` | success text on success tint | 9.35 | 4.5 |
| ✓ | `fg-warning` on `bg-default` | warning text | 12.59 | 4.5 |
| ✓ | `fg-warning` on `bg-warning-subtle` | warning text on warning tint | 12.41 | 4.5 |
| ✓ | `fg-info` on `bg-default` | info text | 8.77 | 4.5 |
| ✓ | `fg-info` on `bg-info-subtle` | info text on info tint | 8.78 | 4.5 |
| ✓ | `fg-inverse-strong` on `bg-danger` | text on solid danger fill | 6.11 | 4.5 |
| ✓ | `action-fg-primary-default` on `action-bg-primary-default` | primary button | 7.06 | 4.5 |
| ✓ | `action-fg-primary-hover` on `action-bg-primary-hover` | primary button hover | 11.06 | 4.5 |
| ✓ | `action-fg-primary-pressed` on `action-bg-primary-pressed` | primary button pressed | 15.24 | 4.5 |
| ✓ | `action-fg-secondary-default` on `action-bg-secondary-default` | secondary button | 17.09 | 4.5 |
| ✓ | `action-fg-secondary-hover` on `action-bg-secondary-hover` | secondary button hover | 15.82 | 4.5 |
| ✓ | `action-fg-secondary-pressed` on `action-bg-secondary-pressed` | secondary button pressed | 12.83 | 4.5 |
| ✓ | `action-fg-ghost-default` on `action-bg-ghost-default` | ghost button | 17.09 | 4.5 |
| ✓ | `action-fg-ghost-hover` on `action-bg-ghost-hover` | ghost button hover | 15.82 | 4.5 |
| ✓ | `action-fg-ghost-pressed` on `action-bg-ghost-pressed` | ghost button pressed | 12.83 | 4.5 |
| ✓ | `action-fg-danger-default` on `action-bg-danger-default` | danger button | 6.11 | 4.5 |
| ✓ | `action-fg-danger-hover` on `action-bg-danger-hover` | danger button hover | 9.91 | 4.5 |
| ✓ | `action-fg-danger-pressed` on `action-bg-danger-pressed` | danger button pressed | 14.47 | 4.5 |
| ✓ | `action-fg-link-default` on `bg-default` | link action | 8.48 | 4.5 |
| ✓ | `action-fg-link-hover` on `bg-default` | link action hover | 12.14 | 4.5 |
| ✓ | `action-fg-selected` on `action-bg-selected` | selected action (chip, segment) | 6.91 | 4.5 |
| ✓ | `field-fg-default` on `field-bg-default` | field input text | 17.09 | 4.5 |
| ✓ | `field-fg-default` on `field-bg-hover` | field input text on hover | 15.82 | 4.5 |
| ✓ | `field-fg-placeholder` on `field-bg-default` | placeholder text | 8.81 | 4.5 |
| ✓ | `field-fg-label` on `bg-default` | field label | 17.09 | 4.5 |
| ✓ | `field-fg-hint` on `bg-default` | field hint | 8.81 | 4.5 |
| ✓ | `field-fg-error` on `bg-default` | field error text | 8.24 | 4.5 |
| ✓ | `border-focus` on `bg-default` | focus ring on page | 8.77 | 3 |
| ✓ | `border-focus` on `surface-bg-default` | focus ring on card | 8.77 | 3 |
| ✓ | `field-border-focus` on `bg-default` | field focus border | 8.77 | 3 |
| ✓ | `field-border-default` on `bg-default` | field boundary | 3.41 | 3 |
| ✓ | `field-border-error` on `bg-default` | field error border | 5.03 | 3 |
| ✓ | `action-border-secondary-default` on `bg-default` | secondary button outline | 3.41 | 3 |
| adv ✗ | `action-bg-primary-default` on `bg-default` | primary fill vs page (labeled control — shape only) | 2.65 | 3 |
| ✓ | `bg-accent-value` on `border-muted` | value fill vs slider track | 6.36 | 3 |
| ✓ | `bg-accent-value` on `bg-bolder` | value fill vs progress track | 6.36 | 3 |
| ✓ | `bg-success-value` on `bg-bolder` | success progress fill vs track | 7.02 | 3 |
| ✓ | `bg-warning-value` on `bg-bolder` | warning progress fill vs track | 9.45 | 3 |
| ✓ | `bg-danger-value` on `bg-bolder` | danger progress fill vs track | 6.18 | 3 |
| ✓ | `fg-inverse-strong` on `bg-danger` | now-pill text on danger fill | 6.11 | 4.5 |
| adv ✗ | `bg-accent` on `bg-default` | accent fill vs page | 2.65 | 3 |
| exempt | `action-fg-primary-disabled` on `action-bg-primary-disabled` | disabled primary button | 1.53 | 4.5 |
| exempt | `field-fg-disabled` on `field-bg-disabled` | disabled field | 6.61 | 4.5 |
| exempt | `fg-disabled` on `bg-default` | disabled text | 8.81 | 4.5 |
| adv ✗ | `border-default` on `bg-default` | decorative separators | 1.33 | 3 |
| adv ✓ | `data-1` on `surface-bg-default` | chart series 1 vs card | 8.48 | 3 |
| adv ✓ | `data-2` on `surface-bg-default` | chart series 2 vs card | 8.77 | 3 |
