A few clean ways to answer recurring questions without taking over the page. Replace the content with what people actually ask.
Accordion
A centered heading over a single-column accordion.
tsx
"use client";import { Accordion, AccordionContent, AccordionItem, AccordionTrigger,} from "@/components/ui/accordion";import { cn } from "@/lib/utils";type Faq01Props = { className?: string;};const FAQS = [ { value: "1", question: "Can I restyle blocks with my own theme?", answer: "Yes. Every block uses your theme tokens for color, radius, and type — swap the theme and the section follows.", }, { value: "2", question: "How do I install a block?", answer: "Run the CLI add command for the block you want, then import it into a page. No extra setup beyond your existing UI kit.", }, { value: "3", question: "Do blocks work in light and dark mode?", answer: "They do. Surfaces and text pull from semantic tokens, so both modes stay consistent without a second stylesheet.", }, { value: "4", question: "Can I mix blocks freely?", answer: "That’s the point. Heroes, pricing, FAQs, and the rest are independent sections — compose them in any order.", },] as const;export function Faq01({ className }: Faq01Props) { return ( <section className={cn("@container w-full bg-background", className)}> <div className="mx-auto w-full max-w-2xl px-4 py-10 @[32rem]:px-6 @[32rem]:py-14"> <div className="text-center"> <h2 className="text-xl font-medium tracking-wide text-foreground @[32rem]:text-2xl"> Frequently asked questions </h2> <p className="mt-2 text-sm tracking-wide text-muted-foreground"> Quick answers about install, theming, and how blocks fit together. </p> </div> <Accordion type="single" collapsible className="mt-8"> {FAQS.map((faq) => ( <AccordionItem key={faq.value} value={faq.value}> <AccordionTrigger indicator="plus">{faq.question}</AccordionTrigger> <AccordionContent>{faq.answer}</AccordionContent> </AccordionItem> ))} </Accordion> </div> </section> );}Installation
npx @arctis-sh/@arctis-sh/ui@latest add faq-01Usage
import { Faq01 } from "@/components/blocks/faq/faq-01"<Faq01 />Split
A heading and accordion side by side in one filled card.
tsx
"use client";import { Accordion, AccordionContent, AccordionItem, AccordionTrigger,} from "@/components/ui/accordion";import { cn } from "@/lib/utils";type Faq02Props = { className?: string;};const FAQS = [ { value: "1", question: "What’s included when I add a block?", answer: "You get the React component and its local dependencies. Swap the copy, media, and links for your product.", }, { value: "2", question: "Do I need a design file?", answer: "No. Blocks ship production-ready. Tweak spacing and tokens in code if you want them tighter or louder.", }, { value: "3", question: "Can my team use these commercially?", answer: "Yes — use them in client work and products. Keep the install path and attribution wherever your license requires.", }, { value: "4", question: "How often are new blocks added?", answer: "We ship in small batches — marketing first, then app surfaces. Check the blocks index for what’s live.", },] as const;export function Faq02({ className }: Faq02Props) { return ( <section className={cn("@container w-full bg-background", className)}> <div className="mx-auto w-full max-w-4xl px-4 py-10 @[32rem]:px-6 @[32rem]:py-14"> <div data-slot="block-split" className="flex flex-col gap-8 rounded-xl bg-muted p-5 @[40rem]:flex-row @[40rem]:gap-10 @[40rem]:p-8" > <div className="max-w-xs shrink-0"> <h2 className="text-xl font-medium tracking-wide text-foreground @[32rem]:text-2xl"> Questions & answers </h2> <p className="mt-2 text-sm tracking-wide text-muted-foreground"> Still stuck? Reach out and we’ll point you at the right block or pattern. </p> </div> <Accordion type="single" collapsible className="min-w-0 flex-1"> {FAQS.map((faq) => ( <AccordionItem key={faq.value} value={faq.value}> <AccordionTrigger indicator="plus"> {faq.question} </AccordionTrigger> <AccordionContent>{faq.answer}</AccordionContent> </AccordionItem> ))} </Accordion> </div> </div> </section> );}Installation
npx @arctis-sh/@arctis-sh/ui@latest add faq-02Usage
import { Faq02 } from "@/components/blocks/faq/faq-02"<Faq02 />By topic
Two topic-based accordions in separate cards, with the section title above.
tsx
"use client";import { Accordion, AccordionContent, AccordionItem, AccordionTrigger,} from "@/components/ui/accordion";import { cn } from "@/lib/utils";type Faq03Props = { className?: string;};const GROUPS = [ { title: "Product", items: [ { value: "p1", question: "Can I restyle blocks with my theme?", answer: "Yes. Colors, radii, and type come from your tokens — change the theme and every block updates.", }, { value: "p2", question: "Do blocks support dark mode?", answer: "They use semantic surfaces and text, so light and dark both work without a second stylesheet.", }, { value: "p3", question: "Can I mix blocks freely?", answer: "They’re independent sections. Drop heroes, pricing, and FAQs in any order on a page.", }, ], }, { title: "Billing", items: [ { value: "b1", question: "Is there a free plan?", answer: "Hobby covers side projects. Upgrade when you need more seats, SSO, or priority support.", }, { value: "b2", question: "Can I change plans later?", answer: "Anytime. Upgrades apply immediately; downgrades take effect on the next billing cycle.", }, { value: "b3", question: "Do you offer invoices?", answer: "Business and Enterprise plans support invoicing and custom contracts. Talk to us if you need one.", }, ], },] as const;export function Faq03({ className }: Faq03Props) { return ( <section className={cn("@container w-full bg-background", className)}> <div className="mx-auto w-full max-w-4xl px-4 py-10 @[32rem]:px-6 @[32rem]:py-14"> <div className="mx-auto max-w-md text-center"> <h2 className="text-xl font-medium tracking-wide text-foreground @[32rem]:text-2xl"> FAQ by topic </h2> <p className="mt-2 text-sm tracking-wide text-muted-foreground"> Product and billing answers side by side. </p> </div> <div className="mt-8 grid grid-cols-1 gap-3 @[40rem]:grid-cols-2"> {GROUPS.map((group) => ( <div key={group.title} className="min-w-0 rounded-xl bg-muted p-5 @[32rem]:p-6" > <h3 className="text-xs font-medium tracking-wide text-muted-foreground"> {group.title} </h3> <Accordion type="single" collapsible className="mt-3"> {group.items.map((faq) => ( <AccordionItem key={faq.value} value={faq.value}> <AccordionTrigger indicator="plus"> {faq.question} </AccordionTrigger> <AccordionContent>{faq.answer}</AccordionContent> </AccordionItem> ))} </Accordion> </div> ))} </div> </div> </section> );}Installation
npx @arctis-sh/@arctis-sh/ui@latest add faq-03Usage
import { Faq03 } from "@/components/blocks/faq/faq-03"<Faq03 />