An open question FAQ pairing a soft panel that sticks while you scroll, holding a working question and email form, with the questions others sent recently answered as linked hairline entries.
An open question FAQ pairing a soft panel that sticks while you scroll, holding a working question and email form, with the questions others sent recently answered as linked hairline entries.
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/faq91?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/faq91?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/faq91.tsx, the shadcn/ui input and textarea components it depends on, and the badge23 and button21 components it uses for the eyebrow and the submit action.
The installed file exports faq91Demo alongside the block: the exact props behind the preview above. Spread it to get a working page in one line.
import { Faq91, faq91Demo } from "@/components/beste/block/faq91";
export default function AskPage() {
return <Faq91 {...faq91Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Faq91 } from "@/components/beste/block/faq91";
export default function AskPage() {
return (
<Faq91
badge={{ label: "Ask us anything" }}
heading="If it is not answered yet, ask and we will publish the answer"
description="Questions go to an engineer, not a marketing inbox."
formTitle="Your question"
form={{
questionLabel: "What do you need to know",
questionPlaceholder: "For example: what happens to our data if you are acquired?",
emailLabel: "Where should the answer go",
emailPlaceholder: "you@practice.com",
submitLabel: "Send the question",
finePrint: "We answer within one working day and never add you to a mailing list.",
}}
listTitle="Asked recently, answered in public"
questions={[
{
question: "What happens to our data if you are acquired?",
answer: "The data processing agreement survives a change of control.",
askedBy: "A group of four clinics, May 2026",
href: "/answers/acquisition",
},
{
question: "Do you train models on our member records?",
answer: "No, and the contract says so.",
askedBy: "A practice manager, May 2026",
href: "/answers/training",
},
]}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
badge | { label: string } | – | Eyebrow above the hairline rule, rendered through Badge23 |
heading | string | – | Section heading in the left column of the header |
description | string | – | Supporting paragraph, right-aligned from md up |
formTitle | string | – | Heading inside the sticky form panel |
form | AskForm | – | Every label, placeholder and caption in the form |
listTitle | string | – | Heading above the answered questions |
questions | AskedQuestion[] | [] | Previously answered questions, each a link |
className | string | – | Extra classes for the outer section |
type AskForm = {
questionLabel: string;
questionPlaceholder: string;
emailLabel: string;
emailPlaceholder: string;
submitLabel: string;
finePrint: string;
};
type AskedQuestion = {
question: string;
answer: string;
askedBy: string;
href: string;
};lg:sticky lg:top-24 lg:self-start. The self-start is required: without it the panel stretches to the full grid row height and sticky positioning has nothing to travel within. Adjust top-24 to match your own fixed header.lg and above only. Below that the form scrolls normally and lands above the answered questions.Textarea and Input, which is why both appear in the block's registry dependencies. Field ids come from useId, so labels stay correctly associated with several instances on one page.bg-background explicitly, since they sit on a bg-muted panel and would otherwise blend into it.onSubmit, so the send call is wired by the integrator.askedBy is deliberately an attribution rather than a name field. The demo credits roles rather than individuals, which is what lets the page be public without asking permission for each entry.Link with a hover fill and md:px-4, so the row highlight extends slightly past the text on wider screens.Wiring the form up
The question form renders its fields and leaves submission to you. For validation, error states and submit handling, the patterns in React Hook Form, TanStack Form, and Formisch cover this shape of two-field form.
faq87
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.
faq80
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.
faq84
A compact FAQ with nothing hidden behind a click: three labelled groups of question and answer pairs set as two-column hairline rows, closing on a link to longer reading.
faq78
An accordion of studio FAQs paired with a bordered aside card inviting a direct conversation.