Сетка месяца
Условие
Календарь на месяц. Требования: · заголовок <span class="title"> вида «2026-09»; · <button class="prev"> и <button class="next"> листают месяцы; · дни - <button class="day" data-date="ГГГГ-ММ-ДД">, ровно столько, сколько дней в месяце; · перед первым днём - <span class="pad"> по числу пустых клеток, неделя начинается с понедельника; · клик по дню вызывает onSelect(строка даты), выбранный получает класс "on"; · текущий выбранный день приходит пропсом value.
Что проверяют тесты
правильное число дней
февраль високосного года
февраль обычного года
отступ до первого дня, неделя с понедельника
листает вперёд через границу года
листает назад через границу года
выбор сообщает наружу
выбранный подсвечен
Как подойти
Задача целиком про календарную арифметику и её ловушки. new Date(год, месяц, 0) сам знает про високосные годы - писать правило руками не нужно. Сдвиг (день + 6) % 7 превращает воскресную неделю в понедельничную. Границы года получаются бесплатно, если доверить нормализацию конструктору Date: new Date(2026, 12, 1) даст январь 2027. Что назвать вслух: часовые пояса (всю работу вести в локальной дате или в UTC, но не смешивать), диапазон дат, недоступные дни, локализованные названия через Intl.
Подсказки: 3
- Число дней месяца: new Date(год, месяц, 0).getDate() - нулевой день следующего месяца.
- getDay возвращает 0 для воскресенья - для недели с понедельника нужен сдвиг.
- Переход через границу года получится сам, если строить дату конструктором, а не арифметикой над числом месяца.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.