Accordion
Result
Loading...
Live Editor
<div data-testid="pw-accordion-1"> <Accordion> <Accordion.Item eventKey="1"> <Accordion.Header>Item 1</Accordion.Header> <Accordion.Body>Content 1</Accordion.Body> </Accordion.Item> <Accordion.Item eventKey="2"> <Accordion.Header>Item 2</Accordion.Header> <Accordion.Body>Content 2</Accordion.Body> </Accordion.Item> <Accordion.Item eventKey="3"> <Accordion.Header>Item 3</Accordion.Header> <Accordion.Body>Content 3</Accordion.Body> </Accordion.Item> <Accordion.Item eventKey="4"> <Accordion.Header>Item 4</Accordion.Header> <Accordion.Body>Content 4</Accordion.Body> </Accordion.Item> </Accordion> </div>
With the AccordionHeaderContent component
Kyber provides an AccordionHeaderContent
component to help you build an accordion with render props for each section of the header.
Result
Loading...
Live Editor
<Accordion> <Accordion.Item eventKey="1"> <Accordion.Header> <AccordionHeaderContent renderPrefix={() => <span className="icon-placeholder" />} renderTitle={() => 'Account #1'} renderHelper={() => '$25,000'} /> </Accordion.Header> <Accordion.Body>Account Details</Accordion.Body> </Accordion.Item> <Accordion.Item eventKey="2"> <Accordion.Header> <AccordionHeaderContent renderPrefix={() => <span className="icon-placeholder" />} renderTitle={() => 'Account #2'} renderHelper={() => ( <span> $25,000<span className="ms-3 icon-alert-triangle text-warning"></span> </span> )} /> </Accordion.Header> <Accordion.Body>Account Details</Accordion.Body> </Accordion.Item> </Accordion>
Using with collapsible Cards
The useAccordionButton
can be used within a custom toggle to control the state of the Accordion. In this example the Card component is used to create a collapsible card.
Result
Loading...
Live Editor
function CustomToggle({ children, eventKey }) { const decoratedOnClick = useAccordionButton(eventKey, () => console.log('totally custom!')); return ( <div role="button" onClick={decoratedOnClick}> {children} </div> ); } function Example() { return ( <Accordion defaultActiveKey="0"> <Card> <Card.Header> <CustomToggle eventKey="0">Card Header</CustomToggle> </Card.Header> <Accordion.Collapse eventKey="0"> <Card.Body className="pt-0">Card Body</Card.Body> </Accordion.Collapse> </Card> </Accordion> ); } render(<Example />);
Using ListGroup
It's possible to create a ListGroup styled Accordion by setting the as
prop of Accordion.Item
to ListGroup.Item
. Use the ListGroup.Item.Template
component inside the Accordion.Item
to match the visual style of the ListGroup component.
Result
Loading...
Live Editor
<Accordion> <Accordion.Item eventKey="1" as={ListGroup.Item}> <ListGroup.Item.Template prefix={<Switch aria-label="Switch" />} header={ <Accordion.Header> <ListGroup.Item.Header title="Title" helper="Helper text" /> </Accordion.Header> } body={ <Accordion.Collapse eventKey="1"> <ListGroup.Item.Body description="Description goes here underneath all of the items above and respects indentation for inputs." actions={<Button size="sm">Action</Button>} /> </Accordion.Collapse> } /> </Accordion.Item> <Accordion.Item eventKey="2" as={ListGroup.Item}> <ListGroup.Item.Template prefix={<Switch aria-label="Switch" />} header={ <Accordion.Header> <ListGroup.Item.Header title="Title" helper="Helper text" /> </Accordion.Header> } body={ <Accordion.Collapse eventKey="2"> <ListGroup.Item.Body description="Description goes here underneath all of the items above and respects indentation for inputs." actions={<Button size="sm">Action</Button>} /> </Accordion.Collapse> } /> </Accordion.Item> </Accordion>
Props
Accordion
AccordionHeaderContent