Skip to content

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-flat/section/faq-help
Open ↗

Source

"use client";

import { useId, useState } from "react";
import { Search } from "lucide-react";
import { cn } from "@/lib/utils";

export interface FaqHelpProps {
  title?: string;
  items?: { question: string; answer: string }[];
  popular?: string[];
  className?: string;
}

const DEFAULT_ITEMS = [
  { question: "How do I create a recurring task?", answer: "Open a task → Repeat → choose daily, weekly or a custom pattern." },
  { question: "How do I move a task to another board?", answer: "Drag it onto the board name in the sidebar, or use Move in the task menu." },
  { question: "Can I set my own reminder time?", answer: "Yes, in Settings → Notifications. Default is 9:00 the day before." },
  { question: "How do I export my boards?", answer: "Board menu → Export → CSV or JSON." },
  { question: "How do I invite a guest?", answer: "Share → Invite as guest. Guests only see the boards you pick." },
  { question: "How do I delete my account?", answer: "Settings → Account → Delete. We’ll email you a copy of your data first." },
];

/** Help-center FAQ: big friendly search pill with popular-search chips; matching questions appear as soft answer cards, with an empty state. */
export function FaqHelp({
  title = "Hi! How can we help? 👋",
  items = DEFAULT_ITEMS,
  popular = ["recurring", "export", "guest", "reminder"],
  className,
}: FaqHelpProps) {
  const [q, setQ] = useState("");
  const id = useId();
  const query = q.trim().toLowerCase();
  const results = items.filter((i) => `${i.question} ${i.answer}`.toLowerCase().includes(query));

  return (
    <section aria-labelledby={`${id}-t`} className={cn("da-section bg-da-bg text-da-fg", className)}>
      <div className="da-container">
        <div className="mx-auto max-w-2xl rounded-[36px] bg-da-primary/12 px-6 py-12 text-center sm:px-12">
          <h2 id={`${id}-t`} className="font-da-display text-[clamp(1.75rem,4vw,2.75rem)] font-extrabold tracking-da-display">
            {title}
          </h2>
          <div className="relative mt-6">
            <Search aria-hidden className="pointer-events-none absolute top-1/2 left-5 size-5 -translate-y-1/2 text-da-muted-fg" />
            <label htmlFor={id} className="sr-only">
              Search help articles
            </label>
            <input
              id={id}
              type="search"
              value={q}
              onChange={(e) => setQ(e.target.value)}
              placeholder="Search for “recurring tasks”…"
              className="da-focus h-14 w-full rounded-da-pill bg-da-surface pr-5 pl-13 text-[15px] shadow-da-md placeholder:text-da-muted-fg"
            />
          </div>
          <div className="mt-4 flex flex-wrap justify-center gap-2">
            <span className="text-sm text-da-muted-fg">Popular:</span>
            {popular.map((p) => (
              <button
                key={p}
                type="button"
                onClick={() => setQ(p)}
                className="da-focus da-transition rounded-da-pill bg-da-surface px-3 py-1 text-sm font-medium hover:-translate-y-0.5"
              >
                {p}
              </button>
            ))}
          </div>
        </div>
        <p aria-live="polite" className="sr-only">
          {results.length} results
        </p>
        <ul className="mx-auto mt-8 grid max-w-3xl gap-3 sm:grid-cols-2">
          {results.map((it) => (
            <li key={it.question} className="rounded-da-lg bg-da-surface p-6 shadow-da-sm">
              <p className="font-da-display text-lg font-extrabold">{it.question}</p>
              <p className="mt-1.5 text-sm text-da-muted-fg">{it.answer}</p>
            </li>
          ))}
          {results.length === 0 && (
            <li className="rounded-da-lg bg-da-accent p-6 text-center text-da-accent-fg sm:col-span-2">
              No luck with “{q}” — try another word or message us, we’re nice. 🙂
            </li>
          )}
        </ul>
      </div>
    </section>
  );
}

export default FaqHelp;

modules/soft-flat/section/faq-help/index.tsx

Props

PropTypeDefaultDescription
titlestring—Greeting.
items{ question, answer }[]—Articles.
popularstring[]—Quick-search chips.
classNamestring—Classes.

Other faq variants in Soft Flat

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 Accordion

Two-column FAQ: heading + description + contact link on the left, bordered Radix accordion with plus icons rotating to × on the right.

Neo CorporateFAQ

Faq Security

Security & compliance FAQ: dark-tinted certification cards (SOC 2, ISO 27001, GDPR, PCI) with shield icons, then security questions as native <details> disclosure rows.

Neo CorporateFAQ

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 CorporateFAQ

Faq Support

Compact 2×3 grid of short Q&As followed by three bordered support channel cards (docs, chat, dedicated support).

Neo CorporateFAQ

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