Watch the Film Hero

A short film

Supperontheterrace,asthecandlestakeover.

We filmed one ordinary evening at Ostria, from the first candle to the last glass. Press play and stay a while.

About this block

Watch the Film HeroPRO

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.

Hotel35: Watch the Film Hero

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.

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://beste.dev/r/hotel35?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

bash
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.

Quick start

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.

tsx
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:

tsx
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" }}
    />
  );
}

Props

PropTypeDefaultDescription
eyebrowstring–Small line above the headline
headingstring–Centered serif <h1>, revealed word by word through Text1
descriptionstring–Paragraph under the headline
previewPreview–Silent looping film shown in the frame
filmFilm–The full film opened by the play button; also turns the button on
labelsLabels{}Text beside the length and the close button's accessible name
classNamestring–Extra classes for the outer <section>
ts
type Preview = {
  src: string;
  poster: string;
  label: string;
};

type Film = {
  src: string;
  poster: string;
  title: string;
  length: string;
};

type Labels = {
  watch?: string;
  close?: string;
};

Behavior notes

  • As the frame travels from the bottom of the viewport to its center, it scales from 0.86 to 1 and its corner radius shrinks from 24px to 6px.
  • The preview plays muted in a loop, pauses while the full-screen player is open and resumes when it closes. Hovering the frame zooms the preview slightly and deepens the overlay.
  • The play button opens a role="dialog" overlay labeled by film.title, with a native <video> that autoplays with controls. The page scroll is locked while it is open.
  • Esc or the round close button closes the player, and the body scroll style is restored on close.
  • The play button and its length line only render when film is set, so preview alone gives a silent looping frame with no player.
  • The frame is 4:5 on a phone and 16:9 from sm.
  • With reduced motion the preview stays paused on its poster, the scroll scale and radius stay fixed, and the ping ring around the play button is not rendered.

More Hotel blocks

View all Hotel
PRO

hotel36

Portrait Film Split Hero

PRO

hotel34

Full Bleed Film Hero

PRO

hotel37

Round Window Film Hero

Get Pro