Modal

An animated dialog built on Radix UI Dialog. Closes on ESC and overlay click.

Import

tsx
import { Modal } from 'fxui-core';

Usage

tsx
<Modal>
  <Modal.Trigger>
    <Button>Open Modal</Button>
  </Modal.Trigger>
  <Modal.Content>
    <Modal.Header>Title</Modal.Header>
    <Modal.Body>Content goes here.</Modal.Body>
    <Modal.Footer>
      <Button>Confirm</Button>
    </Modal.Footer>
  </Modal.Content>
</Modal>

Sizes

tsx
<Modal.Content size="sm">...</Modal.Content>
<Modal.Content size="md">...</Modal.Content>  {/* default */}
<Modal.Content size="lg">...</Modal.Content>
<Modal.Content size="full">...</Modal.Content>

Controlled

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

<Modal open={open} onOpenChange={setOpen}>
  <Modal.Trigger>
    <Button onClick={() => setOpen(true)}>Open</Button>
  </Modal.Trigger>
  <Modal.Content>
    <Modal.Header>Controlled Modal</Modal.Header>
    <Modal.Body>...</Modal.Body>
    <Modal.Footer>
      <Button onClick={() => setOpen(false)}>Close</Button>
    </Modal.Footer>
  </Modal.Content>
</Modal>

Destructive Confirm

tsx
<Modal>
  <Modal.Trigger>
    <Button variant="destructive">Delete</Button>
  </Modal.Trigger>
  <Modal.Content size="sm">
    <Modal.Header>Confirm Delete</Modal.Header>
    <Modal.Body>This action cannot be undone.</Modal.Body>
    <Modal.Footer>
      <Button variant="outline">Cancel</Button>
      <Button variant="destructive">Delete</Button>
    </Modal.Footer>
  </Modal.Content>
</Modal>

API Reference

Modal

| Prop | Type | Default | Description | |------|------|---------|-------------| | open | boolean | — | Controlled open state | | onOpenChange | (open: boolean) => void | — | Called when open state changes |

Modal.Content

| Prop | Type | Default | Description | |------|------|---------|-------------| | size | 'sm' \| 'md' \| 'lg' \| 'full' | 'md' | Max width of the dialog | | className | string | — | Additional Tailwind classes |

Modal.Trigger, Modal.Header, Modal.Body, Modal.Footer extend their respective HTML element attributes.