Skip to content
AApexCommerce Design System All pages
Phase 01 — State system

Loading, empty, error, success

A blank white area is a bug. Every surface in ApexCommerce has a designed answer for “not yet”, “nothing here”, “something broke” and “done”. These four families are reused verbatim on all 150+ screens.

U

Loading & skeleton states

Skeletons mirror the final layout's exact box metrics so nothing shifts when data lands (zero CLS). Shimmer runs at 1.5s and is removed entirely under reduced motion. Spinners only for actions <2s; skeletons for content; progress bars for multi-step (payment).

Product grid skeleton
Dashboard / table skeleton
Product page skeleton
Action loading patterns

Rule: the label stays (screen readers announce “Saving…”), width stays, and the button is non-interactive until the response resolves. Double-submit is impossible by construction.

V

Empty states

An empty state is a landing page for a first-time user: one friendly icon, one honest sentence, one primary action (and at most one secondary). Never blame the user; never show an empty table with only column headers.

Empty cart
Your cart is empty

Browse new arrivals or pick up where you left off — we saved your last 20 views for 30 days.

Empty wishlist
Nothing saved yet

Tap the heart on anything you love and it'll wait for you here — price drops included.

No search results (see Phase 02 for full page)
No matches for “linnen”

Did you mean linen? Or try fewer words — “linen shirt” finds more than “white pure linen shirt men”.

Empty orders (new account)
No orders yet

When you place your first order it'll appear here with live tracking and one-tap returns.

Ordered as a guest? Track with your order number
Empty admin table (filtered)
No orders match those filters

1,284 orders exist — none are “Refunded” in “NT” this quarter.

Empty notifications
All caught up

Price drops, delivery updates and return statuses will land here.

W

Error states

Errors answer three questions in order: what happened, is my data/money safe, what do I do now. The recovery action is always the most prominent button.

404 — page not found
404
This aisle doesn't exist

The page may have moved, or the link has a typo. Your cart and session are untouched.

Error ref nf-88412 · popular: Parkas · Espresso · Sneakers
500 — server error
Something broke on our side

Our engineers were alerted automatically (ref se-2210). Nothing was charged and your cart is saved.

Payment failure + retry (checkout)
  1. Order reserved
    9:14:02am · stock held 15 min
  2. Payment attempt failed
    9:14:38am · bank decline, retry allowed
  3. 3
    Awaiting retry
    Reservation expires 9:29am
Form-level error summary (checkout / admin)

The summary receives focus on submit, each link jumps to and focuses its field, and fields keep their values. Errors clear live as the user fixes them.

X

Success states

Success moments do two jobs: confirm, and route onwards. The confirmation is calm (green check, one line); the next step is the loudest thing on screen.

Order placed (full page in Phase 06)
Thank you, Charlotte — order confirmed

Order #APX-2026-08412 · a receipt is on its way to charlotte@example.com. Estimated delivery Thu 10 – Sat 12 Sep.

New here? Create an account with this order attached — no re-entry.
Inline success (settings, coupons, returns)
Password updated
All other sessions were signed out at 2:41pm AEST. If that wasn't you, secure your account.
Coupon APEX10 applied — you saved $24.69
Return approved
Refund of $119.00 to Visa •••• 4242 · lands in 3–5 business days
Y

State matrix — every major page

The contract each screen signs before it ships. Phase 17 audits against this exact table.

SurfaceDefaultLoadingEmptyErrorSuccess
Product gridcardscard skeletons ×8no-results stateretry banner + cache
Cartline itemsrow skeletonsempty cartcoupon/stock errorsadded toast
Checkout paymentStripe fieldsindeterminate bardecline + retryorder placed
Order trackingtimelinetimeline skeletonunknown numbercarrier outagedelivered confetti-free
Admin orderstablerow skeletonsfiltered-empty500 + retrystatus toast
Reviews moderationqueue tablerow skeletonsqueue clear 🎉bulk-action partial failapproved toast
Profile saveformbutton spinnersummary + inlinesaved toast
Loading > 400ms shows a skeleton; < 400ms shows nothing (avoid flicker); > 8s shows an error with retry.
Every retry keeps user input. Retrying never reloads the whole page.
Empty states never appear for admins on first load — a freshly installed admin sees seeded demo data with a “clear demo data” action.
No spinners inside tables (rows skeleton instead), no full-page white flashes, no browser-default error text.