Skip to main content

Accordion

Please refer to MUI's official docs for more details on component's usage guide and API documentation.

Basic Accordion

Use Accordion, AccordionSummary and AccordionDetails components to make a simple accordion.

Wafer sesame snaps chocolate bar candy canes halvah. Cupcake sesame snaps sweet tart dessert biscuit. Topping soufflé tart sweet croissant.

Sugar plum sesame snaps caramels. Cake pie tart fruitcake sesame snaps donut cupcake macaroon. Gingerbread pudding cheesecake pie ice cream.

Gingerbread lemon drops bear claw gummi bears bonbon wafer jujubes tiramisu. Jelly pie cake. Sweet roll dessert sweet pastry powder.


// MUI Imports
import Accordion from '@mui/material/Accordion'
import Typography from '@mui/material/Typography'
import AccordionSummary from '@mui/material/AccordionSummary'
import AccordionDetails from '@mui/material/AccordionDetails'

const AccordionBasic = () => {
return (
<>
<Accordion>
<AccordionSummary id='panel-header-1' aria-controls='panel-content-1'>
<Typography>Accordion 1</Typography>
</AccordionSummary>
<AccordionDetails>
<Typography>
Wafer sesame snaps chocolate bar candy canes halvah. Cupcake sesame snaps sweet tart dessert biscuit.
Topping soufflé tart sweet croissant.
</Typography>
</AccordionDetails>
</Accordion>

<Accordion>
<AccordionSummary id='panel-header-2' aria-controls='panel-content-2'>
<Typography>Accordion 2</Typography>
</AccordionSummary>
<AccordionDetails>
<Typography>
Sugar plum sesame snaps caramels. Cake pie tart fruitcake sesame snaps donut cupcake macaroon. Gingerbread
pudding cheesecake pie ice cream.
</Typography>
</AccordionDetails>
</Accordion>

<Accordion>
<AccordionSummary id='panel-header-3' aria-controls='panel-content-3'>
<Typography>Accordion 3</Typography>
</AccordionSummary>
<AccordionDetails>
<Typography>
Gingerbread lemon drops bear claw gummi bears bonbon wafer jujubes tiramisu. Jelly pie cake. Sweet roll
dessert sweet pastry powder.
</Typography>
</AccordionDetails>
</Accordion>
</>
)
}

export default AccordionBasic
Controlled Accordion

Manage expanded prop with the help of a state.

Wafer sesame snaps chocolate bar candy canes halvah. Cupcake sesame snaps sweet tart dessert biscuit. Topping soufflé tart sweet croissant.

Sugar plum sesame snaps caramels. Cake pie tart fruitcake sesame snaps donut cupcake macaroon. Gingerbread pudding cheesecake pie ice cream.

Gingerbread lemon drops bear claw gummi bears bonbon wafer jujubes tiramisu. Jelly pie cake. Sweet roll dessert sweet pastry powder.


// React Imports
import { useState } from 'react'
import type { SyntheticEvent } from 'react'

// MUI Imports
import Accordion from '@mui/material/Accordion'
import Typography from '@mui/material/Typography'
import AccordionSummary from '@mui/material/AccordionSummary'
import AccordionDetails from '@mui/material/AccordionDetails'

const AccordionControlled = () => {
// States
const [expanded, setExpanded] = useState<string | false>(false)

const handleChange = (panel: string) => (event: SyntheticEvent, isExpanded: boolean) => {
setExpanded(isExpanded ? panel : false)
}

return (
<>
<Accordion expanded={expanded === 'panel1'} onChange={handleChange('panel1')}>
<AccordionSummary id='controlled-panel-header-1' aria-controls='controlled-panel-content-1'>
<Typography>Accordion 1</Typography>
</AccordionSummary>
<AccordionDetails>
<Typography>
Wafer sesame snaps chocolate bar candy canes halvah. Cupcake sesame snaps sweet tart dessert biscuit.
Topping soufflé tart sweet croissant.
</Typography>
</AccordionDetails>
</Accordion>

<Accordion expanded={expanded === 'panel2'} onChange={handleChange('panel2')}>
<AccordionSummary id='controlled-panel-header-2' aria-controls='controlled-panel-content-2'>
<Typography>Accordion 2</Typography>
</AccordionSummary>
<AccordionDetails>
<Typography>
Sugar plum sesame snaps caramels. Cake pie tart fruitcake sesame snaps donut cupcake macaroon. Gingerbread
pudding cheesecake pie ice cream.
</Typography>
</AccordionDetails>
</Accordion>

<Accordion expanded={expanded === 'panel3'} onChange={handleChange('panel3')}>
<AccordionSummary id='controlled-panel-header-3' aria-controls='controlled-panel-content-3'>
<Typography>Accordion 3</Typography>
</AccordionSummary>
<AccordionDetails>
<Typography>
Gingerbread lemon drops bear claw gummi bears bonbon wafer jujubes tiramisu. Jelly pie cake. Sweet roll
dessert sweet pastry powder.
</Typography>
</AccordionDetails>
</Accordion>
</>
)
}

export default AccordionControlled
Customized Accordion

Use styled hook to customize the component the way you want it.

Accordion 1

Wafer sesame snaps chocolate bar candy canes halvah. Cupcake sesame snaps sweet tart dessert biscuit. Topping soufflé tart sweet croissant.

Sugar plum sesame snaps caramels. Cake pie tart fruitcake sesame snaps donut cupcake macaroon. Gingerbread pudding cheesecake pie ice cream.

Gingerbread lemon drops bear claw gummi bears bonbon wafer jujubes tiramisu. Jelly pie cake. Sweet roll dessert sweet pastry powder.


// React Imports
import { useState } from 'react'
import type { SyntheticEvent } from 'react'

// MUI Imports
import { styled } from '@mui/material/styles'
import Typography from '@mui/material/Typography'
import MuiAccordion from '@mui/material/Accordion'
import MuiAccordionSummary from '@mui/material/AccordionSummary'
import MuiAccordionDetails from '@mui/material/AccordionDetails'
import type { AccordionProps } from '@mui/material/Accordion'
import type { AccordionSummaryProps } from '@mui/material/AccordionSummary'
import type { AccordionDetailsProps } from '@mui/material/AccordionDetails'

// Styled component for Accordion component
const Accordion = styled(MuiAccordion)<AccordionProps>(({ theme }) => ({
boxShadow: 'none !important',
border: `1px solid ${theme.palette.divider} !important`,
borderRadius: '0 !important',
overflow: 'hidden',
'&:not(:last-of-type)': {
borderBottom: '0 !important'
},
'&:before': {
display: 'none'
},
'&.Mui-expanded': {
margin: 'auto'
},
'&:first-of-type': {
borderTopLeftRadius: 'var(--mui-shape-borderRadius) !important',
borderTopRightRadius: 'var(--mui-shape-borderRadius) !important'
},
'&:last-of-type': {
borderBottomLeftRadius: 'var(--mui-shape-borderRadius) !important',
borderBottomRightRadius: 'var(--mui-shape-borderRadius) !important'
}
}))

// Styled component for AccordionSummary component
const AccordionSummary = styled(MuiAccordionSummary)<AccordionSummaryProps>(({ theme }) => ({
marginBottom: -1,
transition: 'none',
backgroundColor: 'var(--mui-palette-customColors-greyLightBg)',
borderBottom: `1px solid ${theme.palette.divider} !important`
}))

// Styled component for AccordionDetails component
const AccordionDetails = styled(MuiAccordionDetails)<AccordionDetailsProps>(({ theme }) => ({
padding: `${theme.spacing(4)} !important`
}))

const AccordionCustomized = () => {
// States
const [expanded, setExpanded] = useState<string | false>('panel1')

const handleChange = (panel: string) => (event: SyntheticEvent, isExpanded: boolean) => {
setExpanded(isExpanded ? panel : false)
}

const expandIcon = (value: string) => <i className={expanded === value ? 'ri-subtract-line' : 'ri-add-line'} />

return (
<>
<Accordion expanded={expanded === 'panel1'} onChange={handleChange('panel1')}>
<AccordionSummary
id='customized-panel-header-1'
expandIcon={expandIcon('panel1')}
aria-controls='customized-panel-content-1'
>
<Typography>Accordion 1</Typography>
</AccordionSummary>
<AccordionDetails>
<Typography>
Wafer sesame snaps chocolate bar candy canes halvah. Cupcake sesame snaps sweet tart dessert biscuit.
Topping soufflé tart sweet croissant.
</Typography>
</AccordionDetails>
</Accordion>

<Accordion expanded={expanded === 'panel2'} onChange={handleChange('panel2')}>
<AccordionSummary
id='customized-panel-header-2'
expandIcon={expandIcon('panel2')}
aria-controls='customized-panel-content-2'
>
<Typography>Accordion 2</Typography>
</AccordionSummary>
<AccordionDetails>
<Typography>
Sugar plum sesame snaps caramels. Cake pie tart fruitcake sesame snaps donut cupcake macaroon. Gingerbread
pudding cheesecake pie ice cream.
</Typography>
</AccordionDetails>
</Accordion>

<Accordion expanded={expanded === 'panel3'} onChange={handleChange('panel3')}>
<AccordionSummary
id='customized-panel-header-3'
expandIcon={expandIcon('panel3')}
aria-controls='customized-panel-content-3'
>
<Typography>Accordion 3</Typography>
</AccordionSummary>
<AccordionDetails>
<Typography>
Gingerbread lemon drops bear claw gummi bears bonbon wafer jujubes tiramisu. Jelly pie cake. Sweet roll
dessert sweet pastry powder.
</Typography>
</AccordionDetails>
</Accordion>
</>
)
}

export default AccordionCustomized
Additional Actions

In order to put an action such as a Checkbox or a button inside AccordionSummary, you need to stop the propagation of the focus and click events to prevent the accordion from expanding/collapsing when using the action.

Wafer sesame snaps chocolate bar candy canes halvah. Cupcake sesame snaps sweet tart dessert biscuit. Topping soufflé tart sweet croissant.

Sugar plum sesame snaps caramels. Cake pie tart fruitcake sesame snaps donut cupcake macaroon. Gingerbread pudding cheesecake pie ice cream.

Gingerbread lemon drops bear claw gummi bears bonbon wafer jujubes tiramisu. Jelly pie cake. Sweet roll dessert sweet pastry powder.


// React Imports
import { useState } from 'react'
import type { SyntheticEvent } from 'react'

// MUI Imports
import Checkbox from '@mui/material/Checkbox'
import Accordion from '@mui/material/Accordion'
import Typography from '@mui/material/Typography'
import AccordionSummary from '@mui/material/AccordionSummary'
import FormControlLabel from '@mui/material/FormControlLabel'
import AccordionDetails from '@mui/material/AccordionDetails'

const AccordionActions = () => {
// States
const [expanded, setExpanded] = useState<string | false>(false)

const handleChange = (panel: string) => (event: SyntheticEvent, isExpanded: boolean) => {
setExpanded(isExpanded ? panel : false)
}

return (
<>
<Accordion expanded={expanded === 'panel1'} onChange={handleChange('panel1')}>
<AccordionSummary id='actions-panel-header-1' aria-controls='actions-panel-content-1'>
<FormControlLabel
label='Accordion 1'
aria-label='Acknowledge'
control={<Checkbox disableRipple />}
onClick={event => event.stopPropagation()}
onFocus={event => event.stopPropagation()}
/>
</AccordionSummary>
<AccordionDetails>
<Typography>
Wafer sesame snaps chocolate bar candy canes halvah. Cupcake sesame snaps sweet tart dessert biscuit.
Topping soufflé tart sweet croissant.
</Typography>
</AccordionDetails>
</Accordion>

<Accordion expanded={expanded === 'panel2'} onChange={handleChange('panel2')}>
<AccordionSummary id='actions-panel-header-2' aria-controls='actions-panel-content-2'>
<FormControlLabel
label='Accordion 2'
aria-label='Acknowledge'
control={<Checkbox disableRipple />}
onClick={event => event.stopPropagation()}
onFocus={event => event.stopPropagation()}
/>
</AccordionSummary>
<AccordionDetails>
<Typography>
Sugar plum sesame snaps caramels. Cake pie tart fruitcake sesame snaps donut cupcake macaroon. Gingerbread
pudding cheesecake pie ice cream.
</Typography>
</AccordionDetails>
</Accordion>

<Accordion expanded={expanded === 'panel3'} onChange={handleChange('panel3')}>
<AccordionSummary id='actions-panel-header-3' aria-controls='actions-panel-content-3'>
<FormControlLabel
label='Accordion 3'
aria-label='Acknowledge'
control={<Checkbox disableRipple />}
onClick={event => event.stopPropagation()}
onFocus={event => event.stopPropagation()}
/>
</AccordionSummary>
<AccordionDetails>
<Typography>
Gingerbread lemon drops bear claw gummi bears bonbon wafer jujubes tiramisu. Jelly pie cake. Sweet roll
dessert sweet pastry powder.
</Typography>
</AccordionDetails>
</Accordion>
</>
)
}

export default AccordionActions