Nolab

Foundations

Color

Sober, timeless tones where content and photography lead. Reach for the semantic tokens in product code — the raw scales exist to define them, not to be used directly.

Core palette

Distribution: 80 / 10 / 7 / 3
Aa

Porcelain Light

var(--porcelain)

Neutral base — 80% of every surface
Aa

Charcoal

var(--charcoal)

Dark sections, primary CTAs — 10%
Aa

Graphite

var(--graphite)

Body text — 7%
Aa

Nolab Blue

var(--nolab-blue)

Functional accent only — 3%

Nolab Blue is reserved for active states, secondary navigation, microinteractions and emphasis. Never a section background, a button fill, or a large surface. Primary CTAs are Charcoal.

Semantic tokens

Use these in product code
Aa

surface-page

var(--surface-page)

Page background
Aa

surface-card

var(--surface-card)

Cards and raised panels
Aa

surface-sunken

var(--surface-sunken)

Inset wells
Aa

surface-paper

var(--surface-paper)

Warm editorial sections
Aa

surface-inverse

var(--surface-inverse)

Dark sections, footer
Aa

surface-inverse-deep

var(--surface-inverse-deep)

Deepest dark band
Aa

action-primary

var(--action-primary)

Primary CTA fill — Charcoal
Aa

action-disabled

var(--action-disabled)

Disabled button fill
Aa

border-subtle

var(--border-subtle)

Hairline dividers
Aa

border-default

var(--border-default)

Input and card borders
Aa

border-strong

var(--border-strong)

Primary button outline
Aa

focus-ring

var(--focus-ring)

Keyboard focus

Text on its surface

Contrast pairs
Belong.

var(--text-strong)

Headlines
Belong.

var(--text-body)

Body copy
Belong.

var(--text-muted)

Captions, metadata
Belong.

var(--text-link)

Links and accents
Belong.

var(--text-inverse)

Copy on dark sections
Belong.

var(--text-on-dark)

Copy over photography

Neutral scale

Aa

White

var(--neutral-0)

Card surface
Aa

Neutral 100

var(--neutral-100)

Porcelain Light / page
Aa

Neutral 150

var(--neutral-150)

Sunken surface, hairlines
Aa

Neutral 200

var(--neutral-200)

Warm paper, editorial bands
Aa

Neutral 250

var(--neutral-250)

Fine UI lines
Aa

Neutral 300

var(--neutral-300)

Default border
Aa

Neutral 400

var(--neutral-400)

Muted text
Aa

Neutral 500

var(--neutral-500)

Graphite — body text
Aa

Neutral 600

var(--neutral-600)

Deep surface
Aa

Neutral 700

var(--neutral-700)

Charcoal — inverse surface
Aa

Neutral 900

var(--neutral-900)

Deepest ink, headlines

Nolab Blue scale

Accent only
Aa

Blue 100

var(--blue-100)

Hover accent
Aa

Blue 500

var(--blue-500)

The accent: links, focus, active
Aa

Blue 700

var(--blue-700)

Pressed accent
Aa

Blue Tint

var(--blue-tint)

Faint wash for info callouts

Verticals

Fractional · Rentas
Aa

Terracotta 100

var(--terracotta-100)

Nolab Fractional — light
Aa

Terracotta 500

var(--terracotta-500)

Nolab Fractional — base
Aa

Terracotta 700

var(--terracotta-700)

Nolab Fractional — deep
Aa

Forest 100

var(--forest-100)

Nolab Rentas — light
Aa

Forest 500

var(--forest-500)

Nolab Rentas — base
Aa

Forest 700

var(--forest-700)

Nolab Rentas — deep

Status and data

Harmonized to the palette
Aa

Success

var(--success-600)

Confirmed, available
Aa

Success Soft

var(--success-100)

Success surface
Aa

Warning

var(--warning-600)

Pending, attention
Aa

Warning Soft

var(--warning-100)

Warning surface
Aa

Danger

var(--danger-600)

Error, withdrawn
Aa

Danger Soft

var(--danger-100)

Danger surface
Aa

Data Positive

var(--dataviz-positive)

Charts — gain
Aa

Data Negative

var(--dataviz-negative)

Charts — loss