<!-- Dialog -->
<dialog
data-dialog
class="rounded-container bg-surface-100-900 text-inherit max-w-[640px] top-1/2 left-1/2 -translate-1/2 p-4 space-y-4 z-10 backdrop:bg-surface-50/75 dark:backdrop:bg-surface-950/75"
>
<h2 class="h3">Hello world!</h2>
<p>This is an example popover created using the native Dialog element.</p>
<form method="dialog" class="flex justify-end">
<button type="button" class="btn preset-tonal" data-dialog-close>Close</button>
</form>
</dialog>
<!-- Interface -->
<div class="flex justify-center items-center">
<!-- Trigger -->
<button class="btn preset-filled" data-dialog-show>Open Modal</button>
</div>
<script>
// DOM Element References
const elemModal: HTMLDialogElement | null = document.querySelector('[data-dialog]');
const elemTrigger: HTMLButtonElement | null = document.querySelector('[data-dialog-show]');
const elemClose: HTMLButtonElement | null = document.querySelector('[data-dialog-close]');
// Button Click Handlers
elemTrigger?.addEventListener('click', () => elemModal?.showModal());
elemClose?.addEventListener('click', () => elemModal?.close());
</script>
<style>
/* NOTE: add the following styles to your global stylesheet. */
dialog,
dialog::backdrop {
--anim-duration: 250ms;
transition:
display var(--anim-duration) allow-discrete,
overlay var(--anim-duration) allow-discrete,
opacity var(--anim-duration);
opacity: 0;
}
/* Animate In */
dialog[open],
dialog[open]::backdrop {
opacity: 1;
}
/* Animate Out */
@starting-style {
dialog[open],
dialog[open]::backdrop {
opacity: 0;
}
}
</style>