Wide Banner & Product Cards

Maison de Parfum

Scent as autobiography

An independent perfume house creating small-batch fragrances from rare, ethically sourced botanicals. No focus groups. No celebrity endorsements. Just extraordinary scent.

Perfume atelier with glass bottles

Terre Noire

2013
Woody Oriental
Top — Black pepper, bergamot
Heart — Oud, incense, iris
Base — Vetiver, amber, musk

Jardin Sauvage

2016
Green Floral
Top — Fig leaf, galbanum
Heart — Jasmine sambac, violet leaf
Base — Oakmoss, white cedar

Sel Marin

2019
Aquatic Aromatic
Top — Sea salt, lemon zest
Heart — Seaweed absolute, lavender
Base — Driftwood, ambergris

Sourced Ingredients

Oud

Assam, India

Rose de Mai

Grasse, France

Sandalwood

Mysore, India

Bergamot

Calabria, Italy

Jasmine Sambac

Tamil Nadu, India

Vetiver

Haiti

About this block

Wide Banner & Product CardsPRO

Centered header with wide panoramic image, product cards with layered attributes, and sourcing grid.

About29: Wide Banner & Product Cards

Centered header above a wide panoramic banner image, a three-column grid of product cards with a layered notes structure, and a sourcing grid of raw ingredients with their origin. Modeled on a perfume house's "about" page, but the shape works for any maker with a structured product line and a sourcing story.

Upgrade to Pro

Pro blocks install through the shadcn CLI with your license key and ship their full source. Docs and live previews stay open to everyone, so you can read every block's details first.

Upgrade Now

Installation

Swap YOUR_EMAIL and YOUR_KEY for the email and license key on your account. Find your license key on your account page.

Radix flavor

bash
npx shadcn add "https://ui.beste.co/r/about29?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

bash
npx shadcn add "https://ui.beste.co/r-base/about29?email=YOUR_EMAIL&license_key=YOUR_KEY"

This installs the block to components/beste/block/about29.tsx and the badge and button shadcn/ui primitives it depends on.

Quick start

The installed file exports about29Demo alongside the block: the exact props behind the preview above. Spread it to get a working about section in one line.

tsx
import { About29, about29Demo } from "@/components/beste/block/about29";

export default function AboutPage() {
  return <About29 {...about29Demo} />;
}

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

tsx
import { About29 } from "@/components/beste/block/about29";

export default function AboutPage() {
  return (
    <About29
      badge={{ label: "Maison de Parfum", variant: "secondary" }}
      heading="Scent as autobiography"
      description="Small-batch fragrances from rare, ethically sourced botanicals."
      image={{
        src: "https://images.unsplash.com/photo-1626277890580-1924372c21fa?w=1200&h=500&fit=crop",
        alt: "Perfume atelier with glass bottles",
      }}
      fragrances={[
        {
          name: "Terre Noire",
          family: "Woody Oriental",
          year: "2013",
          notes: { top: "Black pepper, bergamot", heart: "Oud, incense, iris", base: "Vetiver, amber, musk" },
        },
        {
          name: "Jardin Sauvage",
          family: "Green Floral",
          year: "2016",
          notes: { top: "Fig leaf, galbanum", heart: "Jasmine sambac, violet leaf", base: "Oakmoss, white cedar" },
        },
      ]}
      ingredients={[
        { name: "Oud", origin: "Assam, India" },
        { name: "Rose de Mai", origin: "Grasse, France" },
      ]}
      buttons={[{ label: "Discovery Set", href: "https://beste.co" }]}
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string; variant?: "default" | "secondary" | "outline" }–Eyebrow badge above the heading
headingstring–Centered section heading
descriptionstring–Centered lead paragraph under the heading
image{ src: string; alt: string }–Wide panoramic banner below the header
fragrancesFragrance[][]Product cards with layered notes, below the banner
ingredientsIngredient[][]Sourcing grid of raw materials and origins
buttonsButtonItem[][]Centered CTA row at the bottom
classNamestring–Extra classes for the outer <section>
ts
type Fragrance = {
  name: string;
  family: string;
  year: string;
  notes: { top: string; heart: string; base: string };
};

type Ingredient = { name: string; origin: string };

type ButtonItem = {
  label: string;
  href?: string;
  variant?: "default" | "secondary" | "outline" | "ghost" | "link" | "destructive";
};

Behavior notes

  • The banner image uses a fixed aspect-[21/9] box, noticeably wider and shorter than the 4:3 or 16:9 ratios most other About blocks use, matching its "wide panoramic" framing.
  • Each fragrance card renders a three-line notes pyramid, one line per key in notes (top, heart, base); the label text for each line (`Top — `, `Heart — `, `Base — `) is hardcoded in the component with a literal em dash, not a configurable prop.
  • The fragrance grid is a fixed lg:grid-cols-3 layout regardless of how many entries fragrances has.
  • The ingredients grid steps through three fixed breakpoints (grid-cols-2 sm:grid-cols-3 lg:grid-cols-6) rather than the dynamic column-count pattern, so it always targets six columns at the widest breakpoint no matter how many ingredients are supplied.
  • The "Sourced Ingredients" heading above the ingredients grid is hardcoded text in the component, not a prop.

More About blocks

View all About
PRO

about60

Team Member Grid

PRO

about11

Hero Banner with Avatars

PRO

about20

Team Photo & List

Get Pro access