Skip to content

Faq Sidebar

Help-center style FAQ: a vertical category nav (left, becomes horizontal scroll chips on mobile) and the selected category’s questions as an open definition list.

neo-corporate/section/faq-sidebar
Open ↗

Source

"use client";

import { useState } from "react";
import { cn } from "@/lib/utils";

export interface FaqSidebarCategory {
  id: string;
  label: string;
  items: { q: string; a: string }[];
}

export interface FaqSidebarProps {
  title?: string;
  categories?: FaqSidebarCategory[];
  className?: string;
}

const DEFAULT_CATEGORIES: FaqSidebarCategory[] = [
  {
    id: "billing",
    label: "Billing & plans",
    items: [
      { q: "Can I change plans at any time?", a: "Yes. Upgrades are prorated immediately; downgrades apply at the next billing cycle." },
      { q: "Do you charge per user?", a: "No. Every plan includes unlimited users with role-based permissions." },
      { q: "Which payment methods do you accept?", a: "Card, ACH and wire transfer. Enterprise can be invoiced on net-30 terms." },
    ],
  },
  {
    id: "payments",
    label: "Payments",
    items: [
      { q: "How fast are payouts?", a: "Card and ACH payouts land in 2 business days by default, or instantly for 1%." },
      { q: "Which currencies are supported?", a: "You can invoice in 40 currencies and settle in USD, EUR, GBP, CAD and AUD." },
    ],
  },
  {
    id: "integrations",
    label: "Integrations",
    items: [
      { q: "Is the ERP sync two-way?", a: "Yes: customers, items, invoices, payments and journal entries sync both ways every 5 minutes." },
      { q: "Do you have an API?", a: "A REST API and webhooks are available on every plan, with sandbox keys." },
    ],
  },
  {
    id: "security",
    label: "Security",
    items: [
      { q: "Are you SOC 2 compliant?", a: "Yes, SOC 2 Type II and ISO 27001. Reports are available under NDA." },
      { q: "Do you support SSO?", a: "SAML SSO and SCIM provisioning are included in Enterprise." },
    ],
  },
];

/** Help-center style FAQ: a vertical category nav (left, becomes horizontal scroll chips on mobile) and the selected category’s questions as an open definition list. */
export function FaqSidebar({ title = "Help center", categories = DEFAULT_CATEGORIES, className }: FaqSidebarProps) {
  const [active, setActive] = useState(categories[0]?.id);
  const cat = categories.find((c) => c.id === active) ?? categories[0];
  return (
    <section aria-labelledby="nc-faqside-title" className={cn("da-section bg-da-bg text-da-fg", className)}>
      <div className="da-container">
        <h2 id="nc-faqside-title" className="font-da-display text-[clamp(2rem,4.5vw,2.75rem)] font-extrabold tracking-da-display">
          {title}
        </h2>
        <div className="mt-10 grid gap-8 lg:grid-cols-[220px_1fr]">
          <nav aria-label="FAQ categories" className="min-w-0">
            <ul className="flex gap-1 relative overflow-x-auto lg:flex-col">
              {categories.map((c) => (
                <li key={c.id} className="shrink-0">
                  <button
                    type="button"
                    aria-current={c.id === cat?.id ? "true" : undefined}
                    onClick={() => setActive(c.id)}
                    className={cn(
                      "da-focus da-transition w-full rounded-da-md px-3 py-2 text-left text-sm font-medium lg:border-l-2 lg:rounded-l-none",
                      c.id === cat?.id
                        ? "bg-da-accent text-da-accent-fg lg:border-da-primary"
                        : "text-da-muted-fg hover:bg-da-surface-2 hover:text-da-fg lg:border-transparent",
                    )}
                  >
                    {c.label}
                    <span className="ml-2 font-da-mono text-xs opacity-70">{c.items.length}</span>
                  </button>
                </li>
              ))}
            </ul>
          </nav>
          {cat && (
            <dl
              key={cat.id}
              aria-live="polite"
              className="divide-y divide-da-border border-y border-da-border transition-opacity duration-(--da-duration) starting:opacity-0"
            >
              {cat.items.map((it) => (
                <div key={it.q} className="py-6">
                  <dt className="font-da-display text-lg font-bold">{it.q}</dt>
                  <dd className="mt-2 text-da-muted-fg">{it.a}</dd>
                </div>
              ))}
            </dl>
          )}
        </div>
      </div>
    </section>
  );
}

export default FaqSidebar;

modules/neo-corporate/section/faq-sidebar/index.tsx

Props

PropTypeDefaultDescription
titlestring—Heading.
categoriesFaqSidebarCategory[]—Categories.
classNamestring—Extra classes on the root.

Other faq variants in Neo Corporate

FAQ in other art directions

FAQ Accordion

Two-column FAQ: sticky title + support CTA on the left, numbered accordion cards on the right with a yellow plus that rotates into an ink cross when open. Built on Radix Accordion.

BrutalistFAQ

FAQ Categories

Help-center style FAQ: topic buttons with counts on the left (stacked on desktop, wrapped on mobile), and a ruled accordion on the right whose open question floods yellow.

BrutalistFAQ

FAQ Grid

Always-open FAQ grid: ruled cells (1/2/3 columns) with a yellow question-mark square, uppercase question and answer, closed by a full-width ink contact row. No interaction needed.

BrutalistFAQ

FAQ Search

Searchable FAQ: a huge ruled search field that presses in on focus, live result count, and native <details> cards with tags; a pink empty state points to support.

BrutalistFAQ

Faq Cards

All-open FAQ: a 3-column grid of glass cards, each with a gradient number badge, question and answer, followed by a glass contact pill with an ink button.

GlassFAQ

Faq Chat

FAQ as a chat: suggested question chips on the left; picking one adds a gradient user bubble and, after a typing indicator, a glass answer bubble in the conversation panel.

GlassFAQ

FAQ Glass

Centered FAQ with stacked frosted accordion cards; the plus button spins into a gradient cross with a slight overshoot and answers expand smoothly. Built on Radix Accordion.

GlassFAQ

Faq Search

Help-center FAQ: large glass search pill filtering a frosted Radix accordion live, with category tags, result count and highlighted matches; empty state.

GlassFAQ

Faq Grid

All answers visible at once: a three-column grid of short questions and answers under a header, followed by two support link cards (documentation, talk to us).

MinimalFAQ

Faq List

Centered single-column FAQ built on native details/summary (zero JS): hairline dividers, a plus icon that rotates into a cross when open, and a contact line underneath.

MinimalFAQ

FAQ Split

Two-column FAQ: title, description and support link on the left, hairline-divided Radix accordion on the right with a rotating chevron and a smooth height + fade expand.

MinimalFAQ

Faq Tabs

FAQ grouped by category behind an underline tab bar (Radix Tabs, with counts); the active category shows every question and answer in a two-column definition list.

MinimalFAQ

Faq Inline

Ultra-compact FAQ: short questions and one-line answers flowing as a 3-column grid of mono question labels over large answers — scannable in seconds.

Mono CleanFAQ

Faq List

Numbered accordion FAQ in a ruled list: mono index + question, a +/− glyph that swaps, answer indented under the question; left column holds the label and title.

Mono CleanFAQ

Faq Split

Always-open FAQ as a two-column definition list (question left in medium weight, answer right in muted text) on hairline rows, followed by a mono contact line.

Mono CleanFAQ

Faq Tabs

FAQ grouped by topic with text tabs (Radix Tabs) underlined in ink when active, and each topic’s answers as a ruled definition list.

Mono CleanFAQ

Faq Columns

Editorial FAQ: serif title and intro in a narrow left column, questions as a two-column definition list on the right separated by warm hairlines.

Organic SoftFAQ

Faq Contact

FAQ beside a contact card: native disclosure list on the left, and a clay-tinted card with a sprouting-leaf illustration, email and chat buttons on the right.

Organic SoftFAQ

Faq Search

Searchable FAQ: rounded search field plus topic pills filter a list of questions (native details), with a friendly empty state and live result count.

Organic SoftFAQ

Faq Soft

Soft accordion: each question is its own rounded paper pill-card that turns sage when open, with a round plus that rotates into a cross; generous spacing.

Organic SoftFAQ

Faq Columns

All-visible FAQ: sticky intro with a peach “Chat with us” pill on the left, six Q&As in a 2-column grid with round lavender number badges on the right.

Soft FlatFAQ

Faq Help

Help-center FAQ: lavender panel with a friendly greeting, big white search pill and popular-search chips; matching answers show as white cards with a peach empty state.

Soft FlatFAQ

Faq Pills

Single-column FAQ of rounded white blocks on native details/summary; the open item turns lavender and its round chevron button flips and fills periwinkle.

Soft FlatFAQ

Faq Tinted

FAQ by topic: three big pastel topic buttons (emoji + label) switch the list of white Q&A cards below, which fades in on change.

Soft FlatFAQ