Initial commit
This commit is contained in:
@@ -0,0 +1,316 @@
|
||||
# Cart Page
|
||||
|
||||
## Contents
|
||||
|
||||
- [Overview](#overview)
|
||||
- [Layout Patterns](#layout-patterns)
|
||||
- [Cart Items Display](#cart-items-display)
|
||||
- [Quantity Updates](#quantity-updates)
|
||||
- [Order Summary](#order-summary)
|
||||
- [Promo Code Input](#promo-code-input)
|
||||
- [Checkout Button](#checkout-button)
|
||||
- [Empty Cart State](#empty-cart-state)
|
||||
- [Backend Integration](#backend-integration)
|
||||
- [Mobile Cart](#mobile-cart)
|
||||
- [Checklist](#checklist)
|
||||
|
||||
## Overview
|
||||
|
||||
The cart page displays all items a customer has added to their shopping cart. Purpose: Review items, modify cart, apply promotions, proceed to checkout. Critical conversion point.
|
||||
|
||||
**⚠️ CRITICAL: Always display variant details (size, color, material, etc.) for each cart item, not just product titles.**
|
||||
|
||||
### Key Ecommerce Functions
|
||||
|
||||
- Review items before purchase (reduces buyer's remorse)
|
||||
- Update quantities or remove items (cart management)
|
||||
- Apply promotional codes (increase order value)
|
||||
- View pricing breakdown (transparency builds trust)
|
||||
- Proceed to checkout (conversion path)
|
||||
- Continue shopping if needed (reduce abandonment)
|
||||
|
||||
## Layout Patterns
|
||||
|
||||
### Two-Column Pattern (Desktop)
|
||||
|
||||
**Most common:**
|
||||
- Left column (60-70%): Cart items list
|
||||
- Right column (30-40%): Order summary (sticky)
|
||||
- Below items: Promo code input, continue shopping
|
||||
- Order summary stays visible during scroll
|
||||
|
||||
### Mobile Layout
|
||||
|
||||
Single column (stacked):
|
||||
- Cart items
|
||||
- Order summary
|
||||
- Promo code input
|
||||
- Checkout button (sticky at bottom)
|
||||
- Continue shopping
|
||||
|
||||
## Cart Items Display
|
||||
|
||||
### Cart Item Card
|
||||
|
||||
**CRITICAL: Always display variant details for each cart item.**
|
||||
|
||||
Products with variants (size, color, material, style, etc.) must show the selected variant options. Without this, customers can't confirm they have the correct items in their cart.
|
||||
|
||||
**Essential information per item:**
|
||||
- Product image (thumbnail, 80-120px desktop, 60-80px mobile)
|
||||
- Product title (linked to product page)
|
||||
- **Variant details (REQUIRED)**: Size, color, material, or other variant options selected
|
||||
- Format: "Size: Large, Color: Black" or "Large / Black"
|
||||
- Display below title, smaller gray text
|
||||
- Show ALL selected variant options
|
||||
- Unit price
|
||||
- Quantity selector
|
||||
- Line total (unit price × quantity)
|
||||
- Remove button (X icon)
|
||||
|
||||
**Layout:**
|
||||
Horizontal card (image left, details right), clear visual separation between items, adequate spacing (16-24px).
|
||||
|
||||
**Why variant details are critical:**
|
||||
- Customer confirmation before checkout
|
||||
- Prevents returns from wrong variant purchases
|
||||
- Allows easy correction if wrong variant in cart
|
||||
- Essential for clothing, shoes, configurable products
|
||||
|
||||
### Price Display
|
||||
|
||||
**Medusa pricing (CRITICAL):**
|
||||
Medusa stores prices as-is (not in cents). Display prices directly without dividing by 100. Example: If Medusa returns 49.99, display $49.99 (not $0.4999). Different from Stripe which stores prices in cents.
|
||||
|
||||
**Sale prices:**
|
||||
Show original price (strikethrough) and sale price prominently if on sale.
|
||||
|
||||
**Line total:**
|
||||
Total for item (price × quantity), bold or larger font, update dynamically when quantity changes.
|
||||
|
||||
## Quantity Updates
|
||||
|
||||
### Quantity Selector
|
||||
|
||||
Standard +/- buttons with number display:
|
||||
```
|
||||
[-] [2] [+]
|
||||
```
|
||||
|
||||
**Behavior:**
|
||||
- Min: 1 (can't go below, or remove item instead)
|
||||
- Max: Stock available or cart limit
|
||||
- Manual input allowed (type number)
|
||||
- Update on change (blur or button click)
|
||||
- Show loading state briefly
|
||||
- Update line total immediately
|
||||
|
||||
### Auto-Update (Recommended)
|
||||
|
||||
Changes apply immediately, no "Update Cart" button needed. Better UX, less friction. Show brief loading indicator. Update order summary automatically.
|
||||
|
||||
**Error handling:**
|
||||
"Only X available" if exceeds stock, reset to max available quantity, show error message near item.
|
||||
|
||||
## Order Summary
|
||||
|
||||
### Summary Card
|
||||
|
||||
Position: Right column on desktop (sticky), below cart items on mobile, fixed width (300-400px desktop).
|
||||
|
||||
### Price Breakdown
|
||||
|
||||
**Line items:**
|
||||
```
|
||||
Subtotal (3 items): $149.97
|
||||
Shipping: $9.99
|
||||
Tax: $12.00
|
||||
─────────────────────
|
||||
Total: $171.96
|
||||
```
|
||||
|
||||
**Subtotal:**
|
||||
Sum of all cart items with item count.
|
||||
|
||||
**Shipping:**
|
||||
Estimated shipping cost, or "Calculated at checkout" (if address needed), or "Free shipping" (if applicable). Show free shipping threshold progress (see promotions.md).
|
||||
|
||||
**Tax:**
|
||||
Estimated tax or "Calculated at checkout" (if address needed).
|
||||
|
||||
**Total:**
|
||||
Grand total (bold, larger font), most prominent number.
|
||||
|
||||
### Savings Display
|
||||
|
||||
If discounts applied:
|
||||
- Show total savings: "You saved $20.00" (green text)
|
||||
- Or: Discount line item in breakdown
|
||||
- Positive reinforcement
|
||||
|
||||
## Promo Code Input
|
||||
|
||||
### Input Field Design
|
||||
|
||||
**Layout:**
|
||||
Label ("Promo code" or "Discount code"), text input (200-280px desktop, full-width mobile), "Apply" button inline or stacked (mobile). Positioned below cart items or in order summary.
|
||||
|
||||
**Auto-uppercase:**
|
||||
On submit (codes usually uppercase).
|
||||
|
||||
**Expandable pattern (optional):**
|
||||
"Have a promo code?" link that expands to show input. Saves vertical space.
|
||||
|
||||
### Success and Error States
|
||||
|
||||
**Success:**
|
||||
- Green checkmark or success message: "Code applied: WELCOME10"
|
||||
- Discount shown in order summary: "Discount (WELCOME10) -$10.00"
|
||||
- Remove option: X icon or "Remove" link
|
||||
- Update cart total immediately
|
||||
|
||||
**Error:**
|
||||
- Red error message below input: "Invalid code", "Code expired", or "Minimum purchase not met"
|
||||
- Input remains visible for retry
|
||||
- Don't clear input field
|
||||
|
||||
**See also:** [promotions.md](../features/promotions.md) for detailed promo code patterns.
|
||||
|
||||
## Checkout Button
|
||||
|
||||
### Button Design
|
||||
|
||||
**Prominence:**
|
||||
Large, full-width button, brand primary color (high contrast), 48-56px height (easy to tap). Text: "Proceed to Checkout" or "Checkout". Icon optional (lock or arrow).
|
||||
|
||||
**Position:**
|
||||
Bottom of order summary (desktop), fixed at bottom of screen (mobile, optional), always visible during scroll.
|
||||
|
||||
**States:**
|
||||
Default enabled, hover with slight color change, loading with spinner, disabled if cart empty or error.
|
||||
|
||||
**Security Indicators (optional):**
|
||||
Lock icon with "Secure Checkout", payment badges (Visa, Mastercard, PayPal), "SSL Encrypted" message near button.
|
||||
|
||||
## Empty Cart State
|
||||
|
||||
### Display
|
||||
|
||||
When cart is empty:
|
||||
- Centered content
|
||||
- Icon or illustration (empty shopping bag)
|
||||
- Heading: "Your cart is empty"
|
||||
- Subtext: "Start adding items to your cart"
|
||||
- CTA button: "Continue Shopping" or "Browse Products"
|
||||
|
||||
**Additional elements:**
|
||||
- Link to popular categories
|
||||
- Recently viewed products (if available)
|
||||
- Bestsellers or featured products
|
||||
|
||||
## Backend Integration
|
||||
|
||||
### Data Source (CRITICAL)
|
||||
|
||||
**Fetch from ecommerce backend:**
|
||||
Cart stored in backend (persistent), fetch on page load, sync with backend on changes.
|
||||
|
||||
**When to fetch:**
|
||||
- Page load (initial cart data)
|
||||
- After adding/updating/removing items
|
||||
- After applying promo codes
|
||||
|
||||
### State Management
|
||||
|
||||
**Client-side cart state:**
|
||||
Store cart data in global state (React Context), keep cart ID in localStorage, update state after API responses, share cart state across components (page, popup, header badge).
|
||||
|
||||
**Cart ID persistence:**
|
||||
```javascript
|
||||
localStorage.setItem('cart_id', cartId)
|
||||
```
|
||||
|
||||
Send cart ID with every cart API request, create new cart if ID doesn't exist, clear cart ID on checkout completion.
|
||||
|
||||
### TanStack Query for Cart Data
|
||||
|
||||
**Recommended** for efficient caching and revalidation:
|
||||
|
||||
**Benefits:**
|
||||
Built-in caching with automatic revalidation, optimistic updates support, automatic refetching on focus/reconnect, loading and error states handled, query invalidation for cart updates.
|
||||
|
||||
**Configuration:**
|
||||
Use `useQuery` for fetching cart data, set `staleTime` to 30-60 seconds, use `queryClient.invalidateQueries(['cart'])` after updates.
|
||||
|
||||
**See also:** [connecting-to-backend.md](../connecting-to-backend.md) for detailed backend integration patterns.
|
||||
|
||||
### Medusa Integration
|
||||
|
||||
Use `@medusajs/medusa-js` SDK:
|
||||
- Cart endpoints: `/store/carts`, `/store/carts/{id}`
|
||||
- Add to cart: POST `/store/carts/{id}/line-items`
|
||||
- Update quantity: POST `/store/carts/{id}/line-items/{lineId}`
|
||||
- Remove item: DELETE `/store/carts/{id}/line-items/{lineId}`
|
||||
- Apply discount: POST `/store/carts/{id}/promotions`
|
||||
|
||||
**Response data:**
|
||||
Cart ID, items (product details, variants, quantities), subtotal, tax, shipping, total, applied discounts, item availability status.
|
||||
|
||||
**Error handling:**
|
||||
Network errors (show retry option), invalid cart ID (create new cart), out of stock (show error, prevent adding), API errors (user-friendly message).
|
||||
|
||||
## Mobile Cart
|
||||
|
||||
### Mobile Layout
|
||||
|
||||
**Structure:**
|
||||
Full-width cart items (stacked), simplified item cards, order summary below items, sticky checkout button at bottom.
|
||||
|
||||
**Cart item cards:**
|
||||
Smaller product images (60-80px), truncated product titles (1-2 lines), essential info only, quantity selector (smaller, 36-40px), remove button visible.
|
||||
|
||||
### Sticky Checkout Bar
|
||||
|
||||
**Bottom sticky bar:**
|
||||
Fixed at bottom of screen, total amount visible, "Checkout" button (full-width), appears after scrolling (optional), always accessible.
|
||||
|
||||
**Design:**
|
||||
```
|
||||
[Total: $171.96] [Checkout]
|
||||
```
|
||||
|
||||
**Touch-friendly:**
|
||||
44px minimum touch targets, adequate spacing between buttons, large remove buttons (40px).
|
||||
|
||||
## Checklist
|
||||
|
||||
**Essential elements:**
|
||||
|
||||
- [ ] **CRITICAL: Cart items display variant details (size, color, etc.) - not just product title**
|
||||
- [ ] Cart items with images, titles, variant options, prices
|
||||
- [ ] Quantity selector (+/- buttons, 40-44px minimum)
|
||||
- [ ] Remove button per item (X icon, clearly visible)
|
||||
- [ ] Order summary (subtotal, shipping, tax, total)
|
||||
- [ ] Promo code input with "Apply" button
|
||||
- [ ] Applied discount displayed in summary
|
||||
- [ ] "Remove" option for applied code
|
||||
- [ ] Prominent "Checkout" button (48-56px height)
|
||||
- [ ] Continue shopping link
|
||||
- [ ] Empty cart state (icon, message, CTA)
|
||||
- [ ] Trust signals (secure checkout, payment badges)
|
||||
- [ ] Auto-update quantities (no "Update Cart" button)
|
||||
- [ ] Undo option after removing item (toast notification)
|
||||
- [ ] Mobile: Sticky checkout button at bottom
|
||||
- [ ] Mobile: Simplified cart item cards
|
||||
- [ ] Backend integration (fetch cart from API)
|
||||
- [ ] Cart ID persistence (localStorage)
|
||||
- [ ] Real-time price updates
|
||||
- [ ] Loading states (skeleton or spinner)
|
||||
- [ ] Optimistic updates for quantity changes
|
||||
- [ ] Stock availability warnings (if low stock)
|
||||
- [ ] Free shipping threshold progress (if applicable)
|
||||
- [ ] Keyboard accessible (Tab, Enter, Arrow keys)
|
||||
- [ ] ARIA labels on quantity controls and buttons
|
||||
- [ ] Screen reader announcements (aria-live)
|
||||
- [ ] High contrast text (4.5:1 minimum)
|
||||
- [ ] Error handling for failed updates
|
||||
Reference in New Issue
Block a user