Product Finder Quiz

(Find your bag)

Three questions, one bag.

Rather than filter twelve bags by six attributes, tell us how you travel. We name one bag and say exactly why it came out on top.

A black backpack held up by its handle against a plain background

Twelve bags in the range, each one carried loaded before it was signed off. Only one of them is the answer to your particular week.

How long are you usually away?

The most common trip, not the longest one you have ever taken.

About this block

Product Finder QuizFREE

A finder that replaces a filter sidebar: three questions score every product against the traits the answers ask for, and the winner takes over the plate beside them with its photograph, its price, and the reasons it came out on top.

Ecommerce46: Product Finder Quiz

A finder that replaces a filter sidebar. Three questions score every product against the traits the answers ask for, and the winner takes over the plate beside them with its photograph, its price, and the reasons it came out on top.

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/ecommerce46"

Base UI flavor

bash
npx shadcn add "https://ui.beste.co/r-base/ecommerce46"

That installs the block file, the badge7 eyebrow and button12 pill it is built from, and the questionnaire primitive.

Quick start

tsx
import { Ecommerce46, ecommerce46Demo } from "@/components/beste/block/ecommerce46";

export default function Page() {
  return <Ecommerce46 {...ecommerce46Demo} />;
}
tsx
import { Ecommerce46 } from "@/components/beste/block/ecommerce46";

export default function Page() {
  return (
    <Ecommerce46
      badge={{ label: "Find your bag" }}
      heading="Three questions, one bag"
      description="Tell us how you travel and we will name one bag."
      shortcuts="numbers"
      labels={{ submit: "See my match", resultTitle: "Your match" }}
      questions={[
        {
          name: "trip",
          title: "How long are you usually away?",
          choices: [
            {
              value: "day",
              label: "Out and back in a day",
              // what this answer asks a product for
              traits: ["compact", "laptop"],
              // printed in the reasons list when the winner has one of them
              reason: "Sized for a day out rather than a week away",
            },
            {
              value: "week",
              label: "A week or more",
              traits: ["large", "expandable"],
              reason: "Deep main compartment for a week of packing",
            },
          ],
        },
        {
          name: "needs",
          title: "Anything it has to survive?",
          multiple: true,
          choices: [
            {
              value: "rain",
              label: "Rain, regularly",
              traits: ["waterproof"],
              reason: "Coated shell and covered zips for wet platforms",
            },
          ],
        },
      ]}
      products={[
        {
          name: "Halden 18 Daypack",
          price: "$180",
          summary: "Eighteen litres that keep their shape empty.",
          image: {
            src: "https://images.unsplash.com/photo-1553062407-98eeb64c6a62?w=900&h=900&fit=crop",
            alt: "Charcoal daypack standing upright against a plain wall",
          },
          traits: ["compact", "laptop", "waterproof"],
          button: { label: "See the Halden 18", href: "https://beste.co" },
        },
      ]}
      image={{
        src: "https://images.unsplash.com/photo-1581605405669-fcdf81165afa",
        alt: "A black backpack held up by its handle against a plain background",
      }}
      caption="Twelve bags in the range. Only one of them is the answer."
    />
  );
}

Props

PropTypeDefaultDescription
badgeBadgeParenthetical eyebrow above the heading, rendered with Badge7.
headingstringSection heading.
descriptionstringSection description under the heading.
questionsFinderQuestion[][]The questions, in the order they are asked.
shortcuts"letters" | "numbers"Prints a shortcut on every choice of the active question.
productsProduct[][]Scored against the answers; the highest score wins.
labelsEcommerce46Labels{}Overrides for the navigation buttons and the result copy.
imageProductImagePlate shown beside the questions until a product wins.
captionstringLine under the standing plate.
classNamestringMerged onto the section element.
ts
type Badge = { label: string };
type ActionButton = { label: string; href: string };
type ProductImage = { src: string; alt: string };

type FinderQuestion = {
  name: string;
  title: string;
  description?: string;
  choices?: FinderChoice[];
  multiple?: boolean;
};

type FinderChoice = {
  value: string;
  label: string;
  description?: string;
  traits?: string[];
  reason?: string;
};

type Product = {
  name: string;
  price: string;
  summary: string;
  image: ProductImage;
  traits?: string[];
  button: ActionButton;
};

type Ecommerce46Labels = {
  previous?: string;
  next?: string;
  submit?: string;
  restart?: string;
  resultTitle?: string;
  reasonsTitle?: string;
};

Behavior notes

  • Scoring is one point per trait. Every picked answer contributes its traits, and each product scores the number of them it carries, so a product does not have to satisfy everything to win.
  • Ties go to the first product in the array, which makes the order of products your tie-breaker: put the safest recommendation first.
  • The reasons list is not written by hand. It collects the reason of every answer the winning product actually satisfies, so the same product explains itself differently depending on how it was reached.
  • A question with multiple: true renders checkboxes and is optional, so it can be passed with Next. The single-answer questions are required.
  • Submitting swaps the standing plate for the winning product's own photograph and the questions for the result, so the picture and the answer change together. Answer again clears both.
  • Give every product a full set of traits even when it overlaps heavily with another, otherwise a bag that is genuinely fine for a trip scores zero and never surfaces.
  • Keep the standing image off the products. Showing one of them before a question is answered reads as the recommendation already being made.

More Ecommerce blocks

View all Ecommerce
PRO

ecommerce45

Advanced Variant Selector

Customizable product configurator with color swatches, size selection, material options, and dynamic pricing. Real-time stock tracking per combination. Perfect for configurable products and custom merchandise.

FREE

ecommerce4

Shop by Category Grid

Product category browsing with image cards, product counts, and featured badges. Responsive grid layout with hover effects. Perfect for storefront navigation and collection showcases.

PRO

ecommerce14

Related Products Grid

Product recommendations grid with images, prices, and add to cart buttons. Perfect for cross-selling and upselling on product pages.

PRO

ecommerce2

Product Detail with Variants

Product page hero with color and size selectors, quantity picker, and wishlist button. Perfect for detailed product pages with multiple variants.

PRO

ecommerce34

Gift Finder by Budget

Budget filter tabs with curated gift cards, wishlist buttons, and quick add to cart. Perfect for gift guides and seasonal shopping pages.

FREE

ecommerce5

Featured Product Showcase

Full-featured product presentation with pricing, ratings, feature list, and add to cart. Split layout with configurable image position. Perfect for highlighting premium products and limited editions.