caliper uidocs

FAQ section

Block

Questions that open to reveal answers.

Installs components/ui/faq-section.tsxDepends on @radix-ui/react-slot, lucide-reactMotion none in component source
pnpm dlx shadcn@latest add https://caliperui.site/r/faq-section.json

Frequently asked questions

Short answers. Search if you are looking for something specific.

Yes. Components are copied into your project as readable source. You can edit, rename or delete anything.

Use it in unlimited projects for your own products and clients. You may not resell the components as a competing library.

React 19 with any bundler. The examples run in Next.js, and nothing depends on it.

Every component is tested with the keyboard and a screen reader, and keeps visible focus, text alternatives and reduced-motion behavior.

Colors, spacing, radii and motion live in a small set of tokens. Change them once and everything follows.

Run the update command to see a diff of what changed upstream, then accept the parts you want.

Read the docs first, then ask in the community or email support. Paid plans include a two-day reply.

Within 30 days, no questions asked, if it is not right for your team.

Still have a question? Ask us directly

When to use #

Use it for

  • Answering objections near a purchase decision.
  • Content is short and scannable.

Skip it when

  • The answers are long documents.

Installation #

terminal
pnpm dlx shadcn@latest add https://caliperui.site/r/faq-section.json

Adds its 6 files to components/ui/, each with its own stylesheet, and installs their packages. No account needed. The first part also adds Caliper UI’s tokens; import them once as in Installation.

Usage #

This is the code behind the preview above.

example.tsx
import { FaqSection } from "@/components/ui/faq-section"

const faq = [
  { id: "own", question: "Do I own the code?", answer: "Yes. Components are copied into your project as readable source. You can edit, rename or delete anything." },
  { id: "license", question: "What does the license allow?", answer: "Use it in unlimited projects for your own products and clients. You may not resell the components as a competing library." },
  { id: "frameworks", question: "Which frameworks do you support?", answer: "React 19 with any bundler. The examples run in Next.js, and nothing depends on it." },
  { id: "a11y", question: "How is accessibility handled?", answer: "Every component is tested with the keyboard and a screen reader, and keeps visible focus, text alternatives and reduced-motion behavior." },
  { id: "theming", question: "Can I change the look?", answer: "Colors, spacing, radii and motion live in a small set of tokens. Change them once and everything follows." },
  { id: "updates", question: "How do updates work?", answer: "Run the update command to see a diff of what changed upstream, then accept the parts you want." },
  { id: "support", question: "Where do I get help?", answer: "Read the docs first, then ask in the community or email support. Paid plans include a two-day reply." },
  { id: "refunds", question: "Can I get a refund?", answer: "Within 30 days, no questions asked, if it is not right for your team." },
];

export function FaqSectionDemo() {
  return (
    <FaqSection description="Short answers. Search if you are looking for something specific." items={faq} contact={{ label: "Ask us directly", href: "#contact" }} />
  );
}

API reference #

FaqSection

component
PropTypeDefaultDescription
titlestring"Frequently asked questions"
descriptionstring—
items *readonly FaqItem[]—
searchableboolean—Shows a filter. Defaults to on when there are more than six questions.
contact{ label: string; href: string; }—Where to go when the answer is not here.
classNamestring—

Accessibility #

It exposes status semantics, with aria-labelledby and aria-label kept in step with state. Changes that matter are announced through a live region.

No custom key handling; Tab and the native activation keys do the work.

Motion #

It declares no animation in its component source. Any transition comes from its stylesheet, which uses the duration tokens that collapse to instant under prefers-reduced-motion.