A destination finder that eliminates in the open: a grid of six photographs sits beside the questions and dims the places each answer rules out, with a live count under it, before the survivors are listed with their notes and links.
A destination finder that eliminates in the open. A grid of six photographs sits beside the questions and dims the places each answer rules out, with a live count under it, before the survivors are listed with their notes and links.
Free block
This block is free. No license or account is required: install it with the CLI and use it in unlimited projects.
Radix flavor
npx shadcn add "https://ui.beste.co/r/travel42"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/travel42"That installs the block file, the badge23 eyebrow and button21 action button it is built from, and the questionnaire primitive.
import { Travel42, travel42Demo } from "@/components/beste/block/travel42";
export default function Page() {
return <Travel42 {...travel42Demo} />;
}import { Travel42 } from "@/components/beste/block/travel42";
export default function Page() {
return (
<Travel42
badge={{ label: "Where to" }}
heading="Watch the list get shorter as you answer"
description="Every answer strikes the ones that no longer apply."
shortcuts="numbers"
questions={[
{
name: "pace",
title: "What is the trip for?",
choices: [
// a destination survives this answer when it carries one of these tags
{ value: "quiet", label: "Doing very little", keeps: ["quiet"] },
{ value: "outdoors", label: "Being outside all day", keeps: ["outdoors"] },
],
},
{
name: "length",
title: "How long have you got?",
choices: [
{ value: "short", label: "A long weekend", keeps: ["short"] },
{ value: "long", label: "A week or more", keeps: ["long"] },
],
},
]}
destinations={[
{
name: "Yosemite Valley",
note: "Granite walls, a river underneath them, and more trail than a week can cover.",
tags: ["outdoors", "long", "winter"],
image: {
src: "https://images.unsplash.com/photo-1506744038136-46273834b3fb",
alt: "A river running through a valley between granite cliffs at dawn",
},
link: { label: "See the Yosemite week", href: "https://beste.co" },
},
{
name: "Lago di Braies",
note: "A rowing boat, a shoreline path, and nothing else asked of you.",
tags: ["quiet", "short", "summer"],
image: {
src: "https://images.unsplash.com/photo-1501785888041-af3ef285b470",
alt: "Rowing boats on a green lake below limestone peaks",
},
link: { label: "See the Braies weekend", href: "https://beste.co" },
},
]}
labels={{ submit: "Keep what is left", countSuffix: "still fit" }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | Badge | – | Eyebrow above the rule, rendered with Badge23. |
heading | string | – | Section heading. |
description | string | – | Lead paragraph, set opposite the heading. |
questions | FilterQuestion[] | [] | The questions, in the order they are asked. Single answer each. |
shortcuts | "letters" | "numbers" | – | Prints a shortcut on every choice of the active question. |
destinations | Destination[] | [] | The grid that narrows as the questions are answered. |
labels | Travel42Labels | {} | Overrides for the navigation buttons, the count, and the empty state. |
className | string | – | Merged onto the section element. |
type Badge = { label: string };
type ActionLink = { label: string; href: string };
type DestinationImage = { src: string; alt: string };
type FilterQuestion = {
name: string;
title: string;
description?: string;
choices?: FilterChoice[];
};
type FilterChoice = {
value: string;
label: string;
description?: string;
keeps?: string[];
};
type Destination = {
name: string;
note: string;
image: DestinationImage;
tags?: string[];
link?: ActionLink;
};
type Travel42Labels = {
previous?: string;
next?: string;
submit?: string;
restart?: string;
countSuffix?: string;
shortlistTitle?: string;
emptyTitle?: string;
emptyBody?: string;
};keeps. Questions that have not been answered yet rule nothing out, which is what makes the grid narrow one step at a time instead of all at once.travel5
Two-column layout with feature checklist, rating display, and floating destination stats card alongside a featured image. Perfect for travel planning services highlighting their value propositions.
travel8
Destination grid with icon-based category filter buttons for beach, mountain, city, nature, and cultural trips. Perfect for travel sites letting users browse destinations by experience type.
travel9
Ranked list of trending destinations showing position numbers, thumbnails, trend percentages, and hot indicators. Perfect for showcasing popular or rising travel destinations with social proof.
travel6
Responsive card grid showcasing destinations with images, ratings, pricing, and interactive favorites. Perfect for travel booking sites displaying popular vacation spots with quick comparison.