{"version":3,"file":"main.513450b9.js","sources":["../src/scripts/utils.js","../src/scripts/plotter.js","../src/scripts/animation.js","../src/scripts/constants.js","../src/scripts/plot-base.js","../src/scripts/xaxis.js","../src/scripts/yaxis.js","../src/scripts/legend.js","../src/scripts/plot.js","../src/scripts/timeline.js","../src/scripts/filter.js","../src/scripts/chart.js","../src/scripts/main.js"],"sourcesContent":["const months = [\n 'Jan',\n 'Feb',\n 'Mar',\n 'Apr',\n 'May',\n 'Jun',\n 'Jul',\n 'Aug',\n 'Sep',\n 'Oct',\n 'Nov',\n 'Dec',\n];\nconst days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n\nexport const min = array => Math.min(...array);\n\nexport const max = array => Math.max(...array);\n\nexport const viewBoxToArray = viewBox =>\n viewBox.split(' ').map(value => +value);\n\nexport const arrayToViewBox = array => array.join(' ');\n\nexport const leftIndexFromRatio = (array, ratio) =>\n Math.floor((array.length - 1) * ratio);\n\nexport const rightIndexFromRatio = (array, ratio) =>\n Math.ceil((array.length - 1) * ratio);\n\nexport const createElement = (\n tag,\n { classes = '', style = {}, ...options } = {}\n) => {\n const element = document.createElement(tag);\n\n element.className = classes;\n Object.assign(element.style, style);\n\n objectForEach(options || {}, (key, value) =>\n element.setAttribute(key, value)\n );\n\n return element;\n};\n\nexport const createSvgElement = (tag, { classes = '', ...options }) => {\n const element = document.createElementNS('http://www.w3.org/2000/svg', tag);\n\n element.setAttribute('class', classes);\n\n objectForEach(options || {}, (key, value) =>\n element.setAttribute(key, value)\n );\n\n return element;\n};\n\nexport const pairsToObject = pairs =>\n pairs.reduce((acc, [key, value]) => ((acc[key] = value), acc), {});\n\nexport const objectFilter = (obj, func) =>\n pairsToObject(Object.entries(obj).filter(([key, value]) => func(key, value)));\n\nexport const objectMap = (obj, func) =>\n pairsToObject(\n Object.entries(obj).map(([key, value]) => [key, func(key, value)])\n );\n\nexport const objectForEach = (obj, func) =>\n Object.entries(obj).forEach(([key, value]) => func(key, value));\n\nexport const formatDate = timestamp => {\n const date = new Date(timestamp);\n\n return `${days[date.getUTCDay()]}, ${\n months[date.getUTCMonth()]\n } ${date.getUTCDate()}`;\n};\n\nexport const formatAxisDate = timestamp => {\n const date = new Date(timestamp);\n\n return `${months[date.getUTCMonth()]} ${date.getUTCDate()}`;\n};\n\nexport const debounce = (func, context, delay = 0) => {\n let timeout;\n\n return (...args) => {\n if (timeout) clearTimeout(timeout);\n\n timeout = setTimeout(\n () => requestAnimationFrame(func.bind(context, ...args)),\n delay\n );\n };\n};\n\nexport const nearestPow = value =>\n Math.pow(2, Math.round(Math.log(value) / Math.log(2)));\n\nexport const getClientX = event =>\n event.targetTouches ? event.targetTouches[0].clientX : event.clientX;\n","import { max, leftIndexFromRatio, rightIndexFromRatio } from './utils';\n\nconst graphsMax = (graphs, imin, imax) =>\n max(\n Object.values(graphs).map(({ values, visible }) =>\n visible ? max(values.slice(imin, imax)) : Number.MIN_SAFE_INTEGER\n )\n );\n\nclass Plotter {\n constructor({ $svg, width, height, x, graphs }) {\n this.$svg = $svg;\n\n this.x = x;\n this.graphs = graphs;\n\n this.resize(width, height);\n }\n\n get screen() {\n return {\n x: [0, this.width],\n y: [0, this.height],\n };\n }\n\n /**\n * Conversion between coordinate systems.\n */\n\n toScreenX(v, domain = this.domain) {\n const dx = domain.x;\n const sx = this.screen.x;\n\n return sx[0] + ((v - dx[0]) / (dx[1] - dx[0])) * (sx[1] - sx[0]);\n }\n\n toScreenY(v, domain = this.domain) {\n const dy = domain.y;\n const sy = this.screen.y;\n\n return sy[1] - sy[0] - ((v - dy[0]) / (dy[1] - dy[0])) * (sy[1] - sy[0]);\n }\n\n toCurrentScreenX(v) {\n return this.toScreenX(v, this.current);\n }\n toCurrentScreenY(v) {\n return this.toScreenY(v, this.current);\n }\n\n toPreviousScreenX(v) {\n return this.toScreenX(v, this.previous);\n }\n toPreviousScreenY(v) {\n return this.toScreenY(v, this.previous);\n }\n\n toScreen(d) {\n return {\n x: [this.toScreenX(d.x[0]), this.toScreenX(d.x[1])],\n y: [this.toScreenY(d.y[1]), this.toScreenY(d.y[0])],\n };\n }\n\n toDomainX(v, domain = this.domain) {\n const dx = domain.x;\n const sx = this.screen.x;\n\n return dx[0] + ((v - sx[0]) / (sx[1] - sx[0])) * (dx[1] - dx[0]);\n }\n\n toDomainY(v, domain = this.domain) {\n const dy = domain.y;\n const sy = this.screen.y;\n\n return dy[1] - dy[0] - ((v - sy[0]) / (sy[1] - sy[0])) * (dy[1] - dy[0]);\n }\n\n toCurrentDomainX(v) {\n return this.toDomainX(v, this.current);\n }\n toCurrentDomainY(v) {\n return this.toDomainY(v, this.current);\n }\n\n toPreviousDomainX(v) {\n return this.toDomainX(v, this.previous);\n }\n toPreviousDomainY(v) {\n return this.toDomainY(v, this.previous);\n }\n\n /**\n * For initial PlotBase rendering.\n */\n\n viewBoxFromScreen(s = this.screen) {\n return `${s.x[0]} ${s.y[0]} ${s.x[1] - s.x[0]} ${s.y[1] - s.y[0]}`;\n }\n\n getPathLine(key) {\n return this.x.reduce((result, value, index) => {\n const x = this.toScreenX(value);\n const y = this.toScreenY(this.graphs[key].values[index]);\n\n return index === 0 ? `M${x} ${y}` : `${result} L ${x} ${y}`;\n }, '');\n }\n\n /**\n * For getting viewBox for a given selection.\n */\n\n domainFromRatios(left = this.left, right = this.right) {\n const imin = leftIndexFromRatio(this.x, left);\n const imax = rightIndexFromRatio(this.x, right);\n\n const xgmin = this.x[0];\n const xgmax = this.x[this.x.length - 1];\n\n const xmin = xgmin + (xgmax - xgmin) * left;\n const xmax = xgmin + (xgmax - xgmin) * right;\n const ymin = 0;\n const ymax = graphsMax(this.graphs, imin, imax);\n\n return {\n x: [xmin, xmax],\n y: [ymin, ymax],\n };\n }\n\n viewBoxFromRatios() {\n const s = this.toScreen(this.current);\n\n return this.viewBoxFromScreen(s);\n }\n\n /**\n * Update methods.\n */\n\n setRatios(a, b) {\n this.left = a;\n this.right = b;\n this.updateDomain();\n }\n\n updateDomain() {\n this.previous = Object.assign({}, this.current);\n this.current = this.domainFromRatios();\n }\n\n resize(width, height) {\n this.left = 0;\n this.right = 1;\n\n this.width = width;\n this.height = height;\n\n this.domain = this.domainFromRatios();\n this.current = Object.assign({}, this.domain);\n this.previous = Object.assign({}, this.domain);\n\n this.$svg.setAttribute('width', width);\n this.$svg.setAttribute('height', height);\n this.$svg.setAttribute('viewBox', this.viewBoxFromScreen());\n }\n}\n\nexport default Plotter;\n","import { viewBoxToArray } from './utils';\n\nexport const animateViewBox = ({ $svg, to, duration, callback }) => {\n let start;\n\n const from = $svg.getAttribute('viewBox');\n const [xminFrom, yminFrom, xmaxFrom, ymaxFrom] = viewBoxToArray(from);\n const [xminTo, yminTo, xmaxTo, ymaxTo] = viewBoxToArray(to);\n\n const xminDelta = xminTo - xminFrom;\n const yminDelta = yminTo - yminFrom;\n const xmaxDelta = xmaxTo - xmaxFrom;\n const ymaxDelta = ymaxTo - ymaxFrom;\n\n const animateStep = now => {\n if (!start) start = now;\n\n const progress = Math.min((now - start) / duration, 1);\n\n const xmin = xminFrom + xminDelta * progress;\n const ymin = yminFrom + yminDelta * progress;\n const xmax = xmaxFrom + xmaxDelta * progress;\n const ymax = ymaxFrom + ymaxDelta * progress;\n\n $svg.setAttribute('viewBox', `${xmin} ${ymin} ${xmax} ${ymax}`);\n\n if (progress < 1) {\n $svg.animation = requestAnimationFrame(animateStep);\n } else if (callback) {\n callback();\n }\n };\n\n cancelAnimationFrame($svg.animation);\n\n $svg.animation = requestAnimationFrame(animateStep);\n};\n","export const ChartType = Object.freeze({\n x: 'x',\n line: 'line',\n});\n\nexport const BaseAnimationDuration = 300;\n","import Plotter from './plotter';\nimport { animateViewBox } from './animation';\nimport { createSvgElement, objectForEach } from './utils';\nimport { BaseAnimationDuration } from './constants';\n\nclass PlotBase {\n constructor({ x, graphs }) {\n this.x = x;\n this.graphs = graphs;\n }\n\n appendTo($container) {\n this.$container = $container;\n this.render();\n }\n\n render() {\n const width = this.$container.clientWidth;\n const height = this.$container.clientHeight;\n\n this.$element = createSvgElement('svg', { preserveAspectRatio: 'none' });\n\n this.plotter = new Plotter({\n width,\n height,\n $svg: this.$element,\n x: this.x,\n graphs: this.graphs,\n });\n\n this.renderPathLines();\n this.$container.appendChild(this.$element);\n }\n\n renderPathLines() {\n this.$paths = {};\n\n objectForEach(this.graphs, (key, { color }) => {\n this.$paths[key] = createSvgElement('path', {\n d: this.plotter.getPathLine(key),\n stroke: color,\n });\n\n this.$element.appendChild(this.$paths[key]);\n });\n }\n\n updatePathLines() {\n objectForEach(this.graphs, key => {\n this.$paths[key].setAttribute('d', this.plotter.getPathLine(key));\n });\n }\n\n update() {\n objectForEach(this.graphs, (key, { visible }) => {\n this.$paths[key].classList.toggle('hidden', !visible);\n });\n\n this.plotter.updateDomain();\n\n animateViewBox({\n $svg: this.$element,\n to: this.plotter.viewBoxFromRatios(),\n duration: BaseAnimationDuration,\n });\n }\n\n resize() {\n const width = this.$container.clientWidth;\n const height = this.$container.clientHeight;\n\n this.plotter.resize(width, height);\n this.updatePathLines();\n }\n}\n\nexport default PlotBase;\n","import { createElement, formatAxisDate, nearestPow } from './utils';\n\nconst labelWidth = 50;\nconst initialDistance = 90;\n\nclass XAxis {\n constructor({ x, plotter }) {\n this.x = x;\n this.plotter = plotter;\n }\n\n appendTo($container) {\n this.$container = $container;\n this.render();\n }\n\n render() {\n this.$element = createElement('div', { classes: 'xaxis' });\n this.$container.appendChild(this.$element);\n\n this.$labels = [];\n this.visibleLabels = [];\n this.renderLabels();\n\n this.renderShadows();\n }\n\n renderLabels() {\n this.x.forEach((x, index) => {\n const value = formatAxisDate(x);\n const coord = this.plotter.toCurrentScreenX(x);\n\n const [xmin, xmax] = this.plotter.screen.x;\n this.delta = nearestPow(\n Math.floor((this.x.length * initialDistance) / (xmax - xmin))\n );\n\n const $label = createElement('div', {\n classes: `label ${index % this.delta === 0 ? '' : 'hidden'}`,\n style: {\n left: `${coord - labelWidth / 2}px`,\n width: `${labelWidth}px`,\n },\n });\n\n $label.innerText = value;\n $label.value = x;\n\n this.$labels.push($label);\n this.$element.appendChild($label);\n });\n }\n\n renderShadows() {\n const leftShadow = createElement('div', { classes: 'shadow left' });\n const rightShadow = createElement('div', { classes: 'shadow right' });\n\n this.$element.appendChild(leftShadow);\n this.$element.appendChild(rightShadow);\n }\n\n update() {\n const [xmin, xmax] = this.plotter.domain.x;\n const delta = nearestPow(\n Math.floor(\n (this.x.length * initialDistance) /\n (this.plotter.toCurrentScreenX(xmax) -\n this.plotter.toCurrentScreenX(xmin))\n )\n );\n\n if (delta >= 1) {\n if (delta < this.delta) {\n this.delta = this.delta / 2;\n } else if (delta > this.delta) {\n this.delta = this.delta * 2;\n }\n }\n\n this.$labels.forEach(($label, index) => {\n const coord = this.plotter.toCurrentScreenX($label.value);\n $label.style['left'] = `${coord - labelWidth / 2}px`;\n\n $label.classList.toggle('hidden', index % this.delta !== 0);\n });\n }\n}\n\nexport default XAxis;\n","import { createElement } from './utils';\n\nconst numberOfLabels = 6;\nconst topMargin = 20;\n\nclass YAxis {\n constructor({ x, graphs, plotter }) {\n this.x = x;\n this.graphs = graphs;\n this.plotter = plotter;\n }\n\n appendTo($container) {\n this.$container = $container;\n this.render();\n }\n\n render() {\n this.$element = createElement('div', { classes: 'yaxis' });\n this.$labels = [];\n\n this.renderLabels();\n\n this.$container.appendChild(this.$element);\n }\n\n renderLabels() {\n const [ymin, ymax] = this.plotter.screen.y;\n const delta = ymax - topMargin - ymin;\n const step = delta / (numberOfLabels - 1);\n\n for (let index = 0; index < numberOfLabels; ++index) {\n const y = ymin + topMargin + index * step;\n const value = Math.round(this.plotter.toCurrentDomainY(y));\n\n const $label = createElement('div', {\n classes: 'label',\n style: { top: `${y}px` },\n });\n\n const $line = createElement('hr', { classes: 'label-line' });\n const $text = createElement('span', { classes: 'label-text' });\n\n $text.innerText = value;\n\n $label.appendChild($text);\n $label.appendChild($line);\n\n const $altLabel = $label.cloneNode(true);\n\n $altLabel.classList.add('hidden');\n\n $label.y = y;\n $label.$text = $label.querySelector('.label-text');\n\n $altLabel.y = y;\n $altLabel.$text = $altLabel.querySelector('.label-text');\n\n this.$labels.push($label);\n this.$labels.push($altLabel);\n\n this.$element.appendChild($label);\n this.$element.appendChild($altLabel);\n }\n }\n\n update(domain = this.plotter.previous) {\n if (\n domain.y[0] === this.plotter.current.y[0] &&\n domain.y[1] === this.plotter.current.y[1]\n ) {\n return;\n }\n\n this.$labels.forEach($label => {\n const hidden = $label.classList.contains('hidden');\n\n if (hidden) {\n const to = $label.y;\n const value = this.plotter.toCurrentDomainY(to);\n const from = this.plotter.toScreenY(value, domain);\n const text = Math.round(value);\n\n $label.$text.innerText = text;\n\n // TODO: Set initial position without animation.\n $label.style['transform'] = `translateY(${to - from}px)`;\n $label.classList.remove('hidden');\n $label.style['transform'] = 'translateY(0)';\n } else {\n const from = $label.y;\n const value = this.plotter.toDomainY(from, domain);\n const to = this.plotter.toCurrentScreenY(value);\n\n $label.classList.add('hidden');\n $label.style['transform'] = `translateY(${to - from}px)`;\n }\n });\n }\n}\n\nexport default YAxis;\n","import { createElement, objectForEach, formatDate } from './utils';\n\nclass Legend {\n constructor({ x, graphs, plotter }) {\n this.x = x;\n this.graphs = graphs;\n this.plotter = plotter;\n }\n\n appendTo($container) {\n this.$container = $container;\n this.render();\n }\n\n render() {\n this.$element = createElement('div', { classes: 'legend' });\n this.$container.appendChild(this.$element);\n\n this.line = createElement('hr', { classes: 'legend-line' });\n\n this.$element.appendChild(this.line);\n\n this.circles = {};\n objectForEach(this.graphs, (key, { color }) => {\n this.circles[key] = createElement('div', {\n classes: 'legend-circle',\n style: { 'border-color': color },\n });\n\n this.$element.appendChild(this.circles[key]);\n });\n\n this.data = createElement('div', { classes: 'legend-data' });\n this.$element.appendChild(this.data);\n\n this.$element.addEventListener('mousemove', event => {\n this.onMouseMove(event);\n });\n this.$element.addEventListener('mouseleave', () => {\n this.onMouseLeave();\n });\n }\n\n onMouseMove(event) {\n const dateTime = this.plotter.toCurrentDomainX(event.offsetX);\n\n const position = this.x.reduce((prev, value, i, array) => {\n return Math.abs(value - dateTime) < Math.abs(array[prev] - dateTime)\n ? i\n : prev;\n }, 0);\n\n const x = this.x[position];\n const xCoord = this.plotter.toCurrentScreenX(x);\n\n this.line.style['left'] = `${xCoord}px`;\n this.line.style['opacity'] = 1;\n\n objectForEach(this.graphs, (key, { values, visible }) => {\n if (visible) {\n const yCoord = this.plotter.toCurrentScreenY(values[position]);\n this.circles[key].style['left'] = `${xCoord}px`;\n this.circles[key].style['top'] = `${yCoord}px`;\n this.circles[key].style['opacity'] = 1;\n } else {\n this.circles[key].style['opacity'] = 0;\n }\n });\n\n let text = formatDate(x);\n text += '
';\n objectForEach(this.graphs, (key, { color, values, visible }) => {\n if (visible) {\n text += `
${\n values[position]\n }
${key}
`;\n }\n });\n text += '
';\n\n this.data.innerHTML = text;\n\n this.data.style['opacity'] = 1;\n\n const width = this.data.clientWidth;\n this.data.style['left'] = `${Math.min(\n this.plotter.width - width / 2,\n Math.max(xCoord, width / 2)\n )}px`;\n }\n\n onMouseLeave() {\n this.line.style['opacity'] = 0;\n this.data.style['opacity'] = 0;\n\n objectForEach(this.circles, key => {\n this.circles[key].style['opacity'] = 0;\n });\n }\n}\n\nexport default Legend;\n","import PlotBase from './plot-base';\nimport XAxis from './xaxis';\nimport YAxis from './yaxis';\nimport Legend from './legend';\n\nclass Plot extends PlotBase {\n render() {\n super.render();\n\n this.xaxis = new XAxis({\n x: this.x,\n plotter: this.plotter,\n });\n\n this.yaxis = new YAxis({\n x: this.x,\n graphs: this.graphs,\n plotter: this.plotter,\n });\n\n this.legend = new Legend({\n x: this.x,\n graphs: this.graphs,\n plotter: this.plotter,\n });\n\n this.yaxis.appendTo(this.$container);\n this.legend.appendTo(this.$container);\n this.xaxis.appendTo(this.$container);\n }\n\n updateXAxis() {\n this.xaxis.update();\n }\n\n updateYAxis(left, right) {\n const domain = this.plotter.domainFromRatios(left, right);\n this.yaxis.update(domain);\n }\n\n update() {\n super.update();\n\n this.yaxis.update();\n }\n\n updateViewport(left, right) {\n this.plotter.setRatios(left, right);\n this.$element.setAttribute('viewBox', this.plotter.viewBoxFromRatios());\n }\n\n resize() {\n super.resize();\n\n this.xaxis.update();\n }\n}\n\nexport default Plot;\n","import PlotBase from './plot-base';\nimport { createElement, debounce, getClientX } from './utils';\n\nconst barSize = 8;\nconst minDiff = 30;\n\nclass Timeline extends PlotBase {\n constructor({ x, graphs, onTimelineChange, onTimelineEnd }) {\n super({ x, graphs });\n\n this.onTimelineChange = onTimelineChange;\n this.onTimelineEnd = onTimelineEnd;\n this.onDrag = debounce(this.onDrag, this);\n this.onStopDrag = this.onStopDrag.bind(this);\n this.onStartDragLeft = this.onStartDrag('dragLeft').bind(this);\n this.onStartDragArea = this.onStartDrag('dragArea').bind(this);\n this.onStartDragRight = this.onStartDrag('dragRight').bind(this);\n }\n\n render() {\n super.render();\n this.renderSelection();\n }\n\n resize() {\n super.resize();\n\n this.updateLeftBar();\n this.updateRightBar();\n this.updateArea();\n this.updateLeftBackground();\n this.updateRightBackground();\n }\n\n renderSelection() {\n this.$selection = createElement('div', { classes: 'selection' });\n\n this.renderLeftBar();\n this.renderRightBar();\n this.renderArea();\n this.renderLeftBackground();\n this.renderRightBackground();\n\n this.$container.addEventListener('mousemove', this.onDrag);\n this.$container.addEventListener('touchmove', this.onDrag);\n\n document.addEventListener('mouseup', this.onStopDrag);\n document.addEventListener('touchend', this.onStopDrag);\n\n this.$container.appendChild(this.$selection);\n }\n\n renderLeftBar() {\n this.leftBar = { $element: createElement('div', { classes: 'selector' }) };\n this.$selection.appendChild(this.leftBar.$element);\n this.updateLeftBar();\n\n this.leftBar.$element.addEventListener('mousedown', this.onStartDragLeft);\n this.leftBar.$element.addEventListener('touchstart', this.onStartDragLeft);\n }\n\n updateLeftBar() {\n const xmin = this.plotter.screen.x[0];\n\n Object.assign(this.leftBar, {\n value: xmin,\n x: Math.max(xmin - barSize, xmin),\n width: barSize,\n });\n\n Object.assign(this.leftBar.$element.style, {\n left: `${this.leftBar.x}px`,\n width: `${this.leftBar.width}px`,\n });\n }\n\n renderRightBar() {\n this.rightBar = { $element: createElement('div', { classes: 'selector' }) };\n this.$selection.appendChild(this.rightBar.$element);\n this.updateRightBar();\n\n this.rightBar.$element.addEventListener('mousedown', this.onStartDragRight);\n this.rightBar.$element.addEventListener(\n 'touchstart',\n this.onStartDragRight\n );\n }\n\n updateRightBar() {\n const xmax = this.plotter.screen.x[1];\n\n Object.assign(this.rightBar, {\n value: xmax,\n x: Math.min(xmax - barSize, xmax),\n width: barSize,\n });\n\n Object.assign(this.rightBar.$element.style, {\n left: `${this.rightBar.x}px`,\n width: `${this.rightBar.width}px`,\n });\n }\n\n renderArea() {\n this.area = { $element: createElement('div', { classes: 'area' }) };\n this.$selection.appendChild(this.area.$element);\n this.updateArea();\n\n this.area.$element.addEventListener('mousedown', this.onStartDragArea);\n this.area.$element.addEventListener('touchstart', this.onStartDragArea);\n }\n\n updateArea() {\n Object.assign(this.area, {\n x: this.leftBar.x + this.leftBar.width,\n width: this.rightBar.x - this.leftBar.x - this.leftBar.width,\n });\n\n Object.assign(this.area.$element.style, {\n left: `${this.area.x}px`,\n width: `${this.area.width}px`,\n });\n }\n\n renderLeftBackground() {\n this.leftBg = { $element: createElement('div', { classes: 'background' }) };\n this.$selection.appendChild(this.leftBg.$element);\n this.updateLeftBackground();\n }\n\n updateLeftBackground() {\n const xmin = this.plotter.screen.x[0];\n\n Object.assign(this.leftBg, {\n x: xmin,\n width: Math.min(this.leftBar.x - xmin, 0),\n });\n\n Object.assign(this.leftBg.$element.style, {\n left: `${this.leftBg.x}px`,\n width: `${this.leftBg.width}px`,\n });\n }\n\n renderRightBackground() {\n this.rightBg = {\n $element: createElement('div', { classes: 'background' }),\n };\n this.$selection.appendChild(this.rightBg.$element);\n this.updateRightBackground();\n }\n\n updateRightBackground() {\n const xmax = this.plotter.screen.x[1];\n\n Object.assign(this.rightBg, {\n x: this.rightBar.x + this.rightBar.width,\n width: Math.max(xmax - this.rightBar.x - this.rightBar.width, 0),\n });\n\n Object.assign(this.rightBg.$element.style, {\n left: `${this.rightBg.x}px`,\n width: `${this.rightBg.width}px`,\n });\n }\n\n onStartDrag(key) {\n return event => {\n const clientX = getClientX(event);\n\n this[key] = true;\n this.area.$element.classList.toggle('dragging', true);\n this.startLeft = this.leftBar.value / this.plotter.width;\n this.startRight = this.rightBar.value / this.plotter.width;\n this.startMouseX = clientX;\n this.mouseX = clientX;\n };\n }\n\n onStopDrag() {\n if (!this.dragArea && !this.dragLeft && !this.dragRight) return;\n\n this.dragArea = false;\n this.dragLeft = false;\n this.dragRight = false;\n\n this.area.$element.classList.toggle('dragging', false);\n\n this.startMouseX = null;\n this.mouseX = null;\n\n this.onTimelineEnd(this.startLeft, this.startRight);\n }\n\n onDrag(event) {\n if (!this.dragArea && !this.dragLeft && !this.dragRight) {\n return;\n }\n\n if (this.dragArea) {\n this.onDragArea(event);\n }\n\n if (this.dragLeft) {\n this.onDragLeft(event);\n }\n\n if (this.dragRight) {\n this.onDragRight(event);\n }\n\n this.mouseX = getClientX(event);\n\n this.onTimelineChange(\n this.leftBar.value / this.plotter.width,\n this.rightBar.value / this.plotter.width\n );\n }\n\n onDragArea(event) {\n const [xmin, xmax] = this.plotter.screen.x;\n let delta = getClientX(event) - this.mouseX;\n\n if (delta > 0) {\n const right = this.rightBar.x + this.rightBar.width + delta;\n\n if (right > xmax) {\n delta = xmax - this.rightBar.x - this.rightBar.width;\n }\n }\n\n if (delta < 0) {\n const left = this.leftBar.x + delta;\n\n if (left < xmin) {\n delta = -this.leftBar.x;\n }\n }\n\n this.area.x += delta;\n this.leftBar.x += delta;\n this.rightBar.x += delta;\n this.leftBar.value += delta;\n this.rightBar.value += delta;\n\n this.area.$element.style['left'] = `${this.area.x}px`;\n this.leftBar.$element.style['left'] = `${this.leftBar.x}px`;\n this.rightBar.$element.style['left'] = `${this.rightBar.x}px`;\n\n this.leftBg.width += delta;\n this.rightBg.x += delta;\n this.rightBg.width = Math.max(xmax - this.rightBg.x, 0);\n\n this.leftBg.$element.style['width'] = `${this.leftBg.width}px`;\n this.rightBg.$element.style['left'] = `${this.rightBg.x}px`;\n this.rightBg.$element.style['width'] = `${this.rightBg.width}px`;\n }\n\n onDragLeft(event) {\n let delta = getClientX(event) - this.mouseX;\n\n if (delta > 0) {\n const left = this.leftBar.x + this.leftBar.width + delta;\n\n if (left > this.rightBar.x - minDiff) {\n delta = this.rightBar.x - minDiff - this.leftBar.x - this.leftBar.width;\n }\n }\n\n if (delta < 0) {\n const left = this.leftBar.x + delta;\n if (left < 0) {\n delta = -this.leftBar.x;\n }\n }\n\n this.leftBar.x += delta;\n this.leftBar.value += delta;\n this.area.x += delta;\n this.area.width -= delta;\n\n this.leftBar.$element.style['left'] = `${this.leftBar.x}px`;\n this.area.$element.style['left'] = `${this.area.x}px`;\n this.area.$element.style['width'] = `${this.area.width}px`;\n\n this.leftBg.width += delta;\n this.leftBg.$element.style['width'] = `${this.leftBg.width}px`;\n }\n\n onDragRight(event) {\n let delta = getClientX(event) - this.mouseX;\n\n if (delta > 0) {\n const right = this.rightBar.x + this.rightBar.width + delta;\n\n if (right > this.plotter.width) {\n delta = this.plotter.width - this.rightBar.x - this.rightBar.width;\n }\n }\n\n if (delta < 0) {\n const right = this.rightBar.x + delta;\n\n if (right < this.leftBar.x + this.leftBar.width + minDiff) {\n delta = this.leftBar.x + this.leftBar.width + minDiff - this.rightBar.x;\n }\n }\n\n this.rightBar.x += delta;\n this.rightBar.value += delta;\n this.area.width += delta;\n\n this.rightBar.$element.style['left'] = `${this.rightBar.x}px`;\n this.area.$element.style['width'] = `${this.area.width}px`;\n\n this.rightBg.x += delta;\n this.rightBg.width -= delta;\n this.rightBg.$element.style['left'] = `${this.rightBg.x}px`;\n this.rightBg.$element.style['width'] = `${this.rightBg.width}px`;\n }\n}\n\nexport default Timeline;\n","import { createElement, objectForEach } from './utils';\n\nconst isCheckable = ($button, graphs) =>\n !$button.classList.contains('checked') ||\n Object.values(graphs).filter(({ visible }) => visible).length > 1;\n\nclass Filter {\n constructor({ graphs, onFilterToggle }) {\n this.graphs = graphs;\n this.onFilterToggle = onFilterToggle;\n }\n\n appendTo($container) {\n this.$container = $container;\n this.render();\n }\n\n render() {\n objectForEach(this.graphs, (key, graph) => {\n const $button = createElement('div', {\n classes: 'filter-button checked',\n });\n const $name = createElement('span', { classes: 'filter-name' });\n const $circle = createElement('div', {\n classes: 'filter-circle',\n style: { 'border-color': graph.color },\n });\n\n $button.addEventListener('click', () => {\n if (!isCheckable($button, this.graphs)) return;\n\n $button.classList.toggle('checked');\n this.onFilterToggle(key, !graph.visible);\n });\n\n $name.innerText = graph.name;\n\n $button.appendChild($circle);\n $button.appendChild($name);\n\n this.$container.appendChild($button);\n });\n }\n}\n\nexport default Filter;\n","import Plot from './plot';\nimport Timeline from './timeline';\nimport Filter from './filter';\nimport { ChartType } from './constants';\nimport {\n createElement,\n pairsToObject,\n objectFilter,\n objectMap,\n debounce,\n} from './utils';\n\nconst xKeyFromTypes = types =>\n Object.keys(objectFilter(types, (key, type) => type === ChartType.x))[0];\n\nconst columnsByKey = columns =>\n pairsToObject(columns.map(([key, ...values]) => [key, values]));\n\nclass Chart {\n constructor(name, { columns, types, colors, names }) {\n const namedColumns = columnsByKey(columns);\n const xKey = xKeyFromTypes(types);\n const xColumn = namedColumns[xKey];\n const graphColumns = objectFilter(namedColumns, key => key !== xKey);\n\n this.name = name;\n this.x = xColumn;\n this.graphs = objectMap(graphColumns, (key, values) => ({\n values,\n type: types[key],\n color: colors[key],\n name: names[key],\n visible: true,\n }));\n\n this.resize = debounce(this.resize, this);\n window.addEventListener('resize', this.resize);\n }\n\n appendTo($container) {\n this.$container = $container;\n this.render();\n }\n\n render() {\n this.$element = document.createElement('figure');\n this.$container.appendChild(this.$element);\n\n this.renderTitle();\n this.renderPlot();\n this.renderTimeline();\n this.renderFilter();\n }\n\n resize() {\n this.plot.resize();\n this.timeline.resize();\n }\n\n renderTitle() {\n this.$title = createElement('h1');\n this.$title.innerText = this.name;\n this.$element.appendChild(this.$title);\n }\n\n renderPlot() {\n this.$plot = createElement('section', { classes: 'plot' });\n this.$element.appendChild(this.$plot);\n\n this.plot = new Plot({\n x: this.x,\n graphs: this.graphs,\n });\n\n this.plot.appendTo(this.$plot);\n }\n\n renderTimeline() {\n this.$timeline = createElement('section', { classes: 'timeline' });\n this.$element.appendChild(this.$timeline);\n\n this.timeline = new Timeline({\n x: this.x,\n graphs: this.graphs,\n onTimelineChange: this.onTimelineChange.bind(this),\n onTimelineEnd: this.onTimelineEnd.bind(this),\n });\n\n this.timeline.appendTo(this.$timeline);\n }\n\n renderFilter() {\n this.$filter = createElement('section', { classes: 'filter' });\n this.$element.appendChild(this.$filter);\n\n this.filter = new Filter({\n graphs: this.graphs,\n onFilterToggle: this.onFilterToggle.bind(this),\n });\n\n this.filter.appendTo(this.$filter);\n }\n\n onFilterToggle(key, visible) {\n this.graphs[key].visible = visible;\n\n this.plot.update();\n this.timeline.update();\n }\n\n onTimelineChange(left, right) {\n this.plot.updateViewport(left, right);\n this.plot.updateXAxis();\n }\n\n onTimelineEnd(left, right) {\n this.plot.updateYAxis(left, right);\n }\n}\n\nexport default Chart;\n","import Chart from './chart';\n\ndocument.addEventListener('DOMContentLoaded', () => {\n const $container = document.querySelector('main');\n const $footer = document.querySelector('footer');\n\n window.data.forEach((data, index) => {\n const chart = new Chart(`Chart ${index + 1}`, data);\n chart.appendTo($container);\n });\n\n $footer.addEventListener('click', () => {\n document.body.classList.toggle('day');\n document.body.classList.toggle('night');\n });\n});\n"],"names":["months","days","max","array","Math","viewBoxToArray","viewBox","split","map","value","leftIndexFromRatio","ratio","floor","length","rightIndexFromRatio","ceil","createElement","tag","classes","style","options","element","document","className","Object","assign","objectForEach","key","setAttribute","createSvgElement","createElementNS","pairsToObject","pairs","reduce","acc","objectFilter","obj","func","entries","filter","objectMap","forEach","formatDate","timestamp","date","Date","getUTCDay","getUTCMonth","getUTCDate","formatAxisDate","debounce","context","delay","timeout","args","clearTimeout","setTimeout","requestAnimationFrame","bind","nearestPow","pow","round","log","getClientX","event","targetTouches","clientX","graphsMax","graphs","imin","imax","values","visible","slice","Number","MIN_SAFE_INTEGER","Plotter","constructor","$svg","width","height","x","resize","this","y","toScreenX","v","domain","dx","sx","screen","toScreenY","dy","sy","toCurrentScreenX","current","toCurrentScreenY","toPreviousScreenX","previous","toPreviousScreenY","toScreen","d","toDomainX","toDomainY","toCurrentDomainX","toCurrentDomainY","toPreviousDomainX","toPreviousDomainY","viewBoxFromScreen","s","getPathLine","result","index","domainFromRatios","left","right","xgmin","xgmax","viewBoxFromRatios","setRatios","a","b","updateDomain","animateViewBox","to","duration","callback","start","from","getAttribute","xminFrom","yminFrom","xmaxFrom","ymaxFrom","xminTo","yminTo","xmaxTo","ymaxTo","xminDelta","yminDelta","xmaxDelta","ymaxDelta","animateStep","now","progress","min","xmin","ymin","xmax","ymax","animation","cancelAnimationFrame","ChartType","freeze","line","BaseAnimationDuration","PlotBase","appendTo","$container","render","clientWidth","clientHeight","$element","preserveAspectRatio","plotter","renderPathLines","appendChild","$paths","color","stroke","updatePathLines","update","classList","toggle","labelWidth","initialDistance","XAxis","$labels","visibleLabels","renderLabels","renderShadows","coord","delta","$label","innerText","push","leftShadow","rightShadow","numberOfLabels","topMargin","YAxis","step","top","$line","$text","$altLabel","cloneNode","add","querySelector","contains","text","remove","Legend","circles","data","addEventListener","onMouseMove","onMouseLeave","dateTime","offsetX","position","prev","i","abs","xCoord","yCoord","innerHTML","Plot","xaxis","yaxis","legend","updateXAxis","updateYAxis","updateViewport","barSize","minDiff","Timeline","onTimelineChange","onTimelineEnd","onDrag","onStopDrag","onStartDragLeft","onStartDrag","onStartDragArea","onStartDragRight","renderSelection","updateLeftBar","updateRightBar","updateArea","updateLeftBackground","updateRightBackground","$selection","renderLeftBar","renderRightBar","renderArea","renderLeftBackground","renderRightBackground","leftBar","rightBar","area","leftBg","rightBg","startLeft","startRight","startMouseX","mouseX","dragArea","dragLeft","dragRight","onDragArea","onDragLeft","onDragRight","isCheckable","$button","Filter","onFilterToggle","graph","$name","$circle","name","xKeyFromTypes","types","keys","type","columnsByKey","columns","Chart","colors","names","namedColumns","xKey","xColumn","graphColumns","window","renderTitle","renderPlot","renderTimeline","renderFilter","plot","timeline","$title","$plot","$timeline","$filter","$footer","body"],"mappings":"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"}