FieldCombo

Текстовое поле со слотами вокруг строки ввода: текстовые префикс и постфикс, иконки слева и справа, кнопки-сегменты по краям. Всё остальное — размеры, валидация, кнопки очистки и копирования — совпадает с FieldText; слоты и есть единственное отличие.

Когда использовать

  • К значению нужна единица измерения или символ валюты — префикс либо постфикс.
  • Полю нужен ведущий маркер контекста — иконка слева.
  • Рядом с вводом нужно действие или выбор — кнопка-сегмент со своим выпадающим списком.
  • Слотов нет:
    • берите FieldText — у него та же раскладка без лишней поверхности API.

Анатомия

Оси size, validationState и background работают так же, как у FieldText.

Outline (default true)

Разделитель между основным полем и слотами elementBefore / elementAfter. outline = false убирает вертикальную линию — слот и поле визуально сливаются.

Слоты

  • prefix / postfix — текст по краям строки ввода, попадает в копируемое значение.
  • iconBefore / iconAfter — иконка внутри строки ввода, без своей зоны нажатия.
  • elementBefore / elementAfter — кнопка-сегмент со своей рамкой фокуса и опциональным droplist.

Установка

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

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

Префикс и постфикс

Префикс и постфиксТекстовые префикс/постфикс по краям инпута.
$
USD
tsx
import { FieldCombo } from '@cloud-ru/ds-fields';
import { useState } from 'react';

export function Affixes() {
  const [value, setValue] = useState('100');
  return <FieldCombo label='Сумма' prefix='$' postfix='USD' value={value} onChange={setValue} />;
}

Иконка слева

Иконка слеваiconBefore — визуальный маркер контекста (поиск, дата, валюта).
tsx
import { FieldCombo } from '@cloud-ru/ds-fields';
import { SearchSVG } from '@cloud-ru/ds-icons/interface/system';
import { useState } from 'react';

export function IconBefore() {
  const [value, setValue] = useState('');
  return (
    <FieldCombo label='Поиск' placeholder='Найти статью' iconBefore={<SearchSVG />} value={value} onChange={setValue} />
  );
}

Иконка справа

Иконка справаiconAfter — обычно подсказка/help (тултип не входит в FieldCombo, оборачивайте отдельно).
tsx
import { FieldCombo } from '@cloud-ru/ds-fields';
import { QuestionSVG } from '@cloud-ru/ds-icons/interface/system';
import { useState } from 'react';

export function IconAfter() {
  const [value, setValue] = useState('user@example.com');
  return (
    <FieldCombo
      label='Email'
      placeholder='user@example.com'
      iconAfter={<QuestionSVG />}
      value={value}
      onChange={setValue}
    />
  );
}

Иконка + префикс/постфикс

Иконка + префикс/постфиксСлоты iconBefore + prefix + postfix комбинируются — иконка идёт первой, текст — между ней и инпутом.
/мес
tsx
import { FieldCombo } from '@cloud-ru/ds-fields';
import { BankCardSVG } from '@cloud-ru/ds-icons/interface/web';
import { useState } from 'react';

export function IconAndAffix() {
  const [value, setValue] = useState('1234');
  return (
    <FieldCombo
      label='Сумма пополнения'
      iconBefore={<BankCardSVG />}
      prefix='₽'
      postfix='/мес'
      value={value}
      onChange={setValue}
    />
  );
}

Кнопка-слот слева

Кнопка-слот слеваelementBefore — split-кнопка слева (например, выбор даты, лупа поиска с действием).
tsx
import { FieldCombo } from '@cloud-ru/ds-fields';
import { CalendarSVG } from '@cloud-ru/ds-icons/interface/system';
import { useState } from 'react';

function formatToday(): string {
  return new Date().toLocaleDateString('ru-RU');
}

export function ElementBefore() {
  const [value, setValue] = useState('');
  return (
    <FieldCombo
      label='Дата'
      placeholder='12.04.2026'
      elementBefore={{
        action: <CalendarSVG />,
        onClick: () => setValue(formatToday()),
      }}
      value={value}
      onChange={setValue}
    />
  );
}

Кнопка-слот справа

Кнопка-слот справаelementAfter — split-кнопка справа (выбор валюты, единицы измерения, dropdown).
USD
tsx
import { FieldCombo } from '@cloud-ru/ds-fields';
import { useState } from 'react';

const CURRENCIES = [
  { id: 'USD', content: { label: 'USD — доллар' } },
  { id: 'EUR', content: { label: 'EUR — евро' } },
  { id: 'RUB', content: { label: 'RUB — рубль' } },
];

export function ElementAfter() {
  const [value, setValue] = useState('100');
  const [currency, setCurrency] = useState<string | number | undefined>('USD');
  return (
    <FieldCombo
      label='Валюта'
      placeholder='Сумма'
      postfix={currency}
      elementAfter={{
        action: currency,
        droplist: {
          items: CURRENCIES,
          closeDroplistOnItemClick: true,
          selection: {
            mode: 'single',
            value: currency,
            onChange: setCurrency,
          },
        },
      }}
      value={value}
      onChange={setValue}
    />
  );
}

Props

Types

PropsFieldComboProps
PropTypeDefaultRequiredDescription
allowMoreThanMaxLengthbooleanfalsenoРазрешить ввод свыше `maxLength` символов (счётчик продолжит расти).
autoCompletestring | booleanfalsenoВключен ли автокомплит для поля
autoFocusbooleanfalsenoВключен ли авто-фокус для поля
backgroundbooleantruenoФон поля (acrylic)
captionstringnoВторичная подпись справа
classNamestringnoCSS-класс CSS-класс корня `FieldDecorator`
data-test-idstringno
defaultValuestringnoНачальное значение (uncontrolled-режим)
disabledbooleanfalsenoПоле выключено Является ли поле деактивированным
elementAfterFieldElementSlotnoСлот справа (кнопка / селект с опциональным выпадающим списком)
elementBeforeFieldElementSlotnoСлот слева (кнопка / селект с опциональным выпадающим списком)
errorstringnoОшибка (приоритетнее `hint`; форсит `validationState=error`)
fieldClassNamestringnoCSS-класс оболочки поля ввода
hintstringnoПодсказка
iconAfterReactNodenoИконка справа от строки ввода
iconBeforeReactNodenoИконка слева от строки ввода
idstringnoЗначение html-атрибута id
innerRefRef<HTMLDivElement>noRef на корневой DOM-элемент
innerTestIds{ shell?: string; input?: string; } | undefinednoИдентификаторы внутренних слотов — оболочки и строки ввода. Нужны компонентам, которые рендерят `FieldCombo` под собственным именем (`FieldText`): их e2e адресует свои слоты, а не слоты `FieldCombo`.
inputMode"decimal" | "email" | "none" | "numeric" | "search" | "tel" | "text" | "url"noРежим работы экранной клавиатуры
labelstringnoЗаголовок
labelForstringnoHTML-атрибут `for` для `<label>`
labelTooltipQuestionTooltipPropsnoПодсказка (question-tooltip) у заголовка
layoutPresetsPartial<Record<LayoutType, Partial<{ autoFocus: boolean; }>>>noПереопределение адаптивных дефолтов по раскладке. Участвует `autoFocus`: на mobile он выключен (открывает клавиатуру без действия). Вернуть на mobile — `layoutPresets={{ mobile: { autoFocus: true } }}`.
lengthFieldLengthnoСчётчик длины `current/max`
maxnumbernoМаксимальное значение поля
maxLengthnumbernoМаксимальная длина вводимого значения
minnumbernoМинимальное значение поля
namestringnoЗначение html-атрибута name
onBlurFocusEventHandler<HTMLInputElement>noКолбек обработки потери фокуса
onChange((value: string) => void)noКолбек смены значения
onClearButtonClick(() => void)noКолбек клика по кнопке очистки
onClickMouseEventHandler<HTMLInputElement>noКолбек обработки клика
onCopyButtonClick(() => void)noКолбек после копирования значения в буфер
onFocusFocusEventHandler<HTMLInputElement>noКолбек обработки получения фокуса
onKeyDownKeyboardEventHandler<HTMLInputElement>noКолбек обработки начала нажатия клавиши клавиатуры
onMouseDownMouseEventHandler<HTMLInputElement>noКолбек обработки нажатия кнопки мыши
onPasteClipboardEventHandler<HTMLInputElement>noКолбек обработки вставки значения
outlinebooleantruenoРазделитель между основным полем и слотами `elementBefore` / `elementAfter`
patternstringnoРегулярное выражение валидного инпута
placeholderstringnoЗначение плейсхолдера
postfixReactNodenoПостфикс (текст или нода)
prefixReactNodenoПрефикс (текст или нода)
prefixIconReactNodenoВедущая иконка. @deprecated Используйте `iconBefore` — он приоритетнее, если заданы оба.
readonlybooleanfalsenoТолько для чтения Является ли поле доступным только для чтения
requiredbooleannoПоказать знак обязательности `*`
showClearButtonbooleantruenoПоказывать кнопку очистки значения (как в Search)
showCopyButtonbooleantruenoПоказывать кнопку копирования значения (только при `readonly = true` и непустом `value`)
showHintIconbooleannoОтображение статус-иконки у подсказки (по умолчанию `true`)
size"l" | "m" | "s"mnoРазмер
spellCheckbooleantruenoЗначение атрибута spellcheck (проверка орфографии)
stepstring | numbernoМаксимальное значение поля
tabIndexnumber0noЗначение атрибута tab-index
type"email" | "number" | "password" | "tel" | "text" | "url"noТип инпута
validationState"default" | "error" | "success" | "warning"defaultnoСостояние валидации
valuestringnoЗначение поля (controlled-режим)

Types

FieldComboProps

Storybook

Figma