Hero Overlay & Suite Cards

Ice hotel interior
Arctic Experience

Sleep inside a frozen cathedral

Every winter, we rebuild an entire hotel from 30,000 tons of snow and ice harvested from the Torne River in Swedish Lapland.

Aurora Suite

−5°C2 guests

Carved walls depicting the northern lights. Reindeer-hide sleeping platform with thermal sleeping bags rated to −30°C.

Forest Chamber

−5°C2 guests

Ice sculptures of pine trees and wildlife. Fiber-optic ceiling simulating a starfield through the canopy.

Ceremony Hall

−7°C80 guests

Vaulted ice ceiling with crystal chandeliers. Hosts weddings, concerts, and private events from December through April.

About this block

Hero Overlay & Suite CardsPRO

Dark-overlay hero image with heading, suite/room cards with temperature and capacity badges. For hotels and hospitality.

About31: Hero Overlay & Suite Cards

A dark-overlay hero image carries the badge, heading, and description centered in white text, followed by a three-column grid of suite/room cards, each tagged with a temperature and a capacity badge. Built for hotels and hospitality brands with a handful of distinct rooms or spaces to showcase.

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/about31?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

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

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

Quick start

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

tsx
import { About31, about31Demo } from "@/components/beste/block/about31";

export default function AboutPage() {
  return <About31 {...about31Demo} />;
}

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

tsx
import { About31 } from "@/components/beste/block/about31";

export default function AboutPage() {
  return (
    <About31
      badge={{ label: "Arctic Experience" }}
      heading="Sleep inside a frozen cathedral"
      description="Rebuilt every winter from 30,000 tons of snow and ice."
      image={{
        src: "https://images.unsplash.com/photo-1551524559-8af4e6624178?w=1200&h=500&fit=crop",
        alt: "Ice hotel interior",
      }}
      suites={[
        {
          name: "Aurora Suite",
          temperature: "-5°C",
          capacity: "2 guests",
          description: "Carved walls depicting the northern lights.",
        },
        {
          name: "Ceremony Hall",
          temperature: "-7°C",
          capacity: "80 guests",
          description: "Vaulted ice ceiling with crystal chandeliers.",
        },
      ]}
      buttons={[{ label: "Book a Night", href: "https://beste.co" }]}
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string; variant?: "default" | "secondary" | "outline" }Eyebrow badge overlaid on the hero image
headingstringHeading overlaid on the hero image
descriptionstringDescription overlaid on the hero image
image{ src: string; alt: string }Hero photo behind the overlay text
suitesSuiteItem[][]Room/suite cards below the hero
buttonsButtonItem[][]Centered CTA row at the bottom
classNamestringExtra classes for the outer <section>
ts
type SuiteItem = {
  name: string;
  temperature: string;
  capacity: string;
  description: string;
};

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

Behavior notes

  • The badge, heading, and description only render inside the hero when image is also set; without an image prop the entire header block (badge, heading, description) disappears, since all three are nested inside the image && (...) guard.
  • The hero badge always renders with variant="secondary" hardcoded in the JSX, ignoring whatever badge.variant is passed in the prop; only badge.label is actually read.
  • The hero uses a fixed <img width={1200} height={500}> with object-cover rather than the absolute inset-0 fill pattern used elsewhere in the set, so its aspect ratio comes from the intrinsic width/height attributes, not a Tailwind aspect-ratio class.
  • A bg-black/50 overlay (z-10) sits between the image and the text (z-20), so overlay text stays legible regardless of the underlying photo's brightness.
  • Each suite card shows two badges side by side, temperature as variant="secondary" and capacity as variant="outline", so the two are visually distinct even though both are plain strings with no unit validation.

More About blocks

View all About
PRO

about11

Hero Banner with Avatars

Wide hero image with gradient overlay text, inline stats, and a stacked avatar strip of team members.

PRO

about43

Heading Hero About

An oversized about statement hero above three heterogeneous zones: portrait, values and a CTA with stats.

PRO

about56

Showcase Hero With Video

Large heading with dual CTAs and a rating card, a playable video with floating metric cards, and a labelled about block with large paragraphs.

PRO

about54

Inset Card About

A cinematic wide image with an overlapping inset content card and a stat ribbon.

PRO

about14

Stats Bar with Story Card

Horizontal stats row at the top followed by a centered story card with heading, body text, and CTAs.

PRO

about60

Team Member Grid

Team section with an eyebrow, big heading, description and CTA above a responsive grid of people cards (portrait image, name, role).