Colors
The semantic color tokens that drive every UI surface in the ePassLive design system.
All 68 color tokens defined in packages/design-system/globals.css. Hex values are click-to-copy. The W/D badges show contrast against white (#FFFFFF) and dark (#1A2332) respectively. Re-run `pnpm --filter storefront docs:colors` after any token change.
Brand
ep-teal
ep-blue
ep-cyan
ep-amber
ep-indigo
ep-pink
Text
ep-text-heading
#F0F0F0
ep-text-body
#D1D5DB
ep-text-muted
#939393
ep-text-inverse
ep-text-teal
#009FCA
ep-text-link
#009FCA
Surfaces
ep-bg
#1A1A1A
ep-bg-secondary
#1E293B
ep-bg-tertiary
#0F172A
ep-bg-3
#2D3748
ep-bg-page-dark
ep-surface-card
#1E293B
ep-surface-elevated
#252525
ep-surface-navy
Borders
ep-border
#2D3748
ep-border-subtle
#1E293B
ep-border-strong
#3B4759
Semantic
ep-success
#22C55E
ep-warning
#FBBF24
ep-error
#EF4444
ep-info
#38BDF8
ep-semantic-error
#EF4444
ep-semantic-warning
#FBBF24
Semantic tints
ep-semantic-success-tint
#123527
ep-semantic-success-fg
#6EE7B7
ep-semantic-success-tint-border
#1D4E38
ep-semantic-warning-tint
#3A2A08
ep-semantic-warning-fg
#FCD34D
ep-semantic-warning-tint-border
#55400F
ep-semantic-error-tint
#3B1516
ep-semantic-error-fg
#FCA5A5
ep-semantic-error-tint-border
#571E1F
ep-semantic-info-tint
#122A4D
ep-semantic-info-fg
#93C5FD
ep-semantic-info-tint-border
#1E3A5F
Semantic backgrounds
ep-semantic-success-bg
ep-semantic-error-bg
ep-semantic-info-bg
Button primary
ep-btn-primary-bg
ep-btn-primary-hover
#008095
Neutral
ep-neutral-500
#9CA3AF
Chart palette
chart-merch
chart-ticket
chart-package
chart-pass
chart-free
Barcode
ep-barcode-fg
#FFFFFF
ep-barcode-bg
#0A0A0A
ep-barcode-quiet-zone
#0A0A0A
Overlay
ep-overlay-scrim-light
ep-overlay-trace
ep-overlay-faint
ep-overlay-soft
ep-overlay-medium
ep-overlay-scrim
ep-overlay-border-subtle
ep-overlay-border-medium
ep-overlay-text-strong
ep-overlay-text-muted
ep-overlay-text-subtle
ep-overlay-text-icon
QR
ep-qr-bg
Contrast Requirements
- W = contrast against white (#FFFFFF), D = contrast against dark (#1A2332)
- ● Green = AA (4.5:1+) / AAA (7.0:1+)
- ● Yellow = AA large text only (3.0:1+)
- ● Red = Does not meet minimum
Swatches with a ◉ marker are theme-stable — the same hex value in light and dark mode by design (brand colors, semantic backgrounds, dark surfaces). Split swatches show light (left) vs dark (right) variants.
For the light/dark pair inventory with per-token WCAG notes, see the Dark Mode foundation page.
Brand Accent Surfaces
Four brand hues — teal, indigo, amber, pink — are used decoratively on accent surfaces. Every accent must attach to a stable identity: a fixed action, a role, a column, or a menu item. Formalized in ADR-031.
The AA rule — decorative is not meaning-bearing
ADR-031 rule 2: decorative latitude stops where meaning begins.
- Meaning-bearing text: only text-ep-text-teal — the single accent-text token that passes WCAG AA.
- Other brand hues on text: aria-hidden decorative use only, or a solid bg-ep-surface-card chip with the info duplicated accessibly.
- Interactive CTAs use bg-ep-btn-primary (5.70:1 on white) — never raw bg-ep-teal (3.08:1).
Context 1 — BrandSurface
Tinted variant, for light backgrounds: bg-ep-{accent}/10 + a /50 border + accent foreground. Every opacity step must be registered via the alphaVariants() factory — an unregistered class compiles to nothing (ghost utility).
Solid variant, for surfaces over photos: bg-ep-surface-card + accent border + shadow. Bare 10–15% tints vanish over event photos (the §89.1 readability blocker) — the solid pill stays readable over any image.
Context 2 — BrandRibbon
4px — above the header
1px — top of the footer
aria-hidden, decorative bookend above the header / at the top of the footer.
Context 3 — AccentUnderline
Events
Support
Company
Newsletter
Stable identity attachments
| Identity | Accent |
|---|---|
| Header icon hovers | |
search | teal |
cart | indigo |
theme | amber |
user-chip | pink |
| Homepage help cards | |
phone | teal |
email | indigo |
hours | amber |
| Footer columns | |
events | teal |
support | indigo |
company | amber |
newsletter | pink |
| Sidebar menu items | |
menu item [n] | cycles per stable item position |
Each accent must map to a stable identity. Index-cycling is permitted only when the items themselves are stable identities (sidebar menu items).
Do not do this
['teal','indigo','amber','pink'][idx % 4]Arbitrary index-cycling over a dynamic collection — position is not an identity.
<CategoryCard accent={event.category} />Accent attached to non-existent data — ep_event has no category field.
<button className="bg-ep-teal">Subscribe</button>CTA button on raw bg-ep-teal — 3.08:1, fails WCAG AA.