ngx-trend 6.1.0 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"file":"ngx-trend.umd.js","sources":["../../node_modules/tslib/tslib.es6.js","../src/lib/helpers/math.helpers.ts","../src/lib/helpers/DOM.helpers.ts","../src/lib/helpers/misc.helpers.ts","../src/lib/trend/trend.helpers.ts","../src/lib/trend/trend.component.ts","../src/lib/trend/trend.module.ts","../../src/lib/ngx-trend.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","/* eslint-disable no-restricted-properties */\n\n/** normalize\n * This lets us translate a value from one scale to another.\n *\n * @param value - Our initial value to translate\n * @param min - the current minimum value possible\n * @param max - the current maximum value possible\n * @param scaleMin - the min value of the scale we're translating to\n * @param scaleMax - the max value of the scale we're translating to\n * @returns the value on its new scale\n */\nexport function normalize(\n value: number,\n min: number,\n max: number,\n scaleMin = 0,\n scaleMax = 1,\n): number {\n // If the `min` and `max` are the same value, it means our dataset is flat.\n // For now, let's assume that flat data should be aligned to the bottom.\n if (min === max) {\n return scaleMin;\n }\n\n return scaleMin + (value - min) * (scaleMax - scaleMin) / (max - min);\n}\n\nexport interface Point {\n x: number;\n y: number;\n}\n\n/** moveTo\n * the coordinate that lies at a midpoint between 2 lines, based on the radius\n *\n * @param to - Our initial point\n * @param to.x - The x value of our initial point\n * @param to.y - The y value of our initial point\n * @param from - Our final point\n * @param from.x - The x value of our final point\n * @param from.y - The y value of our final point\n * @param radius - The distance away from the final point\n * @returns an object holding the x/y coordinates of the midpoint.\n */\nexport function moveTo(to: Point, from: Point, radius: number): Point {\n const length = Math.sqrt((to.x - from.x) * (to.x - from.x) + (to.y - from.y) * (to.y - from.y));\n const unitVector = { x: (to.x - from.x) / length, y: (to.y - from.y) / length };\n\n return {\n x: from.x + unitVector.x * radius,\n y: from.y + unitVector.y * radius,\n };\n}\n\n/** getDistanceBetween\n * Simple formula derived from pythagoras to calculate the distance between\n * 2 points on a plane.\n *\n * @param p1 - Our initial point\n * @param p1.x - The x value of our initial point\n * @param p1.y - The y value of our initial point\n * @param p2 - Our final point\n * @param p2.x - The x value of our final point\n * @param p2.y - The y value of our final point\n * @returns the distance between the points.\n */\nexport const getDistanceBetween = (p1: Point, p2: Point): number =>\n Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));\n\n/** checkForCollinearPoints\n * Figure out if the midpoint fits perfectly on a line between the two others.\n *\n * @param p1 - Our initial point\n * @param p1.x - The x value of our initial point\n * @param p1.y - The y value of our initial point\n * @param p2 - Our mid-point\n * @param p2.x - The x value of our mid-point\n * @param p2.y - The y value of our mid-point\n * @param p3 - Our final point\n * @param p3.x - The x value of our final point\n * @param p3.y - The y value of our final point\n * @returns whether or not p2 sits on the line between p1 and p3.\n */\nexport const checkForCollinearPoints = (p1: Point, p2: Point, p3: Point): boolean =>\n (p1.y - p2.y) * (p1.x - p3.x) === (p1.y - p3.y) * (p1.x - p2.x);\n","import {\n checkForCollinearPoints,\n getDistanceBetween,\n moveTo,\n Point,\n} from './math.helpers';\n\nexport const buildLinearPath = (data: Point[]) =>\n data.reduce((path, point, index) => {\n // The very first instruction needs to be a \"move\".\n // The rest will be a \"line\".\n const isFirstInstruction = index === 0;\n const instruction = isFirstInstruction ? 'M' : 'L';\n\n return `${path}${instruction} ${point.x},${point.y}\\n`;\n }, '');\n\nexport function buildSmoothPath(data: Point[], radius: number): string {\n const [firstPoint, ...otherPoints] = data;\n\n return otherPoints.reduce((path, point, index) => {\n const next = otherPoints[index + 1];\n const prev = otherPoints[index - 1] || firstPoint;\n\n const isCollinear = next && checkForCollinearPoints(prev, point, next);\n\n if (!next || isCollinear) {\n // The very last line in the sequence can just be a regular line.\n return `${path}\\nL ${point.x},${point.y}`;\n }\n\n const distanceFromPrev = getDistanceBetween(prev, point);\n const distanceFromNext = getDistanceBetween(next, point);\n const threshold = Math.min(distanceFromPrev, distanceFromNext);\n\n const isTooCloseForRadius = threshold / 2 < radius;\n\n const radiusForPoint = isTooCloseForRadius ? threshold / 2 : radius;\n\n const before = moveTo(prev, point, radiusForPoint);\n const after = moveTo(next, point, radiusForPoint);\n\n return [\n path,\n `L ${before.x},${before.y}`,\n `S ${point.x},${point.y} ${after.x},${after.y}`,\n ].join('\\n');\n }, `M ${firstPoint.x},${firstPoint.y}`);\n}\n","export const generateId = () => Math.round(Math.random() * Math.pow(10, 16));\n","import { normalize } from '../helpers/math.helpers';\n\nexport function normalizeDataset(\n data: number[],\n minX: number,\n maxX: number,\n minY: number,\n maxY: number,\n): Array<{ x: number; y: number }> {\n // For the X axis, we want to normalize it based on its index in the array.\n // For the Y axis, we want to normalize it based on the element's value.\n //\n // X axis is easy: just evenly-space each item in the array.\n // For the Y axis, we first need to find the min and max of our array,\n // and then normalize those values between 0 and 1.\n const boundariesX = { min: 0, max: data.length - 1 };\n const boundariesY = { min: Math.min(...data), max: Math.max(...data) };\n\n const normalizedData = data.map((point, index) => ({\n x: normalize(index, boundariesX.min, boundariesX.max, minX, maxX),\n y: normalize(point, boundariesY.min, boundariesY.max, minY, maxY),\n }));\n\n // According to the SVG spec, paths with a height/width of `0` can't have\n // linear gradients applied. This means that our lines are invisible when\n // the dataset is flat (eg. [0, 0, 0, 0]).\n //\n // The hacky solution is to apply a very slight offset to the first point of\n // the dataset. As ugly as it is, it's the best solution we can find (there\n // are ways within the SVG spec of changing it, but not without causing\n // breaking changes).\n if (boundariesY.min === boundariesY.max) {\n normalizedData[0].y += 0.0001;\n }\n\n return normalizedData;\n}\n","import { animate, keyframes, state, style, transition, trigger } from '@angular/animations';\nimport { Component, ElementRef, Input, OnChanges, ViewChild } from '@angular/core';\n\nimport { buildLinearPath, buildSmoothPath } from '../helpers/DOM.helpers';\nimport { normalize } from '../helpers/math.helpers';\nimport { generateId } from '../helpers/misc.helpers';\nimport { normalizeDataset } from './trend.helpers';\n\n@Component({\n selector: 'ngx-trend',\n template: `\n <svg\n *ngIf=\"data && data.length >= 2\"\n [attr.width]=\"svgWidth\"\n [attr.height]=\"svgHeight\"\n [attr.stroke]=\"stroke\"\n [attr.stroke-width]=\"strokeWidth\"\n [attr.stroke-linecap]=\"strokeLinecap\"\n [attr.viewBox]=\"viewBox\"\n [attr.preserveAspectRatio]=\"preserveAspectRatio\"\n >\n <defs *ngIf=\"gradient && gradient.length\">\n <linearGradient [attr.id]=\"gradientId\" x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop\n *ngFor=\"let g of gradientTrimmed\"\n [attr.key]=\"g.idx\"\n [attr.offset]=\"g.offset\"\n [attr.stop-color]=\"g.stopColor\"\n />\n </linearGradient>\n </defs>\n <path\n fill=\"none\"\n #pathEl\n [attr.stroke]=\"pathStroke\"\n [attr.d]=\"d\"\n [@pathAnimaiton]=\"{\n value: animationState,\n params: {\n autoDrawDuration: autoDrawDuration,\n autoDrawEasing: autoDrawEasing,\n lineLength: lineLength\n }\n }\"\n />\n </svg>\n `,\n animations: [\n trigger('pathAnimaiton', [\n state('inactive', style({ display: 'none' })),\n transition('* => active', [\n style({ display: 'initial' }),\n // We do the animation using the dash array/offset trick\n // https://css-tricks.com/svg-line-animation-works/\n animate(\n '{{ autoDrawDuration }}ms {{ autoDrawEasing }}',\n keyframes([\n style({\n 'stroke-dasharray': '{{ lineLength }}px',\n 'stroke-dashoffset': '{{ lineLength }}px',\n }),\n style({\n 'stroke-dasharray': '{{ lineLength }}px',\n 'stroke-dashoffset': 0,\n }),\n ]),\n ),\n // One unfortunate side-effect of the auto-draw is that the line is\n // actually 1 big dash, the same length as the line itself. If the\n // line length changes (eg. radius change, new data), that dash won't\n // be the same length anymore. We can fix that by removing those\n // properties once the auto-draw is completed.\n style({\n 'stroke-dashoffset': '',\n 'stroke-dasharray': '',\n }),\n ]),\n ]),\n ],\n})\nexport class TrendComponent implements OnChanges {\n id: number;\n @Input() data?: Array<(number | { value: number })>;\n @Input() smooth?: boolean;\n @Input() autoDraw = false;\n @Input() autoDrawDuration = 2000;\n @Input() autoDrawEasing = 'ease';\n @Input() width?: number;\n @Input() height?: number;\n @Input() padding = 8;\n @Input() radius = 10;\n @Input() stroke = 'black';\n @Input() strokeLinecap = '';\n @Input() strokeWidth = 1;\n @Input() gradient: string[] = [];\n @Input() preserveAspectRatio?: string;\n @Input() svgHeight: string | number = '25%';\n @Input() svgWidth: string | number = '100%';\n @ViewChild('pathEl') pathEl!: ElementRef;\n gradientTrimmed!: Array<{ idx: number; stopColor: string; offset: number }>;\n d: any;\n viewBox!: string;\n pathStroke: any;\n gradientId: string;\n lineLength!: number;\n animationState = '';\n\n constructor() {\n this.id = generateId();\n this.gradientId = `ngx-trend-vertical-gradient-${this.id}`;\n }\n ngOnChanges(): void {\n // We need at least 2 points to draw a graph.\n if (!this.data || this.data.length < 2) {\n return;\n }\n\n // `data` can either be an array of numbers:\n // [1, 2, 3]\n // or, an array of objects containing a value:\n // [{ value: 1 }, { value: 2 }, { value: 3 }]\n //\n // For now, we're just going to convert the second form to the first.\n // Later on, if/when we support tooltips, we may adjust.\n const plainValues = this.data.map(point => {\n if (typeof point === 'number') {\n return point;\n }\n return point.value;\n });\n\n // Our viewbox needs to be in absolute units, so we'll default to 300x75\n // Our SVG can be a %, though; this is what makes it scalable.\n // By defaulting to percentages, the SVG will grow to fill its parent\n // container, preserving a 1/4 aspect ratio.\n const viewBoxWidth = this.width || 300;\n const viewBoxHeight = this.height || 75;\n this.svgWidth = this.width || '100%';\n this.svgHeight = this.height || '25%';\n this.viewBox = `0 0 ${viewBoxWidth} ${viewBoxHeight}`;\n const root = location.href.split(location.hash || '#')[0];\n this.pathStroke =\n this.gradient && this.gradient.length ? `url('${root}#${this.gradientId}')` : undefined;\n\n this.gradientTrimmed = this.gradient\n .slice()\n .reverse()\n .map((val, idx) => {\n return {\n idx,\n stopColor: val,\n offset: normalize(idx, 0, this.gradient.length - 1 || 1),\n };\n });\n\n const normalizedValues = normalizeDataset(\n plainValues,\n this.padding,\n viewBoxWidth - this.padding,\n // NOTE: Because SVGs are indexed from the top left, but most data is\n // indexed from the bottom left, we're inverting the Y min/max.\n viewBoxHeight - this.padding,\n this.padding,\n );\n\n if (this.autoDraw && this.animationState !== 'active') {\n this.animationState = 'inactive';\n setTimeout(() => {\n this.lineLength = this.pathEl.nativeElement.getTotalLength();\n this.animationState = 'active';\n });\n }\n\n this.d = this.smooth\n ? buildSmoothPath(normalizedValues, this.radius)\n : buildLinearPath(normalizedValues);\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport { TrendComponent } from './trend.component';\n\n@NgModule({\n imports: [CommonModule],\n exports: [TrendComponent],\n declarations: [TrendComponent],\n})\nexport class TrendModule {\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["Component","trigger","state","style","transition","animate","keyframes","Input","ViewChild","NgModule","CommonModule"],"mappings":";;;;;;IAAA;;;;;;;;;;;;;;IAcA;IAEA,IAAI,aAAa,GAAG,UAAS,CAAC,EAAE,CAAC;QAC7B,aAAa,GAAG,MAAM,CAAC,cAAc;aAChC,EAAE,SAAS,EAAE,EAAE,EAAE,YAAY,KAAK,IAAI,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC;YAC5E,UAAU,CAAC,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC;gBAAE,IAAI,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;oBAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,OAAO,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B,CAAC,CAAC;aAEc,SAAS,CAAC,CAAC,EAAE,CAAC;QAC1B,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpB,SAAS,EAAE,KAAK,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,EAAE;QACvC,CAAC,CAAC,SAAS,GAAG,CAAC,KAAK,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IACzF,CAAC;IAEM,IAAI,QAAQ,GAAG;QAClB,QAAQ,GAAG,MAAM,CAAC,MAAM,IAAI,SAAS,QAAQ,CAAC,CAAC;YAC3C,KAAK,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE;gBACjD,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;gBACjB,KAAK,IAAI,CAAC,IAAI,CAAC;oBAAE,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;wBAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;aAChF;YACD,OAAO,CAAC,CAAC;SACZ,CAAA;QACD,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC3C,CAAC,CAAA;aAEe,MAAM,CAAC,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,EAAE,CAAC;QACX,KAAK,IAAI,CAAC,IAAI,CAAC;YAAE,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC/E,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAChB,IAAI,CAAC,IAAI,IAAI,IAAI,OAAO,MAAM,CAAC,qBAAqB,KAAK,UAAU;YAC/D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACpE,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,SAAS,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;oBAC1E,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;aACzB;QACL,OAAO,CAAC,CAAC;IACb,CAAC;aAEe,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI;QACpD,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,GAAG,MAAM,CAAC,wBAAwB,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QAC7H,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,UAAU;YAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;;YAC1H,KAAK,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;gBAAE,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;oBAAE,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QAClJ,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC;aAEe,OAAO,CAAC,UAAU,EAAE,SAAS;QACzC,OAAO,UAAU,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC,EAAE,CAAA;IACzE,CAAC;aAEe,UAAU,CAAC,WAAW,EAAE,aAAa;QACjD,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,UAAU;YAAE,OAAO,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IACnI,CAAC;aAEe,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS;QACvD,SAAS,KAAK,CAAC,KAAK,IAAI,OAAO,KAAK,YAAY,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,UAAU,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE;QAC5G,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,EAAE,UAAU,OAAO,EAAE,MAAM;YACrD,SAAS,SAAS,CAAC,KAAK,IAAI,IAAI;gBAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;aAAE;YAAC,OAAO,CAAC,EAAE;gBAAE,MAAM,CAAC,CAAC,CAAC,CAAC;aAAE,EAAE;YAC3F,SAAS,QAAQ,CAAC,KAAK,IAAI,IAAI;gBAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;aAAE;YAAC,OAAO,CAAC,EAAE;gBAAE,MAAM,CAAC,CAAC,CAAC,CAAC;aAAE,EAAE;YAC9F,SAAS,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,EAAE;YAC9G,IAAI,CAAC,CAAC,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;SACzE,CAAC,CAAC;IACP,CAAC;aAEe,WAAW,CAAC,OAAO,EAAE,IAAI;QACrC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,cAAa,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;gBAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACjH,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,MAAM,KAAK,UAAU,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,cAAa,OAAO,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACzJ,SAAS,IAAI,CAAC,CAAC,IAAI,OAAO,UAAU,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;QAClE,SAAS,IAAI,CAAC,EAAE;YACZ,IAAI,CAAC;gBAAE,MAAM,IAAI,SAAS,CAAC,iCAAiC,CAAC,CAAC;YAC9D,OAAO,CAAC;gBAAE,IAAI;oBACV,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI;wBAAE,OAAO,CAAC,CAAC;oBAC7J,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;wBAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;oBACxC,QAAQ,EAAE,CAAC,CAAC,CAAC;wBACT,KAAK,CAAC,CAAC;wBAAC,KAAK,CAAC;4BAAE,CAAC,GAAG,EAAE,CAAC;4BAAC,MAAM;wBAC9B,KAAK,CAAC;4BAAE,CAAC,CAAC,KAAK,EAAE,CAAC;4BAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;wBACxD,KAAK,CAAC;4BAAE,CAAC,CAAC,KAAK,EAAE,CAAC;4BAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;4BAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;4BAAC,SAAS;wBACjD,KAAK,CAAC;4BAAE,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;4BAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;4BAAC,SAAS;wBACjD;4BACI,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE;gCAAE,CAAC,GAAG,CAAC,CAAC;gCAAC,SAAS;6BAAE;4BAC5G,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;gCAAE,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;gCAAC,MAAM;6BAAE;4BACtF,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE;gCAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gCAAC,CAAC,GAAG,EAAE,CAAC;gCAAC,MAAM;6BAAE;4BACrE,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE;gCAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gCAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gCAAC,MAAM;6BAAE;4BACnE,IAAI,CAAC,CAAC,CAAC,CAAC;gCAAE,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;4BACtB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;4BAAC,SAAS;qBAC9B;oBACD,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;iBAC9B;gBAAC,OAAO,CAAC,EAAE;oBAAE,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;oBAAC,CAAC,GAAG,CAAC,CAAC;iBAAE;wBAAS;oBAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;iBAAE;YAC1D,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;gBAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;YAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;SACpF;IACL,CAAC;IAEM,IAAI,eAAe,GAAG,MAAM,CAAC,MAAM,IAAI,UAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;QAC9D,IAAI,EAAE,KAAK,SAAS;YAAE,EAAE,GAAG,CAAC,CAAC;QAC7B,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,cAAa,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACzF,CAAC,KAAK,UAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;QACtB,IAAI,EAAE,KAAK,SAAS;YAAE,EAAE,GAAG,CAAC,CAAC;QAC7B,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;aAEa,YAAY,CAAC,CAAC,EAAE,OAAO;QACnC,KAAK,IAAI,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;gBAAE,eAAe,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACvG,CAAC;aAEe,QAAQ,CAAC,CAAC;QACtB,IAAI,CAAC,GAAG,OAAO,MAAM,KAAK,UAAU,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QAC9E,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO;gBAC1C,IAAI,EAAE;oBACF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM;wBAAE,CAAC,GAAG,KAAK,CAAC,CAAC;oBACnC,OAAO,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;iBAC3C;aACJ,CAAC;QACF,MAAM,IAAI,SAAS,CAAC,CAAC,GAAG,yBAAyB,GAAG,iCAAiC,CAAC,CAAC;IAC3F,CAAC;aAEe,MAAM,CAAC,CAAC,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,OAAO,MAAM,KAAK,UAAU,IAAI,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC3D,IAAI,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;QACjB,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QACjC,IAAI;YACA,OAAO,CAAC,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI;gBAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;SAC9E;QACD,OAAO,KAAK,EAAE;YAAE,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;SAAE;gBAC/B;YACJ,IAAI;gBACA,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;oBAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACpD;oBACO;gBAAE,IAAI,CAAC;oBAAE,MAAM,CAAC,CAAC,KAAK,CAAC;aAAE;SACpC;QACD,OAAO,EAAE,CAAC;IACd,CAAC;aAEe,QAAQ;QACpB,KAAK,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE;YAC9C,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,OAAO,EAAE,CAAC;IACd,CAAC;aAEe,cAAc;QAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;YAAE,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACpF,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;YAC5C,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE;gBAC7D,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACpB,OAAO,CAAC,CAAC;IACb,CAAC;IAAA,CAAC;aAEc,OAAO,CAAC,CAAC;QACrB,OAAO,IAAI,YAAY,OAAO,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;IACzE,CAAC;aAEe,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS;QAC3D,IAAI,CAAC,MAAM,CAAC,aAAa;YAAE,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;QACvF,IAAI,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;QAC9D,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,cAAc,OAAO,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QACtH,SAAS,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;YAAE,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE;QAC1I,SAAS,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI;YAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SAAE;QAAC,OAAO,CAAC,EAAE;YAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SAAE,EAAE;QAClF,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,YAAY,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;QACxH,SAAS,OAAO,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,EAAE;QAClD,SAAS,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,EAAE;QAClD,SAAS,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM;YAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;IACtF,CAAC;aAEe,gBAAgB,CAAC,CAAC;QAC9B,IAAI,CAAC,EAAE,CAAC,CAAC;QACT,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,cAAc,OAAO,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAC5I,SAAS,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;IACnJ,CAAC;aAEe,aAAa,CAAC,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,aAAa;YAAE,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;QACvF,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,QAAQ,KAAK,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,cAAc,OAAO,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACjN,SAAS,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,OAAO,IAAI,OAAO,CAAC,UAAU,OAAO,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE;QAChK,SAAS,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAS,CAAC,IAAI,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC,EAAE;IAChI,CAAC;aAEe,oBAAoB,CAAC,MAAM,EAAE,GAAG;QAC5C,IAAI,MAAM,CAAC,cAAc,EAAE;YAAE,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;SAAE;aAAM;YAAE,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;SAAE;QAC/G,OAAO,MAAM,CAAC;IAClB,CAAC;IAAA,CAAC;IAEF,IAAI,kBAAkB,GAAG,MAAM,CAAC,MAAM,IAAI,UAAS,CAAC,EAAE,CAAC;QACnD,MAAM,CAAC,cAAc,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC,IAAI,UAAS,CAAC,EAAE,CAAC;QACd,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACrB,CAAC,CAAC;aAEc,YAAY,CAAC,GAAG;QAC5B,IAAI,GAAG,IAAI,GAAG,CAAC,UAAU;YAAE,OAAO,GAAG,CAAC;QACtC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,GAAG,IAAI,IAAI;YAAE,KAAK,IAAI,CAAC,IAAI,GAAG;gBAAE,IAAI,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;oBAAE,eAAe,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAC5G,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAChC,OAAO,MAAM,CAAC;IAClB,CAAC;aAEe,eAAe,CAAC,GAAG;QAC/B,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IAC5D,CAAC;aAEe,sBAAsB,CAAC,QAAQ,EAAE,UAAU;QACvD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;YAC3B,MAAM,IAAI,SAAS,CAAC,gDAAgD,CAAC,CAAC;SACzE;QACD,OAAO,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;aAEe,sBAAsB,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK;QAC9D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;YAC3B,MAAM,IAAI,SAAS,CAAC,gDAAgD,CAAC,CAAC;SACzE;QACD,UAAU,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAChC,OAAO,KAAK,CAAC;IACjB;;IClOA;IAEA;;;;;;;;;;aAUgB,SAAS,CACvB,KAAa,EACb,GAAW,EACX,GAAW,EACX,QAAY,EACZ,QAAY;QADZ,yBAAA,EAAA,YAAY;QACZ,yBAAA,EAAA,YAAY;;;QAIZ,IAAI,GAAG,KAAK,GAAG,EAAE;YACf,OAAO,QAAQ,CAAC;SACjB;QAED,OAAO,QAAQ,GAAG,CAAC,KAAK,GAAG,GAAG,KAAK,QAAQ,GAAG,QAAQ,CAAC,IAAI,GAAG,GAAG,GAAG,CAAC,CAAC;IACxE,CAAC;IAOD;;;;;;;;;;;;aAYgB,MAAM,CAAC,EAAS,EAAE,IAAW,EAAE,MAAc;QAC3D,IAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAChG,IAAM,UAAU,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC;QAEhF,OAAO;YACL,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,MAAM;YACjC,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,MAAM;SAClC,CAAC;IACJ,CAAC;IAED;;;;;;;;;;;;IAYO,IAAM,kBAAkB,GAAG,UAAC,EAAS,EAAE,EAAS,IACrD,OAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAA,CAAC;IAEjE;;;;;;;;;;;;;;IAcO,IAAM,uBAAuB,GAAG,UAAC,EAAS,EAAE,EAAS,EAAE,EAAS,IACrE,OAAA,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAA;;IC9E1D,IAAM,eAAe,GAAG,UAAC,IAAa,IAC3C,OAAA,IAAI,CAAC,MAAM,CAAC,UAAC,IAAI,EAAE,KAAK,EAAE,KAAK;;;QAG7B,IAAM,kBAAkB,GAAG,KAAK,KAAK,CAAC,CAAC;QACvC,IAAM,WAAW,GAAG,kBAAkB,GAAG,GAAG,GAAG,GAAG,CAAC;QAEnD,OAAO,KAAG,IAAI,GAAG,WAAW,SAAI,KAAK,CAAC,CAAC,SAAI,KAAK,CAAC,CAAC,OAAI,CAAC;IACzD,CAAC,EAAE,EAAE,CAAC,GAAA,CAAC;aAEO,eAAe,CAAC,IAAa,EAAE,MAAc;QACrD,IAAA,KAAA,OAA+B,IAAI,CAAA,EAAlC,UAAU,QAAA,EAAK,WAAW,cAAQ,CAAC;QAE1C,OAAO,WAAW,CAAC,MAAM,CAAC,UAAC,IAAI,EAAE,KAAK,EAAE,KAAK;YAC3C,IAAM,IAAI,GAAG,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YACpC,IAAM,IAAI,GAAG,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,UAAU,CAAC;YAElD,IAAM,WAAW,GAAG,IAAI,IAAI,uBAAuB,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;YAEvE,IAAI,CAAC,IAAI,IAAI,WAAW,EAAE;;gBAExB,OAAU,IAAI,YAAO,KAAK,CAAC,CAAC,SAAI,KAAK,CAAC,CAAG,CAAC;aAC3C;YAED,IAAM,gBAAgB,GAAG,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACzD,IAAM,gBAAgB,GAAG,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACzD,IAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC;YAE/D,IAAM,mBAAmB,GAAG,SAAS,GAAG,CAAC,GAAG,MAAM,CAAC;YAEnD,IAAM,cAAc,GAAG,mBAAmB,GAAG,SAAS,GAAG,CAAC,GAAG,MAAM,CAAC;YAEpE,IAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;YACnD,IAAM,KAAK,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,cAAc,CAAC,CAAC;YAElD,OAAO;gBACL,IAAI;gBACJ,OAAK,MAAM,CAAC,CAAC,SAAI,MAAM,CAAC,CAAG;gBAC3B,OAAK,KAAK,CAAC,CAAC,SAAI,KAAK,CAAC,CAAC,SAAI,KAAK,CAAC,CAAC,SAAI,KAAK,CAAC,CAAG;aAChD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACd,EAAE,OAAK,UAAU,CAAC,CAAC,SAAI,UAAU,CAAC,CAAG,CAAC,CAAC;IAC1C;;IChDO,IAAM,UAAU,GAAG,cAAM,OAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,GAAA;;aCE5D,gBAAgB,CAC9B,IAAc,EACd,IAAY,EACZ,IAAY,EACZ,IAAY,EACZ,IAAY;;;;;;;QAQZ,IAAM,WAAW,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrD,IAAM,WAAW,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,OAAR,IAAI,WAAQ,IAAI,EAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,OAAR,IAAI,WAAQ,IAAI,EAAC,EAAE,CAAC;QAEvE,IAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,UAAC,KAAK,EAAE,KAAK,IAAK,QAAC;YACjD,CAAC,EAAE,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC;YACjE,CAAC,EAAE,SAAS,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC;SAClE,IAAC,CAAC,CAAC;;;;;;;;;QAUJ,IAAI,WAAW,CAAC,GAAG,KAAK,WAAW,CAAC,GAAG,EAAE;YACvC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC;SAC/B;QAED,OAAO,cAAc,CAAC;IACxB;;;QCuEE;YAvBS,aAAQ,GAAG,KAAK,CAAC;YACjB,qBAAgB,GAAG,IAAI,CAAC;YACxB,mBAAc,GAAG,MAAM,CAAC;YAGxB,YAAO,GAAG,CAAC,CAAC;YACZ,WAAM,GAAG,EAAE,CAAC;YACZ,WAAM,GAAG,OAAO,CAAC;YACjB,kBAAa,GAAG,EAAE,CAAC;YACnB,gBAAW,GAAG,CAAC,CAAC;YAChB,aAAQ,GAAa,EAAE,CAAC;YAExB,cAAS,GAAoB,KAAK,CAAC;YACnC,aAAQ,GAAoB,MAAM,CAAC;YAQ5C,mBAAc,GAAG,EAAE,CAAC;YAGlB,IAAI,CAAC,EAAE,GAAG,UAAU,EAAE,CAAC;YACvB,IAAI,CAAC,UAAU,GAAG,iCAA+B,IAAI,CAAC,EAAI,CAAC;SAC5D;QACD,oCAAW,GAAX;YAAA,iBAiEC;;YA/DC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;gBACtC,OAAO;aACR;;;;;;;;YASD,IAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAA,KAAK;gBACrC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;oBAC7B,OAAO,KAAK,CAAC;iBACd;gBACD,OAAO,KAAK,CAAC,KAAK,CAAC;aACpB,CAAC,CAAC;;;;;YAMH,IAAM,YAAY,GAAG,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC;YACvC,IAAM,aAAa,GAAG,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;YACxC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC;YACrC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;YACtC,IAAI,CAAC,OAAO,GAAG,SAAO,YAAY,SAAI,aAAe,CAAC;YACtD,IAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,IAAI,CAAC,UAAU;gBACb,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,UAAQ,IAAI,SAAI,IAAI,CAAC,UAAU,OAAI,GAAG,SAAS,CAAC;YAE1F,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,QAAQ;iBACjC,KAAK,EAAE;iBACP,OAAO,EAAE;iBACT,GAAG,CAAC,UAAC,GAAG,EAAE,GAAG;gBACZ,OAAO;oBACL,GAAG,KAAA;oBACH,SAAS,EAAE,GAAG;oBACd,MAAM,EAAE,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,KAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC;iBACzD,CAAC;aACH,CAAC,CAAC;YAEL,IAAM,gBAAgB,GAAG,gBAAgB,CACvC,WAAW,EACX,IAAI,CAAC,OAAO,EACZ,YAAY,GAAG,IAAI,CAAC,OAAO;;;YAG3B,aAAa,GAAG,IAAI,CAAC,OAAO,EAC5B,IAAI,CAAC,OAAO,CACb,CAAC;YAEF,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,cAAc,KAAK,QAAQ,EAAE;gBACrD,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC;gBACjC,UAAU,CAAC;oBACT,KAAI,CAAC,UAAU,GAAG,KAAI,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,EAAE,CAAC;oBAC7D,KAAI,CAAC,cAAc,GAAG,QAAQ,CAAC;iBAChC,CAAC,CAAC;aACJ;YAED,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM;kBAChB,eAAe,CAAC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC;kBAC9C,eAAe,CAAC,gBAAgB,CAAC,CAAC;SACvC;;;;gBAxKFA,cAAS,SAAC;oBACT,QAAQ,EAAE,WAAW;oBACrB,QAAQ,EAAE,ylCAoCT;oBACD,UAAU,EAAE;wBACVC,kBAAO,CAAC,eAAe,EAAE;4BACvBC,gBAAK,CAAC,UAAU,EAAEC,gBAAK,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;4BAC7CC,qBAAU,CAAC,aAAa,EAAE;gCACxBD,gBAAK,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;;;gCAG7BE,kBAAO,CACL,+CAA+C,EAC/CC,oBAAS,CAAC;oCACRH,gBAAK,CAAC;wCACJ,kBAAkB,EAAE,oBAAoB;wCACxC,mBAAmB,EAAE,oBAAoB;qCAC1C,CAAC;oCACFA,gBAAK,CAAC;wCACJ,kBAAkB,EAAE,oBAAoB;wCACxC,mBAAmB,EAAE,CAAC;qCACvB,CAAC;iCACH,CAAC,CACH;;;;;;gCAMDA,gBAAK,CAAC;oCACJ,mBAAmB,EAAE,EAAE;oCACvB,kBAAkB,EAAE,EAAE;iCACvB,CAAC;6BACH,CAAC;yBACH,CAAC;qBACH;iBACF;;;;uBAGEI,UAAK;yBACLA,UAAK;2BACLA,UAAK;mCACLA,UAAK;iCACLA,UAAK;wBACLA,UAAK;yBACLA,UAAK;0BACLA,UAAK;yBACLA,UAAK;yBACLA,UAAK;gCACLA,UAAK;8BACLA,UAAK;2BACLA,UAAK;sCACLA,UAAK;4BACLA,UAAK;2BACLA,UAAK;yBACLC,cAAS,SAAC,QAAQ;;;;QCxFrB;;;;;gBALCC,aAAQ,SAAC;oBACR,OAAO,EAAE,CAACC,mBAAY,CAAC;oBACvB,OAAO,EAAE,CAAC,cAAc,CAAC;oBACzB,YAAY,EAAE,CAAC,cAAc,CAAC;iBAC/B;;;ICTD;;;;;;;;;;;;;"}
@@ -1,16 +0,0 @@
1
- !function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("@angular/animations"),require("@angular/core"),require("@angular/common")):"function"==typeof define&&define.amd?define("ngx-trend",["exports","@angular/animations","@angular/core","@angular/common"],n):n((t="undefined"!=typeof globalThis?globalThis:t||self)["ngx-trend"]={},t.ng.animations,t.ng.core,t.ng.common)}(this,(function(t,n,e,a){"use strict";
2
- /*! *****************************************************************************
3
- Copyright (c) Microsoft Corporation.
4
-
5
- Permission to use, copy, modify, and/or distribute this software for any
6
- purpose with or without fee is hereby granted.
7
-
8
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
9
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
10
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
11
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
12
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
13
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
14
- PERFORMANCE OF THIS SOFTWARE.
15
- ***************************************************************************** */Object.create;function i(t,n){var e="function"==typeof Symbol&&t[Symbol.iterator];if(!e)return t;var a,i,r=e.call(t),o=[];try{for(;(void 0===n||n-- >0)&&!(a=r.next()).done;)o.push(a.value)}catch(t){i={error:t}}finally{try{a&&!a.done&&(e=r.return)&&e.call(r)}finally{if(i)throw i.error}}return o}function r(){for(var t=[],n=0;n<arguments.length;n++)t=t.concat(i(arguments[n]));return t}Object.create;function o(t,n,e,a,i){return void 0===a&&(a=0),void 0===i&&(i=1),n===e?a:a+(t-n)*(i-a)/(e-n)}function s(t,n,e){var a=Math.sqrt((t.x-n.x)*(t.x-n.x)+(t.y-n.y)*(t.y-n.y)),i=(t.x-n.x)/a,r=(t.y-n.y)/a;return{x:n.x+i*e,y:n.y+r*e}}var h=function(t,n){return Math.sqrt(Math.pow(n.x-t.x,2)+Math.pow(n.y-t.y,2))};var d=function(){function t(){this.autoDraw=!1,this.autoDrawDuration=2e3,this.autoDrawEasing="ease",this.padding=8,this.radius=10,this.stroke="black",this.strokeLinecap="",this.strokeWidth=1,this.gradient=[],this.svgHeight="25%",this.svgWidth="100%",this.animationState="",this.id=Math.round(Math.random()*Math.pow(10,16)),this.gradientId="ngx-trend-vertical-gradient-"+this.id}return t.prototype.ngOnChanges=function(){var t=this;if(this.data&&!(this.data.length<2)){var n=this.data.map((function(t){return"number"==typeof t?t:t.value})),e=this.width||300,a=this.height||75;this.svgWidth=this.width||"100%",this.svgHeight=this.height||"25%",this.viewBox="0 0 "+e+" "+a;var d=location.href.split(location.hash||"#")[0];this.pathStroke=this.gradient&&this.gradient.length?"url('"+d+"#"+this.gradientId+"')":void 0,this.gradientTrimmed=this.gradient.slice().reverse().map((function(n,e){return{idx:e,stopColor:n,offset:o(e,0,t.gradient.length-1||1)}}));var u,p,g,l,y,c,f,m,v=(u=n,p=this.padding,g=e-this.padding,l=a-this.padding,y=this.padding,c={min:0,max:u.length-1},f={min:Math.min.apply(Math,r(u)),max:Math.max.apply(Math,r(u))},m=u.map((function(t,n){return{x:o(n,c.min,c.max,p,g),y:o(t,f.min,f.max,l,y)}})),f.min===f.max&&(m[0].y+=1e-4),m);this.autoDraw&&"active"!==this.animationState&&(this.animationState="inactive",setTimeout((function(){t.lineLength=t.pathEl.nativeElement.getTotalLength(),t.animationState="active"}))),this.d=this.smooth?function(t,n){var e=i(t),a=e[0],r=e.slice(1);return r.reduce((function(t,e,i){var o,d,u,p=r[i+1],g=r[i-1]||a,l=p&&(d=e,u=p,((o=g).y-d.y)*(o.x-u.x)==(o.y-u.y)*(o.x-d.x));if(!p||l)return t+"\nL "+e.x+","+e.y;var y=h(g,e),c=h(p,e),f=Math.min(y,c),m=f/2<n?f/2:n,v=s(g,e,m),x=s(p,e,m);return[t,"L "+v.x+","+v.y,"S "+e.x+","+e.y+" "+x.x+","+x.y].join("\n")}),"M "+a.x+","+a.y)}(v,this.radius):function(t){return t.reduce((function(t,n,e){return t+(0===e?"M":"L")+" "+n.x+","+n.y+"\n"}),"")}(v)}},t}();d.decorators=[{type:e.Component,args:[{selector:"ngx-trend",template:'\n <svg\n *ngIf="data && data.length >= 2"\n [attr.width]="svgWidth"\n [attr.height]="svgHeight"\n [attr.stroke]="stroke"\n [attr.stroke-width]="strokeWidth"\n [attr.stroke-linecap]="strokeLinecap"\n [attr.viewBox]="viewBox"\n [attr.preserveAspectRatio]="preserveAspectRatio"\n >\n <defs *ngIf="gradient && gradient.length">\n <linearGradient [attr.id]="gradientId" x1="0%" y1="0%" x2="0%" y2="100%">\n <stop\n *ngFor="let g of gradientTrimmed"\n [attr.key]="g.idx"\n [attr.offset]="g.offset"\n [attr.stop-color]="g.stopColor"\n />\n </linearGradient>\n </defs>\n <path\n fill="none"\n #pathEl\n [attr.stroke]="pathStroke"\n [attr.d]="d"\n [@pathAnimaiton]="{\n value: animationState,\n params: {\n autoDrawDuration: autoDrawDuration,\n autoDrawEasing: autoDrawEasing,\n lineLength: lineLength\n }\n }"\n />\n </svg>\n ',animations:[n.trigger("pathAnimaiton",[n.state("inactive",n.style({display:"none"})),n.transition("* => active",[n.style({display:"initial"}),n.animate("{{ autoDrawDuration }}ms {{ autoDrawEasing }}",n.keyframes([n.style({"stroke-dasharray":"{{ lineLength }}px","stroke-dashoffset":"{{ lineLength }}px"}),n.style({"stroke-dasharray":"{{ lineLength }}px","stroke-dashoffset":0})])),n.style({"stroke-dashoffset":"","stroke-dasharray":""})])])]}]}],d.ctorParameters=function(){return[]},d.propDecorators={data:[{type:e.Input}],smooth:[{type:e.Input}],autoDraw:[{type:e.Input}],autoDrawDuration:[{type:e.Input}],autoDrawEasing:[{type:e.Input}],width:[{type:e.Input}],height:[{type:e.Input}],padding:[{type:e.Input}],radius:[{type:e.Input}],stroke:[{type:e.Input}],strokeLinecap:[{type:e.Input}],strokeWidth:[{type:e.Input}],gradient:[{type:e.Input}],preserveAspectRatio:[{type:e.Input}],svgHeight:[{type:e.Input}],svgWidth:[{type:e.Input}],pathEl:[{type:e.ViewChild,args:["pathEl"]}]};var u=function(){};u.decorators=[{type:e.NgModule,args:[{imports:[a.CommonModule],exports:[d],declarations:[d]}]}],t.TrendComponent=d,t.TrendModule=u,Object.defineProperty(t,"__esModule",{value:!0})}));
16
- //# sourceMappingURL=ngx-trend.umd.min.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../node_modules/tslib/tslib.es6.js","../src/lib/helpers/math.helpers.ts","../src/lib/trend/trend.component.ts","../src/lib/helpers/misc.helpers.ts","../src/lib/trend/trend.helpers.ts","../src/lib/helpers/DOM.helpers.ts","../src/lib/trend/trend.module.ts"],"names":["Object","create","__read","o","n","m","Symbol","iterator","r","e","i","call","ar","next","done","push","value","error","__spread","arguments","length","concat","normalize","min","max","scaleMin","scaleMax","moveTo","to","from","radius","Math","sqrt","x","y","unitVector","getDistanceBetween","p1","p2","pow","TrendComponent","this","autoDraw","autoDrawDuration","autoDrawEasing","padding","stroke","strokeLinecap","strokeWidth","gradient","svgHeight","svgWidth","animationState","id","round","random","gradientId","prototype","ngOnChanges","_this","data","plainValues","map","point","viewBoxWidth","width","viewBoxHeight","height","viewBox","root","location","href","split","hash","pathStroke","undefined","gradientTrimmed","slice","reverse","val","idx","stopColor","offset","minX","maxX","minY","maxY","boundariesX","boundariesY","normalizedData","normalizedValues","apply","index","setTimeout","lineLength","pathEl","nativeElement","getTotalLength","d","smooth","_a","firstPoint","otherPoints","reduce","path","p3","prev","isCollinear","distanceFromPrev","distanceFromNext","threshold","radiusForPoint","before","after","join","buildSmoothPath","buildLinearPath","Component","args","selector","template","animations","trigger","state","style","display","transition","animate","keyframes","stroke-dasharray","stroke-dashoffset","Input","ViewChild","NgModule","imports","CommonModule","exports","declarations"],"mappings":"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","sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","/* eslint-disable no-restricted-properties */\n\n/** normalize\n * This lets us translate a value from one scale to another.\n *\n * @param value - Our initial value to translate\n * @param min - the current minimum value possible\n * @param max - the current maximum value possible\n * @param scaleMin - the min value of the scale we're translating to\n * @param scaleMax - the max value of the scale we're translating to\n * @returns the value on its new scale\n */\nexport function normalize(\n value: number,\n min: number,\n max: number,\n scaleMin = 0,\n scaleMax = 1,\n): number {\n // If the `min` and `max` are the same value, it means our dataset is flat.\n // For now, let's assume that flat data should be aligned to the bottom.\n if (min === max) {\n return scaleMin;\n }\n\n return scaleMin + (value - min) * (scaleMax - scaleMin) / (max - min);\n}\n\nexport interface Point {\n x: number;\n y: number;\n}\n\n/** moveTo\n * the coordinate that lies at a midpoint between 2 lines, based on the radius\n *\n * @param to - Our initial point\n * @param to.x - The x value of our initial point\n * @param to.y - The y value of our initial point\n * @param from - Our final point\n * @param from.x - The x value of our final point\n * @param from.y - The y value of our final point\n * @param radius - The distance away from the final point\n * @returns an object holding the x/y coordinates of the midpoint.\n */\nexport function moveTo(to: Point, from: Point, radius: number): Point {\n const length = Math.sqrt((to.x - from.x) * (to.x - from.x) + (to.y - from.y) * (to.y - from.y));\n const unitVector = { x: (to.x - from.x) / length, y: (to.y - from.y) / length };\n\n return {\n x: from.x + unitVector.x * radius,\n y: from.y + unitVector.y * radius,\n };\n}\n\n/** getDistanceBetween\n * Simple formula derived from pythagoras to calculate the distance between\n * 2 points on a plane.\n *\n * @param p1 - Our initial point\n * @param p1.x - The x value of our initial point\n * @param p1.y - The y value of our initial point\n * @param p2 - Our final point\n * @param p2.x - The x value of our final point\n * @param p2.y - The y value of our final point\n * @returns the distance between the points.\n */\nexport const getDistanceBetween = (p1: Point, p2: Point): number =>\n Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));\n\n/** checkForCollinearPoints\n * Figure out if the midpoint fits perfectly on a line between the two others.\n *\n * @param p1 - Our initial point\n * @param p1.x - The x value of our initial point\n * @param p1.y - The y value of our initial point\n * @param p2 - Our mid-point\n * @param p2.x - The x value of our mid-point\n * @param p2.y - The y value of our mid-point\n * @param p3 - Our final point\n * @param p3.x - The x value of our final point\n * @param p3.y - The y value of our final point\n * @returns whether or not p2 sits on the line between p1 and p3.\n */\nexport const checkForCollinearPoints = (p1: Point, p2: Point, p3: Point): boolean =>\n (p1.y - p2.y) * (p1.x - p3.x) === (p1.y - p3.y) * (p1.x - p2.x);\n","import { animate, keyframes, state, style, transition, trigger } from '@angular/animations';\nimport { Component, ElementRef, Input, OnChanges, ViewChild } from '@angular/core';\n\nimport { buildLinearPath, buildSmoothPath } from '../helpers/DOM.helpers';\nimport { normalize } from '../helpers/math.helpers';\nimport { generateId } from '../helpers/misc.helpers';\nimport { normalizeDataset } from './trend.helpers';\n\n@Component({\n selector: 'ngx-trend',\n template: `\n <svg\n *ngIf=\"data && data.length >= 2\"\n [attr.width]=\"svgWidth\"\n [attr.height]=\"svgHeight\"\n [attr.stroke]=\"stroke\"\n [attr.stroke-width]=\"strokeWidth\"\n [attr.stroke-linecap]=\"strokeLinecap\"\n [attr.viewBox]=\"viewBox\"\n [attr.preserveAspectRatio]=\"preserveAspectRatio\"\n >\n <defs *ngIf=\"gradient && gradient.length\">\n <linearGradient [attr.id]=\"gradientId\" x1=\"0%\" y1=\"0%\" x2=\"0%\" y2=\"100%\">\n <stop\n *ngFor=\"let g of gradientTrimmed\"\n [attr.key]=\"g.idx\"\n [attr.offset]=\"g.offset\"\n [attr.stop-color]=\"g.stopColor\"\n />\n </linearGradient>\n </defs>\n <path\n fill=\"none\"\n #pathEl\n [attr.stroke]=\"pathStroke\"\n [attr.d]=\"d\"\n [@pathAnimaiton]=\"{\n value: animationState,\n params: {\n autoDrawDuration: autoDrawDuration,\n autoDrawEasing: autoDrawEasing,\n lineLength: lineLength\n }\n }\"\n />\n </svg>\n `,\n animations: [\n trigger('pathAnimaiton', [\n state('inactive', style({ display: 'none' })),\n transition('* => active', [\n style({ display: 'initial' }),\n // We do the animation using the dash array/offset trick\n // https://css-tricks.com/svg-line-animation-works/\n animate(\n '{{ autoDrawDuration }}ms {{ autoDrawEasing }}',\n keyframes([\n style({\n 'stroke-dasharray': '{{ lineLength }}px',\n 'stroke-dashoffset': '{{ lineLength }}px',\n }),\n style({\n 'stroke-dasharray': '{{ lineLength }}px',\n 'stroke-dashoffset': 0,\n }),\n ]),\n ),\n // One unfortunate side-effect of the auto-draw is that the line is\n // actually 1 big dash, the same length as the line itself. If the\n // line length changes (eg. radius change, new data), that dash won't\n // be the same length anymore. We can fix that by removing those\n // properties once the auto-draw is completed.\n style({\n 'stroke-dashoffset': '',\n 'stroke-dasharray': '',\n }),\n ]),\n ]),\n ],\n})\nexport class TrendComponent implements OnChanges {\n id: number;\n @Input() data?: Array<(number | { value: number })>;\n @Input() smooth?: boolean;\n @Input() autoDraw = false;\n @Input() autoDrawDuration = 2000;\n @Input() autoDrawEasing = 'ease';\n @Input() width?: number;\n @Input() height?: number;\n @Input() padding = 8;\n @Input() radius = 10;\n @Input() stroke = 'black';\n @Input() strokeLinecap = '';\n @Input() strokeWidth = 1;\n @Input() gradient: string[] = [];\n @Input() preserveAspectRatio?: string;\n @Input() svgHeight: string | number = '25%';\n @Input() svgWidth: string | number = '100%';\n @ViewChild('pathEl') pathEl!: ElementRef;\n gradientTrimmed!: Array<{ idx: number; stopColor: string; offset: number }>;\n d: any;\n viewBox!: string;\n pathStroke: any;\n gradientId: string;\n lineLength!: number;\n animationState = '';\n\n constructor() {\n this.id = generateId();\n this.gradientId = `ngx-trend-vertical-gradient-${this.id}`;\n }\n ngOnChanges(): void {\n // We need at least 2 points to draw a graph.\n if (!this.data || this.data.length < 2) {\n return;\n }\n\n // `data` can either be an array of numbers:\n // [1, 2, 3]\n // or, an array of objects containing a value:\n // [{ value: 1 }, { value: 2 }, { value: 3 }]\n //\n // For now, we're just going to convert the second form to the first.\n // Later on, if/when we support tooltips, we may adjust.\n const plainValues = this.data.map(point => {\n if (typeof point === 'number') {\n return point;\n }\n return point.value;\n });\n\n // Our viewbox needs to be in absolute units, so we'll default to 300x75\n // Our SVG can be a %, though; this is what makes it scalable.\n // By defaulting to percentages, the SVG will grow to fill its parent\n // container, preserving a 1/4 aspect ratio.\n const viewBoxWidth = this.width || 300;\n const viewBoxHeight = this.height || 75;\n this.svgWidth = this.width || '100%';\n this.svgHeight = this.height || '25%';\n this.viewBox = `0 0 ${viewBoxWidth} ${viewBoxHeight}`;\n const root = location.href.split(location.hash || '#')[0];\n this.pathStroke =\n this.gradient && this.gradient.length ? `url('${root}#${this.gradientId}')` : undefined;\n\n this.gradientTrimmed = this.gradient\n .slice()\n .reverse()\n .map((val, idx) => {\n return {\n idx,\n stopColor: val,\n offset: normalize(idx, 0, this.gradient.length - 1 || 1),\n };\n });\n\n const normalizedValues = normalizeDataset(\n plainValues,\n this.padding,\n viewBoxWidth - this.padding,\n // NOTE: Because SVGs are indexed from the top left, but most data is\n // indexed from the bottom left, we're inverting the Y min/max.\n viewBoxHeight - this.padding,\n this.padding,\n );\n\n if (this.autoDraw && this.animationState !== 'active') {\n this.animationState = 'inactive';\n setTimeout(() => {\n this.lineLength = this.pathEl.nativeElement.getTotalLength();\n this.animationState = 'active';\n });\n }\n\n this.d = this.smooth\n ? buildSmoothPath(normalizedValues, this.radius)\n : buildLinearPath(normalizedValues);\n }\n}\n","export const generateId = () => Math.round(Math.random() * Math.pow(10, 16));\n","import { normalize } from '../helpers/math.helpers';\n\nexport function normalizeDataset(\n data: number[],\n minX: number,\n maxX: number,\n minY: number,\n maxY: number,\n): Array<{ x: number; y: number }> {\n // For the X axis, we want to normalize it based on its index in the array.\n // For the Y axis, we want to normalize it based on the element's value.\n //\n // X axis is easy: just evenly-space each item in the array.\n // For the Y axis, we first need to find the min and max of our array,\n // and then normalize those values between 0 and 1.\n const boundariesX = { min: 0, max: data.length - 1 };\n const boundariesY = { min: Math.min(...data), max: Math.max(...data) };\n\n const normalizedData = data.map((point, index) => ({\n x: normalize(index, boundariesX.min, boundariesX.max, minX, maxX),\n y: normalize(point, boundariesY.min, boundariesY.max, minY, maxY),\n }));\n\n // According to the SVG spec, paths with a height/width of `0` can't have\n // linear gradients applied. This means that our lines are invisible when\n // the dataset is flat (eg. [0, 0, 0, 0]).\n //\n // The hacky solution is to apply a very slight offset to the first point of\n // the dataset. As ugly as it is, it's the best solution we can find (there\n // are ways within the SVG spec of changing it, but not without causing\n // breaking changes).\n if (boundariesY.min === boundariesY.max) {\n normalizedData[0].y += 0.0001;\n }\n\n return normalizedData;\n}\n","import {\n checkForCollinearPoints,\n getDistanceBetween,\n moveTo,\n Point,\n} from './math.helpers';\n\nexport const buildLinearPath = (data: Point[]) =>\n data.reduce((path, point, index) => {\n // The very first instruction needs to be a \"move\".\n // The rest will be a \"line\".\n const isFirstInstruction = index === 0;\n const instruction = isFirstInstruction ? 'M' : 'L';\n\n return `${path}${instruction} ${point.x},${point.y}\\n`;\n }, '');\n\nexport function buildSmoothPath(data: Point[], radius: number): string {\n const [firstPoint, ...otherPoints] = data;\n\n return otherPoints.reduce((path, point, index) => {\n const next = otherPoints[index + 1];\n const prev = otherPoints[index - 1] || firstPoint;\n\n const isCollinear = next && checkForCollinearPoints(prev, point, next);\n\n if (!next || isCollinear) {\n // The very last line in the sequence can just be a regular line.\n return `${path}\\nL ${point.x},${point.y}`;\n }\n\n const distanceFromPrev = getDistanceBetween(prev, point);\n const distanceFromNext = getDistanceBetween(next, point);\n const threshold = Math.min(distanceFromPrev, distanceFromNext);\n\n const isTooCloseForRadius = threshold / 2 < radius;\n\n const radiusForPoint = isTooCloseForRadius ? threshold / 2 : radius;\n\n const before = moveTo(prev, point, radiusForPoint);\n const after = moveTo(next, point, radiusForPoint);\n\n return [\n path,\n `L ${before.x},${before.y}`,\n `S ${point.x},${point.y} ${after.x},${after.y}`,\n ].join('\\n');\n }, `M ${firstPoint.x},${firstPoint.y}`);\n}\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport { TrendComponent } from './trend.component';\n\n@NgModule({\n imports: [CommonModule],\n exports: [TrendComponent],\n declarations: [TrendComponent],\n})\nexport class TrendModule {\n}\n"]}
@@ -1,33 +0,0 @@
1
- import { checkForCollinearPoints, getDistanceBetween, moveTo, } from './math.helpers';
2
- export const buildLinearPath = (data) => data.reduce((path, point, index) => {
3
- // The very first instruction needs to be a "move".
4
- // The rest will be a "line".
5
- const isFirstInstruction = index === 0;
6
- const instruction = isFirstInstruction ? 'M' : 'L';
7
- return `${path}${instruction} ${point.x},${point.y}\n`;
8
- }, '');
9
- export function buildSmoothPath(data, radius) {
10
- const [firstPoint, ...otherPoints] = data;
11
- return otherPoints.reduce((path, point, index) => {
12
- const next = otherPoints[index + 1];
13
- const prev = otherPoints[index - 1] || firstPoint;
14
- const isCollinear = next && checkForCollinearPoints(prev, point, next);
15
- if (!next || isCollinear) {
16
- // The very last line in the sequence can just be a regular line.
17
- return `${path}\nL ${point.x},${point.y}`;
18
- }
19
- const distanceFromPrev = getDistanceBetween(prev, point);
20
- const distanceFromNext = getDistanceBetween(next, point);
21
- const threshold = Math.min(distanceFromPrev, distanceFromNext);
22
- const isTooCloseForRadius = threshold / 2 < radius;
23
- const radiusForPoint = isTooCloseForRadius ? threshold / 2 : radius;
24
- const before = moveTo(prev, point, radiusForPoint);
25
- const after = moveTo(next, point, radiusForPoint);
26
- return [
27
- path,
28
- `L ${before.x},${before.y}`,
29
- `S ${point.x},${point.y} ${after.x},${after.y}`,
30
- ].join('\n');
31
- }, `M ${firstPoint.x},${firstPoint.y}`);
32
- }
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRE9NLmhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vc3JjL2xpYi8iLCJzb3VyY2VzIjpbImhlbHBlcnMvRE9NLmhlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixrQkFBa0IsRUFDbEIsTUFBTSxHQUVQLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLENBQUMsSUFBYSxFQUFFLEVBQUUsQ0FDL0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7SUFDakMsbURBQW1EO0lBQ25ELDZCQUE2QjtJQUM3QixNQUFNLGtCQUFrQixHQUFHLEtBQUssS0FBSyxDQUFDLENBQUM7SUFDdkMsTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBRW5ELE9BQU8sR0FBRyxJQUFJLEdBQUcsV0FBVyxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ3pELENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUVULE1BQU0sVUFBVSxlQUFlLENBQUMsSUFBYSxFQUFFLE1BQWM7SUFDM0QsTUFBTSxDQUFDLFVBQVUsRUFBRSxHQUFHLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUUxQyxPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQy9DLE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDcEMsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUM7UUFFbEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxJQUFJLHVCQUF1QixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFdkUsSUFBSSxDQUFDLElBQUksSUFBSSxXQUFXLEVBQUU7WUFDeEIsaUVBQWlFO1lBQ2pFLE9BQU8sR0FBRyxJQUFJLE9BQU8sS0FBSyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDM0M7UUFFRCxNQUFNLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6RCxNQUFNLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFFL0QsTUFBTSxtQkFBbUIsR0FBRyxTQUFTLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQztRQUVuRCxNQUFNLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBRXBFLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBRWxELE9BQU87WUFDTCxJQUFJO1lBQ0osS0FBSyxNQUFNLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLEVBQUU7WUFDM0IsS0FBSyxLQUFLLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUFFO1NBQ2hELENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2YsQ0FBQyxFQUFFLEtBQUssVUFBVSxDQUFDLENBQUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgY2hlY2tGb3JDb2xsaW5lYXJQb2ludHMsXG4gIGdldERpc3RhbmNlQmV0d2VlbixcbiAgbW92ZVRvLFxuICBQb2ludCxcbn0gZnJvbSAnLi9tYXRoLmhlbHBlcnMnO1xuXG5leHBvcnQgY29uc3QgYnVpbGRMaW5lYXJQYXRoID0gKGRhdGE6IFBvaW50W10pID0+XG4gIGRhdGEucmVkdWNlKChwYXRoLCBwb2ludCwgaW5kZXgpID0+IHtcbiAgICAvLyBUaGUgdmVyeSBmaXJzdCBpbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIFwibW92ZVwiLlxuICAgIC8vIFRoZSByZXN0IHdpbGwgYmUgYSBcImxpbmVcIi5cbiAgICBjb25zdCBpc0ZpcnN0SW5zdHJ1Y3Rpb24gPSBpbmRleCA9PT0gMDtcbiAgICBjb25zdCBpbnN0cnVjdGlvbiA9IGlzRmlyc3RJbnN0cnVjdGlvbiA/ICdNJyA6ICdMJztcblxuICAgIHJldHVybiBgJHtwYXRofSR7aW5zdHJ1Y3Rpb259ICR7cG9pbnQueH0sJHtwb2ludC55fVxcbmA7XG4gIH0sICcnKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkU21vb3RoUGF0aChkYXRhOiBQb2ludFtdLCByYWRpdXM6IG51bWJlcik6IHN0cmluZyB7XG4gIGNvbnN0IFtmaXJzdFBvaW50LCAuLi5vdGhlclBvaW50c10gPSBkYXRhO1xuXG4gIHJldHVybiBvdGhlclBvaW50cy5yZWR1Y2UoKHBhdGgsIHBvaW50LCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IG5leHQgPSBvdGhlclBvaW50c1tpbmRleCArIDFdO1xuICAgIGNvbnN0IHByZXYgPSBvdGhlclBvaW50c1tpbmRleCAtIDFdIHx8IGZpcnN0UG9pbnQ7XG5cbiAgICBjb25zdCBpc0NvbGxpbmVhciA9IG5leHQgJiYgY2hlY2tGb3JDb2xsaW5lYXJQb2ludHMocHJldiwgcG9pbnQsIG5leHQpO1xuXG4gICAgaWYgKCFuZXh0IHx8IGlzQ29sbGluZWFyKSB7XG4gICAgICAvLyBUaGUgdmVyeSBsYXN0IGxpbmUgaW4gdGhlIHNlcXVlbmNlIGNhbiBqdXN0IGJlIGEgcmVndWxhciBsaW5lLlxuICAgICAgcmV0dXJuIGAke3BhdGh9XFxuTCAke3BvaW50Lnh9LCR7cG9pbnQueX1gO1xuICAgIH1cblxuICAgIGNvbnN0IGRpc3RhbmNlRnJvbVByZXYgPSBnZXREaXN0YW5jZUJldHdlZW4ocHJldiwgcG9pbnQpO1xuICAgIGNvbnN0IGRpc3RhbmNlRnJvbU5leHQgPSBnZXREaXN0YW5jZUJldHdlZW4obmV4dCwgcG9pbnQpO1xuICAgIGNvbnN0IHRocmVzaG9sZCA9IE1hdGgubWluKGRpc3RhbmNlRnJvbVByZXYsIGRpc3RhbmNlRnJvbU5leHQpO1xuXG4gICAgY29uc3QgaXNUb29DbG9zZUZvclJhZGl1cyA9IHRocmVzaG9sZCAvIDIgPCByYWRpdXM7XG5cbiAgICBjb25zdCByYWRpdXNGb3JQb2ludCA9IGlzVG9vQ2xvc2VGb3JSYWRpdXMgPyB0aHJlc2hvbGQgLyAyIDogcmFkaXVzO1xuXG4gICAgY29uc3QgYmVmb3JlID0gbW92ZVRvKHByZXYsIHBvaW50LCByYWRpdXNGb3JQb2ludCk7XG4gICAgY29uc3QgYWZ0ZXIgPSBtb3ZlVG8obmV4dCwgcG9pbnQsIHJhZGl1c0ZvclBvaW50KTtcblxuICAgIHJldHVybiBbXG4gICAgICBwYXRoLFxuICAgICAgYEwgJHtiZWZvcmUueH0sJHtiZWZvcmUueX1gLFxuICAgICAgYFMgJHtwb2ludC54fSwke3BvaW50Lnl9ICR7YWZ0ZXIueH0sJHthZnRlci55fWAsXG4gICAgXS5qb2luKCdcXG4nKTtcbiAgfSwgYE0gJHtmaXJzdFBvaW50Lnh9LCR7Zmlyc3RQb2ludC55fWApO1xufVxuIl19
@@ -1,68 +0,0 @@
1
- /* eslint-disable no-restricted-properties */
2
- /** normalize
3
- * This lets us translate a value from one scale to another.
4
- *
5
- * @param value - Our initial value to translate
6
- * @param min - the current minimum value possible
7
- * @param max - the current maximum value possible
8
- * @param scaleMin - the min value of the scale we're translating to
9
- * @param scaleMax - the max value of the scale we're translating to
10
- * @returns the value on its new scale
11
- */
12
- export function normalize(value, min, max, scaleMin = 0, scaleMax = 1) {
13
- // If the `min` and `max` are the same value, it means our dataset is flat.
14
- // For now, let's assume that flat data should be aligned to the bottom.
15
- if (min === max) {
16
- return scaleMin;
17
- }
18
- return scaleMin + (value - min) * (scaleMax - scaleMin) / (max - min);
19
- }
20
- /** moveTo
21
- * the coordinate that lies at a midpoint between 2 lines, based on the radius
22
- *
23
- * @param to - Our initial point
24
- * @param to.x - The x value of our initial point
25
- * @param to.y - The y value of our initial point
26
- * @param from - Our final point
27
- * @param from.x - The x value of our final point
28
- * @param from.y - The y value of our final point
29
- * @param radius - The distance away from the final point
30
- * @returns an object holding the x/y coordinates of the midpoint.
31
- */
32
- export function moveTo(to, from, radius) {
33
- const length = Math.sqrt((to.x - from.x) * (to.x - from.x) + (to.y - from.y) * (to.y - from.y));
34
- const unitVector = { x: (to.x - from.x) / length, y: (to.y - from.y) / length };
35
- return {
36
- x: from.x + unitVector.x * radius,
37
- y: from.y + unitVector.y * radius,
38
- };
39
- }
40
- /** getDistanceBetween
41
- * Simple formula derived from pythagoras to calculate the distance between
42
- * 2 points on a plane.
43
- *
44
- * @param p1 - Our initial point
45
- * @param p1.x - The x value of our initial point
46
- * @param p1.y - The y value of our initial point
47
- * @param p2 - Our final point
48
- * @param p2.x - The x value of our final point
49
- * @param p2.y - The y value of our final point
50
- * @returns the distance between the points.
51
- */
52
- export const getDistanceBetween = (p1, p2) => Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));
53
- /** checkForCollinearPoints
54
- * Figure out if the midpoint fits perfectly on a line between the two others.
55
- *
56
- * @param p1 - Our initial point
57
- * @param p1.x - The x value of our initial point
58
- * @param p1.y - The y value of our initial point
59
- * @param p2 - Our mid-point
60
- * @param p2.x - The x value of our mid-point
61
- * @param p2.y - The y value of our mid-point
62
- * @param p3 - Our final point
63
- * @param p3.x - The x value of our final point
64
- * @param p3.y - The y value of our final point
65
- * @returns whether or not p2 sits on the line between p1 and p3.
66
- */
67
- export const checkForCollinearPoints = (p1, p2, p3) => (p1.y - p2.y) * (p1.x - p3.x) === (p1.y - p3.y) * (p1.x - p2.x);
68
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0aC5oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uL3NyYy9saWIvIiwic291cmNlcyI6WyJoZWxwZXJzL21hdGguaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw2Q0FBNkM7QUFFN0M7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FDdkIsS0FBYSxFQUNiLEdBQVcsRUFDWCxHQUFXLEVBQ1gsUUFBUSxHQUFHLENBQUMsRUFDWixRQUFRLEdBQUcsQ0FBQztJQUVaLDJFQUEyRTtJQUMzRSx3RUFBd0U7SUFDeEUsSUFBSSxHQUFHLEtBQUssR0FBRyxFQUFFO1FBQ2YsT0FBTyxRQUFRLENBQUM7S0FDakI7SUFFRCxPQUFPLFFBQVEsR0FBRyxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztBQUN4RSxDQUFDO0FBT0Q7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLEVBQVMsRUFBRSxJQUFXLEVBQUUsTUFBYztJQUMzRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRyxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQztJQUVoRixPQUFPO1FBQ0wsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsR0FBRyxNQUFNO1FBQ2pDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLEdBQUcsTUFBTTtLQUNsQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxFQUFTLEVBQUUsRUFBUyxFQUFVLEVBQUUsQ0FDakUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRWpFOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLEVBQVMsRUFBRSxFQUFTLEVBQUUsRUFBUyxFQUFXLEVBQUUsQ0FDbEYsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXJlc3RyaWN0ZWQtcHJvcGVydGllcyAqL1xuXG4vKiogbm9ybWFsaXplXG4gKiBUaGlzIGxldHMgdXMgdHJhbnNsYXRlIGEgdmFsdWUgZnJvbSBvbmUgc2NhbGUgdG8gYW5vdGhlci5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBPdXIgaW5pdGlhbCB2YWx1ZSB0byB0cmFuc2xhdGVcbiAqIEBwYXJhbSBtaW4gLSB0aGUgY3VycmVudCBtaW5pbXVtIHZhbHVlIHBvc3NpYmxlXG4gKiBAcGFyYW0gbWF4IC0gdGhlIGN1cnJlbnQgbWF4aW11bSB2YWx1ZSBwb3NzaWJsZVxuICogQHBhcmFtIHNjYWxlTWluIC0gdGhlIG1pbiB2YWx1ZSBvZiB0aGUgc2NhbGUgd2UncmUgdHJhbnNsYXRpbmcgdG9cbiAqIEBwYXJhbSBzY2FsZU1heCAtIHRoZSBtYXggdmFsdWUgb2YgdGhlIHNjYWxlIHdlJ3JlIHRyYW5zbGF0aW5nIHRvXG4gKiBAcmV0dXJucyB0aGUgdmFsdWUgb24gaXRzIG5ldyBzY2FsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplKFxuICB2YWx1ZTogbnVtYmVyLFxuICBtaW46IG51bWJlcixcbiAgbWF4OiBudW1iZXIsXG4gIHNjYWxlTWluID0gMCxcbiAgc2NhbGVNYXggPSAxLFxuKTogbnVtYmVyIHtcbiAgLy8gSWYgdGhlIGBtaW5gIGFuZCBgbWF4YCBhcmUgdGhlIHNhbWUgdmFsdWUsIGl0IG1lYW5zIG91ciBkYXRhc2V0IGlzIGZsYXQuXG4gIC8vIEZvciBub3csIGxldCdzIGFzc3VtZSB0aGF0IGZsYXQgZGF0YSBzaG91bGQgYmUgYWxpZ25lZCB0byB0aGUgYm90dG9tLlxuICBpZiAobWluID09PSBtYXgpIHtcbiAgICByZXR1cm4gc2NhbGVNaW47XG4gIH1cblxuICByZXR1cm4gc2NhbGVNaW4gKyAodmFsdWUgLSBtaW4pICogKHNjYWxlTWF4IC0gc2NhbGVNaW4pIC8gKG1heCAtIG1pbik7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUG9pbnQge1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbn1cblxuLyoqIG1vdmVUb1xuICogdGhlIGNvb3JkaW5hdGUgdGhhdCBsaWVzIGF0IGEgbWlkcG9pbnQgYmV0d2VlbiAyIGxpbmVzLCBiYXNlZCBvbiB0aGUgcmFkaXVzXG4gKlxuICogQHBhcmFtIHRvIC0gT3VyIGluaXRpYWwgcG9pbnRcbiAqIEBwYXJhbSB0by54IC0gVGhlIHggdmFsdWUgb2Ygb3VyIGluaXRpYWwgcG9pbnRcbiAqIEBwYXJhbSB0by55IC0gVGhlIHkgdmFsdWUgb2Ygb3VyIGluaXRpYWwgcG9pbnRcbiAqIEBwYXJhbSBmcm9tIC0gT3VyIGZpbmFsIHBvaW50XG4gKiBAcGFyYW0gZnJvbS54IC0gVGhlIHggdmFsdWUgb2Ygb3VyIGZpbmFsIHBvaW50XG4gKiBAcGFyYW0gZnJvbS55IC0gVGhlIHkgdmFsdWUgb2Ygb3VyIGZpbmFsIHBvaW50XG4gKiBAcGFyYW0gcmFkaXVzIC0gVGhlIGRpc3RhbmNlIGF3YXkgZnJvbSB0aGUgZmluYWwgcG9pbnRcbiAqIEByZXR1cm5zIGFuIG9iamVjdCBob2xkaW5nIHRoZSB4L3kgY29vcmRpbmF0ZXMgb2YgdGhlIG1pZHBvaW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gbW92ZVRvKHRvOiBQb2ludCwgZnJvbTogUG9pbnQsIHJhZGl1czogbnVtYmVyKTogUG9pbnQge1xuICBjb25zdCBsZW5ndGggPSBNYXRoLnNxcnQoKHRvLnggLSBmcm9tLngpICogKHRvLnggLSBmcm9tLngpICsgKHRvLnkgLSBmcm9tLnkpICogKHRvLnkgLSBmcm9tLnkpKTtcbiAgY29uc3QgdW5pdFZlY3RvciA9IHsgeDogKHRvLnggLSBmcm9tLngpIC8gbGVuZ3RoLCB5OiAodG8ueSAtIGZyb20ueSkgLyBsZW5ndGggfTtcblxuICByZXR1cm4ge1xuICAgIHg6IGZyb20ueCArIHVuaXRWZWN0b3IueCAqIHJhZGl1cyxcbiAgICB5OiBmcm9tLnkgKyB1bml0VmVjdG9yLnkgKiByYWRpdXMsXG4gIH07XG59XG5cbi8qKiBnZXREaXN0YW5jZUJldHdlZW5cbiAqIFNpbXBsZSBmb3JtdWxhIGRlcml2ZWQgZnJvbSBweXRoYWdvcmFzIHRvIGNhbGN1bGF0ZSB0aGUgZGlzdGFuY2UgYmV0d2VlblxuICogMiBwb2ludHMgb24gYSBwbGFuZS5cbiAqXG4gKiBAcGFyYW0gcDEgLSBPdXIgaW5pdGlhbCBwb2ludFxuICogQHBhcmFtIHAxLnggLSBUaGUgeCB2YWx1ZSBvZiBvdXIgaW5pdGlhbCBwb2ludFxuICogQHBhcmFtIHAxLnkgLSBUaGUgeSB2YWx1ZSBvZiBvdXIgaW5pdGlhbCBwb2ludFxuICogQHBhcmFtIHAyIC0gT3VyIGZpbmFsIHBvaW50XG4gKiBAcGFyYW0gcDIueCAtIFRoZSB4IHZhbHVlIG9mIG91ciBmaW5hbCBwb2ludFxuICogQHBhcmFtIHAyLnkgLSBUaGUgeSB2YWx1ZSBvZiBvdXIgZmluYWwgcG9pbnRcbiAqIEByZXR1cm5zIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludHMuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXREaXN0YW5jZUJldHdlZW4gPSAocDE6IFBvaW50LCBwMjogUG9pbnQpOiBudW1iZXIgPT5cbiAgTWF0aC5zcXJ0KE1hdGgucG93KHAyLnggLSBwMS54LCAyKSArIE1hdGgucG93KHAyLnkgLSBwMS55LCAyKSk7XG5cbi8qKiBjaGVja0ZvckNvbGxpbmVhclBvaW50c1xuICogRmlndXJlIG91dCBpZiB0aGUgbWlkcG9pbnQgZml0cyBwZXJmZWN0bHkgb24gYSBsaW5lIGJldHdlZW4gdGhlIHR3byBvdGhlcnMuXG4gKlxuICogQHBhcmFtIHAxIC0gT3VyIGluaXRpYWwgcG9pbnRcbiAqIEBwYXJhbSBwMS54IC0gVGhlIHggdmFsdWUgb2Ygb3VyIGluaXRpYWwgcG9pbnRcbiAqIEBwYXJhbSBwMS55IC0gVGhlIHkgdmFsdWUgb2Ygb3VyIGluaXRpYWwgcG9pbnRcbiAqIEBwYXJhbSBwMiAtIE91ciBtaWQtcG9pbnRcbiAqIEBwYXJhbSBwMi54IC0gVGhlIHggdmFsdWUgb2Ygb3VyIG1pZC1wb2ludFxuICogQHBhcmFtIHAyLnkgLSBUaGUgeSB2YWx1ZSBvZiBvdXIgbWlkLXBvaW50XG4gKiBAcGFyYW0gcDMgLSBPdXIgZmluYWwgcG9pbnRcbiAqIEBwYXJhbSBwMy54IC0gVGhlIHggdmFsdWUgb2Ygb3VyIGZpbmFsIHBvaW50XG4gKiBAcGFyYW0gcDMueSAtIFRoZSB5IHZhbHVlIG9mIG91ciBmaW5hbCBwb2ludFxuICogQHJldHVybnMgd2hldGhlciBvciBub3QgcDIgc2l0cyBvbiB0aGUgbGluZSBiZXR3ZWVuIHAxIGFuZCBwMy5cbiAqL1xuZXhwb3J0IGNvbnN0IGNoZWNrRm9yQ29sbGluZWFyUG9pbnRzID0gKHAxOiBQb2ludCwgcDI6IFBvaW50LCBwMzogUG9pbnQpOiBib29sZWFuID0+XG4gIChwMS55IC0gcDIueSkgKiAocDEueCAtIHAzLngpID09PSAocDEueSAtIHAzLnkpICogKHAxLnggLSBwMi54KTtcbiJdfQ==
@@ -1,2 +0,0 @@
1
- export const generateId = () => Math.round(Math.random() * Math.pow(10, 16));
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlzYy5oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uL3NyYy9saWIvIiwic291cmNlcyI6WyJoZWxwZXJzL21pc2MuaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBnZW5lcmF0ZUlkID0gKCkgPT4gTWF0aC5yb3VuZChNYXRoLnJhbmRvbSgpICogTWF0aC5wb3coMTAsIDE2KSk7XG4iXX0=
@@ -1,171 +0,0 @@
1
- import { animate, keyframes, state, style, transition, trigger } from '@angular/animations';
2
- import { Component, Input, ViewChild } from '@angular/core';
3
- import { buildLinearPath, buildSmoothPath } from '../helpers/DOM.helpers';
4
- import { normalize } from '../helpers/math.helpers';
5
- import { generateId } from '../helpers/misc.helpers';
6
- import { normalizeDataset } from './trend.helpers';
7
- export class TrendComponent {
8
- constructor() {
9
- this.autoDraw = false;
10
- this.autoDrawDuration = 2000;
11
- this.autoDrawEasing = 'ease';
12
- this.padding = 8;
13
- this.radius = 10;
14
- this.stroke = 'black';
15
- this.strokeLinecap = '';
16
- this.strokeWidth = 1;
17
- this.gradient = [];
18
- this.svgHeight = '25%';
19
- this.svgWidth = '100%';
20
- this.animationState = '';
21
- this.id = generateId();
22
- this.gradientId = `ngx-trend-vertical-gradient-${this.id}`;
23
- }
24
- ngOnChanges() {
25
- // We need at least 2 points to draw a graph.
26
- if (!this.data || this.data.length < 2) {
27
- return;
28
- }
29
- // `data` can either be an array of numbers:
30
- // [1, 2, 3]
31
- // or, an array of objects containing a value:
32
- // [{ value: 1 }, { value: 2 }, { value: 3 }]
33
- //
34
- // For now, we're just going to convert the second form to the first.
35
- // Later on, if/when we support tooltips, we may adjust.
36
- const plainValues = this.data.map(point => {
37
- if (typeof point === 'number') {
38
- return point;
39
- }
40
- return point.value;
41
- });
42
- // Our viewbox needs to be in absolute units, so we'll default to 300x75
43
- // Our SVG can be a %, though; this is what makes it scalable.
44
- // By defaulting to percentages, the SVG will grow to fill its parent
45
- // container, preserving a 1/4 aspect ratio.
46
- const viewBoxWidth = this.width || 300;
47
- const viewBoxHeight = this.height || 75;
48
- this.svgWidth = this.width || '100%';
49
- this.svgHeight = this.height || '25%';
50
- this.viewBox = `0 0 ${viewBoxWidth} ${viewBoxHeight}`;
51
- const root = location.href.split(location.hash || '#')[0];
52
- this.pathStroke =
53
- this.gradient && this.gradient.length ? `url('${root}#${this.gradientId}')` : undefined;
54
- this.gradientTrimmed = this.gradient
55
- .slice()
56
- .reverse()
57
- .map((val, idx) => {
58
- return {
59
- idx,
60
- stopColor: val,
61
- offset: normalize(idx, 0, this.gradient.length - 1 || 1),
62
- };
63
- });
64
- const normalizedValues = normalizeDataset(plainValues, this.padding, viewBoxWidth - this.padding,
65
- // NOTE: Because SVGs are indexed from the top left, but most data is
66
- // indexed from the bottom left, we're inverting the Y min/max.
67
- viewBoxHeight - this.padding, this.padding);
68
- if (this.autoDraw && this.animationState !== 'active') {
69
- this.animationState = 'inactive';
70
- setTimeout(() => {
71
- this.lineLength = this.pathEl.nativeElement.getTotalLength();
72
- this.animationState = 'active';
73
- });
74
- }
75
- this.d = this.smooth
76
- ? buildSmoothPath(normalizedValues, this.radius)
77
- : buildLinearPath(normalizedValues);
78
- }
79
- }
80
- TrendComponent.decorators = [
81
- { type: Component, args: [{
82
- selector: 'ngx-trend',
83
- template: `
84
- <svg
85
- *ngIf="data && data.length >= 2"
86
- [attr.width]="svgWidth"
87
- [attr.height]="svgHeight"
88
- [attr.stroke]="stroke"
89
- [attr.stroke-width]="strokeWidth"
90
- [attr.stroke-linecap]="strokeLinecap"
91
- [attr.viewBox]="viewBox"
92
- [attr.preserveAspectRatio]="preserveAspectRatio"
93
- >
94
- <defs *ngIf="gradient && gradient.length">
95
- <linearGradient [attr.id]="gradientId" x1="0%" y1="0%" x2="0%" y2="100%">
96
- <stop
97
- *ngFor="let g of gradientTrimmed"
98
- [attr.key]="g.idx"
99
- [attr.offset]="g.offset"
100
- [attr.stop-color]="g.stopColor"
101
- />
102
- </linearGradient>
103
- </defs>
104
- <path
105
- fill="none"
106
- #pathEl
107
- [attr.stroke]="pathStroke"
108
- [attr.d]="d"
109
- [@pathAnimaiton]="{
110
- value: animationState,
111
- params: {
112
- autoDrawDuration: autoDrawDuration,
113
- autoDrawEasing: autoDrawEasing,
114
- lineLength: lineLength
115
- }
116
- }"
117
- />
118
- </svg>
119
- `,
120
- animations: [
121
- trigger('pathAnimaiton', [
122
- state('inactive', style({ display: 'none' })),
123
- transition('* => active', [
124
- style({ display: 'initial' }),
125
- // We do the animation using the dash array/offset trick
126
- // https://css-tricks.com/svg-line-animation-works/
127
- animate('{{ autoDrawDuration }}ms {{ autoDrawEasing }}', keyframes([
128
- style({
129
- 'stroke-dasharray': '{{ lineLength }}px',
130
- 'stroke-dashoffset': '{{ lineLength }}px',
131
- }),
132
- style({
133
- 'stroke-dasharray': '{{ lineLength }}px',
134
- 'stroke-dashoffset': 0,
135
- }),
136
- ])),
137
- // One unfortunate side-effect of the auto-draw is that the line is
138
- // actually 1 big dash, the same length as the line itself. If the
139
- // line length changes (eg. radius change, new data), that dash won't
140
- // be the same length anymore. We can fix that by removing those
141
- // properties once the auto-draw is completed.
142
- style({
143
- 'stroke-dashoffset': '',
144
- 'stroke-dasharray': '',
145
- }),
146
- ]),
147
- ]),
148
- ]
149
- },] }
150
- ];
151
- TrendComponent.ctorParameters = () => [];
152
- TrendComponent.propDecorators = {
153
- data: [{ type: Input }],
154
- smooth: [{ type: Input }],
155
- autoDraw: [{ type: Input }],
156
- autoDrawDuration: [{ type: Input }],
157
- autoDrawEasing: [{ type: Input }],
158
- width: [{ type: Input }],
159
- height: [{ type: Input }],
160
- padding: [{ type: Input }],
161
- radius: [{ type: Input }],
162
- stroke: [{ type: Input }],
163
- strokeLinecap: [{ type: Input }],
164
- strokeWidth: [{ type: Input }],
165
- gradient: [{ type: Input }],
166
- preserveAspectRatio: [{ type: Input }],
167
- svgHeight: [{ type: Input }],
168
- svgWidth: [{ type: Input }],
169
- pathEl: [{ type: ViewChild, args: ['pathEl',] }]
170
- };
171
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlbmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Ii4uLy4uL3NyYy9saWIvIiwic291cmNlcyI6WyJ0cmVuZC90cmVuZC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUYsT0FBTyxFQUFFLFNBQVMsRUFBYyxLQUFLLEVBQWEsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5GLE9BQU8sRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQTBFbkQsTUFBTSxPQUFPLGNBQWM7SUEyQnpCO1FBdkJTLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIscUJBQWdCLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLG1CQUFjLEdBQUcsTUFBTSxDQUFDO1FBR3hCLFlBQU8sR0FBRyxDQUFDLENBQUM7UUFDWixXQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ1osV0FBTSxHQUFHLE9BQU8sQ0FBQztRQUNqQixrQkFBYSxHQUFHLEVBQUUsQ0FBQztRQUNuQixnQkFBVyxHQUFHLENBQUMsQ0FBQztRQUNoQixhQUFRLEdBQWEsRUFBRSxDQUFDO1FBRXhCLGNBQVMsR0FBb0IsS0FBSyxDQUFDO1FBQ25DLGFBQVEsR0FBb0IsTUFBTSxDQUFDO1FBUTVDLG1CQUFjLEdBQUcsRUFBRSxDQUFDO1FBR2xCLElBQUksQ0FBQyxFQUFFLEdBQUcsVUFBVSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsR0FBRywrQkFBK0IsSUFBSSxDQUFD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LEtBQUs7d0JBQ0wsS0FBSzt1QkFDTCxLQUFLO3FCQUNMLFNBQVMsU0FBQyxRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYW5pbWF0ZSwga2V5ZnJhbWVzLCBzdGF0ZSwgc3R5bGUsIHRyYW5zaXRpb24sIHRyaWdnZXIgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5wdXQsIE9uQ2hhbmdlcywgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IGJ1aWxkTGluZWFyUGF0aCwgYnVpbGRTbW9vdGhQYXRoIH0gZnJvbSAnLi4vaGVscGVycy9ET00uaGVscGVycyc7XG5pbXBvcnQgeyBub3JtYWxpemUgfSBmcm9tICcuLi9oZWxwZXJzL21hdGguaGVscGVycyc7XG5pbXBvcnQgeyBnZW5lcmF0ZUlkIH0gZnJvbSAnLi4vaGVscGVycy9taXNjLmhlbHBlcnMnO1xuaW1wb3J0IHsgbm9ybWFsaXplRGF0YXNldCB9IGZyb20gJy4vdHJlbmQuaGVscGVycyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC10cmVuZCcsXG4gIHRlbXBsYXRlOiBgXG4gICAgPHN2Z1xuICAgICAgKm5nSWY9XCJkYXRhICYmIGRhdGEubGVuZ3RoID49IDJcIlxuICAgICAgW2F0dHIud2lkdGhdPVwic3ZnV2lkdGhcIlxuICAgICAgW2F0dHIuaGVpZ2h0XT1cInN2Z0hlaWdodFwiXG4gICAgICBbYXR0ci5zdHJva2VdPVwic3Ryb2tlXCJcbiAgICAgIFthdHRyLnN0cm9rZS13aWR0aF09XCJzdHJva2VXaWR0aFwiXG4gICAgICBbYXR0ci5zdHJva2UtbGluZWNhcF09XCJzdHJva2VMaW5lY2FwXCJcbiAgICAgIFthdHRyLnZpZXdCb3hdPVwidmlld0JveFwiXG4gICAgICBbYXR0ci5wcmVzZXJ2ZUFzcGVjdFJhdGlvXT1cInByZXNlcnZlQXNwZWN0UmF0aW9cIlxuICAgID5cbiAgICAgIDxkZWZzICpuZ0lmPVwiZ3JhZGllbnQgJiYgZ3JhZGllbnQubGVuZ3RoXCI+XG4gICAgICAgIDxsaW5lYXJHcmFkaWVudCBbYXR0ci5pZF09XCJncmFkaWVudElkXCIgeDE9XCIwJVwiIHkxPVwiMCVcIiB4Mj1cIjAlXCIgeTI9XCIxMDAlXCI+XG4gICAgICAgICAgPHN0b3BcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBnIG9mIGdyYWRpZW50VHJpbW1lZFwiXG4gICAgICAgICAgICBbYXR0ci5rZXldPVwiZy5pZHhcIlxuICAgICAgICAgICAgW2F0dHIub2Zmc2V0XT1cImcub2Zmc2V0XCJcbiAgICAgICAgICAgIFthdHRyLnN0b3AtY29sb3JdPVwiZy5zdG9wQ29sb3JcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvbGluZWFyR3JhZGllbnQ+XG4gICAgICA8L2RlZnM+XG4gICAgICA8cGF0aFxuICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICNwYXRoRWxcbiAgICAgICAgW2F0dHIuc3Ryb2tlXT1cInBhdGhTdHJva2VcIlxuICAgICAgICBbYXR0ci5kXT1cImRcIlxuICAgICAgICBbQHBhdGhBbmltYWl0b25dPVwie1xuICAgICAgICAgIHZhbHVlOiBhbmltYXRpb25TdGF0ZSxcbiAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgIGF1dG9EcmF3RHVyYXRpb246IGF1dG9EcmF3RHVyYXRpb24sXG4gICAgICAgICAgICBhdXRvRHJhd0Vhc2luZzogYXV0b0RyYXdFYXNpbmcsXG4gICAgICAgICAgICBsaW5lTGVuZ3RoOiBsaW5lTGVuZ3RoXG4gICAgICAgICAgfVxuICAgICAgICB9XCJcbiAgICAgIC8+XG4gICAgPC9zdmc+XG4gIGAsXG4gIGFuaW1hdGlvbnM6IFtcbiAgICB0cmlnZ2VyKCdwYXRoQW5pbWFpdG9uJywgW1xuICAgICAgc3RhdGUoJ2luYWN0aXZlJywgc3R5bGUoeyBkaXNwbGF5OiAnbm9uZScgfSkpLFxuICAgICAgdHJhbnNpdGlvbignKiA9PiBhY3RpdmUnLCBbXG4gICAgICAgIHN0eWxlKHsgZGlzcGxheTogJ2luaXRpYWwnIH0pLFxuICAgICAgICAvLyBXZSBkbyB0aGUgYW5pbWF0aW9uIHVzaW5nIHRoZSBkYXNoIGFycmF5L29mZnNldCB0cmlja1xuICAgICAgICAvLyBodHRwczovL2Nzcy10cmlja3MuY29tL3N2Zy1saW5lLWFuaW1hdGlvbi13b3Jrcy9cbiAgICAgICAgYW5pbWF0ZShcbiAgICAgICAgICAne3sgYXV0b0RyYXdEdXJhdGlvbiB9fW1zIHt7IGF1dG9EcmF3RWFzaW5nIH19JyxcbiAgICAgICAgICBrZXlmcmFtZXMoW1xuICAgICAgICAgICAgc3R5bGUoe1xuICAgICAgICAgICAgICAnc3Ryb2tlLWRhc2hhcnJheSc6ICd7eyBsaW5lTGVuZ3RoIH19cHgnLFxuICAgICAgICAgICAgICAnc3Ryb2tlLWRhc2hvZmZzZXQnOiAne3sgbGluZUxlbmd0aCB9fXB4JyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgc3R5bGUoe1xuICAgICAgICAgICAgICAnc3Ryb2tlLWRhc2hhcnJheSc6ICd7eyBsaW5lTGVuZ3RoIH19cHgnLFxuICAgICAgICAgICAgICAnc3Ryb2tlLWRhc2hvZmZzZXQnOiAwLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgXSksXG4gICAgICAgICksXG4gICAgICAgIC8vIE9uZSB1bmZvcnR1bmF0ZSBzaWRlLWVmZmVjdCBvZiB0aGUgYXV0by1kcmF3IGlzIHRoYXQgdGhlIGxpbmUgaXNcbiAgICAgICAgLy8gYWN0dWFsbHkgMSBiaWcgZGFzaCwgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBsaW5lIGl0c2VsZi4gSWYgdGhlXG4gICAgICAgIC8vIGxpbmUgbGVuZ3RoIGNoYW5nZXMgKGVnLiByYWRpdXMgY2hhbmdlLCBuZXcgZGF0YSksIHRoYXQgZGFzaCB3b24ndFxuICAgICAgICAvLyBiZSB0aGUgc2FtZSBsZW5ndGggYW55bW9yZS4gV2UgY2FuIGZpeCB0aGF0IGJ5IHJlbW92aW5nIHRob3NlXG4gICAgICAgIC8vIHByb3BlcnRpZXMgb25jZSB0aGUgYXV0by1kcmF3IGlzIGNvbXBsZXRlZC5cbiAgICAgICAgc3R5bGUoe1xuICAgICAgICAgICdzdHJva2UtZGFzaG9mZnNldCc6ICcnLFxuICAgICAgICAgICdzdHJva2UtZGFzaGFycmF5JzogJycsXG4gICAgICAgIH0pLFxuICAgICAgXSksXG4gICAgXSksXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIFRyZW5kQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgaWQ6IG51bWJlcjtcbiAgQElucHV0KCkgZGF0YT86IEFycmF5PChudW1iZXIgfCB7IHZhbHVlOiBudW1iZXIgfSk+O1xuICBASW5wdXQoKSBzbW9vdGg/OiBib29sZWFuO1xuICBASW5wdXQoKSBhdXRvRHJhdyA9IGZhbHNlO1xuICBASW5wdXQoKSBhdXRvRHJhd0R1cmF0aW9uID0gMjAwMDtcbiAgQElucHV0KCkgYXV0b0RyYXdFYXNpbmcgPSAnZWFzZSc7XG4gIEBJbnB1dCgpIHdpZHRoPzogbnVtYmVyO1xuICBASW5wdXQoKSBoZWlnaHQ/OiBudW1iZXI7XG4gIEBJbnB1dCgpIHBhZGRpbmcgPSA4O1xuICBASW5wdXQoKSByYWRpdXMgPSAxMDtcbiAgQElucHV0KCkgc3Ryb2tlID0gJ2JsYWNrJztcbiAgQElucHV0KCkgc3Ryb2tlTGluZWNhcCA9ICcnO1xuICBASW5wdXQoKSBzdHJva2VXaWR0aCA9IDE7XG4gIEBJbnB1dCgpIGdyYWRpZW50OiBzdHJpbmdbXSA9IFtdO1xuICBASW5wdXQoKSBwcmVzZXJ2ZUFzcGVjdFJhdGlvPzogc3RyaW5nO1xuICBASW5wdXQoKSBzdmdIZWlnaHQ6IHN0cmluZyB8IG51bWJlciA9ICcyNSUnO1xuICBASW5wdXQoKSBzdmdXaWR0aDogc3RyaW5nIHwgbnVtYmVyID0gJzEwMCUnO1xuICBAVmlld0NoaWxkKCdwYXRoRWwnKSBwYXRoRWwhOiBFbGVtZW50UmVmO1xuICBncmFkaWVudFRyaW1tZWQhOiBBcnJheTx7IGlkeDogbnVtYmVyOyBzdG9wQ29sb3I6IHN0cmluZzsgb2Zmc2V0OiBudW1iZXIgfT47XG4gIGQ6IGFueTtcbiAgdmlld0JveCE6IHN0cmluZztcbiAgcGF0aFN0cm9rZTogYW55O1xuICBncmFkaWVudElkOiBzdHJpbmc7XG4gIGxpbmVMZW5ndGghOiBudW1iZXI7XG4gIGFuaW1hdGlvblN0YXRlID0gJyc7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5pZCA9IGdlbmVyYXRlSWQoKTtcbiAgICB0aGlzLmdyYWRpZW50SWQgPSBgbmd4LXRyZW5kLXZlcnRpY2FsLWdyYWRpZW50LSR7dGhpcy5pZH1gO1xuICB9XG4gIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgIC8vIFdlIG5lZWQgYXQgbGVhc3QgMiBwb2ludHMgdG8gZHJhdyBhIGdyYXBoLlxuICAgIGlmICghdGhpcy5kYXRhIHx8IHRoaXMuZGF0YS5sZW5ndGggPCAyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gYGRhdGFgIGNhbiBlaXRoZXIgYmUgYW4gYXJyYXkgb2YgbnVtYmVyczpcbiAgICAvLyBbMSwgMiwgM11cbiAgICAvLyBvciwgYW4gYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIGEgdmFsdWU6XG4gICAgLy8gW3sgdmFsdWU6IDEgfSwgeyB2YWx1ZTogMiB9LCB7IHZhbHVlOiAzIH1dXG4gICAgLy9cbiAgICAvLyBGb3Igbm93LCB3ZSdyZSBqdXN0IGdvaW5nIHRvIGNvbnZlcnQgdGhlIHNlY29uZCBmb3JtIHRvIHRoZSBmaXJzdC5cbiAgICAvLyBMYXRlciBvbiwgaWYvd2hlbiB3ZSBzdXBwb3J0IHRvb2x0aXBzLCB3ZSBtYXkgYWRqdXN0LlxuICAgIGNvbnN0IHBsYWluVmFsdWVzID0gdGhpcy5kYXRhLm1hcChwb2ludCA9PiB7XG4gICAgICBpZiAodHlwZW9mIHBvaW50ID09PSAnbnVtYmVyJykge1xuICAgICAgICByZXR1cm4gcG9pbnQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gcG9pbnQudmFsdWU7XG4gICAgfSk7XG5cbiAgICAvLyBPdXIgdmlld2JveCBuZWVkcyB0byBiZSBpbiBhYnNvbHV0ZSB1bml0cywgc28gd2UnbGwgZGVmYXVsdCB0byAzMDB4NzVcbiAgICAvLyBPdXIgU1ZHIGNhbiBiZSBhICUsIHRob3VnaDsgdGhpcyBpcyB3aGF0IG1ha2VzIGl0IHNjYWxhYmxlLlxuICAgIC8vIEJ5IGRlZmF1bHRpbmcgdG8gcGVyY2VudGFnZXMsIHRoZSBTVkcgd2lsbCBncm93IHRvIGZpbGwgaXRzIHBhcmVudFxuICAgIC8vIGNvbnRhaW5lciwgcHJlc2VydmluZyBhIDEvNCBhc3BlY3QgcmF0aW8uXG4gICAgY29uc3Qgdmlld0JveFdpZHRoID0gdGhpcy53aWR0aCB8fCAzMDA7XG4gICAgY29uc3Qgdmlld0JveEhlaWdodCA9IHRoaXMuaGVpZ2h0IHx8IDc1O1xuICAgIHRoaXMuc3ZnV2lkdGggPSB0aGlzLndpZHRoIHx8ICcxMDAlJztcbiAgICB0aGlzLnN2Z0hlaWdodCA9IHRoaXMuaGVpZ2h0IHx8ICcyNSUnO1xuICAgIHRoaXMudmlld0JveCA9IGAwIDAgJHt2aWV3Qm94V2lkdGh9ICR7dmlld0JveEhlaWdodH1gO1xuICAgIGNvbnN0IHJvb3QgPSBsb2NhdGlvbi5ocmVmLnNwbGl0KGxvY2F0aW9uLmhhc2ggfHwgJyMnKVswXTtcbiAgICB0aGlzLnBhdGhTdHJva2UgPVxuICAgICAgdGhpcy5ncmFkaWVudCAmJiB0aGlzLmdyYWRpZW50Lmxlbmd0aCA/IGB1cmwoJyR7cm9vdH0jJHt0aGlzLmdyYWRpZW50SWR9JylgIDogdW5kZWZpbmVkO1xuXG4gICAgdGhpcy5ncmFkaWVudFRyaW1tZWQgPSB0aGlzLmdyYWRpZW50XG4gICAgICAuc2xpY2UoKVxuICAgICAgLnJldmVyc2UoKVxuICAgICAgLm1hcCgodmFsLCBpZHgpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZHgsXG4gICAgICAgICAgc3RvcENvbG9yOiB2YWwsXG4gICAgICAgICAgb2Zmc2V0OiBub3JtYWxpemUoaWR4LCAwLCB0aGlzLmdyYWRpZW50Lmxlbmd0aCAtIDEgfHwgMSksXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZXMgPSBub3JtYWxpemVEYXRhc2V0KFxuICAgICAgcGxhaW5WYWx1ZXMsXG4gICAgICB0aGlzLnBhZGRpbmcsXG4gICAgICB2aWV3Qm94V2lkdGggLSB0aGlzLnBhZGRpbmcsXG4gICAgICAvLyBOT1RFOiBCZWNhdXNlIFNWR3MgYXJlIGluZGV4ZWQgZnJvbSB0aGUgdG9wIGxlZnQsIGJ1dCBtb3N0IGRhdGEgaXNcbiAgICAgIC8vIGluZGV4ZWQgZnJvbSB0aGUgYm90dG9tIGxlZnQsIHdlJ3JlIGludmVydGluZyB0aGUgWSBtaW4vbWF4LlxuICAgICAgdmlld0JveEhlaWdodCAtIHRoaXMucGFkZGluZyxcbiAgICAgIHRoaXMucGFkZGluZyxcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuYXV0b0RyYXcgJiYgdGhpcy5hbmltYXRpb25TdGF0ZSAhPT0gJ2FjdGl2ZScpIHtcbiAgICAgIHRoaXMuYW5pbWF0aW9uU3RhdGUgPSAnaW5hY3RpdmUnO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMubGluZUxlbmd0aCA9IHRoaXMucGF0aEVsLm5hdGl2ZUVsZW1lbnQuZ2V0VG90YWxMZW5ndGgoKTtcbiAgICAgICAgdGhpcy5hbmltYXRpb25TdGF0ZSA9ICdhY3RpdmUnO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5kID0gdGhpcy5zbW9vdGhcbiAgICAgID8gYnVpbGRTbW9vdGhQYXRoKG5vcm1hbGl6ZWRWYWx1ZXMsIHRoaXMucmFkaXVzKVxuICAgICAgOiBidWlsZExpbmVhclBhdGgobm9ybWFsaXplZFZhbHVlcyk7XG4gIH1cbn1cbiJdfQ==
@@ -1,28 +0,0 @@
1
- import { normalize } from '../helpers/math.helpers';
2
- export function normalizeDataset(data, minX, maxX, minY, maxY) {
3
- // For the X axis, we want to normalize it based on its index in the array.
4
- // For the Y axis, we want to normalize it based on the element's value.
5
- //
6
- // X axis is easy: just evenly-space each item in the array.
7
- // For the Y axis, we first need to find the min and max of our array,
8
- // and then normalize those values between 0 and 1.
9
- const boundariesX = { min: 0, max: data.length - 1 };
10
- const boundariesY = { min: Math.min(...data), max: Math.max(...data) };
11
- const normalizedData = data.map((point, index) => ({
12
- x: normalize(index, boundariesX.min, boundariesX.max, minX, maxX),
13
- y: normalize(point, boundariesY.min, boundariesY.max, minY, maxY),
14
- }));
15
- // According to the SVG spec, paths with a height/width of `0` can't have
16
- // linear gradients applied. This means that our lines are invisible when
17
- // the dataset is flat (eg. [0, 0, 0, 0]).
18
- //
19
- // The hacky solution is to apply a very slight offset to the first point of
20
- // the dataset. As ugly as it is, it's the best solution we can find (there
21
- // are ways within the SVG spec of changing it, but not without causing
22
- // breaking changes).
23
- if (boundariesY.min === boundariesY.max) {
24
- normalizedData[0].y += 0.0001;
25
- }
26
- return normalizedData;
27
- }
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlbmQuaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi9zcmMvbGliLyIsInNvdXJjZXMiOlsidHJlbmQvdHJlbmQuaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFcEQsTUFBTSxVQUFVLGdCQUFnQixDQUM5QixJQUFjLEVBQ2QsSUFBWSxFQUNaLElBQVksRUFDWixJQUFZLEVBQ1osSUFBWTtJQUVaLDJFQUEyRTtJQUMzRSx3RUFBd0U7SUFDeEUsRUFBRTtJQUNGLDREQUE0RDtJQUM1RCxzRUFBc0U7SUFDdEUsbURBQW1EO0lBQ25ELE1BQU0sV0FBVyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztJQUNyRCxNQUFNLFdBQVcsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBRXZFLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELENBQUMsRUFBRSxTQUFTLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO1FBQ2pFLENBQUMsRUFBRSxTQUFTLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO0tBQ2xFLENBQUMsQ0FBQyxDQUFDO0lBRUoseUVBQXlFO0lBQ3pFLHlFQUF5RTtJQUN6RSwwQ0FBMEM7SUFDMUMsRUFBRTtJQUNGLDRFQUE0RTtJQUM1RSwyRUFBMkU7SUFDM0UsdUVBQXVFO0lBQ3ZFLHFCQUFxQjtJQUNyQixJQUFJLFdBQVcsQ0FBQyxHQUFHLEtBQUssV0FBVyxDQUFDLEdBQUcsRUFBRTtRQUN2QyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQztLQUMvQjtJQUVELE9BQU8sY0FBYyxDQUFDO0FBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBub3JtYWxpemUgfSBmcm9tICcuLi9oZWxwZXJzL21hdGguaGVscGVycyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVEYXRhc2V0KFxuICBkYXRhOiBudW1iZXJbXSxcbiAgbWluWDogbnVtYmVyLFxuICBtYXhYOiBudW1iZXIsXG4gIG1pblk6IG51bWJlcixcbiAgbWF4WTogbnVtYmVyLFxuKTogQXJyYXk8eyB4OiBudW1iZXI7IHk6IG51bWJlciB9PiB7XG4gIC8vIEZvciB0aGUgWCBheGlzLCB3ZSB3YW50IHRvIG5vcm1hbGl6ZSBpdCBiYXNlZCBvbiBpdHMgaW5kZXggaW4gdGhlIGFycmF5LlxuICAvLyBGb3IgdGhlIFkgYXhpcywgd2Ugd2FudCB0byBub3JtYWxpemUgaXQgYmFzZWQgb24gdGhlIGVsZW1lbnQncyB2YWx1ZS5cbiAgLy9cbiAgLy8gWCBheGlzIGlzIGVhc3k6IGp1c3QgZXZlbmx5LXNwYWNlIGVhY2ggaXRlbSBpbiB0aGUgYXJyYXkuXG4gIC8vIEZvciB0aGUgWSBheGlzLCB3ZSBmaXJzdCBuZWVkIHRvIGZpbmQgdGhlIG1pbiBhbmQgbWF4IG9mIG91ciBhcnJheSxcbiAgLy8gYW5kIHRoZW4gbm9ybWFsaXplIHRob3NlIHZhbHVlcyBiZXR3ZWVuIDAgYW5kIDEuXG4gIGNvbnN0IGJvdW5kYXJpZXNYID0geyBtaW46IDAsIG1heDogZGF0YS5sZW5ndGggLSAxIH07XG4gIGNvbnN0IGJvdW5kYXJpZXNZID0geyBtaW46IE1hdGgubWluKC4uLmRhdGEpLCBtYXg6IE1hdGgubWF4KC4uLmRhdGEpIH07XG5cbiAgY29uc3Qgbm9ybWFsaXplZERhdGEgPSBkYXRhLm1hcCgocG9pbnQsIGluZGV4KSA9PiAoe1xuICAgIHg6IG5vcm1hbGl6ZShpbmRleCwgYm91bmRhcmllc1gubWluLCBib3VuZGFyaWVzWC5tYXgsIG1pblgsIG1heFgpLFxuICAgIHk6IG5vcm1hbGl6ZShwb2ludCwgYm91bmRhcmllc1kubWluLCBib3VuZGFyaWVzWS5tYXgsIG1pblksIG1heFkpLFxuICB9KSk7XG5cbiAgLy8gQWNjb3JkaW5nIHRvIHRoZSBTVkcgc3BlYywgcGF0aHMgd2l0aCBhIGhlaWdodC93aWR0aCBvZiBgMGAgY2FuJ3QgaGF2ZVxuICAvLyBsaW5lYXIgZ3JhZGllbnRzIGFwcGxpZWQuIFRoaXMgbWVhbnMgdGhhdCBvdXIgbGluZXMgYXJlIGludmlzaWJsZSB3aGVuXG4gIC8vIHRoZSBkYXRhc2V0IGlzIGZsYXQgKGVnLiBbMCwgMCwgMCwgMF0pLlxuICAvL1xuICAvLyBUaGUgaGFja3kgc29sdXRpb24gaXMgdG8gYXBwbHkgYSB2ZXJ5IHNsaWdodCBvZmZzZXQgdG8gdGhlIGZpcnN0IHBvaW50IG9mXG4gIC8vIHRoZSBkYXRhc2V0LiBBcyB1Z2x5IGFzIGl0IGlzLCBpdCdzIHRoZSBiZXN0IHNvbHV0aW9uIHdlIGNhbiBmaW5kICh0aGVyZVxuICAvLyBhcmUgd2F5cyB3aXRoaW4gdGhlIFNWRyBzcGVjIG9mIGNoYW5naW5nIGl0LCBidXQgbm90IHdpdGhvdXQgY2F1c2luZ1xuICAvLyBicmVha2luZyBjaGFuZ2VzKS5cbiAgaWYgKGJvdW5kYXJpZXNZLm1pbiA9PT0gYm91bmRhcmllc1kubWF4KSB7XG4gICAgbm9ybWFsaXplZERhdGFbMF0ueSArPSAwLjAwMDE7XG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZERhdGE7XG59XG4iXX0=
@@ -1,13 +0,0 @@
1
- import { CommonModule } from '@angular/common';
2
- import { NgModule } from '@angular/core';
3
- import { TrendComponent } from './trend.component';
4
- export class TrendModule {
5
- }
6
- TrendModule.decorators = [
7
- { type: NgModule, args: [{
8
- imports: [CommonModule],
9
- exports: [TrendComponent],
10
- declarations: [TrendComponent],
11
- },] }
12
- ];
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJlbmQubW9kdWxlLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uL3NyYy9saWIvIiwic291cmNlcyI6WyJ0cmVuZC90cmVuZC5tb2R1bGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFekMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBT25ELE1BQU0sT0FBTyxXQUFXOzs7WUFMdkIsUUFBUSxTQUFDO2dCQUNSLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQztnQkFDdkIsT0FBTyxFQUFFLENBQUMsY0FBYyxDQUFDO2dCQUN6QixZQUFZLEVBQUUsQ0FBQyxjQUFjLENBQUM7YUFDL0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgVHJlbmRDb21wb25lbnQgfSBmcm9tICcuL3RyZW5kLmNvbXBvbmVudCc7XG5cbkBOZ01vZHVsZSh7XG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBleHBvcnRzOiBbVHJlbmRDb21wb25lbnRdLFxuICBkZWNsYXJhdGlvbnM6IFtUcmVuZENvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIFRyZW5kTW9kdWxlIHtcbn1cbiJdfQ==