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.

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

Базовый

БазовыйStandalone-режим с валидацией длины.
Optional
0/255
tsx
import { FieldDescription } from '@cloud-ru/ds-uikit-product-fields-predefined';

export function FieldDescriptionBasic() {
  return <FieldDescription />;
}

С кнопкой «Добавить»

С кнопкой «Добавить»Необязательное поле, свёрнутое в кнопку.
tsx
import { FieldDescription } from '@cloud-ru/ds-uikit-product-fields-predefined';

export function FieldDescriptionWithAddButton() {
  return <FieldDescription addButton />;
}

React Hook Form

React Hook FormFieldDescriptionRHF внутри FormProvider.
Optional
0/255
tsx
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

PropsFieldDescriptionProps
PropTypeDefaultRequiredDescription
addButtonboolean—noПоле появляется по кнопке «Добавить описание» (только для опционального поля)
allowMoreThanMaxLengthbooleantruenoРазрешить ввод свыше `maxLength` символов (счётчик продолжит расти).
autoFocusboolean—noАвтофокус. На mobile выключается адаптивно (см. `layoutPresets`)
backgroundbooleantruenoФон поля (acrylic)
classNamestring—noCSS-класс CSS-класс корня `FieldDecorator`
customSchemaStringSchema<string, AnyObject, undefined, "">—noДополнительная yup-схема, которая конкатенируется к встроенной
data-test-idstring—no
defaultValuestring—noНачальное значение (uncontrolled-режим)
disabledboolean—noПоле выключено
errorstring—noОшибка (приоритетнее `hint`; форсит `validationState=error`)
fieldClassNamestring—noCSS-класс оболочки поля
headerReactNode—noНода над textarea — ряд элементов до контента (Figma `elementWrapperBefore` / `slotBeforeContent`): тулбар с кнопками, чипами и т.п.
idstring—noHTML id
innerRefRef<HTMLDivElement>—noRef на корневой DOM-элемент
labelForstring—noHTML-атрибут `for` для `<label>`
labelTooltipQuestionTooltipProps—noПодсказка (question-tooltip) у заголовка
layoutPresetsPartial<Record<LayoutType, Partial<{ autoFocus: boolean; }>>>—noПереопределение адаптивных дефолтов по раскладке. Участвует `autoFocus`: на mobile он выключен (открывает клавиатуру без действия). Вернуть на mobile — `layoutPresets={{ mobile: { autoFocus: true } }}`.
lengthFieldLength—noСчётчик длины `current/max`
maxLengthnumber255noМаксимальное количество символов
maxRowsnumber1000noМаксимальное количество строк (после — появляется скролл)
minRowsnumber3noМинимальное количество строк
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-режиме)
readonlyboolean—noТолько для чтения
requiredbooleanfalsenoПоказать знак обязательности `*`
resizablebooleantruenoМожно ли менять высоту мышкой за нижний угол. Игнорируется при `disabled` или `readonly`.
showClearButtonbooleantruenoКнопка очистки (видна при value && !readonly)
showCopyButtonbooleantruenoКнопка копирования (видна при непустом value в режиме readonly, как у остальных полей)
showCopyButtonInEditModebooleanfalsenoПоказывать кнопку копирования и в обычном (не readonly) режиме — рядом с кнопкой очистки. Опция только для textarea: в многострочном поле копирование значения осмысленно и при вводе.
showHintIconboolean—noОтображение статус-иконки у подсказки (по умолчанию `true`)
size"l" | "m" | "s"mnoРазмер
spellCheckboolean—noПроверка орфографии
validationState"default" | "error" | "success" | "warning"—noСостояние валидации
valuestring—noЗначение (controlled-режим)

Types

FieldDescriptionProps

Адаптивность

autoFocus на mobile выключается (наследуется из @cloud-ru/ds-fields) — автофокус там открывает экранную клавиатуру без действия пользователя. Раскладка читается из AdaptiveProvider (@cloud-ru/ds-adaptive); отдельного пропа layoutType нет. Вернуть автофокус на mobile — пропом layoutPresets:

<FieldDescription autoFocus layoutPresets={{ mobile: { autoFocus: true } }} />

size от раскладки не зависит — задаётся пропом (по умолчанию m) одинаково на всех раскладках.

Storybook