
Spring
When to come
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.
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.
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.
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/hotel27?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
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.
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.
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:
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" },
},
]}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Small uppercase line above the heading |
heading | string | – | Serif <h2>, staggered word by word through Text1 |
description | string | – | Paragraph under the heading |
seasons | Season[] | [] | One tab row, panel and photo per season |
className | string | – | Extra classes for the outer <section> |
type Season = {
name: string;
months: string;
note: string;
facts: { label: string; value: string }[];
image: { src: string; alt: string };
};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.layoutId element, so it slides from one row's top rule to the next instead of jumping.<dl> with the value above its label, so the grid is designed for three figures.top-24; below that it moves under the list.