Design System · T-minus zero

Imagine a rocket launch. The countdown hits zero, a shower of sparks ignites the boosters, and the enormous potential locked in the fuel releases all at once, hurtling a spacecraft into space at over 25,000 miles per hour. At Ignite, we harness that same explosive power to launch retailers into the future.

The system that launches retail into orbit.

One design language for every screen in the Ignite portal, from the loyalty dashboard a store owner reads at 6am to the Mission Control canvas where they build the next campaign. Bold where it inspires, calm where the work happens.

Kallisto + Eurostile Purple · Orange · Yellow Light & dark Built for react-admin
01 — Brand

The spark and the wordmark

Ignite means to start up with tremendous energy. Our mark is a four-point spark caught mid-ignition: purple structure, orange fuel, a yellow core. The gradient lockup is preferred. Use solid, black, or white only when the gradient can't reproduce.

Logo lockups
Spark mark, whiteSPARK · reversed
Ignite stacked logoSTACKED · preferred
Ignite horizontal logoHORIZONTAL
Ignite logo on whiteON LIGHT
The governing principle — loud shell, calm core
The tension

Our portal carries dense work: fuel pricing, accounting ledgers, BI reports, campaign builders. A loud space theme over a data grid makes it unusable. A plain grid with no brand wastes who we are.

So we split the difference on purpose.

The rule
  • Loud shell. Brand energy lives in login, marketing, page headers, empty states, and the Mission Control canvas.
  • Calm core. Tables, ledgers, forms, and reports stay high-contrast and neutral, with one orange accent for the primary action.
  • Starlight and gradients never sit behind data.
Misuse

✕ Don't

  • Stretch or recolor the spark
  • Put Starlight behind a table
  • Set body copy in all-caps Kallisto

✕ Don't

  • Use three brand colors in one button
  • Add drop shadows to the flat mark
  • Rotate the spark off its axis

✓ Do

  • Give the mark clear space equal to its core
  • Lead with purple, accent with orange
  • Save yellow for a single highlight
02 — Color

Fuel, structure, and a spark of yellow

Purple is the structure and the brand. Orange is energy and action. Yellow is the highlight you use once. Click any swatch to copy its hex.

Primary
Secondary
Status — mission readouts

We name status the way a launch team does: GO (healthy), HOLD (needs attention), SCRUB (failed or blocked), INFO (neutral).

03 — Gradients

Three gradients, from dawn to deep space

Straight from the brand palette. Use them on hero surfaces, the login, and the spark — never behind text you need to read at a glance. Click to copy the CSS.

04 — Typography

Kallisto up front, Eurostile in reserve

Kallisto is our voice: tech-savvy, bold, a little fun. It sets headlines and carries body copy in its lighter weights. Eurostile is the sanctioned stand-in when Kallisto can't load. A monospace layer handles labels and data.

Families
Display · Kallisto Bold
Prepare for liftoff

Headlines, stat numerals, buttons

Body · Kallisto Medium/Light
Configure pricing across every store, then let the mission fly.

Paragraphs, UI copy

Mono · System
GO · T-00:04 · 25,412 pts

Labels, tokens, data

Scale
05 — Spacing & Radii

A 4px grid and soft corners

Everything sits on a 4px base. Radii stay gentle so the portal feels modern without going pill-shaped everywhere.

Spacing scale
Corner radii
06 — Elevation

Shadow for depth, glow for ignition

Surfaces lift with soft, space-tinted shadows. The one exception is the primary action, which carries an orange ignition glow instead of a drop shadow.

07 — Motion

Quick, eased, and never in the way

Interface motion is fast and confident. Ambient motion (Starlight, Launch Trails) is slow and quiet, and it stops entirely under reduced-motion. Hover a card to see the easing.

Durations
120ms
fast · taps, toggles
220ms
base · most transitions
420ms
slow · panels, overlays
08 — Signature · Starlight

Starlight

Layered stars drift behind the dark interface while warm ignition embers rise slowly through them, echoing the sparks that light the boosters. It sets a quiet sense of exploration behind the work, and it always stays behind the content.

LIVE · DARK MODE ONLY
Quiet exploration, behind the work
Orbital drift

Three layers rotate slowly at 180s, 300s, and 420s per revolution, twinkling at 3s, 5s, and 7s. Ambient movement, no task meaning.

Rising embers

Warm ignition embers rise through the stars, the sparks that light the boosters. That is the part that is ours.

Restraint

Runs page-wide in dark mode, always in the background. Off in light mode and reduced-motion, paused when the tab is hidden. The opaque surfaces keep it off your data.

starlight.css
/* 3 layers · rotate 180 / 300 / 420s · twinkle 3 / 5 / 7s */
.star-layer              { animation: star-rotate 180s linear infinite,
                                      twinkle 3s ease-in-out infinite; }
.star-layer:nth-child(2) { animation-duration: 300s,5s; animation-delay: 0s,1s; }
.star-layer:nth-child(3) { animation-duration: 420s,7s; animation-delay: 0s,2s; }
@keyframes star-rotate { to { transform: rotate(360deg); } }
@keyframes twinkle     { 0%,100%{opacity:.35} 50%{opacity:1} }

/* Ignition embers rise through the layers. Restraint below. */
:root[data-theme="light"] .starfield-global { display: none; }
@media (prefers-reduced-motion: reduce) { .star-layer, .ember { animation: none } }
09 — Signature · Launch Trails

Launch Trails in Mission Control

Mission Control is where a store builds a mission — what ecommerce would call a journey. Launch Trails are the animated connections between nodes on that dark canvas. Warm orange particles travel along cool violet paths, so your eye follows the flow of energy through the workflow.

MISSION CONTROL · dark
TRIGGER
Fuels up
WAIT
2 hours
SEND
Coffee reward
GOAL
Redeems
Trail

Violet #8B5CF6, fading 80% → 60% along the path. Rounded dashes expand and contract over 2.5s.

Particles

Three orange #F97316 pulses per trail on 3s loops, staggered. They fade in, brighten, and fade out.

Marker

A lavender #A78BFA ring with a lighter #C4B5FD core marks the destination.

Why it works

The path gives structure. The warm particles against cool violet give energy, and draw the eye along the flow.

10 — Components

The building blocks

Core parts of the Ignite portal. Each one pulls from the token system and works in light and dark. This is the calm core: restrained color, one accent for the primary action.

Buttons
Inputs
Status pills
GO HOLD SCRUB DRAFT
Badges & toggles
v2.4 NEW
Alerts
✓
All systems are GO. Your mission is live across 114 stores.
!
Hold. Two stores are missing fuel pricing.
i
Draft saved. Pick up where you left off any time.
Tabs

Underline-active tabs organize a mission's setup without stealing attention from the canvas.

KPI tiles — the loyalty dashboard
Active members
25,412
▲ 6.2% this week
Points redeemed
1.84M
▲ 12% vs. last
Missions live
7
2 in draft
Fuel gallons
402k
▼ 1.1%
Data table — the calm core
MissionAudienceStatusSentRedeemed
Free coffee after 5 fill-upsRewards membersGO18,2043,910
Summer road-trip bonusPremium fuelGO9,5512,077
Win-back — lapsed 60 daysInactiveHOLD00
Car wash upsellAll storesDRAFT——
Empty & loading states
🚀

No missions yet

Prepare for liftoff. Build your first mission and launch it to every store in minutes.

Loading
11 — Patterns

Where the brand shows up, and where it steps back

The login and the marketing edge run full brand. The working screens keep it quiet. Same system, two volumes.

Login — full brand
Business intelligence — calm core
IGNITE · DATA NEUROCENTER
Weekly performance
Revenue
$1.2M
▲ 4.4%
Basket size
$18.40
▲ 2.1%
Loyalty %
61%
▲ 3 pts
Shrink
0.7%
▼ 0.2
StoreRegionGallonsIn-storeLoyalty %
Cosmos Fuel #114Southwest42,110$88,20464%
Orbit Mart #22Gulf Coast38,970$76,55159%
Nova Stop #7Mountain31,204$71,88062%
Virtual receipt — pulled up in the back office
Ignite
Cosmos Fuel #114
4200 Nebula Pkwy · Austin, TX
09/23/2026 · 06:14 AM · Txn #8814-2207
Pump 6 · Regular Unleaded
12.400 gal @ $3.199$39.67
Large Coffee$2.19
Protein Bar$2.49
Subtotal$44.35
Tax$0.36
Total$44.71
Visa ····6011Approved ✓
KickBack Points
+89 pts earned
Balance 3,910 · Tier: Orbit · Member #KB-40128
Fueled by Ignite · Launch Mobile
Thank you, crew. Prepare for liftoff.
Transaction lookup · Command Center

A store owner or support rep searches a transaction and pulls up the digital receipt to reconcile a shift or resend it to a member. The receipt carries a light brand touch. The tools around it stay calm.

MemberDana R. · #KB-40128
ChannelLaunch Mobile app
StoreCosmos Fuel #114
StatusGO
12 — Voice

Fun, intelligent, filtered through space

We write like a smart crew that loves the work. Plain English first, space metaphor second. We use launch language where it lifts a moment, and we get out of the way when someone is reading a number.

✓ Write it like this

  • "All systems are GO — your mission is live across 114 stores."
  • "Prepare for liftoff. Build your first mission."
  • "Two stores are missing fuel pricing. Fix those to launch."

✕ Not like this

  • Piling on metaphors: "Ignite your journey to the stratosphere of retail excellence."
  • Em-dash showers and hype in a data label.
  • Space words on a screen someone uses to reconcile accounts.
Our words
MissionLaunchLiftoffIgnition TrajectoryOrbitTelemetryNavigateCountdown All systems GOT-minusMission ControlCrewDeployTransmit

A store owner sets up a mission (a campaign) in Mission Control, points it at an audience of people fueling up, and hits Ignition. That's the whole story, in our words.

13 — Build · react-admin

The portal runs on react-admin

The Ignite portal is a react-admin app, so the design system ships as a Material UI theme. Brand energy lives in the Layout, Login, and the custom Mission Control view. The resource lists and edit forms — react-admin's Datagrid and inputs — stay in the calm core.

igniteTheme.ts
import { defaultTheme } from 'react-admin';
import { deepmerge } from '@mui/utils';

// Orange = action, Purple = brand. See the token table below.
export const igniteTheme = deepmerge(defaultTheme, {
  palette: {
    mode: 'light',
    primary:   { main: '#d9700f' },  // action orange (AA on white)
    secondary: { main: '#5e398a' },  // brand purple
    success:   { main: '#1f9d6b' },  // GO
    warning:   { main: '#e5a83b' },  // HOLD
    error:     { main: '#d1462f' },  // SCRUB
  },
  typography: {
    fontFamily: '"kallisto", system-ui, sans-serif',
    h1: { fontFamily: '"kallisto"', letterSpacing: '-0.02em' },
  },
  shape: { borderRadius: 12 },
  components: {
    RaDatagrid: { /* keep neutral — calm core, no gradients */ },
    MuiButton: { defaultProps: { disableElevation: true } },
  },
});

Load Kallisto and Eurostile through the Adobe Fonts kit (use.typekit.net/twu7ucm.css) in index.html, then reference the families by name in the theme.

14 — Tokens

Copy the tokens, ship the brand

The full CSS custom-property layer. Raw brand values feed semantic tokens that flip between light and dark from one attribute. Components only ever touch the semantic tokens.

tokens.css
/* Raw brand palette — from the Ignite brand bible */
--ig-purple: #5e398a;   --ig-orange: #fd8d1a;   --ig-yellow: #fedb00;
--ig-purple-light: #a14aa0; --ig-mars: #9e2b16; --ig-gold: #d38210;

/* Brand gradients */
--grad-purple-space: linear-gradient(135deg,#a14aa0,#5e398a);
--grad-sunshine:     linear-gradient(135deg,#fedb00,#d38210);
--grad-firelight:    linear-gradient(135deg,#fd8d1a,#9e2b16);

/* Semantic — DARK (base) */
--bg: #0b0812; --surface: #120d1d; --text: #ece8f2;
--accent: var(--ig-orange); --brand: var(--ig-purple-light);

/* Semantic — LIGHT ( :root[data-theme="light"] ) */
--bg: #f7f6fa; --surface: #ffffff; --text: #241d2f;
--accent: #d9700f; --brand: var(--ig-purple);

/* Status — mission readouts */
--go: #1f9d6b; --hold: #e5a83b; --scrub: #d1462f;

The full file, plus the Starlight and Launch Trails code, lives in styles.css and app.js in this project.