# Dialog
> Modal window for confirmations and focused tasks.
Import from `@aspyn-io/kit`. Scaffold source: `npx shadcn@latest add https://design.aspyn.io/r/dialog.json`
## Install
```tsx
import {
Dialog,
DialogTrigger,
DialogContent,
DialogHeader,
DialogTitle,
DialogDescription,
DialogFooter,
DialogClose,
} from "@aspyn-io/kit";
```
### Destructive confirmation
The standard confirm pattern for irreversible actions.
```tsx
```
### Scrollable body
Long content? Wrap the middle in an overflow container so the header and footer stay pinned while it scrolls.
```tsx
Terms of serviceUpdated August 2026.
{/* any amount of content: scrolls between pinned header/footer */}
```
### Form in a dialog
```tsx
```
### Custom close button
Hide the built-in corner X with showCloseButton={false} and provide your own DialogClose.
```tsx
Invite teammatesSend an invite to join this workspace.
```
### No close button
Force an explicit choice: hide the corner X so Escape/overlay still close, but the primary path is a footer action.
```tsx
Session expiredSign in again to continue.
```
## Notes
- Focus is trapped inside the dialog and returned to the trigger on close (Radix).
- Escape and clicking the overlay close it; DialogTitle is required for accessible naming.
- For controlled dialogs (e.g. close after async save), use open + onOpenChange.