Modal

v1.0.0

Focused content or actions in a modal dialog.

Dialogs can be modal or non-modal; .modal uses the modal form.

Default

Apply .modal to native dialog. The static preview needs no script; applications use the native dialog API.

<button class="btn btn-primary btn-solid" type="button" data-modal-target="#defaultModal">
	Open modal
</button>

<dialog class="modal" id="defaultModal" aria-labelledby="defaultModalTitle">
	<div class="modal-content">
		<div class="modal-header">
			<h3 class="modal-title" id="defaultModalTitle">Modal title</h3>
			<button
				class="modal-close icon-btn icon-btn-text"
				type="button"
				data-modal-close
				aria-label="Close modal">
				×
			</button>
		</div>

		<div class="modal-body">
			<p class="mb-0">This is a native dialog styled as a modal.</p>
		</div>

		<div class="modal-footer">
			<button class="btn btn-secondary btn-text" type="button" data-modal-close>
				Cancel
			</button>
			<button class="btn btn-primary btn-solid" type="button">Confirm</button>
		</div>
	</div>
</dialog>

Simple modal

Omit footer actions when unnecessary.

<dialog class="modal" id="simpleModal" aria-labelledby="simpleModalTitle">
	<div class="modal-content">
		<div class="modal-header">
			<h3 class="modal-title" id="simpleModalTitle">Simple modal</h3>
			<button
				class="modal-close icon-btn icon-btn-text"
				type="button"
				data-modal-close
				aria-label="Close modal">
				×
			</button>
		</div>

		<div class="modal-body">
			<p class="mb-0">This modal only contains a header and body.</p>
		</div>
	</div>
</dialog>

Long content

Long modal bodies scroll within the viewport.

<dialog class="modal" id="longContentModal" aria-labelledby="longContentModalTitle">
	<div class="modal-content">
		<div class="modal-header">
			<h3 class="modal-title" id="longContentModalTitle">Long content</h3>
			<button
				class="modal-close icon-btn icon-btn-text"
				type="button"
				data-modal-close
				aria-label="Close modal">
				×
			</button>
		</div>

		<div class="modal-body">
			<p>Long content...</p>
		</div>

		<div class="modal-footer">
			<button class="btn btn-secondary btn-text" type="button" data-modal-close>Close</button>
		</div>
	</div>
</dialog>

Sizes

Use .modal-sm, .modal-lg or .modal-xl for width.

<dialog class="modal modal-sm" id="smallModal" aria-labelledby="smallModalTitle">
	<div class="modal-content">
		<div class="modal-header">
			<h3 class="modal-title" id="smallModalTitle">Small modal</h3>
			<!-- Close button -->
		</div>
		<!-- Modal body -->
	</div>
</dialog>

<dialog class="modal modal-lg" id="largeModal" aria-labelledby="largeModalTitle">
	<div class="modal-content">
		<div class="modal-header">
			<h3 class="modal-title" id="largeModalTitle">Large modal</h3>
			<!-- Close button -->
		</div>
		<!-- Modal body -->
	</div>
</dialog>

<dialog class="modal modal-xl" id="extraLargeModal" aria-labelledby="extraLargeModalTitle">
	<div class="modal-content">
		<div class="modal-header">
			<h3 class="modal-title" id="extraLargeModalTitle">Extra large modal</h3>
			<!-- Close button -->
		</div>
		<!-- Modal body -->
	</div>
</dialog>

Behavior

The package ships styles only. Applications call showModal() and close() and manage triggers and dismissal; previews are static.

CSS Variables

Override these variables on the component or an ancestor.

--modal-width: min(32rem, calc(100vw - var(--spacer-4)));
--modal-max-height: calc(100dvh - var(--spacer-4));
--modal-bg-color: var(--bg-surface);
--modal-color: var(--text-color);
--modal-border-width: var(--border-width);
--modal-border-color: var(--border-color);
--modal-border-radius: var(--border-radius);
--modal-header-border-color: var(--modal-border-color);
--modal-footer-border-color: var(--modal-border-color);
--modal-box-shadow: var(--shadow-lg);
--modal-header-padding: var(--spacer-3);
--modal-body-padding: var(--spacer-3);
--modal-footer-padding: var(--spacer-3);
--modal-backdrop-bg-color: rgb(from var(--gray-800) r g b / 0.7);