svg.svg-icon__sprite
  defs
    symbol#dot(viewbox='0 0 32 32')
      title Dit icon.
      desc For interactions.
      circle(cx='16' cy='16' r='14' fill='none' stroke-width='3')
      circle(cx='16' cy='16' r='4' fill='none' stroke-width='3')
    symbol#arrow(viewbox='0 0 32 32')
      title Arrow icon.
      desc For interactions.
      path(d='M12.8 3c.4 0 .8.2 1.1.5s.5.7.5 1.1c0 .5-.2.8-.5 1.1l-8.5 8.5h24.9c.4 0 .8.2 1.1.5.3.3.5.7.5 1.1s-.2.8-.5 1.1c-.3.3-.7.5-1.1.5H5.5l8.5 8.5c.3.3.5.7.5 1.1 0 .4-.2.8-.5 1.1s-.7.5-1.1.5c-.4 0-.8-.2-1.1-.5L.5 17c-.3-.3-.5-.7-.5-1.1s.2-.8.5-1.1L11.7 3.5c.3-.3.7-.5 1.1-.5z')
    symbol#eye(viewbox='0 0 32 32')
      title Eye icon.
      desc For toggleable elements.
      path(d='M16 4c1.5 0 2.9.2 4.2.7 1.4.4 2.6 1 3.6 1.7s2 1.5 2.9 2.3 1.7 1.7 2.3 2.6 1.2 1.6 1.6 2.3c.5.7.8 1.3 1 1.7l.4.7c0 .1-.1.2-.2.4s-.3.5-.6 1.1-.6 1.1-1 1.6-.8 1.2-1.4 1.9c-.6.7-1.2 1.4-1.8 2s-1.3 1.2-2.2 1.9c-.8.6-1.7 1.2-2.6 1.6s-1.9.8-3 1.1c-.9.3-2.1.4-3.2.4-1.5 0-2.9-.2-4.2-.7s-2.6-1-3.6-1.7-2-1.5-2.9-2.3-1.7-1.7-2.3-2.5-1.2-1.6-1.6-2.3-.8-1.3-1-1.7l-.4-.7c0-.1.1-.2.2-.4s.3-.5.6-1.1.6-1.1 1-1.6.8-1.2 1.4-1.9 1.2-1.4 1.8-2 1.3-1.2 2.2-1.9S8.8 6 9.7 5.5c.9-.4 1.9-.8 3-1.1S14.9 4 16 4zm0 2.7c-1 0-1.9.1-2.9.4s-1.8.6-2.5 1c-.8.4-1.5.8-2.2 1.4-.7.6-1.3 1.1-1.9 1.7S5.5 12.4 5 13s-.9 1.2-1.2 1.7c-.3.5-.6.9-.8 1.4.3.5.5.9.8 1.4s.7 1 1.2 1.6l1.5 1.8s1.1 1.1 1.9 1.7c.7.6 1.5 1.1 2.2 1.5.8.4 1.6.7 2.5 1s1.9.4 2.9.4 1.9-.1 2.9-.4c.9-.3 1.8-.6 2.5-1s1.5-.9 2.2-1.5c.7-.6 1.3-1.1 1.9-1.7l1.5-1.8 1.2-1.6c.3-.5.6-.9.8-1.4-.3-.5-.5-.9-.8-1.4-.3-.5-.7-1-1.2-1.6l-1.5-1.8c-.5-.6-1.1-1.1-1.9-1.7-.7-.6-1.5-1.1-2.2-1.5-.8-.4-1.6-.7-2.5-1S17 6.7 16 6.7zm0 4c1.5 0 2.7.5 3.8 1.6 1 1 1.6 2.3 1.6 3.8s-.5 2.7-1.6 3.8c-1 1-2.3 1.6-3.8 1.6s-2.7-.5-3.8-1.6c-1-1-1.6-2.3-1.6-3.8s.5-2.7 1.6-3.8 2.3-1.6 3.8-1.6zm0 2.6c-.7 0-1.4.3-1.9.8s-.8 1.1-.8 1.9.3 1.4.8 1.9 1.1.8 1.9.8 1.4-.3 1.9-.8.8-1.1.8-1.9-.3-1.4-.8-1.9-1.2-.8-1.9-.8z')
    symbol#firefox(viewbox='0 0 32 32')
      title Firefox icon.
      desc Support for this browser.
      path(d='M31.8 10.6l-.4 2.4s-.5-4.4-1.2-6c-1-2.5-1.4-2.5-1.4-2.5.7 1.7.5 2.6.5 2.6S28.1 3.9 25 2.9c-3.4-1.1-5.3-.8-5.5-.8h-.1.1s3.8.7 4.5 1.6c0 0-1.6 0-3.2.5-.1 0 5.9.7 7.1 6.7 0 0-.7-1.4-1.5-1.6.5 1.6.4 4.7-.1 6.2-.1.2-.1-.8-1.1-1.3.3 2.3 0 5.9-1.6 6.9-.1.1 1-3.6.2-2.2-4.4 6.8-9.6 3.1-12 1.5 1.2.3 3.5 0 4.5-.8 1.1-.8 1.7-1.3 2.3-1.2.6.1 1-.5.5-1s-1.6-1.2-3-.8c-1.1.3-2.4 1.4-4.3.3-1.5-.9-1.7-1.7-1.7-2.2 0-.2.1-.4.1-.5.2-.5.7-.6 1-.8.5.1.9.2 1.4.5v-.6c0-.1 0-.3-.1-.7 0-.3-.1-.6-.2-.9 0-.1.4-.4.8-.7.4-.3.8-.5 1.2-.8.5-.2.7-.3.7-.4l.1-.1c.2-.1.4-.4.5-.9v-.1-.2-.1c-.1-.1-.3-.2-1.1-.2h-1.4c-1 0-1.6-1-1.8-1.4.2-1.4 1-2.4 2.1-3 .2-.1-2.8 0-4.2 1.8-1.1-.4-2.2-.4-3.1-.2-.2 0-.4 0-.7-.1-.6-.5-1.5-1.6-1.6-2.8 0 0-1.9 1.4-1.6 5.4v.2c-.5.6-.7 1.2-.7 1.3-.5.9-.9 2.3-1.3 4.4 0 0 .3-.8.8-1.8-.4 1.2-.7 3-.5 5.8 0 0 0-.6.2-1.5.1 1.7.7 3.8 2.1 6.3 2.8 4.7 7 7.1 11.7 7.5.8.1 1.7.1 2.5 0h.2c1-.1 1.9-.2 2.9-.4 13.1-3.2 11.7-19.1 11.7-19.1z')
    symbol#chrome(viewbox='0 0 32 32')
      title Chrome icon.
      desc Support for this browser.
      path(d='M8.2 14.1L3.7 6.3c2.9-3.6 7.4-6 12.4-6C21.9.3 27 3.4 29.7 8.1H16.1c-3.8 0-7 2.5-7.9 6zm13.6-3.7h9.1c.7 1.8 1.1 3.7 1.1 5.8 0 8.7-7 15.7-15.7 15.8l6.5-11.2c.9-1.3 1.4-2.9 1.4-4.6 0-2.3-.9-4.3-2.4-5.8zm-11.5 5.8c0-3.2 2.6-5.8 5.8-5.8s5.8 2.6 5.8 5.8-2.6 5.8-5.8 5.8-5.8-2.7-5.8-5.8zm8 7.8l-4.5 7.9C6.1 30.7.2 24.1.2 16.2c0-2.8.7-5.5 2-7.8l6.5 11.2c1.3 2.8 4.1 4.7 7.3 4.7.8 0 1.6-.1 2.3-.3z')
    symbol#safari(viewbox='0 0 32 32')
      title Safari icon.
      desc Support for this browser.
      path(d='M16.1.3C7.3.3.2 7.4.2 16.2S7.3 32 16.1 32s15.8-7.1 15.8-15.8S24.8.3 16.1.3zM29.9 15v-.3.3zm-2.2-6.4l-.2-.3c.1.1.2.2.2.3zm-.8-1.1l-.1-.2s0 .1.1.2zm-2-2l-.2-.1c.1 0 .2.1.2.1zm-1-.8l-.3-.2c.1.1.2.2.3.2zm-6.3-2.3h-.3.3zm-2.7 0h-.3.3zM8.6 4.5l-.4.2c.1 0 .2-.1.4-.2zm-1.2.9l-.2.1c.1 0 .1-.1.2-.1zm-2 1.9l-.1.2c0-.1.1-.1.1-.2zm-.7 1l-.3.3.3-.3zm-2.4 6.3v0zm0 2.8v0zm2.1 6.3l.3.3-.3-.3zm.3.4l2.5-1.7-.3-.4-2.5 1.7C3.3 22 2.5 20 2.3 17.8l1.5-.1v-.5l-1.5.1v-.9h3v-.5h-3V15l1.5.1v-.5l-1.5-.1c.2-2.2 1-4.2 2.1-5.9l2.5 1.7.3-.4-2.5-1.6c.2-.3.3-.5.5-.7l1.1.9.3-.4-1.1-.9c.2-.2.4-.5.6-.7l2.1 2.1.4-.4-2.1-2 .6-.6.9 1.2.4-.3-.9-1.2c.2-.2.5-.4.7-.5l1.7 2.5.3-.3-1.6-2.5c1.7-1.1 3.7-1.9 5.9-2.1l.1 1.5h.5L15 2.3h.9v3h.5v-3h.9l-.1 1.5h.5l.1-1.5c2.2.2 4.2 1 5.9 2.1L21.9 7l.4.3L24 4.8c.2.2.5.3.7.5l-.9 1.1.4.3.9-1.1.6.6-.8.8-10.8 7.2L6.9 25l-.8.8-.6-.6 1.1-.9-.3-.4-1.1.9c-.2-.3-.3-.5-.5-.7zm.7.9c0-.1-.1-.1-.1-.2l.1.2zm1.8 1.8l.2.2-.2-.2zm1 .8l.3.2c-.1-.1-.2-.1-.3-.2zm6.3 2.3h.3c0 .1-.2.1-.3 0zm2.8.1h.3-.3zm6.3-2.2l.3-.2c-.1.1-.2.1-.3.2zm1.2-.8l.2-.1c-.1 0-.2 0-.2.1zm1.1-1zm.8-1l.1-.2c0 .1 0 .2-.1.2zm.3-.2l-1.1-.9-.3.4 1.1.9-.6.6-2.1-2.1-.4.4 2.1 2.1-.6.6-.9-1.2-.4.3.9 1.1c-.2.2-.5.4-.7.5L22.3 25l-.4.3 1.7 2.5c-1.7 1.1-3.7 1.9-5.9 2.1l-.1-1.5h-.5l.1 1.5h-.9v-3h-.5v3h-.9l.1-1.5h-.5l-.1 1.5c-2.2-.2-4.2-1-5.9-2.1l1.7-2.5-.4-.3-1.6 2.5c-.2-.2-.5-.3-.7-.5l.9-1.1-.4-.3-.9 1.1-.6-.6.8-.8 10.8-7.2 7.2-10.8.8-.8.6.6-1.1.9.3.4 1.1-.8c.2.2.4.5.5.7L25 9.9l.3.4 2.5-1.7c1.1 1.7 1.9 3.7 2.1 5.9l-1.5.1v.5l1.5-.1v.9h-3v.5h3v.9l-1.5-.1v.5l1.5.1c-.2 2.2-1 4.2-2.1 5.9L25.3 22l-.3.4 2.5 1.7c-.2.2-.4.4-.5.7zm2.9-7.4v.3-.3zm-2.2 6.3c-.1.1-.1.2-.2.3l.2-.3z')
    symbol#edge(viewbox='0 0 32 32')
      title Edge icon.
      desc Support for this browser.
      path(d='M1.7 13.9C2.7 6.7 7.6.1 16.5 0c5.4.1 9.8 2.5 12.4 7.2 1.3 2.4 1.7 5 1.8 7.8v3.3H11c.1 8.1 12 7.8 17.1 4.3v6.6c-3 1.8-9.8 3.4-15 1.3-4.5-1.7-7.7-6.4-7.6-10.9-.3-5.9 2.8-9.8 7.5-12-1 1.2-1.8 2.6-2.2 5H22S22.7 6 15.7 6c-6.6.2-11.3 4-14 7.9z')
    symbol#explorer(viewbox='0 0 32 32')
      title iExplorer icon.
      desc Support for this browser.
      path(d='M23.8 17.5H31c.1-.5.1-1 .1-1.5 0-2.5-.7-4.8-1.8-6.8 1.2-3.2 1.1-5.9-.4-7.5-1.5-1.5-5.6-1.3-10.2.8h-1C11.3 2.5 6 6.9 4.6 12.7c2-2.5 4.1-4.4 6.9-5.7-.3.2-1.7 1.7-2 2-7.3 7.3-9.7 16.9-7.2 19.4 1.9 1.9 5.3 1.6 9.3-.4 1.8.9 3.9 1.5 6.1 1.5 5.9 0 10.9-3.8 12.8-9.1h-7.3c-1 1.9-3 3.1-5.2 3.1s-4.2-1.3-5.2-3.1c-.4-.8-.7-1.8-.7-2.8l11.7-.1zM12 14c.2-3 2.6-5.4 5.7-5.4s5.5 2.4 5.7 5.4H12zM28.8 3.3c1 1 1 3 .1 5.3-1.5-2.3-3.7-4.1-6.3-5.1 2.8-1.2 5.1-1.4 6.2-.2zM4.2 27.9c-1.3-1.3-.9-4.1.8-7.4 1.1 3 3.1 5.4 5.7 7-2.9 1.4-5.3 1.6-6.5.4z')

main.flexy__item.flexy--items-center.flexy--justify-center.flexy--column
  section.section.flexy__item.flexy--column.flexy--items-center
    header.header.accessible-hide
      h2 Infinite Calendar
    article.section__article.flexy__item.flexy--column.flexy--items-center
      header.header.accessible-hide
        h3 A liquid & 'light-weight' calendar without any library.
      .calendar
        .calendar__month
          ul#CALENDAR__CONTROLS.calendar__controls.flexy__item.flexy--between.space--small
          table#CALENDAR__TABLE.calendar__table.flexy__item.flexy--column(width='100%' height='100%')
            thead#CALENDAR__THEAD.calendar__thead
            tbody#CALENDAR__TBODY.calendar__tbody
  header.header
      h1
        a(href='http://tadaima.studio' title='Go to Tadaima')
          svg.logo-tadaima.fill--white(xmlns='http://www.w3.org/2000/svg' xml:space='preserve' viewBox='0 0 80 80')
            title Tadaima Studio.
            desc A group of digital interface crafters.
            g
              rect.st5(y='0', width='80', height='80')
            lineargradient#SVGID_1_(gradientunits='userSpaceOnUse', x1='27.7468', y1='18.248', x2='52.244', y2='42.7452')
              stop(offset='0', style='stop-color:#FF5572')
              stop(offset='1', style='stop-color:#FF7555')
            polyline.logo-tadaima--animated(style='fill:none;stroke:url(#SVGID_1_);stroke-width:2;stroke-miterlimit:10;', points='52,27 25,27 25,23 55,23 55,31                                 40,31 40,54 ')
            lineargradient#SVGID_2_(gradientunits='userSpaceOnUse', x1='23.9948', y1='30.0043', x2='48.4901', y2='54.4996')
              stop(offset='0', style='stop-color:#FF5572')
              stop(offset='1', style='stop-color:#FF7555')
            polyline.logo-tadaima--animated(style='fill:none;stroke:url(#SVGID_2_);stroke-width:2;stroke-miterlimit:10;', points='24,31 36,31 36,57 44,57 44,34 ')

svg.svg-bg(xmlns='http://www.w3.org/2000/svg')
  defs
    circle#a(cx='1468', cy='133', r='35')
    mask#h(x='0', y='0', width='70', height='70', fill='#fff')
      use(xmlns:xlink='http://www.w3.org/1999/xlink', xlink:href='#a')
    circle#b(cx='236.5', cy='732.5', r='23.5')
    mask#i(x='0', y='0', width='47', height='47', fill='#fff')
      use(xmlns:xlink='http://www.w3.org/1999/xlink', xlink:href='#b')
    circle#c(cx='1120.5', cy='945.5', r='28.5')
    mask#j(x='0', y='0', width='57', height='57', fill='#fff')
      use(xmlns:xlink='http://www.w3.org/1999/xlink', xlink:href='#c')
    path#d(d='M1193.375 302.875l44.6 77.25h-89.2z')
    mask#k(x='0', y='0', width='89.201', height='77.25', fill='#fff')
      use(xmlns:xlink='http://www.w3.org/1999/xlink', xlink:href='#d')
    path#e(d='M1610.8 513.3l34.14 59.128h-68.278z')
    mask#l(x='0', y='0', width='68.277', height='59.13', fill='#fff')
      use(xmlns:xlink='http://www.w3.org/1999/xlink', xlink:href='#e')
    path#f(d='M51.045 967.864l38.314 66.362H12.73z')
    mask#m(x='0', y='0', width='76.629', height='66.362', fill='#fff')
      use(xmlns:xlink='http://www.w3.org/1999/xlink', xlink:href='#f')
    path#g(d='M46.045 311.097l26.5 45.897H19.546z')
    mask#n(x='0', y='0', width='52.997', height='45.897', fill='#fff')
      use(xmlns:xlink='http://www.w3.org/1999/xlink', xlink:href='#g')
  g(style='mix-blend-mode:overlay', fill='none', fill-rule='evenodd', opacity='.35', stroke='#FFF')
    use.svg-bg_element(mask='url(#h)', stroke-width='6', xmlns:xlink='http://www.w3.org/1999/xlink', xlink:href='#a')
    use.svg-bg_element(mask='url(#i)', stroke-width='6', xmlns:xlink='http://www.w3.org/1999/xlink', xlink:href='#b')
    use.svg-bg_element.opacity-anim(mask='url(#j)', stroke-width='6', xmlns:xlink='http://www.w3.org/1999/xlink', xlink:href='#c')
    path.stroke-anim(d='M657.5 848.5l46 46', stroke-width='3', stroke-linecap='square')
    path(d='M1360.5 1206.5l89-89M761.5 42.5l42-42', stroke-width='3', stroke-linecap='square')
    use.svg-bg_element(mask='url(#k)', stroke-width='6', transform='rotate(90 1193.375 341.5)', xmlns:xlink='http://www.w3.org/1999/xlink', xlink:href='#d')
    use.svg-bg_element(mask='url(#l)', stroke-width='6', transform='rotate(45 1610.8 542.863)', xmlns:xlink='http://www.w3.org/1999/xlink', xlink:href='#e')
    use.svg-bg_element.rotate-anim(mask='url(#m)', stroke-width='6', transform='rotate(45 51.045 1001.045)', xmlns:xlink='http://www.w3.org/1999/xlink', xlink:href='#f')
    use.svg-bg_element(mask='url(#n)', stroke-width='6', transform='rotate(20 46.045 334.045)', xmlns:xlink='http://www.w3.org/1999/xlink', xlink:href='#g')

View Compiled
@keyframes changeMonth {
    50% {
        transform: translate(0,120%);
    }
}

.calendar {
    width: 35em;
    @media (max-width: 40em) {
        width: 100%;
    }
    height: 26.75em;
    position: relative;
    &__table {
        width: 100%;
        height: 21.875em;
        tr {
            width: 100%;
        }
    }
    &__tbody,
    &__thead {
        display: inline-block;
        position: relative;
        box-sizing: border-box;
        width: 100%;
    }
    &__thead  {
        height: 3.813em;
        padding: ($baseSize / 2);
        z-index: 2;
        background-color: $gray;
        color: $white;
        box-shadow: 0 .1em 1em 0 rgba($black, .25),
                    0 .1em .5em 1px rgba($black, .35),
                    0 1em 2em 1px rgba($black, .15);
        .calendar__month__day {
            font-size: .75em;
            text-transform: uppercase;
        }
    }
    &__tbody {
        height: 19.438em;
        background-color: $white;
        padding: $baseSize ($baseSize / 2);
        transform: translateY(0);
        z-index: 1;
        box-shadow: 0 .1em 1em 0 rgba($black, .25),
                    0 .1em .5em 1px rgba($black, .35),
                    0 1em 2em 1px rgba($black, .15);
        &--animate
        {
            animation: changeMonth $slowDuration ease-in-out forwards;
        }
    }

    &__month {
        width: 100%;
        box-sizing: border-box;
        padding: 0 ($baseSize * 2);
        overflow: hidden;
        position: relative;
        &:after {
            content: '';
            width: 100%;
            height: 3em;
            border-radius: 10%;
            position: absolute;
            z-index: 3;
            bottom: -3em;
            left: 0;
            box-shadow: 0 -1em 1em -1em rgba($black, .6),
                        0 0 4em -1em rgba($black, .2);
        }
        &__day {
            display: inline-block;
            padding: ($baseSize / 2) 0;
            text-align: center;
            box-sizing: border-box;
            flex-basis: (100% / 7);
            background-image: radial-gradient($orange 50%, transparent 53%);
            background-size: 0 0;
            background-repeat: no-repeat;
            background-position: 50% 50%;
            transition: all $fastDuration $bezier;
            transition-delay: $fastDuration;
            time {
                display: inline-block;
            }
            &.today {
                color: $white;
                background-size: 3.5em 3.5em;
                @media (max-width: 40em) {
                    background-size: 3em 3em;
                }
            }
        }
        &__week {
            flex-wrap: wrap;
        }
    }
    &__controls {
        color: $white;
        &__button {
            padding: ($baseSize / 2) ($baseSize / 4);
            cursor: pointer;
            &__year {
                top: -.5em;
                position: relative;
                opacity: .6;
                font-size: .85em;
                padding-right: ($baseSize / 5);
            }
        }
    }
}
View Compiled
var date = new Date(),
    year = date.getFullYear(),
    month = date.getMonth(),
    yearCounter = year,
    monthCounter = month,
    calendarThead = document.getElementById('CALENDAR__THEAD'),
    calendarTbody = document.getElementById('CALENDAR__TBODY'),
    calendarControls = document.getElementById('CALENDAR__CONTROLS'),
    monthNames = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
    dayNames = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'],
    formatMonth;

var getDaysInMonth = function(month, year) {
    return new Date(year, month + 1, 0).getDate();
};

function monthStartDay(thisYear, thisMonth) {
    var date = new Date(thisYear, thisMonth, 1);
    var startDay = date.getDay();

    if (startDay == 0) {
        startDay = 7;
    }

    return startDay;
}

function renderControls(target, year, month) {
    var controlLi = document.createElement('li'),
        prevBtn = document.createElementNS('http://www.w3.org/2000/svg', 'svg'),
        prevIcn = document.createElementNS('http://www.w3.org/2000/svg', 'use'),
        nextLi = document.createElement('li'),
        nextBtn = document.createElementNS('http://www.w3.org/2000/svg', 'svg'),
        nextIcn = document.createElementNS('http://www.w3.org/2000/svg', 'use'),
        todayBtn = document.createElementNS('http://www.w3.org/2000/svg', 'svg'),
        todayIcn = document.createElementNS('http://www.w3.org/2000/svg', 'use'),
        titleLi = document.createElement('li'),
        heading = document.createElement('header'),
        title = document.createElement('h3');

    prevIcn.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', '#arrow');
    nextIcn.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', '#arrow');
    todayIcn.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', '#dot');

    titleLi.setAttribute('class', 'flexy__child');

    prevBtn.setAttribute('id', 'CALENDAR__CONTROLS__PREV');
    nextBtn.setAttribute('id', 'CALENDAR__CONTROLS__NEXT');

    controlLi.setAttribute('class', 'flexy__item flexy--items-center');
    nextLi.setAttribute('class', 'flexy__item flexy--items-center');

    prevBtn.setAttribute('class', 'calendar__controls__button svg-icon fill--white');
    todayBtn.setAttribute('class', 'calendar__controls__button svg-icon stroke--white');
    nextBtn.setAttribute('class', 'calendar__controls__button svg-icon fill--white svg-icon--rotated-180');

    prevBtn.appendChild(prevIcn);
    nextBtn.appendChild(nextIcn);
    todayBtn.appendChild(todayIcn);
    controlLi.appendChild(prevBtn);
    controlLi.appendChild(todayBtn);
    controlLi.appendChild(nextBtn);

    // title.innerHTML = monthNames[month];
    title.innerHTML = '<span class="calendar__controls__button__year">' + year + ' .</span>' + monthNames[month];
    heading.appendChild(title);
    titleLi.appendChild(heading);

    target.appendChild(titleLi);
    target.appendChild(controlLi);

    prevBtn.addEventListener('click', changeMonth);
    nextBtn.addEventListener('click', changeMonth);
    todayBtn.addEventListener('click', goToday);
}

function renderDayNames(namesArray) {
    var namesRow = document.createElement('tr');

    namesRow.setAttribute('class', 'calendar__month__week flexy__item');

    for (var i = 0; i < namesArray.length; i++) {
        var thDay = document.createElement('th');
        thDay.setAttribute('class', 'calendar__month__day');
        thDay.innerHTML = namesArray[i];
        namesRow.appendChild(thDay);
    }

    calendarThead.appendChild(namesRow);
}

renderDayNames(dayNames);

function goToday() {
    calendarTbody.setAttribute('class', 'calendar__tbody calendar__tbody--animate');
    setTimeout(function(){
        newMonth(year, month);
    }, 450);
    setTimeout(function(){
        calendarTbody.setAttribute('class', 'calendar__tbody');
    }, 900);
    yearCounter = year;
    monthCounter = month;
}

function changeMonth() {
    if (this.id.split('NEXT').length > 1) {
        if (monthCounter < 11) {
            monthCounter++;
        } else {
            monthCounter = 0;
            yearCounter++;
        }
    } else if (this.id.split('PREV').length > 1) {
        if (monthCounter > 0) {
            monthCounter--;
        } else {
            monthCounter = 11;
            yearCounter--;
        }
    }
    calendarTbody.setAttribute('class', 'calendar__tbody calendar__tbody--animate');
    setTimeout(function(){
        newMonth(yearCounter, monthCounter);
    }, 450);
    setTimeout(function(){
        calendarTbody.setAttribute('class', 'calendar__tbody');
    }, 900);
}

function renderMonth(thisYear, thisMonth) {
    var days = getDaysInMonth(thisMonth, thisYear),
        startDay = monthStartDay(thisYear, thisMonth),
        monthRow = document.createElement('tr');
    monthRow.setAttribute('id', 'CALENDAR__ROW');
    monthRow.setAttribute('class', 'calendar__month__week flexy__item');
    for (var i = 1; i < (days + startDay); i++) {
        var cellDay = document.createElement('td'),
            timeTag = document.createElement('time');
        cellDay.setAttribute('class', 'calendar__month__day');
        if (i >= startDay) {
            if (thisMonth < 10) {
                formatMonth = '0' + thisMonth;
            }
            timeTag.setAttribute('datetime', thisYear + '-' + formatMonth + '-' + (i - startDay));
            cellDay.setAttribute('id', 'CALENDAR__DAY--' + (i - startDay + 1));
            timeTag.innerHTML = i - startDay + 1;
            cellDay.appendChild(timeTag);
        } else {
            cellDay.innerHTML = '-';
        }
        monthRow.appendChild(cellDay);
    }

    calendarTbody.appendChild(monthRow);
    renderControls(calendarControls, thisYear, thisMonth);

    var today = document.getElementById('CALENDAR__DAY--' + date.getDate());

    if (thisMonth === date.getMonth() && thisYear === date.getFullYear()) {
        setTimeout(function() {
            today.setAttribute('class', 'calendar__month__day today');
        }, 200);
    }
}

function newMonth(year, month) {
    var controls = document.getElementById('CALENDAR__CONTROLS'),
        row = document.getElementById('CALENDAR__ROW');

    while (controls.firstChild) {
        controls.removeChild(controls.firstChild);
    }

    calendarTbody.removeChild(row);
    renderMonth(year, month);
}
renderMonth(year, month);

External CSS

  1. https://codepen.io/tadaima/pen/RKQrdr.scss

External JavaScript

This Pen doesn't use any external JavaScript resources.