diff --git a/docs/content/2.components/textarea.md b/docs/content/2.components/textarea.md
new file mode 100644
index 0000000..b170db2
--- /dev/null
+++ b/docs/content/2.components/textarea.md
@@ -0,0 +1,182 @@
+---
+description: Create a textarea component
+since: 1.3.5
+---
+
+## Usage
+
+The basic usage.
+
+::ComponentPreview
+---
+privateProps:
+ placeholder: Description
+---
+::
+
+### Sizes
+
+::ComponentPreview
+---
+privateProps:
+ placeholder: Description
+props:
+ size: sm
+---
+::
+
+### Colors
+
+::ComponentPreview
+---
+privateProps:
+ placeholder: Description
+props:
+ color: primary
+---
+::
+
+### Variants
+
+::ComponentPreview
+---
+privateProps:
+ placeholder: Description
+props:
+ variant: outline
+---
+::
+
+### Placeholder
+
+You can also set a placeholder.
+
+::ComponentPreview
+---
+props:
+ placeholder: "Description here..."
+---
+::
+
+### Padded
+
+::ComponentPreview
+---
+privateProps:
+ placeholder: Description
+ variant: plain
+props:
+ padded: false
+---
+::
+
+### Rows
+
+Set the number of rows of the textarea.
+
+::ComponentPreview
+---
+privateProps:
+ placeholder: Description
+props:
+ rows: 4
+---
+::
+
+### Resize
+
+Enable the resize control.
+
+::ComponentPreview
+---
+privateProps:
+ placeholder: Description
+props:
+ resize: true
+---
+::
+
+### Auto Resize
+
+The `autosize` prop enables the auto resizing of the textarea. The textarea will grow in height as the user types.
+
+::ComponentPreview
+---
+privateProps:
+ placeholder: Description
+props:
+ autosize: true
+---
+::
+
+The `maxrows` prop can be used to set the maximum number of rows the textarea can grow to.
+
+::ComponentPreview
+---
+privateProps:
+ placeholder: Description
+props:
+ autosize: true
+ maxrows: 8
+---
+::
+
+### Disabled
+
+::ComponentPreview
+---
+privateProps:
+ placeholder: Description
+props:
+ disabled: true
+---
+::
+
+### Model Modifiers
+
+#### .trim
+
+The `.trim` modifier trims the input value.
+
+```vue [page]
+
+
+
+
+
+```
+
+#### .number
+
+The `.number` modifier converts the input value to a number. Non-numeric values are ignored.
+
+```vue [page]
+
+
+
+
+
+```
+
+#### .lazy
+
+The `.lazy` modifier syncs the input value with the model only on `change` event.
+
+```vue [page]
+
+
+
+
+
+```
+
+## Config
+
+::ComponentDefaults
+::
diff --git a/src/runtime/components/forms/Textarea.vue b/src/runtime/components/forms/Textarea.vue
new file mode 100644
index 0000000..e9b5025
--- /dev/null
+++ b/src/runtime/components/forms/Textarea.vue
@@ -0,0 +1,192 @@
+
+
+
+
+
+
+
diff --git a/src/runtime/types/index.ts b/src/runtime/types/index.ts
index 29b38fb..caea2fd 100644
--- a/src/runtime/types/index.ts
+++ b/src/runtime/types/index.ts
@@ -1,6 +1,7 @@
export * from './button'
export * from './message'
export * from './input'
+export * from './textarea'
export * from './kbd'
export * from './toggle'
diff --git a/src/runtime/types/textarea.d.ts b/src/runtime/types/textarea.d.ts
new file mode 100644
index 0000000..7124857
--- /dev/null
+++ b/src/runtime/types/textarea.d.ts
@@ -0,0 +1,19 @@
+import type { AppConfig } from '@nuxt/schema'
+import type { textarea } from '../ui.config'
+import type { ExtractDeepKey } from './utils'
+import type colors from '#ray-colors'
+
+export type TextareaSize =
+ | keyof typeof textarea.size
+ | ExtractDeepKey
+export type TextareaColor =
+ | ExtractDeepKey
+ | (typeof colors)[number]
+export type TextareaVariant =
+ | keyof typeof textarea.variant
+ | ExtractDeepKey
+export type TextareaModelModifiers = {
+ number?: boolean
+ trim?: boolean
+ lazy?: boolean
+}
diff --git a/src/runtime/ui.config/forms/textarea.ts b/src/runtime/ui.config/forms/textarea.ts
new file mode 100644
index 0000000..f90c37b
--- /dev/null
+++ b/src/runtime/ui.config/forms/textarea.ts
@@ -0,0 +1,24 @@
+import { standard } from '..'
+
+export default {
+ wrapper: 'relative',
+ base: 'relative w-full block focus:outline-none disabled:cursor-not-allowed disabled:opacity-70 transition',
+ placeholder: 'placeholder:text-gray-400 dark:placeholder:text-gray-500',
+ rounded: 'rounded-md',
+ size: {
+ ...standard.size,
+ },
+ padding: {
+ ...standard.padding,
+ },
+ variant: {
+ outline:
+ 'shadow-sm bg-transparent text-gray-900 dark:text-white ring ring-1 ring-inset ring-gray-300 dark:ring-gray-700 focus:ring-2 focus:ring-{color}-500 dark:focus:ring-{color}-400',
+ plain: 'bg-transparent',
+ },
+ default: {
+ size: 'sm',
+ color: 'primary',
+ variant: 'outline',
+ },
+}
diff --git a/src/runtime/ui.config/index.ts b/src/runtime/ui.config/index.ts
index da5b789..0ada6dc 100644
--- a/src/runtime/ui.config/index.ts
+++ b/src/runtime/ui.config/index.ts
@@ -7,6 +7,7 @@ export { default as kbd } from './elements/kbd'
// forms
export { default as input } from './forms/input'
+export { default as textarea } from './forms/textarea'
export { default as toggle } from './forms/toggle'
// overlays