Textarea
This is a component that represents a textarea.
- A textarea captures multi-line text input.
- It uses the same rounded design language as existing form controls.
Preview
Usage
import { Component } from "@angular/core";
import { TextareaComponent } from "./textarea.component";
@Component({
selector: "rui-textarea-demo",
template: `
<div class="w-full max-w-md">
<rui-textarea placeholder="Share your thoughts" [(value)]="note"></rui-textarea>
</div>
`,
imports: [TextareaComponent],
})
export class TextareaDemoComponent {
note = "";
}
Source Code
import { booleanAttribute, ChangeDetectionStrategy, Component, Input, model } from "@angular/core";
import { NgClass } from "@angular/common";
const TEXTAREA_BACKGROUND =
"border-[1px] border-primary-400 bg-primary-100 hover:bg-primary-200 focus:bg-primary-200 disabled:cursor-not-allowed disabled:opacity-60 dark:border-primary-800 dark:bg-primary-900 dark:hover:bg-primary-900/50 dark:focus:bg-primary-900/50";
const TEXTAREA_TEXT =
"text-sm font-semibold text-primary-900 placeholder:text-primary-700/70 dark:text-primary-100 dark:placeholder:text-primary-300/70";
const TEXTAREA_LAYOUT = "w-full min-h-24 max-h-80 resize-y rounded-xl px-3 py-2 outline-none";
const TEXTAREA_ANIMATION = "transition-colors duration-200 ease-in-out";
@Component({
selector: "rui-textarea",
imports: [NgClass],
template: `
<textarea
[placeholder]="placeholder"
[disabled]="disabled"
[value]="value()"
[ngClass]="styleClasses"
(input)="onInput($event)"></textarea>
`,
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class TextareaComponent {
@Input() placeholder: string = "Write something";
@Input({ transform: booleanAttribute }) disabled: boolean = false;
value = model<string>("");
protected readonly styleClasses: string[] = [
TEXTAREA_BACKGROUND,
TEXTAREA_TEXT,
TEXTAREA_LAYOUT,
TEXTAREA_ANIMATION,
];
onInput(event: Event) {
this.value.set((event.target as HTMLTextAreaElement).value);
}
}
Copyright © 2026 Jarrett Huang | MIT License | Github