Modal
Stable
A centered overlay dialog for collecting form input or displaying contextual information. Built on the native HTML5 <dialog> element with DaisyUI styling. For destructive confirmations, use Alert Dialog instead.
API Reference
c-modal
| Attribute | Description | Type | Default |
|---|---|---|---|
id
|
Required for JS control via showModal(). Auto-generated when omitted.
|
string |
—
|
dismissible
|
Adds an ✕ close button and allows clicking the backdrop to close | boolean |
False
|
position
|
Vertical placement on screen. Use top for search dialogs and command palettes
|
string |
"center"
|
size
|
Maximum width of the modal box | string |
"md"
|
label
|
Accessible label for the dialog. Sets aria-labelledby on the <dialog> element (rendered as a visually-hidden heading).
|
string |
""
|
hx
|
Raw HTMX attributes passed to the dialog element | string |
""
|
Sub-components
| Component | Description | Key Props |
|---|---|---|
c-modal.header
|
Title row with optional description. Renders a bottom border to separate header from body. |
description
|
c-modal.action
|
Footer row for action buttons. Flex, end-aligned, with a top border separator. | — |
size
xs
sm
md
lg
xl
position
center
top
Accessibility
Native dialog: built on <dialog>, which provides native
focus trapping, Escape key to close, and proper role="dialog" announcement to
screen readers.
Focus management: showModal() automatically moves focus into
the dialog and returns it to the trigger element when the dialog closes.
Dismissible: always pair the backdrop click-to-close with a visible Cancel/Close button so keyboard users can also exit the dialog.
position="top": best for search dialogs and command palettes — avoids the layout jump that centered dialogs produce when their content height changes.
Examples
Usage
<c-button color="primary" onclick="my_modal.showModal()">Open</c-button>
<c-modal id="my_modal" dismissible>
<c-modal.header description="Optional subtitle text.">Modal Title</c-modal.header>
<!-- body content -->
<c-modal.action>
<form method="dialog"><c-button variant="outline">Cancel</c-button></form>
<c-button color="primary">Save</c-button>
</c-modal.action>
</c-modal>
Edit Profile
<c-button color="primary" onclick="edit_profile_modal.showModal()">Edit Profile</c-button>
<c-modal id="edit_profile_modal" dismissible size="sm">
<c-modal.header description="Make changes to your profile here. Click save when you're done.">
Edit Profile
</c-modal.header>
<div class="space-y-4">
<c-input label="Name" placeholder="Pedro Duarte" />
<c-input label="Username" placeholder="@peduarte" />
</div>
<c-modal.action>
<form method="dialog"><c-button variant="outline">Cancel</c-button></form>
<c-button color="primary">Save Changes</c-button>
</c-modal.action>
</c-modal>
Form — Invite Team Member
<c-modal id="invite_modal" dismissible size="sm">
<c-modal.header description="Send an invitation to a new team member.">
Invite Team Member
</c-modal.header>
<div class="space-y-4">
<c-input label="Email address" type="email" placeholder="name@company.com" />
<c-select label="Role">
<option value="viewer">Viewer</option>
<option value="editor">Editor</option>
</c-select>
</div>
<c-modal.action>
<form method="dialog"><c-button variant="outline">Cancel</c-button></form>
<c-button color="secondary">Send Invitation</c-button>
</c-modal.action>
</c-modal>
Retrieval — View Details
<c-modal id="vessel_detail_modal" dismissible size="sm">
<c-modal.header description="Read-only vessel record from the fleet registry.">
MV Atlantic Star
</c-modal.header>
<dl class="space-y-3 text-sm">
<div class="flex justify-between gap-4">
<dt class="text-base-content/60 shrink-0">IMO Number</dt>
<dd class="font-mono font-medium">9 123 456</dd>
</div>
<!-- more rows -->
</dl>
<c-modal.action>
<form method="dialog"><c-button variant="outline">Close</c-button></form>
<c-button color="primary">Edit Record</c-button>
</c-modal.action>
</c-modal>
Sizes
<c-modal id="my_modal" size="xs">...</c-modal>
<c-modal id="my_modal" size="sm">...</c-modal>
<c-modal id="my_modal" size="md">...</c-modal>
<c-modal id="my_modal" size="lg">...</c-modal>
<c-modal id="my_modal" size="xl">...</c-modal>
Positioning
<!-- Center (default) -->
<c-modal id="my_modal" position="center">...</c-modal>
<!-- Top — for search dialogs and command palettes -->
<c-modal id="my_modal" position="top">...</c-modal>