A lightweight, flexible modal library built on top of the native HTML <dialog> element. Part of the DNT WordPress theme.
- Native HTML Dialog — Built on the standard
<dialog>element for accessibility and semantic correctness - TypeScript Support — Fully typed with extensible interfaces
- Multiple Modal Types — Standard dialogs, offcanvas (left/right), bottom sheets, and fullscreen modals
- CSS Animations — Smooth transitions with
@starting-styleandallow-discretesupport - Event System — Custom events for show/shown/close/closed lifecycle
- Lightweight — Minimal JavaScript with no external dependencies
- Accessible — ARIA attributes and keyboard navigation support
npm install @midkard/modal<!-- Trigger button -->
<button data-dnt-control="#my-modal">Open Modal</button>
<!-- Modal dialog -->
<dialog id="my-modal" class="modal" aria-label="My Modal">
<article>
<p>Modal content goes here...</p>
</article>
<button data-dnt-dismiss="modal">Close</button>
</dialog>import '@midkard/modal';
import '@midkard/modal/style';<dialog class="modal" id="modal-standard">
<article>Content</article>
</dialog><dialog class="modal modal_start" id="menu-offcanvas">
<article>Menu content</article>
</dialog><dialog class="modal modal_end" id="sidebar">
<article>Sidebar content</article>
</dialog><dialog class="modal modal_bottom" id="bottom-sheet">
<article>Bottom content</article>
</dialog><dialog class="modal modal_fullscreen" id="modal-full">
<article>Fullscreen content</article>
</dialog>| Attribute | Description |
|---|---|
data-dnt-control |
Opens/toggles the target modal (value: CSS selector) |
data-dnt-dismiss |
Closes the modal when clicked |
data-dnt-backdrop |
Set to "false" to disable backdrop click-to-close |
| Event | Description |
|---|---|
modal.dnt.show |
Fired when modal starts opening |
modal.dnt.shown |
Fired when modal open animation completes |
modal.dnt.close |
Fired when modal starts closing |
modal.dnt.closed |
Fired when modal close animation completes |
const modal = document.querySelector('#my-modal');
modal.addEventListener('modal.dnt.show', (e) => {
console.log('Modal is opening');
});
modal.addEventListener('modal.dnt.shown', (e) => {
console.log('Modal is now visible');
});import { dntModals } from '@midkard/modal';
const modal = dntModals.getOrCreateInstance(document.querySelector('#my-modal'));
// Show modal
modal.show();
// Hide modal
modal.hide();
// Toggle modal
modal.toggle();
// Destroy instance
modal.destroy();Customize the modal appearance using CSS variables:
.modal {
--duration: 0.15s; /* Animation duration */
--padding-y: 1rem; /* Horizontal padding */
--border-raius: 0.5rem; /* Border radius */
--color: inherit; /* Text color */
--bg: white; /* Background color */
}# Install dependencies
npm install
# Start development server
npm run dev
# Build library
npm run build
# Run linter
npm run lint
# Format code
npm run formatRequires browsers that support:
- HTML
<dialog>element - CSS
@starting-styleat-rule - CSS
allow-discretekeyword
MIT © Dimenius Novus