Product Card Grid

New Arrivals

Shop our latest collection

Discover our handpicked selection of premium products designed for modern living.

Minimal Desk LampSale

Minimal Desk Lamp

4.8(124)
$89$129
Ceramic Vase Set

Ceramic Vase Set

4.9(89)
$65
Wooden Side TableBestseller

Wooden Side Table

4.7(256)
$199
Linen Throw Blanket

Linen Throw Blanket

4.6(67)
$79$99
About this block

Product Card GridFREE

Responsive product grid with ratings, sale badges, and add to cart buttons. Perfect for shop pages and product catalogs.

Ecommerce1: Product Card Grid

Responsive product grid for shop and catalog pages: image tile with an optional sale/bestseller badge, star rating, current and struck-through original price, and a full-width "Add to Cart" button per card.

Free block

This block is free. No license or account is required: install it with the CLI and use it in unlimited projects.

Installation

Radix flavor

bash
npx shadcn add "https://ui.beste.co/r/ecommerce1"

Base UI flavor

bash
npx shadcn add "https://ui.beste.co/r-base/ecommerce1"

This installs the block to components/beste/block/ecommerce1.tsx and the Badge and Button shadcn/ui primitives it uses.

Quick start

The installed file exports ecommerce1Demo alongside the block: the exact props behind the preview above. Spread it to get a working product grid in one line.

tsx
import { Ecommerce1, ecommerce1Demo } from "@/components/beste/block/ecommerce1";

export default function ShopPage() {
  return <Ecommerce1 {...ecommerce1Demo} />;
}

Then replace the demo with your own props. Written out, a trimmed setup looks like this:

tsx
import { Ecommerce1 } from "@/components/beste/block/ecommerce1";

export default function ShopPage() {
  return (
    <Ecommerce1
      heading="Shop our latest collection"
      currency="$"
      products={[
        {
          name: "Minimal Desk Lamp",
          price: 89,
          originalPrice: 129,
          image: "https://images.unsplash.com/photo-1731762524352-b5663f83a830?w=900&fit=crop",
          badge: "Sale",
          rating: 4.8,
          reviewCount: 124,
        },
        {
          name: "Ceramic Vase Set",
          price: 65,
          image: "https://images.unsplash.com/photo-1654856842864-145a630cd603?w=900&fit=crop",
          rating: 4.9,
          reviewCount: 89,
        },
      ]}
      onAddToCart={(product) => console.log("add to cart", product.name)}
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string; variant?: "default" | "secondary" | "outline" }Optional pill badge above the heading
headingstringSection heading
descriptionstringSection intro text
productsProduct[][]Products rendered as cards
currencystring"$"Symbol prefixed to every price and original price
onAddToCart(product: Product) => voidCalled with the clicked card's product when "Add to Cart" is pressed
classNamestringExtra classes for the outer <section>
ts
type Product = {
  name: string;
  price: number;
  originalPrice?: number;
  image: string;
  badge?: string;
  rating?: number;
  reviewCount?: number;
};

Behavior notes

  • Grid column count is derived from the product count: a count divisible by 4 gets lg:grid-cols-4, a count divisible by 3 (or greater than 4) gets lg:grid-cols-3, otherwise lg:grid-cols-2; sm:grid-cols-2 is always the mobile baseline.
  • Rating is a literal glyph in text-yellow-500 next to the numeric rating and review count, not the Star icon fill pattern used elsewhere in the Ecommerce category.
  • originalPrice only draws a strikethrough price next to the current one; there's no automatic discount-percentage calculation or badge, the badge field (e.g. "Sale") is plain text supplied by the caller, not derived from the price difference.
  • The component returns null outright when products is empty, rather than rendering the header with an empty grid.
  • onAddToCart is the only interactive callback; there's no wishlist toggle, quantity selector, or cart state inside the block itself, it's presentation plus a single click handler per card.

More Ecommerce blocks

View all Ecommerce
FREE

ecommerce4

Shop by Category Grid

Product category browsing with image cards, product counts, and featured badges. Responsive grid layout with hover effects. Perfect for storefront navigation and collection showcases.

PRO

ecommerce28

Featured Products Grid

Product cards with hover wishlist buttons, quick add to cart overlay, and star ratings. Perfect for featured sections and bestsellers.

PRO

ecommerce14

Related Products Grid

Product recommendations grid with images, prices, and add to cart buttons. Perfect for cross-selling and upselling on product pages.

PRO

ecommerce35

Product Reviews Grid

Review cards with star ratings, product thumbnails, verified badges, and helpfulness counts. Perfect for social proof and testimonial sections.

FREE

ecommerce32

Shop by Brand Grid

Brand logo cards with product counts and hover effects linking to brand pages. Perfect for multi-brand stores and brand discovery.

PRO

ecommerce33

Collection Showcase Grid

Featured collection card with supporting collection tiles, image overlays, and product counts. Perfect for homepage collection highlights.