Поведение календаря при отображении нескольких месяцев одновременно требует механизма определения активного или «основного» календаря. В конфигурации Pikaday этот механизм реализуется через параметр, задающий индекс главного календарного блока внутри группы отображаемых месяцев.
При включённом режиме мульти-месячного отображения (через
numberOfMonths) библиотека создаёт несколько календарных
панелей, расположенных горизонтально. Каждая панель соответствует
отдельному месяцу, а навигация по стрелкам переключает диапазон сразу
для всех панелей. Однако взаимодействие пользователя, включая фокус,
клавиатурную навигацию и выделение даты, обычно привязывается к одной из
этих панелей — основной.
Основной календарь определяет:
При значении numberOfMonths: 1 различие между панелями
отсутствует, поэтому параметр основного календаря не оказывает видимого
эффекта. Его поведение проявляется только при количестве месяцев больше
одного.
Индекс основного календаря задаётся числом, начиная с нуля. Первая
панель в списке месяцев имеет индекс 0, вторая —
1 и так далее. При этом логика не зависит от календарного
месяца как такового — только от позиции панели в DOM-структуре
компонента.
Пример конфигурации:
const picker = new Pikaday({
numberOfMonths: 3,
mainCalendar: 1
});
В этом случае центральная логика взаимодействия будет привязана ко второй панели (с индексом 1), даже если отображаются три последовательных месяца.
Такой подход используется в интерфейсах, где центральный месяц должен быть активным по умолчанию, а соседние служат для контекста (например, диапазон выбора дат или планирование событий).
При инициализации виджета происходит установка начального фокуса. Если задан параметр основного календаря, библиотека выполняет следующие шаги:
defaultDate, если она задана.Если параметр не задан, используется поведение по умолчанию —
активной считается первая панель (0 индекс).
Клавиатурная навигация внутри календаря (стрелки, Enter, PageUp/PageDown) опирается на текущий активный календарь. Это особенно важно при мульти-месячной структуре, поскольку переход между месяцами может происходить как внутри одной панели, так и с перескоком между панелями.
При установленном основном календаре:
Такое поведение предотвращает «размытие» фокуса между несколькими календарями и сохраняет предсказуемую навигацию.
При генерации интерфейса Pikaday создаёт контейнер, внутри которого каждая панель месяца представляет собой отдельный блок. Основной календарь не выделяется отдельным классом в стандартной разметке, но логически связан с индексом, который используется при обработке событий.
Типичная структура выглядит следующим образом:
контейнер календаря
Индекс основной панели используется внутри логики событий:
При использовании календаря для выбора диапазона (например, start/end date сценарии) основной календарь влияет на начальную точку взаимодействия. Это особенно заметно при следующих условиях:
В таких случаях основная панель становится опорной точкой визуализации выбора, даже если конечные значения распределяются между несколькими месяцами.
При навигации между месяцами через стрелки:
Если основной календарь установлен в среднюю панель при
numberOfMonths: 3, то при переходе на следующий месяц
логика сохраняет центрированное поведение, а не смещает фокус к первому
или последнему элементу группы.
Хотя параметр основного календаря напрямую не управляет позиционированием всплывающего окна, он косвенно влияет на восприятие расположения, поскольку:
Особенно это заметно в интерфейсах с ограниченной шириной, где календарь может частично сдвигаться в зависимости от активной панели.
Механизм выбора основной панели применяется в следующих типах интерфейсов:
В каждом случае основной календарь служит точкой фокуса, вокруг которой строится пользовательское взаимодействие.
Если заранее установлена выбранная дата через
defaultDate или setDate, библиотека
сопоставляет её с соответствующей панелью. При этом:
Это позволяет сохранять логическую целостность между визуальным фокусом и внутренним состоянием.
При изменении количества отображаемых месяцев после инициализации:
Пример:
numberOfMonths = 3,
mainCalendar = 2numberOfMonths = 2В этом случае основная панель будет скорректирована до
1, поскольку индекс 2 больше недоступен.
При кастомизации шаблонов рендеринга календаря важно учитывать, что логика основного календаря остаётся внутренней и не всегда отражается в DOM напрямую. Поэтому:
В сложных интерфейсах часто добавляют визуальное выделение
центральной панели вручную, синхронизируя его с индексом основного
календаря через события onDraw или onOpen.
При повторной отрисовке календаря (например, после изменения диапазона дат):
Это обеспечивает стабильность интерфейса при частых обновлениях состояния компонента.