Hacktron Design System

Colors

The color tokens used throughout the design system, grouped by category — text, surface, stroke, icon, and more. Toggle light/dark in the sidebar to see how each one adapts.

Text

Body/heading text colors.

Hacktron text-text-primary
Hacktron text-text-secondary
Hacktron text-text-tertiary
Hacktron text-text-disabled
Hacktron text-text-inverse

Text — semantic

Semantic (success/warning/error/informational) text colors.

Hacktron text-text-semantic-success
Hacktron text-text-semantic-warning
Hacktron text-text-semantic-error
Hacktron text-text-semantic-informational

Text — severity

Severity (low/medium/high/critical/informational/invalid) text colors.

Hacktron text-text-severity-low
Hacktron text-text-severity-medium
Hacktron text-text-severity-high
Hacktron text-text-severity-critical
Hacktron text-text-severity-informational
Hacktron text-text-severity-invalid

Surface

Backgrounds — page, card, popover, sidebar.

bg-surface-background
bg-surface-card
bg-surface-popover
bg-surface-sidebar
bg-surface-sidebar-hover
bg-surface-sidebar-selected
bg-surface-popover-accent
bg-surface-tooltip
bg-surface-overlay

Surface — semantic

Tinted background fills for feedback banners (success/warning/error/informational).

bg-surface-semantic-success
bg-surface-semantic-warning
bg-surface-semantic-error
bg-surface-semantic-informational

Surface — severity

Tinted background fills for severity-tagged rows (low/medium/high/critical/informational/invalid).

bg-surface-severity-low
bg-surface-severity-medium
bg-surface-severity-high
bg-surface-severity-critical
bg-surface-severity-informational
bg-surface-severity-invalid

Surface — input states (to be removed)

Legacy per-surface input background tokens (on-background/on-card/on-popover × default/hover/focused/filled/disabled). Superseded by the opacity wash below — no component in packages/foundation reads these anymore. Kept for reference pending cleanup.

bg-surface-input-on-background-default
bg-surface-input-on-background-hover
bg-surface-input-on-background-focused
bg-surface-input-on-background-filled
bg-surface-input-on-background-disabled
bg-surface-input-on-card-default
bg-surface-input-on-card-hover
bg-surface-input-on-card-focused
bg-surface-input-on-card-filled
bg-surface-input-on-card-disabled
bg-surface-input-on-popover-default
bg-surface-input-on-popover-hover
bg-surface-input-on-popover-focused
bg-surface-input-on-popover-filled
bg-surface-input-on-popover-disabled

Input, Checkbox, and Select on different surfaces (opacity wash)

A single fixed-opacity overlay tinted with the brand color, alpha-composited over whatever's behind the field — no per-surface token, no ambient CSS var lookup. Same declaration renders correctly in all three panels below.

--field-wash (light)
color-mix(in srgb, var(--color-brand-brand) 4%, transparent)
--field-wash-hover (light)
color-mix(in srgb, var(--color-brand-brand) 7%, transparent)
--field-wash (dark)
color-mix(in srgb, var(--color-brand-brand) 5%, transparent)
--field-wash-hover (dark)
color-mix(in srgb, var(--color-brand-brand) 10%, transparent)
On background

By clicking this checkbox, you agree to the terms and conditions.

On card

By clicking this checkbox, you agree to the terms and conditions.

On popover

By clicking this checkbox, you agree to the terms and conditions.

InputWash

default & filled → wash, hover & focus → wash-hover, disabled → transparent

TextareaWash

same state mapping as Input

CheckboxWash

both the plain box and the card variant

RadioGroupWash

no focus/filled tier — checked state uses a ring instead

Select (trigger)Wash

the dropdown panel itself stays solid bg-surface-popover — only the trigger washes

Combobox (trigger)Wash

same as Select; its internal popover search row is untouched (see below)

Switch (track)Wash

only the unchecked track — default & hover; checked track and disabled stay solid brand-brand/brand-300

Switch (thumb)Not wash

solid bg-surface-card/bg-surface-popover instead — sits on top of the track's own color (wash or brand-brand), not the ambient page/card surface, and needs to read as opaque regardless of what's under it

Tabs (list)Wash

the pill bar background — sits directly on the ambient surface

Tabs (indicator)Wash

the active-tab pill also washes, stacking on top of list's own wash so it still reads as a distinct, slightly stronger fill

Combobox search rowNot wash

still bg-surface-popover / hover:bg-surface-input-on-popover-hover — lives inside a teleported dropdown panel, out of scope for this pass

app.config.ts (switch theme)Not wash

frozen duplicate of the pre-wash Switch classes, still on the now-orphaned surface-input-on-background-* tokens, themes raw USwitch call sites in apps/frontend not yet migrated to <Switch>

Stroke

Borders and dividers.

border-stroke-primary
border-stroke-secondary
border-stroke-tertiary
border-stroke-strong

Stroke — semantic

Semantic (success/warning/error/informational) border colors.

border-stroke-semantic-success
border-stroke-semantic-warning
border-stroke-semantic-error
border-stroke-semantic-informational

Stroke — severity

Severity (low/medium/high/critical/informational/invalid) border colors.

border-stroke-severity-low
border-stroke-severity-medium
border-stroke-severity-high
border-stroke-severity-critical
border-stroke-severity-informational
border-stroke-severity-invalid

Icon

Icon fill colors — the same values as Text, since icons mirror text color 1:1.

text-icon-primary
text-icon-secondary
text-icon-tertiary
text-icon-disabled
text-icon-inverse

Icon — semantic

Semantic (success/warning/error/informational) icon colors.

text-icon-semantic-success
text-icon-semantic-warning
text-icon-semantic-error
text-icon-semantic-informational

Icon — severity

Severity (low/medium/high/critical/informational/invalid) icon colors.

text-icon-severity-low
text-icon-severity-medium
text-icon-severity-high
text-icon-severity-critical
text-icon-severity-informational
text-icon-severity-invalid

Support

Standalone status/severity accents (badges, dots) — not paired with a specific surface/text/stroke context.

bg-support-success
bg-support-warning
bg-support-error
bg-support-informational
bg-support-low
bg-support-medium
bg-support-high
bg-support-critical
bg-support-invalid

Button

Per-variant button background states. See the Button component page for how these compose.

bg-button-primary-default
bg-button-primary-hover
bg-button-primary-active
bg-button-secondary-default
bg-button-secondary-hover
bg-button-secondary-active
bg-button-outline-hover
bg-button-outline-active
bg-button-ghost-hover
bg-button-ghost-active
bg-button-destructive-default
bg-button-destructive-hover
bg-button-destructive-active
bg-button-hover-overlay-dark
bg-button-hover-overlay-light

Chart

Data visualization series + severity colors.

bg-chart-chart-1
bg-chart-chart-2
bg-chart-chart-3
bg-chart-chart-4
bg-chart-chart-5
bg-chart-chart-6
bg-chart-severity-critical
bg-chart-severity-high
bg-chart-severity-medium
bg-chart-severity-low

Customisation

User-selectable accent swatches (e.g. for tags, avatars) and their stroke variants.

bg-customisation-emerald
bg-customisation-amber
bg-customisation-teal
bg-customisation-cyan
bg-customisation-sky
bg-customisation-indigo
bg-customisation-violet
bg-customisation-purple
bg-customisation-fuchsia
bg-customisation-pink
bg-customisation-rose
bg-customisation-lime
bg-customisation-stroke-rose
bg-customisation-stroke-purple
bg-customisation-stroke-fuchsia
bg-customisation-stroke-pink
bg-customisation-stroke-amber
bg-customisation-stroke-lime
bg-customisation-stroke-emerald
bg-customisation-stroke-teal
bg-customisation-stroke-cyan
bg-customisation-stroke-sky
bg-customisation-stroke-indigo
bg-customisation-stroke-violet

Brand

The primary brand color (warm ink in light mode, warm paper in dark mode) and its numeric ramp, which inverts with theme — step 0 is darkest in light mode, lightest in dark mode.

bg-brand-0
bg-brand-100
bg-brand-200
bg-brand-300
bg-brand-400
bg-brand-500
bg-brand-600
bg-brand-700
bg-brand-800
bg-brand-900
bg-brand-brand
bg-brand-brand-inverse