FieldPhone

Телефонное поле поверх FieldText. В ведущем слоте — селектор страны (AdaptiveDroplist из @cloud-ru/ds-list) с флагом и кодом; маска ввода динамически подстраивается под выбранную страну. При вставке номера из буфера страна определяется автоматически (awesome-phonenumber).

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

  • Ввод телефона с международным выбором страны.
  • Нужен авто-детект страны по вставленному номеру и маскирование под формат страны.

Когда не нужен FieldPhone:

  • Произвольный форматированный ввод без телефона — FieldMask.

Анатомия

Селектор страны

Ведущий слот (elementBefore) — флаг выбранной страны + код (+7, +1, …). Клик открывает AdaptiveDroplist со списком стран и поиском. Если доступна одна страна — селектор скрывается, остаётся только код в префиксе.

Mask

Маска ввода определяется выбранной страной (country.mask) и меняется при смене страны. Префикс с кодом страны добавляется к итоговому значению.

options — настройка списка стран

Проп options (CountrySettings) ограничивает или переопределяет список (взаимоисключающие поля):

  • includedCountries — оставить только перечисленные страны.
  • excludedCountries — исключить перечисленные из встроенного списка.
  • overriddenOptions — полностью заменить список собственными опциями.

Size (default m)

Размер поля наследуется от FieldText: s, m, l.

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

Базовый

БазовыйТелефон с полным списком стран и поиском.
+7
tsx
import { PortalContextProvider } from '@cloud-ru/ds-portal-context';
import { FieldPhone } from '@cloud-ru/ds-uikit-product-fields-predefined';
import { useRef, useState } from 'react';

export function FieldPhoneBasic() {
  const hostRef = useRef<HTMLDivElement>(null);
  const [value, setValue] = useState('');

  return (
    <PortalContextProvider root={hostRef}>
      <div ref={hostRef} style={{ position: 'relative', width: 320 }}>
        <FieldPhone label='Телефон' value={value} onChange={setValue} searchPlaceholder='Поиск страны' />
      </div>
    </PortalContextProvider>
  );
}

Ограниченный список стран

Ограниченный список странoptions.includedCountries оставляет только страны СНГ.
+7
tsx
import { PortalContextProvider } from '@cloud-ru/ds-portal-context';
import {
  ARMENIA_COUNTRY_CODE,
  BELARUS_COUNTRY_CODE,
  FieldPhone,
  KAZAKHSTAN_COUNTRY_CODE,
  RUSSIA_COUNTRY_CODE,
} from '@cloud-ru/ds-uikit-product-fields-predefined';
import { useRef, useState } from 'react';

export function FieldPhoneCountrySettings() {
  const hostRef = useRef<HTMLDivElement>(null);
  const [value, setValue] = useState('');

  return (
    <PortalContextProvider root={hostRef}>
      <div ref={hostRef} style={{ position: 'relative', width: 320 }}>
        <FieldPhone
          label='Телефон (СНГ)'
          value={value}
          onChange={setValue}
          options={{
            includedCountries: [
              RUSSIA_COUNTRY_CODE,
              BELARUS_COUNTRY_CODE,
              KAZAKHSTAN_COUNTRY_CODE,
              ARMENIA_COUNTRY_CODE,
            ],
          }}
        />
      </div>
    </PortalContextProvider>
  );
}

Props

Types

PropsFieldPhoneProps
PropTypeDefaultRequiredDescription
autoCompletestring | booleanfalsenoВключен ли автокомплит для поля
autoFocusbooleanfalsenoВключен ли авто-фокус для поля
backgroundbooleantruenoФон поля (acrylic)
captionstringnoВторичная подпись справа
classNamestringnoCSS-класс CSS-класс корня `FieldDecorator`
data-test-idstringno
defaultValuestringnoНачальное значение (uncontrolled-режим)
disabledbooleanfalsenoПоле выключено Является ли поле деактивированным
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`.
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) & ((value: string) => void))noКолбек смены значения
onChangeCountry((country: FieldPhoneOptionsProps) => void)no
onClearButtonClick(() => void)noКолбек клика по кнопке очистки
onClickMouseEventHandler<HTMLInputElement>noКолбек обработки клика
onCopyButtonClick(() => void)noКолбек после копирования значения в буфер
onFocusFocusEventHandler<HTMLInputElement>noКолбек обработки получения фокуса
onKeyDownKeyboardEventHandler<HTMLInputElement>noКолбек обработки начала нажатия клавиши клавиатуры
onMouseDownMouseEventHandler<HTMLInputElement>noКолбек обработки нажатия кнопки мыши
onPasteClipboardEventHandler<HTMLInputElement>noКолбек обработки вставки значения
optionsCountrySettingsnoКонфигурация для изменения стандартного списка стран
outlinebooleantruenoРазделитель между основным полем и слотами `elementBefore` / `elementAfter`
patternstringnoРегулярное выражение валидного инпута
readonlybooleanfalsenoТолько для чтения Является ли поле доступным только для чтения
requiredbooleannoПоказать знак обязательности `*`
scrollListbooleannoСкролл с ограничением высоты для списка стран. По умолчанию включён.
searchPlaceholderstringnoПлейсхолдер поля поиска в выпадающем списке стран
showClearButtonbooleantruenoПоказывать кнопку очистки значения (как в Search)
showCopyButtonbooleantruenoПоказывать кнопку копирования значения (только при `readonly = true` и непустом `value`)
showHintIconbooleannoОтображение статус-иконки у подсказки (по умолчанию `true`)
size"l" | "m" | "s"noРазмер
spellCheckbooleantruenoЗначение атрибута spellcheck (проверка орфографии)
stepstring | numbernoМаксимальное значение поля
tabIndexnumber0noЗначение атрибута tab-index
type"email" | "number" | "password" | "tel" | "text" | "url"noТип инпута
validationState"default" | "error" | "success" | "warning"noСостояние валидации
valuestringnoЗначение поля (controlled-режим)

Types

FieldPhoneProps

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

Выбор страны — адаптивный Droplist из @cloud-ru/ds-list: на desktop анкорный popover, на mobile — список в BottomSheet. Раскладку даёт AdaptiveProvider (@cloud-ru/ds-adaptive); отдельного пропа layoutType нет.

autoFocus на mobile выключается (наследуется из @cloud-ru/ds-fields) — вернуть можно пропом layoutPresets={{ mobile: { autoFocus: true } }}.

Storybook

Figma