Seasons to Visit

A hillside of yellow daisies and red poppies among olive trees above the sea

Spring

When to come

Everyseasonhasitsownreason.

The house is open from April to November. Here is what each part of the year feels like, so you can choose yours.

Wildflowers on every slope, the island to yourself and the first brave swims at noon.

Sea
18°
Sunset
20:15
From
€260
About this block

Seasons to VisitPRO

A when-to-come section for a seasonal hotel: a ruled vertical list of seasons with their months, a hairline marker that glides to the chosen one, a short note and three large figures for sea temperature, sunset and starting rate, beside a pinned photograph that crossfades to the season with its name rolling in over the image.

Hotel27: Seasons to Visit

A ruled vertical list of seasons sits beside a pinned photograph: choosing a season glides a hairline marker to its row, reveals a short note with three large figures, and crossfades the photo while the season's name rolls up over 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.

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

Base UI flavor

bash
npx shadcn add "https://beste.dev/r-base/hotel27?email=YOUR_EMAIL&license_key=YOUR_KEY"

This installs the block to components/beste/block/hotel27.tsx plus the text1 word stagger for the heading and the shadcn/ui tabs primitive that drives the vertical season list and its panels.

Quick start

The installed file exports hotel27Demo alongside the block: the exact props behind the preview above. Spread it to get a working section in one line.

tsx
import { Hotel27, hotel27Demo } from "@/components/beste/block/hotel27";

export default function Page() {
  return <Hotel27 {...hotel27Demo} />;
}

Then replace the demo with your own props. Written out, a trimmed setup looks like this:

tsx
import { Hotel27 } from "@/components/beste/block/hotel27";

export default function Page() {
  return (
    <Hotel27
      eyebrow="When to come"
      heading="Every season has its own reason."
      description="The house is open from April to November."
      seasons={[
        {
          name: "Spring",
          months: "April and May",
          note: "Wildflowers on every slope and the island to yourself.",
          facts: [
            { label: "Sea", value: "18°" },
            { label: "Sunset", value: "20:15" },
            { label: "From", value: "€260" },
          ],
          image: { src: "https://oud.pics/b/hotel/ostria-spring-hillside.webp", alt: "A hillside of daisies and poppies above the sea" },
        },
        {
          name: "Late summer",
          months: "August and September",
          note: "The warmest sea of the year and the grape harvest in the hills.",
          facts: [
            { label: "Sea", value: "25°" },
            { label: "Sunset", value: "19:40" },
            { label: "From", value: "€480" },
          ],
          image: { src: "https://oud.pics/b/hotel/ostria-vineyard.webp", alt: "Low bush vines in red earth above the sea" },
        },
      ]}
    />
  );
}

Props

PropTypeDefaultDescription
eyebrowstring–Small uppercase line above the heading
headingstring–Serif <h2>, staggered word by word through Text1
descriptionstring–Paragraph under the heading
seasonsSeason[][]One tab row, panel and photo per season
classNamestring–Extra classes for the outer <section>
ts
type Season = {
  name: string;
  months: string;
  note: string;
  facts: { label: string; value: string }[];
  image: { src: string; alt: string };
};

Behavior notes

  • The season list is a vertical Tabs keyed by name, so season names must be unique; the first season is selected on load, and the tabs primitive provides keyboard navigation between rows.
  • The active row's hairline marker is a shared layoutId element, so it slides from one row's top rule to the next instead of jumping.
  • Switching seasons crossfades the photo with a slight zoom-out and rolls the season name up from below over a bottom gradient while the old name exits upward.
  • The note and facts fade up in the new panel, the facts 0.08s apart. Facts render as a three-column <dl> with the value above its label, so the grid is designed for three figures.
  • From the large breakpoint the photo takes seven of twelve columns on the left and is sticky at top-24; below that it moves under the list.
  • Each photo fades in from a 24px blur only after it has loaded. With reduced motion the entrance fades are skipped.

More Hotel blocks

View all Hotel
PRO

hotel49

When to Come Year Chart

PRO

hotel11

Seasonal Stay Offers

PRO

hotel45

Gift a Stay List

Get Pro