Multiline text input field with label, description, validation state, and one canonical value-change event. Flutter ignores the web-only resize affordance.
Install @wyrd-company/react or the Flutter package and use it directly —
your DESIGN.md does the styling.
catalog/contracts/textarea.ymlsource of truth · verbatim
$schema: https://thewyrdingway.dev/schemas/component-contract.schema.ymlcontractVersion: 0.1.0identity:name: Textareatag: wyrd-textareapackage: wyrd.component.textareatitle: Textareasummary: Multiline text input field with label, description, validation state, and one canonical value-change event. Flutter ignores the web-only resize affordance.relationships:related-to: - quality-parity-and-gatesclassification:category: form-fieldcomposition: multi-slotinteractive: truetarget-strategy:react: requiredflutter: requiredsurface:properties: - name: valuetype:kind: stringrequired: falsecontrolled: trueserializable: truesummary: Controlled text value. - name: default-valuetype:kind: stringrequired: falseserializable: truesummary: Initial uncontrolled text value. - name: rowstype:kind: integerminimum: 2maximum: 20required: falsedefault: 3serializable: truesummary: Visible text rows. - name: resizetype:kind: enumvalues: - none - verticalrequired: falsedefault: verticalserializable: truesummary: User resize affordance on web; Flutter ignores this property. - name: is-disabledtype:kind: booleanrequired: falsedefault: falsereflects: trueserializable: truesummary: Prevents editing and exposes disabled semantics. - name: is-requiredtype:kind: booleanrequired: falsedefault: falsereflects: trueserializable: truesummary: Marks the field as required. - name: is-invalidtype:kind: booleanrequired: falsedefault: falsereflects: trueserializable: truesummary: Marks the value as invalid and associates the error slot.slots: - name: labelrequired: truecardinality: exactly-oneaccepts: - textsummary: Visible label and accessible-name source. - name: descriptionrequired: falsecardinality: zero-or-oneaccepts: - textsummary: Help text associated with the input. - name: errorrequired: falsecardinality: zero-or-oneaccepts: - textsummary: Validation error associated when is-invalid is true.events: - name: value-changepayload:value:kind: stringaction:kind: action-refbubbles: truecomposed: truecancelable: falsesummary: Canonical value-change event carrying the next string value.states: - name: defaultsource: platformsummary: Empty enabled state. - name: focus-visiblesource: platformsummary: Keyboard-visible focus state. - name: disabledsource: propertysummary: Disabled state derived from is-disabled. - name: invalidsource: propertysummary: Invalid state derived from is-invalid. - name: requiredsource: propertysummary: Required state derived from is-required. - name: filledsource: propertysummary: State when value or default-value has content.parts: - name: rootsummary: Field container.slots: - label - description - error - name: labelsummary: Label text.slots: - label - name: controlsummary: Editable multiline control. - name: descriptionsummary: Description text.slots: - description - name: errorsummary: Error text.slots: - errortokens:root:gap: spacing.xslabel:color: color.on-surfacetext: typography.label-mdcontrol:background: color.surfaceforeground: color.on-surfaceplaceholder: color.on-surface-variantborder-color: color.outlineborder-color-focus: color.primaryborder-color-invalid: color.errorborder-width: 1pxradius: rounded.smpadding-x: spacing.mdpadding-y: spacing.smtext: typography.body-mddescription:color: color.on-surface-varianttext: typography.body-mderror:color: color.errortext: typography.body-mdmessages: []obligations:accessibility:role: textboxname: Label slot provides the accessible name.description: Description and error slots are programmatically associated with the control.keyboard: - Text input follows platform editing keys. - Tab moves focus into and out of the field in document order.semantics: - Required, invalid, and disabled states are exposed through platform semantics. - Error text is associated only when invalid. - The control exposes multiline text entry semantics where the platform supports it.behavior:model: inputinteractions: - Editing emits value-change with the next string value. - Invalid state associates the error slot and updates visual state.hostEffects: - Dispatch value-change event. - Bind value to SDUI form state when present.conditions: - rtl - reduced-motion - cvd-deuteranopia - density-compact - text-expansionsdui:status: serializableserializableProperties: - value - default-value - rows - resize - is-disabled - is-required - is-invalidserializableSlots: - label - description - erroreventBindings: - value-changenotes: Value-change serializes to a named binding/action channel; resize is a web-only affordance ignored by Flutter.examples: - name: emptystate: defaultproperties:rows: 3slots:label: Notesdescription: Add context for collaborators. - name: filledstate: filledproperties:default-value: Bob prefers concise written updates.rows: 4slots:label: Notes - name: invalidstate: invalidproperties:value: ""is-invalid: trueis-required: truerows: 3slots:label: Noteserror: Notes are required.
01
Examples
Generated from the contract's examples block.
Previews are the published @wyrd-company/react component, themed by the
brand's role tokens — flip the site's light/dark toggle and they follow.
User resize affordance on web; Flutter ignores this property.
is-disabled
boolean
false
Prevents editing and exposes disabled semantics.
is-required
boolean
false
Marks the field as required.
is-invalid
boolean
false
Marks the value as invalid and associates the error slot.
03
Slots & events
Slot
Cardinality
Accepts
Summary
label
exactly-one
text
Visible label and accessible-name source.
description
zero-or-one
text
Help text associated with the input.
error
zero-or-one
text
Validation error associated when is-invalid is true.
Event
Payload
Summary
value-change
value, action
Canonical value-change event carrying the next string value.
04
Tokens
The contract's token bindings. Open the shared contextual sidebar from any example;
primary swatches reflect the color you pick there. Error swatches show the active
preset's values; editing any knob switches to custom and resets error to TWW · Ink.
Binding
Token
root.gap
spacing.xs
label.color
color.on-surface
label.text
typography.label-md
control.background
color.surface
control.foreground
color.on-surface
control.placeholder
color.on-surface-variant
control.border-color
color.outline
control.border-color-focus
color.primary
control.border-color-invalid
color.error
control.border-width
1px
control.radius
rounded.sm
control.padding-x
spacing.md
control.padding-y
spacing.sm
control.text
typography.body-md
description.color
color.on-surface-variant
description.text
typography.body-md
error.color
color.error
error.text
typography.body-md
05
States
State
Source
Summary
default
platform
Empty enabled state.
focus-visible
platform
Keyboard-visible focus state.
disabled
property
Disabled state derived from is-disabled.
invalid
property
Invalid state derived from is-invalid.
required
property
Required state derived from is-required.
filled
property
State when value or default-value has content.
06
Accessibility
From the contract's accessibility obligations. Role textbox; Label slot provides the accessible name.
Text input follows platform editing keys.
Tab moves focus into and out of the field in document order.
Required, invalid, and disabled states are exposed through platform semantics.
Error text is associated only when invalid.
The control exposes multiline text entry semantics where the platform supports it.