Skip to content

CdsOtpInput

New in v4.0

Поле ввода одноразового кода — из SMS, письма или приложения-аутентификатора. Внешне это ряд отдельных ячеек, но ввод принимает один скрытый input: поэтому работают автозаполнение кода из SMS, вставка целой строкой из буфера, выделение и стрелки, а фокус не приходится перепрыгивать между ячейками вручную.

Storybook GitLab
Покрытие тестами: 93% — хорошее покрытие
API в спеках
44 / 44 пропсы, события, слоты и exposed, у которых есть тест
Тест-кейсы
78 юнит · 3 браузерных
Известные баги
5 зафиксированы тестом it.fails
Покрытие кода
93.4% строк · 85.6% ветвей замер v4.0.0-alpha.13
A11y (axe)
3 рекомендаций в 13 историях замер v4.0.0-alpha.11

Для обычного короткого текста или числа возьмите CdsTextInput: CdsOtpInput нужен там, где длина ввода известна заранее и каждый символ показывается отдельной ячейкой.

Анатомия ​

Ячейки (CdsOtpField) только рисуют код — введённый символ, заполнитель или мигающую каретку. Настоящий ввод принимает скрытый input: он прижат к нижнему краю компонента, поэтому подсказка автозаполнения из SMS появляется под ячейками и ничего не перекрывает. Между ячейками может стоять разделитель (CdsOtpSeparator), а в слитном виде ячейки собираются в группу (CdsOtpGroup).

Вариации ​

Длина и тип кода ​

Свойство length задаёт число ячеек, type — что можно вводить: number (по умолчанию) принимает только цифры и открывает цифровую клавиатуру на мобильных, text — любые символы, password дополнительно скрывает введённое точками. Тот же эффект без смены типа даёт masked.

Sandbox Storybook

Допустимые символы ​

Свойство pattern сужает набор символов: имя готового набора (numeric, alpha, alphanumeric, unicode-alpha, unicode-alphanumeric) или своё регулярное выражение. Проверка идёт посимвольно — лишние символы не попадут в поле ни с клавиатуры, ни из буфера обмена.

Sandbox Storybook

Разделитель ​

Свойство divider ставит символ между ячейками — например, дефис в коде вида 123-456. Слот divider даёт полную свободу разметки и получает index — номер ячейки слева от разделителя, так что разделитель можно поставить только в нужном месте.

Sandbox Storybook

Слитный вид ​

Свойство merged убирает промежутки: ячейки становятся одним полем с общей рамкой. Такой вид компактнее и меньше дробит форму.

Sandbox Storybook

Заполнитель ​

Свойство placeholder показывает символ в пустых ячейках — подсказку формата или просто точку, чтобы ряд не выглядел пустым.

Sandbox Storybook

Размеры ​

Свойство size меняет высоту ячеек и размер шрифта. Размер по умолчанию — md.

Sandbox Storybook

Состояния ​

disabled блокирует ввод, error подсвечивает весь ряд ошибкой, loading показывает индикатор поверх ячеек и не стирает набранный код. focus-all подсвечивает весь ряд, пока поле в фокусе, а не только активную ячейку.

Sandbox Storybook

Слоты ​

СлотОписание
fieldsРяд ячеек целиком — своя разметка из CdsOtpGroup, CdsOtpField и CdsOtpSeparator
dividerРазделитель между ячейками, index — номер ячейки слева от него
loaderСвой индикатор загрузки (при loading)
defaultПроизвольный контент поверх ячеек

Слот fields нужен, когда ячейки собираются в группы: каждая CdsOtpField получает свой index, а CdsOtpGroup объединяет соседние ячейки в общую рамку.

Sandbox Storybook

Рекомендации ​

Сценарии использования ​

Подтверждение по SMS ​

Событие finish срабатывает, как только код набран целиком, — отправляйте запрос по нему, отдельная кнопка не нужна. На время проверки включите loading: код остаётся на экране, а поле не выглядит сломанным. Если сервер не принял код, error подсвечивает ряд, а методы reset() и focus() через ref очищают поле и возвращают в него курсор.

Sandbox Storybook

Повторная отправка кода ​

Кнопка «Отправить снова» открывается по таймеру — так пользователь не завалит запросами шлюз. Вместе с новым кодом сбрасывайте поле: reset() очищает ячейки, focus() ставит курсор в первую, и старый код не смешивается с новым.

Sandbox Storybook

Код в форме ​

Когда код — часть формы входа, оставьте кнопку подтверждения: она даёт явный момент отправки. Кнопка ждёт, пока набраны все символы, — длину кода видно из v-model, а disabled на поле фиксирует уже подтверждённый код.

Sandbox Storybook

API ​

CdsOtpInput ​

Пропсы

ИмяТипПо умолчаниюОписание
activeColorstring | undefined—Цвет компонента, когда он находится в активном состоянии
autofocusboolean | undefined—Включает автофокус
baseColorstring | undefined—Цвет неактивного компонента
bgColorstring | undefined—Цвет фона компонента
colorstring | undefined—Цвет компонента
disabledboolean | null | undefinednullЗаблокированное состояние
dividerstring | undefined—Символ-разделитель, который ставится между ячейками кода
errorboolean | undefined—Состояние ошибки
focusAllboolean | undefined—Подсвечивать все ячейки, пока поле находится в фокусе, а не только активную
focusedboolean | undefined—Управляет состоянием фокуса компонента. Когда true, компонент считается сфокусированным и может применять соответствующие стили или поведение.
heightstring | number | undefined—Высота компонента
labelstring | undefined'$cds.input.otp'Доступное имя поля (aria-label). Принимает ключ локализации вида $cds.input.otp
lengthstring | number | undefined6Количество ячеек кода
loadingstring | boolean | undefined—Индикатор загрузки для компонента
maskedboolean | undefined—Скрывать введённые символы точками
maxHeightstring | number | undefined—Максимальная высота компонента
maxWidthstring | number | undefined—Максимальная ширина компонента
mergedboolean | undefined—Слитный вид: ячейки объединяются в одно поле без промежутков между ними
minHeightstring | number | undefined—Минимальная высота компонента
minWidthstring | number | undefined—Минимальная ширина компонента
modelValuestring | number | undefined—Значение компонента v-model
patternRegExp | "numeric" | "alpha" | "alphanumeric" | "unicode-alpha" | "unicode-alphanumeric" | undefined—Допустимые символы: имя готового паттерна (numeric, alpha, alphanumeric, unicode-alpha, unicode-alphanumeric) или собственное регулярное выражение
placeholderstring | undefined—Символ-заполнитель, который показывается в пустой ячейке
sizenumber | "xs" | "sm" | "md" | "lg" | "xl" | undefined'md'Размер компонента
textColorstring | undefined—Цвет текста компонента
themestring | undefined—Тема компонента
typeCdsOtpInputType | undefined'number'Тип вводимого кода. number ограничивает ввод цифрами, password скрывает символы
widthstring | number | undefined—Ширина компонента

События

ИмяТипОписание
finish[value: string]Срабатывает, когда код набран полностью
update:focused[focused: boolean]Срабатывает при получении или потере фокуса
update:modelValue[value: string]Срабатывает при изменении значения компонента

Слоты

ИмяТипОписание
defaultanyПроизвольный контент поверх ячеек кода
divider{ index: number; }Разделитель между ячейками. index — номер ячейки слева от разделителя
fieldsanyПолностью заменяет ряд ячеек собственной разметкой из CdsOtpGroup, CdsOtpField и CdsOtpSeparator
loaderanyПользовательский индикатор загрузки

Exposed

ИмяТипОписание
blur() => voidСнять фокус с поля
focus() => voidУстановить фокус на поле
inputRefHTMLInputElement | undefinedRef-ссылка на скрытый input, который принимает ввод кода
isFocusedboolean | undefinedСостояние фокуса поля
reset() => voidОчистить введённый код

CdsOtpField ​

Пропсы

ИмяТипПо умолчаниюОписание
index*number—Порядковый номер ячейки, начиная с нуля

CdsOtpGroup ​

Пропсы

ИмяТипПо умолчаниюОписание
mergedboolean | null | undefinednullСлитный вид группы. По умолчанию наследуется от родительского CdsOtpInput

Слоты

ИмяТипОписание
defaultanyЯчейки кода группы

CdsOtpSeparator ​

Слоты

ИмяТипОписание
defaultanyСодержимое разделителя