A short film
We filmed one ordinary evening at Ostria, from the first candle to the last glass. Press play and stay a while.
A centered hotel hero with a serif headline over a framed preview film that loops silently, grows towards the container edges and loses its soft corners as it scrolls in, and carries a large play button with the film's length; pressing it opens a full-screen player with native controls.
A centered serif headline settles in word by word above a framed preview film that loops silently, grows from 86% to full width and loses its rounded corners as it scrolls in, and carries a large pulsing play button with the film's length that opens a full-screen player with native controls.
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/hotel35?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://beste.dev/r-base/hotel35?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/hotel35.tsx plus the text1 word stagger used for the headline.
The installed file exports hotel35Demo alongside the block: the exact props behind the preview above. Spread it to get a working section in one line.
import { Hotel35, hotel35Demo } from "@/components/beste/block/hotel35";
export default function Page() {
return <Hotel35 {...hotel35Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Hotel35 } from "@/components/beste/block/hotel35";
export default function Page() {
return (
<Hotel35
eyebrow="A short film"
heading="Supper on the terrace, as the candles take over."
description="One ordinary evening at Ostria on Paros, from the first candle to the last glass."
preview={{
src: "https://oud.pics/b/hotel/ostria-video-dining-terrace.mp4",
poster: "https://oud.pics/b/hotel/ostria-dining-terrace.webp",
label: "Candles on a long table under a vine pergola at dusk",
}}
film={{
src: "https://oud.pics/b/hotel/ostria-video-dining-terrace.mp4",
poster: "https://oud.pics/b/hotel/ostria-dining-terrace.webp",
title: "An evening at Ostria",
length: "0:08",
}}
labels={{ watch: "Watch the film", close: "Close the film" }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Small line above the headline |
heading | string | – | Centered serif <h1>, revealed word by word through Text1 |
description | string | – | Paragraph under the headline |
preview | Preview | – | Silent looping film shown in the frame |
film | Film | – | The full film opened by the play button; also turns the button on |
labels | Labels | {} | Text beside the length and the close button's accessible name |
className | string | – | Extra classes for the outer <section> |
type Preview = {
src: string;
poster: string;
label: string;
};
type Film = {
src: string;
poster: string;
title: string;
length: string;
};
type Labels = {
watch?: string;
close?: string;
};role="dialog" overlay labeled by film.title, with a native <video> that autoplays with controls. The page scroll is locked while it is open.film is set, so preview alone gives a silent looping frame with no player.sm.