@props([
'variant' => 'primary', // primary | secondary | ghost | danger | success
'size' => 'md', // sm | md | lg
'href' => null,
'type' => 'button',
'icon' => false, // square icon-only button
])
@php
$base = 'relative inline-flex items-center justify-center gap-2 font-medium '
.'rounded-lg border transition-all duration-200 ease-out '
.'disabled:opacity-50 disabled:pointer-events-none '
.'aria-disabled:opacity-50 aria-disabled:pointer-events-none '
.'active:translate-y-px whitespace-nowrap';
$variants = [
'primary' => 'bg-electric-500 border-electric-400 text-white '
.'hover:bg-electric-400 hover:shadow-glow-sm hover:border-electric-300',
'secondary' => 'bg-raised border-line-strong text-silver-100 '
.'hover:bg-surface hover:border-electric-600',
'ghost' => 'bg-transparent border-transparent text-silver-300 '
.'hover:text-silver-100 hover:bg-raised',
'danger' => 'bg-danger/10 border-danger/40 text-danger '
.'hover:bg-danger hover:text-white hover:border-danger',
'success' => 'bg-success/10 border-success/40 text-success '
.'hover:bg-success hover:text-white hover:border-success',
];
$sizes = $icon
? ['sm' => 'h-8 w-8', 'md' => 'h-10 w-10', 'lg' => 'h-12 w-12']
: ['sm' => 'h-8 px-3 text-xs', 'md' => 'h-10 px-4 text-sm', 'lg' => 'h-12 px-6 text-base'];
$classes = implode(' ', [
$base,
$variants[$variant] ?? $variants['primary'],
$sizes[$size] ?? $sizes['md'],
]);
@endphp
@if ($href)
merge(['class' => $classes]) }}>
{{ $slot }}
@else
@endif