Перейти к содержимому
v2.5.0
English
Русский
Документация

PinField

PinField — составной компонент для кодов фиксированной длины, таких как одноразовые коды (OTP) и PIN.

Обзор

Стили PinField разделены между сеткой слотов, видимыми слотами и необязательным разделителем. PinFieldInput визуально скрыт и не задаёт контракт поверхности.

Публичные CSS-переменные

ПеременнаяЗначениеВлияет на
базовый размер слотаслот
В этом состоянии изменений не видно
коэффициент скругления слотаслот
В этом состоянии изменений не видно
поверхность слота по умолчаниюслот
В этом состоянии изменений не видно
поверхность слота при наведениислот
В этом состоянии изменений не видно
активный контурактивный слот
В этом состоянии изменений не видно
контур ошибкислот с ошибкой
В этом состоянии изменений не видно
цвет разделителя группразделитель
В этом состоянии изменений не видно
Высота каретки в активном слоте.PinFieldSlot
В этом состоянии изменений не видно

Переменные частей

Корень

Корень — flex-строка, расставляющая слоты с gap: var(--spacing-3).

Слот

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

Разделитель

Разделитель использует токены ширины для конкретного размера и линию толщиной 1px.

Взаимодействие состояний и вариантов

  • размер меняет габариты слота и шкалу шрифта
  • активное состояние меняет цвет контура
  • состояние плейсхолдера меняет цвет текста в слоте
  • отключённое состояние и состояние ошибки переназначают цвета слотов, не меняя раскладку

Примеры

Сгруппированные слоты одноразового кода

Каждый слот сам задаёт --input-br-ratio, поэтому переопределение ставится на слоты, а промежуток — обычный CSS на корне.

grouped-otp-slots.tsx · 19 строк
import type { CSSProperties } from 'react';
import { PinField, PinFieldInput, PinFieldSeparator, PinFieldSlot } from '@vega-ui/react';

const roundSlot = { '--input-br-ratio': 0.5 } as CSSProperties;

export default function GroupedOtpSlots() {
  return (
    <PinField size='lg' maxLength={6} style={{ gap: 'var(--spacing-6)' }}>
      <PinFieldInput aria-label='Sign-in code' autoComplete='one-time-code' />
      <PinFieldSlot index={0} style={roundSlot} />
      <PinFieldSlot index={1} style={roundSlot} />
      <PinFieldSlot index={2} style={roundSlot} />

Чего не переопределять

  • не нарушайте квадратное соотношение ширины и высоты слота
  • не стилизуйте разделители так, будто это редактируемые слоты
  • не скрывайте состояния активного фокуса и контура