From 22dc58feb2d59b7db97c65189dee4423fa9bc3b1 Mon Sep 17 00:00:00 2001 From: Alex Carpenter Date: Tue, 5 May 2026 11:38:33 -0400 Subject: [PATCH] feat(headless): add Accordion primitive --- packages/headless/package.json | 4 + .../src/primitives/accordion/README.md | 128 ++++++ .../primitives/accordion/accordion.test.tsx | 419 ++++++++++++++++++ .../src/primitives/accordion/accordion.tsx | 352 +++++++++++++++ .../src/primitives/accordion/index.ts | 8 + packages/headless/vite.config.ts | 1 + 6 files changed, 912 insertions(+) create mode 100644 packages/headless/src/primitives/accordion/README.md create mode 100644 packages/headless/src/primitives/accordion/accordion.test.tsx create mode 100644 packages/headless/src/primitives/accordion/accordion.tsx create mode 100644 packages/headless/src/primitives/accordion/index.ts diff --git a/packages/headless/package.json b/packages/headless/package.json index b64db166573..67e04bed3e3 100644 --- a/packages/headless/package.json +++ b/packages/headless/package.json @@ -4,6 +4,10 @@ "private": true, "type": "module", "exports": { + "./accordion": { + "import": "./dist/primitives/accordion/index.js", + "types": "./dist/primitives/accordion/index.d.ts" + }, "./dialog": { "import": "./dist/primitives/dialog/index.js", "types": "./dist/primitives/dialog/index.d.ts" diff --git a/packages/headless/src/primitives/accordion/README.md b/packages/headless/src/primitives/accordion/README.md new file mode 100644 index 00000000000..5254df32cc6 --- /dev/null +++ b/packages/headless/src/primitives/accordion/README.md @@ -0,0 +1,128 @@ +# Accordion + +A vertically stacked set of collapsible sections. Supports single or multiple open panels, keyboard navigation, and CSS-driven expand/collapse animations. + +## When to Use + +- FAQ sections, settings panels, or any UI where content should be shown/hidden in discrete sections. +- When you need accessible expand/collapse with proper ARIA attributes and keyboard support. +- Prefer Accordion over manual show/hide toggles — it handles focus management, ARIA, and animation lifecycle automatically. + +## Usage + +```tsx +import { Accordion } from '@/primitives/accordion'; + + + + + Section 1 + + Content for section 1 + + + + Section 2 + + Content for section 2 + +; +``` + +### Controlled + +```tsx +const [value, setValue] = useState(['item-1']); + + + {/* ... */} +; +``` + +## Parts + +| Part | Default Element | Description | +| ------------------- | --------------- | ---------------------------------- | +| `Accordion` | `
` | Root wrapper, provides context | +| `Accordion.Item` | `
` | Wraps a single collapsible section | +| `Accordion.Header` | `

` | Heading wrapper for the trigger | +| `Accordion.Trigger` | `