Files
WooNooW/STORE_UI_UX_GUIDE.md
Dwindi Ramadhana 9ac09582d2 feat: implement header/footer visibility controls for checkout and thankyou pages
- Created LayoutWrapper component to conditionally render header/footer based on route
- Created MinimalHeader component (logo only)
- Created MinimalFooter component (trust badges + policy links)
- Created usePageVisibility hook to get visibility settings per page
- Wrapped ClassicLayout with LayoutWrapper for conditional rendering
- Header/footer visibility now controlled directly in React SPA
- Settings: show/minimal/hide for both header and footer
- Background color support for checkout and thankyou pages
2025-12-25 22:20:48 +07:00

15 KiB

WooNooW Store UI/UX Guide

Official Design System & Standards

Version: 1.0
Last Updated: November 26, 2025
Status: Living Document (Updated by conversation)


📋 Purpose

This document serves as the single source of truth for all UI/UX decisions in WooNooW Customer SPA. All design and implementation decisions should reference this guide.

Philosophy: Pragmatic, not dogmatic. Follow convention when strong, follow research when clear, use hybrid when beneficial.


🎯 Core Principles

  1. Convention Over Innovation - Users expect familiar patterns
  2. Research-Backed Decisions - When convention is weak or wrong
  3. Mobile-First Approach - Design for mobile, enhance for desktop
  4. Performance Matters - Fast > Feature-rich
  5. Accessibility Always - WCAG 2.1 AA minimum

📐 Layout Standards

Container Widths

Mobile:    100% (with padding)
Tablet:    768px max-width
Desktop:   1200px max-width
Wide:      1400px max-width

Spacing Scale

xs:  0.25rem (4px)
sm:  0.5rem  (8px)
md:  1rem    (16px)
lg:  1.5rem  (24px)
xl:  2rem    (32px)
2xl: 3rem    (48px)

Breakpoints

sm:  640px
md:  768px
lg:  1024px
xl:  1280px
2xl: 1536px

🎨 Typography

Hierarchy

H1 (Product Title):     28-32px, bold
H2 (Section Title):     24-28px, bold
H3 (Subsection):        20-24px, semibold
Price (Primary):        24-28px, bold
Price (Sale):           24-28px, bold, red
Price (Regular):        18-20px, line-through, gray
Body:                   16px, regular
Small:                  14px, regular
Tiny:                   12px, regular

Font Stack

font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 
             Roboto, Oxygen, Ubuntu, Cantarell, sans-serif;

Rules

  • Title > Price in hierarchy (we're not a marketplace)
  • Use weight and color for emphasis, not just size
  • Line height: 1.5 for body, 1.2 for headings
  • Don't use more than 3 font sizes per section

🖼️ Product Page Standards

Desktop:

Layout:
┌─────────────────────────────────────┐
│        [Main Image]                 │
│        (Large, square)              │
└─────────────────────────────────────┘
[▭] [▭] [▭] [▭] [▭] ← Thumbnails (96-112px)

Rules:

  • Thumbnails: 96-112px (24-28 in Tailwind)
  • Horizontal scrollable if >4 images
  • Active thumbnail: Primary border + ring
  • Main image: object-contain with padding
  • Click thumbnail → change main image
  • Click main image → fullscreen lightbox

Mobile:

Layout:
┌─────────────────────────────────────┐
│        [Main Image]                 │
│        (Full width, square)         │
│         ● ○ ○ ○ ○                   │
└─────────────────────────────────────┘

Rules:

  • Dots only (NO thumbnails)
  • Swipe gesture for navigation
  • Dots: 8-10px, centered below image
  • Active dot: Primary color, larger
  • Image counter optional (e.g., "1/5")
  • NO thumbnails (redundant with dots)

Rationale: Convention (Amazon, Tokopedia, Shopify all use dots only on mobile)


Variation Selectors

Pattern: Pills/Buttons (NOT Dropdowns)

Color Variations:

[⬜ White] [⬛ Black] [🔴 Red] [🔵 Blue]

Size/Text Variations:

[36] [37] [38] [39] [40] [41]

Rules:

  • All options visible at once
  • Pills: min 44x44px (touch target)
  • Active state: Primary background + white text
  • Hover state: Border color change
  • Disabled state: Gray + opacity 50%
  • NO dropdowns (hides options, poor UX)

Rationale: Convention + Research align (Nielsen Norman Group)


Product Information Sections

Pattern: Vertical Accordions

Desktop & Mobile:

┌─────────────────────────────────────┐
│ ▼ Product Description               │ ← Auto-expanded
│   Full description text...          │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ ▶ Specifications                    │ ← Collapsed
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ ▶ Customer Reviews                  │ ← Collapsed
└─────────────────────────────────────┘

Rules:

  • Description: Auto-expanded on load
  • Other sections: Collapsed by default
  • Arrow icon: Rotates on expand/collapse
  • Smooth animation: 200-300ms
  • Full-width clickable header
  • NO horizontal tabs (27% overlook rate)

Rationale: Research (Baymard: vertical > horizontal)


Specifications Table

Pattern: Scannable Two-Column Table

┌─────────────────────────────────────┐
│ Material      │ 100% Cotton         │
│ Weight        │ 250g                │
│ Color         │ Black, White, Gray  │
│ Size          │ S, M, L, XL         │
└─────────────────────────────────────┘

Rules:

  • Label column: 33% width, bold, gray background
  • Value column: 67% width, regular weight
  • Padding: py-4 px-6
  • Border: Bottom border on each row
  • Last row: No border
  • NO plain table (hard to scan)

Rationale: Research (scannable > plain)


Buy Section

Desktop & Mobile:

Structure:

1. Product Title (H1)
2. Price (prominent, but not overwhelming)
3. Stock Status (badge with icon)
4. Short Description (if exists)
5. Variation Selectors (pills)
6. Quantity Selector (large buttons)
7. Add to Cart (prominent CTA)
8. Wishlist Button (secondary)
9. Trust Badges (shipping, returns, secure)
10. Product Meta (SKU, categories)

Price Display:

<!-- On Sale -->
<div>
  <span class="text-2xl font-bold text-red-600">$79.00</span>
  <span class="text-lg text-gray-400 line-through">$99.00</span>
  <span class="bg-red-600 text-white px-3 py-1 rounded">SAVE 20%</span>
</div>

<!-- Regular -->
<span class="text-2xl font-bold">$99.00</span>

Stock Status:

<!-- In Stock -->
<div class="bg-green-50 text-green-700 px-4 py-2.5 rounded-lg border border-green-200">
  <svg></svg>
  <span>In Stock - Ships Today</span>
</div>

<!-- Out of Stock -->
<div class="bg-red-50 text-red-700 px-4 py-2.5 rounded-lg border border-red-200">
  <svg></svg>
  <span>Out of Stock</span>
</div>

Add to Cart Button:

<!-- Desktop & Mobile -->
<button class="w-full h-14 text-lg font-bold bg-primary text-white rounded-lg shadow-lg hover:shadow-xl">
  <ShoppingCart /> Add to Cart
</button>

Trust Badges:

<div class="space-y-3 border-t-2 pt-4">
  <!-- Free Shipping -->
  <div class="flex items-center gap-3">
    <svg class="w-6 h-6 text-green-600">🚚</svg>
    <div>
      <p class="font-semibold">Free Shipping</p>
      <p class="text-xs text-gray-600">On orders over $50</p>
    </div>
  </div>
  
  <!-- Returns -->
  <div class="flex items-center gap-3">
    <svg class="w-6 h-6 text-blue-600"></svg>
    <div>
      <p class="font-semibold">30-Day Returns</p>
      <p class="text-xs text-gray-600">Money-back guarantee</p>
    </div>
  </div>
  
  <!-- Secure -->
  <div class="flex items-center gap-3">
    <svg class="w-6 h-6 text-gray-700">🔒</svg>
    <div>
      <p class="font-semibold">Secure Checkout</p>
      <p class="text-xs text-gray-600">SSL encrypted payment</p>
    </div>
  </div>
</div>

Mobile-Specific Patterns

Sticky Bottom Bar (Optional - Future Enhancement)

┌─────────────────────────────────────┐
│ $79.00          [Add to Cart]       │
└─────────────────────────────────────┘

Rules:

  • Fixed at bottom on scroll
  • Shows price + CTA
  • Appears after scrolling past buy section
  • z-index: 50 (above content)
  • Shadow for depth

Rationale: Convention (Tokopedia does this)


🎨 Color System

Primary Colors

Primary:        #222222 (dark gray/black)
Primary Hover:  #000000
Primary Light:  #F5F5F5

Semantic Colors

Success:        #10B981 (green)
Error:          #EF4444 (red)
Warning:        #F59E0B (orange)
Info:           #3B82F6 (blue)

Sale/Discount

Sale Price:     #DC2626 (red-600)
Sale Badge:     #DC2626 bg, white text
Savings:        #DC2626 text

Stock Status

In Stock:       #10B981 (green-600)
Low Stock:      #F59E0B (orange-500)
Out of Stock:   #EF4444 (red-500)

Neutral Scale

Gray 50:   #F9FAFB
Gray 100:  #F3F4F6
Gray 200:  #E5E7EB
Gray 300:  #D1D5DB
Gray 400:  #9CA3AF
Gray 500:  #6B7280
Gray 600:  #4B5563
Gray 700:  #374151
Gray 800:  #1F2937
Gray 900:  #111827

🔘 Interactive Elements

Buttons

Primary CTA:

Height:         h-14 (56px)
Padding:        px-6
Font:           text-lg font-bold
Border Radius:  rounded-lg
Shadow:         shadow-lg hover:shadow-xl

Secondary:

Height:         h-12 (48px)
Padding:        px-4
Font:           text-base font-semibold
Border:         border-2

Quantity Buttons:

Size:           44x44px minimum (touch target)
Border:         border-2
Icon:           Plus/Minus (20px)

Touch Targets

Minimum Sizes:

Mobile:   44x44px (WCAG AAA)
Desktop:  40x40px (acceptable)

Rules:

  • All interactive elements: min 44x44px on mobile
  • Adequate spacing between targets (8px min)
  • Visual feedback on tap/click
  • Disabled state clearly indicated

🖼️ Images

Product Images

Main Image:

Aspect Ratio:   1:1 (square)
Object Fit:     object-contain (shows full product)
Padding:        p-4 (breathing room)
Background:     white or light gray
Border:         border-2 border-gray-200
Shadow:         shadow-lg

Thumbnails:

Desktop:        96-112px (w-24 md:w-28)
Mobile:         N/A (use dots)
Aspect Ratio:   1:1
Object Fit:     object-cover
Border:         border-2
Active:         border-primary ring-4 ring-primary

Rules:

  • Always use !h-full to override WooCommerce styles
  • Lazy loading for performance
  • Alt text for accessibility
  • WebP format when possible
  • Never use object-cover for main image (crops product)

📱 Responsive Behavior

Grid Layout

Product Page:

Mobile:    grid-cols-1 (single column)
Desktop:   grid-cols-2 (image | info)
Gap:       gap-8 lg:gap-12

Desktop:

  • Thumbnails: Horizontal scroll if >4 images
  • Arrows: Show when >4 images
  • Layout: Main image + thumbnail strip below

Mobile:

  • Dots: Always visible
  • Swipe: Primary interaction
  • Counter: Optional (e.g., "1/5")

Typography

Responsive Sizes:

Title:   text-2xl md:text-3xl
Price:   text-2xl md:text-2xl (same)
Body:    text-base (16px, no change)
Small:   text-sm md:text-sm (same)

Accessibility

WCAG 2.1 AA Requirements

Color Contrast:

  • Text: 4.5:1 minimum
  • Large text (18px+): 3:1 minimum
  • Interactive elements: 3:1 minimum

Keyboard Navigation:

  • All interactive elements focusable
  • Visible focus indicators
  • Logical tab order
  • Skip links for main content

Screen Readers:

  • Semantic HTML (h1, h2, nav, main, etc.)
  • Alt text for images
  • ARIA labels for icons
  • Live regions for dynamic content

Touch Targets:

  • Minimum 44x44px on mobile
  • Adequate spacing (8px min)

🚀 Performance

Loading Strategy

Critical:

  • Hero image (main product image)
  • Product title, price, CTA
  • Variation selectors

Deferred:

  • Thumbnails (lazy load)
  • Description content
  • Reviews section
  • Related products

Rules:

  • Lazy load images below fold
  • Skeleton loading states
  • Optimize images (WebP, compression)
  • Code splitting for routes
  • No layout shift (reserve space)

📋 Component Checklist

Product Page Must-Haves

Above the Fold:

  • Breadcrumb navigation
  • Product title (H1)
  • Price display (with sale if applicable)
  • Stock status badge
  • Main product image
  • Image navigation (thumbnails/dots)
  • Variation selectors (pills)
  • Quantity selector
  • Add to Cart button
  • Trust badges

Below the Fold:

  • Product description (auto-expanded)
  • Specifications table (collapsed)
  • Reviews section (collapsed)
  • Product meta (SKU, categories)
  • Related products (future)

Mobile Specific:

  • Dots for image navigation
  • Large touch targets (44x44px)
  • Responsive text sizes
  • Collapsible sections
  • Optional: Sticky bottom bar

Desktop Specific:

  • Thumbnails for image navigation
  • Hover states
  • Larger layout (2-column grid)

🎯 Decision Log

  • Decision: Dots only on mobile, thumbnails on desktop
  • Rationale: Convention (Amazon, Tokopedia, Shopify)
  • Date: Nov 26, 2025

Variation Selectors

  • Decision: Pills/buttons, not dropdowns
  • Rationale: Convention + Research align (NN/g)
  • Date: Nov 26, 2025

Typography Hierarchy

  • Decision: Title > Price (28-32px > 24-28px)
  • Rationale: Context (we're not a marketplace)
  • Date: Nov 26, 2025

Description Pattern

  • Decision: Auto-expanded accordion
  • Rationale: Research (don't hide primary content)
  • Date: Nov 26, 2025

Tabs vs Accordions

  • Decision: Vertical accordions, not horizontal tabs
  • Rationale: Research (27% overlook tabs)
  • Date: Nov 26, 2025

📚 References

Research Sources

  • Baymard Institute UX Research
  • Nielsen Norman Group Guidelines
  • WCAG 2.1 Accessibility Standards

Convention Sources

  • Amazon (marketplace reference)
  • Tokopedia (marketplace reference)
  • Shopify (e-commerce reference)

🔄 Version History

v1.0 - Nov 26, 2025

  • Initial guide created
  • Product page standards defined
  • Decision framework established

Status: Active
Maintenance: Updated by conversation
Owner: WooNooW Development Team