Room Collection List

About this block

Room Collection ListPRO

A rooms overview for a small hotel: a pinned photograph that crossfades to whichever room is hovered or focused, with a nightly rate pill on the frame, beside a ruled list of serif room names, one-line descriptions and dotted facts like size, view and guests. Phones get each photo inline.

Hotel3: Room Collection List

A two-column rooms overview: a sticky photograph on the left crossfades to whichever room is hovered or focused in the ruled list on the right, where each row holds a serif room name, a one-line summary and dotted facts.

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://beste.dev/r/hotel3?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

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

This installs the block to components/beste/block/hotel3.tsx plus the text1 word stagger behind the heading.

Quick start

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

tsx
import { Hotel3, hotel3Demo } from "@/components/beste/block/hotel3";

export default function Page() {
  return <Hotel3 {...hotel3Demo} />;
}

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

tsx
import { Hotel3 } from "@/components/beste/block/hotel3";

export default function Page() {
  return (
    <Hotel3
      eyebrow="Rooms and suites"
      heading="Four ways to wake up by the sea."
      description="Every room is different because the house was never planned."
      link={{ label: "Compare all twelve rooms", href: "/rooms" }}
      rooms={[
        {
          name: "Sea Suite",
          summary: "An arched door opens straight onto the terrace and the cove below.",
          facts: ["42 m²", "Sea view", "2 guests"],
          price: "€480",
          priceUnit: "a night",
          href: "/rooms/sea-suite",
          image: { src: "https://oud.pics/b/hotel/ostria-sea-suite.webp", alt: "A linen bed facing a tall arched window onto the sea" },
        },
        {
          name: "Garden Room",
          summary: "Glass doors to a walled garden and an old olive tree.",
          facts: ["34 m²", "Private garden", "2 guests"],
          price: "€360",
          priceUnit: "a night",
          href: "/rooms/garden-room",
          image: { src: "https://oud.pics/b/hotel/ostria-garden-room.webp", alt: "A bedroom with glass doors open onto a garden terrace" },
        },
      ]}
      labels={{ from: "From" }}
    />
  );
}

Props

PropTypeDefaultDescription
eyebrowstring–Uppercase line above the heading
headingstring–Serif <h2>, staggered word by word through Text1
descriptionstring–Paragraph to the right of the heading
linkTextLink–Text link with an arrow under the description
roomsRoom[][]The rooms in the list, each with its own photograph
labelsLabels{}Word placed before every price
classNamestring–Extra classes for the outer <section>
ts
type TextLink = {
  label: string;
  href: string;
};

type Room = {
  name: string;
  summary: string;
  facts: string[];
  price: string;
  priceUnit: string;
  href: string;
  image: { src: string; alt: string };
};

type Labels = {
  from?: string;
};

Behavior notes

  • From the medium breakpoint the photograph sits in a sticky 4:3 frame beside the list. Hovering or focusing a room makes it active: the frame crossfades to its image while scaling down from 1.06, and a pill on the frame shows labels.from, the price and the unit.
  • The active room name is full strength while the others dim to 45%, and its arrow slides in; inactive arrows are hidden on desktop.
  • Below the medium breakpoint the sticky frame is hidden. Each row shows its own photo inline and puts the price at the end of the facts line.
  • The hairlines above and between rows draw in from the left with scaleX as they enter the viewport (once), and rows fade up with a 0.1 second stagger.
  • Photos fade in from a blur only after the file has loaded. Reduced motion skips the entrance, blur and rule animations.
  • Facts are separated by small dots, and every row is a single link to the room's href.

More Hotel blocks

View all Hotel
PRO

hotel4

Room Detail with Reserve Card

PRO

hotel45

Gift a Stay List

PRO

hotel39

Rooms Gallery with Filmstrip Lightbox

Get Pro