Dribbble rebound to CodePen crossover: http://drbl.in/jxHT
Had this unused d3 line chart code laying around so decided to show it off. Used Ishtar UI Kit for the design inspiration.
A Pen by Sean Barclay on CodePen.
| main(role="main") | |
| #entity-chart | |
| .form-container | |
| form#benchmarks | |
| fieldset(name="benchmarks", class="benchmarks") | |
| .checkbox-wrap | |
| label(href="#", for="league-average", class="benchmarks-label") 400's | |
| input(type="checkbox", name="benchmarks", id="league-average", class="benchmarks-checkbox") | |
| span | |
| span | |
| .checkbox-wrap | |
| label(href="#", for="top-10", class="benchmarks-label") 300's | |
| input(type="checkbox", name="benchmarks", id="top-10", class="benchmarks-checkbox") | |
| span | |
| span |
Dribbble rebound to CodePen crossover: http://drbl.in/jxHT
Had this unused d3 line chart code laying around so decided to show it off. Used Ishtar UI Kit for the design inspiration.
A Pen by Sean Barclay on CodePen.
| var w = 780, | |
| h = 350, | |
| vis = null, | |
| g, | |
| current, | |
| duration = 700, | |
| ease = "cubic-out", | |
| reset = [0,0,0,0,0,0,0,0,0,0,0,0,0]; | |
| function draw(id) { | |
| var data = generateData(), | |
| other_data = generateOtherData(), | |
| margin = 30, | |
| y = d3.scale.linear().domain([0, d3.max(data)]).range([0 + margin, h - 60]), | |
| x = d3.scale.linear().domain([0, data.length]).range([0 + margin, w + 50]), | |
| line = d3.svg.line() | |
| .x(function(d,i) { return x(i); }) | |
| .y(function(d) { return -1 * y(d); }); | |
| console.log(data); | |
| var vis = d3.select("#entity-chart").select("svg").select("g"); | |
| if (vis.empty()) { | |
| vis = d3.select("#entity-chart") | |
| .append("svg:svg") | |
| .attr("width", w) | |
| .attr("height", h); | |
| g = vis.append("svg:g") | |
| .attr("transform", "translate(0, 350)"); | |
| g.append("svg:line") | |
| .attr("x1", x(0)) | |
| .attr("y1", -1 * y(0)) | |
| .attr("x2", x(w)) | |
| .attr("y2", -1 * y(0)) | |
| g.selectAll(".xLabel") | |
| .data(x.ticks(12)) | |
| .enter().append("svg:text") | |
| .attr("class", "xLabel") | |
| .text(String) | |
| .attr("x", function(d) { return x(d-1) }) | |
| .attr("y", 0) | |
| .attr("text-anchor", "middle"); | |
| } | |
| g.append("svg:path") | |
| .attr("class", id) | |
| .attr("d", line(reset)) | |
| .transition().duration(duration).ease(ease) | |
| .attr("d", line(data)); | |
| g.selectAll("dot") | |
| .data(data) | |
| .enter().append("circle") | |
| .attr("class", id) | |
| .attr("r", 6.5) | |
| .attr("cx", function(d,i) { return x(i); }) | |
| .attr("cy", 0) | |
| .transition().duration(duration).ease(ease) | |
| .attr("cy", function(d) { return -1 * y(d); }) | |
| .attr("title", function(d,i) { return x(i); }); | |
| current = id; | |
| console.log("current = "+current, "data = "+data); | |
| $('svg circle').tipsy({ | |
| gravity: 's', | |
| html: true, | |
| fade: true, | |
| opacity: 0.95, | |
| title: function() { | |
| var d = this.__data__; | |
| var pDate = d.date; | |
| return 'Metric: ' + Math.floor(d); | |
| } | |
| }); | |
| } | |
| function removeData(id) { | |
| d3.selectAll("circle."+id) | |
| .transition().duration(duration).ease(ease) | |
| .attr("cy", 0) | |
| .attr("r", 0) | |
| .remove(); | |
| d3.selectAll("path."+id).remove(); | |
| } | |
| function generateData() { | |
| var data = []; | |
| for (var i = 0, l = 12; i < l; i++) { | |
| data.push(Math.round(Math.random() * l)) | |
| } | |
| return data; | |
| } | |
| function generateOtherData() { | |
| var other_data = [3,9,3,1,5,4,4,5,6,9,4,2]; | |
| return other_data; | |
| } | |
| function subMetricChange() { | |
| $('.benchmarks-checkbox').on('change', function(e) { | |
| id = $(this).attr("id"); | |
| if ($(this).is(":checked")) { | |
| $(this).parent().addClass("active"); | |
| draw(id); | |
| } else { | |
| removeData(id); | |
| $(this).parent().removeClass("active"); | |
| } | |
| e.preventDefault(); | |
| }); | |
| $('button[type="submit"]').on('click', function(e) { | |
| $('.benchmarks-checkbox').prop('checked', false); | |
| $('.benchmarks-label').removeClass("active"); | |
| id = $(this).attr("id"); | |
| $(".sub-metric-checkbox").parent().removeClass("active"); | |
| d3.selectAll("circle") | |
| .transition().duration(duration).ease(ease) | |
| .attr("cy", 0) | |
| .attr("r", 0) | |
| .remove(); | |
| d3.selectAll("path").remove(); | |
| $(this).parent().addClass("active"); | |
| draw(id); | |
| e.preventDefault(); | |
| }); | |
| } | |
| function pageInit() { | |
| $('#Scoring-Metric-1').addClass("first").attr("checked", "checked").parent().addClass("active"); | |
| id = $('.sub-metric-checkbox.first').attr("id"); | |
| draw(id); | |
| } | |
| $(document).ready( function() { | |
| subMetricChange(); | |
| pageInit(); | |
| }); |
| // --- Variables | |
| // --------------------------------------------------- | |
| // color | |
| $color-1: #222; // light silver | |
| $color-2: #111; // slate | |
| $color-3: #98CB32; // accent GREEN | |
| $color-4: #98CB32; // dot GREEN | |
| $color-5: #F2F2F2; // light white | |
| $color-6: #e9e9e9; // darker white | |
| $color-7: #d0d1d1; // grey | |
| $color-8: #98CB32; // GREEN | |
| $color-10: #378ABF; // button blue | |
| $color-11: #E6E6E6; // shade grey | |
| $color-orange: #E75D37; // orange | |
| $color-regtext: #42474C; // gray | |
| // fonts | |
| $font: 'Helvetica Neue', sans-serif; | |
| // --- end variables --------------------------------- | |
| // --- Mixins | |
| // --------------------------------------------------- | |
| // transitions | |
| @mixin transition($property, $duration) { | |
| -webkit-transition: $property $duration ease-in-out; | |
| -moz-transition: $property $duration ease-in-out; | |
| -o-transition: $property $duration ease-in-out; | |
| -ms-transition: $property $duration ease-in-out; | |
| transition: $property $duration ease-in-out; | |
| } | |
| @mixin gradient($from, $to) { | |
| background-color: $to; | |
| background-image: -moz-linear-gradient($from, $to); | |
| background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from($from), to($to)); | |
| background-image: -webkit-linear-gradient($from, $to); | |
| background-image: -o-linear-gradient($from, $to); | |
| } | |
| @mixin gradient-horizontal-three-colors($start-color: $color-6, $mid-color: $color-5, $color-stop: 50%, $end-color: $color-6) { | |
| background-image: -webkit-gradient(left, linear, 0 0, 0 100%, from($start-color), color-stop($color-stop, $mid-color), to($end-color)); | |
| background-image: -webkit-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color); | |
| background-image: -moz-linear-gradient(left, $start-color, $mid-color $color-stop, $end-color); | |
| background-image: linear-gradient(to right, $start-color, $mid-color $color-stop, $end-color); | |
| background-repeat: no-repeat; | |
| } | |
| // clearfix | |
| @mixin clearfix { | |
| &:after { | |
| content: ""; | |
| display: table; | |
| clear: both; } | |
| *zoom: 1; | |
| } | |
| // --- end mixins ------------------------------------ | |
| // --- Base styles | |
| // --------------------------------------------------- | |
| // allow padding and border to be calc with width | |
| // and reset margin/padding | |
| * { | |
| -webkit-box-sizing: border-box; | |
| -moz-box-sizing: border-box; | |
| box-sizing: border-box; | |
| margin: 0; | |
| padding: 0; | |
| } | |
| body { | |
| @include gradient($color-1, $color-2); | |
| background-repeat: no-repeat; | |
| -webkit-tap-highlight-color: rgba(0,0,0,0); | |
| font-family: $font; | |
| font-weight: 300; | |
| color: $color-regtext; | |
| } | |
| [role="main"] { | |
| display: -ms-flexbox; | |
| display: -webkit-flex; | |
| display: flex; | |
| -webkit-justify-content: center; | |
| -moz-justify-content: center; | |
| justify-content: center; | |
| } | |
| // --- end base styles ------------------------------- | |
| // -// --- Ishtar styles | |
| // --------------------------------------------------- | |
| #entity-chart { | |
| position: relative; | |
| margin: 10% 0; | |
| padding: 0 50px 30px 30px; | |
| border-radius: 4px; | |
| box-shadow: 0 40px 50px rgba(0,0,0,.3), inset 0 -5px 5px rgba(0,0,0,.3); | |
| border-top: 2px solid white; | |
| width: 850px; | |
| height: 500px; | |
| @include clearfix; | |
| @include gradient-horizontal-three-colors(); | |
| &:before { | |
| content: ''; | |
| position: absolute; | |
| z-index: 1; | |
| display: block; | |
| left: 0px; | |
| top: 10px; | |
| margin: 30px; | |
| height: 280px; | |
| width: 790px; | |
| @include gradient-horizontal-three-colors($start-color: $color-6, $mid-color: $color-11, $color-stop: 50%, $end-color: $color-6); | |
| } | |
| &:after { | |
| content: ''; | |
| position: absolute; | |
| z-index: 1; | |
| display: block; | |
| left: 20px; | |
| top: 10px; | |
| margin: 30px; | |
| height: 1px; | |
| width: 750px; | |
| background: $color-7; | |
| } | |
| } | |
| svg { | |
| position: relative; | |
| z-index: 2; | |
| } | |
| #entity-chart line { | |
| stroke: $color-regtext; | |
| } | |
| #entity-chart text { | |
| fill: $color-regtext; | |
| } | |
| #entity-chart path { | |
| stroke: $color-8; | |
| stroke-width: 3px; | |
| fill: none; | |
| } | |
| #entity-chart circle { | |
| stroke: $color-4; | |
| fill: #fff; | |
| stroke-width: 3px; | |
| } | |
| #entity-chart circle:hover, | |
| #entity-chart circle.active { | |
| stroke-width: 6px; | |
| cursor: pointer; | |
| } | |
| #entity-chart path[class*="average"], | |
| #entity-chart path[class*="top"], | |
| #entity-chart path[class*="bottom"] { | |
| stroke: $color-orange; | |
| } | |
| #entity-chart circle[class*="average"], | |
| #entity-chart circle[class*="top"], | |
| #entity-chart circle[class*="bottom"] { | |
| fill: white; | |
| stroke: $color-orange; | |
| } | |
| #entity-chart circle:hover { | |
| cursor: pointer; | |
| stroke: $color-4; | |
| } | |
| .tipsy { | |
| font-size: 14px; | |
| position: absolute; | |
| padding: 5px; | |
| margin-top: -8px; | |
| margin-left: 6.5px; | |
| z-index: 100000; | |
| text-shadow: 0 1px 1px rgba(0,0,0,.3); | |
| } | |
| .tipsy-inner { | |
| @include gradient($color-3, $color-4); | |
| color: #fff; | |
| max-width: 200px; | |
| padding: 5px 8px 4px 8px; | |
| text-align: center; | |
| box-shadow: 0 1px 2px rgba(0,0,0,.3); | |
| border-radius: 3px; | |
| } | |
| .tipsy-arrow { | |
| position: absolute; | |
| width: 0; | |
| height: 0; | |
| line-height: 0; | |
| border: 5px dashed $color-4; | |
| } | |
| .tipsy-arrow-s { | |
| border-top-color: $color-4; | |
| } | |
| .tipsy-s .tipsy-arrow { | |
| bottom: 0; | |
| left: 50%; | |
| margin-left: -5px; | |
| border-top-style: solid; | |
| border-bottom: none; | |
| border-left-color: transparent; | |
| border-right-color: transparent; | |
| } | |
| .form-container { | |
| text-rendering: geometricPrecision; | |
| position: absolute; | |
| bottom: 9px; | |
| left: 60px; | |
| height: 80px; | |
| width: 750px; | |
| text-shadow: 0 1px 1px rgba(255,255,255,.5); | |
| fieldset { | |
| border: none; | |
| @include clearfix; | |
| } | |
| .checkbox-wrap { | |
| float: left; | |
| font-size: 23px; | |
| padding-right: 18px; | |
| -webkit-user-select: none; | |
| -moz-user-select: none; | |
| -ms-user-select: none; | |
| user-select: none; | |
| } | |
| input[type="checkbox"] { | |
| visibility: hidden; | |
| } | |
| label { | |
| padding-left: 51px; | |
| position: relative; | |
| span { | |
| @include transition(all, .2s); | |
| width: 43px; | |
| height: 23px; | |
| border-radius: 20px; | |
| display: inline-block; | |
| position: absolute; | |
| left: 0; | |
| top: 3px; | |
| &:first-of-type { | |
| background: $color-regtext; | |
| box-shadow: inset 0 0 2px rgba(0,0,0,.3); | |
| } | |
| &:last-of-type { | |
| position: absolute; | |
| width: 19px; | |
| height: 19px; | |
| border-radius: 19px; | |
| background: white; | |
| left: 2px; | |
| top: 5px; | |
| } | |
| } | |
| &.active { | |
| span { | |
| &:first-of-type { | |
| background: $color-4; | |
| } | |
| &:last-of-type { | |
| left: 22px; | |
| } | |
| } | |
| } | |
| &:hover { | |
| cursor: pointer; | |
| } | |
| } | |
| button { | |
| @include transition(background, .2s); | |
| background: $color-10; | |
| border-radius: 3px; | |
| border: 2px solid $color-10; | |
| padding: 10px 20px; | |
| position: relative; | |
| top: -42px; | |
| float: right; | |
| color: white; | |
| font-size: 22px; | |
| outline: none; | |
| &:hover, | |
| &:focus, | |
| &:active { | |
| cursor: pointer; | |
| background: darken($color-10, 5%); | |
| } | |
| &:active { | |
| @include transition(background, 0s); | |
| margin-top: 2px; | |
| margin-right: 2px; | |
| border-size: 1px; | |
| background: darken($color-10, 10%); | |
| font-size: 21px; | |
| } | |
| } | |
| } |