Ostria, Paros
A stone house of twelve rooms on a quiet cove, where the day starts when the light comes through the slats.

An artistic hotel hero: a serif headline and a short intro over one wide photograph cut into tall slats like wooden shutters, which open from the centre outwards once the image has loaded and then drift at slightly different speeds as the page scrolls, so the view breathes like light through louvres.
A hero with a large serif headline and a short intro over one wide photograph cut into tall slats like wooden shutters: once the image loads, the slats open from the center outward, and as the page scrolls each one drifts down at its own speed so the picture breathes like light through louvers.
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/hotel19?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://beste.dev/r-base/hotel19?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/hotel19.tsx plus the button22 sliding-marker pill for the booking button and the text1 word stagger for the headline.
The installed file exports hotel19Demo alongside the block: the exact props behind the preview above. Spread it to get a working section in one line.
import { Hotel19, hotel19Demo } from "@/components/beste/block/hotel19";
export default function Page() {
return <Hotel19 {...hotel19Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Hotel19 } from "@/components/beste/block/hotel19";
export default function Page() {
return (
<Hotel19
eyebrow="Ostria, Paros"
heading="Open the shutters. The rest is the sea."
description="A stone house of twelve rooms on a quiet cove."
button={{ label: "Book a stay", href: "/book", tone: "dark" }}
link={{ label: "Walk through the house", href: "/house" }}
image={{
src: "https://oud.pics/b/hotel/ostria-exterior-golden.webp",
alt: "A whitewashed stone hotel stepping down a hillside to a cove at sunset",
}}
slats={5}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Line above the headline |
heading | string | – | Serif <h1>, through Text1 |
description | string | – | Intro in the right column |
button | ActionButton | – | Button22 pill under the intro |
link | TextLink | – | Text link with an arrow beside the button |
image | Image | – | The photograph shared across the slats |
slats | number | 6 | How many slats to cut the photograph into (at least 2) |
className | string | – | Extra classes for the outer <section> |
type ActionButton = {
label: string;
href: string;
tone?: "primary" | "light" | "dark" | "outline";
};
type TextLink = {
label: string;
href: string;
};
type Image = {
src: string;
alt: string;
};clipPath over 1.5s, delayed 0.12s per step away from the center, while the photo settles from 118% to 100%.alt; the copies are aria-hidden with empty alt so screen readers announce the photograph once.sm and 16:8 from large screens. The headline takes eight columns on large screens with the intro and actions in the remaining four.dark.