Opening Shutters Hero

Ostria, Paros

Opentheshutters.Therestisthesea.

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

A whitewashed stone hotel stepping down a hillside to a cove at sunset, with a pool and olive trees
About this block

Opening Shutters HeroPRO

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.

Hotel19: Opening Shutters Hero

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.

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/hotel19?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

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

Quick start

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.

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

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

Props

PropTypeDefaultDescription
eyebrowstring–Line above the headline
headingstring–Serif <h1>, through Text1
descriptionstring–Intro in the right column
buttonActionButton–Button22 pill under the intro
linkTextLink–Text link with an arrow beside the button
imageImage–The photograph shared across the slats
slatsnumber6How many slats to cut the photograph into (at least 2)
classNamestring–Extra classes for the outer <section>
ts
type ActionButton = {
  label: string;
  href: string;
  tone?: "primary" | "light" | "dark" | "outline";
};

type TextLink = {
  label: string;
  href: string;
};

type Image = {
  src: string;
  alt: string;
};

Behavior notes

  • Every slat holds the same image, stretched to the full band width and offset by its index, so together they read as one picture with gaps between.
  • The slats stay closed until the image has loaded, then each opens top to bottom with a clipPath over 1.5s, delayed 0.12s per step away from the center, while the photo settles from 118% to 100%.
  • On scroll every slat moves down by 8% plus up to 10% more the farther it is from the center, so the outer slats lead and the band appears to flex.
  • Only the first slat's image carries alt; the copies are aria-hidden with empty alt so screen readers announce the photograph once.
  • The band is 4:5 on phones, 16:10 from sm and 16:8 from large screens. The headline takes eight columns on large screens with the intro and actions in the remaining four.
  • The text plays on mount rather than on scroll into view. Reduced motion skips the reveal, zoom and drift; the button tone falls back to dark.

More Hotel blocks

View all Hotel
PRO

hotel35

Watch the Film Hero

PRO

hotel36

Portrait Film Split Hero

PRO

hotel20

Name Over the Window Hero

Get Pro