Nikola Innovation · Design system
One system.
Every surface.
The crisp white system: one white canvas, one orange spark, one condensed voice. Every token below is authored once in design-tokens.json and rendered everywhere, on the site and in the emails, so nothing can drift.
01 · Color
Ten tokens. One orange spark.
No shadows and no second accent. Structure comes from hairlines and space. The palette does three jobs: surfaces to build on, ink for weight, and a single orange that points. One black, no near-black.
02 · Type
Anton shouts. Montserrat speaks.
Three faces on a contrast axis, never two similar sans together: a condensed display face for headlines, a humanist sans for reading, and a monospace for data labels.
Families
Built for power. Built for comfort.
Display · Anton · --ni-font-display · apply class="ni-display" · weight 400 · uppercase · big headlines only
A smoother stroke that is easier on the knees, with a scientifically measured increase in power. Body copy stays Montserrat, capped near 70 characters per line.
Body · Montserrat · --ni-font-body · weights 400 / 500 / 600 / 700 · line-height 1.62
Now launching · Made in Ohio
Label · system monospace · --ni-font-mono · letter-spacing .16em · uppercase · kickers and data captions
Type scale
--ni-text-display · clamp(3rem, 8vw, 5.5rem) · hero headlines
--ni-text-h1 · clamp(2.6rem, 6vw, 4rem) · page titles
--ni-text-h2 · clamp(1.9rem, 3.8vw, 2.8rem) · section headlines
--ni-text-h3 · 1.15rem · card and sub-section titles
--ni-text-lede · 1.125rem · weight 500 · intro
--ni-text-body · 1rem · weight 400 · body
--ni-text-small · 0.8125rem · captions, meta
--ni-text-label · 0.75rem · mono, uppercase, orange
03 · Spacing
One scale. Consistent rhythm.
An 8-based px scale for component spacing (gaps, padding), plus two fluid tokens for section rhythm. Reach for a token, never a one-off number.
Fluid rhythm: --ni-space-section = clamp(56px, 8vw, 108px) for section top/bottom · --ni-space-gap = clamp(28px, 5vw, 60px) for split-layout gaps.
04 · Radius
Square enough to mean it.
Corners top out at 16px. Buttons, inputs and variant pills share one radius; cards and media go a touch softer; full pills are for small inline chips only.
Button / input / pill--ni-r-button · 8px
Card--ni-r-card · 14px
Media / band--ni-r-media · 16px
Full pill999px · tags, small CTAs
05 · Buttons and links
Quiet structure. One loud action.
One orange action carries the click. A dark pill for orange bands, a small pill for inline CTAs, a ghost only on dark or imagery, and a plain orange text link.
Primary: bg --ni-orange · text #fff · weight 700 · padding 14px 30px · radius --ni-r-button · hover --ni-orange-hover.
06 · Components
Built from the same parts.
Labels and kickers
The proof
Validated by · 2,000 riders · 3 universities
Orange kicker labels a section; the muted mono variant carries credibility and meta. Separator is a middot ( · ), never an em dash.
Stat band
Anton numerals in orange · semibold captions · hairline top and bottom rules · no card chrome. Collapses to 2-up under 680px.
Cards
Card title
1px hairline border, 14px radius, white fill. The default container for grouped content.
Card title
No drop shadows. Hairlines and whitespace carry the hierarchy.
Card title
Numbers use Anton; labels use monospace.
Bands
One dark band and one orange band per page maximum, for emphasis. Everything else is canvas or subtle.
Pull quote
An estimated 13 million U.S. cyclists experience patellofemoral pain. Every revolution is a chance for bad stroke geometry to load the wrong tissue.
Subtle fill · card radius · weight 600 · the key phrase lifts to orange. No side-stripe border.
Accordion
What makes the NI Flow different?
Patented Zivo Flow Motion with 25mm of lateral float, so your joints move naturally.
Where is it made?
Designed and patented in Rocky River, Ohio.
Hairline rows · plus and minus marker in orange · no default disclosure triangle.
Form field
Input: 1px --ni-input-border · radius --ni-r-input · padding 13px 14px · focus border orange.
07 · Imagery
Real. Never rendered.
White is the frame; photography is the emotion and the proof. Four modes, used as intentional moments and never as wallpaper. Every image is a real photograph. We never illustrate.
MotionYou feel it from the first mile.
Images render as <img>, never a CSS background. Product shots on a true-black panel. Photos behind text get a scrim plus text-shadow. Full frame set and provenance: docs/image-credits.md and the imagery moodboard.
08 · Voice and build rules
Plain. Proven. No apologies.
- Never use em dashes. Use commas, colons, or periods. Separators in labels use a middot ( · ). CI blocks them.
- Plain B2B voice. No jargon, no corporate speak. Lead with value (power and comfort, proven). We talk to shops and fitters, not just riders.
- Anton for big headlines only via class="ni-display". Smaller headings stay Montserrat 700.
- Monospace for data labels (kickers, stat captions, eyebrows): --ni-font-mono, uppercase, .16em tracking, orange.
- Render from var(--ni-*), never a hardcoded brand hex. A unit test fails any brand hex used as a CSS value in a section.
- Scope and prefix every section: wrap CSS under #shopify-section-[id] and prefix all class names. Generic names collide with Dawn base.css and break layout.
09 · Token reference
Every token, one source.
The complete surface. Change a value in design-tokens.json, run npm run build:tokens, and every surface updates.
| Token | Value | Use |
|---|---|---|
| --ni-canvas | #ffffff | Page background |
| --ni-band | #f6f6f4 | Alternate sections |
| --ni-hairline | #ececec | Borders and dividers |
| --ni-ink | #1a1a1a | Headings, dark bands |
| --ni-body | #4a4a4a | Paragraph copy |
| --ni-muted | #8a847a | Captions, meta |
| --ni-on-dark | #cfcabf | Body on dark bands |
| --ni-orange | #fa8b22 | The one accent |
| --ni-orange-hover | #ff9f3a | Button hover |
| --ni-input-border | #d9d4ca | Form fields |
| Token | Value | Use |
|---|---|---|
| --ni-font-display | Anton | Big headlines |
| --ni-font-body | Montserrat | Body copy |
| --ni-font-mono | ui-monospace | Data labels |
| --ni-label-tracking | 0.16em | Label letter-spacing |
| --ni-r-button | 8px | Buttons, inputs, pills |
| --ni-r-card | 14px | Cards |
| --ni-r-media | 16px | Media, bands |
| Token | Value | Use |
|---|---|---|
| --ni-text-display | clamp(3rem, 8vw, 5.5rem) | Hero headlines |
| --ni-text-h1 | clamp(2.6rem, 6vw, 4rem) | Page titles |
| --ni-text-h2 | clamp(1.9rem, 3.8vw, 2.8rem) | Section headlines |
| --ni-text-h3 | 1.15rem | Card titles |
| --ni-text-lede | 1.125rem | Intro copy |
| --ni-text-body | 1rem | Body |
| --ni-text-small | 0.8125rem | Captions |
| --ni-text-label | 0.75rem | Kickers, labels |
| Token | Value | Use |
|---|---|---|
| --ni-space-3xs to 4xl | 4 / 8 / 12 / 16 / 24 / 32 / 48 / 64 / 96 / 128px | Component spacing |
| --ni-space-section | clamp(56px, 8vw, 108px) | Section rhythm |
| --ni-space-gap | clamp(28px, 5vw, 60px) | Split-layout gaps |
| --ni-leading-tight to relaxed | 0.98 / 1.15 / 1.4 / 1.62 / 1.75 | Line height |
| --ni-weight-regular to bold | 400 / 500 / 600 / 700 | Font weight |