{{--
Loading Button Component
------------------------
A button with built-in loading/spinner state. Prevents layout shift by
preserving the button's intrinsic width during the loading transition.
Usage:
Save Changes
Delete
Submit
Export CSV
Props:
type - HTML button type: button | submit | reset (default: "button")
variant - Visual style: primary | secondary | danger (default: "primary")
size - Button size: sm | md | lg (default: "md")
loading - Boolean, force loading state (default: false)
disabled - Boolean, disable the button (default: false)
loadingText - Text shown during loading (default: null, shows spinner only with original text)
--}}
@props([
'type' => 'button',
'variant' => 'primary',
'size' => 'md',
'loading' => false,
'disabled' => false,
'loadingText' => null,
])
@php
$variantClass = match($variant) {
'primary' => 'btn-primary',
'secondary' => 'btn-secondary',
'danger' => 'btn-danger',
default => 'btn-primary',
};
$sizeClass = match($size) {
'sm' => 'btn-sm',
'lg' => 'btn-lg',
default => '',
};
// Detect wire:target for automatic Livewire loading state
$wireTarget = $attributes->get('wire:target') ?? $attributes->get('wire:click');
@endphp