Modal

A centered overlay dialog. Built on Radix Dialog with focus trap, escape-to-close, and backdrop click.

Import

import {
  Modal,
  ModalTrigger,
  ModalContent,
  ModalHeader,
  ModalTitle,
  ModalDescription,
  ModalBody,
  ModalFooter,
  ModalClose,
} from '@aspect/react';

Usage

<Modal>
  <ModalTrigger asChild>
    <Button>Open</Button>
  </ModalTrigger>
  <ModalContent>
    <ModalHeader>
      <ModalTitle>Confirm action</ModalTitle>
      <ModalDescription>This cannot be undone.</ModalDescription>
    </ModalHeader>
    <ModalBody>
      <p>Are you sure?</p>
    </ModalBody>
    <ModalFooter>
      <ModalClose asChild>
        <Button variant="ghost">Cancel</Button>
      </ModalClose>
      <Button variant="destructive">Delete</Button>
    </ModalFooter>
  </ModalContent>
</Modal>

Compound components

| Part | Purpose | | ------------------ | -------------------------------- | | Modal | Root — manages open/close state | | ModalTrigger | Opens the dialog when clicked | | ModalContent | The overlay + dialog container | | ModalHeader | Title area with bottom border | | ModalTitle | Heading with aria-labelledby | | ModalDescription | Subtitle with aria-describedby | | ModalBody | Scrollable content area | | ModalFooter | Action buttons area | | ModalClose | Closes the dialog |

Controlled usage

const [open, setOpen] = React.useState(false);

<Modal open={open} onOpenChange={setOpen}>
  <ModalContent>...</ModalContent>
</Modal>;

Guidelines

Do:

Don't:

Accessibility