Topic Rail FAQ

Questions

Sorted the way practices actually ask them

Pick the subject you are worried about. Every answer is written by someone who would have to fix it if it were wrong.

Still not answered? Ask the engineer who would have to fix it.

Talk to us

Two weeks end to end for most practices, and the busy part is three days in the middle. You send an export on day one, we spend an hour together mapping fields on day two, and your data lands in a private workspace by day five so your team can poke at it without risk.

About this block

Topic Rail FAQPRO

A categorised FAQ whose topic rail is derived from the questions themselves and carries live counts, switching the accordion beside it and resetting it to the first answer on every change.

Faq82: Topic Rail FAQ

A categorised FAQ whose topic rail is derived from the questions themselves and carries live counts, switching the accordion beside it and resetting it to the first answer on every change.

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.

Upgrade Now

Installation

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

bash
npx shadcn add "https://ui.beste.co/r/faq82?email=YOUR_EMAIL&license_key=YOUR_KEY"

Base UI flavor

bash
npx shadcn add "https://ui.beste.co/r-base/faq82?email=YOUR_EMAIL&license_key=YOUR_KEY"

This installs the block to components/beste/block/faq82.tsx plus the badge23 and button21 components it uses for the eyebrow and the support action.

Quick start

The installed file exports faq82Demo alongside the block: the exact props behind the preview above. Spread it to get a working FAQ in one line.

tsx
import { Faq82, faq82Demo } from "@/components/beste/block/faq82";

export default function FaqPage() {
  return <Faq82 {...faq82Demo} />;
}

Then replace the demo with your own props. Written out, a trimmed setup looks like this:

tsx
import { Faq82 } from "@/components/beste/block/faq82";

export default function FaqPage() {
  return (
    <Faq82
      badge={{ label: "Questions" }}
      heading="Sorted the way practices actually ask them"
      description="Every answer is written by someone who would have to fix it if it were wrong."
      items={[
        {
          topic: "Migration",
          question: "How long does moving off our current system really take?",
          answer: "Two weeks end to end for most practices, and the busy part is three days.",
        },
        {
          topic: "Security",
          question: "Where is our data stored, and can it leave the region?",
          answer: "In the region you pick at setup, and it does not leave it.",
        },
        {
          topic: "Billing",
          question: "Is there an implementation or onboarding fee?",
          answer: "No. Migration, mapping, and the first go-live are part of the subscription.",
        },
      ]}
      support={{
        label: "Still not answered? Ask the engineer who would have to fix it.",
        button: { label: "Talk to us", href: "/contact" },
      }}
    />
  );
}

Props

PropTypeDefaultDescription
badge{ label: string }Eyebrow above the hairline rule, rendered through Badge23
headingstringSection heading in the left column of the header
descriptionstringSupporting paragraph, right-aligned from md up
itemsFaqItem[][]Questions, each carrying the topic it belongs to
support{ label: string; button: ActionLink }Fallback prompt under the topic rail
classNamestringExtra classes for the outer section
ts
type ActionLink = {
  label: string;
  href: string;
};

type FaqItem = {
  topic: string;
  question: string;
  answer: string;
};

Behavior notes

  • Topics are derived, not configured. They come from Array.from(new Set(items.map(item => item.topic))), so adding a question with a new topic adds a rail entry automatically, in first-appearance order. Counts are computed the same way per render.
  • Switching topics resets the open answer to index 0 in the same handler. Without that, moving from a topic where the fourth answer was open to one with two questions would leave nothing visible.
  • Panel keys are `${topic}-${index}`, so React remounts the rows when the topic changes rather than reusing them, which stops a stale open state carrying across.
  • Clicking the open question sets the index to -1, so all answers can be closed and the column collapses to a plain list of hairlines.
  • Answers are conditionally rendered rather than hidden with CSS, so collapsed content stays out of the DOM.
  • The rail is a horizontal pill row below lg and a vertical list from lg up. The per-topic counts are lg:inline only, since they would crowd the wrapped row on mobile.
  • The answer panel carries pr-11, which clears the chevron button so the text does not run under it.
  • Triggers are real button elements with aria-expanded and explicit cursor-pointer, since Tailwind v4 buttons default to cursor: default.

More FAQ blocks

View all FAQ
FREE

faq77

Numbered FAQ Index

A type-forward FAQ with a sticky heading rail and a numbered accordion list of expandable questions.

PRO

faq70

Two-Column FAQ

FAQ accordion split into two independent columns.

PRO

faq81

Grouped FAQ Columns

FAQ split into two labelled groups, each an independent accordion of ruled questions, so a long list stays scannable by topic; closed by a response-time note beside an outline pill CTA.

PRO

faq12

Grouped Sections

FAQs organized into titled sections with accordions underneath. Excellent for presenting related questions grouped by topic.

PRO

faq85

Live Search FAQ

An FAQ with a search field that narrows the list as it is typed, matching against topic, question, and answer, with every answer open on its own hairline row and an empty state when nothing matches.

PRO

faq87

FAQ With Contact Panel

An accordion FAQ set against a column that sticks while the answers scroll, holding an image tile that floats a live card for the engineer who wrote them and a direct booking action.