Skip to content
A ApexCommerce Design System All pages
Phase 01 — Foundation

Design tokens

Every colour, size, radius, shadow and duration in ApexCommerce is expressed once, here. Components consume tokens — they never hard-code values. This is what keeps 150+ screens across storefront, customer dashboard, admin and super-admin visually identical.

assets/css/tokens.css 62 colour tokens Fraunces + Inter WCAG 2.1 AA verified
A

Colour system

A green-tinted neutral palette, not grey. Two accents with strictly separated jobs: amber lives on dark surfaces only (it fails AA on white), and red is reserved for price, sale and destructive/error — never decoration.

Primary — deep eucalyptus

Primary 900
--apx-primary-900 · #0A2A20
16.4:1 Active / pressed
Primary 800
--apx-primary-800 · #0E2B21
14.6:1 Admin sidebar · footer
Primary 700
--apx-primary-700 · #0F3529
13.2:1 Hover
Primary 600 — PRIMARY
--apx-primary · #123F31
11.8:1 Buttons · links
Primary 500
--apx-primary-500 · #1B5A45
8.1:1 Illustration
Primary 400 — Secondary
--apx-secondary · #2D6A4F
6.4:1 Charts · focus ring
Primary 300
--apx-primary-300 · #6E9C86
3.3:1 Borders · icons
Primary 200
--apx-primary-200 · #A9C6B7
Chart series 2
Primary 100
--apx-primary-100 · #D5E4DC
Selection · borders
Primary 050
--apx-primary-soft · #EAF1ED
Tinted backgrounds

Accent — Australian amber

Accent
--apx-accent · #E8A33D
5.5:1 on primary · stars · CTAs on dark
Accent hover
--apx-accent-hover · #F0B45C
Hover only
Accent soft
--apx-accent-soft · #FDF3E2
Search highlight · promo tint
Accent text
--apx-accent-text · #B45309
5.0:1 Amber text on light
Hard rule: amber never carries text on a light background
#E8A33D on white measures 2.16:1 — a WCAG failure. When amber meaning must be expressed as text on white (warning copy, rating numerals), use --apx-accent-text #B45309.

Neutrals & surfaces

Background
--apx-bg · #F6F7F4
Page canvas
Background alt
--apx-bg-alt · #EFF1EC
Alternating sections
Surface
--apx-surface · #FFFFFF
Cards · inputs · header
Surface 2
--apx-surface-2 · #F0F2ED
Wells · table head
Surface 3
--apx-surface-3 · #E7EAE3
Skeletons · tracks
Text
--apx-text · #151A16
17.6:1 Headings · body
Text secondary
--apx-text-secondary · #3D473F
10.3:1 Supporting copy
Text muted
--apx-text-muted · #5B6660
6.0:1 Meta · labels
Text faint
--apx-text-faint · #8A928C
3.1:1 Placeholders · captions ≥18px
Border
--apx-border · #E2E6DF
Hairlines · card edges
Border strong
--apx-border-strong · #C6CCC3
Inputs · dividers
Surface inverse
--apx-surface-inverse · #0E2B21
Tooltips · admin · footer

Status

Success
--apx-success · #1F7A4D
5.3:1 Delivered · paid · in stock
Success soft
--apx-success-soft · #E7F4ED
Alert & badge fills
Warning
--apx-warning · #B45309
5.0:1 Pending · low stock
Warning soft
--apx-warning-soft · #FDF2E4
Alert & badge fills
Danger / Sale
--apx-danger · #C0362C
5.5:1 Errors · sale price · refunds
Danger soft
--apx-danger-soft · #FCEDEC
Alert & badge fills
Info
--apx-info · #1D4E89
8.4:1 Shipping · confirmed
Info soft
--apx-info-soft · #E9F0F9
Alert & badge fills
Stripe
--apx-stripe · #635BFF
Payment method context only

Order lifecycle palette

Ten statuses, one meaning each. The same nine classes are reused verbatim in customer orders, admin orders, returns, refunds and audit logs.

Pending Confirmed Processing Shipped Delivered Cancelled Returned Partially refunded Refunded Payment failed

In context

Storefront surface

Eucalyptus Hooded Parka

Country Road · Outerwear

$189.00 $249.00 −24%
Dark surface · accent permitted

Free express delivery over $150

Dispatched from Melbourne. Metro 1–3 business days, regional 3–6.

B

Typography

Fraunces carries display and H1–H3 — a variable serif with soft optical sizing that reads Australian-premium rather than tech-generic. Inter carries everything a customer has to act on: body, UI, forms, tables. All numerals that can be compared use tabular figures.

Display
--apx-fs-display
clamp 36 → 56px · lh 1.08 · tracking −0.02em
Fraunces 600
Made for Australian summers
H1
--apx-fs-h1
clamp 28 → 40px · lh 1.22 · tracking −0.012em
Fraunces 600
Order #APX-2026-08412
H2
--apx-fs-h2
clamp 24 → 30px · lh 1.22
Fraunces 600
Best sellers this week
H3
--apx-fs-h3
22px · lh 1.35
Fraunces 600
Shipping & returns
H4
--apx-fs-h4
18px · lh 1.35
Inter 600
Delivery address
H5 / H6
16px · 15px
Inter 600
Payment method
Body large
--apx-fs-body-lg
17px · lh 1.65
Cut from recycled cotton fleece with a water-repellent finish, this parka is built for coastal mornings and alpine weekends alike. Two-way zip, adjustable hood, four pockets.
Body
--apx-fs-body
15px · lh 1.6 · Inter 400
Orders placed before 2pm AEST dispatch the same business day from our Melbourne warehouse. Standard delivery is $8.95 and free over $150.
Small
--apx-fs-small
13.5px · lh 1.5
Estimated arrival Tuesday 15 – Thursday 17 September. Tracking emailed on dispatch.
Caption
--apx-fs-caption
12px · Inter 500 · tracking +0.01em
Prices include GST. Shipping calculated at checkout.
Overline
--apx-fs-overline
11px · Inter 700 · uppercase · tracking +0.10em
New season · Outerwear
Button
15px · Inter 600 · tracking −0.005em
Numerals
.apx-num / .apx-price
tabular-nums
$1,284.60
1,284.60 · 09,412 · 33.3% · $8.95 · 150,000
Columns of figures align vertically in carts, tables, invoices and reports.
Fraunces is used for display, H1, H2, H3 only. Never for body, forms, tables, buttons or badges.
Minimum interactive text size is 13.5px (Small). Nothing clickable is smaller.
Line-clamp is 2 lines for product names; truncation always shows a title attribute.
No italic body copy, no underlined non-links, no all-caps body text.
C

Spacing system

A strict 4px base scale. Spacing communicates grouping: related items sit 4–8px apart, groups 16–24px, sections 48–120px. If a gap isn't on this scale, it's wrong.

1 · 2
2 · 4
3 · 8
4 · 12
5 · 16
6 · 20
7 · 24
8 · 32
9 · 40
10 · 48
11 · 64
12 · 80
TokenValueApplied to
--apx-gutter16 → 20 → 24pxGrid gap between cards
--apx-container-pad16 → 24 → 32pxPage edge padding
--apx-section-y48 → 64 → 80pxVertical rhythm between page sections
--apx-container-max1344pxStorefront content width
--apx-filter-w280pxShop filter sidebar (desktop)
--apx-sidebar-w264pxAdmin navigation sidebar
Card padding20px mobile · 24px desktop.apx-card-body
Touch target44 × 44px minimumAll mobile interactive controls
D

Border radius

Radius scales with surface size: small controls are tight, large surfaces are soft. Pill is reserved for chips, badges and switches — never for primary buttons.

xs · 4px
Checkbox, code chip
sm · 6px
Inputs, badges, thumbs
md · 10px
Buttons, product images
lg · 16px
Cards, modals, tables
xl · 24px
Hero, sheets, feature tiles
pill
Chips, status, switches
circle
Avatars, icon buttons
E

Shadow system

Shadows are green-tinted at very low opacity (6–20%), never neutral black. Elevation is earned: only floating surfaces (dropdown, drawer, modal, toast) get more than sm. Cards at rest use xs.

xs0 1px 2px / 6%
sm0 2px 8px / 7%
md0 8px 24px / 10%
lg0 16px 48px / 14%
xl0 24px 64px / 20%
focus ring0 0 0 3px / 28%
insetinner well
Focus is never communicated by shadow alone
The ring is paired with a 2px outline on :focus-visible so it survives Windows High Contrast mode and greyscale printing.
F

Motion & easing

Motion answers one question: “where did that come from, and where did it go?” Durations stay between 120–480ms. Nothing bounces except the cart badge and wishlist heart.

TokenValueUse
--apx-dur-fast120msColour, background, opacity on hover
--apx-dur-base200msButtons, inputs, dropdowns, tab underline
--apx-dur-slow320msDrawers, modals, toasts, page reveal
--apx-dur-slower480msStaggered card grid reveal (45ms per item, max 8)
--apx-ease-outcubic-bezier(.22,1,.36,1)Default for anything entering
--apx-ease-in-outcubic-bezier(.65,0,.35,1)Progress bars, indeterminate loaders
--apx-ease-springcubic-bezier(.34,1.56,.64,1)Cart badge pop, wishlist heart, switch thumb only
Live

Hover / tap to replay each transition.

prefers-reduced-motion is a hard requirement
A global media query collapses every animation and transition to 0.001ms, disables smooth scrolling and removes skeleton shimmer. State changes are additionally signalled with colour, icon and text — never motion alone.
G

Breakpoints & layout grid

Bootstrap 5 breakpoints, unmodified — so the Next.js port can use the grid as-is. Layouts are designed mobile-first and restructured at each step, not scaled.

Mobile
< 576px
1 column · 16px edge padding · products 2-up · bottom nav · filters in a sheet · tables become data rows
Mobile landscape / small tablet
≥ 576px
1–2 columns · forms go 2-up · modals become centred
Tablet
≥ 768px
Products 3-up · 24px padding · checkout becomes 2-column · admin sidebar still off-canvas
Desktop
≥ 992px
Full header + category nav · filter sidebar visible · bottom nav hidden · admin tables visible
Large desktop
≥ 1200px
Products 4-up · admin sidebar pinned · 32px padding · sticky order summary
Wide
≥ 1400px
Content capped at 1344px · generous whitespace, larger stat values
H

Layering

A fixed z-index scale prevents the classic “modal under the sticky header” bug across 150 screens.

LayerTokenz
Mobile bottom nav--apx-z-bottomnav1015
Announcement bar--apx-z-announce1020
Sticky sub-header / admin topbar--apx-z-sticky-sub1025
Main header--apx-z-header1030
Drawer backdrop--apx-z-drawer-backdrop1040
Drawer / admin sidebar--apx-z-drawer1045
Modal--apx-z-modal1055
Toasts--apx-z-toast1080
Tooltips--apx-z-tooltip1090
I

Usage rules

These rules are what stop the product drifting into a generic template. They are enforced in the Phase 17 audit checklist.

No component declares a colour, radius, shadow, font-size or duration literal. Tokens only.
Every interactive element has hover, focus-visible, active and disabled states — designed, not inherited.
Minimum touch target 44×44px below 576px. Minimum body text 13.5px.
Red is used only for: sale price, discount badge, destructive action, error/validation, payment failure, low-rating sentiment.
Amber is used only on dark surfaces, for star ratings (via --apx-accent-text), and for low-stock warning states.
Every list/table/grid has an empty state and a skeleton state. No blank areas, ever.
Destructive actions require a confirmation modal that names the object being deleted.
Money always shows the currency symbol, 2 decimals and tabular figures. GST inclusion is stated once per page.
No glassmorphism, no gradient text, no drop-shadow on text, no more than one animation running per viewport.
No new colour may be introduced after Phase 01 without being added to this page first.