Batch 0 · Canonical Token Sheet

SWAGTRON SHOPIFY DESIGN SYSTEM

The authoritative visual source of truth for the SWAGTRON design system that mirrors the live swagtron.com Shopify store.

Every colour, type, spacing and shape value below is extracted from the live store's settings_data.json (2026-07-13). They are ground truth, not approximations. Motion tokens are read from the live theme's own CSS custom properties. Values marked SPEC are design judgments layered on top; everything else is LIVE.

How to use this file. Attach it to every SWAGTRON design session as the visual reference, alongside the asset folder swagtron-concept-batch0-assets/. Reference images by filename, never by URL — the artifact sandbox blocks all external requests. Re-attach this sheet at the start of each batch; do not rely on session memory to carry tokens forward. Hard rule for every composed screen: it must decompose into named Concept sections.
01

Colour tokens LIVE

The complete palette. There is no secondary brand colour — Concept's identity is near-black ink on white, with a single warm highlight and a small set of semantic states.

Ink
#171717
--color-ink
Text, button fill, drawer text, overlay base
Background
#ffffff
--color-bg
Page background, drawer and panel background
Image surface
#fafafa
--color-image-surface
Media placeholder, image backing
Highlight
#ffddbf
--color-highlight
Text highlight and accent fills
Focus
#0b61cd
--color-focus
Keyboard focus ring
Shadow accent
#a8e8e2
--color-shadow-accent
Decorative shadow accent only
Sale / urgency
#e11d48
--color-sale
Sale price, sale tag background, white text
Rating
#f59e0b
--color-rating
Star rating amber
Success
#4d7c0f
--color-success
On #f7fee7
Error
#be123c
--color-error
On #fff1f2
Info
#b45309
--color-info
On #fffbeb

Semantic state pairs

Success — 5.0:1 ✓ AA
Error — 5.9:1 ✓ AA
Info — 5.2:1 ✓ AA
Ink on highlight — 13.9:1 ✓ AAA
White on sale — 4.7:1 ✓ AA only
White on ink — 16.9:1 ✓ AAA

Contrast matrix — computed

Foreground / backgroundRatioVerdict
#171717 on #ffffff16.9:1AAA
#171717 on #ffddbf13.9:1AAA — safe for text on highlight
#ffffff on #e11d484.7:1AA normal text only. Keep sale-tag text ≥12px and bold; never shrink it.
#0b61cd on #ffffff5.8:1AA
#0b61cd on #1717173.1:1Scrapes 3:1 non-text. SPEC Add a 2px white offset halo on dark surfaces — see §09.
#4d7c0f on #f7fee75.0:1AA
#be123c on #fff1f25.9:1AA
#b45309 on #fffbeb5.2:1AA
02

Typography LIVE

Inter throughout — headings and body share one family. The −3% letter-spacing on headings is load-bearing: it is what makes the store read as Concept rather than as generic Inter. Sentence case everywhere; the only all-caps in the system is the SWAGTRON wordmark. Inter is embedded in this file as woff2, because the artifact sandbox blocks external font requests.

Weights in use

Aa 400body · --font-body-weight
Aa 500nav · buttons · product titles
Aa 600badges · emphasis (SPEC)
Aa 700all headings · --font-heading-weight

Heading scale — per-section setting

title-xl · 72px
700 / lh 1.0 / −3%
Ride it like you stole it
title-lg · 52px
700 / lh 1.0 / −3%
Ride it like you stole it
title-md · 36px
700 / lh 1.0 / −3%
Ride it like you stole it
title-sm · 24px
700 / lh 1.0 / −3%
Ride it like you stole it
body · 16px
400 / lh 1.2
The UrbanCruise is a 20-inch BMX-scale electric bike on an aluminium alloy frame, with a caged wire-mesh headlight and red coil-over rear shocks. Body copy sits at 16px on a tight 1.2 line-height — Concept runs dense, not airy.
nav / button / product title
500 / 16px / lh 1.2
Shop  ·  E-Bikes  ·  Scooters  ·  Accessories  ·  Support
Two voices, one type system. Dot-com native is clean and direct. Campaign — creator and giveaway pages — is VISCERAL · KINETIC · RAW, Burton late-90s poster energy. The tokens do not change between them; the scale, crop, density and imagery do. Never default to corporate voice on a campaign page.
03

Spacing & layout LIVE

The theme exposes section padding as a 0–120px slider in steps of 4. Design to that grid or the Shopify build will not match. Page canvas maxes at 1900px.

0px
4px
8px
12px
16px
24px
32px
40px
48px
64px
80px
96px
120px
TokenValueUse
--page-max-width1900pxTheme max content width
--container-narrow1200px"Narrow container" per-section toggle
section padding0–120px, step 4padding_top / padding_bottom, every section
grid gap SPEC20–24pxCard grids, collage tiles
04

Shape & elevation LIVE

Buttons are fully rounded pills with a 2px border at 100% opacity and zero shadow. Cards carry a 10%-opacity shadow, no border, left-aligned text. Getting shadow wrong on a button is the fastest way to make a mock look un-Concept.

pill · 9999px
--radius-button · buttons
6px
--radius-input · inputs
12px
--radius-card · cards, swatches, blocks
4px
--radius-badge · labels, tags

Elevation

no shadow
--shadow-button · buttons only
--shadow-card · 10% opacity
--shadow-card-hover
--color-shadow-accent · decorative only
05

Buttons — every state LIVE

Default is white text on ink with a 2px ink border. Hover is a straight invert. The state board below pins each state open so you can read them side by side; the row beneath it is live, so you can hover and tab through.

Primary — pinned states

default
:hover — invert
:focus-visible
:active — lift −.25rem
[disabled] — 38%

Variants — live, hover them

Sizes

06

Inputs & form controls

Slightly rounded, 6px. These serve the email-signup section, the contact form, the sweepstakes entry placeholder, and the account templates in Batch 9.

Helper text sits here
Focused — ring at 3px
Enter a valid email address
You're in — check your inbox
Not editable

Quantity, swatches, choices

Quantity stepper
Colour swatches
Choices
07

Focus ring — light and dark SPEC on dark

The focus blue clears AA comfortably on white. On the ink surface it lands at 3.1:1 — passing the 3:1 non-text threshold by a hair. Rather than live on that margin, every interactive element on a dark or overlay surface gets a 2px white offset halo outside the blue ring. This is a design decision layered on the live token, not a token change.

On light — ring only
On ink — ring + white halo
08

Badges, labels & rating

The GIVEAWAY label is the one custom piece here. The theme drives product labels off the metafield theme.label plus a label background colour, so a giveaway badge is a real, buildable mechanism — not a mock-only flourish.

−25% SALE GIVEAWAY NEW SOLD OUT ● In stock ⏱ Ends in 2 days

Rating

4.6 · 128 reviews
Build note. GIVEAWAY = metafield theme.label (single-line text, list of values) with the label background set to #ffddbf and ink text. That pair reads 13.9:1, so it is the safest possible label in the palette. The sale tag at 4.7:1 is the tightest — keep it bold and never below 12px.
09

Product card — the primitive everything reuses

Card style, left-aligned text, no border, 10%-opacity shadow. Hover swaps to a second image with a crossfade and 1.1× zoom over 300ms, reveals the discount badge, and lifts the card. Hover the cards below — all three behaviours are live.

GIVEAWAY
−25%
SWAGTRON UrbanCruise e-bike SWAGTRON UrbanCruise, alternate view
4.6

UrbanCruise E-Bike

$1,199.00$1,599.00
NEW
UrbanCruise night build

UrbanCruise — Night Build

$1,449.00
Campaign voice — dark tile, VISCERAL · KINETIC · RAW
SOLD OUT
GlideX Pro, sold out

GlideX Pro

$424.00
Back in stock soon
Hover behaviours, verbatim from the live theme. Second-image crossfade plus scale3d(1.1,1.1,1) at 300ms on cubic-bezier(.9,0,.5,1). Vertical lift −0.75rem on hover, −0.5rem on active, 200ms. 3D lift is rotate 1° with a shimmer sweep, desktop and no-reduced-motion only. Discount badge reveals at ≥750px viewport.
10

Heading highlight system — 7 styles + 5 scribbles LIVE names SPEC rendering

The theme names seven highlight styles and five scribble variants, plus an animated highlighted_reveal. The names and the Splitting.js character engine are confirmed from live source; the per-style keyframes were not isolatable, so the rendering below is drawn from the style names and is a design proposal. This is open question 2 in the spec.

text — colour swap only
Ride it like you stole it
full_text — solid highlight block
Ride it like you stole it
half_text — highlight fills lower 46%
Ride it like you stole it
underline — clean rule under the words
Ride it like you stole it
marker — hand-drawn marker sweep
Ride it like you stole it
stencil — outlined, hollow characters
Ride it like you stole it
scribble · circle
Ride it like you stole it
scribble · basic-underline
Ride it like you stole it
scribble · sketch-underline
Ride it like you stole it
scribble · squiggle-underline
Ride it like you stole it
scribble · squiggle-underline-2
Ride it like you stole it
highlighted_reveal — animated wipe, 800ms ease-out-slow
Ride it like you stole it
11

Icon set SPEC

Single-weight line icons at 1.6px stroke, 24px box, round caps and joins — sized to the mobile-dock and header targets. Drawn as inline SVG so nothing depends on an external request.

cart
search
account
menu
close
chevron-down
chevron-right
arrow-right
plus
minus
check
star
heart
play
filter
share
truck
clock
info
battery
bolt
pin
mail
grid
12

Motion tokens LIVE

Read directly from the live theme's CSS custom properties. Nine motion families drive the whole store; the durations and easings below are the ones every one of them uses.

TokenValueWhere it is used
--duration-medium200msCard and button lift
--duration-default300msImage crossfade, popup and modal rise
--duration-long500msDiagonal-swipe button
--duration-extra-long600msScroll-reveal — the default entry animation
--duration-slow800msCustom-cursor grow, highlight reveal
--duration-extended3s3D-lift shimmer sweep
--ease-out-slowcubic-bezier(0,0,0.3,1)Primary reveal easing
--cubic-outcubic-bezier(0.5,1,0.89,1)Cursor and secondary motion
cascade stagger75ms per itemGrids and product rows enter one after another
marqueelinear, infiniteAnnouncement bar, scrolling text

Live demos

M1 · scroll-reveal with 75ms cascade — 600ms, ease-out-slow, runs once
0ms
75ms
150ms
225ms
300ms
M4 · marquee — translateX 0 → −100%, linear, infinite
VISCERAL·KINETIC·RAW·URBANCRUISE· VISCERAL·KINETIC·RAW·URBANCRUISE·
M8 · countdown — starts on scroll into view, ticks once per second, removes itself at zero
02Days
14Hours
37Min
09Sec
Reduced motion. Every reveal, parallax, marquee and text animation has a fallback. Reveals become instant opacity-1, marquees go static, decorative layers are aria-hidden and never take focus. The countdown stays live because it is informational, not decorative.
13

Standard Section Token Set — "STS" LIVE

Every one of the theme's sections exposes this same block of settings. Model each section card with it, and only call out tokens that go beyond it. This is what makes the design system decompose cleanly into the Shopify editor.

/* every Concept section exposes these */
color_text            · text colour
color_background      · solid background
gradient_background   · overrides solid when set
color_highlight       · heading highlight fill
gradient_highlight    · gradient variant of the above
color_overlay         · media overlay colour
overlay_opacity       0–100%
padding_top           0–120px, step 4
padding_bottom        0–120px, step 4
divider               · top/bottom rule toggle
full_width            · edge-to-edge toggle
rounded               · rounded-corner toggle
heading size          title-sm | title-md | title-lg | title-xl
tracking-heading      -0.03em
heading tag           h1 | h2 | h3 | h4 | h5 | h6 | p
14

Companion asset folder

Ships alongside this sheet as swagtron-concept-batch0-assets.zip. Upload the folder to the SWAGTRON design session and reference every image by filename. External URLs will silently fail — the sandbox blocks them.

brand/swagtron-wordmark-black.png
brand/swagtron-wordmark-black.png
product/urbancruise-profile-transparent.png
product/urbancruise-profile-transparent.png
product/urbancruise-hero-square-black-bg.jpg
product/urbancruise-hero-square-black-bg.jpg
product/urbancruise-hero-white-bg.jpg
product/urbancruise-hero-white-bg.jpg
product/urbancruise-base-plate.jpg
product/urbancruise-base-plate.jpg
banners/campaign-banner-1.jpg
banners/campaign-banner-1.jpg
banners/campaign-banner-3.jpg
banners/campaign-banner-3.jpg
creators/austin/SWAGTRON-27.jpg
creators/austin/SWAGTRON-27.jpg
creators/austin/SWAGTRON-118.jpg
creators/austin/SWAGTRON-118.jpg
FolderContents
brand/SWAGTRON wordmark, black and white, transparent PNG
product/Four UrbanCruise renders — transparent profile (alpha verified), black-bg square hero, white-bg hero, base plate
banners/Four campaign banners from the store CDN
creators/austin/Twenty Demo Days photos of @austinmollno plus the SEO title/caption manifest for alt text
font/Inter variable roman and italic, plus the SIL OFL licence
Wordmark rules. Always all caps. Black on light surfaces, white on dark. Desktop 265px, mobile 150px. It is the only all-caps element in the entire type system.
15

The raw token block

Copy this into any downstream surface — a SWAGTRON design prompt, a CLAUDE.md, a theme file, a Tailwind or shadcn config. It is library-agnostic and maps onto CSS custom properties without rework.

:root{
  /* — Color ————————————————————————————————— */
  --color-ink:              #171717;  /* text · button fill · drawer text · overlay base */
  --color-bg:               #ffffff;  /* page background · drawer/panel background */
  --color-image-surface:    #fafafa;  /* media placeholder · image backing */
  --color-highlight:        #ffddbf;  /* text-highlight · accent fills */
  --color-focus:            #0b61cd;  /* keyboard focus ring */
  --color-shadow-accent:    #a8e8e2;  /* decorative shadow accent ONLY */
  --color-sale:             #e11d48;  /* sale price · sale/urgency tag bg (white text) */
  --color-rating:           #f59e0b;  /* star rating amber */
  --color-success:          #4d7c0f;
  --color-success-bg:       #f7fee7;
  --color-error:            #be123c;
  --color-error-bg:         #fff1f2;
  --color-info:             #b45309;
  --color-info-bg:          #fffbeb;

  /* — Typography ———————————————————————————— */
  --font-heading-family:    'Inter', system-ui, -apple-system, sans-serif;
  --font-body-family:       'Inter', system-ui, -apple-system, sans-serif;
  --font-heading-weight:    700;
  --font-body-weight:       400;
  --font-nav-weight:        500;   /* navigation · buttons · product titles */
  --font-body-size:         16px;
  --line-height-heading:    1.0;
  --line-height-body:       1.2;
  --tracking-heading:       -0.03em;   /* −3% — never drop this */

  /* heading size scale (per-section setting: title-sm / md / lg / xl) */
  --title-sm:  1.5rem;    /* 24px */
  --title-md:  2.25rem;   /* 36px */
  --title-lg:  3.25rem;   /* 52px */
  --title-xl:  4.5rem;    /* 72px */

  /* — Spacing ——————————————————————————————— */
  /* theme section padding scale: 0–120px, step 4 */
  --space-0:0px;   --space-1:4px;   --space-2:8px;   --space-3:12px;
  --space-4:16px;  --space-6:24px;  --space-8:32px;  --space-10:40px;
  --space-12:48px; --space-16:64px; --space-20:80px; --space-24:96px;
  --space-30:120px;

  /* — Layout ———————————————————————————————— */
  --page-max-width:         1900px;   /* theme max content width */
  --container-narrow:       1200px;

  /* — Shape ————————————————————————————————— */
  --radius-button:          9999px;   /* fully rounded / pill */
  --radius-input:           6px;      /* slightly rounded */
  --radius-card:            12px;     /* cards · swatches · content blocks */
  --radius-badge:           4px;
  --border-button:          2px;      /* 2px @ 100% opacity */

  /* — Elevation ————————————————————————————— */
  --shadow-button:          none;                          /* buttons: ZERO shadow */
  --shadow-card:            0 4px 16px rgba(23,23,23,.10);  /* 10% opacity */
  --shadow-card-hover:      0 10px 28px rgba(23,23,23,.14);

  /* — Motion ———————————————————————————————— */
  --duration-medium:        200ms;
  --duration-default:       300ms;
  --duration-long:          500ms;
  --duration-extra-long:    600ms;
  --duration-slow:          800ms;
  --duration-extended:      3s;
  --ease-out-slow:          cubic-bezier(0, 0, 0.3, 1);
  --cubic-out:              cubic-bezier(0.5, 1, 0.89, 1);
  --stagger-step:           75ms;   /* calc(var(--animation-order) * 75ms) */
  --duration-marquee:       1.5s;
}

SWAGTRON SHOPIFY DESIGN SYSTEM · Batch 0 canonical token sheet · generated 2026-07-27 · tokens from the live v6.0.0 store, 2026-07-13 · motion from the live theme CSS · self-contained, zero external requests.