.title
  span Day 9. Calendar

.calendar
  - var index = 0, className = '', block = 0;
  each val in [ '', 'jan', 'feb', 'mar', 'apr', 'may', 'june', '', 'july', 'aug', 'sep', 'oct', 'nov', 'dec', '' ]
    - if (val != '') { className = 'calendar__month--' + index; index=index+1; } else { block++; className = "calendar__empty--" + block; }
    div(class='calendar__month ' + className)
      span.title= val
      if val != ''
        .calendar__days
          - for (var x = 0; x < 42; x++)
          span(class='calendar__day calendar__day__' + x) #{x}
          - end
      else
        .year-block.hidden 2017
        .clock.hidden
          .clock__hour__container
            .clock__hour
          .clock__minute__container
            .clock__minute
          .clock__second__container
            .clock__second
          .clock__dot
        .date-block.hidden
          .date-block__month Jan
          .date-block__date 12
          .date-block__day Wed
        
  
View Compiled
@import url('https://fonts.googleapis.com/css?family=Pacifico');
@import url('https://fonts.googleapis.com/css?family=Open+Sans+Condensed:300,700');

@mixin size($width, $height) {
  width: $width;
  height: $height;
}

@mixin position($top: auto, $left: auto, $bottom: auto, $right: auto) {
  position: absolute;
  top: $top;
  left: $left;
  bottom: $bottom;
  right: $right;
}

@mixin centered() {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: translate(-50%, -50%);
}

$red: #CA3644;
$yellow: #EBC85B;
$blue: #1AA1AF;
$orange: #E86948;

*, 
*::before, 
*::after {
  box-sizing: border-box;
}

*::before, 
*::after {
  content: '';
  display: block;
  position: absolute;
}

body {
  background-color: #F3F4F5;
  background-image: radial-gradient(#F3F4F5 0, darken(#F3F4F5, 10%) 100%);
  min-height: 100vh;
  width: 100vw;
  margin: 0;
  padding: 0;
  font-family: 'Pacifico', cursive;
}

.title {  
  padding: 10px 20px;
  
  span {
    font-size: 20px;
    font-weight: bold;
    color: rgba(0,0,0,0.5);
  }
}

.hidden {
  display: none;
}

.half-transparent {
  color: rgba(#fff, 0.3);
}

.bold {
  font-weight: bold;
}

.year-block {
  font-size: 5vmin;
  font-weight: bold;
  @include centered;
}

.date-block {
  &__month {
    font-size: 3vmin;
    font-weight: bold;
  }
  &__date {
    font-size: 6vmin;
    font-weight: bold;
  }
  &__day {
    font-size: 3vmin;
    color: rgba(#fff, 0.5);
  }
  @include centered;
}

.calendar {
  @include size(100vmin, 60vmin);
  @include centered;
  background: $red;
  display: flex;
  flex-wrap: wrap;
  box-shadow: -1vmin 1vmin 2vmin rgba(#000, 0.5);
  
  &__days {
    display: flex;
    flex-wrap: wrap;
    margin-top: 1vmin;
  }
  
  &__day {
    font-size: 1.4vmin;
    display: inline-block;
    @include size(percentage(1/7), 2vmin);
  }
  
  &__month {
    font-family: 'Open Sans Condensed', sans-serif;
    @include size(20%, 33.33333%);
    display: block;
    color: rgba(#fff, 0.8);
    text-transform: uppercase;
    text-align: center;
    padding: 2vmin;
    position: relative;
    
    .title {
      font-weight: bold;
      font-size: 2vmin;
    }
    
    &:nth-child(4n+1) {
      background: $blue;
    }
    &:nth-child(4n+2) {
      background: $orange;
    }
    &:nth-child(4n+3) {
      background: $yellow;
    }
    &:nth-child(4n+4) {
      background: $red;
    }
  }
}

.clock {
  @include centered;
  @include size(90%, 90%);
  border-radius: 100%;
  &__container {
    @include size(100%, 100%);
    @include position();
  }
  
  &__dot {
    @include size(5%, 5%);
    @include centered;
    background: white;
  }
  
  &__hour {
    &__container {
      @include size(100%, 100%);
      @include position();
    }
    @include size(100%, 100%);
    @include position();
    animation: rotate 43200s infinite linear;
    &::before {
      width: 3%;
      height: 30%;
      top: 20%;
      left: 50%;
      transform: translatex(-50%);
      background: white;
    }
  }
  &__minute {
    &__container {
      @include size(100%, 100%);
      @include position();
    }
    @include size(100%, 100%);
    @include position();
    animation: rotate 3600s infinite linear;
    &::before {
      width: 2%;
      height: 40%;
      top: 10%;
      left: 50%;
      transform: translatex(-50%);
      background: white;
    }
  }
  &__second {
    &__container {
      @include size(100%, 100%);
      @include position();
    }
    @include size(100%, 100%);
    @include position();
    animation: rotate 60s infinite steps(60);
    &::before {
      width: 1%;
      height: 45%;
      top: 5%;
      left: 50%;
      transform: translatex(-50%);
      background: white;
    }
  }
}

@keyframes rotate {
  100% {
    transform: rotateZ(360deg);
  }
}
View Compiled
$(() => {
  const currentDate = new Date();
  const weekDays = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
  const months = ['jan', 'feb', 'mar', 'apr', 'may', 'june', 'july', 'aug', 'sep', 'oct', 'nov', 'dec'];
  
  $('.date-block__day').text(weekDays[currentDate.getDay()]);
  $('.date-block__date').text(currentDate.getDate());
  $('.date-block__month').text(months[currentDate.getMonth()]);
  $('.year-block').text(currentDate.getFullYear());
  
  $('.calendar__empty--1 .date-block').removeClass('hidden');
  $('.calendar__empty--2 .clock').removeClass('hidden');
  $('.calendar__empty--3 .year-block').removeClass('hidden');
  
  for (let i=0; i<12; i++) {
    const year = currentDate.getYear(),
          month = i,
          daysCount = daysInMonth(month + 1, year),
          prevMonthDaysCount = daysInMonth(month, year),
          firstDay = new Date(year, month, 1),
          firstDayOfWeek = (firstDay.getDay() + 1);
    let j;
    for (j=0; j<firstDayOfWeek; j++) {
      let $e = $('.calendar__month--' + i +' .calendar__day__' + j);
      $e.text(prevMonthDaysCount - firstDayOfWeek + j + 1);
      $e.addClass('half-transparent');
      addBold($e, j);
    }
    for (;j<42 && j<firstDayOfWeek+daysCount;j++) {
      let $e = $('.calendar__month--' + i +' .calendar__day__' + j);
      $e.text(j - firstDayOfWeek + 1);
      addBold($e, j);
    }
    for (let k=0;j<42;k++,j++) {
      let $e = $('.calendar__month--' + i +' .calendar__day__' + j);
      $e.text(k + 1);
      $e.addClass('half-transparent');
      addBold($e, j);
    }
  }
  
  initLocalClocks();
});

const daysInMonth = (m, y) => /8|3|5|10/.test(--m)?30:m==1?(!(y%4)&&y%100)||!(y%400)?29:28:31;

const addBold = ($e, i) => {
  if (i % 7 == 5 || i % 7 == 6) {
    $e.addClass('bold');
  }
}

function initLocalClocks() {
  const date = new Date();
  const seconds = date.getSeconds();
  const minutes = date.getMinutes();
  const hours = date.getHours();

  const hands = [
    {
      hand: 'clock__hour__container',
      angle: (hours * 30) + (minutes / 2)
    },
    {
      hand: 'clock__minute__container',
      angle: (minutes * 6) + (seconds / 10)
    },
    {
      hand: 'clock__second__container',
      angle: (seconds * 6)
    }
  ];
  hands.forEach((hand) => {
    const elements = document.querySelectorAll('.' + hand.hand);
    Array.from(elements).forEach((element) => {
      element.style.transform = `rotateZ(${ hand.angle }deg)`;
    });
  });
}

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js