← Back to documentation

DESIGN_FASHION_CATEGORY_PAGE

BuyWhere Design System — Fashion & Apparel Category Page

Version: 1.0
Status: Ready for Iris Review
Parent: BUY-2235 (Sprint 2026-04-14 Design Artifacts)
Template #: 1 of 5
Owner: Proto (UI/UX Designer)
Last Updated: 2026-04-16
Deadline: EOD 2026-04-18


Overview

This document specifies the Fashion & Apparel category page template (template #1). Template #2 (Electronics) will follow.

Figma Frame Link: [To be inserted by Proto after Iris review]

Related Issues:


Design Tokens Used

All measurements reference BuyWhere design system tokens from /static/css/tokens.css and fashion variant tokens from /static/css/product-fashion.css.

Fashion Variant Tokens:

--variant-accent: #e91e63;        /* Pink — primary accent for Fashion/Beauty */
--variant-highlight: #f48fb1;     /* Light pink — secondary accent */
--variant-bg-card: var(--color-bg-secondary);

Base Tokens Used:

  • Spacing: --space-1 through --space-16 (4px base)
  • Typography: --text-xs through --text-5xl
  • Border radius: --radius-sm (2px) through --radius-3xl (24px)
  • Shadows: --shadow-sm through --shadow-xl
  • Transitions: --duration-fast (100ms), --duration-normal (200ms), --duration-slow (300ms)

Frame 1: Desktop Layout (1440px viewport)

1.1 Layout Grid

┌─────────────────────────────────────────────────────────────────────────────┐
│  BREADCRUMB  (Home > Women > Dresses > Maxi Dresses)                        │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  CATEGORY HERO                    │  Subcategory pills (horizontal scroll) │
│  ─────────────────────────────    │  [All] [Dresses] [Tops] [Bottoms]...  │
│  WOMEN'S FASHION                  │                                        │
│  12,847 products                  │                                        │
│                                                                             │
├────────────────┬──────────────────────────────────────────────────────────┤
│                │  TOOLBAR                                                  │
│   FILTER RAIL  │  ───────────────────────────────────────────────────────── │
│   (Left, 280px)│  [Grid toggle] [Sort: Popular ▾] [12 / page]    1-12 of 12847│
│                ├──────────────────────────────────────────────────────────┤
│   □ Brand      │                                                           │
│   □ Price      │  PRODUCT GRID (3-4 columns responsive)                   │
│   □ Size       │  ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐                    │
│   □ Color      │  │      │ │      │ │      │ │      │                    │
│   □ Avail.     │  │ Card │ │ Card │ │ Card │ │ Card │                    │
│   □ Region     │  │      │ │      │ │      │ │      │                    │
│                │  └──────┘ └──────┘ └──────┘ └──────┘                    │
│   [Clear All]  │  ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐                    │
│                │  │      │ │      │ │      │ │      │                    │
│                │  │ Card │ │ Card │ │ Card │ │ Card │                    │
│                │  │      │ │      │ │      │ │      │                    │
│                │  └──────┘ └──────┘ └──────┘ └──────┘                    │
│                │                                                           │
│                │  PAGINATION                                                │
│                │  < Prev  1  2  3  ...  1071  Next >                      │
└────────────────┴──────────────────────────────────────────────────────────┘

1.2 Section Specifications

Breadcrumb

PropertyValue
ContainerFull width, padding --space-4 horizontal
Font--text-sm, --font-medium
Color--color-text-secondary (default), --color-link (links)
Separator/ with --color-text-tertiary
Last item--color-text-primary, no link
Hover (links)--color-link-hover, underline
Spacing between items--space-2

Category Hero

PropertyValue
ContainerFull width, padding --space-8 vertical, --space-4 horizontal
Background--color-bg-secondary (#f9fafb) with subtle gradient overlay
Title font--text-4xl (36px), --font-bold, --tracking-tight
Title color--color-text-primary
Product count font--text-lg, --font-normal
Product count color--color-text-secondary
Bottom margin--space-6

Subcategory Pills (below hero)

PropertyValue
ContainerHorizontal scroll, --space-4 vertical padding
Gap between pills--space-2
Pill padding--space-2 --space-4
Pill background (default)--color-bg-primary, border 1px --color-border-default
Pill background (active)--variant-accent (#e91e63)
Pill text (default)--text-sm, --font-medium, --color-text-primary
Pill text (active)White
Pill border-radius--radius-full (9999px)
Pill hover (default)border --variant-accent, text --variant-accent
Transition--duration-fast --ease-out

Filter Rail (Left Sidebar)

PropertyValue
Width280px fixed
Padding--space-4
Background--color-bg-primary
Border-right1px --color-border-default
Section spacing--space-6 between filter groups

Filter Section Header

PropertyValue
Font--text-sm, --font-semibold
Color--color-text-primary
Margin-bottom--space-3
Toggle iconChevron down, rotates 180° when collapsed
Toggle size16px

Filter Group: Brand (Checkbox List)

PropertyValue
Checkbox size18px × 18px
Checkbox border2px --color-border-default
Checkbox checked bg--variant-accent (#e91e63)
Checkbox checked iconWhite checkmark, 12px
Label font--text-sm, --font-normal
Label color--color-text-primary
Count color--color-text-tertiary
Count font--text-xs
Item spacing--space-2 between items
Max visible before scroll6 items (then scroll)
Scroll max-height200px

Filter Group: Price Range (Range Slider)

PropertyValue
Track height4px
Track background--color-border-default
Fill color--variant-accent
Thumb size18px circle
Thumb color--variant-accent
Thumb border2px white
Thumb shadow--shadow-sm
Value display--text-xs, --font-medium, above thumb
Input fieldsMin/Max price, --input-height-md, --space-2 gap

Filter Group: Size (Pill Toggle)

PropertyValue
Pill size40px × 40px
Pill background (default)--color-bg-primary
Pill border (default)1px --color-border-default
Pill background (selected)--variant-accent
Pill border (selected)--variant-accent
Pill text (selected)White, --font-medium
Pill border-radius--radius-lg (8px)
Gap--space-2
Wrapyes

Filter Group: Color (Swatch Grid)

PropertyValue
Swatch size32px × 32px
Swatch border-radius--radius-full
Swatch border (default)2px transparent
Swatch border (selected)2px --variant-accent
Swatch ring on hover2px --color-border-strong, offset 2px
Gap--space-2
Color label below selected--text-xs, --color-text-secondary

Filter Group: Availability (Toggle)

PropertyValue
Toggle styleSwitch (not checkbox)
Toggle width40px
Toggle height22px
Track off--color-border-default
Track on--variant-accent
Thumb18px circle, white

Filter Group: Region (Dropdown)

PropertyValue
StyleSame as filter dropdown
OptionsSingapore, Malaysia, Indonesia, Thailand, Vietnam, Global

Filter Actions

PropertyValue
Clear All buttonGhost button, --text-sm, --font-medium
Clear All color--color-text-secondary
Clear All hover--color-text-primary
Clear All visible whenAny filter active

Active Filters Bar (above grid)

PropertyValue
ContainerFull width, padding --space-3 --space-4
Background--color-primary-50 (#eef2ff)
Border-radius--radius-lg
Gap between chips--space-2
Chip padding--space-1 --space-3
Chip background--color-bg-primary
Chip border1px --color-border-default
Chip font--text-xs, --font-medium
Chip remove icon14px, --color-text-tertiary
Chip remove hover--color-text-primary

Toolbar

PropertyValue
ContainerFull width, padding --space-3 --space-4
Background--color-bg-primary
Border-bottom1px --color-border-subtle
Item spacing--space-3
Margin-bottom--space-4

Grid/List Toggle

PropertyValue
Button group2 buttons, connected
Button size36px × 36px
Button background (default)transparent
Button background (active)--color-bg-secondary
Button icon20px, --color-text-secondary
Button icon (active)--color-text-primary
Border-radius--radius-md
Border1px --color-border-default

Sort Dropdown

PropertyValue
Trigger width160px
Trigger padding--space-2 --space-3
Trigger font--text-sm, --font-medium
Trigger background--color-bg-primary
Trigger border1px --color-border-default
Trigger border-radius--radius-lg
Chevron iconRight, 16px
Dropdown max-height240px
Dropdown item padding--space-2 --space-3
Dropdown item hover--color-bg-secondary
Dropdown item font--text-sm

Sort Options:

  1. Popular (default)
  2. Price: Low to High
  3. Price: High to Low
  4. Newest Arrivals
  5. Best Rated
  6. Biggest Discount

Results Per Page

PropertyValue
StyleSegmented control
Options12, 24, 48
Button height32px
Active background--variant-accent
Active textWhite

Product Count

PropertyValue
Font--text-sm
Color--color-text-secondary
Range text"1-12 of 12,847"

Product Grid

PropertyValue
Container padding--space-4
Columns (1440px+)4
Columns (1024px-1439px)3
Columns (768px-1023px)2
Gap--space-4
Card min-width200px
Card max-widthnone (fluid)

Product Card (Fashion Variant — reuse from BUY-2130)

PropertyValue
Background--color-bg-primary
Border1px --color-border-default
Border-radius--radius-xl (12px)
Image aspect ratio3/4 (portrait, fashion)
Image object-fitcover
Hover border--variant-accent
Hover shadow--shadow-lg
Hover transformtranslateY(-4px)
Badge positionTop-left, --space-2
Badge background--variant-accent
Badge textWhite, --text-xs, --font-bold
Quick-add buttonSlides up on card hover
Quick-add background--color-bg-primary

Pagination

PropertyValue
ContainerCentered, --space-6 vertical
Gap between items--space-1
Page button size36px × 36px
Page button background (default)transparent
Page button background (active)--variant-accent
Page button text (active)White
Page button border-radius--radius-md
Ellipsis--text-sm, --color-text-tertiary
Prev/NextGhost style, --text-sm
Disabled stateopacity 0.5, pointer-events none

Frame 2: Mobile Layout (375px viewport, ≤768px)

2.1 Layout Structure

┌─────────────────────────┐
│  ≡  BuyWhere    [🔍]   │  ← Sticky header
├─────────────────────────┤
│  Home / Women / Dresses │  ← Breadcrumb (truncated)
├─────────────────────────┤
│                         │
│  WOMEN'S FASHION        │
│  12,847 products        │
│                         │
├─────────────────────────┤
│ [Filters (3)] [Sort ▾]  │  ← Sticky toolbar
│ [Grid▾] [List▾]         │
├─────────────────────────┤
│                         │
│ ┌─────────┐ ┌─────────┐ │
│ │         │ │         │ │
│ │  Card   │ │  Card   │ │  ← 2-column grid
│ │         │ │         │ │
│ └─────────┘ └─────────┘ │
│ ┌─────────┐ ┌─────────┐ │
│ │         │ │         │ │
│ │  Card   │ │  Card   │ │
│ │         │ │         │ │
│ └─────────┘ └─────────┘ │
│                         │
│   < Prev  1 2 3 ... Next >│
│                         │
└─────────────────────────┘

FILTER DRAWER (slides from left):
┌─────────────────────────┐
│  ✕  Filters    [Clear] │
├─────────────────────────┤
│  □ Brand           [▾] │
│  □ Price           [▾] │
│  □ Size            [▾] │
│  □ Color           [▾] │
│  □ Availability   [▾] │
│  □ Region          [▾] │
├─────────────────────────┤
│                         │
│  [    Apply (847)    ]  │  ← Sticky bottom
│                         │
└─────────────────────────┘

2.2 Mobile Specifications

Sticky Header

PropertyValue
Height56px
Background--color-bg-primary
Border-bottom1px --color-border-default
LogoLeft, 80px wide
Search iconRight, 44px tap target
Menu iconLeft, 44px tap target

Mobile Breadcrumb

PropertyValue
Font--text-xs
Color--color-text-tertiary
Padding--space-3 --space-4
TruncationEllipsis after 2 items

Mobile Category Hero

PropertyValue
Padding--space-4
Title font--text-2xl (24px), --font-bold
Count font--text-sm

Mobile Filter/Sort Toolbar

PropertyValue
PositionSticky, below header
Height48px
Background--color-bg-primary
Border-bottom1px --color-border-subtle
Filter buttonShows active filter count badge
Sort buttonFull width dropdown
View toggleIcon only, right side

Mobile Filter Drawer

PropertyValue
Width85% of screen (max 320px)
PositionSlides from left
Background--color-bg-primary
Overlay--overlay-background (50% black)
Header height56px
Close buttonLeft, 44px tap target
Apply buttonFixed bottom, full width minus padding
Apply button height48px
Apply button background--variant-accent
Apply button textWhite, --font-semibold

Mobile Subcategory Pills

PropertyValue
ContainerHorizontal scroll
Padding--space-3 horizontal
Pill height36px

Mobile Product Grid

PropertyValue
Columns2
Gap--space-3
Card min-widthnone (fluid 50% - gap)

Mobile Product Card

PropertyValue
Border-radius--radius-lg
Image aspect ratio3/4
Quick-addHidden on mobile (tap opens PDP)
Merchant badgeSmaller, --text-xs

Mobile Pagination

PropertyValue
Page buttons32px × 32px
TruncationShow 1, ... , 3 pages from ends

Frame 3: Empty / No Results State

┌─────────────────────────────────────────────────────────────────────────────┐
│  BREADCRUMB                                                                  │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  CATEGORY HERO                                                              │
│  ─────────────────────────────                                             │
│  WOMEN'S FASHION                                                           │
│  0 products                                                                │
│                                                                             │
├────────────────┬──────────────────────────────────────────────────────────┤
│                │                                                           │
│   FILTER RAIL  │   ┌─────────────────────────────────────────────────────┐ │
│                │   │                                                       │ │
│                │   │              🔍                                       │ │
│                │   │                                                       │ │
│                │   │        No results for "Red Dresses"                   │ │
│                │   │                                                       │ │
│                │   │        Try adjusting your filters or search terms     │ │
│                │   │                                                       │ │
│                │   │        Suggestions:                                   │ │
│                │   │        • Remove some filters                          │ │
│                │   │        • Search for a different keyword               │ │
│                │   │        • Browse our popular categories               │ │
│                │   │                                                       │ │
│                │   │        [Clear All Filters]  [Browse All Dresses]      │ │
│                │   │                                                       │ │
│                │   └─────────────────────────────────────────────────────┘ │
│                │                                                           │
└────────────────┴──────────────────────────────────────────────────────────┘

Empty State Specifications

PropertyValue
ContainerCentered in grid area, max-width 400px
Icon size64px
Icon color--color-text-tertiary
Title font--text-xl, --font-semibold
Title color--color-text-primary
Description font--text-base, --font-normal
Description color--color-text-secondary
Suggestion list--text-sm, --color-text-secondary
Button spacing--space-3 between buttons
Clear Filters buttonGhost variant
Browse All buttonPrimary variant, --variant-accent

Frame 4: Loading / Skeleton States

4.1 Initial Page Load Skeleton

┌─────────────────────────────────────────────────────────────────────────────┐
│  ████████████████                                                          │  ← Breadcrumb skeleton
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  ████████████████████████████████████                                      │  ← Hero title
│  ████████████                                                              │  ← Product count
│                                                                             │
├────────────────┬──────────────────────────────────────────────────────────┤
│                │  ████████  ██████████  ████  ████████████              │  ← Toolbar
│   FILTER RAIL  ├──────────────────────────────────────────────────────────┤
│   (disabled)   │                                                           │
│                │  ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐                    │
│   ████████     │  │      │ │      │ │      │ │      │                    │
│   ████████     │  │ ░░░░ │ │ ░░░░ │ │ ░░░░ │ │ ░░░░ │  ← Image skeleton │
│   ████████     │  │ ░░░░ │ │ ░░░░ │ │ ░░░░ │ │ ░░░░ │                    │
│   ████████     │  └──────┘ └──────┘ └──────┘ └──────┘                    │
│   ████████     │  ████████████   ████████████   ← Brand + Title          │
│   ████████     │  ████████       ████████       ← Price                   │
│                │                                                           │
│                │  ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐                    │
│                │  │      │ │      │ │      │ │      │                    │
│                │  │ ░░░░ │ │ ░░░░ │ │ ░░░░ │ │ ░░░░ │                    │
│                │  │ ░░░░ │ │ ░░░░ │ │ ░░░░ │ │ ░░░░ │                    │
│                │  └──────┘ └──────┘ └──────┘ └──────┘                    │
│                │                                                           │
└────────────────┴──────────────────────────────────────────────────────────┘

4.2 Skeleton Specifications

Skeleton Animation

PropertyValue
AnimationShimmer left-to-right
Base color--color-bg-tertiary (#f3f4f6)
Highlight color--color-bg-secondary (#f9fafb)
Duration1.5s per cycle
Easingease-in-out
LoopInfinite

Skeleton Shapes

ElementShapeSize
BreadcrumbRounded rectangle80px × 12px
Hero titleRounded rectangle200px × 36px
Hero countRounded rectangle100px × 16px
Filter sectionRounded rectangle100% width × 24px
Filter itemRounded rectangle80% width × 16px
Product imageRounded rectangle100% × aspect 3:4
Product brandRounded rectangle60px × 12px
Product titleRounded rectangle100% × 16px (2 lines)
Product priceRounded rectangle70px × 20px

4.3 Filter Loading State

  • Filter options show skeleton while loading
  • Apply button shows spinner when submitting
  • 200ms minimum display to prevent flash

4.4 Grid Loading (Pagination)

PropertyValue
StyleReplace existing cards with skeletons
TransitionFade out old → fade in new
Duration200ms

Interaction Notes

Facet Filter Behavior

Multi-Select Filters (Brand, Size, Color)

  1. User taps checkbox/pill → immediate UI update (optimistic)
  2. Active filter chip appears in filter bar
  3. URL updates with filter params (?brand=nike,adidas&size=s,m)
  4. Product grid reloads with loading skeleton
  5. Results count updates in toolbar
  6. If API fails → revert filter, show toast error

Single-Select Filters (Availability, Region)

  1. User toggles switch / selects option
  2. Immediate UI feedback
  3. URL updates
  4. Grid reloads

Price Range Filter

  1. User drags sliders OR enters values in min/max inputs
  2. Debounce 300ms before API call
  3. Price chips show "S$XX - S$XXX" format
  4. Clear price filter shows "All Prices"

Filter Drawer (Mobile)

  1. Tap "Filters" → drawer slides in from left (300ms, ease-out)
  2. Tap overlay OR tap X → drawer slides out
  3. Tap "Apply" → drawer closes, filters apply
  4. Badge on Filters button shows active count

Sort Interaction

  1. Tap sort dropdown → options expand below
  2. Tap option → dropdown closes, sort applies
  3. Grid re-sorts with loading state
  4. Dropdown trigger shows selected option

Grid/List Toggle

  1. Tap toggle → immediate view change
  2. Preference saved to localStorage
  3. List view: horizontal card layout, 1 column
  4. List card: image 120px × 120px, horizontal details

Active Filters

  • Tap chip X → removes that filter
  • Tap "Clear All" → removes all active filters
  • Each removal triggers grid reload

Error States

ScenarioBehavior
Filter API failsToast "Couldn't update filters. Try again." + revert filter
Product load failsRetry button in grid area, "Couldn't load products"
Network offlineBanner at top "You're offline. Showing cached results."

Component Inventory

Components Used (from BUY-2150)

  1. Button — Primary, Ghost, Danger variants
  2. Checkbox — Custom styled with variant-accent
  3. Toggle Switch — For availability filter
  4. Dropdown/Select — For sort, region
  5. Pagination — Numbered with prev/next
  6. Skeleton — Shimmer animation
  7. Toast — Error notifications
  8. Badge — Active filter chips
  9. Icon — Chevron, grid, list, close, search, filter

Fashion-Specific Components

  1. Color Swatch — With selection ring
  2. Size Pill — Toggle with selected state
  3. Subcategory Pill — Horizontal scroll tabs
  4. Active Filter Chip — With remove action
  5. Quick-Add Button — Slides up on hover (desktop only)

Accessibility Requirements

RequirementImplementation
Focus visible2px --focus-ring-color outline on all interactive elements
Keyboard navigationTab through filters, Enter/Space to toggle, Escape to close drawer
Screen readeraria-label on icon buttons, aria-pressed on toggles, aria-current="page" on pagination
Filter announcearia-live="polite" region announces result count changes
Mobile drawerFocus trap inside drawer when open, restore focus on close
Color contrastAll text meets WCAG AA (4.5:1 normal, 3:1 large)
Reduced motionRespect prefers-reduced-motion — disable shimmer, simplify transitions

Responsive Breakpoints

BreakpointLayout
≥1024pxDesktop: sidebar + 3-4 column grid
768px-1023pxTablet: sidebar collapsed to icons + 2-3 column grid
≤767pxMobile: filter drawer + 2 column grid

Handoff Notes for Engineering

CSS Structure

/static/css/
  category.css              # Base category styles (existing)
  category-fashion.css      # NEW: Fashion category variant (extends category.css)

Template File

/templates/
  category-fashion.html     # NEW: Fashion category Jinja2 template

Key CSS Classes

ClassPurpose
.category-pagePage container
.category-heroHero section
.category-filtersFilter rail/sidebar
.filter-groupIndividual filter section
.filter-chipActive filter tag
.category-toolbarSort, toggle, count bar
.product-gridProduct card container
.product-grid--listList view modifier
.skeleton-cardLoading skeleton card
.empty-stateNo results view

API Integration Points

ActionEndpoint
Load productsGET /api/catalog/category/{id}?filters=...&sort=...&page=...
Load filtersGET /api/catalog/category/{id}/filters
Update filterTriggers product reload via query params

Sign-Off

RoleNameStatusDate
DesignerProtoReady for Review2026-04-16
Design ReviewIrisPending
Engineering BuildHue/SolPending

Figma frames will be linked after Iris review approval.