An always-open FAQ laid out as a two-column grid of numbered, hairline-separated question and answer entries, closing with a soft support panel that pairs a short prompt with two actions.
Always-open FAQ: a monospace eyebrow over a hairline rule and a two-column heading, then every question and answer laid out as a numbered, hairline-separated cell in a two-column grid, closing on a soft support panel that pairs a short prompt with one or two actions.
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/faq80"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/faq80"This installs the block to components/beste/block/faq80.tsx plus the badge23 and button21 components it uses for the eyebrow and the support actions.
The installed file exports faq80Demo alongside the block: the exact props behind the preview above. Spread it to get a working FAQ in one line.
import { Faq80, faq80Demo } from "@/components/beste/block/faq80";
export default function Page() {
return <Faq80 {...faq80Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Faq80 } from "@/components/beste/block/faq80";
export default function Page() {
return (
<Faq80
badge={{ label: "Answers" }}
heading="Everything teams ask before they move"
description="The details that usually decide it are written down here."
items={[
{
question: "How long does a migration take?",
answer: "Most teams are live within a week, imports included.",
},
{
question: "Who owns the data we bring in?",
answer: "You do. Export everything at any time, in an open format.",
},
]}
support={{
title: "Still weighing something up?",
description: "Send the question over and a real person answers.",
buttons: [
{ label: "Talk to the team", href: "/contact" },
{ label: "Read the docs", href: "/docs", tone: "outline" },
],
}}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string } | – | Monospace eyebrow above the hairline rule, rendered via Badge23 |
heading | string | – | Section heading in the left column |
description | string | – | Supporting paragraph, right-aligned from md up |
items | FaqItem[] | [] | Question and answer cells, numbered in source order |
support | Support | – | Soft panel under the grid, with its own actions |
className | string | – | Extra classes for the outer <section> |
type ActionLink = {
label: string;
href: string;
tone?: "primary" | "neutral" | "outline";
};
type FaqItem = { question: string; answer: string };
type Support = {
title: string;
description: string;
buttons?: ActionLink[];
};Cmd+F finds it. Nothing here is client-interactive beyond the links.String(index + 1).padStart(2, "0"), so entries read 01, 02, and reordering items renumbers them.md:grid-cols-2), so questions 1 and 2 sit side by side, not stacked down one column. Order the list with that reading path in mind.border-t rather than a bottom rule, which keeps a rule above every row of the grid and leaves the bottom edge open into the support panel.support.buttons runs through Button21 with its own tone, so the first can stay solid while the rest fall back to the hairline outline; omitting buttons renders the panel as copy only.bg-muted fill, not a tinted or bordered card, which is why it reads as a soft closing block rather than another FAQ cell.faq17
Questions on left, answers on right in a two-column grid layout. Works well for balanced, side-by-side presentation.
faq9
Q&A pairs arranged in a responsive grid layout. Ideal for displaying concise answers in a scannable, multi-column format.
faq86
An FAQ split across two columns of independent accordions, so opening one answer never closes another, closing on a soft support panel with two actions.