Storefront Design / Professionalism Audit - 2026-06-07
Multi-agent design audit of the customer storefront (
frontstore/, Nuxt 4 + Tailwind). Trigger: owner feedback - “all features work but the design looks basic / not professional.” Method: 6 specialist agents (one per page-group + design system) + 1 synthesis pass. All 38 pages + global shell + design system reviewed. Benchmark feel: Myntra, Vistaprint, Moo, Shopify premium themes, Stripe-grade polish.
Root cause - why it reads as “basic”
Not one bad page - all six areas scored 4–6/10 for the same four compounding reasons:
- Depth is flat. Almost everything sits on
shadow-sm+border-gray-100→ the whole site looks like one flat sheet. Premium shops earn their feel through elevation hierarchy + hover-lift. Biggest single gap. - Weak type hierarchy. Headings/body/labels too close in size+weight. Labels are
text-xs font-medium text-gray-600everywhere (they vanish); hero jumpstext-sm→text-7xl. - Design system broken at the consumption layer.
storefront.csshas a good token system, but 53 blocks ignore it: 257 hardcoded paddings, 92 inlinerounded-*, 7 competing shadow conventions, raw<button>instead ofAppButton. Feels like 20 designs stitched together. - Arbitrary spacing. Section padding
py-8→py-20, no rhythm.
Implication: fix depth + type + component consistency systemically and every page lifts at once - no need to redesign 38 pages.
Per-area scorecard
| Area | Score | Verdict |
|---|---|---|
| Design system (tokens/primitives) | 4/10 | Great token foundation, but blocks ignore it - root cause of everything else |
| Homepage & global shell | 5/10 | Cramped header, flat hero with no depth, arbitrary section rhythm, dense footer |
| Content/marketing & forms | 5/10 | Bare unstyled blog/CMS prose, raw-Tailwind 404/maintenance, inconsistent fields |
| Product discovery & detail | 6/10 | Good bones; fragmented hover/quick-view, mixed glassmorphism, one-off filter/sort |
| Conversion funnel (cart/checkout) | 6/10 | Complete but weak depth; order summary cramped, success page under-celebrated |
| Login & account | 6/10 | Works but minimal - flat cards, scattered inline badges, admin-style tables |
Top 10 highest-impact changes (impact ÷ effort, systemic first)
- Extend Tailwind with
shadow-theme-*+rounded-card/button/inpututilities, then enforce ONE shadow/radius system.frontstore/nuxt.config.tsTailwindextend, then sweepapp/components/storefront/blocks/*. Add a CI grep guard. Biggest lever. (hours)extend: { boxShadow: { 'theme-sm': 'var(--theme-shadow-sm)', 'theme-md': 'var(--theme-shadow-md)', 'theme-lg': 'var(--theme-shadow-lg)' }, borderRadius: { card: 'var(--theme-card-radius)', button: 'var(--theme-button-radius)', input: 'var(--theme-input-radius)' }, } - Real type scale + label standard.
--text-h1/h2/bodytokens; headingsfont-bold, labels →text-sm font-semibold text-gray-900with styled required*; heroleading-[1.1] tracking-tight. (low) - Card elevation + hover-lift everywhere. Resting
shadow-theme-sm border border-gray-100, interactivehover:shadow-theme-lg hover:-translate-y-1 transition-all duration-200; accent/active cardsshadow-theme-lg. Make blocks useAppCard(currently used in 0 blocks). (medium) - Install
@tailwindcss/typography+ style.prose. Fixes all blog/CMS pages (blog/[slug].vue,[slug].vue).max-width: 65ch, heading contrast,line-height:1.75. (~1 hr, 80% fix from one package) - Migrate blocks to
AppButton/AppInput- kill raw inline buttons. StartFormBlock,DynamicFormBlock,ProductGridBlock,PageHeaderBlock,BestSellersBlock. Core consistency fix. (medium, incremental) - Redesign the hero (
HeroBlock.vue) - text-shadow, replace busyping+pulsebadge with one scale-pulse, visible bordered nav arrows, subtle gradient backdrop instead of flat#f8f8f8, CTAshadow-theme-lg hover:scale-105. (hours) - One
StatusBadge.vue(app/components/storefront/ui/) driven bystatusColorutil - replaces hand-rolled status colors acrossprofile/index.vue,profile/orders/*,profile/quotes/*, track-order. (~0.5 day) - Upgrade checkout Order Summary + step indicators (
CheckoutSummary.vue,CheckoutSectionCard.vue,cart.vue) - totaltext-2xl→text-3xl, roomier padding, subtle gradient, active stepw-10→w-12+shadow-theme-lg, completed steps green, animated connector. (hours) - Standardize section rhythm - all major sections
py-12 md:py-16, consistentpx-4 md:px-6 lg:px-8. Define--section-spacing-*tokens. (low, mechanical) - Polish empty states + input focus states globally - empty-state icon circles
bg-gradient-to-br from-primary-50 to-primary-100+ encouraging copy + CTA; all inputsfocus:ring-2 focus:ring-primary-500 transition-all, darken leading icons totext-gray-500; migrate login/signup raw<input>toBaseInput. (low-medium)
Quick wins (this week - mostly minutes each)
- Tailwind
shadow-theme-*+rounded-card/button/inpututilities (#1 foundation) - 20 min. @tailwindcss/typography+ base.prose- 1 hr; fixes all blog/CMS.- Hero text-shadow + replace
pingbadge + visible nav arrows - 30 min. - Form labels
text-xs font-medium→text-sm font-semibold text-gray-900+ styled required*(login, profile, checkout, contact, quote). focus:ring-2 focus:ring-primary-500 transition-allon everyBaseInput; leading icons →text-gray-500.- Card hover-lift on product/profile-stat/contact/blog/address cards.
- Category card lift
-translate-y-1→-translate-y-3, zoom700ms→500ms(ShopByCategoryBlock). - CheckoutSummary padding/total bump; active step
w-10→w-12+shadow-theme-lg. - Order-success headline → green gradient
bg-clip-text; hero iconw-28→w-32+shadow-theme-lg. - Promo bar →
bg-primary-600 text-white; section paddingpy-12 md:py-16. - Table row hover
hover:bg-primary-50/30+ uppercase tracked headers (profile orders/quotes). - Fix
BaseSelect.vue:6hardcodedborder-gray-200→ token; replacebg-primary/10opacity hacks with--theme-primary-backgroundtoken. - Replace one-off review “View product”
BaseButton !px-0hack with.theme-link.
Strategic upgrades (premium tier)
- Execute
DESIGN_SYSTEM_STANDARDIZATION_PLAN.mdPhases 0–2 (drafted, never started): codify “blocks must use App*/Base* primitives” incopilot-instructions.md, add CI grep guards, build/pages/dev/design-system.vuepreview, migrate top 5–10 blocks. Cure for the “20 designs” problem. (~2 wks) - Semantic color + type vocabulary layer - promote
.text-secondary/.text-muted/.bg-surface-soft/.text-h1/.text-bodyto first-class utilities; sweep blocks off rawtext-gray-700/text-sm. (~30 hrs) - Refactor Aurora theme to token-only - strip ~4000 lines of selector overrides to ~50 lines of
:rootvars; future themes become an afternoon. (~40 hrs) - Reusable component set -
StatusBadge,AppCard/GlassCard,ProductCardTitle,FilterCountBadge,PriceRangeInput,SortBySelect,ReviewCard,EmptyState,PremiumTable,AnimatedTabs. - Product card + PDP gallery hover/state overhaul - unify quick-view pill (→
AppButton), wishlist, card lift into one.product-card-hover; simplify gallery thumbnail state logic to a clean three-state machine. - Checkout depth + micro-interaction pass - layered shadows per section state, focus-ring animations,
active:scale-95, success-checkmark scale-in. - Skeleton parity - every skeleton mirrors its final card aspect-ratio to kill the load-time jump; standardize on
animate-shimmer. - Mobile premium pass - header
h-14→h-16/h-20, bottom navh-16→h-20+font-semibold, 44px min tap targets,backdrop-blur bg-white/95nav.
Related finding - perceived performance (logo-click lag)
Separate from visuals but the same theme (“finish the small interactions”). Clicking the logo feels dead for a moment because app/pages/index.vue:104-108 does a blocking top-level await (useAsyncData('homepage-data', …, { lazy: false }) + await Promise.all). On client-side navigation <NuxtPage> won’t swap pages until that fetch resolves, so the old page stays on screen with no feedback.
Fix: (1) make the homepage fetch lazy: true + render existing skeletons (app/components/storefront/skeletons); (2) add a global <NuxtLoadingIndicator> so every nav gives instant top-bar feedback; (3) sweep other pages (category, product, search) for the same lazy: false + top-level await pattern.
Source: workflow storefront-design-audit (run wf_9681fd8d-aec), 7 agents, 2026-06-07.