Dialog
Dialogs are windows containing contextual information, tasks, or workflows that appear over the user interface. Depending on the kind of Dialog, further interactions may be blocked until the Dialog is acknowledged.
| install | yarn add @adobe/react-spectrum |
|---|---|
| added | 3.0.0 |
| usage | import {Dialog, DialogTrigger} from '@adobe/react-spectrum' |
Example#
import {ActionButton, Button, ButtonGroup, Content, Dialog, DialogTrigger, Divider, Header, Heading, Text} from '@adobe/react-spectrum';
<DialogTrigger>
<ActionButton>Check connectivity</ActionButton>
{(close) => (
<Dialog>
<Heading>Internet Speed Test</Heading>
<Header>Connection status: Connected</Header>
<Divider />
<Content>
<Text>
Start speed test?
</Text>
</Content>
<ButtonGroup>
<Button variant="secondary" onPress={close}>Cancel</Button>
<Button variant="accent" onPress={close}>Confirm</Button>
</ButtonGroup>
</Dialog>
)}
</DialogTrigger>
import {
ActionButton,
Button,
ButtonGroup,
Content,
Dialog,
DialogTrigger,
Divider,
Header,
Heading,
Text
} from '@adobe/react-spectrum';
<DialogTrigger>
<ActionButton>Check connectivity</ActionButton>
{(close) => (
<Dialog>
<Heading>Internet Speed Test</Heading>
<Header>Connection status: Connected</Header>
<Divider />
<Content>
<Text>
Start speed test?
</Text>
</Content>
<ButtonGroup>
<Button variant="secondary" onPress={close}>
Cancel
</Button>
<Button variant="accent" onPress={close}>
Confirm
</Button>
</ButtonGroup>
</Dialog>
)}
</DialogTrigger>
import {
ActionButton,
Button,
ButtonGroup,
Content,
Dialog,
DialogTrigger,
Divider,
Header,
Heading,
Text
} from '@adobe/react-spectrum';
<DialogTrigger>
<ActionButton>
Check connectivity
</ActionButton>
{(close) => (
<Dialog>
<Heading>
Internet Speed
Test
</Heading>
<Header>
Connection
status:
Connected
</Header>
<Divider />
<Content>
<Text>
Start speed
test?
</Text>
</Content>
<ButtonGroup>
<Button
variant="secondary"
onPress={close}
>
Cancel
</Button>
<Button
variant="accent"
onPress={close}
>
Confirm
</Button>
</ButtonGroup>
</Dialog>
)}
</DialogTrigger>
Content#
A standard Dialog has the following anatomy:
These sections can be populated by providing the following components to your Dialog as children:
Header, Heading (title), Divider, Content (body),
ButtonGroup, and Footer. Each of these components are
required in a Spectrum compliant Dialog except for Header, Footer, and Divider so be sure to design your Dialog accordingly.
Examples#
A typical Dialog with a title, contents, and action buttons can be created like so:
<DialogTrigger>
<ActionButton>Publish</ActionButton>
{(close) => (
<Dialog>
<Heading>Publish 3 pages</Heading>
<Divider />
<Content>Confirm publish?</Content>
<ButtonGroup>
<Button variant="secondary" onPress={close}>Cancel</Button>
<Button variant="accent" onPress={close} autoFocus>Confirm</Button>
</ButtonGroup>
</Dialog>
)}
</DialogTrigger>
<DialogTrigger>
<ActionButton>Publish</ActionButton>
{(close) => (
<Dialog>
<Heading>Publish 3 pages</Heading>
<Divider />
<Content>Confirm publish?</Content>
<ButtonGroup>
<Button variant="secondary" onPress={close}>
Cancel
</Button>
<Button
variant="accent"
onPress={close}
autoFocus
>
Confirm
</Button>
</ButtonGroup>
</Dialog>
)}
</DialogTrigger>
<DialogTrigger>
<ActionButton>
Publish
</ActionButton>
{(close) => (
<Dialog>
<Heading>
Publish 3 pages
</Heading>
<Divider />
<Content>
Confirm
publish?
</Content>
<ButtonGroup>
<Button
variant="secondary"
onPress={close}
>
Cancel
</Button>
<Button
variant="accent"
onPress={close}
autoFocus
>
Confirm
</Button>
</ButtonGroup>
</Dialog>
)}
</DialogTrigger>
A dismissable Dialog forgoes its ButtonGroup in favor of rendering a close button at the top right of the Dialog.
<DialogTrigger isDismissable>
<ActionButton>Status</ActionButton>
<Dialog>
<Heading>Status</Heading>
<Divider />
<Content>Printer Status: Connected</Content>
</Dialog>
</DialogTrigger>
<DialogTrigger isDismissable>
<ActionButton>Status</ActionButton>
<Dialog>
<Heading>Status</Heading>
<Divider />
<Content>Printer Status: Connected</Content>
</Dialog>
</DialogTrigger>
<DialogTrigger
isDismissable
>
<ActionButton>
Status
</ActionButton>
<Dialog>
<Heading>
Status
</Heading>
<Divider />
<Content>
Printer Status:
Connected
</Content>
</Dialog>
</DialogTrigger>
It is important to note that the Heading, Header, Content, and Footer content elements accept any renderable
node, not just strings. This allows you to create Dialogs for more complex workflows, such as including a form
for the user to fill out or adding confirmation checkboxes.
<DialogTrigger>
<ActionButton>Register</ActionButton>
{(close) => (
<Dialog>
<Heading>
<Flex alignItems="center" gap="size-100">
<Book size="S" />
<Text>
Register for newsletter
</Text>
</Flex>
</Heading>
<Header>
<Link>
<a href="//example.com" target="_blank">What is this?</a>
</Link>
</Header>
<Divider />
<Content>
<Form>
<TextField label="First Name" autoFocus />
<TextField label="Last Name" />
<TextField label="Street Address" />
<TextField label="City" />
</Form>
</Content>
<Footer>
<Checkbox>
I want to receive updates for exclusive offers in my area.
</Checkbox>
</Footer>
<ButtonGroup>
<Button variant="secondary" onPress={close}>Cancel</Button>
<Button variant="accent" onPress={close}>Register</Button>
</ButtonGroup>
</Dialog>
)}
</DialogTrigger>
<DialogTrigger>
<ActionButton>Register</ActionButton>
{(close) => (
<Dialog>
<Heading>
<Flex alignItems="center" gap="size-100">
<Book size="S" />
<Text>
Register for newsletter
</Text>
</Flex>
</Heading>
<Header>
<Link>
<a href="//example.com" target="_blank">
What is this?
</a>
</Link>
</Header>
<Divider />
<Content>
<Form>
<TextField label="First Name" autoFocus />
<TextField label="Last Name" />
<TextField label="Street Address" />
<TextField label="City" />
</Form>
</Content>
<Footer>
<Checkbox>
I want to receive updates for exclusive offers
in my area.
</Checkbox>
</Footer>
<ButtonGroup>
<Button variant="secondary" onPress={close}>
Cancel
</Button>
<Button variant="accent" onPress={close}>
Register
</Button>
</ButtonGroup>
</Dialog>
)}
</DialogTrigger>
<DialogTrigger>
<ActionButton>
Register
</ActionButton>
{(close) => (
<Dialog>
<Heading>
<Flex
alignItems="center"
gap="size-100"
>
<Book size="S" />
<Text>
Register
for
newsletter
</Text>
</Flex>
<