.center-dial
  %h1{:class => "center-preview"} HELLO
  .head
  .torso
  .hand-container#minutes
    .minute-hand
  .hand-container#hours 
    .hour-hand
  .hand-container#seconds
    .second-hand
.day-name-dial  
  .ring-back
  .ring#r1
    %h1{:class => "day-name-preview"} DAY NAME
    %h2{:class => "day-name-text"} MON TUE WED THU FRI SAT SUN
.month-dial
  .ring-back
  .ring#r2
    %h1{:class => "month-preview"} MONTH
    %h2{:class => "month-text"} JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC
.day-dial
  .ring-back
  .ring#r3
    %h1{:class => "day-preview"} DAY
    %h2{:class => "day-text"}  01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 
.side-ring#weather
  .fa.fa-cloud
  %p{:class => "temperature"} 14&#176C
.side-ring#steps
  .bars
    .bar
      .day-letter M
      .x#x1
    .bar
      .day-letter T
      .x#x2
    .bar
      .day-letter W
      .x#x3
    .bar
      .day-letter T
      .x#x4
    .bar
      .day-letter F
      .x#x5
    .bar
      .day-letter S
      .x#x6
    .bar
      .day-letter S
      .x#x7
View Compiled
// VARIABLES
$background-grey: #292929;
$ring-back: #FFFFFF;
$ring-preview-characters: 6;
$bar-colors: #FF3B30, #FF9500, #FFCC00, #4CD964, #5AC8FA, #007AFF, #5856D6;

$center-dial-size: 150px;
$day-name-size: 250px;
$month-size: 350px;
$day-size: 450px;
$h1-size: 25px;
$h2-size: 12px;
$side-ring-size: 200px;

// MIXINS
@mixin position($position, $top: null, $right: null, $bottom: null, $left: null) {
  position: $position;
  top: $top;
  right: $right;
  bottom: $bottom;
  left: $left;
}

@mixin absolute($args...) {
  @include position(absolute, $args...);
}

@mixin relative($args...) {
  @include position(relative, $args...);
}

@mixin fixed($args...) {
  @include position(fixed, $args...);
}

@mixin opacity($opacity) {
  opacity: $opacity;
  $opacity-ie: $opacity * 100;
  filter: alpha(opacity=$opacity-ie); //IE8
}

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

@mixin transition($args...) {
  -webkit-transition: $args;
  -moz-transition: $args;
  -ms-transition: $args;
  -o-transition: $args;
  transition: $args;
}

@mixin transition-delay($delay) {
  -webkit-transition-delay: $delay;
  -moz-transition-delay: $delay;
  -ms-transition-delay: $delay;
  -o-transition-delay: $delay;
  transition-delay: $delay;
}

@mixin transform($transforms) {
  -moz-transform: $transforms;
  -o-transform: $transforms;
  -ms-transform: $transforms;
  -webkit-transform: $transforms;
  transform: $transforms;
}

@mixin transform-origin ($origin) {
  moz-transform-origin: $origin;
  -o-transform-origin: $origin;
  -ms-transform-origin: $origin;
  -webkit-transform-origin: $origin;
  transform-origin: $origin;
}

@mixin rotated-text($num-letters: 100, $angle-span: 180deg, $angle-offset: 0deg) {
  $angle-per-char: $angle-span / $num-letters;
  @for $i from 1 through $num-letters {
    .char#{$i} {
      @include transform(rotate($angle-offset + $angle-per-char * $i));
  }
  }
}

// LOOPS
@each $current-color in $bar-colors {
    $i: index($bar-colors, $current-color);
    #x#{$i} { 
        background: $current-color;
    }
}

@for $i from 1 to 8 {
  .bar:nth-child(#{$i}) {
     @include absolute($top: 0px, $left: 20px * ($i - 1));
  }
}

// PLACEHOLDERS
%center {
  @include absolute($top: 50%, $left: 50%);
  transform: translateX(-50%) translateY(-50%);
}

%center-inside {
  @include relative($top: 50%, $left: 50%);
  transform: translateX(-50%) translateY(-50%);
}

%ring-text {
  text-align: center;
  @include transform-origin(center center);
}

// TYPICAL ELEMENTS
* {
  box-sizing: border-box;
}

html,
body {
  background: $background-grey;
  border: 0;
  font-family: 'Roboto Mono', monospace;
  height: 100%;
  margin: 0px;
  width: 100%;
}

h1 {
  color: #555;
  font-size: 25px;
}

h2{
  color: #555;
  font-size: 15px;  
}

// CLASSES AND IDS IN ORDER OF APPEARANCE IN HTML

.center-dial {
  @include absolute($top: calc(50% - 75px), $left: calc(50% - 75px));
  @include transition(all .5s);
  @include size($center-dial-size);
  background-color: #202020;
  border-radius: 50%; color: #000;
  box-shadow: 0px 2px 2px #000;
  cursor: pointer;
  overflow: hidden;
}

.center-preview span {
  @extend %ring-text;
  @include absolute($top: 0%, $left: calc(50% - 12.5px));
  height: $center-dial-size;
  width: $h1-size;  
}

.center-preview {
  @include opacity(0);
  @include rotated-text($num-letters: 6, $angle-span: 120deg, $angle-offset: -60deg);
}

.head {
  @extend %center-inside;
  @include size(50px, 50px);
  background: #FFF;
  border-radius: 50%;
}

.torso {
  @include relative($top: calc(50% - 20px), $left: calc(50% - 50px));
  @include size(100px, 100px);
  background: #FFF;
  border-radius: 50%;
}

.hand-container {
  @extend %ring-text;
  @include absolute($top: 0%, $left: calc(50% - 12.5px));
  @include opacity(0);
  @include size($h1-size, $center-dial-size);
  @include transform-origin(center center);
}

.hour-hand {
  @include size(10px, 50px);
  @include relative($top: calc(50% - 45px), $left: calc(50% - 5px));
  @include transition(all .5s);
  background: #FFF;
  border-radius: 5px;
}

.minute-hand {
  @include size(10px, 70px);
  @include relative($top: calc(50% - 65px), $left: calc(50% - 5px));
  background: #CCC;
  border-radius: 5px;
}

.second-hand {
  @include size(2px, 70px);
  @include relative($top: calc(50% - 69px), $left: calc(50% - 1px));
  background: #AAA;
  border-radius: 1px;
}

.day-name-dial {
  @extend %center;
  @include size($day-name-size);
  @include transition(all .5s);
}

.day-name-preview span {
  @extend %ring-text;
  @include absolute($top: calc(-25% - 5px), $left: calc(50% - 12.5px));
  height: $day-name-size;
  width: $h1-size;
}

.day-name-preview {
  @include opacity(0);
  @include rotated-text($num-letters: 9, $angle-span: 90deg, $angle-offset: -45deg);
}

.day-name-text span {
  @extend %ring-text;
  @include absolute($top: calc(-25% + 5px), $left: calc(50% - 6px));
  height: 232px;  
  width: $h2-size;
}

.day-name-text {
  @include opacity(0);
  @include rotated-text($num-letters: 28, $angle-span: 270deg, $angle-offset: -135deg);
}

.month-dial {
  @extend %center;
  @include size($month-size);
  @include transition(all .5s); 
}

.month-preview span {
  @extend %ring-text;
  @include absolute($top: calc(-25% + 20px), $left: calc(50% - 12.5px));
  height: $month-size;
  width: $h1-size;  
}

.month-preview{
  @include opacity(0);
  @include rotated-text($num-letters: 6, $angle-span: 90deg, $angle-offset: -45deg);
}

.month-text span {
  @extend %ring-text;
  @include absolute($top: calc(-25% + 30px), $left: calc(50% - 6px));
  height: 332px;
  width: $h2-size;
}

.month-text{
  @include opacity(0);
  @include rotated-text($num-letters: 48, $angle-span: 270deg, $angle-offset: -135deg);
}

.day-dial {
  @extend %center;
  @include size(450px, 450px);
  @include transition(all .5s);
}

.day-preview span {
  @extend %ring-text;
  @include absolute($top: calc(-25% + 45px), $left: calc(50% - 12.5px));
  height: $day-size;
  width: $h1-size;
}

.day-preview{
  @include opacity(0);
  @include rotated-text($num-letters: 4, $angle-span: 90deg, $angle-offset: -45deg);
}

.day-text span {
  @extend %ring-text;
  @include absolute($top: calc(-25% + 55px), $left: calc(50% - 6px));
  height: 432px;
  width: $h2-size;
}

.day-text{
  @include opacity(0);
  @include rotated-text($num-letters: 93, $angle-span: 270deg, $angle-offset: -135deg);
}

.ring-back {
  @include opacity(.1);
  @include size(100%, 100%);
  border: solid 10px transparent;
  border-radius: 50%;
  
  &:before {
    @include absolute($top: 5px, $left: 5px, $bottom: 5px, $right: 5px);
    border-radius: 50%;
    border: solid 35px $ring-back;
    content: " ";
  }
}

.ring {
  @include relative($top: -100%);
  @include size(100%, 100%);
  @include transition(all .5s);
  border: solid 45px #202020;
  border-radius: 50%;
  border-bottom-color: transparent;
  box-shadow: 0px -2px 2px #000;
}

.side-ring {
  @include transition(all .5s);
  @include size($side-ring-size);
  background-color: #202020;
  border-radius: 50%; 
  box-shadow: 0px 2px 2px #000;
  color: #000;
  overflow: hidden;
}

#weather {
  @include absolute($top: calc(50% - 100px), $left: calc(20% - 100px));
}

#steps {
  @include absolute($top: calc(50% - 100px), $left: calc(80% - 100px));
}

.fa-cloud {
  @include opacity(0);
  @include absolute($top: calc(50% - 40px), $left: calc(50% - 40px));
  color: #555;
  font-size: 80px;
}

.temperature {
  @include opacity(0);
  @include absolute($top: 10%, $left: 55%); 
  color: #FFCC00;
  font-size: 20px;
}

.bars {
  @include opacity(0);
  @include relative($top: calc(50% - 70px), $left: calc(50% - 65px));
  @include size(140px, 140px);
}

.bar {
  @include size(18px, 140px);
  margin: 0px -4px;
}

.day-letter { 
  @include relative($top: 110px);
  color: #555;
  font-size: 18px;
  text-align: center;
}

.x {
  @include absolute($bottom: 30px, $left: 1px);
  @include size(16px, 2px);
  @include transition (all .5s);
}
View Compiled
/*
 * Cirulcar Calendar Display.js
 * Matthew Juggins
 * Change log:
 *    25/09/16 - Quick fix to day of the week
 */

$(function() {

  var date, dayName, day, month, year;
  var range = 270,
    sectionsDayName = 7,
    sectionsDay = 31,
    sectionsMonth = 12,
    charactersDayName = 3,
    charactersDay = 2,
    charactersMonth = 3,
    dayColor = '#FF2D55',
    monthColor = '#007AFF',
    dayNameColor = '#4CD964';
  

  // Rotate the selected ring the correct amount and illuminate the correct characters of the ring text
  function rotateRing(input, sections, characters, ring, text, color) {
    var sectionWidth = range / sections;
    var initialRotation = 135 - (sectionWidth / 2);
    var rotateAmount = initialRotation - sectionWidth * (input - 1);
    var start = (characters * (input - 1)) + (input - 1) + 1;
    
    $(ring).css({
      '-webkit-transform': 'rotate(' + rotateAmount + 'deg)',
      '-moz-transform': 'rotate(' + rotateAmount + 'deg)',
      '-ms-transform': 'rotate(' + rotateAmount + 'deg)',
      'transform': 'rotate(' + rotateAmount + 'deg)'
    });

    for (var i = start; i < start + characters; i++) {
      $(text).children('.char' + i).css({
        'color': color
      });
    }   
  }

  // Get a new date object every second and update the rotation of the clock handles
  function clockRotation() {
    setInterval(function() {
      var date = new Date();
      var seconds = date.getSeconds();
      var minutes = date.getMinutes();
      var hours = date.getHours();
      var secondsRotation = seconds * 6;
      var minutesRotation = minutes * 6;
      var hoursRotation = hours * 30 + (minutes / 2);
      $("#seconds").css({
        '-webkit-transform': 'rotate(' + secondsRotation + 'deg)',
        '-moz-transform': 'rotate(' + secondsRotation + 'deg)',
        '-ms-transform': 'rotate(' + secondsRotation + 'deg)',
        'transform': 'rotate(' + secondsRotation + 'deg)'
      });
      $("#minutes").css({
        '-webkit-transform': 'rotate(' + minutesRotation  + 'deg)',
        '-moz-transform': 'rotate(' + minutesRotation + 'deg)',
        '-ms-transform': 'rotate(' + minutesRotation + 'deg)',
        'transform': 'rotate(' + minutesRotation + 'deg)'
      });
      $("#hours").css({
        '-webkit-transform': 'rotate(' + hoursRotation  + 'deg)',
        '-moz-transform': 'rotate(' + hoursRotation + 'deg)',
        '-ms-transform': 'rotate(' + hoursRotation + 'deg)',
        'transform': 'rotate(' + hoursRotation + 'deg)'
      });
    }, 1000);
  }
  
  // Give column representing passed days and the current day this week a height
  function loadBars() {
    for(var i = 1; i <= dayName; i++){
      var newHeight = (Math.floor(Math.random() * 85) + 5);
      var newTop = 110 -  newHeight;
      $("#x"+i).css({
        'height' : newHeight + 'px',
      }); 
    }
  }

  function init() {   
    $(".center-preview").lettering();
    $(".day-name-preview").lettering(); 
    $(".day-name-text").lettering();
    $(".day-preview").lettering();
    $(".day-text").lettering();
    $(".month-preview").lettering();
    $(".month-text").lettering();
    $('.day-preview').fadeTo(10, 1);
    $('.month-preview').fadeTo(10, 1);
    $('.day-name-preview').fadeTo(10, 1);
    $('.center-preview').fadeTo(10, 1);

    // Get date variables
    date = new Date();
    dayName = date.getDay(); // Day of week (1-7)
    day = date.getDate(); // Get current date (1-31)
    month = date.getMonth() + 1; // Current month (1-12)
    if (dayName == 0) {
      dayName = 7;
    }
    // Fade in/out second dial and rotate. Also fade in and animate side elements.
    setTimeout(function() {
      $('.day-preview').fadeTo(500, 0);
      $('.day-text').fadeTo(500, 1, function() {
        rotateRing(day, sectionsDay, charactersDay, '#r3', '.day-text', dayColor);
      });
    }, 500);

    // Fade in/out second dial and rotate. Also fade in and animate side elements.
    setTimeout(function() {
      $('.month-preview').fadeTo(500, 0);
      $('.fa-cloud').fadeTo(500, 1);
      $('.temperature').fadeTo(500, 1);
      $('.bars').fadeTo(500, 1);
      $('.month-text').fadeTo(500, 1, function() {
        rotateRing(month, sectionsMonth, charactersMonth, '#r2', '.month-text', monthColor);
        loadBars();
      });
    }, 1000);

    // Fade in/out first dial and rotate
    setTimeout(function() {
      $('.day-name-preview').fadeTo(500, 0);
      $('.day-name-text').fadeTo(500, 1, function() {
        rotateRing(dayName, sectionsDayName, charactersDayName, '#r1', '.day-name-text', dayNameColor);
      });
    }, 1500);

    // Fade in/out center dial
    setTimeout(function() {
      $('.center-preview').fadeTo(500, 0);
      $('.head').fadeTo(500, 0);
      $('.torso').fadeTo(500, 0);
      $(".hand-container").fadeTo(500, 1, function() {
        //console.log("Clock faded in");
      });
    }, 2000);

    // Begin clock rotation now it is visible
    clockRotation();
  }

  init();
});

External CSS

  1. https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css

External JavaScript

  1. https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.0/jquery.min.js
  2. //cdnjs.cloudflare.com/ajax/libs/lettering.js/0.6.1/jquery.lettering.min.js