File size: 1,593 Bytes
0842d68 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | import { DetailedHTMLProps, TextareaHTMLAttributes, useMemo } from "react";
import cn from "../../utils/classnames";
interface TextareaProps extends DetailedHTMLProps<
TextareaHTMLAttributes<HTMLTextAreaElement>,
HTMLTextAreaElement
> {
variant?: "default" | "minimal";
error?: boolean;
}
export default function Textarea({
variant = "default",
error = false,
className = "",
value,
...props
}: TextareaProps) {
const baseClasses =
"w-full font-sans transition-all duration-200 resize-none focus:outline-none";
const variantClasses = {
default:
"px-4 py-3 border border-border rounded-md bg-white hover:border-primary-300 focus:border-primary focus:ring-2 focus:ring-primary/20",
minimal:
"px-4 py-3 border-0 bg-transparent hover:bg-muted/30 focus:bg-white focus:shadow-sm rounded-md",
};
const errorClasses = error
? "border-destructive focus:border-destructive focus:ring-destructive/20"
: "";
const disabledClasses = "disabled:cursor-default";
const fontSizeClass = useMemo(() => {
const length = typeof value === "string" ? value.length : 0;
console.log(length);
if (length === 0) return "text-2xl";
if (length < 50) return "text-2xl";
if (length < 200) return "text-xl";
if (length < 300) return "text-lg";
return "text-base";
}, [value]);
return (
<textarea
className={cn(
baseClasses,
variantClasses[variant],
errorClasses,
disabledClasses,
fontSizeClass,
className
)}
value={value}
{...props}
/>
);
}
|