Native <dialog>, not a div pretending to be one.
Dialog & Sheet v1 — packages/design-system/src/components/dialog.css.
showModal() gives focus trapping, Escape-to-dismiss and a
::backdrop for free — the canonical CSS only draws the surface;
every demo below calls the native API directly.
.iz-dialog on a native <dialog>..iz-dialog__header / __body / __footer — all optional, use only what the content needs.data-variant="sheet" — pinned to the inline-end edge. The default is narrow; data-size="large" uses about 80% of the desktop viewport. Both sizes fill the available width on small screens.Header, body, footer — all optional.
A destructive action, named plainly.
Nothing structurally different from a basic dialog — the distinction is entirely in
content and using data-variant="destructive" on the confirming button,
the same Destructive role documented on Buttons.
The body scrolls. The header and footer stay put.
Directional, with two sizes.
Same <dialog> foundation, data-variant="sheet".
The default is a narrow detail panel. Choose data-size="large" for an
approximately 80%-wide desktop workspace. Both sizes fill the available width on
small screens and collapse to a bottom sheet.
What native <dialog> already gives you.
showModal(); returns to the triggering element automatically on close — no manual focus management.cancel event. Listen for cancel if you need to intercept it (see below).data-dialog-close inside the dialog calls .close() — see the tiny controller in site.js.::backdrop does nothing by default. Wire a click listener on the dialog element that checks event.target === dialog if backdrop-dismiss is wanted for a given dialog.cancel event and call event.preventDefault() when there's unsaved work, then show your own "discard changes?" confirmation instead of dismissing silently.Dialog and ConfirmDialog from @irozon/design-system-react.
Dialog (plus DialogHeader/DialogBody/
DialogFooter) is a controlled wrapper over the native element above —
pass open and it calls showModal()/close()
for you, and calls onClose for both an explicit close and native
dismissal (Escape). ConfirmDialog composes it for the common
"are you sure?" case.
For a Sheet, pass variant="sheet". Add size="large" for
the 80%-wide desktop layout; omitting size keeps the narrow default.
import { ConfirmDialog } from "@irozon/design-system-react";
<ConfirmDialog
open={confirmOpen}
title="Delete invoice?"
description="This cannot be undone."
onConfirm={handleDelete}
onCancel={() => setConfirmOpen(false)}
/>