High-Fidelity UI & Mini Design System
Builds on Topic 9.
What you'll produce
The polished, on-brand high-fidelity UI for FreshCart's key checkout screens — built not as one-off pixel art, but from a mini design system: a small kit of reusable tokens (color, type, spacing), components (buttons, inputs, cards), and the rules for using them. You'll define the kit in Figma, then assemble the redesigned browse → cart → checkout screens from it, with accessibility-grade contrast and a deliberate visual hierarchy that points a first-timer straight at the next action. This is the artifact that turns "I have a wireframe" into "I can ship product." It proves the Topic 8–9 skills hiring managers screen hardest for: thinking in reusable components, defending color/type/spacing choices, and producing UI that is consistent, accessible, and fast to change — the difference between a junior who decorates screens and one who builds systems.
Instructions
- Lock your tokens before you touch a screen. Define them as named Figma styles/variables so every component references the token, not a raw value. Minimum set:
- Color: 1 brand primary, 1 accent for the single most important action, a 4–5 step neutral grey ramp, plus semantic
success/error/warning. Name them by role (color/action-primary), not by hue (green-500). - Type: one or two readable families and a scale of 5–6 sizes with named roles (Display / H1 / H2 / Body / Caption) and line-heights. Restraint beats variety.
- Spacing: an 8px-based scale (4, 8, 12, 16, 24, 32, 48). Pick from the scale; never type arbitrary numbers like 13 or 27.
- Color: 1 brand primary, 1 accent for the single most important action, a 4–5 step neutral grey ramp, plus semantic
- Check contrast on every text/background and text/button pair. Use a WCAG checker. Body and UI text must hit 4.5:1; large text (≥24px or 19px bold) must hit 3:1. Record the ratio next to each pairing. If a token fails, fix the token, not the instance.
- Build the components as true Figma components (the master + instances, so one edit propagates). For each, define its variants and states — a button isn't done until it has Default / Hover / Pressed / Disabled / Loading. Build at minimum: Button (primary, secondary, ghost), Text Input (default / focus / error-with-message), and Card (product card, order-summary card).
- Assemble the hero screens from components only. Take 3–4 critical screens from your tested flow (e.g., Cart, Delivery & Address, Payment, Order Confirmation) and lay them up in hi-fi using instances of your components — no detached, hand-styled elements. If a screen needs something the kit lacks, add it to the kit first.
- Direct the eye with hierarchy on each screen. Apply the squint test: the single most important action (the primary CTA) should be the loudest thing on the screen via size, your accent color, and isolation/spacing. Demote everything secondary. One primary CTA per screen.
- Bake in the usability fixes from Deliverable 4. Each issue you found in testing should be visibly resolved in the hi-fi — and call it out. Use the heuristics as your checklist: visible system status (a progress indicator, a loading button state), error prevention/recovery (inline input validation with plain-language messages), recognition over recall (saved address shown, not re-typed).
- Write the one-page "how to use this kit" guidelines — the rules a teammate needs: when to use primary vs. secondary buttons, the contrast floor, the spacing scale, and the type roles. A kit without rules isn't a system.
- Annotate for handoff. On at least one screen, label the tokens/components in use (e.g., "Button/Primary", "color/action-primary on color/surface", spacing values) so an engineer — and an interviewer — can see the system underneath the screen.
Worked example
(Product: FreshCart redesign — hi-fi UI for the checkout flow, built on the "FreshKit" mini design system. The first-timer's goal: place a first order in under three minutes.)
1. Tokens
Color (named by role; contrast verified against the surface they sit on)
| Token | Hex | Role | Contrast check |
|---|---|---|---|
color/action-primary | #1F7A4D (deep grocery green) | Primary CTA fill | White text on it = 5.9:1 ✓ (passes 4.5) |
color/accent | #E8590C (warm orange) | Free-delivery / savings highlight | On surface = 4.7:1 ✓ |
color/text-strong | #1A1F1C | Headings, prices | On surface = 15.8:1 ✓ |
color/text-muted | #5B6660 | Secondary labels, captions | On surface = 4.9:1 ✓ (the old grey #B3B9B5 was 2.1:1 — failed; fixed at the token) |
color/surface | #FFFFFF | Cards, page background | |
color/surface-subtle | #F4F6F5 | Page behind cards, input fills | |
color/border | #D6DCD8 | Input + card outlines | |
color/success | #1F7A4D | "Added to cart" confirmation | |
color/error | #C0341D | Inline validation | On surface = 5.6:1 ✓ |
Type — Inter (UI) is the single family; restraint over variety.
| Role | Size / line-height / weight | Used for |
|---|---|---|
| Display | 28 / 34 / 700 | Screen title ("Your cart") |
| H2 | 20 / 26 / 600 | Section headers ("Delivery"), order total |
| Body | 16 / 24 / 400 | Item names, field labels, body copy |
| Body-strong | 16 / 24 / 600 | Prices, button labels |
| Caption | 13 / 18 / 400 | Helper text, "incl. VAT", error messages |
Spacing — 8px base scale: 4, 8, 12, 16, 24, 32, 48. Card padding = 16; gap between cards = 12; section gap = 24; screen side-margin = 16.
2. Components (as Figma components with variants)
- Button/Primary —
color/action-primaryfill, whiteBody-stronglabel, 12px vertical / 24px horizontal padding, 8px radius, full-width on mobile. States: Default · Hover (+6% darker) · Pressed (+12% darker) · Disabled (surface-subtlefill,text-mutedlabel) · Loading (spinner + "Placing order…", button stays the same height so the layout doesn't jump → visibility of system status). - Button/Secondary — outline only (
color/border),text-stronglabel, transparent fill. Used for "Continue shopping" so it never competes with the primary CTA. - Input/Text —
surface-subtlefill, 1pxborder, 8px radius,Bodytext, persistent label above (not a disappearing placeholder → recognition over recall). States: Default · Focus (2pxaction-primaryring) · Error (1pxerrorborder +Captionmessage below incolor/error: "Enter a 5-digit ZIP so we can check delivery." → error prevention & recovery). - Card/Product — image left, name (
Body) + qty stepper + price (Body-strong) right, 16px padding, 12px radius, 1pxborder. - Card/OrderSummary — sticky bottom card: subtotal, delivery, total (
H2,text-strong), and the primary CTA. Free-delivery line usescolor/accent.
3. Hero screens, assembled from the kit
Screen — Cart
Displaytitle "Your cart (3 items)". A stack of threeCard/Productinstances. StickyCard/OrderSummarypinned to the bottom: "Subtotal £34.20 · Delivery £0.00 · Total £34.20", anaccent-colored line "Free delivery unlocked — you saved £3.99 🎉", and Button/Primary "Go to checkout". Squint test: the green CTA and the bold total are the only things that survive the blur — correct hierarchy. (Currency note: pounds throughout, continuing the same FreshCart basket the learner priced in D1/D3 — £6 standard delivery fee, £3.99 delivery, £24.18 total. The hero screens must visibly continue that cart, not silently re-denominate it; a single-product portfolio loses credibility the moment the currency flickers between screens.)
Screen — Delivery & Address
H2"Where to?". ThreeInput/Textinstances (Street, ZIP, Apartment) with labels always visible. A progress indicator at top ("Step 1 of 3") so the first-timer always knows how far they are → fixes the "checkout is a maze" review directly. Button/Primary "Continue to payment", Button/Secondary "Back to cart" beneath it, visually quieter.
Screen — Payment
- Saved-card chip shown as recognition, not a blank form. The CVV
Input/Textshows its Error state in the example ("Enter the 3-digit code on the back.") to demonstrate plain-language recovery. Button/Primary in Loading state ("Placing order…") demonstrates system-status visibility.
Screen — Order Confirmation
- Big
success-green check,Display"Order placed — arriving 5:30–6:00 PM", and a calm single Button/Secondary "Track order". No competing CTAs; the user has succeeded, so the screen goes quiet.
4. Usability fixes from Deliverable 4, now visible in hi-fi
- "Users didn't know how many checkout steps remained" (high severity) → "Step 1 of 3" progress indicator on every checkout screen.
- "ZIP errors only appeared after submit" (high) → inline
Input/Errorstate with a plain-language fix message. - "Total felt like it 'jumped' at the end" (medium) → persistent sticky OrderSummary showing the running total from the cart onward.
5. Kit guidelines (the one-pager)
One primary button per screen — it owns
color/action-primary; everything else is Secondary or Ghost. Contrast floor: 4.5:1 body / 3:1 large — verify before shipping a new pairing. Spacing only from the 8px scale. Type only from the five roles. New pattern? Add it to FreshKit first, then use the instance — never hand-style on a screen.
Rubric
The app's AI scores the learner's submission against these criteria and gives feedback. Levels: Needs work (1) / Solid (2) / Excellent (3). Passing = every criterion at Solid or above.
- Token system (color / type / spacing) — 1: raw values scattered on screens, no named styles · 2: a defined, role-named token set with a restrained palette, type scale, and spacing scale · 3: tokens are systematic, semantically named, and demonstrably reused (changing one token would update the UI everywhere).
- Reusable components with states — 1: hand-styled, detached elements · 2: true components (button, input, card) used as instances across screens · 3: components include the real-world variants and states (hover/pressed/disabled/loading, focus/error) and screens are assembled only from instances.
- Accessibility-grade contrast — 1: contrast not checked; failing greys present · 2: key text/background pairs meet WCAG 4.5:1 (3:1 large) and ratios are recorded · 3: every pairing verified, failures fixed at the token, and the contrast rule is written into the guidelines.
- Visual hierarchy & on-brand polish — 1: everything competes; no clear focal point · 2: one clear primary CTA per screen, consistent spacing/alignment, coherent brand feel · 3: passes the squint test on every screen — the eye lands on the right action first, secondary actions are deliberately demoted, and the result looks shippable.
- Usability fixes carried through — 1: hi-fi ignores Deliverable 4 findings · 2: the main tested issues are visibly resolved in the screens · 3: each fix is resolved and annotated, mapped to a heuristic (system status, error recovery, recognition over recall).
- System thinking & coherence — 1: pretty screens with no underlying kit or guidelines, or details that contradict earlier deliverables (e.g., currency/price/product that no longer matches D1/D3) · 2: a kit plus usage guidelines, traceable to the prior deliverables' flow, with prices, currency, and product consistent across every screen · 3: a genuine mini design system — annotated for handoff — that an engineer or teammate could pick up and build new screens from consistently, and the hero screens visibly continue the same FreshCart basket the learner priced earlier (one currency, numbers that reconcile end to end).