You don’t need moment.js. Vanilla JS Date() provides everything needed to dynamically generate a 31-day month layout!

Finding Days in Month

const month = 3; // April (0-indexed)
const year = 2026;

// Passing 0 as day returns the last day of the previous month!
const daysInMonth = new Date(year, month + 1, 0).getDate();
const firstDayIndex = new Date(year, month, 1).getDay(); // Sun=0, Mon=1

// Now loop to create DOM elements
for(let i=0; i<firstDayIndex; i++) {
  // add empty padding days
}
for(let i=1; i<=daysInMonth; i++) {
  // add day boxes
}

Try clicking the Prev/Next buttons in the Live Demo to see the Javascript flawlessly calculate leap years and month rollovers!