RamosLabs DS

Foundations / Color

One color has a job. The rest stay out of its way.

RamosLabs runs on a single action accent. Indigo carries every deliberate action, and nothing else competes for it. When only one color can say "act here," people learn it in seconds and every screen stays calm. That is the whole system: one voice for action, a deep neutral ramp for everything else, and reserved signals for state. The action accent is #4f46e5. Violet appears as a decorative accent only, never for action.

01

The accent, up close

Eleven tested steps from light to dark. The interface lives at 600. Everything above tints, everything below deepens for hover and pressed states.

Indigo--color-indigo-*
50eef2ff
100e0e7ff
200c7d2fe
300a5b4fc
400818cf8
5006366f1
The accent6004f46e5
Hover7004338ca
8003730a3
900312e81
9501e1b4b
Neutral: the 90% of the interface
Slate--color-slate-* · text, surfaces, borders
50f8fafc
100f1f5f9
200e2e8f0
300cbd5e1
40094a3b8
50064748b
600475569
700334155
8001e293b
9000f172a
950020617
Reserved for state, never decoration
Emerald--color-emerald-* · success solid
Green--color-green-* · success surface & text
Amber--color-amber-* · warning
Red--color-red-* · error
Blue--color-blue-* · info
Violet--color-secondary · decorative support only
02

Always reach for a role, not a raw color

Those ramps are primitives: raw hues, named by number, never by meaning. Product code never touches them. It consumes a role, a token named for the job it does. Re-theme the whole product by re-pointing roles, not by hunting hex across a codebase.

--color-indigo-600
Primitive. A number, no job.
assign
--color-primary
Role. This is what you use.
03

Roles, shown in context

A role is a job with a color attached. Here is what each one does on a real surface. Roles are theme-agnostic: a future dark theme re-points these targets, it never renames the role.

Primary action
ContinueContinueContinue

Rest --color-primary, hover --color-primary-dark, focus ring at --color-focus. The one accent for submit, confirm, active nav.

Selected / accent zone
Selected row
Active filter

Recommended: --color-primary-surface tint with primary-colored text. Avoid: white text on the tint, it fails contrast on the pale surface.

Text scale, one neutral hue
Heading--text-heading · 17.85:1
Strong label--text-strong · 14.63:1
Secondary copy--text-secondary · 7.58:1
Body / muted--text-body · 4.76:1
Disabled--text-disabled · state only
Feedback, each a full triad
Saved
Strong solid for the icon so the white check clears 3:1, tinted surface behind, dark text on top.
--color-success-strong + -surface + -text
!
Heads up
Amber is bright, so it carries dark text, never white.
--color-warning + -surface + -text
×
Something failed
For a red button with white text, use --color-error-strong.
--color-error + -surface + -text
i
For your info
Kept distinct from indigo so context never reads as an action.
--color-info + -surface + -text
04

Contrast you can see

Contrast is a floor. WCAG 2.2 asks 4.5:1 for normal text, 3:1 for large text and UI edges (AA); 7:1 is AAA. Every pairing below is measured. Green passes, amber and raw red do not, which is exactly why the darker variants exist.

Aa
Primary on white
6.29AA
Aa
White on primary-dark
7.90AAA
Aa
Heading on white
17.85AAA
Aa
Body / muted on white
4.76AA
Aa
White on error-strong
4.83AA
Aa
White on error (red 500)
3.76Large only
Aa
Dark text on warning
8.31AAA
Aa
White on warning
2.15Fail
Aa
Disabled on white
1.48By design

Rule: pair every status color with an icon and a label, give every invalid field real text, and make focus a visible ring. Why: color is never the only channel (WCAG 2.2 SC 1.4.1), so meaning survives for color-blind and low-vision users. Color reinforces, it never carries meaning by itself.

Sources

WCAG 2.2 contrast floors SC 1.4.3 / 1.4.6 / 1.4.11 and use of color SC 1.4.1 (w3.org/TR/WCAG22). Role-token model after Material 3 color roles (m3.material.io) and Refactoring UI numbered scales. The primitive color ramps are Tailwind CSS's open-source (MIT) default palette (tailwindcss.com), adopted hex-for-hex as the raw material; the role concepts and numbered scales come from Material 3 and Refactoring UI. The 60-30-10 accent balance is a common color composition rule. Ratios computed with the WCAG 2.x relative-luminance formula, matching the Color Picker story.