dannyguevara1 / zest
Laravel component toolkit for rapid UI development
v1.0.2
2025-04-09 18:17 UTC
Requires
- php: ^8.1
- illuminate/support: ^10.0|^11.0|^12.0
This package is auto-updated.
Last update: 2025-09-09 19:16:25 UTC
README
Zest es una herramienta minimalista para gestionar clases CSS en aplicaciones Laravel. Permite crear, organizar y reutilizar clases CSS mediante un sistema de presets, facilitando el mantenimiento y la consistencia del código.
Características
- Sistema de presets: Define conjuntos reutilizables de clases CSS
- API fluida: Utiliza una interfaz de encadenamiento de métodos para construir clases
- Directivas Blade: Integración con Blade mediante directivas
@preset
y@presetIf
- Sin opiniones de estilo: Zest no impone ningún framework CSS o sistema de diseño
- Liviano y enfocado: Hace una cosa y la hace bien - gestionar clases CSS
Instalación
composer require dannyguevara1/zest
Opcionalmente, publica el archivo de configuración:
php artisan vendor:publish --tag=zest-config
Uso básico
Definiendo presets
Define presets globales en el archivo de configuración o mediante código:
// En config/zest.php 'presets' => [ 'btn' => 'inline-flex items-center justify-center font-medium rounded', 'btn-primary' => 'bg-blue-600 text-white hover:bg-blue-700', 'card' => 'bg-white rounded-lg shadow overflow-hidden', ], // O mediante código use Dannyguevara1\Zest\Facades\Zest; Zest::definePreset('btn', 'inline-flex items-center justify-center font-medium rounded'); Zest::definePresets([ 'btn-primary' => 'bg-blue-600 text-white hover:bg-blue-700', 'card' => 'bg-white rounded-lg shadow overflow-hidden', ]);
Usando presets en vistas Blade
<button class="{{ Zest::preset('btn')->preset('btn-primary') }}"> Enviar formulario </button>
Usando la API fluida para combinar clases
<div class="{{ Zest::classBuilder() ->add('flex items-center') ->preset('card') ->addIf($hasError, 'border-red-500') ->addIf($isActive, 'border-green-500') }}"> Contenido </div>
Usando las directivas de Blade
<button class="@preset('btn') @presetIf($isPrimary, 'btn-primary')"> Botón </button>
Organizando tus presets
Recomendamos organizar tus presets con prefijos claros según el tipo de componente:
// Botones 'btn' => 'base-styles...', 'btn-primary' => 'variant-styles...', 'btn-sm' => 'size-styles...', // Tarjetas 'card' => 'base-styles...', 'card-header' => 'part-styles...', 'card-body' => 'part-styles...',
Integrando con tus componentes Blade
Zest es una herramienta excelente para usar en componentes Blade personalizados:
<!-- resources/views/components/button.blade.php --> @props(['variant' => 'default', 'size' => 'md']) <button {{ $attributes->class([ Zest::preset('btn'), Zest::preset('btn-'.$variant), Zest::preset('btn-size-'.$size) ]) }}> {{ $slot }} </button>
API
Facade Zest
Zest::classBuilder($initialClasses = null)
: Crea una nueva instancia de ClassComposerZest::definePreset($name, $classes)
: Define un preset globalZest::definePresets($presetsArray)
: Define múltiples presets globalesZest::getPreset($name)
: Obtiene un preset por su nombreZest::preset($name)
: Crea un ClassComposer y aplica un preset
Clase ClassComposer
add($classes)
: Añade clases CSSaddIf($condition, $classes)
: Añade clases CSS condicionalmentepreset($name)
: Aplica un presetpresetIf($condition, $name)
: Aplica un preset condicionalmente
Ejemplos avanzados
Componente de botón
// AppServiceProvider.php public function boot() { Zest::definePresets([ 'btn' => 'inline-flex items-center justify-center font-medium transition-colors rounded-md', 'btn-primary' => 'bg-blue-600 text-white hover:bg-blue-700', 'btn-secondary' => 'bg-gray-200 text-gray-800 hover:bg-gray-300', 'btn-sm' => 'text-sm px-3 py-1.5', 'btn-md' => 'px-4 py-2', 'btn-lg' => 'text-lg px-5 py-3', ]); }
<!-- button.blade.php --> @props(['variant' => 'primary', 'size' => 'md']) <button {{ $attributes->class([ '@preset("btn")', '@preset("btn-'.$variant.'")', '@preset("btn-'.$size.'")', ]) }}> {{ $slot }} </button>
Componente de tabla
// AppServiceProvider.php public function boot() { Zest::definePresets([ 'table' => 'min-w-full divide-y divide-gray-200', 'table-head' => 'bg-gray-50', 'table-th' => 'px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider', 'table-body' => 'bg-white divide-y divide-gray-200', 'table-td' => 'px-6 py-4 whitespace-nowrap text-sm text-gray-500', ]); }
<!-- table.blade.php --> <table class="@preset('table')"> <thead class="@preset('table-head')"> <tr> @foreach($headers as $header) <th class="@preset('table-th')">{{ $header }}</th> @endforeach </tr> </thead> <tbody class="@preset('table-body')"> @foreach($rows as $row) <tr> @foreach($row as $cell) <td class="@preset('table-td')">{{ $cell }}</td> @endforeach </tr> @endforeach </tbody> </table>
Licencia
MIT