Кастомизация шаблонов для карт

Форматирование банковских карт в Cleave.js основано на предопределённых и пользовательских шаблонах, которые определяют структуру группировки цифр, поведение ввода и правила определения типа карты. Несмотря на наличие встроенной поддержки основных платёжных систем, реальная гибкость достигается за счёт переопределения шаблонов и создания собственных масок под конкретные бизнес-требования.

Базовый механизм шаблонов карт

В основе работы с картами в Cleave.js лежит параметр creditCard, который включает автоматическое определение типа карты и применение соответствующего шаблона форматирования.

Каждый шаблон представляет собой описание:

  • длины номера карты;
  • правил группировки цифр;
  • регулярного выражения для определения типа;
  • отображаемого типа (например, visa, mastercard);
  • fallback-шаблона для неизвестных карт.

Встроенный механизм работает по следующему принципу: при вводе данных библиотека последовательно проверяет номер карты на соответствие регулярным выражениям и применяет первый подходящий шаблон.

Переопределение стандартных шаблонов

Cleave.js позволяет переопределять стандартные шаблоны через параметр creditCardStrictMode и пользовательский массив creditCardType.

Структура пользовательского типа карты включает следующие поля:

  • type — идентификатор карты;
  • pattern — регулярное выражение для определения BIN-диапазона;
  • format — массив группировки цифр;
  • length — допустимые длины номера;
  • cidrlength — длина CVC/CVV (если требуется расширенная валидация);
  • luhn — необходимость проверки алгоритмом Луна.

Пример концептуальной структуры:

{
  type: 'customcard',
  pattern: /^9999/,
  format: [4, 4, 4, 4],
  length: [16],
  luhn: true
}

Управление форматированием через format-шаблоны

Ключевым элементом кастомизации является поле format, которое определяет визуальную структуру номера карты.

Каждое число в массиве format обозначает длину блока символов. Например:

  • [4, 4, 4, 4] — классическая 16-значная карта;
  • [4, 6, 5] — нестандартные структуры;
  • [4, 4, 4, 7] — расширенные форматы для корпоративных карт.

При вводе Cleave.js автоматически вставляет разделители после достижения длины каждого блока. По умолчанию используется пробел, однако его можно заменить через delimiter.

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

Параметр delimiter позволяет изменить визуальное оформление карты без изменения логики группировки.

Поддерживаются следующие варианты:

  • пробел (' ') — стандартный формат;
  • дефис ('-') — часто используется в корпоративных системах;
  • точка ('.') — применяется в локальных интерфейсах;
  • кастомные символы, включая двойные разделители.

Пример конфигурации:

new Cleave(input, {
    creditCard: true,
    delimiter: '-'
});

Изменение разделителя влияет только на отображение, но не на внутреннее значение поля, которое хранится без форматирования.

Расширение набора поддерживаемых карт

В реальных интеграциях часто требуется поддержка локальных или частных платёжных систем, которые отсутствуют в стандартной библиотеке. В таких случаях добавляются кастомные BIN-диапазоны и правила распознавания.

Основной принцип — создание точных регулярных выражений для первых цифр карты.

Пример добавления нестандартной карты:

const customCards = [
  {
    type: 'localpay',
    pattern: /^2200/,
    format: [4, 4, 4, 4],
    length: [16]
  }
];

Далее массив передаётся в конфигурацию Cleave.js через расширенные настройки.

Приоритеты шаблонов и конфликт правил

При наличии нескольких совпадающих шаблонов Cleave.js использует порядок приоритета:

  1. наиболее специфичное регулярное выражение;
  2. более длинный BIN-паттерн;
  3. порядок объявления в массиве.

Это означает, что при перекрывающихся диапазонах важно правильно выстраивать структуру pattern, избегая слишком общих выражений.

Типичная ошибка — использование широких масок вроде /^4/ для Visa-подобных карт, что может конфликтовать с более конкретными диапазонами.

Динамическая смена шаблонов

Cleave.js позволяет изменять шаблон карты после инициализации. Это особенно важно для сценариев, где тип карты определяется сервером или внешним API.

При обновлении шаблона необходимо учитывать:

  • пересчёт уже введённых данных;
  • сброс неподходящих значений;
  • повторную валидацию длины.

Логика обновления обычно реализуется через пересоздание экземпляра или обновление конфигурации с последующим ре-инициализационным вызовом.

Работа с нестандартной длиной карт

Некоторые платёжные системы используют длины номеров, отличные от стандартных 16 цифр. Cleave.js поддерживает это через массив length, который определяет допустимые варианты.

Пример:

{
  type: 'extendedcard',
  pattern: /^1234/,
  format: [4, 4, 4, 4, 3],
  length: [19]
}

При этом важно учитывать, что алгоритм Луна может не применяться ко всем типам карт, поэтому параметр luhn должен быть явно отключён при необходимости.

Совмещение кастомных шаблонов с автодетектом

Автоматическое определение типа карты основано на последовательной проверке паттернов. При добавлении кастомных шаблонов они включаются в общий пул проверки.

Особенности поведения:

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

Для стабилизации поведения часто используют строгие режимы, ограничивающие переключение типа карты после достижения определённой длины.

Ограничение ввода и защита от некорректных шаблонов

Кастомизация шаблонов должна учитывать ограничения ввода, чтобы избежать некорректных состояний. Основные меры:

  • ограничение максимальной длины через length;
  • строгие регулярные выражения без перекрытий;
  • фиксированная структура format;
  • отключение автоопределения при необходимости.

Нарушение этих правил приводит к ситуации, когда вводимые данные могут «прыгать» между форматами, создавая нестабильный UX.

Использование кастомных шаблонов в корпоративных системах

В корпоративных платёжных решениях часто требуется поддержка:

  • внутренних карт лояльности;
  • виртуальных корпоративных счетов;
  • региональных платежных провайдеров;
  • тестовых BIN-диапазонов.

В таких случаях Cleave.js используется не только как форматтер, но и как слой первичной валидации структуры номера. Шаблоны становятся частью бизнес-логики интерфейса, а не просто визуальным инструментом.

Особое внимание уделяется согласованию фронтенд- и бэкенд-правил, чтобы исключить расхождения в допустимых форматах.

Поведение шаблонов при вставке и автозаполнении

При вставке полного номера карты Cleave.js применяет шаблон сразу ко всему значению. Если вставленный номер не соответствует ни одному паттерну, применяется fallback-формат или базовое отображение без специфической группировки.

Автозаполнение браузера может обходить пошаговую проверку ввода, поэтому шаблоны должны быть устойчивыми к мгновенному заполнению поля.

В таких случаях ключевую роль играет корректно заданный pattern, обеспечивающий однозначное определение типа карты даже при отсутствии поэтапного ввода.

Стабильность кастомных шаблонов в сложных сценариях

При большом количестве кастомных карт возрастает вероятность конфликтов между шаблонами. Для обеспечения стабильности используются следующие принципы:

  • минимизация пересечений BIN-диапазонов;
  • явное разделение региональных и международных карт;
  • тестирование всех вариантов ввода;
  • приоритизация наиболее используемых типов.

Правильно настроенные шаблоны обеспечивают предсказуемое форматирование независимо от источника ввода и скорости набора данных.