Visit Sheet

A shaded beach seen from under a tree

Visit

Comeandseetheroomsbeforeyoudecideanything.

Most Thursdays we keep the late afternoon free for visits. You can sit in the chair, see the light, and leave without booking.

Where

Rua da Prata 12, second floor1100-415 Lisbon

Four minutes on foot from Baixa-Chiado. There is a lift to the door and a quiet room to wait in.

When

Monday to Thursday
9:00 to 21:00
Friday
9:00 to 15:00
Saturday and Sunday
Quiet days only
About this block

Visit SheetPRO

A visit-us section: a photograph drifting inside its frame on the left, and on the right a serif heading that settles in word by word, an intro, a ruled sheet with the serif address, directions and opening hours, a sliding-marker pill and a text link.

Booking31: Visit Sheet

A visit page rather than a booking form: a portrait photograph drifting inside its frame beside the invitation, then address and opening hours side by side under one rule, closed by a pill action and a quieter second link.

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

Base UI flavor

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

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

Quick start

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

tsx
import { Booking31, booking31Demo } from "@/components/beste/block/booking31";

export default function Page() {
  return <Booking31 {...booking31Demo} />;
}

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

tsx
import { Booking31 } from "@/components/beste/block/booking31";

export default function Page() {
  return (
    <Booking31
      eyebrow="Visit"
      heading="Come and see the rooms before you decide anything."
      description="Most Thursdays we keep the late afternoon free for visits."
      address={{
        lines: ["Rua da Prata 12, second floor", "1100-415 Lisbon"],
        directions: "Four minutes on foot from Baixa-Chiado, with a lift to the door.",
      }}
      hours={[
        { day: "Monday to Thursday", hours: "9:00 to 21:00" },
        { day: "Friday", hours: "9:00 to 15:00" },
      ]}
      button={{ label: "Plan a visit", href: "/visit", tone: "dark" }}
      link={{ label: "Or ask a question first", href: "mailto:[email protected]" }}
      image={{ src: "/rooms/kitchen.jpg", alt: "A kitchen with oak cabinets and a window onto a garden" }}
      labels={{ address: "Where", hours: "When" }}
    />
  );
}

Props

PropTypeDefaultDescription
eyebrowstring–Small-caps line above the heading
headingstring–Section heading, rendered as an h2 through Text1
descriptionstring–Invitation paragraph under the heading
address{ lines: string[]; directions: string }–Address block and the getting-here note
hoursHourRow[][]Opening-hours rows
buttonActionButton–Pill action at the foot
link{ label: string; href: string }–Quieter second action beside the pill
image{ src: string; alt: string }–Photograph in the left column
labels{ address?: string; hours?: string }{}Small-caps titles over the two columns
classNamestring–Extra classes for the outer <section>
ts
type HourRow = {
  day: string;
  hours: string;
};

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

Behavior notes

  • The address takes an array of lines rather than one string with newlines, so each line becomes its own block span and the serif setting wraps exactly where you decided it should.
  • Opening hours are a dl with the day and its hours stacked rather than opposed, which is what stops a long value like "Quiet days only" from colliding with a long day label in a narrow column.
  • The two facts columns share one border-t and split at sm, so on a phone the address and the hours stack in reading order instead of squeezing into two thin columns.
  • The photograph drifts -10% to 10% against a 1.2 scale and clears from blur(24px) on decode, with a complete check on mount so a cached image is not left blurred.
  • The pill and the plain link sit in one wrapping flex row, so the secondary action drops under the primary on a narrow screen rather than shrinking beside it.
  • The link's arrow lifts only under motion-safe:, so the affordance is dropped for reduced motion while the link still works.
  • Every block is independently optional: without image the copy column keeps its grid position, and the action row disappears entirely when neither button nor link is given.

More Booking blocks

View all Booking
PRO

booking30

Session Request

PRO

booking32

Plain Contact

PRO

booking33

Session Picker

Get Pro access