laif-ds
Version:
Design System di Laif con componenti React basati su principi di Atomic Design
188 lines (157 loc) • 6.14 kB
Markdown
# Accordion
## Overview
An accessible, animated accordion to organize content in collapsible sections. Supports single or multiple open items, keyboard navigation, and flexible styling.
---
## Props
Props are passed through to the underlying Radix Accordion primitives. The most relevant props for `Accordion` (root) are listed below.
### Accordion (Root)
| Prop | Type | Default | Description |
| --------------- | ------------------------------------ | ----------- | ----------------------------------------------------------------------- |
| `type` | `"single" \| "multiple"` | `"single"` | Single allows one item open at a time. Multiple allows many open items. |
| `collapsible` | `boolean` | `false` | Only for `type="single"`. If true, allows closing the last open item. |
| `value` | `string \| string[]` | `undefined` | Controlled value of the open item(s). |
| `defaultValue` | `string \| string[]` | `undefined` | Uncontrolled default open item(s). |
| `onValueChange` | `(value: string \| string[]) => any` | `undefined` | Callback fired when open item(s) change. |
| `className` | `string` | `""` | Additional classes applied to the root. |
### Subcomponents
- `AccordionItem`: Container for a single section. Requires a unique `value` prop.
- `AccordionTrigger`: The clickable header that toggles the item.
- `AccordionContent`: The collapsible content area with open/close animations.
---
## Behavior
- **Single mode**: Only one `AccordionItem` can be open at a time. If `collapsible` is `false`, one item must remain open.
- **Multiple mode**: Any number of items can be open simultaneously.
- **Keyboard navigation**: Fully accessible trigger buttons with ARIA attributes.
- **Animations**: Smooth open/close transitions for content.
---
## Examples
### Basic (Single)
```tsx
import {
Accordion,
AccordionItem,
AccordionTrigger,
AccordionContent,
} from "laif-ds";
export function BasicAccordion() {
return (
<Accordion type="single" className="w-96">
<AccordionItem value="item-1">
<AccordionTrigger>Is it accessible?</AccordionTrigger>
<AccordionContent>
Yes. It adheres to the WAI-ARIA design pattern.
</AccordionContent>
</AccordionItem>
<AccordionItem value="item-2">
<AccordionTrigger>Is it styled?</AccordionTrigger>
<AccordionContent>
Yes. It comes with default styles that match the other components.
</AccordionContent>
</AccordionItem>
<AccordionItem value="item-3">
<AccordionTrigger>Is it animated?</AccordionTrigger>
<AccordionContent>
Yes. It's animated by default, but you can disable it if you prefer.
</AccordionContent>
</AccordionItem>
</Accordion>
);
}
```
### With Default Open (Single, collapsible)
```tsx
import {
Accordion,
AccordionItem,
AccordionTrigger,
AccordionContent,
} from "laif-ds";
export function AccordionWithDefaultOpen() {
return (
<Accordion type="single" collapsible defaultValue="item-2" className="w-96">
<AccordionItem value="item-1">
<AccordionTrigger>First section</AccordionTrigger>
<AccordionContent>This is the first section content.</AccordionContent>
</AccordionItem>
<AccordionItem value="item-2">
<AccordionTrigger>Second section (default open)</AccordionTrigger>
<AccordionContent>
This section is open by default because we set defaultValue="item-2".
</AccordionContent>
</AccordionItem>
<AccordionItem value="item-3">
<AccordionTrigger>Third section</AccordionTrigger>
<AccordionContent>This is the third section content.</AccordionContent>
</AccordionItem>
</Accordion>
);
}
```
### Multiple Mode with Multiple Default Open
```tsx
import {
Accordion,
AccordionItem,
AccordionTrigger,
AccordionContent,
} from "laif-ds";
export function MultipleModeAccordion() {
return (
<Accordion
type="multiple"
defaultValue={["item-1", "item-3"]}
className="w-96"
>
<AccordionItem value="item-1">
<AccordionTrigger>First section (default open)</AccordionTrigger>
<AccordionContent>This section is open by default.</AccordionContent>
</AccordionItem>
<AccordionItem value="item-2">
<AccordionTrigger>Second section</AccordionTrigger>
<AccordionContent>This section is closed by default.</AccordionContent>
</AccordionItem>
<AccordionItem value="item-3">
<AccordionTrigger>Third section (default open)</AccordionTrigger>
<AccordionContent>
This section is also open by default.
</AccordionContent>
</AccordionItem>
</Accordion>
);
}
```
### Controlled Single Mode
```tsx
import { useState } from "react";
import {
Accordion,
AccordionItem,
AccordionTrigger,
AccordionContent,
} from "laif-ds";
export function ControlledAccordion() {
const [open, setOpen] = useState<string>("item-1");
return (
<Accordion
type="single"
value={open}
onValueChange={(v) => setOpen(v as string)}
className="w-96"
>
<AccordionItem value="item-1">
<AccordionTrigger>First</AccordionTrigger>
<AccordionContent>First content</AccordionContent>
</AccordionItem>
<AccordionItem value="item-2">
<AccordionTrigger>Second</AccordionTrigger>
<AccordionContent>Second content</AccordionContent>
</AccordionItem>
</Accordion>
);
}
```
---
## Notes
- **Accessibility**: Uses proper ARIA roles/attributes and keyboard navigation.
- **Animations**: `AccordionContent` has built-in open/close animations.
- **Styling**: Customize with `className` on root/items/triggers/contents.