Skip to main content

Button Group

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

Basic Button Group

Use variant={'outlined' | 'contained' | 'text'} prop with <ButtonGroup> component for button groups.


// MUI Imports
import Button from '@mui/material/Button'
import ButtonGroup from '@mui/material/ButtonGroup'

const ButtonGroupBasic = () => {
return (
<div className='flex flex-col gap-4 items-start'>
<ButtonGroup variant='outlined'>
<Button>One</Button>
<Button>Two</Button>
<Button>Three</Button>
</ButtonGroup>
<ButtonGroup variant='contained'>
<Button>One</Button>
<Button>Two</Button>
<Button>Three</Button>
</ButtonGroup>
<ButtonGroup variant='text'>
<Button>One</Button>
<Button>Two</Button>
<Button>Three</Button>
</ButtonGroup>
</div>
)
}

export default ButtonGroupBasic
Button Group Sizes

Use size={'small' | 'medium' | 'large'} prop with <ButtonGroup> component for different sizes of button groups.


// MUI Imports
import Button from '@mui/material/Button'
import ButtonGroup from '@mui/material/ButtonGroup'

const ButtonGroupSizes = () => {
return (
<div className='flex flex-col gap-4 items-start'>
<ButtonGroup size='small'>
<Button>One</Button>
<Button>Two</Button>
<Button>Three</Button>
</ButtonGroup>
<ButtonGroup size='medium'>
<Button>One</Button>
<Button>Two</Button>
<Button>Three</Button>
</ButtonGroup>
<ButtonGroup size='large'>
<Button>One</Button>
<Button>Two</Button>
<Button>Three</Button>
</ButtonGroup>
</div>
)
}

export default ButtonGroupSizes
Vertical Button Group

Use orientation='vertical' prop with <ButtonGroup> component for vertical button groups.


// MUI Imports
import Button from '@mui/material/Button'
import ButtonGroup from '@mui/material/ButtonGroup'

const ButtonGroupVertical = () => {
return (
<div className='flex gap-4'>
<ButtonGroup variant='outlined' orientation='vertical'>
<Button>One</Button>
<Button>Two</Button>
<Button>Three</Button>
</ButtonGroup>
<ButtonGroup variant='contained' orientation='vertical'>
<Button>One</Button>
<Button>Two</Button>
<Button>Three</Button>
</ButtonGroup>
<ButtonGroup variant='text' orientation='vertical'>
<Button>One</Button>
<Button>Two</Button>
<Button>Three</Button>
</ButtonGroup>
</div>
)
}

export default ButtonGroupVertical
Split Button

ButtonGroup can also be used to create a split button. The dropdown can change the button action (as in this example), or be used to immediately trigger a related action.


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

// MUI Imports
import Grow from '@mui/material/Grow'
import Paper from '@mui/material/Paper'
import Button from '@mui/material/Button'
import Popper from '@mui/material/Popper'
import MenuItem from '@mui/material/MenuItem'
import MenuList from '@mui/material/MenuList'
import ButtonGroup from '@mui/material/ButtonGroup'
import ClickAwayListener from '@mui/material/ClickAwayListener'

const options = ['Create a merge commit', 'Squash and merge', 'Rebase and merge']

const ButtonGroupSplit = () => {
// States
const [open, setOpen] = useState<boolean>(false)
const [selectedIndex, setSelectedIndex] = useState<number>(1)

// Refs
const anchorRef = useRef<HTMLDivElement | null>(null)

const handleClick = () => {
// eslint-disable-next-line no-console
console.info(`You clicked '${options[selectedIndex]}'`)
}

const handleMenuItemClick = (event: SyntheticEvent, index: number) => {
setSelectedIndex(index)
setOpen(false)
}

const handleToggle = () => {
setOpen(prevOpen => !prevOpen)
}

const handleClose = () => {
setOpen(false)
}

return (
<>
<ButtonGroup variant='contained' ref={anchorRef} aria-label='split button'>
<Button onClick={handleClick}>{options[selectedIndex]}</Button>
<Button
className='pli-0'
aria-haspopup='menu'
onClick={handleToggle}
aria-label='select merge strategy'
aria-expanded={open ? 'true' : undefined}
aria-controls={open ? 'split-button-menu' : undefined}
>
<i className='ri-arrow-down-s-fill' />
</Button>
</ButtonGroup>
<Popper open={open} anchorEl={anchorRef.current} role={undefined} transition placement='bottom-end'>
{({ TransitionProps, placement }) => (
<Grow
{...TransitionProps}
style={{ transformOrigin: placement === 'bottom-end' ? 'right top' : 'right bottom' }}
>
<Paper className='shadow-lg mbs-0.5'>
<ClickAwayListener onClickAway={handleClose}>
<MenuList id='split-button-menu'>
{options.map((option, index) => (
<MenuItem
key={option}
disabled={index === 2}
selected={index === selectedIndex}
onClick={event => handleMenuItemClick(event, index)}
>
{option}
</MenuItem>
))}
</MenuList>
</ClickAwayListener>
</Paper>
</Grow>
)}
</Popper>
</>
)
}

export default ButtonGroupSplit
Button Group Colors

Use color prop for different colored button-groups.


// MUI Imports
import Button from '@mui/material/Button'
import ButtonGroup from '@mui/material/ButtonGroup'

const ButtonGroupColor = () => {
return (
<div className='flex gap-4 flex-wrap'>
<ButtonGroup variant='outlined' color='secondary'>
<Button>One</Button>
<Button>Two</Button>
<Button>Three</Button>
</ButtonGroup>

<ButtonGroup variant='outlined' color='success'>
<Button>One</Button>
<Button>Two</Button>
<Button>Three</Button>
</ButtonGroup>

<ButtonGroup variant='outlined' color='error'>
<Button>One</Button>
<Button>Two</Button>
<Button>Three</Button>
</ButtonGroup>

<ButtonGroup variant='outlined' color='warning'>
<Button>One</Button>
<Button>Two</Button>
<Button>Three</Button>
</ButtonGroup>

<ButtonGroup variant='outlined' color='info'>
<Button>One</Button>
<Button>Two</Button>
<Button>Three</Button>
</ButtonGroup>
</div>
)
}

export default ButtonGroupColor
Toggle Button

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

Basic Toggle Button

Manage value prop with <ToggleButtonGroup> component with the help of a state and use exclusive prop with <ToggleButtonGroup> component for single toggle.


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

// MUI Imports
import ToggleButton from '@mui/material/ToggleButton'
import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'

const ButtonToggleBasic = () => {
// States
const [alignment, setAlignment] = useState<string | null>('left')

const handleAlignment = (event: MouseEvent<HTMLElement>, newAlignment: string | null) => {
setAlignment(newAlignment)
}

return (
<ToggleButtonGroup exclusive value={alignment} onChange={handleAlignment} aria-label='text alignment'>
<ToggleButton value='left' aria-label='left aligned'>
<i className='ri-align-left' />
</ToggleButton>
<ToggleButton value='center' aria-label='center aligned'>
<i className='ri-align-center' />
</ToggleButton>
<ToggleButton value='right' aria-label='right aligned'>
<i className='ri-align-right' />
</ToggleButton>
<ToggleButton value='justify' aria-label='justified' disabled>
<i className='ri-align-justify' />
</ToggleButton>
</ToggleButtonGroup>
)
}

export default ButtonToggleBasic
Multiple Toggle Button

Manage value prop with the help of a state with array.


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

// MUI Imports
import ToggleButton from '@mui/material/ToggleButton'
import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'

const ButtonToggleMultiple = () => {
// States
const [formats, setFormats] = useState<string[]>(() => ['bold', 'italic'])

const handleFormat = (event: MouseEvent<HTMLElement>, newFormats: string[]) => {
setFormats(newFormats)
}

return (
<ToggleButtonGroup value={formats} onChange={handleFormat} aria-label='text alignment'>
<ToggleButton value='bold' aria-label='bold'>
<i className='ri-bold' />
</ToggleButton>
<ToggleButton value='italic' aria-label='italic'>
<i className='ri-italic' />
</ToggleButton>
<ToggleButton value='underlined' aria-label='underlined'>
<i className='ri-underline' />
</ToggleButton>
<ToggleButton value='color' aria-label='color' disabled>
<i className='ri-paint-fill' />
</ToggleButton>
</ToggleButtonGroup>
)
}

export default ButtonToggleMultiple
Toggle Button Sizes

Use size={'size' | 'large'} prop for different sizes.


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

// MUI Imports
import ToggleButton from '@mui/material/ToggleButton'
import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'

const ButtonToggleSizes = () => {
// States
const [alignment, setAlignment] = useState<string | null>('left')

const handleAlignment = (event: MouseEvent<HTMLElement>, newAlignment: string | null) => {
setAlignment(newAlignment)
}

return (
<div className='flex flex-col gap-4 items-start'>
<ToggleButtonGroup
exclusive
size='small'
value={alignment}
onChange={handleAlignment}
aria-label='text alignment'
>
<ToggleButton value='left' aria-label='left aligned'>
<i className='ri-align-left' />
</ToggleButton>
<ToggleButton value='center' aria-label='center aligned'>
<i className='ri-align-center' />
</ToggleButton>
<ToggleButton value='right' aria-label='right aligned'>
<i className='ri-align-right' />
</ToggleButton>
<ToggleButton value='justify' aria-label='justified' disabled>
<i className='ri-align-justify' />
</ToggleButton>
</ToggleButtonGroup>
<ToggleButtonGroup exclusive value={alignment} onChange={handleAlignment} aria-label='text alignment'>
<ToggleButton value='left' aria-label='left aligned'>
<i className='ri-align-left' />
</ToggleButton>
<ToggleButton value='center' aria-label='center aligned'>
<i className='ri-align-center' />
</ToggleButton>
<ToggleButton value='right' aria-label='right aligned'>
<i className='ri-align-right' />
</ToggleButton>
<ToggleButton value='justify' aria-label='justified' disabled>
<i className='ri-align-justify' />
</ToggleButton>
</ToggleButtonGroup>
<ToggleButtonGroup
exclusive
size='large'
value={alignment}
onChange={handleAlignment}
aria-label='text alignment'
>
<ToggleButton value='left' aria-label='left aligned'>
<i className='ri-align-left' />
</ToggleButton>
<ToggleButton value='center' aria-label='center aligned'>
<i className='ri-align-center' />
</ToggleButton>
<ToggleButton value='right' aria-label='right aligned'>
<i className='ri-align-right' />
</ToggleButton>
<ToggleButton value='justify' aria-label='justified' disabled>
<i className='ri-align-justify' />
</ToggleButton>
</ToggleButtonGroup>
</div>
)
}

export default ButtonToggleSizes
Vertical Toggle Button

Use orientation='vertical' prop for vertical toggle button.


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

// MUI Imports
import ToggleButton from '@mui/material/ToggleButton'
import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'

const ButtonToggleVertical = () => {
// States
const [view, setView] = useState<string | null>('left')

const handleView = (event: MouseEvent<HTMLElement>, newView: string | null) => {
setView(newView)
}

return (
<ToggleButtonGroup exclusive value={view} orientation='vertical' onChange={handleView} aria-label='text alignment'>
<ToggleButton value='left' aria-label='left aligned'>
<i className='ri-layout-column-fill' />
</ToggleButton>
<ToggleButton value='center' aria-label='center aligned'>
<i className='ri-layout-5-fill' />
</ToggleButton>
<ToggleButton value='right' aria-label='right aligned'>
<i className='ri-layout-masonry-fill' />
</ToggleButton>
</ToggleButtonGroup>
)
}

export default ButtonToggleVertical
Enforce Value Set

Use if statement in handle function in onChange prop.

Exclusive Selection

Multiple Selection


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

// MUI Imports
import Grid from '@mui/material/Grid'
import Typography from '@mui/material/Typography'
import ToggleButton from '@mui/material/ToggleButton'
import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'

const ButtonToggleEnforceValue = () => {
// States
const [formats, setFormats] = useState<string[]>(() => ['phone'])
const [alignment, setAlignment] = useState<string | null>('left')

const handleAlignment = (event: MouseEvent<HTMLElement>, newAlignment: string | null) => {
if (newAlignment !== null) {
setAlignment(newAlignment)
}
}

const handleFormat = (event: MouseEvent<HTMLElement>, newFormats: string[]) => {
if (newFormats.length) {
setFormats(newFormats)
}
}

return (
<Grid container spacing={6}>
<Grid item xs={12} sm={6}>
<Typography className='font-medium mbe-2' color='text.primary'>
Exclusive Selection
</Typography>
<ToggleButtonGroup exclusive value={alignment} onChange={handleAlignment} aria-label='text alignment'>
<ToggleButton value='left' aria-label='left aligned'>
<i className='ri-align-left' />
</ToggleButton>
<ToggleButton value='center' aria-label='center aligned'>
<i className='ri-align-center' />
</ToggleButton>
<ToggleButton value='right' aria-label='right aligned'>
<i className='ri-align-right' />
</ToggleButton>
<ToggleButton value='justify' aria-label='justified' disabled>
<i className='ri-align-justify' />
</ToggleButton>
</ToggleButtonGroup>
</Grid>
<Grid item xs={12} sm={6}>
<Typography className='font-medium mbe-2' color='text.primary'>
Multiple Selection
</Typography>
<ToggleButtonGroup value={formats} onChange={handleFormat} aria-label='device'>
<ToggleButton value='laptop' aria-label='laptop'>
<i className='ri-macbook-line' />
</ToggleButton>
<ToggleButton value='desktop' aria-label='desktop'>
<i className='ri-computer-line' />
</ToggleButton>
<ToggleButton value='phone' aria-label='phone'>
<i className='ri-smartphone-line' />
</ToggleButton>
</ToggleButtonGroup>
</Grid>
</Grid>
)
}

export default ButtonToggleEnforceValue
Customized Toggle Button

Use styled hook to customize your toggle button.


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

// MUI Imports
import { styled } from '@mui/material/styles'
import MuiToggleButtonGroup from '@mui/material/ToggleButtonGroup'
import MuiToggleButton from '@mui/material/ToggleButton'
import type { ToggleButtonGroupProps } from '@mui/material/ToggleButtonGroup'
import type { ToggleButtonProps } from '@mui/material/ToggleButton'

// Styled ToggleButtonGroup component
const ToggleButtonGroup = styled(MuiToggleButtonGroup)<ToggleButtonGroupProps>(({ theme }) => ({
padding: theme.spacing(1.75),
border: '1px solid var(--mui-palette-divider)'
}))

// Styled ToggleButton component
const ToggleButton = styled(MuiToggleButton)<ToggleButtonProps>(({ theme }) => ({
margin: '0 !important',
border: 'none !important',
padding: theme.spacing(2.5),
'&:not(:first-of-type)': {
borderRadius: `${theme.shape.borderRadius}px !important`
},
'&:first-of-type': {
borderRadius: `${theme.shape.borderRadius}px !important`
}
}))

const ButtonToggleCustomized = () => {
// States
const [alignment, setAlignment] = useState<string | null>('left')
const [formats, setFormats] = useState<string[]>(() => ['italic'])

const handleAlignment = (event: MouseEvent<HTMLElement>, newAlignment: string | null) => {
setAlignment(newAlignment)
}

const handleFormat = (event: MouseEvent<HTMLElement>, newFormats: string[]) => {
setFormats(newFormats)
}

return (
<div className='flex flex-wrap gap-4'>
<ToggleButtonGroup exclusive value={alignment} onChange={handleAlignment} aria-label='text alignment'>
<ToggleButton value='left' aria-label='left aligned'>
<i className='ri-align-left' />
</ToggleButton>
<ToggleButton value='center' aria-label='center aligned'>
<i className='ri-align-center' />
</ToggleButton>
<ToggleButton value='right' aria-label='right aligned'>
<i className='ri-align-right' />
</ToggleButton>
<ToggleButton value='justify' aria-label='justified' disabled>
<i className='ri-align-justify' />
</ToggleButton>
</ToggleButtonGroup>
<ToggleButtonGroup value={formats} onChange={handleFormat} aria-label='text alignment'>
<ToggleButton value='bold' aria-label='bold'>
<i className='ri-bold' />
</ToggleButton>
<ToggleButton value='italic' aria-label='italic'>
<i className='ri-italic' />
</ToggleButton>
<ToggleButton value='underlined' aria-label='underlined'>
<i className='ri-underline' />
</ToggleButton>
<ToggleButton value='color' aria-label='color' disabled>
<i className='ri-paint-fill' />
</ToggleButton>
</ToggleButtonGroup>
</div>
)
}

export default ButtonToggleCustomized
Toggle Button Colors

Use color prop for different colored toggle-buttons.


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

// MUI Imports
import ToggleButton from '@mui/material/ToggleButton'
import ToggleButtonGroup from '@mui/material/ToggleButtonGroup'

const ButtonToggleColors = () => {
// States
const [alignment, setAlignment] = useState<string | null>('web')

const handleAlignment = (event: MouseEvent<HTMLElement>, newAlignment: string | null) => {
setAlignment(newAlignment)
}

return (
<div className='flex gap-4 flex-wrap'>
<ToggleButtonGroup exclusive color='primary' value={alignment} onChange={handleAlignment}>
<ToggleButton value='web'>Web</ToggleButton>
<ToggleButton value='android'>Android</ToggleButton>
<ToggleButton value='ios'>iOS</ToggleButton>
</ToggleButtonGroup>

<ToggleButtonGroup exclusive color='secondary' value={alignment} onChange={handleAlignment}>
<ToggleButton value='web'>Web</ToggleButton>
<ToggleButton value='android'>Android</ToggleButton>
<ToggleButton value='ios'>iOS</ToggleButton>
</ToggleButtonGroup>

<ToggleButtonGroup exclusive color='success' value={alignment} onChange={handleAlignment}>
<ToggleButton value='web'>Web</ToggleButton>
<ToggleButton value='android'>Android</ToggleButton>
<ToggleButton value='ios'>iOS</ToggleButton>
</ToggleButtonGroup>

<ToggleButtonGroup exclusive color='error' value={alignment} onChange={handleAlignment}>
<ToggleButton value='web'>Web</ToggleButton>
<ToggleButton value='android'>Android</ToggleButton>
<ToggleButton value='ios'>iOS</ToggleButton>
</ToggleButtonGroup>

<ToggleButtonGroup exclusive color='warning' value={alignment} onChange={handleAlignment}>
<ToggleButton value='web'>Web</ToggleButton>
<ToggleButton value='android'>Android</ToggleButton>
<ToggleButton value='ios'>iOS</ToggleButton>
</ToggleButtonGroup>

<ToggleButtonGroup exclusive color='info' value={alignment} onChange={handleAlignment}>
<ToggleButton value='web'>Web</ToggleButton>
<ToggleButton value='android'>Android</ToggleButton>
<ToggleButton value='ios'>iOS</ToggleButton>
</ToggleButtonGroup>
</div>
)
}

export default ButtonToggleColors