Dialog
BetaModal overlay container with header, body, and footer composition slots.
Installation
npm install @xaui/native
Import
import { Dialog, DialogHeader, DialogBody, DialogFooter } from '@xaui/native/dialog'
Basic Usage
Minimal example showing the component with its default configuration.
import { Dialog } from '@xaui/native/dialog'export function Example() {return <Dialog />}
Basic Dialog
Open and close a modal with header, body, and footer actions.
import { useState } from 'react'import { Dialog, DialogBody, DialogFooter, DialogHeader } from '@xaui/native/dialog'import { Button } from '@xaui/native/button'import { Column } from '@xaui/native/view'export function BasicDialogExample() {const [isOpen, setIsOpen] = useState(false)return (<Column gap={10}><Button onPress={() => setIsOpen(true)}>Open dialog</Button><Dialog isOpen={isOpen} onClose={() => setIsOpen(false)}><DialogHeader isClosable>Delete item</DialogHeader><DialogBody>This action is permanent and cannot be undone.</DialogBody><DialogFooter><Button variant="flat" onPress={() => setIsOpen(false)}>Cancel</Button><Button themeColor="danger" onPress={() => setIsOpen(false)}>Delete</Button></DialogFooter></Dialog></Column>)}
Size and Placement
Control where the dialog appears and how wide it is.
import { useState } from 'react'import { Dialog, DialogBody, DialogFooter, DialogHeader } from '@xaui/native/dialog'import { Button } from '@xaui/native/button'import { Row } from '@xaui/native/view'export function DialogPlacementExample() {const [isOpen, setIsOpen] = useState(false)return (<><Row gap={8}><Button onPress={() => setIsOpen(true)}>Open bottom dialog</Button></Row><DialogisOpen={isOpen}onClose={() => setIsOpen(false)}placement="bottom"size="lg"backdrop="blurred"><DialogHeader isClosable>Session timeout</DialogHeader><DialogBody>Your session will expire in 2 minutes.</DialogBody><DialogFooter><Button onPress={() => setIsOpen(false)}>Extend session</Button></DialogFooter></Dialog></>)}
Controlled Open State
Use onOpenChange to sync dialog state with external state.
import { useState } from 'react'import { Dialog, DialogBody, DialogHeader } from '@xaui/native/dialog'import { Button } from '@xaui/native/button'import { Column } from '@xaui/native/view'export function ControlledDialogExample() {const [isOpen, setIsOpen] = useState(false)return (<Column gap={10}><Button onPress={() => setIsOpen(true)}>Open</Button><Dialog isOpen={isOpen} onOpenChange={setIsOpen} closeOnBackdropPress><DialogHeader isClosable>Dialog title</DialogHeader><DialogBody>Tap the close button or backdrop to trigger onOpenChange(false).</DialogBody></Dialog></Column>)}