{"version":3,"sources":["webpack:///webpack/universalModuleDefinition","webpack:///webpack/bootstrap 80ddcf5c6c58b547db86","webpack:///./src/scripts/index.js","webpack:///./src/scripts/utils.js","webpack:///external {\"root\":\"d3\",\"amd\":\"d3\",\"commonjs\":\"d3\",\"commonjs2\":\"d3\"}","webpack:///external {\"root\":\"strain\",\"amd\":\"strain\",\"commonjs\":\"strain\",\"commonjs2\":\"strain\"}","webpack:///./src/scripts/view.js","webpack:///./src/scripts/widgets/index.js","webpack:///./src/scripts/widgets/pie.js","webpack:///./src/scripts/widgets/widget.js","webpack:///./src/scripts/widgets/bars.js","webpack:///./src/scripts/widgets/last.js","webpack:///./src/scripts/widgets/lines.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;ACVA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA,uBAAe;AACf;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;;;;;;ACtCA;AACA;AACA;;;;;;;ACFA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;;AAGH;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;;;AAGH;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;;AAGA;AACA;AACA;;;;;;;AC7HA,gD;;;;;;ACAA,gD;;;;;;ACAA;AACA;;;AAGA;AACA;AACA;AACA,IAAG;AACH,sBAAqB;;AAErB;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,IAAG;;;;;;;ACrBH;AACA;AACA;AACA;AACA;;;;;;;ACJA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA,yBAAwB,gBAAgB,EAAE;;AAE1C;AACA;AACA,yBAAwB,kBAAkB,EAAE;;AAE5C;AACA;AACA,4BAA2B,UAAU,EAAE;;AAEvC;AACA;AACA,yBAAwB,gBAAgB,EAAE;;AAE1C;AACA;AACA,yBAAwB,gBAAgB,EAAE;;AAE1C;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,IAAG;;;AAGH;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA,wBAAuB,gBAAgB,EAAE;AACzC;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA,yBAAwB,gBAAgB,EAAE;;AAE1C;AACA,wBAAuB,kBAAkB,EAAE;AAC3C,wBAAuB,mBAAmB,EAAE;AAC5C;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,iCAAgC,qBAAqB,EAAE;;AAEvD;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;;AAEA;AACA,wBAAuB,UAAU,EAAE;AACnC,wBAAuB,cAAc,EAAE;AACvC;;AAEA;AACA,yBAAwB,UAAU,EAAE;AACpC;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA,uCAAsC,gBAAgB,EAAE;;AAExD;AACA,wBAAuB,gBAAgB,EAAE;;AAEzC;AACA,wBAAuB,sCAAsC,EAAE;;AAE/D;AACA,wBAAuB,kCAAkC,EAAE;;AAE3D;AACA;AACA;;;AAGA;AACA;AACA,yBAAwB,4BAA4B,EAAE;AACtD;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,qDAAoD,gBAAgB,EAAE;AACtE,2CAA0C,2BAA2B,EAAE;AACvE;;;AAGA;AACA;AACA;;;AAGA;AACA;AACA;;;;;;;AC/RA;AACA;AACA;;;;;;;ACFA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA,yBAAwB,gBAAgB,EAAE;;AAE1C;AACA;AACA,yBAAwB,iBAAiB,EAAE;;AAE3C;AACA;AACA,yBAAwB,YAAY,EAAE;;AAEtC;AACA;AACA,yBAAwB,YAAY,EAAE;;AAEtC;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA;AACA,IAAG;;;AAGH;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA,wBAAuB,gBAAgB,EAAE;AACzC;;;AAGA;AACA;AACA;AACA,yBAAwB,iBAAiB,EAAE;;AAE3C;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA,0CAAyC,YAAY,EAAE;AACvD,0CAAyC,mBAAmB,EAAE;;AAE9D;AACA,uBAAsB,YAAY,EAAE;;AAEpC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA,wBAAuB,UAAU,EAAE;AACnC,wBAAuB,YAAY,EAAE;AACrC;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA;AACA;AACA,MAAK;AACL;AACA,yC;AACA,MAAK;;AAEL;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA,MAAK;;AAEL;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;AC7PA;AACA;;;AAGA;AACA;AACA;AACA,yBAAwB,gBAAgB,EAAE;;AAE1C;AACA;AACA,yBAAwB,iBAAiB,EAAE;;AAE3C;AACA;AACA,yBAAwB,YAAY,EAAE;;AAEtC;AACA;AACA,yBAAwB,YAAY,EAAE;;AAEtC;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA,qBAAoB,wCAAwC,EAAE;;AAE9D;AACA;AACA,qBAAoB,wCAAwC,EAAE;;AAE9D;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,IAAG;;;AAGH;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;;;AAGA;AACA;AACA;AACA,wBAAuB,gBAAgB,EAAE;AACzC;;;AAGA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA,uDAAsD,YAAY,EAAE;AACpE;;AAEA;AACA,uDAAsD,YAAY,EAAE;AACpE;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA,wBAAuB,oBAAoB,EAAE;AAC7C;AACA;;;AAGA;AACA;AACA,qBAAoB,gBAAgB,EAAE;AACtC,qBAAoB,gBAAgB,EAAE;;AAEtC;AACA;;AAEA;AACA,yBAAwB,oBAAoB,EAAE;AAC9C;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA,8BAA6B,gBAAgB,EAAE;AAC/C,8BAA6B,gBAAgB,EAAE;;AAE/C;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA,MAAK;AACL;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;AACL;AACA;AACA,MAAK;AACL;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;;AAGH;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;;;;;;AClSA;AACA;;;AAGA;AACA;AACA;AACA,yBAAwB,gBAAgB,EAAE;;AAE1C;AACA;AACA,yBAAwB,kBAAkB,EAAE;;AAE5C;AACA;AACA,4BAA2B,UAAU,EAAE;;AAEvC;AACA;AACA,yBAAwB,gBAAgB,EAAE;;AAE1C;AACA;AACA,yBAAwB,iBAAiB,EAAE;;AAE3C;AACA;AACA,yBAAwB,YAAY,EAAE;;AAEtC;AACA;AACA,yBAAwB,YAAY,EAAE;;AAEtC;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;;AAEA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;AACA,IAAG;;;AAGH;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA,wBAAuB,gBAAgB,EAAE;AACzC;;;AAGA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA,MAAK;;AAEL;AACA,+CAA8C,YAAY,EAAE;AAC5D;;AAEA;AACA,uBAAsB,YAAY,EAAE;;AAEpC;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;AACA,qBAAoB,gBAAgB,EAAE;AACtC,qBAAoB,gBAAgB,EAAE;;AAEtC;AACA,wBAAuB,UAAU,EAAE;AACnC,wBAAuB,cAAc,EAAE;AACvC;AACA;;;AAGA;AACA;AACA;AACA,oCAAmC,cAAc,EAAE;AACnD;AACA;;AAEA;AACA,kCAAiC,gBAAgB,EAAE;AACnD,6BAA4B,uBAAuB,EAAE;;AAErD;AACA;;AAEA;AACA;AACA,8BAA6B,WAAW;AACxC;;AAEA;AACA;AACA;AACA;AACA,QAAO;AACP,MAAK;AACL;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA,gCAA+B,gBAAgB,EAAE;AACjD,8BAA6B,gBAAgB,EAAE;AAC/C,8BAA6B,gBAAgB,EAAE;;AAE/C;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;;AAEA;AACA,wBAAuB,UAAU,EAAE;AACnC,wBAAuB,cAAc,EAAE;AACvC;AACA;;;AAGA;AACA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA,uCAAsC,gBAAgB,EAAE;;AAExD;AACA,wBAAuB,gBAAgB,EAAE;;AAEzC;AACA;AACA;;AAEA;AACA;AACA;AACA,MAAK;;AAEL;AACA;AACA;;;AAGA;AACA;AACA,oCAAmC,cAAc,EAAE;AACnD;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;;AAGA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA,IAAG;;AAEH;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA","file":"sapphire.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"d3\"), require(\"strain\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"d3\", \"strain\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"sapphire\"] = factory(require(\"d3\"), require(\"strain\"));\n\telse\n\t\troot[\"sapphire\"] = factory(root[\"d3\"], root[\"strain\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_2__, __WEBPACK_EXTERNAL_MODULE_3__) {\nreturn \n\n\n/** WEBPACK FOOTER **\n ** webpack/universalModuleDefinition\n **/"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n/** WEBPACK FOOTER **\n ** webpack/bootstrap 80ddcf5c6c58b547db86\n **/","exports.utils = require('./utils');\nexports.view = require('./view');\nexports.widgets = require('./widgets');\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/scripts/index.js\n ** module id = 0\n ** module chunks = 0\n **/","var d3 = require('d3');\nvar strain = require('strain');\nvar utils = exports;\n\n\nutils.access = function(d, name, defaultval) {\n if (arguments.length < 3) {\n defaultval = null;\n }\n\n if (typeof d != 'object') {\n return defaultval;\n }\n\n var val = d[name];\n return typeof val == 'undefined'\n ? defaultval\n : val;\n};\n\n\nutils.ensure = function(v, defaultval) {\n return v === null || typeof v == 'undefined'\n ? defaultval\n : v;\n};\n\n\nutils.translate = function(x, y) {\n return 'translate(' + x + ', ' + y + ')';\n};\n\n\nutils.ensureEl = function(el) {\n return !(el instanceof d3.selection)\n ? d3.select(el)\n : el;\n};\n\n\nutils.date = function(t) {\n return new Date(t);\n};\n\n\nutils.px = function(fn) {\n fn = d3.functor(fn);\n\n return function(d, i) {\n return fn.call(this, d, i) + 'px';\n };\n};\n\n\nutils.box = strain()\n .prop('width')\n .default(0)\n\n .prop('height')\n .default(0)\n\n .prop('margin')\n .default({\n top: 0,\n left: 0,\n right: 0,\n bottom: 0\n })\n\n .meth('calc', function() {\n var d = {};\n d.margin = this.margin();\n d.width = this.width();\n d.height = this.height();\n d.innerWidth = d.width - d.margin.left - d.margin.right;\n d.innerHeight = d.height - d.margin.top - d.margin.bottom;\n return d;\n })\n\n .invoke(function() {\n return this.calc();\n });\n\n\nutils.formatValue = strain()\n .prop('int')\n .default(d3.format(','))\n\n .prop('float')\n .default(d3.format(',.3f'))\n\n .invoke(function(v) {\n return utils.isInteger(v)\n ? this.int()(v)\n : this.float()(v);\n });\n\n\nutils.isInteger = function(v) {\n return +v === parseInt(v);\n};\n\n\nutils.innerWidth = function(el) {\n return utils.measure(el, 'width')\n - utils.measure(el, 'padding-left')\n - utils.measure(el, 'padding-right');\n};\n\n\nutils.innerHeight = function(el) {\n return utils.measure(el, 'height')\n - utils.measure(el, 'padding-top')\n - utils.measure(el, 'padding-bottom');\n};\n\n\nutils.measure = function(el, name) {\n el = utils.ensureEl(el);\n return parseInt(el.style(name));\n};\n\n\nutils.isEmptyNode = function() {\n return !this.hasChildNodes();\n};\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/scripts/utils.js\n ** module id = 1\n ** module chunks = 0\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_2__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external {\"root\":\"d3\",\"amd\":\"d3\",\"commonjs\":\"d3\",\"commonjs2\":\"d3\"}\n ** module id = 2\n ** module chunks = 0\n **/","module.exports = __WEBPACK_EXTERNAL_MODULE_3__;\n\n\n/*****************\n ** WEBPACK FOOTER\n ** external {\"root\":\"strain\",\"amd\":\"strain\",\"commonjs\":\"strain\",\"commonjs2\":\"strain\"}\n ** module id = 3\n ** module chunks = 0\n **/","var strain = require('strain');\nvar utils = require('./utils');\n\n\nmodule.exports = strain()\n .static('draw', function(fn) {\n this.meth('_draw_', fn);\n })\n .draw(function() {})\n\n .meth('draw', function(el) {\n el = utils.ensureEl(el);\n\n var datum;\n if (el.node()) datum = el.datum();\n this._draw_.apply(this, arguments);\n if (typeof datum != 'undefined') el.datum(datum);\n })\n\n .invoke(function() {\n return this.draw.apply(this, arguments);\n });\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/scripts/view.js\n ** module id = 4\n ** module chunks = 0\n **/","exports.pie = require('./pie');\nexports.bars = require('./bars');\nexports.last = require('./last');\nexports.lines = require('./lines');\nexports.widget = require('./widget');\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/scripts/widgets/index.js\n ** module id = 5\n ** module chunks = 0\n **/","var d3 = require('d3');\nvar utils = require('../utils');\n\n\nmodule.exports = require('./widget').extend()\n .prop('colors')\n\n .prop('title')\n .set(d3.functor)\n .default(function(d) { return d.title; })\n\n .prop('metrics')\n .set(d3.functor)\n .default(function(d) { return d.metrics; })\n\n .prop('key')\n .set(d3.functor)\n .default(function(d, i) { return i; })\n\n .prop('metricTitle')\n .set(d3.functor)\n .default(function(d) { return d.title; })\n\n .prop('value')\n .set(d3.functor)\n .default(function(d) { return d.value; })\n\n .prop('chartMargin')\n .default({\n top: 20,\n left: 20,\n right: 20,\n bottom: 20\n })\n\n .prop('innerRadius')\n .set(d3.functor)\n .default(0)\n\n .prop('valueFormat')\n .default(utils.formatValue()\n .int(d3.format(','))\n .float(d3.format(',.3f')))\n\n .prop('percentFormat')\n .default(d3.format('.0%'))\n\n .init(function() {\n this.colors(d3.scale.category10());\n })\n\n .draw(function(el) {\n var opts = this.props();\n normalize(el, opts);\n drawWidget(el, opts);\n });\n\n\nfunction drawWidget(el, opts) {\n el.classed('sph-widget sph-pie', true);\n\n if (!opts.explicitComponents) initComponents(el);\n\n var component = el.select('[data-widget-component=\"title\"]');\n if (component.size()) component.call(drawTitle);\n\n component = el.select('[data-widget-component=\"chart\"]');\n if (component.size()) component.datum(getMetrics).call(drawChart, opts);\n\n component = el.select('[data-widget-component=\"legend\"]');\n if (component.size()) component.datum(getMetrics).call(drawLegend, opts);\n}\n\n\nfunction initComponents(el) {\n el.append('div')\n .attr('data-widget-component', 'title');\n\n el.append('div')\n .attr('data-widget-component', 'chart');\n\n el.append('div')\n .attr('data-widget-component', 'legend');\n}\n\n\nfunction drawTitle(title) {\n title\n .classed('sph-title', true)\n .text(function(d) { return d.title; });\n}\n\n\nfunction drawChart(chart, opts) {\n chart\n .classed('sph-chart sph-chart-pie', true);\n\n chart\n .filter(utils.isEmptyNode)\n .call(initChart);\n\n var dims = utils.box()\n .margin(opts.chartMargin)\n .width(utils.innerWidth(chart))\n .height(utils.innerHeight(chart))\n .calc();\n\n dims.radius = Math.min(dims.innerWidth, dims.innerHeight) / 2;\n\n chart.select('svg')\n .call(drawSvg, dims, opts);\n}\n\n\nfunction initChart(chart) {\n chart.append('svg')\n .append('g');\n}\n\n\nfunction drawSvg(svg, dims, opts) {\n svg\n .attr('width', dims.width)\n .attr('height', dims.height)\n .select('g')\n .attr('transform', utils.translate(\n (dims.width / 2) - dims.radius,\n (dims.height / 2) - dims.radius))\n .call(drawSlices, dims, opts);\n}\n\n\nfunction drawSlices(svg, dims, opts) {\n var arc = d3.svg.arc()\n .innerRadius(opts.innerRadius(dims.radius))\n .outerRadius(dims.radius);\n\n var layout = d3.layout.pie()\n .value(function(d) { return d.value; });\n\n svg.selectAll('.sph-pie-slice')\n .data(function(d) { return layout(d); },\n function(d) { return d.data.key; })\n .call(drawSlice, dims, arc, opts);\n}\n\n\nfunction drawSlice(slice, dims, arc, opts) {\n slice.enter().append('g')\n .attr('class', 'sph-pie-slice')\n .append('path');\n\n slice\n .attr('transform', utils.translate(dims.radius, dims.radius));\n\n slice.select('path')\n .attr('d', arc)\n .style('fill', function(d) { return d.data.color; });\n\n slice.exit()\n .remove();\n}\n\n\nfunction drawLegend(legend, opts) {\n legend\n .filter(utils.isEmptyNode)\n .call(initLegend);\n\n var table = legend.select('.sph-table-pie');\n\n table.selectAll('.sph-row-pie-metric')\n .data(function(d) { return d; },\n function(d) { return d.key; })\n .call(drawLegendMetric, opts);\n\n table\n .datum(function(d) { return d; })\n .call(drawLegendTotal, opts);\n}\n\n\nfunction initLegend(legend) {\n var table = legend.append('table')\n .attr('class', 'sph-table sph-table-pie');\n\n var tfoot = table\n .append('tr')\n .attr('class', 'sph-row-tfoot');\n\n tfoot.append('td')\n .attr('class', 'sph-col-swatch sph-col-none');\n\n tfoot.append('td')\n .attr('class', 'sph-col-pie-title')\n .text('Total');\n\n tfoot.append('td')\n .attr('class', 'sph-col-pie-percent')\n .text('100%');\n\n tfoot.append('td')\n .attr('class', 'sph-col-pie-value sph-col-pie-value-total');\n}\n\n\nfunction drawLegendMetric(metric, opts) {\n metric.enter().insert('tr', '.sph-row-tfoot')\n .call(enterLegendMetric);\n\n metric.select('.sph-col-swatch')\n .style('background', function(d) { return d.color; });\n\n metric.select('.sph-col-pie-title')\n .text(function(d) { return d.title; });\n\n metric.select('.sph-col-pie-percent')\n .text(function(d) { return opts.percentFormat(d.percent); });\n\n metric.select('.sph-col-pie-value')\n .text(function(d) { return opts.valueFormat(d.value); });\n\n metric.exit()\n .remove();\n}\n\n\nfunction drawLegendTotal(tfoot, opts) {\n tfoot.select('.sph-col-pie-value-total')\n .datum(function(d) { return d3.sum(d, getValue); })\n .text(opts.valueFormat);\n}\n\n\nfunction enterLegendMetric(metric) {\n metric\n .attr('class', 'sph-row-pie-metric');\n\n metric.append('td')\n .attr('class', 'sph-col-swatch');\n\n metric.append('td')\n .attr('class', 'sph-col-pie-title');\n\n metric.append('td')\n .attr('class', 'sph-col-pie-percent');\n\n metric.append('td')\n .attr('class', 'sph-col-pie-value');\n}\n\n\nfunction normalize(el, opts) {\n var node = el.node();\n\n el.datum(function(d, i) {\n return {\n title: opts.title.call(node, d, i),\n metrics: opts.metrics.call(node, d, i).map(metric)\n };\n });\n\n function metric(d, i) {\n var key = opts.key\n .call(node, d, i)\n .toString();\n\n return {\n key: key,\n color: opts.colors(key),\n title: opts.metricTitle.call(node, d, i),\n value: opts.value.call(node, d, i)\n };\n }\n\n var sum = d3.sum(el.datum().metrics, function(d) { return d.value; });\n el.datum().metrics.forEach(function(d) { d.percent = d.value / sum; });\n}\n\n\nfunction getMetrics(d) {\n return d.metrics;\n}\n\n\nfunction getValue(d) {\n return d.value;\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/scripts/widgets/pie.js\n ** module id = 6\n ** module chunks = 0\n **/","module.exports = require('../view').extend()\n .prop('explicitComponents')\n .default(false);\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/scripts/widgets/widget.js\n ** module id = 7\n ** module chunks = 0\n **/","var d3 = require('d3');\nvar utils = require('../utils');\n\n\nmodule.exports = require('./widget').extend()\n .prop('barPadding')\n .default(2.5)\n\n .prop('chartMargin')\n .default({\n top: 10,\n left: 38,\n right: 15,\n bottom: 45\n })\n\n .prop('title')\n .set(d3.functor)\n .default(function(d) { return d.title; })\n\n .prop('values')\n .set(d3.functor)\n .default(function(d) { return d.values; })\n\n .prop('x')\n .set(d3.functor)\n .default(function(d) { return d.x; })\n\n .prop('y')\n .set(d3.functor)\n .default(function(d) { return d.y; })\n\n .prop('dx')\n .set(d3.functor)\n .default(null)\n\n .prop('xTickFormat')\n .default(null)\n\n .prop('xTicks')\n .default(8)\n\n .prop('yTickFormat')\n .default(d3.format('s'))\n\n .prop('yTicks')\n .default(5)\n\n .prop('yMax')\n .set(d3.functor)\n .default(d3.max)\n\n .prop('colors')\n\n .init(function() {\n this.colors(d3.scale.category10());\n })\n\n .draw(function(el) {\n var opts = this.props();\n normalize(el, opts);\n\n opts.width = utils.innerWidth(el);\n opts.color = opts.colors(el.datum().title);\n drawWidget(el, opts);\n });\n\n\nfunction drawWidget(el, opts) {\n el.classed('sph-widget sph-bars', true);\n\n if (!opts.explicitComponents) initComponents(el);\n\n var component = el.select('[data-widget-component=\"title\"]');\n if (component.size()) component.call(drawTitle);\n\n component = el.select('[data-widget-component=\"chart\"]');\n if (component.size()) component.call(drawChart, opts);\n}\n\n\nfunction initComponents(el) {\n el.append('div')\n .attr('data-widget-component', 'title');\n\n el.append('div')\n .attr('data-widget-component', 'chart');\n}\n\n\nfunction drawTitle(title) {\n title\n .classed('sph-title', true)\n .text(function(d) { return d.title; });\n}\n\n\nfunction drawChart(chart, opts) {\n chart\n .classed('sph-chart sph-chart-bars', true)\n .datum(function(d) { return d.values; });\n\n var dims = utils.box()\n .width(opts.width)\n .height(utils.innerHeight(chart))\n .margin(opts.chartMargin)\n .calc();\n\n var fx = d3.time.scale()\n .domain([\n d3.min(chart.datum(), function(d) { return d.x; }),\n d3.max(chart.datum(), function(d) { return d.x + d.dx; })]);\n\n var ys = chart.datum()\n .map(function(d) { return d.y; });\n\n var fy = d3.scale.linear()\n .domain([0, opts.yMax(ys)]);\n\n fx.range([0, dims.innerWidth]);\n fy.range([dims.innerHeight, 0]);\n\n chart\n .filter(utils.isEmptyNode)\n .call(initChart);\n\n chart.select('svg')\n .call(drawSvg, dims, fx, fy, opts);\n}\n\n\nfunction initChart(chart) {\n var svg = chart\n .append('svg')\n .append('g');\n\n svg.append('g')\n .attr('class', 'sph-bars-bars');\n\n svg.append('g')\n .attr('class', 'sph-axis sph-axis-bars-y');\n\n svg.append('g')\n .attr('class', 'sph-axis sph-axis-bars-x');\n}\n\n\nfunction drawSvg(svg, dims, fx, fy, opts) {\n svg\n .attr('width', dims.width)\n .attr('height', dims.height)\n .select('g')\n .attr('transform', utils.translate(\n dims.margin.left,\n dims.margin.top));\n\n svg.select('.sph-bars-bars')\n .call(drawBars, dims, fx, fy, opts);\n\n svg.select('.sph-axis-bars-x')\n .call(drawXAxis, dims, fx, opts);\n\n svg.select('.sph-axis-bars-y')\n .call(drawYAxis, dims, fy, opts);\n}\n\n\nfunction drawBars(bars, dims, fx, fy, opts) {\n bars\n .selectAll('.sph-bars-bar')\n .data(function(d) { return d; },\n function(d) { return d.x; })\n .call(drawBar, dims, fx, fy, opts);\n}\n\n\nfunction drawBar(bar, dims, fx, fy, opts) {\n bar.enter().append('g')\n .attr('class', 'sph-bars-bar')\n .append('rect');\n\n bar\n .attr('transform', function(d) {\n return utils.translate(fx(d.x), fy(d.y));\n });\n\n bar.select('rect')\n .style('fill', opts.color)\n .attr('width', function(d) {\n var width = fx(d.x + d.dx) - fx(d.x);\n width -= opts.barPadding;\n return Math.max(width, 1);\n })\n .attr('height', function(d) {\n return dims.innerHeight - fy(d.y); \n });\n\n bar.exit()\n .remove();\n}\n\n\nfunction drawXAxis(axis, dims, fx, opts) {\n axis\n .attr('transform', utils.translate(0, dims.innerHeight))\n .call(d3.svg.axis()\n .scale(fx)\n .ticks(opts.xTicks)\n .tickFormat(opts.xTickFormat));\n}\n\n\nfunction drawYAxis(axis, dims, fy, opts) {\n axis.call(d3.svg.axis()\n .orient('left')\n .scale(fy)\n .tickPadding(8)\n .tickSize(-dims.innerWidth)\n .ticks(opts.yTicks)\n .tickFormat(opts.yTickFormat));\n}\n\n\nfunction normalize(el, opts) {\n var node = el.node();\n\n el.datum(function(d, i) {\n var values = opts.values\n .call(node, d, i)\n .map(value);\n\n var len = values.length;\n var dxAvg = values.length\n ? (values[len - 1].x - values[0].x) / len\n : 0;\n\n values.forEach(function(d) {\n d.dx = utils.ensure(d.dx, dxAvg);\n });\n\n return {\n values: values,\n title: opts.title.call(node, d, i)\n };\n });\n\n function value(d, i) {\n return {\n x: opts.x.call(node, d, i),\n y: opts.y.call(node, d, i),\n dx: opts.dx.call(node, d, i)\n };\n }\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/scripts/widgets/bars.js\n ** module id = 8\n ** module chunks = 0\n **/","var d3 = require('d3');\nvar utils = require('../utils');\n\n\nmodule.exports = require('./widget').extend()\n .prop('title')\n .set(d3.functor)\n .default(function(d) { return d.title; })\n\n .prop('values')\n .set(d3.functor)\n .default(function(d) { return d.values; })\n\n .prop('x')\n .set(d3.functor)\n .default(function(d) { return d.x; })\n\n .prop('y')\n .set(d3.functor)\n .default(function(d) { return d.y; })\n\n .prop('yFormat')\n .default(utils.formatValue()\n .int(d3.format(','))\n .float(d3.format(',.3f')))\n\n .prop('diffFormat')\n .default(utils.formatValue()\n .int(d3.format('+,'))\n .float(d3.format('+,.3f')))\n\n .prop('xFormat')\n .default(d3.time.format('%-d %b %-H:%M'))\n\n .prop('none')\n .default(0)\n\n .prop('summaryLimit')\n .default(2)\n .set(function(v) { return Math.max(utils.ensure(v, 2), 2); })\n\n .prop('sparklineLimit')\n .default(15)\n .set(function(v) { return Math.max(utils.ensure(v, 2), 2); })\n\n .prop('sparklineMargin')\n .default({\n top: 4,\n left: 4,\n bottom: 4,\n right: 4 \n })\n\n .draw(function(el) {\n var opts = this.props();\n normalize(el, opts);\n drawWidget(el, opts);\n });\n\n\nfunction drawWidget(el, opts) {\n el.classed('sph-widget sph-last', true)\n .classed('sph-is-status-good', false)\n .classed('sph-is-status-bad', false)\n .classed('sph-is-status-neutral', false)\n .classed(getStatus(el.datum().values), true);\n\n if (!opts.explicitComponents) initComponents(el);\n\n var component = el.select('[data-widget-component=\"title\"]');\n if (component.size()) component.call(drawTitle);\n\n component = el.select('[data-widget-component=\"last-value\"]');\n if (component.size()) component.datum(getValues).call(drawLastValue, opts);\n\n component = el.select('[data-widget-component=\"sparkline\"]');\n if (component.size()) component.datum(getValues).call(drawSparkline, opts);\n\n component = el.select('[data-widget-component=\"summary\"]');\n if (component.size()) component.datum(getValues).call(drawSummary, opts);\n}\n\n\nfunction initComponents(el) {\n el.append('div')\n .attr('data-widget-component', 'title');\n\n el.append('div')\n .attr('data-widget-component', 'last-value');\n\n el.append('div')\n .attr('data-widget-component', 'sparkline');\n\n el.append('div')\n .attr('data-widget-component', 'summary');\n}\n\n\nfunction getValues(d) {\n return d.values;\n}\n\n\nfunction drawTitle(title) {\n title\n .classed('sph-title', true)\n .text(function(d) { return d.title; });\n}\n\n\nfunction drawLastValue(value, opts) {\n value\n .classed('sph-last-value', true)\n .datum(function(d, i) {\n d = d[d.length - 1];\n\n return !d\n ? opts.none\n : d.y;\n })\n .text(opts.yFormat);\n}\n\n\nfunction drawSparkline(sparkline, opts) {\n sparkline\n .classed('sph-chart sph-chart-sparkline', true);\n\n if (sparkline.datum().length < opts.sparklineLimit) {\n // TODO something better than this\n sparkline.style('height', 0);\n return;\n }\n\n var dims = utils.box()\n .margin(opts.sparklineMargin)\n .width(utils.innerWidth(sparkline))\n .height(utils.innerHeight(sparkline))\n .calc();\n\n var fx = d3.scale.linear()\n .domain(d3.extent(sparkline.datum(), function(d) { return d.x; }))\n .range([0, dims.innerWidth]);\n\n var fy = d3.scale.linear()\n .domain(d3.extent(sparkline.datum(), function(d) { return d.y; }))\n .range([dims.innerHeight, 0]);\n\n sparkline\n .filter(utils.isEmptyNode)\n .call(initSparkline);\n\n sparkline.select('svg')\n .call(drawSvg, dims, fx, fy);\n}\n\n\nfunction drawSvg(svg, dims, fx, fy) {\n svg = svg\n .attr('width', dims.width)\n .attr('height', dims.height)\n .select('g')\n .attr('transform', utils.translate(dims.margin.left, dims.margin.top));\n\n svg.select('.sph-sparkline-paths')\n .call(drawPaths, fx, fy);\n\n svg.selectAll('.sph-sparkline-dot')\n .data(function(d) { return d.slice(-1); })\n .call(drawDot, fx, fy);\n}\n\n\nfunction drawPaths(paths, fx, fy) {\n var line = d3.svg.line()\n .x(function(d) { return fx(d.x); })\n .y(function(d) { return fy(d.y); });\n\n paths.select('.sph-sparkline-path-rest')\n .attr('d', line);\n\n paths.select('.sph-sparkline-path-diff')\n .datum(function(d) { return d.slice(-2); })\n .attr('d', line);\n}\n\n\nfunction initSparkline(sparkline) {\n var svg = sparkline.append('svg')\n .append('g');\n\n var paths = svg.append('g')\n .attr('class', 'sph-sparkline-paths');\n\n paths.append('path')\n .attr('class', 'sph-sparkline-path sph-sparkline-path-rest');\n\n paths.append('path')\n .attr('class', 'sph-sparkline-path sph-sparkline-path-diff');\n}\n\n\nfunction drawDot(dot, fx, fy) {\n dot.enter().append('circle')\n .attr('class', 'sph-sparkline-dot')\n .attr('r', 4);\n\n dot\n .attr('cx', function(d) { return fx(d.x); })\n .attr('cy', function(d) { return fy(d.y); });\n\n dot.exit().remove();\n}\n\n\nfunction drawSummary(summary, opts) {\n summary\n .classed('sph-summary', true);\n\n if (summary.datum().length < opts.summaryLimit) {\n // TODO something better than this\n summary.style('height', 0);\n return;\n }\n\n summary\n .filter(utils.isEmptyNode)\n .call(initSummary);\n\n summary.select('.sph-summary-diff')\n .datum(function(d) {\n d = d.slice(-2);\n return d[1].y - d[0].y;\n })\n .text(opts.diffFormat);\n\n summary.select('.sph-summary-time')\n .datum(function(d) {\n d = d.slice(-2);\n\n return [d[0].x, d[1].x]\n .map(utils.date)\n .map(opts.xFormat);\n })\n .text(function(d) {\n return [' from', d[0], 'to', d[1]].join(' ');\n });\n}\n\n\nfunction initSummary(summary) {\n summary.append('span')\n .attr('class', 'sph-summary-diff');\n\n summary.append('span')\n .attr('class', 'sph-summary-time');\n}\n\n\nfunction normalize(el, opts) {\n var node = el.node();\n\n el.datum(function(d, i) {\n return {\n title: opts.title.call(node, d, i),\n values: opts.values.call(node, d, i)\n .map(value)\n };\n });\n\n\n function value(d, i) {\n return {\n x: opts.x.call(node, d, i),\n y: opts.y.call(node, d, i)\n };\n }\n}\n\n\nfunction getStatus(values) {\n values = values.slice(-2);\n\n var diff = values.length > 1\n ? values[1].y - values[0].y\n : 0;\n\n if (diff > 0) return 'sph-is-status-good';\n if (diff < 0) return 'sph-is-status-bad';\n return 'sph-is-status-neutral';\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/scripts/widgets/last.js\n ** module id = 9\n ** module chunks = 0\n **/","var d3 = require('d3');\nvar utils = require('../utils');\n\n\nmodule.exports = require('./widget').extend()\n .prop('title')\n .set(d3.functor)\n .default(function(d) { return d.title; })\n\n .prop('metrics')\n .set(d3.functor)\n .default(function(d) { return d.metrics; })\n\n .prop('key')\n .set(d3.functor)\n .default(function(d, i) { return i; })\n\n .prop('metricTitle')\n .set(d3.functor)\n .default(function(d) { return d.title; })\n\n .prop('values')\n .set(d3.functor)\n .default(function(d) { return d.values; })\n\n .prop('x')\n .set(d3.functor)\n .default(function(d) { return d.x; })\n\n .prop('y')\n .set(d3.functor)\n .default(function(d) { return d.y; })\n\n .prop('xTickFormat')\n .default(null)\n\n .prop('xTicks')\n .default(8)\n\n .prop('yFormat')\n .default(utils.formatValue()\n .int(d3.format(','))\n .float(d3.format(',.3f')))\n\n .prop('yTicks')\n .default(5)\n\n .prop('yTickFormat')\n .default(d3.format('s'))\n\n .prop('yMin')\n .set(d3.functor)\n .default(d3.min)\n\n .prop('yMax')\n .set(d3.functor)\n .default(d3.max)\n\n .prop('none')\n .default(0)\n\n .prop('chartMargin')\n .default({\n top: 10,\n left: 35,\n right: 5,\n bottom: 20\n })\n\n .prop('colors')\n .prop('chart')\n .prop('legend')\n\n .init(function() {\n this.colors(d3.scale.category10());\n })\n\n .draw(function(el) {\n var opts = this.props();\n normalize(el, opts);\n drawWidget(el, opts);\n });\n\n\nfunction drawWidget(el, opts) {\n el.classed('sph-widget sph-lines', true);\n\n if (!opts.explicitComponents) initComponents(el);\n\n var component = el.select('[data-widget-component=\"title\"]');\n if (component.size()) component.call(drawTitle);\n\n component = el.select('[data-widget-component=\"chart\"]');\n if (component.size()) component.datum(getMetrics).call(drawChart, opts);\n\n component = el.select('[data-widget-component=\"legend\"]');\n if (component.size()) component.datum(getMetrics).call(drawLegend, opts);\n}\n\n\nfunction initComponents(el) {\n el.append('div')\n .attr('data-widget-component', 'title');\n\n el.append('div')\n .attr('data-widget-component', 'chart');\n\n el.append('div')\n .attr('data-widget-component', 'legend');\n}\n\n\nfunction drawTitle(title) {\n title\n .classed('sph-title', true)\n .text(function(d) { return d.title; });\n}\n\n\nfunction drawChart(chart, opts) {\n chart\n .classed('sph-chart sph-chart-lines', true);\n\n var dims = utils.box()\n .margin(opts.chartMargin)\n .width(utils.innerWidth(chart))\n .height(utils.innerHeight(chart))\n .calc();\n\n var allValues = chart\n .datum()\n .reduce(function(results, metric) {\n results.push.apply(results, metric.values);\n return results;\n }, []);\n\n var fx = d3.time.scale()\n .domain(d3.extent(allValues, function(d) { return d.x; }))\n .range([0, dims.innerWidth]);\n\n var ys = allValues\n .map(function(d) { return d.y; });\n\n var fy = d3.scale.linear()\n .domain([opts.yMin(ys), opts.yMax(ys)])\n .range([dims.innerHeight, 0]);\n\n chart\n .filter(utils.isEmptyNode)\n .call(initChart);\n\n chart.select('svg')\n .call(drawSvg, dims, fx, fy, opts);\n}\n\n\nfunction initChart(chart) {\n var svg = chart.append('svg')\n .append('g');\n\n svg.append('g')\n .attr('class', 'sph-axis sph-axis-lines sph-axis-lines-x');\n\n svg.append('g')\n .attr('class', 'sph-axis sph-axis-lines sph-axis-lines-y');\n\n svg.append('g')\n .attr('class', 'sph-lines-metrics');\n}\n\n\nfunction drawSvg(svg, dims, fx, fy, opts) {\n svg\n .attr('width', dims.width)\n .attr('height', dims.height)\n .select('g')\n .attr('transform', utils.translate(dims.margin.left, dims.margin.top));\n\n svg.select('.sph-lines-metrics')\n .call(drawChartMetrics, fx, fy);\n\n svg.select('.sph-axis-lines-x')\n .call(drawXAxis, dims, fx, opts);\n\n svg.select('.sph-axis-lines-y')\n .call(drawYAxis, dims, fy, opts);\n}\n\n\nfunction drawChartMetrics(metrics, fx, fy) {\n var line = d3.svg.line()\n .x(function(d) { return fx(d.x); })\n .y(function(d) { return fy(d.y); });\n\n metrics.selectAll('.sph-lines-metric')\n .data(function(d) { return d; },\n function(d) { return d.key; })\n .call(drawChartMetric, fx, fy, line);\n}\n\n\nfunction drawChartMetric(metric, fx, fy, line) {\n metric.enter().append('g')\n .attr('class', 'sph-lines-metric')\n .attr('data-key', function(d) { return d.key; })\n .append('path')\n .attr('class', 'sph-lines-line');\n\n metric.select('.sph-lines-line')\n .attr('stroke', function(d) { return d.color; })\n .attr('d', function(d) { return line(d.values); });\n\n metric.exit()\n .remove();\n\n metric.selectAll('.sph-lines-dot')\n .data(function(d) {\n if (!d.values.length) { return []; }\n var last = d.values[d.values.length - 1];\n\n return [{\n x: last.x,\n y: last.y,\n color: d.color\n }];\n })\n .call(drawDot, fx, fy);\n}\n\n\nfunction drawDot(dot, fx, fy) {\n dot.enter().append('circle')\n .attr('class', 'sph-lines-dot')\n .attr('r', 4);\n\n dot\n .attr('fill', function(d) { return d.color; })\n .attr('cx', function(d) { return fx(d.x); })\n .attr('cy', function(d) { return fy(d.y); });\n\n dot.exit()\n .remove();\n}\n\n\nfunction drawXAxis(axis, dims, fx, opts) {\n axis\n .attr('transform', utils.translate(0, dims.innerHeight))\n .call(d3.svg.axis()\n .scale(fx)\n .tickPadding(8)\n .ticks(opts.xTicks)\n .tickFormat(opts.xTickFormat)\n .tickSize(-dims.innerHeight));\n}\n\n\nfunction drawYAxis(axis, dims, fy, opts) {\n axis.call(d3.svg.axis()\n .orient('left')\n .scale(fy)\n .tickPadding(8)\n .ticks(opts.yTicks)\n .tickFormat(opts.yTickFormat)\n .tickSize(-dims.innerWidth));\n}\n\n\nfunction drawLegend(legend, opts) {\n legend\n .filter(utils.isEmptyNode)\n .call(initLegend);\n\n legend.select('.sph-table-lines').selectAll('.sph-row-lines-metric')\n .data(function(d) { return d; },\n function(d) { return d.key; })\n .call(drawLegendMetric, opts);\n}\n\n\nfunction initLegend(legend) {\n legend.append('table')\n .classed('sph-table sph-table-lines', true);\n}\n\n\nfunction drawLegendMetric(metric, opts) {\n var none = opts.yFormat(opts.none);\n\n metric.enter().append('tr')\n .call(enterLegendMetric);\n\n metric.select('.sph-col-swatch')\n .style('background', function(d) { return d.color; });\n\n metric.select('.sph-col-lines-title')\n .text(function(d) { return d.title; });\n\n metric.select('.sph-col-lines-value')\n .text(function(d) {\n d = d.values[d.values.length - 1];\n\n return d\n ? opts.yFormat(d.y)\n : none;\n });\n\n metric.exit()\n .remove();\n}\n\n\nfunction enterLegendMetric(metric) {\n metric\n .attr('data-key', function(d) { return d.key; })\n .attr('class', 'sph-row-lines-metric');\n\n metric.append('td')\n .attr('class', 'sph-col-swatch');\n\n metric.append('td')\n .attr('class', 'sph-col-lines-title');\n\n metric.append('td')\n .attr('class', 'sph-col-lines-value');\n}\n\n\nfunction normalize(el, opts) {\n var node = el.node();\n\n el.datum(function(d, i) {\n var title = opts.title.call(node, d, i);\n\n return {\n title: title,\n metrics: opts.metrics.call(node, d, i).map(metric)\n };\n });\n\n function metric(d, i) {\n var key = opts.key\n .call(node, d, i)\n .toString();\n\n return {\n key: key,\n color: opts.colors(key),\n title: opts.metricTitle.call(node, d, i),\n values: opts.values.call(node, d, i).map(value)\n };\n }\n\n function value(d, i) {\n return {\n x: opts.x.call(node, d, i),\n y: opts.y.call(node, d, i)\n };\n }\n}\n\n\nfunction getMetrics(d) {\n return d.metrics;\n}\n\n\n\n/*****************\n ** WEBPACK FOOTER\n ** ./src/scripts/widgets/lines.js\n ** module id = 10\n ** module chunks = 0\n **/"],"sourceRoot":""}