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}
    />
  );
}