Greenhouse Design System

Color

Greenhouse uses a minimalist neutral foundation for structure, with chlorophyll greens reserved for meaning — actions, focus, and emphasis. Accents are supporting tones used sparingly.


Token layers

Colors are organized into three layers so components stay stable as the theme evolves. Components should always consume semantic tokens, never raw hex values or scale steps directly.

1. Scales

Raw color ramps with no assigned meaning — for example --neutral-0 through --neutral-900. Light and dark mode swaps happen primarily at this layer.

2. Palette

Named tokens using Greenhouse language — surfaces, text, borders, actions, and accents. These map scale values to design intent.

3. Semantic tokens

UI-facing roles that components consume directly — like --color-surface, --color-text, --color-border, and --color-primary.


Usage rules

Neutrals first

Use neutrals for most UI structure — surfaces, typography, and borders.

Green for action

Use chlorophyll greens for primary actions, interactive emphasis, and focus indication.

Accents are intentional

Moss, soil, and leaf are supporting tones. Use them sparingly and never for interactive elements.

Accessibility

Primary text on surfaces is designed to meet WCAG AAA. Borders use a subtle/strong split — subtle for separators, strong for interactive control boundaries.


Scales

Raw color ramps that power light and dark mode. These have no assigned meaning — palette and semantic tokens reference them so components never need to touch scale values directly.

Neutral

The structural backbone. Surfaces, text, borders, and dividers all pull from this ramp.

0 — Surface
--neutral-0
50 — Elevated surface
--neutral-50
100 — Muted surface
--neutral-100
200 — Soft divider
--neutral-200
300 — Subtle border
--neutral-300
600 — Strong border
--neutral-600
800 — Secondary text
--neutral-800
900 — Primary ink
--neutral-900

Chlorophyll

The action ramp. Primary buttons, links, focus rings, and interactive emphasis.

50 — Subtle background
--green-50
200 — Success border
--green-200
600 — Primary action
--green-600
700 — Hover / active
--green-700

Soil Red

Error and destructive states.

50 — Alert background
--red-50
200 — Alert border
--red-200
600 — Primary error
--red-600
700 — Error hover
--red-700

Amber

Warning states and caution signals.

50 — Warning background
--amber-50
200 — Warning border
--amber-200
600 — Warning text / icon
--amber-600
700 — Warning hover
--amber-700

Slate Blue

Informational states and neutral callouts.

50 — Info background
--blue-50
200 — Info border
--blue-200
600 — Info text / icon
--blue-600
700 — Info hover
--blue-700

Palette

Greenhouse vocabulary tokens that map scale values to design intent. These sit between the raw ramps and the semantic layer — useful for understanding how the system is wired, but components should still prefer semantic tokens.

Surfaces

Primary surface
--surface-primary
Muted surface
--surface-muted

Text

Primary text
--text-primary
Secondary text
--text-secondary

Borders

Subtle
--border-subtle
Strong
--border-strong

Actions

Primary action
--action-primary
Hover
--action-hover
Subtle background
--action-subtle

Accents

Supporting tones used sparingly. Never for interactive elements.

Moss
--accent-moss
Soil
--accent-soil
Leaf
--accent-leaf

Semantic tokens

The tokens components should consume directly. These cascade automatically in dark mode — no component-level overrides needed.

Core

Surfaces, text, borders, and primary action — the essentials for any component.

Surface
--color-surface
Surface muted
--color-surface-muted
Text
--color-text
Text muted
--color-text-muted
Border
--color-border
Border strong
--color-border-strong
Primary
--color-primary
Primary hover
--color-primary-hover
Primary subtle
--color-primary-subtle

Selection & focus

Used by checkboxes, radios, toggle switches, and focus rings.

Selection fill
--color-selection
Selection contrast
--color-selection-contrast
Focus ring
--color-focus-ring

Accents

Semantic aliases for the accent palette. Use intentionally.

Moss
--color-accent-moss
Soil
--color-accent-soil
Leaf
--color-accent-leaf

Status

Semantic status colors grouped by meaning. Each status has a background, border, and foreground token — enough to build badges, alerts, and inline validation without reaching for raw scale values.

Success

Confirmations, completed actions, and positive states.

Background
--green-50
Border
--green-200
Text / icon
--green-600

Warning

Caution states and non-blocking alerts.

Background
--amber-50
Border
--amber-200
Text / icon
--amber-600

Error

Destructive actions, validation failures, and blocking states.

Background
--red-50
Border
--red-200
Text / icon
--red-600
Semantic error
--color-error
Semantic error strong
--color-error-strong

Info

Neutral informational callouts and contextual guidance.

Background
--blue-50
Border
--blue-200
Text / icon
--blue-600

Component tokens

Scoped tokens that individual components consume. These reference semantic tokens under the hood, so dark mode cascades automatically. Showing them here makes it easy to audit the full color contract each component depends on.

Button — Primary

Background
--button-primary-bg
Background hover
--button-primary-bg-hover
Text
--button-primary-text

Button — Secondary

Background
--button-secondary-bg
Background hover
--button-secondary-bg-hover
Text
--button-secondary-text
Border
--button-secondary-border

Button — Ghost

Background
--button-ghost-bg
Background hover
--button-ghost-bg-hover
Text
--button-ghost-text

Input

Background
--input-bg
Text
--input-text
Placeholder
--input-placeholder
Border
--input-border
Border hover
--input-border-hover
Focus ring
--input-focus-ring
Disabled background
--input-disabled-bg
Disabled text
--input-disabled-text
Error border
--input-error-border
Error ring
--input-error-ring

Dropdown

Trigger background
--dropdown-trigger-bg
Trigger text
--dropdown-trigger-text
Trigger border
--dropdown-trigger-border
Menu background
--dropdown-menu-bg
Menu border
--dropdown-menu-border
Menu shadow
--dropdown-menu-shadow
Item hover
--dropdown-item-bg-hover
Item text
--dropdown-item-text
Item text muted
--dropdown-item-text-muted
Selected icon
--dropdown-selected-icon

Badge

Neutral background
--badge-neutral-bg
Neutral text
--badge-neutral-text
Neutral border
--badge-neutral-border
Success background
--badge-success-bg
Success text
--badge-success-text
Success border
--badge-success-border
Warning background
--badge-warning-bg
Warning text
--badge-warning-text
Warning border
--badge-warning-border
Error background
--badge-error-bg
Error text
--badge-error-text
Error border
--badge-error-border
Info background
--badge-info-bg
Info text
--badge-info-text
Info border
--badge-info-border

Alert

Success background
--alert-success-bg
Success border
--alert-success-border
Success icon
--alert-success-icon
Warning background
--alert-warning-bg
Warning border
--alert-warning-border
Warning icon
--alert-warning-icon
Error background
--alert-error-bg
Error border
--alert-error-border
Error icon
--alert-error-icon
Info background
--alert-info-bg
Info border
--alert-info-border
Info icon
--alert-info-icon

Link

Text
--link-text
Text hover
--link-text-hover
Underline
--link-underline
Subtle text
--link-subtle-text
Subtle text hover
--link-subtle-text-hover
Focus ring
--link-focus-ring