Поддержка клавиатурной навигации

Клавиатурная навигация в Flatpickr реализована как часть базового взаимодействия календарного компонента и охватывает управление выбором дат, переключение месяцев и годов, а также взаимодействие с полями времени. Поведение построено вокруг обработки событий keydown, внутреннего менеджера фокуса и набора стандартных клавиш, обеспечивающих быстрый доступ к элементам без использования мыши.

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

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

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

Навигация по дням

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

  • ← / → — переход на предыдущий или следующий день
  • ↑ / ↓ — переход на неделю назад или вперёд (±7 дней)

Логика учитывает границы месяца: при выходе за пределы текущей сетки происходит автоматический переход к соседнему месяцу, при этом сохраняется логика выделения активной даты.

Дополнительно учитываются:

  • начало недели (locale.firstDayOfWeek)
  • отключённые даты (disable)
  • минимальные и максимальные ограничения (minDate, maxDate)

Если выбранная ячейка недоступна, происходит поиск ближайшей валидной даты в направлении движения.

Быстрое переключение месяцев и годов

Flatpickr поддерживает навигацию между месяцами и годами без использования мыши:

  • Page Up — переход к предыдущему месяцу
  • Page Down — переход к следующему месяцу
  • Shift + Page Up — переход на предыдущий год
  • Shift + Page Down — переход на следующий год

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

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

Выбор даты с клавиатуры

Подтверждение выбора даты выполняется через:

  • Enter — установка текущей активной даты
  • Space (в некоторых конфигурациях) — аналогичное действие

После выбора срабатывает цепочка внутренних обработчиков:

  1. обновление значения input
  2. вызов onChange
  3. пересчёт состояния выделения
  4. при необходимости — закрытие календаря (closeOnSelect)

Если включён режим множественного выбора (mode: "multiple"), Enter добавляет дату в набор, а не заменяет значение.

Выход и управление фокусом

Для управления состоянием календаря используются системные клавиши:

  • Esc — закрытие календаря без изменения значения
  • Tab — выход из компонента с передачей фокуса следующему элементу страницы

При закрытии через Esc происходит откат временного состояния, если выбор не был подтверждён.

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

Навигация в режиме времени

При включённом enableTime добавляется отдельный слой клавиатурного управления:

  • ↑ / ↓ — увеличение или уменьшение значения (часы или минуты)
  • ← / → — переключение между полями (час, минута, секунды, AM/PM)

Фокус внутри блока времени реализован как виртуальная позиция, а не DOM-элемент, что позволяет синхронизировать ввод с числовыми инкрементами без перефокусировки.

При удержании клавиш ускоряется изменение значений (repeat acceleration), что улучшает работу с большими интервалами.

Особенности работы с вводом в поле

Если активирован allowInput, поведение клавиатуры меняется:

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

Flatpickr автоматически определяет валидность введённого значения и при необходимости нормализует его в соответствии с dateFormat.

Перехват и расширение клавиатурных событий

Для кастомизации поведения используется хук onKeyDown. Он вызывается до применения внутренней логики и позволяет:

  • блокировать стандартное действие
  • добавить собственные сочетания клавиш
  • модифицировать поведение навигации

Пример логики обработки внутри концепции Flatpickr:

  • проверка event.key
  • анализ модификаторов (shiftKey, ctrlKey, altKey)
  • возврат true/false для разрешения или блокировки действия

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

Работа с фокусом и перерисовкой

Flatpickr не полагается на стандартный tab-index внутри календарной сетки. Вместо этого используется:

  • логическая модель активной даты
  • виртуальный фокус
  • пересчёт позиции при каждом рендере

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

Это предотвращает рассинхронизацию при динамическом изменении календаря.

Доступность и ARIA-совместимость

Клавиатурная навигация тесно связана с accessibility-моделью:

  • активные элементы помечаются aria-selected
  • текущая дата получает aria-current="date"
  • недоступные элементы обозначаются как aria-disabled

При этом визуальный фокус синхронизируется с логическим, что позволяет использовать календарь через screen reader без потери контекста.

Поведение в мобильных и кастомных режимах

В конфигурации disableMobile или при кастомных input-режимах клавиатурная навигация может быть частично отключена. Однако внутренняя логика остаётся активной и используется при программном управлении (setDate, jumpToDate).

В мобильных браузерах многие keydown-события подавляются системой, поэтому Flatpickr переключается на touch-first модель, сохраняя только базовые элементы обработки.

Ограничения и конфликтующие сценарии

Клавиатурная навигация может конфликтовать с:

  • глобальными hotkey-библиотеками
  • кастомными обработчиками формы
  • автокомплитом в input

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

Особенно критичны ситуации, где календарь используется внутри сложных UI-компонентов (модальные окна, таблицы, редакторы), так как вложенные обработчики клавиш могут перехватывать события раньше Flatpickr.