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)

ЗначениеКогда
sInline-формы, плотные таблицы
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 (default true).
  • showCopyButton — кнопка копирования значения в буфер. Видна при непустом value в режиме readonly!disabled, default true). После нажатия кратко показывает галочку-подтверждение.

Кнопки попадают в Tab-навигацию через postfix-стрелки, как у FieldText.

Слот footer рендерится отдельной строкой под <textarea> внутри границы поля — для действий, плагинов-счётчиков или подсказок, привязанных к самому полю (в отличие от hint/caption, которые живут в FieldDecorator снаружи).

Установка

pnpm add @cloud-ru/ds-fields
import { FieldTextArea } from '@cloud-ru/ds-fields'

Примеры использования

Базовое поле

Базовое полеControlled FieldTextArea с минимальной высотой 3 строки и потолком 8 строк (дальше скролл).
До 500 символов
tsx
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}
    />
  );
}

Изменяемый размер

Изменяемый размерresizable={true} даёт ручку в правом нижнем углу.
Можно изменить высоту мышью
tsx
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}
    />
  );
}

Счётчик длины

Счётчик длиныmaxLength автоматически рисует счётчик «текущая/максимум».
Кратко о себе
0/120
tsx
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

UncontrolledБез value/onChange: начальное значение задаётся через defaultValue, дальше поле управляет состоянием само.
Uncontrolled: начальное значение через defaultValue
tsx
import { FieldTextArea } from '@cloud-ru/ds-fields';

export function TextAreaUncontrolled() {
  return (
    <FieldTextArea
      label='Заметка'
      hint='Uncontrolled: начальное значение через defaultValue'
      defaultValue={'Первая строка\nВторая строка'}
      minRows={3}
      maxRows={8}
    />
  );
}

Readonly с копированием

Readonly с копированиемreadonly показывает кнопку копирования значения в буфер; текст приглушён.
tsx
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

PropsFieldTextAreaProps
PropTypeDefaultRequiredDescription
allowMoreThanMaxLengthbooleantruenoРазрешить ввод свыше `maxLength` символов (счётчик продолжит расти).
autoFocusbooleannoАвтофокус. На mobile выключается адаптивно (см. `layoutPresets`)
backgroundbooleantruenoФон поля (acrylic)
captionstringnoВторичная подпись справа
classNamestringnoCSS-класс CSS-класс корня `FieldDecorator`
data-test-idstringno
defaultValuestringnoНачальное значение (uncontrolled-режим)
disabledbooleannoПоле выключено
errorstringnoОшибка (приоритетнее `hint`; форсит `validationState=error`)
fieldClassNamestringnoCSS-класс оболочки поля
footerReactNodenoНода под textarea — ряд элементов после контента (Figma `elementWrapperAfter` / `slotAfterContent`): действия, счётчик-плагин и т.п.
headerReactNodenoНода над textarea — ряд элементов до контента (Figma `elementWrapperBefore` / `slotBeforeContent`): тулбар с кнопками, чипами и т.п.
hintstringnoПодсказка
idstringnoHTML id
innerRefRef<HTMLDivElement>noRef на корневой DOM-элемент
inputMode"decimal" | "email" | "none" | "numeric" | "search" | "tel" | "text" | "url"noРежим виртуальной клавиатуры (`inputmode` нативного `<textarea>`)
labelstringnoЗаголовок
labelForstringnoHTML-атрибут `for` для `<label>`
labelTooltipQuestionTooltipPropsnoПодсказка (question-tooltip) у заголовка
layoutPresetsPartial<Record<LayoutType, Partial<{ autoFocus: boolean; }>>>noПереопределение адаптивных дефолтов по раскладке. Участвует `autoFocus`: на mobile он выключен (открывает клавиатуру без действия). Вернуть на mobile — `layoutPresets={{ mobile: { autoFocus: true } }}`.
lengthFieldLengthnoСчётчик длины `current/max`
maxLengthnumbernoМаксимальное количество символов
maxRowsnumber1000noМаксимальное количество строк (после — появляется скролл)
minRowsnumber3noМинимальное количество строк
namestringnoHTML 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Колбек нажатия клавиши
placeholderstringnoПлейсхолдер
readonlybooleannoТолько для чтения
requiredbooleannoПоказать знак обязательности `*`
resizablebooleanfalsenoМожно ли менять высоту мышкой за нижний угол. Игнорируется при `disabled` или `readonly`.
showClearButtonbooleantruenoКнопка очистки (видна при value && !readonly)
showCopyButtonbooleantruenoКнопка копирования (видна при value && !disabled, независимо от readonly)
showHintIconbooleannoОтображение статус-иконки у подсказки (по умолчанию `true`)
size"l" | "m" | "s"mnoРазмер
spellCheckbooleannoПроверка орфографии
validationState"default" | "error" | "success" | "warning"defaultnoСостояние валидации
valuestringnoЗначение (controlled-режим)

Types

FieldTextAreaProps

Storybook

Figma