@primer/react-brand
Version:
Primer Brand is a GitHub's design system for creating React-based marketing websites and digital experiences.
201 lines (168 loc) • 8.29 kB
Markdown
---
title: River accordion
description: Use the river accordion to create expandable content panels with associated visuals.
keywords: ['expandable', 'features', 'panels', 'visual']
ready: true
source: https://github.com/primer/brand/blob/main/packages/react/src/river/RiverAccordion/RiverAccordion.tsx
figma: 'https://www.figma.com/design/BJ95AjraesmRCWsKA013GS/Primer-Brand?node-id=16649-1564&t=hUxfzn1hD1LwE1aQ-4'
storybook: '/brand/storybook/?path=/story/components-riveraccordion--default'
---
```js
import {RiverAccordion} from '@primer/react-brand'
```
## Examples
### Default
```jsx
<RiverAccordion>
<RiverAccordion.Item>
<RiverAccordion.Heading>Heading 1</RiverAccordion.Heading>
<RiverAccordion.Content>
<Text>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In sapien sit ullamcorper id. Aliquam luctus sed turpis
felis nam pulvinar risus elementum.
</Text>
<Link href="#">Call to action</Link>
</RiverAccordion.Content>
<RiverAccordion.Visual>
<img src="/images/placeholder-1.png" alt="Visual content for item 2" />
</RiverAccordion.Visual>
</RiverAccordion.Item>
<RiverAccordion.Item>
<RiverAccordion.Heading>Heading 2</RiverAccordion.Heading>
<RiverAccordion.Content>
<Text>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In sapien sit ullamcorper id. Aliquam luctus sed turpis
felis nam pulvinar risus elementum.
</Text>
<Link href="#">Call to action</Link>
</RiverAccordion.Content>
<RiverAccordion.Visual>
<img src="/images/placeholder-2.png" alt="Visual content for item 2" />
</RiverAccordion.Visual>
</RiverAccordion.Item>
<RiverAccordion.Item>
<RiverAccordion.Heading>Heading 3</RiverAccordion.Heading>
<RiverAccordion.Content>
<Text>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In sapien sit ullamcorper id. Aliquam luctus sed turpis
felis nam pulvinar risus elementum.
</Text>
<Link href="#">Call to action</Link>
</RiverAccordion.Content>
<RiverAccordion.Visual>
<img src="/images/placeholder-3.png" alt="Visual content for item 3" />
</RiverAccordion.Visual>
</RiverAccordion.Item>
</RiverAccordion>
```
### Visual alignment
Use the `align` prop to control the position of the visuals. Setting `align="end"` will invert the default position of the visuals and content.
```jsx
<RiverAccordion align="end">
<RiverAccordion.Item>
<RiverAccordion.Heading>Heading 1</RiverAccordion.Heading>
<RiverAccordion.Content>
<Text>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In sapien sit ullamcorper id. Aliquam luctus sed turpis
felis nam pulvinar risus elementum.
</Text>
<Link href="#">Call to action</Link>
</RiverAccordion.Content>
<RiverAccordion.Visual>
<img src="/images/placeholder-1.png" alt="Visual content for item 1" />
</RiverAccordion.Visual>
</RiverAccordion.Item>
<RiverAccordion.Item>
<RiverAccordion.Heading>Heading 2</RiverAccordion.Heading>
<RiverAccordion.Content>
<Text>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In sapien sit ullamcorper id. Aliquam luctus sed turpis
felis nam pulvinar risus elementum.
</Text>
<Link href="#">Call to action</Link>
</RiverAccordion.Content>
<RiverAccordion.Visual>
<img src="/images/placeholder-2.png" alt="Visual content for item 2" />
</RiverAccordion.Visual>
</RiverAccordion.Item>
<RiverAccordion.Item>
<RiverAccordion.Heading>Heading 3</RiverAccordion.Heading>
<RiverAccordion.Content>
<Text>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. In sapien sit ullamcorper id. Aliquam luctus sed turpis
felis nam pulvinar risus elementum.
</Text>
<Link href="#">Call to action</Link>
</RiverAccordion.Content>
<RiverAccordion.Visual>
<img src="/images/placeholder-3.png" alt="Visual content for item 3" />
</RiverAccordion.Visual>
</RiverAccordion.Item>
</RiverAccordion>
```
### Gridline variant
Use the `gridline` variant to add horizontal border lines, equal-width columns, and an edge-to-edge visual background. The visual background defaults to `var(--brand-color-canvas-subtle)` and can be customized with a color, gradient, or image by overriding `--brand-RiverAccordion-visual-background`.
```jsx
<RiverAccordion variant="gridline">
<RiverAccordion.Item>
<RiverAccordion.Heading>Heading 1</RiverAccordion.Heading>
<RiverAccordion.Content>
<Text>
The gridline variant creates a full-bleed visual background, centering the media with padding around it.
</Text>
<Link href="#">Call to action</Link>
</RiverAccordion.Content>
<RiverAccordion.Visual>
<img src="/images/placeholder-1.png" alt="Visual content for item 1" />
</RiverAccordion.Visual>
</RiverAccordion.Item>
<RiverAccordion.Item>
<RiverAccordion.Heading>Heading 2</RiverAccordion.Heading>
<RiverAccordion.Content>
<Text>The background treatment is applied to each visual while the accordion interaction stays the same.</Text>
<Link href="#">Call to action</Link>
</RiverAccordion.Content>
<RiverAccordion.Visual>
<img src="/images/placeholder-2.png" alt="Visual content for item 2" />
</RiverAccordion.Visual>
</RiverAccordion.Item>
<RiverAccordion.Item>
<RiverAccordion.Heading>Heading 3</RiverAccordion.Heading>
<RiverAccordion.Content>
<Text>Use this treatment when visuals should sit in an edge-to-edge background panel.</Text>
<Link href="#">Call to action</Link>
</RiverAccordion.Content>
<RiverAccordion.Visual>
<img src="/images/placeholder-3.png" alt="Visual content for item 3" />
</RiverAccordion.Visual>
</RiverAccordion.Item>
</RiverAccordion>
```
## Component props
### RiverAccordion `Required`
| Name | Type | Default | Description |
| :--------- | :------------------------ | :---------: | :--------------------------------------------------------------------- |
| `children` | | | Multiple RiverAccordion.Item components |
| `align` | `'start' \| 'end'` | `'start'` | Controls the position of the visuals relative to the accordion content |
| `variant` | `'default' \| 'gridline'` | `'default'` | Controls the visual style of the accordion |
`RiverAccordion` extends the HTML `div` element and supports all `div` props.
### RiverAccordion.Item `Required`
| Name | Type | Default | Description |
| :--------- | :-------------------------------------------------------------------------------- | :-----: | :--------------------------------------- |
| `children` | `'RiverAccordion.Heading' \| 'RiverAccordion.Content' \| 'RiverAccordion.Visual'` | | Must include all three listed components |
`RiverAccordion.Item` extends the HTML `div` element and supports all `div` props.
### RiverAccordion.Heading `Required`
| Name | Type | Default | Description |
| :--------- | :------- | :-----: | :----------- |
| `children` | `string` | | Heading text |
`RiverAccordion.Heading` extends the [`Heading`](../../typography/Heading/index.md) component and supports all `Heading` props.
### RiverAccordion.Content `Required`
| Name | Type | Default | Description |
| :--------- | :--------------------- | :-----: | :----------------- |
| `children` | `React.ReactElement[]` | | Content components |
`RiverAccordion.Content` extends the HTML `div` element and supports all `div` props.
### RiverAccordion.Visual `Required`
| Name | Type | Default | Description |
| :--------- | :------------------- | :-----: | :--------------------------- |
| `children` | `React.ReactElement` | | Visual content (e.g., image) |
`RiverAccordion.Visual` extends the HTML `div` element and supports all `div` props.