Skip to main content

Dialogs

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

Basic

Manage open prop with the help of a state.

Selected: user02@gmail.com

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

// MUI Imports
import List from '@mui/material/List'
import Button from '@mui/material/Button'
import Dialog from '@mui/material/Dialog'
import MuiAvatar from '@mui/material/Avatar'
import ListItem from '@mui/material/ListItem'
import Typography from '@mui/material/Typography'
import DialogTitle from '@mui/material/DialogTitle'
import ListItemText from '@mui/material/ListItemText'
import ListItemButton from '@mui/material/ListItemButton'
import ListItemAvatar from '@mui/material/ListItemAvatar'

// Component Imports
import CustomAvatar from '@site/src/components/mui/Avatar'

const emails = ['username@gmail.com', 'user02@gmail.com']

const DialogsBasic = () => {
// States
const [open, setOpen] = useState<boolean>(false)
const [selectedValue, setSelectedValue] = useState<string>(emails[1])

const handleClickOpen = () => setOpen(true)

const handleDialogClose = () => setOpen(false)

const handleClose = (value: string) => {
setOpen(false)
setSelectedValue(value)
}

return (
<div>
<Typography variant='subtitle1' className='mbe-2' color='text.primary'>
Selected: {selectedValue}
</Typography>
<Button variant='outlined' onClick={handleClickOpen}>
Open simple dialog
</Button>
<Dialog onClose={handleDialogClose} aria-labelledby='simple-dialog-title' open={open}>
<DialogTitle id='simple-dialog-title'>Set backup account</DialogTitle>
<List className='pt-0 px-0'>
{emails.map(email => (
<ListItem key={email} disablePadding onClick={() => handleClose(email)}>
<ListItemButton>
<ListItemAvatar>
<CustomAvatar color='primary' skin='light'>
<i className='ri-user-3-line' />
</CustomAvatar>
</ListItemAvatar>
<ListItemText primary={email} />
</ListItemButton>
</ListItem>
))}
<ListItem disablePadding onClick={() => handleClose('addAccount')}>
<ListItemButton>
<ListItemAvatar>
<MuiAvatar>
<i className='ri-add-line' />
</MuiAvatar>
</ListItemAvatar>
<ListItemText primary='Add account' />
</ListItemButton>
</ListItem>
</List>
</Dialog>
</div>
)
}

export default DialogsBasic
Alerts

Show an alert to the user to convey something or make the user choose from the given options.


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

// MUI Imports
import Button from '@mui/material/Button'
import Dialog from '@mui/material/Dialog'
import DialogTitle from '@mui/material/DialogTitle'
import DialogContent from '@mui/material/DialogContent'
import DialogActions from '@mui/material/DialogActions'
import DialogContentText from '@mui/material/DialogContentText'

const DialogsAlert = () => {
// States
const [open, setOpen] = useState<boolean>(false)

const handleClickOpen = () => setOpen(true)

const handleClose = () => setOpen(false)

return (
<>
<Button variant='outlined' onClick={handleClickOpen}>
Open dialog
</Button>
<Dialog
open={open}
onClose={handleClose}
aria-labelledby='alert-dialog-title'
aria-describedby='alert-dialog-description'
>
<DialogTitle id='alert-dialog-title'>Use Google's location service?</DialogTitle>
<DialogContent>
<DialogContentText id='alert-dialog-description'>
Let Google help apps determine location. This means sending anonymous location data to Google, even when no
apps are running.
</DialogContentText>
</DialogContent>
<DialogActions className='dialog-actions-dense'>
<Button onClick={handleClose}>Disagree</Button>
<Button onClick={handleClose}>Agree</Button>
</DialogActions>
</Dialog>
</>
)
}

export default DialogsAlert
Transitions

You can also use any of the transitions that you like. Use TransitionComponent prop for the transition.


// React Imports
import { forwardRef, useState } from 'react'
import type { ReactElement, Ref } from 'react'

// MUI Imports
import Button from '@mui/material/Button'
import Dialog from '@mui/material/Dialog'
import DialogTitle from '@mui/material/DialogTitle'
import DialogContent from '@mui/material/DialogContent'
import DialogActions from '@mui/material/DialogActions'
import DialogContentText from '@mui/material/DialogContentText'
import Slide from '@mui/material/Slide'
import type { SlideProps } from '@mui/material/Slide'

const Transition = forwardRef(function Transition(
props: SlideProps & { children?: ReactElement<any, any> },
ref: Ref<unknown>
) {
return <Slide direction='up' ref={ref} {...props} />
})

const DialogsTransition = () => {
// States
const [open, setOpen] = useState<boolean>(false)

const handleClickOpen = () => setOpen(true)

const handleClose = () => setOpen(false)

return (
<>
<Button variant='outlined' onClick={handleClickOpen}>
Slide in alert dialog
</Button>
<Dialog
open={open}
keepMounted
onClose={handleClose}
TransitionComponent={Transition}
aria-labelledby='alert-dialog-slide-title'
aria-describedby='alert-dialog-slide-description'
>
<DialogTitle id='alert-dialog-slide-title'>Use Google's location service?</DialogTitle>
<DialogContent>
<DialogContentText id='alert-dialog-slide-description'>
Let Google help apps determine location. This means sending anonymous location data to Google, even when no
apps are running.
</DialogContentText>
</DialogContent>
<DialogActions className='dialog-actions-dense'>
<Button onClick={handleClose}>Disagree</Button>
<Button onClick={handleClose}>Agree</Button>
</DialogActions>
</Dialog>
</>
)
}

export default DialogsTransition
Form Dialog

Form dialogs allow users to fill out form fields within a dialog.


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

// MUI Imports
import Button from '@mui/material/Button'
import Dialog from '@mui/material/Dialog'
import TextField from '@mui/material/TextField'
import DialogTitle from '@mui/material/DialogTitle'
import DialogContent from '@mui/material/DialogContent'
import DialogActions from '@mui/material/DialogActions'
import DialogContentText from '@mui/material/DialogContentText'

const DialogsForm = () => {
// States
const [open, setOpen] = useState<boolean>(false)

const handleClickOpen = () => setOpen(true)

const handleClose = () => setOpen(false)

return (
<>
<Button variant='outlined' onClick={handleClickOpen}>
Open form dialog
</Button>
<Dialog open={open} onClose={handleClose} aria-labelledby='form-dialog-title'>
<DialogTitle id='form-dialog-title'>Subscribe</DialogTitle>
<DialogContent>
<DialogContentText className='mbe-3'>
To subscribe to this website, please enter your email address here. We will send updates occasionally.
</DialogContentText>
<TextField id='name' autoFocus fullWidth type='email' label='Email Address' />
</DialogContent>
<DialogActions className='dialog-actions-dense'>
<Button onClick={handleClose}>Disagree</Button>
<Button onClick={handleClose}>Agree</Button>
</DialogActions>
</Dialog>
</>
)
}

export default DialogsForm
Customized Dialog

You can customize the component the way you want using styled hook.


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

// MUI Imports
import Button from '@mui/material/Button'
import Dialog from '@mui/material/Dialog'
import IconButton from '@mui/material/IconButton'
import Typography from '@mui/material/Typography'
import DialogTitle from '@mui/material/DialogTitle'
import DialogContent from '@mui/material/DialogContent'
import DialogActions from '@mui/material/DialogActions'

const DialogsCustomized = () => {
// States
const [open, setOpen] = useState<boolean>(false)

const handleClickOpen = () => setOpen(true)

const handleClose = () => setOpen(false)

return (
<>
<Button variant='outlined' onClick={handleClickOpen}>
Open dialog
</Button>
<Dialog onClose={handleClose} aria-labelledby='customized-dialog-title' open={open}>
<DialogTitle id='customized-dialog-title' className='p-4'>
<Typography variant='h6' component='span'>
Modal title
</Typography>
<IconButton
aria-label='close'
onClick={handleClose}
className='absolute top-2.5 right-2.5 text-[var(--mui-palette-grey-500)]'
>
<i className='ri-close-line' />
</IconButton>
</DialogTitle>
<DialogContent dividers className='p-4'>
<Typography className='mbe-4'>
Chupa chups jelly-o candy sweet roll wafer cake chocolate bar. Brownie sweet roll topping cake chocolate
cake cheesecake tiramisu chocolate cake. Jujubes liquorice chocolate bar pastry. Chocolate jujubes caramels
pastry.
</Typography>
<Typography className='mbe-4'>
Ice cream marshmallow dragée bonbon croissant. Carrot cake sweet donut ice cream bonbon oat cake danish
sugar plum. Gingerbread gummies marzipan gingerbread.
</Typography>
<Typography>
Soufflé toffee ice cream. Jelly-o pudding sweet roll bonbon. Marshmallow liquorice icing. Jelly beans
chocolate bar chocolate marzipan candy fruitcake jujubes.
</Typography>
</DialogContent>
<DialogActions className='p-4 !pt-4'>
<Button onClick={handleClose}>Save changes</Button>
</DialogActions>
</Dialog>
</>
)
}

export default DialogsCustomized
Full Screen Dialog

Add fullScreen prop with Dialog component for a full screen dialog.


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

// MUI Imports
import Button from '@mui/material/Button'
import Dialog from '@mui/material/Dialog'
import DialogTitle from '@mui/material/DialogTitle'
import DialogContent from '@mui/material/DialogContent'
import DialogActions from '@mui/material/DialogActions'
import DialogContentText from '@mui/material/DialogContentText'

const DialogsFullScreen = () => {
// States
const [open, setOpen] = useState<boolean>(false)

const handleClickOpen = () => setOpen(true)

const handleClose = () => setOpen(false)

return (
<>
<Button variant='outlined' onClick={handleClickOpen}>
Open dialog
</Button>
<Dialog fullScreen onClose={handleClose} aria-labelledby='full-screen-dialog-title' open={open}>
<DialogTitle id='alert-dialog-title'>Use Google's location service?</DialogTitle>
<DialogContent>
<DialogContentText id='alert-dialog-description'>
Let Google help apps determine location. This means sending anonymous location data to Google, even when no
apps are running.
</DialogContentText>
</DialogContent>
<DialogActions className='dialog-actions-dense'>
<Button onClick={handleClose}>Disagree</Button>
<Button onClick={handleClose}>Agree</Button>
</DialogActions>
</Dialog>
</>
)
}

export default DialogsFullScreen
Optional Sizes

You can set a dialog maximum width by using the maxWidth enumerable in combination with the fullWidth boolean. When thefullWidth property is true, the dialog will adapt based on the maxWidth value.


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

// MUI Imports
import Select from '@mui/material/Select'
import Button from '@mui/material/Button'
import Switch from '@mui/material/Switch'
import Dialog from '@mui/material/Dialog'
import MenuItem from '@mui/material/MenuItem'
import { styled } from '@mui/material/styles'
import InputLabel from '@mui/material/InputLabel'
import DialogTitle from '@mui/material/DialogTitle'
import FormControl from '@mui/material/FormControl'
import DialogActions from '@mui/material/DialogActions'
import DialogContent from '@mui/material/DialogContent'
import FormControlLabel from '@mui/material/FormControlLabel'
import DialogContentText from '@mui/material/DialogContentText'
import type { SelectChangeEvent } from '@mui/material/Select'
import type { Breakpoint } from '@mui/material/styles'

// Styled component for the form
const Form = styled('form')({
margin: 'auto',
display: 'flex',
width: 'fit-content',
flexDirection: 'column'
})

const DialogsSizes = () => {
// States
const [open, setOpen] = useState<boolean>(false)
const [fullWidth, setFullWidth] = useState<boolean>(true)
const [maxWidth, setMaxWidth] = useState<Breakpoint>('sm')

const handleClickOpen = () => setOpen(true)

const handleClose = () => setOpen(false)

const handleMaxWidthChange = (event: SelectChangeEvent) => {
setMaxWidth(event.target.value as Breakpoint)
}

const handleFullWidthChange = (event: ChangeEvent<HTMLInputElement>) => {
setFullWidth(event.target.checked)
}

return (
<>
<Button variant='outlined' onClick={handleClickOpen}>
Open dialog
</Button>
<Dialog
open={open}
maxWidth={maxWidth}
fullWidth={fullWidth}
onClose={handleClose}
aria-labelledby='max-width-dialog-title'
>
<DialogTitle id='max-width-dialog-title'>Optional sizes</DialogTitle>
<DialogContent>
<DialogContentText className='mbe-4'>
You can set my maximum width and whether to adapt or not.
</DialogContentText>
<Form noValidate>
<FormControl className='mbs-2 min-is-[120px]'>
<InputLabel htmlFor='max-width'>maxWidth</InputLabel>
<Select
label='maxWidth'
value={maxWidth}
onChange={handleMaxWidthChange}
inputProps={{
name: 'max-width',
id: 'max-width'
}}
>
<MenuItem value={false as any}>false</MenuItem>
<MenuItem value='xs'>xs</MenuItem>
<MenuItem value='sm'>sm</MenuItem>
<MenuItem value='md'>md</MenuItem>
<MenuItem value='lg'>lg</MenuItem>
<MenuItem value='xl'>xl</MenuItem>
</Select>
</FormControl>
<FormControlLabel
label='Full width'
className='mbs-2'
control={<Switch checked={fullWidth} onChange={handleFullWidthChange} />}
/>
</Form>
</DialogContent>
<DialogActions className='dialog-actions-dense'>
<Button onClick={handleClose}>Close</Button>
</DialogActions>
</Dialog>
</>
)
}

export default DialogsSizes
Responsive full-screen

Make a full screen dialog at particular screen sizes only by using useMediaQuery hook.


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

// MUI Imports
import Button from '@mui/material/Button'
import Dialog from '@mui/material/Dialog'
import DialogTitle from '@mui/material/DialogTitle'
import useMediaQuery from '@mui/material/useMediaQuery'
import DialogActions from '@mui/material/DialogActions'
import DialogContent from '@mui/material/DialogContent'
import DialogContentText from '@mui/material/DialogContentText'
import { useTheme } from '@mui/material/styles'

const DialogsRespoFullScreen = () => {
// States
const [open, setOpen] = useState<boolean>(false)

// Hooks
const theme = useTheme()
const fullScreen = useMediaQuery(theme.breakpoints.down('sm'))

const handleClickOpen = () => setOpen(true)

const handleClose = () => setOpen(false)

return (
<>
<Button variant='outlined' onClick={handleClickOpen}>
Open responsive dialog
</Button>
<Dialog fullScreen={fullScreen} open={open} onClose={handleClose} aria-labelledby='responsive-dialog-title'>
<DialogTitle id='responsive-dialog-title'>Use Google's location service?</DialogTitle>
<DialogContent>
<DialogContentText>
Let Google help apps determine location. This means sending anonymous location data to Google, even when no
apps are running.
</DialogContentText>
</DialogContent>
<DialogActions className='dialog-actions-dense'>
<Button onClick={handleClose}>Disagree</Button>
<Button onClick={handleClose}>Agree</Button>
</DialogActions>
</Dialog>
</>
)
}

export default DialogsRespoFullScreen
Confirmation Dialog

Use disableEscapeKeyDown prop to disable 'Escape' key and use onClose prop to disable the backdrop.


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

// MUI Imports
import Button from '@mui/material/Button'
import Dialog from '@mui/material/Dialog'
import DialogTitle from '@mui/material/DialogTitle'
import DialogContent from '@mui/material/DialogContent'
import DialogActions from '@mui/material/DialogActions'
import DialogContentText from '@mui/material/DialogContentText'

const DialogsConfirmation = () => {
// States
const [open, setOpen] = useState<boolean>(false)

const handleClickOpen = () => setOpen(true)

const handleClose = () => setOpen(false)

return (
<>
<Button variant='outlined' onClick={handleClickOpen}>
Open dialog
</Button>
<Dialog
open={open}
disableEscapeKeyDown
aria-labelledby='alert-dialog-title'
aria-describedby='alert-dialog-description'
onClose={(event, reason) => {
if (reason !== 'backdropClick') {
handleClose()
}
}}
>
<DialogTitle id='alert-dialog-title'>Use Google's location service?</DialogTitle>
<DialogContent>
<DialogContentText id='alert-dialog-description'>
Let Google help apps determine location. This means sending anonymous location data to Google, even when no
apps are running.
</DialogContentText>
</DialogContent>
<DialogActions className='dialog-actions-dense'>
<Button onClick={handleClose}>Disagree</Button>
<Button onClick={handleClose}>Agree</Button>
</DialogActions>
</Dialog>
</>
)
}

export default DialogsConfirmation
Scrolling Long Content

scroll=paper scrolls within the paper element and scroll=body scrolls within the body element.


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

// MUI Imports
import Button from '@mui/material/Button'
import Dialog from '@mui/material/Dialog'
import DialogTitle from '@mui/material/DialogTitle'
import DialogContent from '@mui/material/DialogContent'
import DialogActions from '@mui/material/DialogActions'
import DialogContentText from '@mui/material/DialogContentText'
import type { DialogProps } from '@mui/material/Dialog'

// Third-party Imports
import classnames from 'classnames'

const DialogsScroll = () => {
// States
const [open, setOpen] = useState<boolean>(false)
const [scroll, setScroll] = useState<DialogProps['scroll']>('paper')

// Refs
const descriptionElementRef = useRef<HTMLElement>(null)

const handleClickOpen = (scrollType: DialogProps['scroll']) => () => {
setOpen(true)
setScroll(scrollType)
}

const handleClose = () => setOpen(false)

useEffect(() => {
if (open) {
const { current: descriptionElement } = descriptionElementRef

if (descriptionElement !== null) {
descriptionElement.focus()
}
}
}, [open])

return (
<div className='flex gap-4'>
<Button variant='outlined' onClick={handleClickOpen('paper')}>
scroll=paper
</Button>
<Button variant='outlined' onClick={handleClickOpen('body')}>
scroll=body
</Button>
<Dialog
open={open}
scroll={scroll}
onClose={handleClose}
aria-labelledby='scroll-dialog-title'
aria-describedby='scroll-dialog-description'
>
<DialogTitle id='scroll-dialog-title'>Subscribe</DialogTitle>
<DialogContent dividers={scroll === 'paper'}>
<DialogContentText id='scroll-dialog-description' ref={descriptionElementRef} tabIndex={-1}>
{[...new Array(50)].map(
() =>
`Cotton candy sesame snaps toffee chupa chups caramels. Candy icing gummi bears pastry cake icing brownie
oat cake. Tootsie roll biscuit chupa chups apple pie muffin jelly-o caramels. Muffin chocolate bar sweet
cookie chupa chups.`
)}
</DialogContentText>
</DialogContent>
<DialogActions className={classnames('dialog-actions-dense', { '!pt-2.5': scroll === 'paper' })}>
<Button onClick={handleClose}>Cancel</Button>
<Button onClick={handleClose}>Subscribe</Button>
</DialogActions>
</Dialog>
</div>
)
}

export default DialogsScroll