Skip to content

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.

glass/section/faq-glass
Open ↗

Source

"use client";

import { Accordion } from "radix-ui";
import { Plus } from "lucide-react";
import { cn } from "@/lib/utils";

export interface FaqGlassItem {
  question: string;
  answer: string;
}

export interface FaqGlassProps {
  eyebrow?: string;
  title?: string;
  description?: string;
  items?: FaqGlassItem[];
  className?: string;
}

const DEFAULT_ITEMS: FaqGlassItem[] = [
  { question: "Does Halo need to join my calls as a bot?", answer: "On Zoom, Meet and Teams Halo can join as a named participant, or record locally from the desktop app with no bot at all. You choose per calendar or per meeting." },
  { question: "Who can see my meeting notes?", answer: "Only invited participants by default. You can share a recap with a link, a Slack channel or your whole workspace — and redact sections before sharing." },
  { question: "Which languages are supported?", answer: "Transcription and summaries work in 30 languages, including mixed-language meetings. You can read the summary in a different language than the one spoken." },
  { question: "Do you train AI models on our data?", answer: "Never. Your recordings and transcripts are only used to generate your own summaries, and you can set automatic deletion after 30, 90 or 365 days." },
  { question: "Can I try it with my team before paying?", answer: "Yes — the Team plan has a 14-day free trial with no credit card, and Starter is free forever for individuals." },
];

export function FaqGlass({
  eyebrow = "FAQ",
  title = "Questions? We've got notes.",
  description = "Everything you need to know about Halo. Can't find an answer? Chat with us — a human replies in minutes.",
  items = DEFAULT_ITEMS,
  className,
}: FaqGlassProps) {
  return (
    <section className={cn("da-section text-da-fg", className)} aria-labelledby="faq-glass-title">
      <div className="mx-auto max-w-3xl px-(--da-gutter)">
        <div className="text-center">
          <p className="text-sm font-semibold text-da-primary">{eyebrow}</p>
          <h2 id="faq-glass-title" className="mt-3 font-da-display text-[clamp(2rem,4.5vw,3rem)] leading-[1.08] font-semibold tracking-da-display">
            {title}
          </h2>
          <p className="mx-auto mt-4 max-w-xl text-lg text-da-muted-fg">{description}</p>
        </div>

        <Accordion.Root type="single" collapsible defaultValue="item-0" className="mt-12 flex flex-col gap-3">
          {items.map((item, i) => (
            <Accordion.Item
              key={item.question}
              value={`item-${i}`}
              className="da-stroke da-transition overflow-hidden rounded-da-lg bg-da-surface shadow-da-sm backdrop-blur-da backdrop-saturate-150 data-[state=open]:shadow-da-md"
            >
              <Accordion.Header asChild>
                <h3>
                  <Accordion.Trigger className="da-focus group flex w-full items-center justify-between gap-6 rounded-da-lg px-6 py-5 text-left font-semibold">
                    {item.question}
                    <span
                      aria-hidden
                      className="grid size-8 shrink-0 place-items-center rounded-full bg-da-fg/5 transition-[rotate,background-color] duration-(--da-duration-slow) ease-da-emphasized group-data-[state=open]:rotate-45 group-data-[state=open]:bg-gradient-to-br group-data-[state=open]:from-da-primary group-data-[state=open]:to-da-accent group-data-[state=open]:text-da-primary-fg motion-reduce:transition-none"
                    >
                      <Plus className="size-4" />
                    </span>
                  </Accordion.Trigger>
                </h3>
              </Accordion.Header>
              <Accordion.Content className="overflow-hidden data-[state=closed]:animate-[glass-collapse_var(--da-duration)_var(--da-ease)] data-[state=open]:animate-[glass-expand_var(--da-duration-slow)_var(--da-ease)] motion-reduce:animate-none">
                <p className="px-6 pb-6 leading-relaxed text-da-muted-fg">{item.answer}</p>
              </Accordion.Content>
            </Accordion.Item>
          ))}
        </Accordion.Root>
      </div>
      <style href="glass-accordion" precedence="default">{`
        @keyframes glass-expand { from { height: 0; opacity: 0 } to { height: var(--radix-accordion-content-height); opacity: 1 } }
        @keyframes glass-collapse { from { height: var(--radix-accordion-content-height); opacity: 1 } to { height: 0; opacity: 0 } }
      `}</style>
    </section>
  );
}

export default FaqGlass;

modules/glass/section/faq-glass/index.tsx

Props

PropTypeDefaultDescription
eyebrowstring"FAQ"Label above the title.
titlestring—Section title (h2).
descriptionstring—Intro paragraph.
itemsFaqGlassItem[]5 Halo questions{ question, answer }[].
classNamestring—Classes on the <section>.

Other faq variants in Glass

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

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