Accordion

A component that allows users to hide and show content in a collapsible container.

Overview

The Accordion component is a specialized component that allows users to hide and show content. It's built on top of the Collapsible primitive and follows the WAI-ARIA design pattern.

Default

import * as UI from "@iyk/ui"

export default () => (
  <UI.AccordionV2.Root type="single">
    <UI.AccordionV2.Item value="one">
      <UI.AccordionV2.Header>
        <UI.AccordionV2.Trigger>Section 1</UI.AccordionV2.Trigger>
      </UI.AccordionV2.Header>
      <UI.AccordionV2.Content>
        <div className="pb-4">
          <p>Content 1</p>
        </div>
      </UI.AccordionV2.Content>
    </UI.AccordionV2.Item>

    <UI.AccordionV2.Item value="two">
      <UI.AccordionV2.Header>
        <UI.AccordionV2.Trigger>Section 2</UI.AccordionV2.Trigger>
      </UI.AccordionV2.Header>
      <UI.AccordionV2.Content>
        <div className="pb-4">
          <p>Content 2</p>
        </div>
      </UI.AccordionV2.Content>
    </UI.AccordionV2.Item>

    <UI.AccordionV2.Item value="three">
      <UI.AccordionV2.Header>
        <UI.AccordionV2.Trigger>Section 3</UI.AccordionV2.Trigger>
      </UI.AccordionV2.Header>
      <UI.AccordionV2.Content>
        <div className="pb-4">
          <p>Content 3</p>
        </div>
      </UI.AccordionV2.Content>
    </UI.AccordionV2.Item>
  </UI.AccordionV2.Root>
)

Multiple

import * as UI from "@iyk/ui"

export default () => (
  <UI.AccordionV2.Root type="multiple">
    <UI.AccordionV2.Item value="one">
      <UI.AccordionV2.Header>
        <UI.AccordionV2.Trigger>Section 1</UI.AccordionV2.Trigger>
      </UI.AccordionV2.Header>
      <UI.AccordionV2.Content>
        <div className="pb-4">
          <p>Content 1</p>
        </div>
      </UI.AccordionV2.Content>
    </UI.AccordionV2.Item>

    <UI.AccordionV2.Item value="two">
      <UI.AccordionV2.Header>
        <UI.AccordionV2.Trigger>Section 2</UI.AccordionV2.Trigger>
      </UI.AccordionV2.Header>
      <UI.AccordionV2.Content>
        <div className="pb-4">
          <p>Content 2</p>
        </div>
      </UI.AccordionV2.Content>
    </UI.AccordionV2.Item>

    <UI.AccordionV2.Item value="three">
      <UI.AccordionV2.Header>
        <UI.AccordionV2.Trigger>Section 3</UI.AccordionV2.Trigger>
      </UI.AccordionV2.Header>
      <UI.AccordionV2.Content>
        <div className="pb-4">
          <p>Content 3</p>
        </div>
      </UI.AccordionV2.Content>
    </UI.AccordionV2.Item>
  </UI.AccordionV2.Root>
)

Controlled

Open items: none

import * as UI from "@iyk/ui"
import * as React from "react"

export default () => {
  const [value, setValue] = React.useState<string[]>([])
  return (
    <div className="w-full flex flex-col gap-4">
      <UI.AccordionV2.Root value={value} onValueChange={setValue} type="multiple">
        <UI.AccordionV2.Item value="one">
          <UI.AccordionV2.Header>
            <UI.AccordionV2.Trigger>Section 1</UI.AccordionV2.Trigger>
          </UI.AccordionV2.Header>
          <UI.AccordionV2.Content>
            <div className="pb-4">
              <p>Content 1</p>
            </div>
          </UI.AccordionV2.Content>
        </UI.AccordionV2.Item>

        <UI.AccordionV2.Item value="two">
          <UI.AccordionV2.Header>
            <UI.AccordionV2.Trigger>Section 2</UI.AccordionV2.Trigger>
          </UI.AccordionV2.Header>
          <UI.AccordionV2.Content>
            <div className="pb-4">
              <p>Content 2</p>
            </div>
          </UI.AccordionV2.Content>
        </UI.AccordionV2.Item>

        <UI.AccordionV2.Item value="three">
          <UI.AccordionV2.Header>
            <UI.AccordionV2.Trigger>Section 3</UI.AccordionV2.Trigger>
          </UI.AccordionV2.Header>
          <UI.AccordionV2.Content>
            <div className="pb-4">
              <p>Content 3</p>
            </div>
          </UI.AccordionV2.Content>
        </UI.AccordionV2.Item>
      </UI.AccordionV2.Root>
      <p>Open items: {value.length > 0 ? value.join(", ") : "none"}</p>
    </div>
  )
}

Features

Accessibility

Follows WAI-ARIA design pattern for accordions, ensuring keyboard navigation and screen reader support.

Animation

Smooth height animation when expanding/collapsing sections.

Multiple

Support for single or multiple expanded sections.

Controlled

Can be controlled externally through props.

API

Root

Accordion.Root

The root component that wraps all accordion items.

Item

Accordion.Item

An individual accordion section.

Header

Accordion.Header

The header container for the accordion trigger.

Trigger

Accordion.Trigger

The button that toggles the accordion section.

Content

Accordion.Content

The content container that shows/hides based on the accordion state.