| "use client"; |
|
|
| import { cn } from "@/shared/utils/cn"; |
|
|
| export default function Select({ |
| label, |
| options = [], |
| value, |
| onChange, |
| placeholder = "Select an option", |
| error, |
| hint, |
| disabled = false, |
| required = false, |
| className, |
| selectClassName, |
| ...props |
| }) { |
| return ( |
| <div className={cn("flex flex-col gap-1.5", className)}> |
| {label && ( |
| <label className="text-sm font-medium text-text-main"> |
| {label} |
| {required && <span className="text-red-500 ml-1">*</span>} |
| </label> |
| )} |
| <div className="relative"> |
| <select |
| value={value} |
| onChange={onChange} |
| disabled={disabled} |
| className={cn( |
| "w-full py-2.5 px-3 pr-10 text-sm text-text-main", |
| "bg-surface-2 border border-transparent rounded-[10px] appearance-none", |
| "focus:outline-none focus:ring-2 focus:ring-brand-500/30 focus:border-brand-500/40", |
| "transition-all duration-150 disabled:opacity-50 disabled:cursor-not-allowed", |
| "text-[16px] sm:text-sm", |
| error && "ring-1 ring-red-500 focus:ring-2 focus:ring-red-500/40 border-red-500/40", |
| selectClassName |
| )} |
| {...props} |
| > |
| <option value="" disabled> |
| {placeholder} |
| </option> |
| {options.map((option) => ( |
| <option key={option.value} value={option.value}> |
| {option.label} |
| </option> |
| ))} |
| </select> |
| <div className="absolute inset-y-0 right-0 flex items-center pr-3 pointer-events-none text-text-muted"> |
| <span className="material-symbols-outlined text-[20px]">expand_more</span> |
| </div> |
| </div> |
| {error && ( |
| <p className="text-xs text-red-500 flex items-center gap-1"> |
| <span className="material-symbols-outlined text-[14px]">error</span> |
| {error} |
| </p> |
| )} |
| {hint && !error && ( |
| <p className="text-xs text-text-muted">{hint}</p> |
| )} |
| </div> |
| ); |
| } |
|
|