Travelpro.com auditby Corey Frons
Developer handoff

Specs for a Shopify theme team

Everything needed to build the concept as theme section and block changes — no new apps. Tokens extend the live site's own palette and type; each section lists layout, data sources, states, edge cases and accessibility.

Design tokens

Live palette plus four additions

Read from travelpro.com's CSS: cream page #FDFCF6, brand brown #675144, "Travelpro Display" serif over "Travelpro Inter". New: sale red, success green, hero burgundy, deep brown.

TokenValueUseContrast
color.bg#FDFCF6Page—
color.surface#F4EFE6Image wells, cards—
color.band#EFE7DATop bar, footer, help panel—
color.text#1C1A17Body, product names17:1 on bg
color.text-muted#5F5850Secondary text6.8:1 on bg
color.brand#675144Primary buttons, logo7.4:1 white on brand
color.hero (new)#5E1620Promo hero12.7:1 cream on hero
color.sale (new)#A3122ASale prices and badges only7.7:1 on bg
color.success (new)#2E6B3ADelivery dates6.2:1 on bg
type.displaySerif 600 · 56 / 40 / 30 pxHero, section titles—
type.bodySans 400–700 · 15 px base, 13 px minEverything else—
radius4 / 6 / 8 px · pillButtons / cards / panels · search, chips—
space8, 12, 16, 24, 32, 56Gaps and section padding—
target44 × 44 px minimumEvery tap target—
Components

Five pieces do most of the work

Button

Primary (brand fill, 48–56 px) for one main action per view; Secondary (1.5 px brand outline) for "Add both"; On-dark inside the hero. Hover darkens 8%. Focus keeps the live 2 px #236192 outline. Loading: "Adding…", width locked, aria-busy.

Swatch picker

A radio group: 44 px circles, selected ring 2 px #1C1A17, name in the legend ("Color: Bordeaux"). Limited editions sit behind a "+3 limited editions" link in the same group. Arrow keys move, Space selects.

Product card

Image well, optional "Save $X" badge (only when compare-at > price), up to 4 decorative dots + "+N", sentence-case name as H3, "★ 4.6 · 1,560 reviews", price with struck regular price.

Proof strip

Four verified claims — 220,000+ aviation pros, Built for a Lifetime warranty, 100-day guarantee, Wirecutter 2026 — icon + bold claim + one muted line; 4 across, 2 × 2 on phones.

Purchase bar (phone)

Pinned to the bottom: free-delivery date (max 40 characters) + Add to cart with price. A labeled region; page reserves bottom padding so it never covers content; hides while the keyboard is open.

Homepage

Shopping within the first phone screen

SectionDesktopPhoneData
Hero50/50 copy and art, one offer, no auto-rotationCard ≤ 220 px tallTheme section
Proof strip4 across2 × 2 tiles4 blocks, verified claims only
Shop by type5 tiles, auto-fit, min 190 pxHorizontal chip row (scrolls)Menu "Shop by type"
Not sure which bag?Title + 3 link cards2 stacked link cards3 blocks
Best sellers4-column grid2-column gridFirst 4 in-stock products; fill from New arrivals
Our storyCopy + 4 stat tilesCopy onlyEditable text, no counters
SignupFooter formInline card after Best sellers; never a full-screen overlayExisting email platform form

States: signup success "You're in. Check your inbox for 10% off." · invalid "Enter an email like name@example.com." (keeps the text) · already subscribed "You're already on the list". Best-seller images use fixed 1:1.2 wells so nothing shifts while loading. One H2 per section; product names as H3; card dots decorative.

Product page · phone

Decide, then add — without scrolling

OrderBlockSpecData
1Gallery240 px, swipe, "1 / 8"Variant images
2Name, price, ratingH1 22 px; price 22 px 700; rating links to reviewsProduct
3ColorSwatch picker; first screenVariant option + limited-color metafield
4Size3-column 46 px buttons; fit lineLinked products; keep color on navigate
5Purchase barPinned; free-delivery date + Add to cart · priceSame estimate source as checkout
6Warranty cardName + one-line summary + "What's covered"Collection metafield — never hard-code "lifetime"
7Size and weight3 rows, in/lb with cm/kg toggle; hide if missingProduct metafields
8Will it fit?Airline picker → "Fits United's limit" / "Over by 0.5 in"Airline Size Limits guide data
9Features · Q&A · ReviewsAccordions, one open at a timeDescription, current apps
10Complete the set2-up, "Add both · $total" in one requestComplementary recommendations
ElementStateBehavior
Add to cartLoading"Adding…", width locked, disabled, aria-busy="true"
Add to cartSuccessCart drawer opens; focus to its heading
Add to cartError"Couldn't add to cart. Check your connection and try again." under the button
Add to cartSold out"Sold out — get an email when it's back", secondary style
SwatchUnavailableDiagonal line; still focusable; announced "unavailable"
Set builderLoadingReserve 320 px; load after main content; no skeleton above the fold
Interaction speedSwatch or size tapNext paint under 200 ms (today 255 ms) — defer third-party scripts
Product page · desktop

One column of decisions, top to bottom

Container 1280 px. Gallery flex: 999 1 560px (2 × 2 images, "View all 8 photos" opens a dialog viewer) and buy box flex: 1 1 380px, sticky at 96 px until the gallery ends. Buy box order: breadcrumb → eyebrow (collection · material · award) → H1 → price + rating → Shop Pay line → color → size + "Compare sizes" → delivery line → Add to cart (56 px, carries the price) → warranty card → returns and shipping tiles → "Best for".

States: color change updates ?variant=, images, price and availability without reload · size change navigates and keeps color · ZIP edit inline, invalid → "Enter a 5-digit ZIP code." · under 3 reviews hide the average and show "Be the first to review". Edge cases: variant without images falls back with "Shown in True Navy"; missing dimensions hide the block; one-size products hide the size group.