shadimage

Textarea

Accessible React textarea component for Tile UI.

packages/react/src/components/textarea/textarea.tsx

import React, { useId } from 'react';
import { getTextareaIds, getTextareaAriaProps } from '../lib/core';
import type { TextareaBaseProps } from '../lib/core';
import styles from './textarea.module.scss';

export interface TextareaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement>, TextareaBaseProps {}

const Textarea = React.forwardRef<HTMLTextAreaElement, TextareaProps>(({ className = '', label, error, helperText, required, id: providedId, ...props }, ref) => {
	const generatedId = useId();
	const id = providedId || generatedId;
	const ids = getTextareaIds(id);
	const ariaProps = getTextareaAriaProps(ids, error, helperText);

	return (
		<div className={styles.textareaWrapper}>
			{label && (
				<label htmlFor={id} className={`${styles.label} ${required ? styles.required : ''}`}>
					{label}
				</label>
			)}
			<textarea ref={ref} id={id} className={`${styles.textarea} ${error ? styles.error : ''} ${className}`} {...ariaProps} {...props} />
			{error && (
				<span id={ids.error} className={styles.errorText}>
					{error}
				</span>
			)}
			{!error && helperText && (
				<span id={ids.helper} className={styles.helperText}>
					{helperText}
				</span>
			)}
		</div>
	);
});

Textarea.displayName = 'Textarea';

export { Textarea };
export default Textarea;

No selection tags yet — empty means no evidence, not lack of support.