@props([ 'variant' => 'primary', 'size' => 'md', 'type' => 'button', 'href' => null, 'icon' => null, 'loading' => false, ]) @php $variantClasses = [ 'primary' => 'bg-primary-500 text-white hover:bg-primary-600 focus:ring-primary-500 active:bg-primary-700', 'secondary' => 'bg-slate-100 text-slate-700 hover:bg-slate-200 focus:ring-slate-400 active:bg-slate-300 dark:bg-slate-700 dark:text-slate-200 dark:hover:bg-slate-600', 'danger' => 'bg-rose-500 text-white hover:bg-rose-600 focus:ring-rose-500 active:bg-rose-700', 'ghost' => 'bg-transparent text-slate-600 hover:bg-slate-100 focus:ring-slate-400 dark:text-slate-300 dark:hover:bg-slate-700', 'success' => 'bg-emerald-500 text-white hover:bg-emerald-600 focus:ring-emerald-500 active:bg-emerald-700', ]; $sizeClasses = [ 'xs' => 'px-2.5 py-1.5 text-xs rounded-xl', 'sm' => 'px-3 py-2 text-sm rounded-full', 'md' => 'px-4 py-2.5 text-sm rounded-xl', 'lg' => 'px-5 py-3 text-base rounded-xl', ]; $classes = 'inline-flex items-center justify-center gap-2 font-medium transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-60'; $classes .= ' '.($variantClasses[$variant] ?? $variantClasses['primary']); $classes .= ' '.($sizeClasses[$size] ?? $sizeClasses['md']); $iconPaths = [ 'camera' => 'M4 7a2 2 0 012-2h2l1-1h6l1 1h2a2 2 0 012 2v10a2 2 0 01-2 2H6a2 2 0 01-2-2V7zm8 10a4 4 0 100-8 4 4 0 000 8z', 'plus' => 'M12 5v14m-7-7h14', 'check' => 'M5 13l4 4L19 7', 'trash' => 'M6 7h12M9 7V5h6v2m-7 4v6m4-6v6', 'arrow-right' => 'M5 12h14m-4-4l4 4-4 4', 'download' => 'M12 3v12m0 0l4-4m-4 4l-4-4M5 19h14', 'upload' => 'M12 21V9m0 0l4 4m-4-4l-4 4M5 5h14', 'sparkles' => 'M12 3l1.8 4.2L18 9l-4.2 1.8L12 15l-1.8-4.2L6 9l4.2-1.8L12 3z', ]; $iconPath = $icon ? ($iconPaths[$icon] ?? null) : null; @endphp @if ($href) except(['class'])->merge(['class' => $classes.($loading ? ' pointer-events-none' : '')]) }} @if($loading) aria-disabled="true" @endif > @if($loading) Loading... @else @if($iconPath) @endif {{ $slot }} @endif @else @endif