Skip to main content

A multi-line text input that works with Field, with optional word count, live-region announcements, and submit-on-Enter.

Features

Installation

typo3 ui:add textarea

Read more about installing Components and Primitives.

Examples

With Field

Nest ui:textarea.root directly inside ui:field.root - it inherits name, disabled, required, invalid and aria-describedby automatically, the same way ui:input/ui:select do. Use the primitive's own label part (nested inside root) rather than field.label - it targets the right control automatically.

Shown on your public profile.

With Word Count

Pass maxLength and add the wordCount/liveRegion parts wherever you want them - they don't need to be direct siblings of textarea.

0 / 280 characters

Submit on Enter

Pass submitOn="{f:constant(name: 'Jramke\FluidPrimitives\Enum\TextareaSubmitOn::ModEnter')}" to submit the nearest <form> on Cmd/Ctrl+Enter instead of inserting a newline - plain Enter still inserts a newline. Use TextareaSubmitOn::Enter for the opposite: plain Enter submits, Shift+Enter inserts a newline. Wrap the textarea in ui:form.root (or any native <form>) for the submit to actually go anywhere - submitOn just calls closest('form')?.requestSubmit().

With a Transform Callback

transform runs on every native input event, before the value is committed - return the value that should actually be written back to the textarea, with cursor position preserved across the rewrite. Because a real function can't cross the PHP → client JSON boundary, this can only be set by constructing Textarea yourself in a custom entry file, rather than as a Fluid prop. Type lowercase below - it's uppercased as you type:

API Reference

The following tables cover the available props of the Fluid Primitives.

textarea.root

Provides shared textarea state and wraps all related parts. Renders a <div> element.

NameDescriptionRequiredDefault
placeholderstring
Placeholder text shown when the textarea is empty.
No
-
autocompletestring
Hints for browser autofill, e.g. street-address. See the [HTML spec](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#autofill) for the full list of tokens.
No
-
namestring
The name attribute of the textarea. Useful for form submission. Inherited from a surrounding field when available.
No
-
disabledboolean
Whether the textarea is disabled. Inherited from a surrounding field when available.
No
-
invalidboolean
Whether the textarea value is invalid. Inherited from a surrounding field when available.
No
-
requiredboolean
Whether the textarea is required. Inherited from a surrounding field when available.
No
-
readOnlyboolean
Whether the textarea is readonly. Inherited from a surrounding field when available.
No
-
defaultValuestring
The initial value of the textarea when rendered. Use when you don't need to control the value of the textarea. Inherited from a surrounding field when available.
No
''
maxLengthinteger
The maximum number of characters allowed. Also drives the wordCount part, e.g. '42 / 250 characters'.
No
-
rowsinteger
The number of visible text lines.
No
-
submitOnEnum\TextareaSubmitOn
Submits the nearest form on a keypress instead of inserting a newline: Enter submits on plain Enter (Shift+Enter still inserts a newline), ModEnter submits on Cmd/Ctrl+Enter (plain Enter always inserts a newline). Unset (the default) never intercepts Enter.
No
-
translationsarray
Specifies the localized word count string. Set the wordCount entry to false to disable the wordCount part and live-region announcements entirely. Use `f:translate` for per-template localization overrides when needed.
No
-
announceDebounceinteger
Milliseconds to debounce word count live-region announcements by, so rapid typing doesn't spam assistive tech. Set to 0 to announce every change immediately.
No
600
asChildboolean
If true the component uses its child only without the component template. Like Radix UI asChild or Base UI render props.
No
-
rootIdstring
The root ID of the component, used for hydration and identification.
No
-
idsarray
The IDs of of the component parts for composition.
No
[]
controlledboolean
If true, the component is meant to be initialized manually inside another component
No
false
classstring
The CSS class(es) to be applied to the component.
No
-
attributesarray
Additional attributes that should be rendered on the component where ui:attributes is used.
No
[]

textarea.label

Labels the textarea. Renders a <label> element.

NameDescriptionRequiredDefault
asChildboolean
If true the component uses its child only without the component template. Like Radix UI asChild or Base UI render props.
No
-
classstring
The CSS class(es) to be applied to the component.
No
-
attributesarray
Additional attributes that should be rendered on the component where ui:attributes is used.
No
[]

textarea.textarea

The editable textarea. Renders a <textarea> element.

NameDescriptionRequiredDefault
asChildboolean
If true the component uses its child only without the component template. Like Radix UI asChild or Base UI render props.
No
-
classstring
The CSS class(es) to be applied to the component.
No
-
attributesarray
Additional attributes that should be rendered on the component where ui:attributes is used.
No
[]

textarea.wordCount

Displays the character count, e.g. '42 / 250 characters'. Renders a <span> element.

NameDescriptionRequiredDefault
asChildboolean
If true the component uses its child only without the component template. Like Radix UI asChild or Base UI render props.
No
-
classstring
The CSS class(es) to be applied to the component.
No
-
attributesarray
Additional attributes that should be rendered on the component where ui:attributes is used.
No
[]

textarea.liveRegion

Announces word count updates to assistive technology. Renders a <div> element.

NameDescriptionRequiredDefault
asChildboolean
If true the component uses its child only without the component template. Like Radix UI asChild or Base UI render props.
No
-
classstring
The CSS class(es) to be applied to the component.
No
-
attributesarray
Additional attributes that should be rendered on the component where ui:attributes is used.
No
[]

Anatomy

<primitives:textarea.root>
    <primitives:textarea.label />
    <primitives:textarea.textarea />
    <primitives:textarea.wordCount />
    <primitives:textarea.liveRegion />
</primitives:textarea.root>