@gambito-corp/mbs-library
Version:
Librería de componentes React reutilizables - Sistema de diseño modular y escalable
64 lines (56 loc) • 2.41 kB
JSX
import React from 'react';
const SearchInput = ({
value,
onChange,
placeholder = 'Buscar...',
disabled = false,
onClear,
className = '',
...props
}) => {
const baseClasses = 'w-full pl-10 pr-10 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors duration-200';
const disabledClasses = disabled
? 'bg-gray-100 cursor-not-allowed opacity-60'
: 'bg-white';
const handleClear = () => {
if (onClear) {
onClear();
} else if (onChange) {
onChange({ target: { value: '' } });
}
};
return (
<div className="relative">
{/* Icono de búsqueda */}
<div className="absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none">
<svg className="h-5 w-5 text-gray-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M21 21l-6-6m2-5a7 7 0 11-14 0 7 7 0 0114 0z" />
</svg>
</div>
<input
type="text"
value={value}
onChange={onChange}
placeholder={placeholder}
disabled={disabled}
className={`${baseClasses} ${disabledClasses} ${className}`}
{...props}
/>
{/* Botón de limpiar */}
{value && (
<div className="absolute inset-y-0 right-0 pr-3 flex items-center">
<button
type="button"
onClick={handleClear}
className="text-gray-400 hover:text-gray-600 focus:outline-none"
>
<svg className="h-5 w-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M6 18L18 6M6 6l12 12" />
</svg>
</button>
</div>
)}
</div>
);
};
export default SearchInput;