The Rooms Grid

The rooms

Plasterwalls,alowbench,andawindowthatgetstheafternoon.

We chose the rooms before we chose the furniture. Everything in them is here to make sitting still for an hour feel like a reasonable thing to do.

Visit before you book
Swimmers and sunbathers on a pebble beach under a clear sky
A rocky Mediterranean shore with hills across the bay
Parasols and towels across a wide sandy beach
Turquoise shallows and a pebble beach seen from above
Address
Rua da Prata 12, second floor, Lisbon
Getting here
Four minutes from Baixa-Chiado, lift to the door
Access
Step-free, with a quiet room to wait in
About this block

The Rooms GridPRO

A studio tour: a serif heading that settles in word by word beside the intro and a pill action, four photographs of the rooms in an uneven, offset grid that each drift at their own pace as the page scrolls, and a ruled row of visiting details.

About77: The Rooms Grid

A section about the space itself: a wide heading and a short intro over four photographs in a deliberately uneven grid, each drifting inside its own frame, closed by a ruled row of practical details like address, transport and access.

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

Base UI flavor

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

This installs the block to components/beste/block/about77.tsx plus the button22 sliding-marker pill and the text1 word stagger it uses.

Quick start

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

tsx
import { About77, about77Demo } from "@/components/beste/block/about77";

export default function Page() {
  return <About77 {...about77Demo} />;
}

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

tsx
import { About77 } from "@/components/beste/block/about77";

export default function Page() {
  return (
    <About77
      eyebrow="The rooms"
      heading="Plaster walls, a low bench, and a window that gets the afternoon."
      description="We chose the rooms before we chose the furniture."
      button={{ label: "Visit before you book", href: "/visit", tone: "outline" }}
      photos={[
        { src: "/rooms/bench.jpg", alt: "A sunlit room with plaster walls and a low timber bench" },
        { src: "/rooms/ledge.jpg", alt: "A ceramic vessel and a folded cloth on a plaster ledge" },
        { src: "/rooms/table.jpg", alt: "A calm room with a long stone table and linen chairs" },
        { src: "/rooms/kitchen.jpg", alt: "A kitchen with oak cabinets and a window onto a garden" },
      ]}
      details={[
        { label: "Address", value: "Rua da Prata 12, second floor, Lisbon" },
        { label: "Access", value: "Step-free, with a quiet room to wait in" },
      ]}
    />
  );
}

Props

PropTypeDefaultDescription
eyebrowstringSmall-caps line above the heading
headingstringSection heading, rendered as an h2 through Text1
descriptionstringShort intro in the narrow right column
buttonActionButtonPill action under the intro
photosPhoto[][]Room photographs; only the first four are rendered
detailsDetail[][]Practical facts in the ruled row at the foot
classNamestringExtra classes for the outer <section>
ts
type Photo = {
  src: string;
  alt: string;
};

type Detail = {
  label: string;
  value: string;
};

type ActionButton = {
  label: string;
  href: string;
  tone?: "primary" | "light" | "dark" | "outline";
};

Behavior notes

  • The grid is a fixed four-slot layout, not a repeating one: slot widths, aspect ratios, drift distances and vertical offsets are declared per position, so the arrangement stays composed rather than becoming a regular grid the eye stops reading.
  • photos.slice(0, 4) caps the section at four. A fifth entry is dropped rather than falling into an undefined slot, and a slot beyond the list falls back to the first, so a shorter array never crashes the layout.
  • The two portrait slots drift 8% and the two landscape slots 12%, against a 1.25 scale. Taller frames need less travel to read as moving, and matching them would make the wide ones look static.
  • The vertical offsets (md:mt-24 on the second, md:-mt-24 on the fourth) apply from md only, so the uneven rhythm collapses to a plain stack on a phone where it would just read as broken spacing.
  • Entry delay alternates on index % 2, so the two photographs in a row arrive a beat apart rather than the stagger growing longer down the section.
  • Photos start at blur(24px) and clear on decode, with a complete check on mount so a cached image is never left blurred waiting for an onLoad that already fired.
  • The details row is a real dl with dt/dd pairs, so an address and its label stay associated for a screen reader rather than being two adjacent strings.

More About blocks

View all About
PRO

about75

Practitioner Portraits

A team section: a serif heading that settles in word by word beside the intro and a pill action, then three portrait photographs that drift inside their frames as the page scrolls, each with a serif name, a small-caps role and a short bio.

PRO

about82

Band and Figures

An about section built around a wide photograph that drifts inside its frame: a serif heading that settles in word by word above it, then an intro with a sliding-marker pill beside four ruled serif figures that count up as they arrive.

PRO

about68

Team Portrait Grid

A team section with an eyebrow over a hairline rule, a two-column heading, and a grid of portrait cards each with a name and role.

PRO

about66

About with Stats Grid

Two-column about with a tall image on one side and an eyebrow, heading, description, and 2x2 stats grid on the other.

PRO

about78

Manifesto Lines

A manifesto set as numbered serif lines that each blur in as they reach the viewport, ruled from one another, beside a sticky photograph that drifts inside its frame as the page scrolls, closed by a sliding-marker pill.

PRO

about34

About Stats Grid

About section: eyebrow label, two-tone heading, two portraits beside a 2x2 stats grid.