JSFiddle - React, Tailwind, and code Playground

by Dug Sohn

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.1.6/Chart.bundle.js"></script>
<div id="understadnmybill" class="chart"></div>

CSS

@import url(//fonts.googleapis.com/css?family=Oswald:400);

body {
  background: #222428;
  font-family: "Oswald", sans-serif;
}
h1 {
  color: #eee;
  text-align: center;
  margin: 20px 0;
  text-transform: uppercase;
}
.chart {
  margin: 0 auto;
  width: 450px;
  height: 450px;
  position: relative;
}
.doughnutTip {
  position: absolute;
  float: left;
  min-width: 30px;
  max-width: 300px;
  padding: 5px 15px;
  border-radius: 1px;
  background: rgba(0,0,0,.8);
  color: #ddd;
  font-size: 17px;
  text-shadow: 0 1px 0 #000;
  text-transform: uppercase;
  text-align: center;
  line-height: 1.3;
  letter-spacing: .06em;
  box-shadow: 0 1px 3px rgba(0,0,0,0.5);
  transform: all .3s;
  pointer-events: none;
}
.doughnutTip:after {
  position: absolute;
  left: 50%;
  bottom: -6px;
  content: "";
  height: 0;
  margin: 0 0 0 -6px;
  border-right: 5px solid transparent;
  border-left: 5px solid transparent;
  border-top: 6px solid rgba(0,0,0,.7);
  line-height: 0;
}
.doughnutSummary {
  position: absolute;
  top: 45%;
  left: 50%;
  color: #d5d5d5;
  text-align: center;
  text-shadow: 0 -1px 0 #111;
  cursor: default;
}
.doughnutSummaryTitle {
  position: absolute;
  top: 70%;
  width: 100%;
  font-size: 28px;
  letter-spacing: .06em;
  line-height:26px;
  color: rgba(46,177,52,1.0);
}
.doughnutTypeTitle {
  position: absolute;
  top: 45%;
  width: 100%;
  font-size: 22px;
  letter-spacing: .06em;
  line-height:22px;
}
.doughnutSummaryNumber {
  position: absolute;
  top: 10%;
  width: 100%;
  margin-top: -15%;
  font-size: 95px;
}
.doughnutSummaryNumber:after {
  content: '%';
}
.chart path:hover { 
  opacity: .65; 
}

JavaScript

;(function($, undefined) {
  $.fn.drawDoughnutChart = function(data, options) {
    var $this = this,
      W = $this.width(),
      H = $this.height(),
      centerX = W/2,
      centerY = H/2,
      cos = Math.cos,
      sin = Math.sin,
      PI = Math.PI,
      settings = $.extend({
        segmentShowStroke : true,
        segmentStrokeColor : "#0C1013",
        segmentStrokeWidth : 1,
        baseColor: "rgba(0,0,0,0.5)",
        baseOffset: 4,
        edgeOffset : 10,//offset from edge of $this
        percentageInnerCutout : 75,
        animation : true,
        animationSteps : 90,
        animationEasing : "easeInOutExpo",
        animateRotate : true,
        tipOffsetX: -8,
        tipOffsetY: -45,
        tipClass: "doughnutTip",
        summaryClass: "doughnutSummary",
        summaryTitle: "Contract Time Remaining:",
        summaryTitleClass: "doughnutSummaryTitle",
        summaryTypeClass: "doughnutTypeTitle",
        summaryNumberClass: "doughnutSummaryNumber",
        beforeDraw: function(){  },
        afterDrawed : function(){  },
        onPathEnter : function(e,data){  },
        onPathLeave : function(e,data){  }
      }, options),
      animationOptions = {
        linear : function (t){
          return t;
        },
        easeInOutExpo: function (t) {
          var v = t<.5 ? 8*t*t*t*t : 1-8*(--t)*t*t*t;
          return (v>1) ? 1 : v;
        }
      };
    var requestAnimFrame = function(){
      return window.requestAnimationFrame ||
        window.webkitRequestAnimationFrame ||
        window.mozRequestAnimationFrame ||
        window.oRequestAnimationFrame ||
        window.msRequestAnimationFrame ||
        function(callback) {
          window.setTimeout(callback, 1000 / 60);
        };
    }();

    settings.beforeDraw.call($this);

    var $svg = $('<svg width="' + W + '" height="' + H + '" viewBox="0 0 ' + W + ' ' + H + '" xmlns="http://www.w3.org/2000/svg"...