Files
LogisicsApp_Client/Components/UI/Select.tsx

53 lines
1.5 KiB
TypeScript

import React, { forwardRef, SelectHTMLAttributes } from "react";
// ─── Select ──────────────────────────────────────────────────────────────────
interface SelectProps extends SelectHTMLAttributes<HTMLSelectElement> {
label?: string;
error?: string;
wrapperClassName?: string;
children: React.ReactNode;
}
export const Select = forwardRef<HTMLSelectElement, SelectProps>(function Select(
{ label, error, wrapperClassName = "", className = "", id, children, ...rest },
ref
) {
const selectId = id ?? label?.toLowerCase().replace(/\s+/g, "-");
return (
<div className={`flex flex-col gap-1 ${wrapperClassName}`}>
{label && (
<label
htmlFor={selectId}
className="text-xs font-semibold uppercase tracking-wide text-slate-500"
>
{label}
</label>
)}
<select
ref={ref}
id={selectId}
className={`
w-full rounded-lg border bg-white px-3 py-2 text-sm text-slate-800
focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:border-indigo-500
disabled:bg-slate-50 disabled:cursor-not-allowed
${error ? "border-red-400" : "border-slate-300"}
${className}
`}
{...rest}
>
{children}
</select>
{error && <p className="text-xs text-red-600">{error}</p>}
</div>
);
});