diff --git a/client/src/app/test/textarea/page.tsx b/client/src/app/test/textarea/page.tsx
new file mode 100644
index 0000000..013d8c0
--- /dev/null
+++ b/client/src/app/test/textarea/page.tsx
@@ -0,0 +1,43 @@
+"use client";
+import React, { useState } from "react";
+
+import { Button } from "@/components/ui/button";
+import Textarea from "@/components/ui/textarea";
+
+export default function TextareaTestPage() {
+ const [message, setMessage] = useState("");
+
+ const handleSubmit = (e: React.FormEvent) => {
+ e.preventDefault();
+ alert(`Submitted text: ${message}`);
+ };
+
+ return (
+
+
+
+
Current value message: {message}
+
+
+ );
+}
diff --git a/client/src/components/ui/textarea.tsx b/client/src/components/ui/textarea.tsx
new file mode 100644
index 0000000..0827861
--- /dev/null
+++ b/client/src/components/ui/textarea.tsx
@@ -0,0 +1,74 @@
+// Usage:
+//
+
+// Style (apart from border color: --border, other styles match InputField):
+// label: body-sm-bold, default text color
+// textarea: border color: --border, background color: --background, shadow: 0 4px 0 #D1D5DB
+// placeholder: text color: --bloom-gray
+
+"use client";
+import React from "react";
+
+import { cn } from "@/lib/utils";
+
+interface TextareaProps {
+ id?: string;
+ name: string;
+ label?: string;
+ placeholder?: string;
+ rows?: number;
+ value: string;
+ onChange: (value: string) => void;
+ required?: boolean;
+ className?: string;
+}
+
+// Use to capitalize the first letter of name as label placeholder if not passed
+const capitalizeFirstLetter = (str: string) => {
+ return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
+};
+
+const Textarea: React.FC = ({
+ id,
+ name,
+ label,
+ placeholder,
+ rows,
+ value,
+ onChange,
+ required,
+ className,
+}) => {
+ return (
+ <>
+
+