FAQ

FAQ layouts that keep common answers easy to scan.

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.

Frequently asked questions

Quick answers about install, theming, and how blocks fit together.

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-01

Usage

import { Faq01 } from "@/components/blocks/faq/faq-01"
<Faq01 />

Split

A heading and accordion side by side in one filled card.

Questions & answers

Still stuck? Reach out and we’ll point you at the right block or pattern.

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-02

Usage

import { Faq02 } from "@/components/blocks/faq/faq-02"
<Faq02 />

By topic

Two topic-based accordions in separate cards, with the section title above.

FAQ by topic

Product and billing answers side by side.

Product

Billing

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-03

Usage

import { Faq03 } from "@/components/blocks/faq/faq-03"
<Faq03 />