Every answer is open by default and the list narrows as you type. Nothing is hidden behind a click.
Migration
Two weeks end to end, and the busy part is three days in the middle. You send an export on day one, we map fields together on day two, and your data lands in a private workspace by day five.
Migration
They arrive as free text attached to the right member rather than being dropped, and you get a written list of every field we could not map along with what we did instead.
Security
In the region you choose at setup, and it does not leave it. Backups stay in the same region and the audit log records every time anyone reads a member record.
Uptime
Member booking links keep working from cache while the admin app recovers, and we credit the month automatically whenever we miss the 99.95% commitment.
Billing
Yes, and we prorate in both directions. Adding a locum on Tuesday costs the days they were on the account, and removing them credits the rest.
Leaving
Thirty days' notice, no penalty, and a full export another system can import. The export stays available for ninety days after you close the account.
Still not answered?
Ask an engineerAn 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.
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.
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://ui.beste.co/r/faq85?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/faq85?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/faq85.tsx, the shadcn/ui input component it depends on, and the badge23 and button21 components it uses for the eyebrow and the support action.
The installed file exports faq85Demo alongside the block: the exact props behind the preview above. Spread it to get a working FAQ in one line.
import { Faq85, faq85Demo } from "@/components/beste/block/faq85";
export default function FaqPage() {
return <Faq85 {...faq85Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Faq85 } from "@/components/beste/block/faq85";
export default function FaqPage() {
return (
<Faq85
badge={{ label: "Search the answers" }}
heading="Type what you are worried about"
description="Every answer is open by default and the list narrows as you type."
searchLabel="Search questions"
searchPlaceholder="Try migration, uptime, or leaving"
items={[
{
topic: "Migration",
question: "How long does moving off our current system take?",
answer: "Two weeks end to end, and the busy part is three days in the middle.",
},
{
topic: "Uptime",
question: "What happens when the booking service goes down?",
answer: "Member booking links keep working from cache while the admin app recovers.",
},
]}
emptyLabel="Nothing matches that yet. Ask us directly."
support={{ label: "Still not answered?", button: { label: "Ask an engineer", href: "/contact" } }}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string } | – | Centered eyebrow above the heading, rendered through Badge23 |
heading | string | – | Section heading, centered and capped at max-w-2xl |
description | string | – | Centered supporting paragraph, capped at max-w-xl |
searchLabel | string | – | Visually hidden label for the search field |
searchPlaceholder | string | – | Placeholder inside the search field |
items | FaqItem[] | [] | Questions, each carrying the topic it belongs to |
emptyLabel | string | – | Line shown when the query matches nothing |
support | { label: string; button: ActionLink } | – | Fallback prompt at the foot of the list |
className | string | – | Extra classes for the outer section |
type ActionLink = {
label: string;
href: string;
};
type FaqItem = {
topic: string;
question: string;
answer: string;
};topic, question and answer joined into one string, both sides lowercased and the query trimmed. There is no fuzzy matching and no word-boundary logic, so a typo returns nothing.searchLabel is rendered sr-only. The field is visually labelled by its placeholder, but assistive technology still gets a real label.pointer-events-none and absolutely positioned, with pl-11 on the input clearing it, so clicks pass through to the field.Input with type="search", which is why input appears in the block's registry dependencies.max-w-3xl column as the list and carry their own border-t, so the rules stay continuous whether or not results are showing.faq96
An FAQ with nothing to open: a serif heading that settles in word by word beside the intro and a pill action, then six questions and answers laid out in a three-column ruled grid that arrive in turn.
faq77
A type-forward FAQ with a sticky heading rail and a numbered accordion list of expandable questions.
faq82
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.
faq11
Search input with accordion items that filter in real-time. Essential for FAQs with many questions that users need to quickly locate.