Brand & Design System · v1.0 · dealercentives repo
Living document

A brand built for automotive incentive work.

Typography-first, premium, restrained. The brand gradient is the signal — used sparingly to mark the moments that matter. Surfaces stay quiet so data can speak.

Type
Inter · 5 weights
Color
OKLCH · 24 tokens
Components
53 shipped
Radii
8–40px scale
DealerCentives
★ Brand gradient · 135° · 3-stop Aa Inter · 650 display weight ◐ Light surfaces · dark sidebar ≡ Hairline borders · 6% contrast
01 · Foundations

Brand stance

The why before the what

DealerCentives is the offer manager built for the way modern dealers actually work. The brand reflects that: confident type does the talking, surfaces stay quiet so data can speak, and the gradient earns its keep by marking exactly one decisive moment per screen.

We sound like the smart shop manager down the road, not the marketing department. (See §11 for voice.)

03 · Foundations

Color system

All values in OKLCH · light surfaces, dark sidebar

All color is defined in OKLCH for perceptual uniformity, then echoed as CSS custom properties. Components never hardcode color — they reference tokens. The brand gradient is the only place we get loud.

3.1 The brand gradient

--gradient-brand
Sunrise · Coral · Magenta
0%
#FF9B3D
Sunrise
55%
#FF5A5F
Coral
100%
#F9387F
Pink
Do — primary CTAs, headline accents, sidebar active state
One decisive moment per view: the main CTA, a hero word, an active nav item.
Do — text-clip on a single word
.text-gradient-brand on one or two words. The rest of the headline stays in --foreground.
Don't — wash entire sections or repeat per card
Body text on the gradient fails contrast. Repeating the gradient cheapens it.
Don't — change the angle, swap stops, or recolor
135° is fixed. Sequence is always orange → coral → pink.

3.2 Brand anchors

--brand-orange
#FF9B3Doklch(.78 .16 56)
Warmth · highlights · chart 1
--brand-coral · --primary
#FF5A5Foklch(.7 .21 25)
Default solid CTA · primary actions
--brand-pink
#F9387Foklch(.65 .27 5)
Accent · ring tint · chart 3
--toggle-on
#3B82F6oklch(.62 .22 256)
Switch "on" — only blue (spec §16)

3.3 Surface system (light)

--background
#F7F8FA
Page canvas
--surface · --card
#FFFFFF
Cards · popovers · elevated surfaces
--surface-alt
#FBFBFC
Alternating rows · subtle zoning
--foreground
#111827
Primary text · headlines · icons

3.4 Light nav vs atmospheric sidebar

--surface
In-page navigation
--gradient-sidebar
Global app sidebar

3.5 Functional status

--status-healthy
Sync OK
--status-degraded
Slow feed
--status-down
Sync failed
--status-idle
Paused
04 · Foundations

Typography

Inter · 650 display · -0.02em tracking

Inter is the entire system — UI, body, headlines, numerics. We use a custom 650 weight (between SemiBold and Bold) for display so headlines feel confident without shouting. All headings track at -0.02em; numbers ship with tabular figures wherever they matter.

Aa
Family
Inter
Display weight
650
Tracking
-0.02em
OpenType features (always on)
cv02
a   Single-story a
cv03
g   Single-story g
cv04
l   Hooked tail l
cv11
0   Slashed zero
tnum
12,345.67 · Tabular figures

4.1 Type scale

display
Built for incentive work.
64 / 65 · 650 · -0.02em
h1
Manage every offer in one place
44 / 46 · 650 · -0.02em
h2
Real inventory, real offers
32 / 35 · 650 · -0.02em
h3
Offer reconciliation
20 / 26 · 650 · -0.01em
body-lg
Hero subhead and marketing leads. Quiet, generous line-height.
18 / 28 · 400
body
The default. Used for paragraphs, descriptions, table cells.
16 / 26 · 400
small
Form labels, table headers, badge text — workhorse of UI chrome.
14 / 20 · 500
caption
Helper text, timestamps, secondary metadata.
13 / 18 · 400
eyebrow
Section labels · uppercased
11 · 600 · UPPER

4.2 Marketing headline composition

The gradient text-clip earns one to two words per headline — never more.

Pattern A · Hero with gradient accent

A brand built for automotive incentive work.

Pattern B · Two-line emphasis

Every dealer offer.
One feed.

05 · Foundations

Spacing & radii

8px ladder · Tailwind 4px base

Pick the radius rung that matches the surface size. Use Tailwind's default 4px spacing scale — the dashboard does not customize it.

TokenValueUse
--radius-sm8pxChips, kbd, inline pills
--radius-md12pxButtons, inputs, switches
--radius-lg (default)16pxCards, dropdowns
--radius-xl20pxFeature cards, KPI cards
--radius-2xl24pxSection cards, pricing cards
--radius-3xl32pxHero containers
--radius-4xl40pxBrand moments — rare
06 · Foundations

Shadows & elevation

Layered · tight + diffuse

Shadows are layered (one tight, one diffuse) to feel material without weight. Don't invent new shadows. Don't stack --shadow-card and --shadow-primary on the same element.

--shadow-card
Default elevation
--shadow-primary
Primary button only
--shadow-modal
Dialogs · popovers · command palette
07 · Foundations

Motion

One easing · cubic-bezier(0.16, 1, 0.3, 1)

One easing curve for the whole system. A premium decel — fast in, slow settle. It feels expensive without being slow. Avoid spring physics, bounce, or anything that draws attention to the motion itself.

DurationUse
150msHover, focus, micro-interactions
250msDefault — modals, dropdowns, tab swaps
400msPage-level transitions
08 · Foundations

Iconography

Lucide · 1.5px stroke · currentColor

Library: Lucide (lucide-react). Already a dependency. Default size: 16px inline · 20px nav · 24px empty-state. Color inherits from text — never tint icons with the brand gradient.

09 · Build

Component library

53 primitives · shadcn/ui new-york · slate

Every component lives in src/components/ui/. They consume tokens from styles.css and never hardcode color, radius, or shadow. The seven custom additions extend the base — they don't replace it.

Button — variants
Switch · the only blue in the system
Off
On
Metric card
Active offers
1,284
+12.4%
Match rate
94.8%
+0.6 pp
Status dot
Healthy · last synced 2m ago
Degraded · feed slow
Down · sync failed
Idle · paused
Badges
Default Featured Live Pending Expired Draft
Alert · 3 intents
i
Sync scheduled for tonight
Next automatic build at 2:00 AM ET.
128 offers reconciled
!
Inventory feed unreachable
Full inventory · src/components/ui/
53 primitives + 2 app shells
accordion
alert
alert-dialog
aspect-ratio
avatar
badge
breadcrumb
button
calendar
card
carousel
chart
checkbox
choice-modal-row
collapsible
command
context-menu
dialog
drawer
dropdown-menu
empty-state
form
hover-card
input
input-otp
kbd
label
menubar
metric-card
navigation-menu
page-header
pagination
popover
progress
radio-group
resizable
scroll-area
segmented-control
select
separator
sheet
sidebar
skeleton
slider
sonner
status-dot
switch
table
tabs
textarea
toggle
toggle-group
tooltip
AppLayout
CommandPalette
= custom primitive (not in default shadcn).
10 · Build

Marketing patterns

Ten reusable blocks for dealercentives.com

Built from the same tokens as the dashboard so the marketing site and the product feel like one continuous experience. One brand-loud moment per page — either Hero B or a gradient CTA, never both.

Pattern · Hero A

Light hero with product preview

Use on: home · pricing
New · Live offer reconciliation

Every dealer offer.
Matched in seconds.

DealerCentives reconciles your manufacturer incentives against live inventory the moment a vehicle hits your lot — and pulls them off the moment it sells.

128
dealers live
94.8%
match rate
< 5s
sync time
Honda of Boston · Live
128 matched of 132 offers
Lease2026 Civic Sport
$249/mo
Lease2026 CR-V EX
$329/mo
Finance2026 Pilot Touring
2.9%
Cash2026 Accord EX-L
$1,500 off
Pattern · Hero B

Gradient takeover — launch / campaign

One per page max
Spring 2026

Built for the dealers who don't have time to babysit feeds.

An offer manager that updates itself. While you're at the auction, in the F&I office, or finally taking lunch.

Pattern · Metric strip

Numbers band

Use after hero, before features
Dealers live
128
across 12 OEMs
Inventory matched
94.8%
of all eligible offers
Time to first sync
< 5s
from feed receipt
Daily reconciliations
2,400+
across the network
Pattern · Feature grid

3-up feature cards

Gradient-tinted icon swatch

Live inventory matching

Pulls fresh inventory via MarketCheck on every sync — your offers always reflect what's on the lot today.

Automatic reconciliation

Compares matched offers against live data and updates idempotently. No stale specials when a unit sells.

Push to anywhere

Export to Google Sheets out of the box. Webhooks and a typed API for everything else.

Pattern · Testimonial

Dark quote block

Sidebar gradient · pink glow
"
We stopped reconciling our incentives spreadsheet by hand the day we turned this on. The first sync caught 41 mismatches we didn't know we had.
SR
Sara Reilly
GM, Boston Honda Group · 6 rooftops
Pattern · Pricing

3-tier cards

Featured uses gradient border, lifts 4px
Single rooftop
$249/mo
Built for independent stores running their own incentives.
  • 1 dealer rooftop
  • Hourly sync cadence
  • Google Sheets export
  • Email support
Group
$199/mo · per rooftop
For dealer groups of 3 or more. Most teams land here.
  • Unlimited rooftops
  • 15-minute sync cadence
  • Webhooks + API access
  • Custom disclaimer templates
  • Shared image library
Enterprise
Talk to us
For OEM-level deployments and groups over 25 rooftops.
  • Real-time sync
  • SSO + SCIM
  • Custom integrations
  • SLA + 24/7 support
Pattern · Big CTA

Closing call-to-action

Use immediately before footer

Stop babysitting your incentives feed.

Set up your first dealer in fifteen minutes. Cancel any time.

Pattern · Footer

Site footer

Always #050816
11 · Write

Voice & tone

The smart shop manager, not the marketing department

DealerCentives talks to dealers in the language they actually use. Direct, specific, no theater. The voice we ship in the product is the voice we use on the marketing site.

Direct

Lead with the verb and the outcome. If you can cut a clause, cut it.

Specific

Real numbers, real outcomes. "128 matched offers" beats "many."

Operator-savvy

Use industry terms (rooftop, F&I, VIN) without explaining them.

Quietly warm

Friendly, not chummy. No "delight," "magic," or exclamation marks.

11.1 This, not that

✗ Don't
Hero headline

Revolutionize your dealership with our cutting-edge incentive optimization platform!

Adjective stacking, undefined claim, exclamation. Dealers tune out.
✓ Do
Hero headline

Every dealer offer. Matched in seconds.

Two short clauses. The promise is the whole sentence.
✗ Don't
Empty state

Looks like there's nothing here yet! Get started by adding your first dealer 🚀

Apologetic, emoji'd, redundant.
✓ Do
Empty state

No dealers yet. Add a dealership to see its health here.

State the fact. State the next step. Period.

11.2 Word swaps

AvoidUseWhy
leverage / utilizeuseSame meaning, half the syllables.
solutions / platformtool / app / the thing it doesConcrete nouns name what we sell.
cutting-edge / next-gen— (delete)If true, you wouldn't need to say it.
customers (B2B)dealers / rooftopsUse the industry's word.
unleash / superchargeverbs the user actually does"Sync your dealer." "Match an offer."
!.Reserved for product errors. Even then, sparingly.

11.3 Casing & punctuation

ElementCasingPunctuation
Headlines (h1, h2, h3)Sentence casePeriod only if multiple sentences
Buttons & CTAsSentence caseNone. Optional trailing arrow "→"
Eyebrow labelsUPPERCASE · 0.12em trackingNone
Form labelsSentence caseNone (no trailing colon)
Confirm titlesSentence case + question markPeriod in description
Brand nameDealerCentives (one word, two caps)
12 · Use

Using these tokens in a new project

For dealercentives.com or any new surface

12.1 The fastest path: drop in tokens.css

The portable token sheet at docs/brand/tokens.css is a flat CSS file with every brand token. No build dependencies.

// app/layout.tsx (Next.js App Router)
import "@/styles/tokens.css" // copy from docs/brand/tokens.css
import "./globals.css"

After import, every CSS variable is available globally. Use them directly:

<button
  className="text-white px-5 py-3 rounded-xl font-semibold"
  style={{ background: "var(--gradient-brand)", boxShadow: "var(--shadow-primary)" }}
>
  Book a demo →
</button>

12.2 With Tailwind v4

Mirror the portal's @theme inline block from dc-dashboard-2026/src/styles.css so utilities like bg-primary, text-foreground, and rounded-2xl resolve to brand tokens. That file is the canonical example to copy.

12.3 With shadcn/ui

Initialize with these components.json settings to keep visual congruence:

{
  "style": "new-york",
  "tailwind": { "baseColor": "slate", "cssVariables": true, "prefix": "" },
  "iconLibrary": "lucide"
}

12.4 Lifting components from the dashboard

The 53 components in src/components/ui/ are MIT-licensed shadcn primitives + 7 custom additions. Safe to copy whole files into the new project. Check imports — only the seven custom files (metric-card, status-dot, page-header, empty-state, kbd, segmented-control, choice-modal-row) reference brand-specific patterns; everything else is stock shadcn restyled.

DealerCentives Brand & Design System v1.0
Source of truth: docs/brand/ in the dealercentives repo · Spec: BRAND_GUIDE.md · Tokens: tokens.css
Last synced 2026-05-14. When the brand changes, update tokens.css first, then propagate to consuming apps.