Ecommerce UI with Tailwind CSS
Patterns for product display, cart, checkout, orders, and store navigation.
- Product Display Patterns
Card Variants
Variant Key Classes Use Case
Simple grid card aspect-[3/4] w-full object-cover
- text below image Category pages, minimal listings
Card with details rounded-lg border bg-white shadow-sm
- price, rating, badge Product listings, search results
Horizontal card flex flex-row gap-4
- image left, details right Cart items, wishlists, comparisons
Quick view overlay group relative
- opacity-0 group-hover:opacity-100 overlay CTA Browse-and-add flows
Featured card col-span-2 row-span-2
- larger image Homepage hero products
Image Handling
Concern Pattern Classes
Aspect ratio Fixed ratio container aspect-square , aspect-[3/4] , aspect-[4/3]
Fill behavior Cover without distortion object-cover w-full h-full
Responsive sizing Fluid width, fixed aspect w-full on container, aspect ratio on <img>
Placeholder Background color fallback bg-gray-100 on container
Hover zoom Scale on group hover transition-transform duration-300 group-hover:scale-105
Lazy loading Native attribute loading="lazy" on <img>
Price Display
Scenario Pattern
Regular price <span class="text-lg font-semibold text-gray-900">$49.99</span>
Sale price Original: line-through text-gray-500 text-sm / Sale: text-lg font-semibold text-red-600
Price range From $29.99 with text-sm text-gray-500 prefix
Currency symbol Keep symbol adjacent, no wrapping: whitespace-nowrap
Rating Display
Element Classes
Star icon (filled) size-4 text-yellow-400 fill-current
Star icon (empty) size-4 text-gray-300 fill-current
Half star Clip filled star at 50% with overflow-hidden w-2 wrapper
Review count text-sm text-gray-500 ml-1 next to stars
Container flex items-center gap-0.5
- Product List Layouts
Responsive Grid
<div class="grid grid-cols-1 gap-6 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4"> <!-- Product cards --> </div>
Layout Patterns
Layout Classes When to Use
Grid (default) grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6
Category pages, search results
Two-column wide grid grid-cols-1 md:grid-cols-2 gap-8
Featured products, comparisons
List view flex flex-col divide-y with horizontal cards Detail-heavy browsing
Masonry-style columns-2 lg:columns-3 gap-4
Visual-heavy catalogs
Loading and Pagination
Pattern Implementation
Skeleton card animate-pulse with bg-gray-200 rounded blocks matching card layout
Skeleton image aspect-[3/4] bg-gray-200 rounded-lg animate-pulse
Skeleton text h-4 bg-gray-200 rounded w-3/4 animate-pulse
Load more button w-full py-3 border rounded-lg text-center below grid
Pagination flex items-center gap-2 with numbered buttons, active: bg-indigo-600 text-white
Infinite scroll Intersection observer on sentinel div at grid end
Empty state text-center py-16 with icon, heading, and CTA
- Category and Filtering
Sidebar Filter Panel (Desktop)
Element Classes
Panel container w-64 shrink-0 hidden lg:block
Filter group border-b py-4 with heading + options
Group heading font-medium text-sm text-gray-900 mb-3
Checkbox + label flex items-center gap-2 text-sm text-gray-600
Color swatch size-6 rounded-full border-2
- ring-2 ring-offset-2 ring-indigo-500 when active
Price range Two input[type=number] with w-20 in a flex gap-2 items-center row
Apply button w-full mt-3 py-2 bg-indigo-600 text-white rounded-lg text-sm
Mobile Filter (Slide-out Dialog)
Element Classes
Trigger button lg:hidden flex items-center gap-2 border rounded-lg px-4 py-2
Backdrop fixed inset-0 bg-black/25 z-40
Panel fixed inset-y-0 right-0 w-full max-w-sm bg-white z-50 overflow-y-auto
Header flex items-center justify-between px-4 py-3 border-b
Footer sticky bottom-0 bg-white border-t px-4 py-3 with Apply/Clear buttons
Active Filters and Sorting
Element Classes
Filter chip inline-flex items-center gap-1 rounded-full bg-gray-100 px-3 py-1 text-sm
Remove button size-4 text-gray-400 hover:text-gray-600 (X icon inside chip)
Clear all link text-sm text-indigo-600 hover:text-indigo-800
Sort dropdown select or custom dropdown, text-sm border rounded-lg px-3 py-2
Result count text-sm text-gray-500 (e.g., "128 products")
Filter count badge size-5 rounded-full bg-indigo-600 text-white text-xs flex items-center justify-center
- Shopping Cart
Cart Item Row
<div class="flex gap-4 py-4 border-b"> <img class="size-20 rounded-lg object-cover shrink-0" src="..." alt="..." /> <div class="flex flex-1 flex-col justify-between"> <div class="flex justify-between"> <div> <h3 class="text-sm font-medium text-gray-900">Product Name</h3> <p class="mt-1 text-sm text-gray-500">Color / Size</p> </div> <p class="text-sm font-medium text-gray-900">$49.99</p> </div> <div class="flex items-center justify-between"> <!-- Quantity selector --> <div class="flex items-center rounded-lg border"> <button class="px-3 py-1 text-gray-600">-</button> <span class="px-3 py-1 border-x text-sm">1</span> <button class="px-3 py-1 text-gray-600">+</button> </div> <button class="text-sm text-red-600 hover:text-red-800">Remove</button> </div> </div> </div>
Cart Sections
Section Classes Content
Cart list divide-y
Cart item rows
Summary panel rounded-lg bg-gray-50 p-6 lg:w-80 lg:shrink-0
Subtotal, shipping, tax, total
Summary row flex justify-between text-sm text-gray-600 py-2
Label + amount
Total row flex justify-between text-base font-semibold text-gray-900 border-t pt-4 mt-4
Total label + amount
Checkout CTA w-full mt-6 py-3 bg-indigo-600 text-white rounded-lg font-medium
"Proceed to Checkout"
Continue shopping text-sm text-indigo-600 hover:text-indigo-800 mt-4 text-center block
Link back
Cart States
State Pattern
Empty cart text-center py-16 with cart icon, "Your cart is empty" heading, shop CTA
Mini cart / drawer fixed inset-y-0 right-0 w-full max-w-md bg-white shadow-xl z-50
Cart badge absolute -top-2 -right-2 size-5 rounded-full bg-indigo-600 text-white text-xs flex items-center justify-center
Updating state opacity-50 pointer-events-none on item row during async update
- Checkout Flow
Progress Indicator
Step State Classes
Completed size-8 rounded-full bg-indigo-600 text-white with check icon
Current size-8 rounded-full border-2 border-indigo-600 text-indigo-600
Upcoming size-8 rounded-full border-2 border-gray-300 text-gray-400
Connector (done) h-0.5 w-full bg-indigo-600 between circles
Connector (pending) h-0.5 w-full bg-gray-300 between circles
Container flex items-center justify-between max-w-lg mx-auto mb-8
Form Layout
Section Structure
Two-column layout grid grid-cols-1 lg:grid-cols-5 gap-8 (3 cols form + 2 cols summary)
Field group space-y-4 container
Two-field row grid grid-cols-2 gap-4 (first/last name, city/zip)
Full-width field col-span-2 or standalone
Label block text-sm font-medium text-gray-700 mb-1
Input w-full rounded-lg border border-gray-300 px-3 py-2 text-sm focus:border-indigo-500 focus:ring-1 focus:ring-indigo-500
Error input border-red-500 focus:border-red-500 focus:ring-red-500
Error message text-sm text-red-600 mt-1
Payment Fields
Element Pattern
Card number Full-width input with card icon right-aligned
Expiry + CVC grid grid-cols-2 gap-4 side by side
Card group rounded-lg border divide-y wrapping all card fields as one visual unit
Saved cards Radio group: flex items-center gap-3 p-4 border rounded-lg per card
Security note flex items-center gap-2 text-sm text-gray-500 with lock icon
Checkout Patterns
Pattern Implementation
Guest vs account Toggle or tabs at top: flex rounded-lg border with two options
Order review Summary card: item thumbnails, quantities, line totals in bg-gray-50 rounded-lg p-6
Place order CTA w-full py-3 bg-indigo-600 text-white rounded-lg font-medium text-lg
Terms checkbox flex items-start gap-2 with checkbox and label text
Loading on submit Button with opacity-75 cursor-not-allowed
- spinner icon
- Order Management
Order History Table
Viewport Pattern
Desktop Standard <table> with columns: Order #, Date, Status, Total, Actions
Mobile Stacked cards: divide-y with each order as a flex flex-col gap-2 py-4 block
Table header text-left text-sm font-medium text-gray-500 pb-3 border-b
Table cell py-4 text-sm text-gray-900
Order Status Badges
Status Classes
Pending bg-yellow-100 text-yellow-800 rounded-full px-2.5 py-0.5 text-xs font-medium
Processing bg-blue-100 text-blue-800 rounded-full px-2.5 py-0.5 text-xs font-medium
Shipped bg-indigo-100 text-indigo-800 rounded-full px-2.5 py-0.5 text-xs font-medium
Delivered bg-green-100 text-green-800 rounded-full px-2.5 py-0.5 text-xs font-medium
Cancelled bg-red-100 text-red-800 rounded-full px-2.5 py-0.5 text-xs font-medium
Refunded bg-gray-100 text-gray-800 rounded-full px-2.5 py-0.5 text-xs font-medium
Order Detail Page
Section Pattern
Status timeline Vertical: relative pl-8 space-y-6 with absolute left-0 circles and connecting line
Timeline dot (done) size-4 rounded-full bg-indigo-600
Timeline dot (current) size-4 rounded-full border-2 border-indigo-600 bg-white
Timeline line absolute left-2 top-4 bottom-0 w-0.5 bg-gray-200
Items list Horizontal cards with image, name, qty, price
Totals section Same pattern as cart summary
Shipping address bg-gray-50 rounded-lg p-4 card
Invoice layout max-w-2xl mx-auto with logo header, address block, items table, totals
- Pricing and Promotions
Price Patterns
Pattern Implementation
Original + sale <span class="line-through text-gray-500 text-sm">$99.99</span> <span class="text-lg font-semibold text-red-600">$49.99</span>
Save amount <span class="text-sm text-green-600 font-medium">Save $50.00 (50%)</span>
Per-unit price <span class="text-xs text-gray-500">$2.50/oz</span> below main price
Discount Badge (on Product Image)
<div class="relative"> <img class="aspect-[3/4] w-full rounded-lg object-cover" src="..." alt="..." /> <span class="absolute top-2 left-2 rounded-full bg-red-600 px-2.5 py-0.5 text-xs font-semibold text-white"> -50% </span> </div>
Pricing Tier Cards
Element Classes
Card container rounded-xl border p-6 text-center
Featured card border-indigo-600 ring-2 ring-indigo-600 relative with "Popular" badge
Price text-4xl font-bold text-gray-900
Period text-sm text-gray-500 (e.g., "/month")
Feature list space-y-3 text-sm text-gray-600 with check icons
CTA button w-full mt-6 py-2.5 rounded-lg font-medium
Promo and Incentive Sections
Pattern Classes
Full-width banner bg-indigo-600 text-white py-3 text-center text-sm font-medium
Dismissable banner Add flex items-center justify-between px-4 with close button
Trust icons row grid grid-cols-2 md:grid-cols-4 gap-6 py-8 text-center
Trust icon item flex flex-col items-center gap-2 text-sm text-gray-600 with icon above
Coupon input flex with flex-1 rounded-l-lg border px-3 py-2 input + rounded-r-lg bg-gray-900 text-white px-4 py-2 button
- Store Navigation
Store Header
Element Classes
Header bar sticky top-0 z-30 bg-white border-b
Inner layout flex items-center justify-between h-16 px-4 max-w-7xl mx-auto
Logo shrink-0
Search bar flex-1 max-w-lg mx-8 hidden md:block with rounded-full bg-gray-100 px-4 py-2
Icon group flex items-center gap-4 for account, wishlist, cart icons
Cart icon + badge relative button with absolute -top-1.5 -right-1.5 badge
Mega Menu
Element Classes
Trigger group on nav item
Dropdown invisible group-hover:visible opacity-0 group-hover:opacity-100 transition-all absolute left-0 w-full bg-white shadow-lg border-t
Inner grid grid grid-cols-4 gap-8 max-w-7xl mx-auto p-8
Column heading font-medium text-sm text-gray-900 mb-3
Column links space-y-2 text-sm text-gray-600
Featured image rounded-lg overflow-hidden in last column
Category Previews and Breadcrumbs
Element Classes
Category card group relative rounded-xl overflow-hidden
Category image aspect-[4/3] w-full object-cover transition-transform group-hover:scale-105
Category overlay absolute inset-0 bg-gradient-to-t from-black/60 to-transparent
Category label absolute bottom-4 left-4 text-lg font-semibold text-white
Breadcrumb nav flex items-center gap-2 text-sm text-gray-500
Breadcrumb separator size-4 text-gray-400 (chevron icon)
Breadcrumb current text-gray-900 font-medium (last item, no link)
- Accessibility for Ecommerce
Element Requirement Implementation
Product image Descriptive alt text alt="Red leather crossbody bag" not alt="product"
Decorative image Skip for screen readers alt="" and aria-hidden="true"
Sale price Announce was/now aria-label="Sale price $49.99, originally $99.99" on container
Cart update Announce change aria-live="polite" region for "Item added" / "Cart updated" messages
Cart count badge Announce count aria-label="Cart, 3 items" on cart button
Quantity selector Label buttons aria-label="Decrease quantity" / aria-label="Increase quantity"
Star rating Text alternative aria-label="4 out of 5 stars" on rating container
Filter change Announce results aria-live="polite" on product count ("128 results")
Form errors Link to field aria-describedby="email-error" on input, matching id on error text
Checkout steps Current step aria-current="step" on active step indicator
Remove from cart Confirm action Identify item in label: aria-label="Remove Red Bag from cart"
Sort dropdown Label purpose aria-label="Sort products by" on select element
Color swatch Name the color aria-label="Color: Navy Blue" on swatch button
Dialog filters Trap focus role="dialog"
- aria-modal="true"
- focus trap on mobile filter panel
Common Mistakes
Mistake Fix
Fixed pixel image heights Use aspect-* utilities with object-cover for responsive images
Cart with no empty state Always handle zero items with illustration and CTA
Price without whitespace-nowrap
Currency and amount should not wrap to separate lines
Filter panel always visible on mobile Hide with hidden lg:block , use dialog for mobile
No loading state during cart updates Show opacity-50 pointer-events-none or skeleton on async actions
Checkout form in single column Use grid grid-cols-2 gap-4 for name, city/zip, expiry/CVC pairs
Status badges with only color Add text labels; color alone fails WCAG
Missing aria-live on cart Cart count and summary changes must announce to screen readers
Mega menu not keyboard-navigable Ensure focus management and Escape key closes the menu
Discount badge over product text Position badge on image (absolute top-2 left-2 ), not over card text
MCP Component Library
The frontend-components MCP server provides ecommerce-related components:
-
HyperUI (hyperui ): Product cards, product collections, pricing tables, forms, badges, stats
-
DaisyUI (daisyui ): Card, badge, stat, table, modal, rating, countdown class references
-
FlyonUI (flyonui ): Card, badge, stat, table CSS components + datatable JS plugin
Ecommerce search: search_components(query: "product", framework: "hyperui") or search_components(query: "pricing") for pricing components across all libraries.