Crackle Design System

The living reference for the orchestrator UI — the brand mark, the tokens that drive every screen, and the components built from them.

Primary #c93a2b Type Inter · JetBrains Mono Surfaces Light dashboard · Dark landing

Foundations

Brand & logo

The Crackle mark is an open “C” arc with a terracotta spark flying off its opening — the crackle. White stroke, round caps, always on a dark tile so the stroke reads. Hover any mark to fire the crackle.

The mark, at every scale

Lockup

Crackle

Rules

✓ dark tile behind the mark ✓ terracotta spark = #c93a2b only ✗ never recolor the arc stroke ✗ never place the white mark on light

Foundations

Color

Click any swatch to copy its --var. The dashboard runs on the warm neutral + terracotta ramps; the landing/marketing surface runs on the dark brand set.

Neutrals — warm greys

Text, borders, surfaces. Body copy is --n-800, secondary --n-500, hairlines --n-100.

Primary — Crackle terracotta

--p-500 #c93a2b is the brand. Tints (--p-50) for active/selected states; shades (--p-700) for hover.

Semantic

Data-viz series

Ordered categorical series for charts. Series 1 is the brand terracotta so single-series charts stay on-brand.

Dark brand — landing surface

Includes the trading up/down/warn signals used on the landing hero (--t-up / --t-down / --t-warn).

Foundations

Themes — light & dark

Use the toggle in the sidebar to flip this whole guide. The dashboard ships light-only today; the landing surface is fully dual-themed (.lp[data-theme]) with dark as the canonical default — “Charcoal Trading.” Both palettes below are the real --lp-* values from landing.css.

default Dark — Charcoal data-theme="dark"
Programmatic · live
One campaign, every channel
Fan a single brief across the network.
Start a campaign ▲ CPI 2.1%▼ CPM 0.8%
bg-base#0a0a0a
bg-elevated#14161a
bg-surface#1a1d22
border#2a2d33
text-primary#eeebe7
text-secondary#9b958d
accent#c93a2b
up · down · warn3ab06a·e0594c·d4a73a
Light — Cream data-theme="light"
Programmatic · live
One campaign, every channel
Fan a single brief across the network.
Start a campaign ▲ CPI 2.1%▼ CPM 0.8%
bg-base#f9f7f5
bg-elevated#ffffff
bg-surface#f4f1ed
border#e6dfd6
text-primary#14161a
text-secondary#4f4b45
accent#c93a2b
up · down · warn1d8a4a·b94530·a07820

Accent (#c93a2b) is theme-invariant. The trading greens/reds darken in light mode for contrast on cream — the only semantic colors that shift between themes.

Foundations

Typography

Inter for everything UI; JetBrains Mono for numbers, IDs, and code. Numerics are always tabular-nums so columns align.

H1 / 32 / 600Fan one campaign across every channel
H2 / 22 / 600Distribution & delivery
H3 / 12 / 600 · capsSection label
Lede / 15 / 400A calm, readable intro line that sets up the screen without shouting.
Body / 14 / 400The default reading size for tables, forms, and descriptions across the app.
Small / 12 / 400Help text, captions, and secondary metadata.
Mono / 13 · tabular₹1,284,900.00 · CTR 3.42% · id_9F2A71

Foundations

Elevation, radii & spacing

Four soft, warm-tinted shadow steps. Cards sit at --sh-1; popovers/toasts at --sh-3; modals at --sh-4.

Shadows

--sh-1
--sh-2
--sh-3
--sh-4

Radii

xs·2
sm·4
md·6
lg·8
xl·12
full

Spacing scale

4-based scale — 4 · 8 · 12 · 16 · 20 · 24 · 32 · 48 · 64. Component padding lands on 8/16/24; section padding on 48/64.

Foundations

Motion

Hover a card to run its easing. UI transitions use --ease-out at 120–200ms; expressive brand motion (landing, the logo) uses --ease-expo at 280–480ms.

--ease-out
cubic-bezier(.2,.8,.2,1) · UI default
--ease-expo
cubic-bezier(.22,1,.36,1) · brand
--ease-quart
cubic-bezier(.16,1,.3,1)
--ease-quint
cubic-bezier(.83,0,.17,1) · in-out

Durations — instant 120 · snap 180 · base 280 · slow 480 · ambient 720ms. Stagger — tight 30 · base 40 · loose 80ms.

Components

Buttons

Primary action is ink (near-black); the terracotta accent is reserved for the single hero action per view.

Components

Forms

Focus ring is the primary tint — border --p-500 + 3px --p-50 halo. Click a field to see it.

Shown to your team only.
Drives the bidding intent.

Components

Badges & chips

Status badges are mono, pill-shaped, tinted-on-tint. Filter chips carry a dismiss affordance.

● live ● pending ● failed ● draft ● syncing
Channel: App × Status: Live × Last 30 days ×

Components

Data & tables

Numbers are mono + tabular so they align. Deltas use semantic up/down.

Spend
₹1,284,900
▲ 12.4%
Installs
48,201
▲ 4.1%
CPI
₹26.66
▼ 3.0%
CTR
3.42%
▼ 0.2%
CampaignChannelStatusSpendInstalls
Summer install pushApplive₹642,10024,880
Retarget — cartAppsyncing₹318,40012,004
Brand lift Q3Apppending₹324,40011,317

Meta

Sources of truth

This guide is a mirror, not the definition. When a value here disagrees with code, code wins — fix this file in the same PR.

Dashboard tokens (light): docs/orchestrator/assets/mockups/tokens.css
Brand / landing tokens (dark) + motion: code/backend/resources/js/lib/brandTokens.tscode/backend/resources/css/landing.css
The logomark: code/backend/resources/js/components/icons/LogoCrackle.vue + code/backend/public/favicon.svg

Known drift (2026-07-01): the live Vue app does not yet consume these tokens globally — --p-*/--n-* are defined only inside resources/css/wizard.css (scoped to .wizard-root), Tailwind maps only fonts, and ~160 components hardcode hex. Wiring a global :root + Tailwind color scale so components draw from these tokens is the outstanding follow-up.

copied