Кастомные стили

Библиотека AutoNumeric опирается на принцип отделения логики форматирования чисел от визуального представления. Это позволяет полностью контролировать внешний вид поля ввода через CSS и программные хуки, не вмешиваясь в алгоритмы парсинга и форматирования. Кастомизация стилей охватывает как стандартные состояния input-элемента, так и динамические состояния, возникающие во время ввода, валидации и потери/получения фокуса.

Основная идея стилизации заключается в том, что AutoNumeric не заменяет DOM-структуру и не создаёт сложную обёртку вокруг элемента. Управление визуальным состоянием осуществляется через классы, атрибуты и события, что делает интеграцию с CSS-фреймворками предсказуемой.


Базовые CSS-состояния input-элемента

При инициализации AutoNumeric сохраняет стандартную структуру HTML-элемента <input> и добавляет поведенческие изменения, не нарушая работу CSS. Это означает, что базовые стили применяются так же, как к обычному полю ввода.

Ключевые состояния, которые учитываются при стилизации:

  • нормальное состояние (default)
  • фокус (focus)
  • disabled
  • readonly
  • состояние ошибки (если реализуется через внешнюю логику)
  • состояние форматированного значения

Пример базовой стилизации:

input.autonumeric {
    font-family: monospace;
    font-size: 14px;
    padding: 6px 10px;
    border: 1px solid #ccc;
    border-radius: 4px;
}

AutoNumeric не накладывает ограничений на naming classes, что позволяет использовать любые соглашения: BEM, utility-first или atomic CSS.


Стилизация состояния фокуса

Состояние фокуса играет ключевую роль, так как AutoNumeric временно изменяет представление значения при редактировании (например, убирает разделители тысяч или изменяет формат отображения в зависимости от конфигурации).

Фокус управляется стандартным псевдоклассом:

input.autonumeric:focus {
    border-color: #3b82f6;
    box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2);
    outline: none;
}

В ряде сценариев используется дополнительная логика через события focusin и focusout, позволяющая динамически добавлять классы:

const element = document.querySelector('#price');

element.addEventListener('focusin', () => {
    element.classList.add('is-focused');
});

element.addEventListener('focusout', () => {
    element.classList.remove('is-focused');
});

CSS:

input.autonumeric.is-focused {
    background-color: #f9fafb;
}

Такой подход особенно важен при интеграции с UI-системами, где визуальное состояние должно синхронизироваться с бизнес-логикой.


Отображение положительных и отрицательных значений

AutoNumeric поддерживает форматирование чисел с учётом знака, что позволяет применять стили в зависимости от значения. Хотя библиотека не навязывает встроенные классы для знаков, динамическая стилизация реализуется через обработку событий изменения значения.

Основное событие — autoNumeric:formatted или обработка через API getNumber().

Пример динамического добавления классов:

const element = document.querySelector('#balance');

function updateSignClass() {
    const value = AutoNumeric.getNumber(element);

    element.classList.remove('is-positive', 'is-negative', 'is-zero');

    if (value > 0) {
        element.classList.add('is-positive');
    } else if (value < 0) {
        element.classList.add('is-negative');
    } else {
        element.classList.add('is-zero');
    }
}

element.addEventListener('autoNumeric:formatted', updateSignClass);
element.addEventListener('autoNumeric:rawValueModified', updateSignClass);

CSS-слои:

input.is-positive {
    color: #16a34a;
}

input.is-negative {
    color: #dc2626;
}

input.is-zero {
    color: #6b7280;
}

Такой подход отделяет визуальную интерпретацию данных от самой логики форматирования.


Стилизация ошибок и некорректного ввода

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

Распространённая практика — использование кастомных классов ошибок:

function validateRange(element, min, max) {
    const value = AutoNumeric.getNumber(element);

    if (value < min || value > max) {
        element.classList.add('is-error');
    } else {
        element.classList.remove('is-error');
    }
}

CSS:

input.is-error {
    border-color: #ef4444;
    background-color: #fef2f2;
}

Дополнительно можно использовать псевдостилизацию через атрибуты:

element.setAttribute('data-valid', 'false');
input[data-valid="false"] {
    outline: 2px solid #ef4444;
}

Такой подход хорошо сочетается с реактивными фреймворками, где состояние ошибки часто хранится отдельно от DOM.


Стилизация форматированных значений

Одной из особенностей AutoNumeric является автоматическое добавление разделителей тысяч, символов валюты и префиксов/суффиксов. Это влияет на визуальную плотность текста и требует аккуратной настройки CSS.

Ключевые параметры:

  • letter-spacing для читаемости длинных чисел
  • text-align для выравнивания
  • font-variant-numeric для табличных цифр

Пример:

input.autonumeric {
    text-align: right;
    font-variant-numeric: tabular-nums;
    letter-spacing: 0.3px;
}

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


Интеграция с кастомными темами

AutoNumeric не привязан к конкретной дизайн-системе, что позволяет легко интегрировать его в существующие темы. Основной подход — использование CSS-переменных:

:root {
    --input-border: #d1d5db;
    --input-focus: #2563eb;
    --input-error: #dc2626;
    --input-bg: #ffffff;
}

Применение:

input.autonumeric {
    border: 1px solid var(--input-border);
    background-color: var(--input-bg);
}

input.autonumeric:focus {
    border-color: var(--input-focus);
}

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


Динамическое переключение тем

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

Пример:

.theme-dark input.autonumeric {
    --input-border: #374151;
    --input-bg: #111827;
    color: #f9fafb;
}

Дополнительная адаптация состояния фокуса:

.theme-dark input.autonumeric:focus {
    box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.4);
}

Стилизация через data-атрибуты

Использование data-атрибутов позволяет отделить состояние компонента от CSS-классов, что особенно удобно при большом количестве динамических состояний.

Пример состояния загрузки:

element.setAttribute('data-loading', 'true');
input[data-loading="true"] {
    opacity: 0.6;
    pointer-events: none;
}

Состояние блокировки:

input[data-disabled="true"] {
    background-color: #f3f4f6;
    cursor: not-allowed;
}

Такой подход снижает зависимость от JavaScript-манипуляций классами и упрощает масштабирование стилей.


Стилизация при автопреобразовании значений

AutoNumeric может автоматически изменять отображение значения при вводе: добавлять разделители, округлять дробные части, изменять формат валюты. Это создаёт необходимость учитывать переходные состояния.

Распространённый паттерн — временное выделение изменений:

element.addEventListener('autoNumeric:formatted', () => {
    element.classList.add('flash-update');

    setTimeout(() => {
        element.classList.remove('flash-update');
    }, 150);
});

CSS:

input.flash-update {
    background-color: #ecfeff;
    transition: background-color 0.2s ease;
}

Совмещение с UI-фреймворками

При использовании Tailwind, Bootstrap или аналогичных систем AutoNumeric выступает как слой логики форматирования, не конфликтующий с утилитарными классами.

Пример с утилитарными классами:

<input class="autonumeric w-full text-right border rounded px-3 py-2" />

AutoNumeric не переопределяет стили, если они явно заданы, что позволяет использовать гибридный подход: логика библиотеки + атомарные стили фреймворка.


Стилизация префиксов и суффиксов

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

Пример:

new AutoNumeric('#price', {
    currencySymbol: '$',
    currencySymbolPlacement: 'p'
});

CSS-адаптация:

input.autonumeric {
    font-family: system-ui, sans-serif;
}

В некоторых интерфейсах дополнительно применяется визуальное «разделение смысла» через моноширинный шрифт для чисел и пропорциональный для символов, но это требует внешней обёртки, так как AutoNumeric работает непосредственно с input.


Управление состоянием через кастомные события

Событийная модель позволяет полностью синхронизировать стили с жизненным циклом значения.

Основные события:

  • autoNumeric:initialized
  • autoNumeric:formatted
  • autoNumeric:rawValueModified
  • autoNumeric:invalidValue

Пример реактивной стилизации:

element.addEventListener('autoNumeric:invalidValue', () => {
    element.classList.add('is-error');
});

Такой механизм обеспечивает стабильную синхронизацию визуального состояния с внутренним состоянием данных без необходимости периодического опроса значения.