Where Ostria sits
Twelve rooms in a house of island stone, each with its own terrace and a bed made up in heavy linen. The water is a short barefoot walk down an old path.
Around the bay you will find a bakery that opens at six, a chapel on the point and a harbor taverna that grills whatever came in that morning.
The sun goes down in front of every terrace
Two hundred olive trees around the house
Twenty minutes from the ferry quay
A centred overview for a small hotel: a quiet eyebrow, a large serif heading and two short paragraphs side by side, above three tall muted cards that each carry a hand-drawn line glyph (sunset, olive branch, ferry, key or lantern) drawing itself in and one large serif fact.
A centered serif heading and two short paragraphs side by side sit above three tall muted cards, each with a hand-drawn line glyph that draws itself in and one large serif fact.
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.
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
npx shadcn add "https://beste.dev/r/hotel29?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://beste.dev/r-base/hotel29?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/hotel29.tsx plus the text1 word stagger it uses for the heading.
The installed file exports hotel29Demo alongside the block: the exact props behind the preview above. Spread it to get a working section in one line.
import { Hotel29, hotel29Demo } from "@/components/beste/block/hotel29";
export default function Page() {
return <Hotel29 {...hotel29Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Hotel29 } from "@/components/beste/block/hotel29";
export default function Page() {
return (
<Hotel29
eyebrow="Where Ostria sits"
heading="The cove in three short lines"
paragraphs={[
"Twelve rooms in a house of island stone, each with its own terrace.",
"Around the bay you will find a bakery that opens at six and a harbor taverna.",
]}
facts={[
{ glyph: "sunset", label: "The sun goes down in front of every terrace" },
{ glyph: "key", label: "Check in whenever your ferry lands" },
{ glyph: "lantern", label: "Dinner by lantern light under the vine" },
]}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Small line above the heading |
heading | string | – | Serif <h2>, staggered word by word through Text1 |
paragraphs | string[] | [] | Short paragraphs under the heading, two columns from the medium breakpoint |
facts | Fact[] | [] | One card per fact, each with a glyph |
className | string | – | Extra classes for the outer <section> |
type GlyphName = "sunset" | "olive" | "ferry" | "key" | "lantern";
type Fact = {
glyph: GlyphName;
label: string;
};glyph picks one of the five names, and each path and circle animates pathLength from 0 to 1 over 1.8s once the card is in view.paragraphs or facts array removes that whole part. With reduced motion the glyphs render fully drawn and the entrances are skipped.