Skip to content

Modal

A modal dialog component powered by Alpine.js transitions.

Alpine.js Required

This component requires Alpine.js to be loaded in your layout for modal interactions and animations. See the installation guide for setup instructions.

Basic Usage

blade
<x-basekit-ui::modal title="Confirm Action" :is-open="true">
    <p>Are you sure you want to proceed?</p>

    <x-slot:footer>
        <x-basekit-ui::button variant="ghost">Cancel</x-basekit-ui::button>
        <x-basekit-ui::button variant="primary">Confirm</x-basekit-ui::button>
    </x-slot>
</x-basekit-ui::modal>

Opening Modal from a Button

To control the modal from outside (e.g., from a button), use the show prop to bind to an external Alpine.js variable:

blade
<div x-data="{ isModalOpen: false }">
    <x-basekit-ui::button @click="isModalOpen = true">
        Open Modal
    </x-basekit-ui::button>

    <x-basekit-ui::modal show="isModalOpen" title="Confirm Action">
        <p>Are you sure you want to proceed?</p>

        <x-slot:footer>
            <x-basekit-ui::button variant="ghost" @click="isModalOpen = false">
                Cancel
            </x-basekit-ui::button>
            <x-basekit-ui::button variant="primary" @click="isModalOpen = false">
                Confirm
            </x-basekit-ui::button>
        </x-slot:footer>
    </x-basekit-ui::modal>
</div>

Props

PropTypeDefaultDescription
sizestringconfig default (md)Modal size (sm,md,lg,xl,full)
titlestring|nullnullModal title text
isCloseOnBackdropbooltrueClose on backdrop click
isCloseButtonbooltrueShow header close button
isOpenboolfalseInitial open state for internally controlled modal state
showstring|nullnullExternal Alpine.js variable name to bind to (e.g., isModalOpen)

Use isOpen for a self-contained modal, or show when controlling visibility from a parent Alpine.js scope.

Slots

SlotDescription
defaultModal body content
footerFooter actions area

Sizes

Supported sizes: sm, md, lg, xl, full.

blade
<x-basekit-ui::modal :is-open="true" size="sm" title="Small Modal">Content</x-basekit-ui::modal>

Without Close Button

blade
<x-basekit-ui::modal :is-open="true" title="Action Required" :is-close-button="false">
    <p>You must choose one of the available actions before continuing.</p>

    <x-slot:footer>
        <x-basekit-ui::button variant="ghost" @click="open = false">Cancel</x-basekit-ui::button>
        <x-basekit-ui::button variant="primary" @click="open = false">Continue</x-basekit-ui::button>
    </x-slot:footer>
</x-basekit-ui::modal>

Without Backdrop Close

blade
<x-basekit-ui::modal :is-open="true" title="Important Form" :is-close-on-backdrop="false">
    <p>This modal can only be closed using explicit actions.</p>

    <x-slot:footer>
        <x-basekit-ui::button variant="primary" @click="open = false">Close</x-basekit-ui::button>
    </x-slot:footer>
</x-basekit-ui::modal>

Custom Classes

Override or extend styles with the class attribute:

blade
<x-basekit-ui::modal :is-open="true" title="Custom Modal" class="w-1/2">
    <p>This is a custom modal component. You can customize its content and appearance as needed.</p>
</x-basekit-ui::modal>

CSS Variables

Customize modal appearance via CSS variables:

css
:root {
  --modal-z-index: 50;
  --modal-overlay-bg: rgba(0, 0, 0, 0.5);
  --modal-bg: var(--surface-base);
  --modal-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1);
  --modal-radius: var(--radius-lg);
  --modal-header-border: var(--color-slate-200);
  --modal-footer-border: var(--color-slate-200);
  --modal-close-color: var(--color-slate-400);
  --modal-close-hover-bg: var(--color-slate-100);
  --modal-close-hover-color: var(--color-slate-600);
  --modal-size-sm: 24rem;
  --modal-size-md: 32rem;
  --modal-size-lg: 42rem;
  --modal-size-xl: 56rem;
  --modal-size-full: 90vw;
  --modal-height-full: 90vh;
}

Configuration

Configure defaults in config/basekit-laravel-ui.php:

php
'modal' => [
    'enabled' => true,
    'sizes' => ['sm', 'md', 'lg', 'xl', 'full'],
    'default_size' => 'md',
],

Released under the MIT License.