FieldTextArea
Многострочное текстовое поле. Базируется на FieldDecorator поверх нативного <textarea> с авто-resize (react-textarea-autosize). Поддерживает высоту по minRows/maxRows, опциональный ручной resize за нижний правый угол, кнопки очистки и копирования, слот footer под полем. Фон acrylic общий с остальными полями @cloud-ru/ds-fields.
Когда использовать
- Длинные тексты: комментарии, описания, отзывы, сообщения.
- Bio/about-форм поля с лимитом символов (
maxLength+ автоматический счётчик). - Read-only многострочное значение с кнопкой копирования (логи, сгенерированные тексты).
- Поддерживает controlled (
value+onChange) и uncontrolled (defaultValue) режимы.
Анатомия
Size (default m)
| Значение | Когда |
|---|---|
s | Inline-формы, плотные таблицы |
m | Стандартные формы (по умолчанию) |
l | Лендинги, primary-формы |
ValidationState (default default)
Через проп error форсится error. Иконка слева от подсказки появляется при showHintIcon.
| Значение | Когда |
|---|---|
default | Нет валидации — нейтральный фон, без цвета и иконки (textTertiary) |
error | Не прошло валидацию — красная тонировка фона + иконка |
warning | Предупреждение, ввод допустим — жёлтая тонировка фона + иконка |
success | Подтверждение успешного ввода — зелёная тонировка фона + иконка |
Высота
Поле растёт под контент автоматически — от minRows строк и до maxRows, после чего включается вертикальный скролл.
| Проп | Поведение |
|---|---|
minRows | Стартовая высота в строках (default 3) |
maxRows | Максимум до появления вертикального скролла (default 1000 — фактически без потолка) |
resizable | Ручка ресайза в правом нижнем углу — пользователь меняет высоту мышью. Игнорируется при disabled/readonly (default false) |
Кнопки очистки и копирования
В postfix-колонке поля рендерятся служебные кнопки. Управляются showClearButton / showCopyButton.
showClearButton— кнопка очистки. Видна при непустомvalueи!readonly && !disabled(defaulttrue).showCopyButton— кнопка копирования значения в буфер. Видна при непустомvalueв режимеreadonly(и!disabled, defaulttrue). После нажатия кратко показывает галочку-подтверждение.
Кнопки попадают в Tab-навигацию через postfix-стрелки, как у FieldText.
Footer
Слот footer рендерится отдельной строкой под <textarea> внутри границы поля — для действий, плагинов-счётчиков или подсказок, привязанных к самому полю (в отличие от hint/caption, которые живут в FieldDecorator снаружи).
Установка
pnpm add @cloud-ru/ds-fields
import { FieldTextArea } from '@cloud-ru/ds-fields'
Примеры использования
Базовое поле
import { FieldTextArea } from '@cloud-ru/ds-fields';
import { useState } from 'react';
export function TextArea() {
const [value, setValue] = useState('');
return (
<FieldTextArea
label='Комментарий'
placeholder='Расскажите подробнее'
hint='До 500 символов'
minRows={3}
maxRows={8}
value={value}
onChange={setValue}
/>
);
}Изменяемый размер
import { FieldTextArea } from '@cloud-ru/ds-fields';
import { useState } from 'react';
export function TextAreaResizable() {
const [value, setValue] = useState('Потяните за нижний правый угол.');
return (
<FieldTextArea
label='Описание'
hint='Можно изменить высоту мышью'
minRows={3}
maxRows={20}
resizable
value={value}
onChange={setValue}
/>
);
}Счётчик длины
import { FieldTextArea } from '@cloud-ru/ds-fields';
import { useState } from 'react';
export function TextAreaWithLength() {
const [value, setValue] = useState('');
return (
<FieldTextArea label='Bio' hint='Кратко о себе' maxLength={120} minRows={3} value={value} onChange={setValue} />
);
}Uncontrolled
import { FieldTextArea } from '@cloud-ru/ds-fields';
export function TextAreaUncontrolled() {
return (
<FieldTextArea
label='Заметка'
hint='Uncontrolled: начальное значение через defaultValue'
defaultValue={'Первая строка\nВторая строка'}
minRows={3}
maxRows={8}
/>
);
}Readonly с копированием
import { FieldTextArea } from '@cloud-ru/ds-fields';
export function TextAreaReadonly() {
return (
<FieldTextArea
label='Сгенерированный конфиг'
readonly
value={'server:\n host: 0.0.0.0\n port: 8080'}
minRows={3}
maxRows={8}
/>
);
}Props
Types
FieldTextAreaProps| Prop | Type | Default | Required | Description |
|---|---|---|---|---|
allowMoreThanMaxLength | boolean | true | no | Разрешить ввод свыше `maxLength` символов (счётчик продолжит расти). |
autoFocus | boolean | — | no | Автофокус. На mobile выключается адаптивно (см. `layoutPresets`) |
background | boolean | true | no | Фон поля (acrylic) |
caption | string | — | no | Вторичная подпись справа |
className | string | — | no | CSS-класс CSS-класс к орня `FieldDecorator` |
data-test-id | string | — | no | |
defaultValue | string | | no | Начальное значение (uncontrolled-режим) |
disabled | boolean | — | no | Поле выключено |
error | string | — | no | Ошибка (приоритетнее `hint`; форсит `validationState=error`) |
fieldClassName | string | — | no | CSS-класс оболочки поля |
footer | ReactNode | — | no | Нода под textarea — ряд элементов после контента (Figma `elementWrapperAfter` / `slotAfterContent`): действия, счётчик-плагин и т.п. |
header | ReactNode | — | no | Нода над textarea — ряд элементов до контента (Figma `elementWrapperBefore` / `slotBeforeContent`): тулбар с кнопками, чипами и т.п. |
hint | string | — | no | Подсказка |
id | string | — | no | HTML id |
innerRef | Ref<HTMLDivElement> | — | no | Ref на корневой DOM-элемент |
inputMode | "decimal" | "email" | "none" | "numeric" | "search" | "tel" | "text" | "url" | — | no | Режим виртуальной клавиатуры (`inputmode` нативного `<textarea>`) |
label | string | | no | Заголовок |
labelFor | string | — | no | HTML-атрибут `for` для `<label>` |
labelTooltip | QuestionTooltipProps | — | no | Подсказка (question-tooltip) у заголовка |
layoutPresets | Partial<Record<LayoutType, Partial<{ autoFocus: boolean; }>>> | — | no | Переопределение адаптивных дефолтов по раскладке. Участвует `autoFocus`: на mobile он выключен (открывает клавиатуру без действия). Вернуть на mobile — `layoutPresets={{ mobile: { autoFocus: true } }}`. |
length | FieldLength | — | no | Счётчик длины `current/max` |
maxLength | number | — | no | Максимальное количество символов |
maxRows | number | 1000 | no | Максимальное количество строк (после — появляется скролл) |
minRows | number | 3 | no | Минимальное количество строк |
name | string | — | no | HTML name |
onBlur | ((event: FocusEvent<HTMLTextAreaElement, Element>) => void) | — | no | Колбек блюра |
onChange | ((value: string, event?: ChangeEvent<HTMLTextAreaElement>) => void) | — | no | Колбек смены значения |
onCopyButtonClick | (() => void) | — | no | Колбек после копирования |
onFocus | ((event: FocusEvent<HTMLTextAreaElement, Element>) => void) | — | no | Колбек фокуса |
onKeyDown | ((event: KeyboardEvent<HTMLTextAreaElement>) => void) | — | no | Колбек нажатия клавиши |
placeholder | string | — | no | Плейсхолдер |
readonly | boolean | — | no | Только для чтения |
required | boolean | — | no | Показать знак обязательности `*` |
resizable | boolean | false | no | Можно ли менять высоту мышкой за нижний угол. Игнорируется при `disabled` или `readonly`. |
showClearButton | boolean | true | no | Кнопка очистки (видна при value && !readonly) |
showCopyButton | boolean | true | no | Кнопка копирования (видна при value && !disabled, независимо от readonly) |
showHintIcon | boolean | — | no | Отображение статус-иконки у подсказки (по умолчанию `true`) |
size | "l" | "m" | "s" | m | no | Размер |
spellCheck | boolean | — | no | Проверка орфографии |
validationState | "default" | "error" | "success" | "warning" | default | no | Состояние валидации |
value | string | — | no | Значение (controlled-режим) |