Стилизация сегодняшнего дня

Календарная ячейка, соответствующая текущей дате, в Pikaday выделяется через отдельное состояние, формируемое при отрисовке сетки месяца. Внутри каждой ячейки используется кнопка с классом pika-button, а дополнительные модификаторы состояния накладываются динамически в зависимости от контекста: выбранная дата, выходной день, недоступный диапазон и текущий день.

Для сегодняшнего дня применяется класс is-today, который добавляется к элементу ячейки при совпадении даты с системным текущим временем. Этот класс является основным точечным хукoм для стилизации, поскольку он отделён от логики выбора (is-selected) и от состояния доступности (is-disabled).

Структура DOM в упрощённом виде выглядит следующим образом:

<td data-day="2" class="is-today">
  <button class="pika-button">2</button>
</td>

Именно контейнер td получает состояние, а не сама кнопка, что важно для корректного построения каскада CSS.


Базовая модель стилизации текущего дня

Стилизация сегодняшнего дня должна учитывать, что визуальный акцент не должен конфликтовать с состоянием выбранной даты. Частая ошибка — полное перекрытие стиля is-selected, из-за чего теряется контекст взаимодействия.

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

.pika-single .is-today .pika-button {
  position: relative;
  font-weight: 600;
  color: #1a73e8;
}

Такое решение создаёт акцент на тексте, не вмешиваясь в геометрию ячейки и не ломая сетку календаря.

Для более явного выделения часто используется псевдоэлемент:

.pika-single .is-today .pika-button::after {
  content: "";
  position: absolute;
  left: 50%;
  bottom: 4px;
  transform: translateX(-50%);
  width: 4px;
  height: 4px;
  border-radius: 50%;
  background: #1a73e8;
}

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


Взаимодействие состояний is-today и is-selected

При выборе текущей даты одновременно активируются два состояния: is-today и is-selected. Без явного управления приоритетами стили начинают конфликтовать, особенно если используется заливка фона.

Корректная стратегия — явно задавать приоритет выбранного состояния:

.pika-single .is-selected .pika-button {
  background: #1a73e8;
  color: #ffffff;
  border-radius: 4px;
}

.pika-single .is-selected.is-today .pika-button {
  box-shadow: 0 0 0 2px rgba(26, 115, 232, 0.3);
}

В данном случае текущий день не перекрывает состояние выбора, а лишь дополняет его дополнительным контуром.


Контроль визуального веса текущей даты

Если интерфейс содержит несколько уровней акцентов (выбранная дата, диапазон, ховер), сегодняшний день должен оставаться вторичным сигналом. Для этого используется минимальная контрастность и отсутствие тяжёлых заливок.

Корректная модель:

.pika-single .is-today .pika-button {
  background: transparent;
  border: 1px solid rgba(26, 115, 232, 0.4);
}

Такой подход предотвращает визуальную конкуренцию с is-selected, который обычно имеет сплошную заливку.


Изоляция стилей через каскад Pikaday

Pikaday использует фиксированный корневой класс .pika-single, что позволяет безопасно ограничивать область применения CSS. Это важно при интеграции в крупные проекты, где глобальные стили могут случайно переопределить календарь.

Пример изолированного блока:

.pika-single {
  font-family: system-ui, sans-serif;
  border-radius: 6px;
  overflow: hidden;
}

Далее все состояния, включая is-today, наследуют эту область видимости:

.pika-single .is-today .pika-button {
  transition: all 0.15s ease-in-out;
}

Адаптация под тёмные интерфейсы

В тёмных темах текущий день требует более аккуратного контраста, поскольку синий спектр может сливаться с фоном.

.dark-theme .pika-single .is-today .pika-button {
  color: #8ab4f8;
}

.dark-theme .pika-single .is-today .pika-button::after {
  background: #8ab4f8;
}

Здесь акцент переносится с яркости на различие оттенков, а не на интенсивность цвета.


Управление стилем через onDraw

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

new Pikaday({
  field: document.querySelector('#input'),
  onDraw: function () {
    const todayCell = this.el.querySelector('.is-today');
    if (todayCell) {
      todayCell.classList.add('today-highlighted');
    }
  }
});

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

.pika-single .today-highlighted .pika-button {
  outline: 2px solid rgba(26, 115, 232, 0.25);
  outline-offset: 2px;
}

Переопределение поведения hover для текущего дня

При наведении курсора стандартный hover может затмевать текущий день, особенно если используется яркая подсветка. Чтобы сохранить идентичность is-today, применяется комбинированное правило:

.pika-single .is-today .pika-button:hover {
  background: rgba(26, 115, 232, 0.08);
}

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


Работа с масштабированием интерфейса

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

.pika-single .is-today .pika-button::after {
  width: 6px;
  height: 6px;
}

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

.pika-single .is-today .pika-button::after {
  left: auto;
  right: 4px;
  bottom: 4px;
  transform: none;
}

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

При глубокой кастомизации Pikaday часто заменяются базовые стили .pika-button, что приводит к потере видимости текущего дня. В таких случаях необходимо явно восстанавливать состояние is-today на уровне приоритета селекторов.

.pika-single td.is-today .pika-button {
  border-color: inherit;
  box-shadow: none;
}

И отдельно возвращать акцент:

.pika-single td.is-today {
  position: relative;
}

Использование прозрачности как основного инструмента

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

.pika-single .is-today .pika-button {
  background: rgba(26, 115, 232, 0.06);
  color: inherit;
}

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