ShiftCart Design System
v0.1 preview. Every value below comes from tokens/*.json through scripts/build-tokens.mjs — nothing here is hand-written CSS, so this page cannot drift from the tokens. 247 tokens, two authored themes, 96 audited colour pairings.
#003d29 fills the one CTA per screen the user cannot undo. 12.36:1.
#108910 means fresh, in stock, delivered — and fills the ADD button pressed forty times a screen.
#ffdc23 is 1.33:1 on white. It carries offers and never renders text, an icon, or a focus ring.
The page is white and cards carry no border — elevation lifts them off it. Borders now do one job: dividing things inside a surface.
Inventory
Generated from inventory.json, and the build fails if any component here has no markup in the page. Completeness is checked mechanically, not eyeballed — a checklist that can drift from the thing it checks is decoration.
Brand marks
Two lockups received, a third derived. The mark carries its own dark-green tile, which makes it unusually robust; the horizontal lockup had a real dark-mode gap, now closed. The lockup above swaps with the theme — toggle it and watch the word "Shift".
On every ground it has to survive
Foundations
Six ramps, twelve steps, one contract. Step 9 is always the solid fill, 11 always low-contrast text, 12 always high-contrast text — in every ramp and both themes. ● marks a locked brand hex sitting at its natural position rather than being approximated.
Type roles
Fredoka throughout. Composite roles — never compose a size and weight by hand.
Spacing, radius, elevation
Iconography
Phosphor, Regular weight, on a 24×24 grid. Fill weight is reserved for the selected state of a navigation item — never for emphasis.
Breakpoints, focus, opacity
Motion
The three CTAs
Three domains, not three emphasis levels. Which one you reach for is decided by what the action is about, not by how important it feels. Hover, press and focus each button — every state is live.
The money path. Place order, Pay, Checkout. One per screen, and it is the action the user cannot undo.
The catalogue path. ADD, quantity, Add to cart, Apply. Pressed forty times a screen, always reversible. Identical in both themes.
Everything not about buying food. Sign in, Apply filters, Settings, Track order, and any action sitting on a green or photographic surface.
Variants — the second axis
Gradients
Brand surfaces built from real photography rather than CSS. Farm-to-plate is the message, and the colour is the brand's own because every source is verified against it. Eight to choose from — switch between them below.
The risk with photographic brand surfaces is drift: a stock photo that looks fine and is quietly off-palette. Both properties that matter are measured by npm run gradients, not judged by eye. Five of fifteen candidates were rejected — corn and orchard fruit both drifted warm toward orange, which is the warning colour in this system.
| gradient | white text | use |
|---|---|---|
| citrus | 4.98:1 | Lemon and limes on wet grass. The only source carrying real yellow — reach for it when the surface has to feel like the brand rather than just green. |
| lime | 6.7:1 | Cooler, greener cut of the same shoot. Better under long headlines. |
| greens | 7.6:1 | Leafy greens overhead. 100% in-palette and the safest of the set. |
| canopy | 7.38:1 | Softest falloff. Good behind dense text. |
| herbs | 5.07:1 | Basil and mint. Warmest of the greens. |
| garden | 6.78:1 | Deeper, more shadowed. Highest contrast headroom in the set. |
| peas | 5.74:1 | Pea pods. The brightest mid-green. |
| brassica | 5.64:1 | Broccoli and kale. The darkest, and the one to use when a CTA has to dominate. |
Sound
Seven cues, off by default. Turn them on with the switch below, then use the real controls in Atoms and Domain — the point is to hear tick against remove on the same button, which is the one place sound is genuinely load-bearing.
Each of these was asked for. None survived the test: name the uncertainty this resolves for the user, or it is decoration.
Motion
Every token below is running live. Press the buttons — the point of a motion spec is that you can feel the difference between 120ms and 320ms, which no table will tell you.
Atoms
3 items in the cart.
Substitutions are picked by your shopper and always cost the same or less. You can set a preference per item before the shop starts, or leave it to us — the refund policy covers anything you don’t want.
Delivered to Cedar Park in 11 minutes.
Your shopper picks the ripest produce and texts you if anything looks off.
Sold by weight. Final price adjusts after the shopper weighs it.
Fresh in 11 minutes
Produce & herbs
Your usual, back in stock
Delivery window
Weekend restock
18 items from your last four orders
Dairy & eggs
Horizon Organic Whole Milk, Vital Farms Pasture-Raised Eggs, Tillamook Medium Cheddar
Every cart line carries a substitution_policy of
"closest_match", "same_brand" or
"refund". Read it back from
GET /v1/carts/:id.
POST /v1/carts/8412/items
{
"sku": "PRD-BANANA-ORG",
"qty": 3,
"unit": "lb",
"substitution_policy": "closest_match"
}
Molecules
- Cart12 items , completed
- Address418 Larkin St , completed
- 3 SlotPick a window
- 4 Payment$86.14
- Cart, completed
- Address, completed
- Slot, completed
- 4 PaymentVisa ···· 4412
- Cart12 items · $86.14 , completed
- Address418 Larkin St, Apt 6 , completed
- 3 SlotToday, 6:00–7:00 PM
- 4 PaymentNot started
- Delivered to 418 Larkin St
- Order placed
- Substitution approved — Oatly for Silk
- Slot updated
- Previous order from Fairview Market
Organisms
The whole frame: top nav, an optional side nav, the scrolling content column, and a sticky bottom bar. Widen the window past 1056px and the side nav appears, the sticky bar retires, and the cart button opens a SideDrawer instead of a BottomSheet.
- Strawberries, 1 lbDriscoll's · $5.49$10.98
- Whole Milk, 1 gallonClover Sonoma · $4.29$4.29
- Sourdough BouleOut of stock · we will refund $5.99Unavailable
Two 1 lb packages leave your cart. Your 4:00–5:00 PM window is unaffected.
Country White Boule from the same bakery is in stock at $5.49. Swap it in, or we refund the $5.99 when your driver checks out.
Nothing run yet.
Try a brand, a department, or “reorder”.
| Order | Placed | Items | Window | Total | Status |
|---|---|---|---|---|---|
| #SC-40182 | Aug 26, 2026 | 14 | 4:00–5:00 PM | $86.42 | Delivered |
| #SC-39905 | Aug 20, 2026 | 9 | 11:00 AM–noon | $52.10 | Delivered |
| #SC-39644 | Aug 13, 2026 | 22 | 6:00–7:00 PM | $134.77 | 2 refunded |
| #SC-39310 | Aug 6, 2026 | 11 | 4:00–5:00 PM | $61.05 | Cancelled |
| Bananas, per lb | Produce | 412 | $0.69 | In stock | |
| Cage-Free Large Eggs, dozen | Dairy | 38 | $6.49 | Low | |
| Extra Virgin Olive Oil, 500 ml | Pantry | 126 | $12.99 | In stock | |
| Sourdough Boule | Bakery | 0 | $5.99 | Out | |
| Whole Milk, 1 gallon | Dairy | 74 | $4.29 | In stock | |
| Wild Sockeye Salmon, per lb | Seafood | 9 | $18.99 | Low |
-
Honeycrisp Apples, per lb$4.49 / lb · $8.982
-
Whole Milk, 1 gallon$4.29 each · $4.291
-
Sharp Cheddar Block, 8 oz$6.79 each · $20.373
Tab into the toolbar, then use ← → to move between controls.
Delivery date: Saturday, August 29
-
delivered-box-front.jpg2.4 MB · uploading 64%
-
receipt-slip.png840 KB · attached
-
order-notes.pdfPDF is not accepted. Attach a JPG or PNG photo instead.
Nothing added yet.
- Whole Milk, 1 gallon $4.29
- Oat Milk, 64 oz $4.99
- Almond Milk, unsweetened $3.79
Check the spelling, or search the Pantry department.
Layout primitives
One axis, one gap. Vertical by default, horizontal with .lay-row.
Four column counts, four breakpoints, and nothing in between. Resize the window — the readout and the highlighted row below are live.
A band of content with the same space above and below it. Rhythm is one decision made once, not two paddings agreed on per screen.
Caps the measure. sm 100% · md 640px · lg 1024px · xl 1440px, straight from the container.* tokens.
Reserves the box before the image arrives, so nothing below it jumps when the photo loads.
Drag it, or focus it and press the arrow keys. Home and End jump to the limits.
ShiftCart domain
No card, no border, no shadow, no padding. The 1:1 image well is the only shape the tile has and the grid gap does the separating.
Roma Tomatoes, Vine-Ripened
Hass Avocados, Ripe
Boneless Skinless Chicken Thighs
The most-pressed control in the product. Both of its buttons work below.
Tabular numerals, one weight, no colour doing work that weight can do.
One choice, always one selected. Pick a different slot below — the selection and the summary both move.
The yellow treatment. #ffdc23 is 1.33:1 on white, so it is a fill and nothing else. The badge is a hard-edged rectangle with no stroke — which means the surface beneath it is the only thing giving it a boundary, so it must sit on surface.sunken or surface.subtle, never on white.
Blueberries, Driscoll's
Illustration
Three tiers, one locked palette, five shipped images. The tiers are genuinely different systems rather than three sizes of the same thing, which is why mixing them is the fastest way to make one product look like three.
| Tier | What it is | Outline | Colour | Ships at | Used for |
|---|---|---|---|---|---|
| A — pictorial icon | One object, geometric, chunky. Detail is cut out as negative space, never drawn on top. | None. Shapes read by fill alone | Exactly 3: ink, green, cream. Never an accent | 32–64px, square | Category marks, feature bullets, offer tiles |
| B — spot illustration | One or two objects, often held by a hand, on a rounded-rect colour panel. | Yes. Heavy ink, rounded caps | Ink, green, cream + at most 3 accents | 160–240px wide, 4:3 or 1:1 | Empty states, inline explainers, onboarding steps |
| C — scene | People, a room, a moment. Cream ground with one solid green floor line. | Yes. Heavy ink, rounded caps | Full accent palette, cream ground | 280–420px wide, 16:9 or 3:2 | Onboarding heroes, first run, marketing |
The locked palette — and why it is not the token set
These eleven hexes are the illustration palette. They are a deliberate superset of the product UI palette and they are not tokens, on purpose: illustration is where the brand is allowed to be loud, and the working UI is where it stays quiet. Every swatch below therefore carries the tokens-ok escape hatch in the stylesheet, with a written reason, because a raw hex in this system is otherwise a lint failure.
Illustrations are never recoloured for dark mode
Every illustration is decorative — delete it and nothing is lost
Each image carries alt="" and aria-hidden="true", so a screen reader never reaches it. That is only honest if the heading and body already carry the whole message. Left is the state as it ships; right is the identical markup with the <img> element removed. If the right column ever stops making sense, the copy is wrong, not the image.
As it ships
Your cart is empty
Add a few things and we’ll have them to you in 11 minutes.
With the image deleted
Your cart is empty
Add a few things and we’ll have them to you in 11 minutes.
Your cart is empty
Add a few things and we’ll have them to you in 11 minutes.
Alternate take, not shipped. Both are on-palette; the chosen one keeps the basket weave reading as weave at 200px. Neither is tipped on its side as the subject line asks — an upright empty basket still reads as empty, so it shipped.
No orders yet
Most first deliveries arrive within 30 minutes of checkout.
Alternate take, not shipped.
No results for “aubergene”
Try “aubergine”, or browse Produce.
Alternate take, not shipped.
We don’t deliver to 94110 yet
We’re adding new ZIP codes every month. We’ll email you the day 94110 is one of them.
Alternate take, not shipped.
Your bank declined the payment
Try another card, or use Apple Pay. Nothing was charged.
Alternate take, not shipped.
Composed pages
Buy it again
From your order on August 19
Roma Tomatoes, Vine-Ripened
Boneless Skinless Chicken Thighs
Organic Whole Milk
Blueberries, Driscoll's
Pasture-Raised Large Eggs, Grade A
Sourdough Boule, Fresh Baked
Hass Avocados, Ripe
Sharp Cheddar, Block
If something is out of stock
Marisol will follow this for every item in the order.
Card ending 4417 is charged when the order is delivered.
Your order
7 items · $43.17






