WIP: added button component

add tests
This commit is contained in:
Pedro Cabral
2026-04-21 14:33:46 +02:00
parent 5ae25db82f
commit 9e9f05abdf
3 changed files with 80 additions and 18 deletions

View File

@@ -0,0 +1,58 @@
<?php
namespace App\View\Components;
use Closure;
use Illuminate\Contracts\View\View;
use Illuminate\View\Component;
class Button extends Component
{
public function __construct(public string $variant = 'primary', public bool $disabled = false)
{
//
}
public function classes(): string
{
$base = 'inline-flex items-center justify-center px-4 py-2 rounded-md text-sm font-medium transition ' .
'duration-150 ease-in-out';
$classes = match ($this->variant) {
'secondary' => [
'base' => 'bg-secondary text-text',
'hover' => 'hover:bg-secondary-dark',
'disabled' => 'disabled:bg-secondary',
],
'outline' => [
'base' => 'bg-outline border border-primary text-primary',
'hover' => 'hover:bg-primary hover:text-text-inverted',
'disabled' => 'disabled:bg-outline disabled:text-primary',
],
default => [
'base' => 'bg-primary text-text-inverted',
'hover' => 'hover:bg-primary-dark',
'disabled' => 'disabled:bg-primary'
]
};
$baseDisabled = 'disabled:cursor-not-allowed disabled:opacity-60';
return trim(
$base . ' ' .
$classes['base'] . ' ' .
$classes['hover'] . ' ' .
$baseDisabled . ' ' .
$classes['disabled']
);
}
/**
* Get the view / contents that represent the component.
*/
public function render(): View|Closure|string
{
return view('components.button');
}
}

View File

@@ -0,0 +1,8 @@
<button
{{ $attributes
->merge(['class' => $classes()])
->merge(['disabled' => $disabled])
}}
>
{{ $slot }}
</button>

View File

@@ -27,33 +27,29 @@
<h3 class="text-l font-semibold">Enabled</h3> <h3 class="text-l font-semibold">Enabled</h3>
<div class="flex gap-4"> <div class="flex gap-4">
<button class="bg-primary text-text-inverted px-4 py-2 rounded"> <x-button>Default</x-button>
Primary
</button>
<button class="bg-secondary text-black px-4 py-2 rounded"> <x-button variant="primary">Primary</x-button>
Secondary
</button>
<button class="border border-primary text-primary px-4 py-2 rounded">
Outline <x-button variant="secondary">Secondary</x-button>
</button>
<x-button variant="outline">Outline</x-button>
</div> </div>
<h3 class="text-l font-semibold">Disabled</h3> <h3 class="text-l font-semibold">Disabled</h3>
<div class="flex gap-4"> <div class="flex gap-4">
<button class="bg-primary text-text-inverted px-4 py-2 rounded" disabled> <x-button disabled>Default</x-button>
Primary
</button>
<button class="bg-secondary text-black px-4 py-2 rounded" disabled> <x-button variant="primary" disabled>Primary</x-button>
Secondary
</button>
<button class="border border-primary text-primary px-4 py-2 rounded" disabled>
Outline <x-button variant="secondary" disabled>Secondary</x-button>
</button>
<x-button variant="outline" disabled>Outline</x-button>
</div> </div>
</section> </section>