ngx-trend
Version:
ngx-trend Angular component
1 lines • 23.1 kB
Source Map (JSON)
{"version":3,"file":"ngx-trend.mjs","sources":["../../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":["/* 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":[],"mappings":"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"}