Narrowing Destination ShortlistFREE

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.

Travel42: Narrowing Destination Shortlist

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.

Installation

Radix flavor

bash
npx shadcn add "https://ui.beste.co/r/travel42"

Base UI flavor

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

Quick start

tsx
import { Travel42, travel42Demo } from "@/components/beste/block/travel42";

export default function Page() {
  return <Travel42 {...travel42Demo} />;
}
tsx
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" }}
    />
  );
}

Props

PropTypeDefaultDescription
badgeBadgeEyebrow above the rule, rendered with Badge23.
headingstringSection heading.
descriptionstringLead paragraph, set opposite the heading.
questionsFilterQuestion[][]The questions, in the order they are asked. Single answer each.
shortcuts"letters" | "numbers"Prints a shortcut on every choice of the active question.
destinationsDestination[][]The grid that narrows as the questions are answered.
labelsTravel42Labels{}Overrides for the navigation buttons, the count, and the empty state.
classNamestringMerged onto the section element.
ts
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;
};

Behavior notes

More Travel blocks

View all Travel
PRO

travel5

Split Travel Planner

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.

PRO

travel8

Filterable Destinations

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.

PRO

travel9

Trending Destinations List

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.

PRO

travel6

Destination Cards Grid

Responsive card grid showcasing destinations with images, ratings, pricing, and interactive favorites. Perfect for travel booking sites displaying popular vacation spots with quick comparison.

PRO

travel25

Destination Highlights

Grid of local experiences with category badges, location, duration, and ratings for a specific destination. Perfect for destination pages showcasing must-do activities and attractions.

PRO

travel18

Travel Guides Team

Grid showcase of travel guides with photos, specialties, languages spoken, ratings, and tour counts. Perfect for tour companies highlighting their expert local guides.