@props([ // Identificador único 'uid' => uniqid(), // Modelo para Livewire 'model' => '', // Etiqueta y clases de la etiqueta 'label' => '', 'labelClass' => '', // Clases generales 'align' => 'start', // Alineación del textarea (start, end) 'size' => 'md', // Tamaño del textarea (sm, md, lg) 'mb0' => false, // Remover margen inferior 'parentClass' => '', // Elementos opcionales antes/después del textarea 'prefix' => null, 'suffix' => null, // Íconos dentro del input 'prefixIcon' => null, // Ícono fijo a la izquierda 'prefixClickableIcon' => null, // Ícono con botón a la izquierda 'suffixIcon' => null, // Ícono fijo a la derecha 'suffixClickableIcon' => null, // Ícono con botón a la derecha // Configuración del textarea 'rows' => 3, 'maxlength' => null, 'autosize' => false, // Autoajuste de altura 'resize' => true, // Permitir redimensionar // Soporte para etiquetas flotantes 'floating' => false, // Si la etiqueta es flotante // Texto de ayuda 'helperText' => '', // Atributos adicionales para el textarea 'attributes' => new \Illuminate\View\ComponentAttributeBag([]), ]) @php // **Generación de Name, ID y Model** $livewireModel = $attributes->get('wire:model', $model); $name = $attributes->get('name', $livewireModel); $inputId = $attributes->get('id', $name . '_' . $uid); // **Placeholder obligatorio si es flotante** $placeholder = $attributes->get('placeholder', $floating ? ' ' : 'Ingrese ' . strtolower($label)); // **Manejo de errores** $errorKey = $livewireModel ?: $name; $hasError = $errors->has($errorKey); $errorClass = $hasError ? 'is-invalid' : ''; // **Clases dinámicas** $sizeClass = match ($size) { 'sm' => 'form-control-sm', 'lg' => 'form-control-lg', default => '', }; $alignClass = match ($align) { 'center' => 'text-center', 'end' => 'text-end', default => '', }; // **Control de redimensionamiento** $resizeClass = $resize ? '' : 'resize-none'; // **Fusionar atributos del textarea** $textareaAttributes = $attributes->merge([ 'id' => $inputId, 'name' => $name, 'rows' => $rows, 'placeholder' => $placeholder, 'maxlength' => $maxlength, ])->class("form-control $sizeClass $resizeClass $errorClass"); // **Clases del contenedor flotante** $floatingClass = $floating ? 'form-floating' : ''; // **Detectar si necesita Input-Group** $requiresInputGroup = $prefix || $suffix || $prefixIcon || $suffixIcon || $prefixClickableIcon || $suffixClickableIcon; @endphp {{-- ============================ TEXTAREA ============================ --}}
@if (!$floating && $label) @endif @if ($requiresInputGroup) {{-- Textarea con Input-Group --}}
{{-- Prefijos (Izquierda) --}} @if ($prefix) {{ $prefix }} @endif @if ($prefixIcon) @endif @if ($prefixClickableIcon) @endif {{-- Textarea --}} {{-- Sufijos (Derecha) --}} @if ($suffixClickableIcon) @endif @if ($suffixIcon) @endif @if ($suffix) {{ $suffix }} @endif
@else {{-- Textarea simple o flotante --}} @endif {{-- Etiqueta flotante --}} @if ($floating) @endif {{-- Longitud máxima permitida --}} @if ($maxlength) Máximo {{ $maxlength }} caracteres @endif {{-- Texto de ayuda --}} @if ($helperText)
{{ $helperText }}
@endif {{-- Mensaje de error --}} @if ($hasError) {{ $errors->first($errorKey) }} @endif
{{-- ============================ JAVASCRIPT PARA AUTOSIZE ============================ --}} @if ($autosize) @endif