Semantic Colors

Purpose-driven tokens. Each one resolves via the current .brand-<name> scope (and, orthogonally, .dark). Components consume the semantic name — never the brand primitive — so multi-brand theming is a single-class toggle.

Source of truth: tokens/src/semantic/semantic.json plus per-brand overrides in tokens/src/brand/*.json.

Background · brand

bg.brand

Primary brand fill (buttons, headers)

--color-bg-brand
TpGROUP
TpEMIS
TpISENT
FambulTik
TpESTATE
TpLEARN

bg.brand-subtle

Light brand tint (cards, highlights)

--color-bg-brand-subtle
TpGROUP
TpEMIS
TpISENT
FambulTik
TpESTATE
TpLEARN

bg.brand-strong

Deep brand (hero, dark UI)

--color-bg-brand-strong
TpGROUP
TpEMIS
TpISENT
FambulTik
TpESTATE
TpLEARN

Background · accent + secondary

bg.accent

Accent fills (CTAs, badges)

--color-bg-accent
TpGROUP
TpEMIS
TpISENT
FambulTik
TpESTATE
TpLEARN

bg.accent-subtle

Light accent tint

--color-bg-accent-subtle
TpGROUP
TpEMIS
TpISENT
FambulTik
TpESTATE
TpLEARN

bg.secondary

Secondary actions

--color-bg-secondary
TpGROUP
TpEMIS
TpISENT
FambulTik
TpESTATE
TpLEARN

bg.secondary-subtle

Light secondary tint

--color-bg-secondary-subtle
TpGROUP
TpEMIS
TpISENT
FambulTik
TpESTATE
TpLEARN

Background · glass

bg.glass-dark

Glass fill on dark backgrounds (brand-neutral)

--color-bg-glass-dark

bg.glass-light

Glass fill on light backgrounds (brand-neutral)

--color-bg-glass-light

Text

text.primary

Body text

--color-text-primary

text.secondary

Muted/captions

--color-text-secondary

text.tertiary

Hint text (AA-safe)

--color-text-tertiary

text.brand

Brand-coloured text on light bg

--color-text-brand
TpGROUP
TpEMIS
TpISENT
FambulTik
TpESTATE
TpLEARN

text.accent

Accent-coloured text (TpEMIS only today)

--color-text-accent
TpGROUP
TpEMIS
TpISENT
FambulTik
TpESTATE
TpLEARN

text.on-brand

Text on brand-coloured bg

--color-text-on-brand

text.on-accent

Text on accent-coloured bg

--color-text-on-accent

text.on-glass

Text on glass surfaces (dark bg)

--color-text-on-glass

Surface

surface

Default page / card surface

--color-surface

surface-raised

Elevated surface (modal, dropdown)

--color-surface-raised

surface-secondary

Subdued surface

--color-surface-secondary

background

Page background

--color-background

Border

border

Default border

--color-border

border-subtle

Subtle dividers

--color-border-subtle

border-brand

Brand-tinted border

--color-border-brand
TpGROUP
TpEMIS
TpISENT
FambulTik
TpESTATE
TpLEARN

border-glass-dark

Glass border on dark (neutral)

--color-border-glass-dark

border-glass-light

Glass border on light (brand-tinted rgba)

--color-border-glass-light
TpGROUP
TpEMIS
TpISENT
FambulTik
TpESTATE
TpLEARN

Interactive

interactive.hover

Hover state for brand-fill buttons

--color-interactive-hover
TpGROUP
TpEMIS
TpISENT
FambulTik
TpESTATE
TpLEARN

interactive.pressed

Pressed state

--color-interactive-pressed
TpGROUP
TpEMIS
TpISENT
FambulTik
TpESTATE
TpLEARN

interactive.focus

Focus ring colour

--color-interactive-focus
TpGROUP
TpEMIS
TpISENT
FambulTik
TpESTATE
TpLEARN

interactive.disabled

Disabled state (brand-invariant)

--color-interactive-disabled

Shadows

Per-brand entries retint via rgba(primary, alpha) overrides.

shadow.glass

Card shadow on dark glass (neutral)

--shadow-glass

shadow.glass-light

Card shadow on light glass (brand-tinted)

--shadow-glass-light
TpGROUP
TpEMIS
TpISENT
FambulTik
TpESTATE
TpLEARN

shadow.brand-glow

Primary-CTA glow (brand-tinted rgba)

--shadow-brand-glow
TpGROUP
TpEMIS
TpISENT
FambulTik
TpESTATE
TpLEARN

Blurs

Brand-invariant. Applied via backdrop-filter: blur().

blur.glass-standard

--blur-glass-standard

Default glass blur (16px)

blur

blur.glass-subtle

--blur-glass-subtle

Small-surface blur (8px)

blur

blur.glass-heavy

--blur-glass-heavy

Hero-overlay blur (24px)

blur

State colors

Brand-invariant. Same values across all brands.

success
Success / confirmed
--color-state-success
warning
Warning / caution
--color-state-warning
error
Error / destructive
--color-state-error
info
Informational
--color-state-info

Usage rule

Always consume tokens (var(--color-accent), bg-accent), never primitive ramp entries (var(--color-navy-900)). The former re-themes automatically when the brand class flips; the latter freezes a component to TpGROUP's navy.