{{-- 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