Around the cove
The island is small enough to know well. These are the places we send friends, and the front desk will happily arrange any of them.
A local guide strip for a hotel: portrait experience cards that start in line with the heading and bleed off the right edge, snap as you swipe or step with arrow buttons, lean in on hover under a small category pill, and carry a serif title, a short note and how far it is, with a hairline that fills as you scroll.
A horizontal strip of portrait experience cards that starts in line with the heading and bleeds off the right edge, snaps card by card as you swipe or press the arrow buttons, and fills a hairline progress bar underneath as it scrolls; each card leans in on hover under a category pill.
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/hotel16?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://beste.dev/r-base/hotel16?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/hotel16.tsx plus the text1 word stagger it uses for the heading.
The installed file exports hotel16Demo alongside the block: the exact props behind the preview above. Spread it to get a working section in one line.
import { Hotel16, hotel16Demo } from "@/components/beste/block/hotel16";
export default function Page() {
return <Hotel16 {...hotel16Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Hotel16 } from "@/components/beste/block/hotel16";
export default function Page() {
return (
<Hotel16
eyebrow="Around the cove"
heading="What we do on our days off."
description="These are the places we send friends on Paros."
experiences={[
{
kind: "Swim",
title: "The rocks before breakfast",
description: "Clear water off smooth stone, ten minutes along the coast path.",
distance: "10 min on foot",
href: "/around/rocks",
image: { src: "https://oud.pics/b/hotel/ostria-swimmer.webp", alt: "A woman stepping from pale rocks into clear water" },
},
{
kind: "Village",
title: "Coffee at the harbor",
description: "Watch the fishing boats come back in the morning.",
distance: "6 min on foot",
href: "/around/harbor",
image: { src: "https://oud.pics/b/hotel/ostria-harbour.webp", alt: "Fishing boats moored at a stone quay" },
},
]}
labels={{ previous: "Previous", next: "Next" }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Uppercase line above the heading |
heading | string | – | Serif heading, through Text1 |
description | string | – | Paragraph above the arrow buttons |
experiences | Experience[] | [] | The cards in the strip, each one a link |
labels | Labels | {} | Accessible names for the arrow buttons |
className | string | – | Extra classes for the outer <section> |
type Experience = {
kind: string;
title: string;
description: string;
distance: string;
href: string;
image: { src: string; alt: string };
};
type Labels = {
previous?: string;
next?: string;
};snap-start with mandatory snapping; they are 78vw wide on phones, 22rem from sm and 24rem from large screens. The scrollbar is hidden.