Ostria, a house on Paros

thesunsets.
Twelve rooms of lime plaster and linen above a quiet cove. Every one has an arch that frames the sea.
An artistic boutique hotel hero on a plain ground: a tall doorway arch rises open like a curtain from a drawn horizon line to reveal a room photograph, a sun disc in the theme colour sinks behind the arch as you scroll, and a serif headline splits either side of it, with a short intro, a sliding-marker pill and a text link.
A hero on a plain ground where a tall doorway arch opens upward from a horizon line that draws itself across the section, revealing a room photograph, while a sun disc in the primary color rises behind the arch and then sinks as you scroll, with the serif headline split either side of it.
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/hotel17?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://beste.dev/r-base/hotel17?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/hotel17.tsx plus the button22 sliding-marker pill for the booking button and the text1 word stagger for both halves of the headline.
The installed file exports hotel17Demo alongside the block: the exact props behind the preview above. Spread it to get a working section in one line.
import { Hotel17, hotel17Demo } from "@/components/beste/block/hotel17";
export default function Page() {
return <Hotel17 {...hotel17Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Hotel17 } from "@/components/beste/block/hotel17";
export default function Page() {
return (
<Hotel17
eyebrow="Ostria, a house on Paros"
heading={{ start: "Sleep where", end: "the sun sets." }}
description="Twelve rooms of lime plaster and linen above a quiet cove."
button={{ label: "Book a stay", href: "/book", tone: "dark" }}
link={{ label: "See the rooms", href: "/rooms" }}
image={{
src: "https://oud.pics/b/hotel/ostria-sea-suite.webp",
alt: "A linen bed facing a tall arched window onto the sea",
focus: "68% 50%",
}}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Line above the first half of the headline |
heading | Heading | – | Headline split into the part left of the arch and the part right of it |
description | string | – | Intro under the second half of the headline |
button | ActionButton | – | Button22 pill under the intro |
link | TextLink | – | Text link with an arrow beside the button |
image | Image | – | Photograph inside the arch, with an optional focal point |
className | string | – | Extra classes for the outer <section> |
type Heading = {
start: string;
end: string;
};
type ActionButton = {
label: string;
href: string;
tone?: "primary" | "light" | "dark" | "outline";
};
type TextLink = {
label: string;
href: string;
};
type Image = {
src: string;
alt: string;
focus?: string;
};clipPath over 1.8s, and the photograph settles from 130% and a 24px blur once the file has loaded.heading.start renders as the <h1> and heading.end as a paragraph; the second half starts its word stagger after the first half's words have played (0.08s per word), and the intro and actions follow after that.image.focus is passed to object-position (default 50% 50%), so you can keep the subject in view inside the narrow arch.dark.