@props([ 'alert' => false, 'alignment' => null, 'ariaLabelledby' => null, 'autofocus' => null, 'clickThrough' => false, 'closeButton' => null, 'closeByClickingAway' => null, 'closeByEscaping' => null, 'closeEventName' => 'close-modal', 'closeQuietlyEventName' => 'close-modal-quietly', 'description' => null, 'restoresFocus' => true, 'extraModalWindowAttributeBag' => null, 'extraModalOverlayAttributeBag' => null, 'footer' => null, 'footerActions' => [], 'footerActionsAlignment' => null, 'header' => null, 'heading' => null, 'icon' => null, 'iconAlias' => null, 'iconColor' => 'primary', 'id' => null, 'openEventName' => 'open-modal', 'slideOver' => false, 'slideOverPosition' => null, 'stickyFooter' => false, 'stickyHeader' => false, 'teleport' => null, 'trigger' => null, 'visible' => true, 'width' => 'sm', ]) @php use Filament\Support\Enums\Alignment; use Filament\Support\Enums\IconSize; use Filament\Support\Enums\SlideOverPosition; use Filament\Support\Enums\Width; use Filament\Support\Icons\Heroicon; use Filament\Support\View\ComponentAttributeBag as FilamentComponentAttributeBag; use Filament\Support\View\Components\ModalComponent; use Filament\Support\View\Components\ModalComponent\IconComponent; use Filament\Support\View\SupportIconAlias; use Illuminate\Contracts\Support\Htmlable; use Illuminate\Support\Js; $alignment ??= Alignment::Start; $autofocus ??= ModalComponent::$isAutofocused; $closeButton ??= ModalComponent::$hasCloseButton; $closeByClickingAway ??= ModalComponent::$isClosedByClickingAway; $closeByEscaping ??= ModalComponent::$isClosedByEscaping; $footerActionsAlignment ??= Alignment::Start; $slideOverPosition ??= SlideOverPosition::End; $hasContent = ! \Filament\Support\is_slot_empty($slot); $hasDescription = filled($description); $hasFooter = (! \Filament\Support\is_slot_empty($footer)) || (is_array($footerActions) && count($footerActions)) || (! is_array($footerActions) && (! \Filament\Support\is_slot_empty($footerActions))); $hasHeading = filled($heading); $iconHtml = ($icon || $iconAlias) ? \Filament\Support\generate_icon_html($icon, $iconAlias, size: IconSize::Large) : null; $hasIcon = $iconHtml !== null; $headingId = filled($id) ? "{$id}.heading" : null; // The description is only rendered when the built-in heading is, so the // `aria-describedby` reference must be gated to the same conditions. $descriptionId = ($hasDescription && $hasHeading && (! $header) && filled($id)) ? "{$id}.description" : null; if (! $alignment instanceof Alignment) { $alignment = filled($alignment) ? (Alignment::tryFrom($alignment) ?? $alignment) : null; } if (! $footerActionsAlignment instanceof Alignment) { $footerActionsAlignment = filled($footerActionsAlignment) ? (Alignment::tryFrom($footerActionsAlignment) ?? $footerActionsAlignment) : null; } if (is_string($width)) { $width = Width::tryFrom($width) ?? $width; } $closeEventHandler = filled($id) ? '$dispatch(' . Js::from($closeEventName) . ', { id: ' . Js::from($id) . ' })' : 'close()'; $wireSubmitHandler = $attributes->get('wire:submit.prevent'); $attributes = $attributes->except(['wire:submit.prevent']); $isClickThrough = (bool) $clickThrough; // Click-through and closing by clicking away are incompatible, so enabling // click-through silently disables closing the modal by clicking away. if ($isClickThrough) { $closeByClickingAway = false; } // When `Escape` does not close the modal, the close button stays in the tab order as the only keyboard way to dismiss it, so the window takes the focus trap's `[autofocus]` to stop the button from being autofocused when the modal opens. $isModalWindowAutofocusedByDefault = $closeButton && (! $closeByEscaping) && ($heading || $header); $modalWindowAttributeBag = ($extraModalWindowAttributeBag ?? new FilamentComponentAttributeBag)->merge([ 'autofocus' => $isModalWindowAutofocusedByDefault, ]); $shouldTrapFocusOnModalWindow = (! $isClickThrough) && ($slideOver || (($width !== Width::Screen) && ($stickyHeader || $stickyFooter))) && in_array($modalWindowAttributeBag->get('autofocus'), [false, null], true) && (! $modalWindowAttributeBag->has('tabindex')); $modalWindowAttributeBag = $modalWindowAttributeBag->merge([ 'tabindex' => $shouldTrapFocusOnModalWindow ? '0' : ($isModalWindowAutofocusedByDefault ? '-1' : null), ]); @endphp @if ($trigger) {!! '
{{ $description }}
@endif