FieldDescription
Многострочное поле описания поверх FieldTextArea с встроенной yup-валидацией длины (до 255 символов, со счётчиком). По умолчанию необязательное. Доступно в двух вариантах: standalone (FieldDescription, локальный стейт + onValidationError) и FieldDescriptionRHF (react-hook-form через Controller). Опционально может сворачиваться в кнопку «Добавить описание».
Когда использовать
- Ввод необязательного/обязательного описания сущности с ограничением длины.
- В форме на react-hook-form — вариант
FieldDescriptionRHF. - Когда описание необязательно и его лучше скрыть до клика —
addButton.
Когда не нужен FieldDescription:
- Короткое однострочное имя —
FieldName.
Анатомия
Валидация
Встроенная схема (yup): обрезка пробелов (trim) и ограничение длины maxLength (по умолчанию 255) с сообщением и счётчиком. customSchema конкатенируется к встроенной. При required добавляется проверка обязательности.
addButton
Если addButton и поле необязательное (required={false}) — вместо textarea показывается кнопка «Добавить описание». Клик раскрывает поле и ставит в него фокус.
Режимы
FieldDescription— локальный стейт, ошибка отдаётся черезonValidationError(error).FieldDescriptionRHF—controllerPropsдля react-hook-form.
Size (default m)
Размер поля наследуется от FieldTextArea: s, m, l.
Примеры использования
Базовый
import { FieldDescription } from '@cloud-ru/ds-uikit-product-fields-predefined';
export function FieldDescriptionBasic() {
return <FieldDescription />;
}С кнопкой «Добавить»
import { FieldDescription } from '@cloud-ru/ds-uikit-product-fields-predefined';
export function FieldDescriptionWithAddButton() {
return <FieldDescription addButton />;
}React Hook Form
import { Button } from '@cloud-ru/ds-button';
import { FieldDescriptionRHF } from '@cloud-ru/ds-uikit-product-fields-predefined';
import { FormProvider, useForm } from 'react-hook-form';
type FormValues = { description: string };
export function FieldDescriptionRHFExample() {
const methods = useForm<FormValues>({ defaultValues: { description: '' }, mode: 'onBlur' });
return (
<FormProvider {...methods}>
<form
onSubmit={methods.handleSubmit(values => alert(`description: ${values.description}`))}
style={{ display: 'flex', flexDirection: 'column', gap: 12, width: 360 }}
>
<FieldDescriptionRHF controllerProps={{ name: 'description' }} />
<Button type='submit' label='Отправить' />
</form>
</FormProvider>
);
}Props
Types
FieldDescriptionProps| Prop | Type | Default | Required | Description |
|---|---|---|---|---|
addButton | boolean | — | no | Поле появляется по кнопке «Добавить описание» (только для опционального поля) |
allowMoreThanMaxLength | boolean | true | no | Разрешить ввод свыше `maxLength` символов (счётчик продолжит расти). |
autoFocus | boolean | — | no | Автофокус. На mobile выключается адаптивно (см. `layoutPresets`) |
background | boolean | true | no | Фон поля (acrylic) |
className | string | — | no | CSS-класс CSS-класс корня `FieldDecorator` |
customSchema | StringSchema<string, AnyObject, undefined, ""> | — | no | Дополнительная yup-схема, которая конкатенируется к встроенной |
data-test-id | string | — | no | |
defaultValue | string | — | no | Начальное значение (uncontrolled-режим) |
disabled | boolean | — | no | Поле выключено |
error | string | — | no | Ошибка (приоритетнее `hint`; форсит `validationState=error`) |
fieldClassName | string | — | no | CSS-класс оболочки поля |
header | ReactNode | — | no | Нода над textarea — ряд элементов до контента (Figma `elementWrapperBefore` / `slotBeforeContent`): тулбар с кнопками, чипами и т.п. |
id | string | — | no | HTML id |
innerRef | Ref<HTMLDivElement> | — | no | Ref на корневой DOM-элемент |
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 | 255 | no | Максимальное количество символов |
maxRows | number | 1000 | no | Максимальное количество строк (после — появляется скролл) |
minRows | number | 3 | no | Минимальное количество строк |
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 | Колбек нажатия клавиши |
onValidationError | ((error: ValidationError | null) => void) | — | no | Колбэк, вызываемый при изменении ошибки валидации (только в standalone-режиме) |
readonly | boolean | — | no | Только для чтения |
required | boolean | false | no | Показать знак обязательности `*` |
resizable | boolean | true | 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" | — | no | Состояние валидации |
value | string | — | no | Значение (controlled-режим) |
Types
FieldDescriptionProps
Related props
FieldLayoutPresets
FieldLength
QuestionTooltipProps
Size
ValidationState
Адаптивность
autoFocus на mobile выключается (наследуется из @cloud-ru/ds-fields) — автофокус там открывает экранную клавиатуру без действия пользователя. Раскладка читается из AdaptiveProvider (@cloud-ru/ds-adaptive); отдельного пропа layoutType нет. Вернуть автофокус на mobile — пропом layoutPresets:
<FieldDescription autoFocus layoutPresets={{ mobile: { autoFocus: true } }} />
size от раскладки не зависит — задаётся пропом (по умолчанию m) одинаково на всех раскладках.