Files
aegis/src/components/ui/Select.tsx
T
2026-07-30 14:08:49 +02:00

55 lines
1.8 KiB
TypeScript

import React, { forwardRef, useId } from 'react';
import { cn } from '@/utils/utils';
export interface SelectOption {
value: string | number;
label: string;
}
export interface SelectProps extends React.SelectHTMLAttributes<HTMLSelectElement> {
label?: string;
error?: string;
options: SelectOption[];
placeholder?: string; // Optionnel : ajoute un choix vide par défaut
}
export const Select = forwardRef<HTMLSelectElement, SelectProps>(
({ className, label, error, id, options, placeholder, ...props }, ref) => {
const autoId = useId();
const selectId = id || autoId;
return (
<div className="w-full">
{label && (
<label htmlFor={selectId} className="block text-sm font-medium text-slate-700 mb-1.5">
{label} {props.required && <span className="text-blue-900 font-bold">*</span>}
</label>
)}
<select
id={selectId}
ref={ref}
className={cn(
"flex w-full rounded-lg border border-slate-300 bg-white px-4 py-2.5 text-sm focus:outline-none focus:ring-1 focus:ring-blue-900 focus:border-blue-900 disabled:cursor-not-allowed disabled:bg-slate-50 disabled:text-slate-500 shadow-sm transition-colors cursor-pointer",
error && "border-red-500 focus:ring-red-500 focus:border-red-500",
className
)}
{...props}
>
{placeholder && (
<option value="" disabled hidden>
{placeholder}
</option>
)}
{options.map((option) => (
<option key={option.value} value={option.value}>
{option.label}
</option>
))}
</select>
{error && <p className="mt-1.5 text-xs font-medium text-red-500">{error}</p>}
</div>
);
}
);
Select.displayName = "Select";