php artisan aura:add modal
Copies the component source into resources/views/components/aura/. Run php artisan aura:init first if you haven't already. See the CLI guide for all options.
composer require bluestarsystem/aura-ui
php artisan aura:install
Full installation instructions in the Installation guide.
Overview
The <x-aura::modal> component renders a dialog window that appears on top of the page content with a backdrop overlay. It supports named modals that can be opened and closed via Alpine.js $dispatch events or Livewire, configurable max width, glass morphism styling, and smooth enter/leave transitions. The modal is teleported to the document body to avoid z-index stacking issues.
Basic Usage
<x-aura::modal name="example">
<p>This is the modal content.</p>
</x-aura::modal>
<!-- Open the modal from anywhere -->
<x-aura::button x-on:click="$dispatch('open-modal', 'example')">
Open Modal
</x-aura::button><x-aura::modal name="example">
<p>This is the modal content.</p>
</x-aura::modal>
<!-- Open the modal from anywhere -->
<x-aura::button x-on:click="$dispatch('open-modal', 'example')">
Open Modal
</x-aura::button>
Props
| Prop | Type | Default | Description |
|---|---|---|---|
name |
string|null |
null |
Unique identifier for the modal. Used with dispatch events to open/close. |
maxWidth |
string |
'lg' |
Maximum width of the modal. Options: sm, md, lg, xl, 2xl, full. |
glass |
bool |
false |
Enable glass morphism styling on the modal panel. |
closeable |
bool |
true |
Whether the modal can be closed by clicking the backdrop or the close button. |
slideOver |
bool |
false |
Reserved for slide-over panel behavior. |
position |
string |
'right' |
Position for slide-over mode. |
Slots
| Slot | Description |
|---|---|
Default ($slot) |
The main body content of the modal. |
trigger |
Optional trigger element. Clicking it opens the modal without dispatch events. |
title |
When provided, renders a header bar with the title text and an optional close button. |
footer |
When provided, renders a footer section below the body, typically used for action buttons. |
Variants / Examples
Confirmation Modal
<x-aura::modal name="confirm-delete" maxWidth="sm">
<x-slot:title>Confirm Deletion</x-slot:title>
<p>Are you sure you want to delete this item? This action cannot be undone.</p>
<x-slot:footer>
<div class="flex justify-end gap-3">
<x-aura::button variant="ghost" x-on:click="$dispatch('close-modal', 'confirm-delete')">
Cancel
</x-aura::button>
<x-aura::button variant="danger" x-on:click="$dispatch('close-modal', 'confirm-delete')">
Delete
</x-aura::button>
</div>
</x-slot:footer>
</x-aura::modal>
<x-aura::button variant="danger" x-on:click="$dispatch('open-modal', 'confirm-delete')">
Delete Item
</x-aura::button><x-aura::modal name="confirm-delete" maxWidth="sm">
<x-slot:title>Confirm Deletion</x-slot:title>
<p>Are you sure you want to delete this item? This action cannot be undone.</p>
<x-slot:footer>
<div class="flex justify-end gap-3">
<x-aura::button variant="ghost" x-on:click="$dispatch('close-modal', 'confirm-delete')">
Cancel
</x-aura::button>
<x-aura::button variant="danger" wire:click="delete">
Delete
</x-aura::button>
</div>
</x-slot:footer>
</x-aura::modal>
<x-aura::button variant="danger" x-on:click="$dispatch('open-modal', 'confirm-delete')">
Delete Item
</x-aura::button>
Form Modal with Glass Effect
<x-aura::modal name="create-user" maxWidth="xl" :glass="true">
<x-slot:title>Create New User</x-slot:title>
<div class="space-y-4">
<x-aura::input label="Full Name" name="name" />
<x-aura::input label="Email" name="email" type="email" />
</div>
<x-slot:footer>
<div class="flex justify-end gap-3">
<x-aura::button variant="ghost" x-on:click="$dispatch('close-modal', 'create-user')">
Cancel
</x-aura::button>
<x-aura::button variant="primary">Save User</x-aura::button>
</div>
</x-slot:footer>
</x-aura::modal>
<x-aura::button variant="primary" x-on:click="$dispatch('open-modal', 'create-user')">
Create User (Glass)
</x-aura::button><x-aura::modal name="create-user" maxWidth="xl" :glass="true">
<x-slot:title>Create New User</x-slot:title>
<form wire:submit="save">
<div class="space-y-4">
<x-aura::input label="Full Name" wire:model="name" />
<x-aura::input label="Email" type="email" wire:model="email" />
<x-aura::select label="Role" wire:model="role" placeholder="Select a role">
<x-aura::select.option value="admin">Admin</x-aura::select.option>
<x-aura::select.option value="editor">Editor</x-aura::select.option>
</x-aura::select>
</div>
<x-slot:footer>
<div class="flex justify-end gap-3">
<x-aura::button variant="ghost" x-on:click="$dispatch('close-modal', 'create-user')">
Cancel
</x-aura::button>
<x-aura::button type="submit">Save User</x-aura::button>
</div>
</x-slot:footer>
</form>
</x-aura::modal>
Inline Trigger Modal
<x-aura::modal name="preview" maxWidth="2xl">
<x-slot:trigger>
<x-aura::button variant="outline">Preview Content</x-aura::button>
</x-slot:trigger>
<x-slot:title>Content Preview</x-slot:title>
<p>This modal was opened using the inline trigger slot. No dispatch event needed — just click the trigger button.</p>
</x-aura::modal><x-aura::modal name="preview" maxWidth="2xl">
<x-slot:trigger>
<x-aura::button variant="outline">Preview Image</x-aura::button>
</x-slot:trigger>
<x-slot:title>Image Preview</x-slot:title>
<img src="/img/docs/photo-placeholder.svg" alt="Preview" class="w-full rounded-lg" />
</x-aura::modal>
Non-Closeable Modal
<x-aura::modal name="terms" :closeable="false" maxWidth="md">
<x-slot:title>Terms of Service</x-slot:title>
<p>Please read and accept the terms of service to continue.</p>
<x-slot:footer>
<x-aura::button variant="primary" x-on:click="$dispatch('close-modal', 'terms')">
I Accept
</x-aura::button>
</x-slot:footer>
</x-aura::modal>
<x-aura::button variant="outline" x-on:click="$dispatch('open-modal', 'terms')">
Show Terms (Non-Closeable)
</x-aura::button><x-aura::modal name="terms" :closeable="false" maxWidth="md">
<x-slot:title>Terms of Service</x-slot:title>
<p>Please read and accept the terms of service to continue.</p>
<x-slot:footer>
<x-aura::button wire:click="acceptTerms">
I Accept
</x-aura::button>
</x-slot:footer>
</x-aura::modal>
Livewire Integration
{{-- In your Livewire component --}}
<x-aura::modal name="edit-record" maxWidth="lg">
<x-slot:title>Edit Record #{{ $recordId }}</x-slot:title>
<div class="space-y-4">
<x-aura::input label="Title" wire:model="title" />
<x-aura::textarea label="Description" wire:model="description" />
</div>
<x-slot:footer>
<div class="flex justify-end gap-3">
<x-aura::button variant="ghost" x-on:click="$dispatch('close-modal', 'edit-record')">
Cancel
</x-aura::button>
<x-aura::button wire:click="update">Save Changes</x-aura::button>
</div>
</x-slot:footer>
</x-aura::modal>
{{-- Open from Livewire method: $this->dispatch('open-modal', 'edit-record') --}}
Accessibility
- The modal overlay traps focus within the modal content by stopping click propagation (
x-on:click.stop). - Pressing the
Escapekey closes the modal whencloseableistrue. - The close button includes an
aria-labelattribute for screen readers. - The modal uses smooth CSS transitions for enter and leave states, respecting reduced-motion preferences via the Aura transition system.
- When
closeableisfalse, neither the backdrop click nor the Escape key will dismiss the modal, ensuring the user must interact with the modal content.