Installation:
composer require sobitnl/livewire-modal-sheet
Add Livewire Directive:
Place @livewire('livewire-modal-sheet') in your layout file (typically before </body>). This initializes the modal manager.
First Modal Usage:
use Sobitnl\LivewireModalSheet\LivewireModalSheet;
// In your Livewire component
public function openModal()
{
LivewireModalSheet::open('modal-name', 'ModalComponent', [
'data' => 'passed_to_modal',
]);
}
<!-- In your Blade view -->
<button wire:click="openModal">Open Modal</button>
Define Modal Component:
Create a Livewire component (e.g., ModalComponent) and register it in LivewireModalSheet::register() if needed.
// In your Livewire component
public function showUserProfile($userId)
{
LivewireModalSheet::open('user-profile', 'UserProfileModal', [
'userId' => $userId,
]);
}
<!-- Blade -->
<button wire:click="showUserProfile(1)">View Profile</button>
Nested Modals:
Open modals from within other modals by reusing LivewireModalSheet::open().
// Inside a modal component
public function openChildModal()
{
LivewireModalSheet::open('child-modal', 'ChildModalComponent');
}
Passing Data: Use arrays or objects to pass data between parent and child modals.
LivewireModalSheet::open('modal', 'ModalComponent', [
'config' => ['key' => 'value'],
'user' => $user,
]);
Closing Modals:
// Close current modal
LivewireModalSheet::close();
// Close specific modal
LivewireModalSheet::close('modal-name');
Event Handling: Listen for modal events in your Livewire components:
protected $listeners = ['modalOpened' => 'handleModalOpened'];
public function handleModalOpened($event)
{
if ($event['name'] === 'modal-name') {
// Handle modal open logic
}
}
Dynamic Registration:
Register modals dynamically (e.g., in boot()):
public function boot()
{
LivewireModalSheet::register('dynamic-modal', 'DynamicModalComponent');
}
Modal Configuration:
Override default settings (e.g., size, backdrop) via LivewireModalSheet::config():
LivewireModalSheet::config([
'defaultSize' => 'lg',
'backdrop' => true,
]);
LivewireModalSheet::open('step-1', 'StepOneModal');
StepOneModal, open next modal with updated data.
public function proceedToStepTwo($data)
{
LivewireModalSheet::open('step-2', 'StepTwoModal', ['data' => $data]);
LivewireModalSheet::close('step-1'); // Close previous modal
}
Modal Stacking:
LivewireModalSheet::close() when navigating between modals or completing actions.LivewireModalSheet::closeAll() to reset the stack.State Persistence:
$persistent property in LivewireModalSheet::open():
LivewireModalSheet::open('modal', 'ModalComponent', [], ['persistent' => true]);
Tailwind Conflicts:
safelist: [
'modal-backdrop', 'modal-content', 'modal-header', // etc.
]
Modal Not Showing:
@livewire('livewire-modal-sheet') is included in the layout.Console Errors:
State Not Updating:
Custom Animations: Override default animations by extending the package’s Blade views or using custom CSS:
<!-- In your modal component -->
<div x-data="{ open: true }" x-show="open" @click.away="open = false">
<!-- Modal content -->
</div>
Global Configuration:
Set defaults in AppServiceProvider:
public function boot()
{
LivewireModalSheet::config([
'backdrop' => false,
'defaultSize' => 'md',
]);
}
Accessing Modal Data:
Retrieve modal data in parent components via LivewireModalSheet::getModalData('modal-name').
Reusable Modal Components:
Create base modal components with shared logic (e.g., BaseModalComponent) and extend them for specific use cases.
Modal Events:
Leverage modalOpened, modalClosed, and modalUpdated events for cross-component communication:
protected $listeners = [
'modalOpened' => 'syncModalState',
];
Performance:
For heavy modals, use wire:ignore to prevent unnecessary re-renders:
<div wire:ignore>
@livewire('HeavyModalComponent')
</div>
How can I help you explore Laravel packages today?