@pacem/pacem-charts 1.0.4 → 1.0.5-bartels
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.
- package/dist/browser/pacem-charts.js +1 -1
- package/dist/browser/pacem-charts.min.js +1 -1
- package/dist/bundle/pacem-charts.min.mjs +1 -1
- package/dist/bundle/pacem-charts.mjs +1 -1
- package/dist/bundle/pacem-charts.mjs.map +1 -1
- package/dist/esm/column.js +1 -1
- package/dist/esm/generic.js +1 -1
- package/dist/esm/index-components-charts.js +1 -1
- package/dist/esm/index-components.js +3 -2
- package/dist/esm/index-iife.js +1 -1
- package/dist/esm/index.js +3 -2
- package/dist/esm/pie.js +1 -1
- package/dist/esm/types.js +1 -1
- package/package.json +1 -1
- package/typings/index.d.ts +3 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../esm/index-components.js", "../esm/index-components-charts.js", "../esm/types.js", "../esm/generic.js", "../esm/column.js", "../esm/pie.js"],
|
|
4
|
-
"sourcesContent": ["export * as Charts from './index-components-charts';\n", "export * from './types';\nexport * from './generic';\nexport * from './column';\nexport * from './pie';\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\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;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, Watch, PropertyConverters, P, PCSS, Components, CustomUIEvent, CustomElementUtils, Utils, Throttle, PropertyChangeEventName } from '@pacem/pacem-core';\n//namespace Pacem.Components.Charts {\nexport const MANAGED_EVENTS = ['keydown', 'keyup', 'click', 'dblclick', 'mouseover', 'mouseout', 'mouseenter', 'mouseleave', 'mousedown', 'mouseup', 'mousemove', 'contextmenu'];\n;\n//function logN(N, x) {\n// return Math.log10(x) / Math.log10(N);\n//}\nconst MSECS_PER_DAY = 1000 * 60 * 60 * 24;\nconst MAX_X_LABELS = 10;\nconst MAX_Y_LABELS = 10;\nconst SERIES_DATAITEM = 'pacem:chart-series:dataitem';\nconst SERIES_SERIES = 'pacem:chart-series:series';\nfunction getEvenlySpaced(items, type, min, max, formatOrLang, labels = MAX_X_LABELS) {\n const length = (type === 'number' || type === 'date') ? (max - min) : Math.max(1, items.length - 1);\n const gaps = labels - 1;\n var retval = [];\n var step = 1;\n for (var l = gaps; l > 1; l--) {\n if ((length % l) === 0) {\n step = length / l;\n break;\n }\n }\n if (step === 1 /* coprime number? */ && length > labels) {\n step = length;\n }\n const fnDate = typeof formatOrLang === 'function' ? formatOrLang : (step >= MSECS_PER_DAY ? ((d) => d.toLocaleDateString(formatOrLang)) : ((d) => d.toLocaleTimeString(formatOrLang)));\n const fnDateFirst = typeof formatOrLang === 'function' ? formatOrLang : (step < MSECS_PER_DAY ? ((d) => d.toLocaleString(formatOrLang)) : fnDate);\n const fnNum = typeof formatOrLang === 'function' ? formatOrLang : (n) => n.toLocaleString(formatOrLang);\n for (var j = 0; j <= length; j += step) {\n let label;\n switch (type) {\n case 'string':\n if (j >= items.length) {\n continue;\n }\n label = items[j].label;\n break;\n case 'number':\n label = fnNum(min + j);\n break;\n case 'date':\n let date = Utils.parseDate(min + j);\n let fn = (j == 0) ? fnDateFirst : fnDate;\n label = fn(date);\n break;\n default:\n throw 'Not supported.';\n }\n retval.push(label);\n }\n return retval;\n}\nfunction getRoundedBoundaries(min, max, desiredSteps) {\n desiredSteps ??= Math.min(bestGuessedDensity(min, max), MAX_Y_LABELS);\n const roughStep = (max - min) / desiredSteps;\n const magnitude = Math.pow(10, Math.floor(Math.log10(roughStep)));\n const step = [1, 2, 5, 10].map(n => n * magnitude).filter(s => s >= roughStep).reduce((min, s) => Math.min(min, s), Number.POSITIVE_INFINITY);\n return {\n min: Math.floor(min / step) * step,\n max: Math.ceil(max / step) * step,\n round: step\n };\n}\n// Deprecated\n//function getRoundedBoundariesOld(a0: number, a1: number, steps?: number) {\n// if (!(steps > 0)) {\n// steps = bestGuessedDensity(a0, a1);\n// }\n// const magn = logN(steps, a1 - a0),\n// exp = magn % 1 == 0 ? magn - 1 : magn,\n// rounder = Math.pow(steps, Math.floor(exp));\n// return {\n// min: Math.floor(a0 / rounder) * rounder,\n// max: Math.ceil(a1 / rounder) * rounder,\n// round: rounder\n// };\n//}\nfunction bestGuessedDensity(min, max) {\n const delta = max - min;\n if (!(delta > 0)) {\n return 2;\n }\n const oom = Math.floor(Math.log10(delta));\n const exp = Math.pow(10, -oom);\n // bring everything to a single digit format\n if (oom != 0) {\n return bestGuessedDensity(min * exp, max * exp);\n }\n const capFn = (n) => {\n const norm = Math.floor(Math.abs(n) * 10), limit = norm + 10 - (norm % 10);\n return limit.roundoff();\n };\n const b = capFn(delta);\n let a = 10;\n if (min !== 0) {\n a = capFn(Math.abs(max));\n }\n const ret = gcd(a, b);\n return ret === 1 ? b : Math.max(ret, 10 - ret);\n}\nfunction gcd(a, b) {\n if (a <= 0) {\n return b;\n }\n return gcd(b % a, a);\n}\n/** Custom UI event dispatched by chart elements when the user interacts with a rendered data point (e.g. `itemclick`, `itemmouseover`). */\nexport class ChartEvent extends CustomUIEvent {\n constructor(type, eventInit, originalEvent) {\n super(type, eventInit, originalEvent);\n }\n}\n/**\n * Represents a single data series to be plotted within a `<pacem-chart>`-like element.\n */\nlet PacemChartSeriesElement = class PacemChartSeriesElement extends Components.PacemItemElement {\n get values() {\n return this.datasource;\n }\n};\n__decorate([\n Watch({ emit: true, converter: PropertyConverters.Json })\n], PacemChartSeriesElement.prototype, \"datasource\", void 0);\n__decorate([\n Watch({ emit: true, converter: PropertyConverters.String })\n], PacemChartSeriesElement.prototype, \"label\", void 0);\n__decorate([\n Watch({ emit: true, converter: PropertyConverters.String })\n], PacemChartSeriesElement.prototype, \"color\", void 0);\n__decorate([\n Watch({ emit: true, converter: PropertyConverters.Boolean })\n], PacemChartSeriesElement.prototype, \"datapoints\", void 0);\n__decorate([\n Watch( /* to be set programmatically (internally) */)\n], PacemChartSeriesElement.prototype, \"_uiElements\", void 0);\nPacemChartSeriesElement = __decorate([\n CustomElement({ tagName: P + '-chart-series' })\n], PacemChartSeriesElement);\nexport { PacemChartSeriesElement };\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n/**\n * Abstract base class for chart elements hosting a collection of {@link PacemChartSeriesElement} items.\n * Provides axis/grid computation and SVG drawing helpers shared by concrete chart-series elements (e.g. `PacemChartElement`, `PacemColumnChartElement`).\n */\nexport class PacemSeriesChartElement extends Components.PacemItemsContainerElement {\n constructor() {\n super();\n this._itemPropertyChangedCallback = (evt) => {\n const propName = evt.detail.propertyName;\n if (propName === 'datasource'\n || propName === 'label'\n || propName === 'datapoints'\n || propName === 'cssClass'\n || propName === 'color') {\n this.draw();\n }\n };\n this._series = [];\n this._resizeHandler = (evt) => {\n this._size = evt.detail;\n this.draw();\n };\n // #endregion\n this._broadcastHandler = (e) => {\n /* Don't mess with the events:\n * keep the original (trusted) events with their well-known names\n * and provide a method to retrieve the 'ChartDataItem' based on the the eventTarget. */\n const element = e.currentTarget;\n const dataItem = CustomElementUtils.getAttachedPropertyValue(element, SERIES_DATAITEM);\n if (Utils.isNull(dataItem)) {\n return;\n }\n const chart = this, anchorPoint = chart.getAnchorPoint(element);\n const evt = new ChartEvent('item' + e.type, { detail: { dataItem, anchorPoint } }, e);\n const series = CustomElementUtils.getAttachedPropertyValue(element, SERIES_SERIES);\n if (series instanceof PacemChartSeriesElement) {\n series.dispatchEvent(evt);\n }\n chart.dispatchEvent(evt);\n };\n this._key = Utils.uniqueCode();\n }\n validate(item) {\n return item instanceof PacemChartSeriesElement;\n }\n register(item) {\n if (super.register(item)) {\n item.addEventListener(PropertyChangeEventName, this._itemPropertyChangedCallback, false);\n return true;\n }\n return false;\n }\n unregister(item) {\n if (super.unregister(item)) {\n item.removeEventListener(PropertyChangeEventName, this._itemPropertyChangedCallback, false);\n return true;\n }\n return false;\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (name === 'target') {\n if (this._div != old) {\n this._div && this._div.remove();\n }\n // reset\n this._div = null;\n this._body = null; // <- get checked on next draw\n const eold = old;\n if (eold) {\n eold.classList.remove(PCSS + '-chart-area');\n eold.innerHTML = '';\n }\n this._ensureResizer();\n this.draw();\n }\n else if (!first) {\n switch (name) {\n case 'items':\n this._databindAndDrawDebounced();\n break;\n case 'datasource':\n this._databind();\n // fall down to draw() call.\n case 'yAxisDensity':\n case 'xAxisDensity':\n case 'xAxisType':\n case 'yAxisMax':\n case 'xAxisPosition':\n case 'yAxisFormat':\n this.draw();\n break;\n }\n }\n }\n _databindAndDrawDebounced() {\n cancelAnimationFrame(this._handle);\n this._handle = requestAnimationFrame(() => {\n this._databind();\n this.draw();\n });\n }\n _databind() {\n this._datasource = Utils.isNullOrEmpty(this.datasource) ? this.items : this.datasource;\n }\n disconnectedCallback() {\n this._div && this._div.remove();\n const resizer = this._resizer;\n if (!Utils.isNull(resizer)) {\n resizer.removeEventListener(Components.ResizeEventName, this._resizeHandler, false);\n resizer.remove();\n this._resizer = null;\n }\n super.disconnectedCallback();\n }\n viewActivatedCallback() {\n super.viewActivatedCallback();\n this._ensureResizer();\n this._databind();\n this.draw();\n }\n _ensureResizer(target = this.target || this._div) {\n if (Utils.isNull(this._resizer)) {\n const shell = CustomElementUtils.findAncestorShell(this);\n const resizer = this._resizer = shell.appendChild(new Components.PacemResizeElement());\n resizer.addEventListener(Components.ResizeEventName, this._resizeHandler, false);\n }\n this._resizer.target = target;\n }\n // #region OO-scoped props\n get chartSize() {\n return this._size;\n }\n get chartSeries() {\n return this._series;\n }\n get chartBody() {\n return this._body;\n }\n get chartGrid() {\n return this._grid;\n }\n get chartMask() {\n return this._mask;\n }\n get chartKey() {\n return this._key;\n }\n get chartContainer() {\n return this._div;\n }\n assignUiBehaviors(ui, series, data, color) {\n const alreadyRegistered = !Utils.isNull(CustomElementUtils.getAttachedPropertyValue(ui, SERIES_DATAITEM));\n const item = Utils.extend({ series: series.label, color: color || series.color }, data);\n CustomElementUtils.setAttachedPropertyValue(ui, SERIES_DATAITEM, item);\n CustomElementUtils.setAttachedPropertyValue(ui, SERIES_SERIES, series);\n if (!alreadyRegistered) {\n MANAGED_EVENTS.forEach(type => {\n ui.addEventListener(type, this._broadcastHandler);\n });\n }\n }\n disposeUiBehaviors(ui) {\n CustomElementUtils.deleteAttachedPropertyValue(ui, SERIES_DATAITEM);\n CustomElementUtils.deleteAttachedPropertyValue(ui, SERIES_SERIES);\n MANAGED_EVENTS.forEach(type => {\n ui.removeEventListener(type, this._broadcastHandler);\n });\n }\n ensureChartContainer() {\n if (Utils.isNull(this._div)) {\n let div = this._div = this.target || document.createElement('div');\n div.classList.add(PCSS + '-chart-area');\n if (div != this.target) {\n this.parentElement.insertBefore(div, this);\n }\n }\n return this._div;\n }\n ensureChartBody(type, w, h) {\n if (Utils.isNull(this._body)) {\n let svg = this._body = document.createElementNS(SVG_NS, 'svg');\n svg.setAttribute('pacem', '');\n svg.setAttribute('class', PCSS + '-' + type + '-chart');\n svg.setAttribute('preserveAspectRatio', 'xMinYMax slice');\n const g = this._grid = document.createElementNS(SVG_NS, 'svg');\n g.setAttribute('pacem', '');\n g.setAttribute('class', 'chart-grid');\n // put mask on series\n let defs = document.createElementNS(SVG_NS, 'defs');\n let mask = this._mask = document.createElementNS(SVG_NS, 'mask');\n // black (hides)\n let rect = document.createElementNS(SVG_NS, 'rect');\n rect.setAttribute('x', '0');\n rect.setAttribute('y', '0');\n rect.setAttribute('width', '100%');\n rect.setAttribute('height', '100%');\n // white (shows)\n let rect0 = document.createElementNS(SVG_NS, 'rect');\n rect0.setAttribute('y', '0');\n rect0.setAttribute('width', '100%');\n rect0.setAttribute('fill', '#fff');\n mask.id = 'gnrc_mask_' + this._key;\n mask.appendChild(rect);\n mask.appendChild(rect0);\n // place mask on series so that lines won't be rendered outside the grid borders\n //g2.setAttribute('mask', 'url(#' + mask.id + ')');\n defs.appendChild(mask);\n svg.appendChild(defs);\n svg.appendChild(g);\n this._div.appendChild(svg);\n }\n return this._body;\n }\n chartDataItemToPoint(input, source) {\n switch (this.xAxisType || 'string') {\n case 'number':\n return { x: parseFloat(input.label), y: input.value };\n case 'date':\n return { x: Utils.parseDate(input.label).valueOf(), y: input.value };\n case 'string':\n return { x: source.findIndex(e => e.label == input.label), y: input.value };\n default:\n throw 'Not supported.';\n }\n }\n getVirtualGrid(items, minX, maxX, minY, maxY, xAxisType = this.xAxisType, steps, labels) {\n const rangeY = getRoundedBoundaries(minY, maxY, steps), stepY = rangeY.round;\n // fill y-axis array\n var y = [];\n for (let j = rangeY.min; j <= rangeY.max; j += stepY) {\n y.push(j.roundoff());\n }\n // fill x-axis array;\n let lang = Utils.lang(this);\n let format = null;\n const intl = this.xAxisFormat;\n if (!Utils.isNullOrEmpty(intl)) {\n switch (xAxisType) {\n case 'number':\n format = (n) => Intl.NumberFormat(lang, intl).format(n);\n break;\n case 'date':\n format = (n) => Intl.DateTimeFormat(lang, intl).format(Utils.parseDate(n));\n break;\n }\n }\n const x = getEvenlySpaced(items, xAxisType, minX, maxX, format ?? lang, labels);\n return { x, y };\n }\n wipeOut(series = this._series, startIndex = 0) {\n for (var j = series.length - 1; j >= startIndex; j--) {\n series[j].remove();\n }\n series.splice(startIndex);\n }\n buildLinearGradient(seriesIndex, invert = false) {\n const grad = document.createElementNS(SVG_NS, 'linearGradient');\n grad.id = this.chartKey + '_grad' + seriesIndex + (invert ? '_inverted' : '');\n if (invert) {\n Utils.addClass(grad, 'bottom-up');\n }\n grad.setAttribute('x1', '0%');\n grad.setAttribute('x2', '0%');\n grad.setAttribute('y1', '0%');\n grad.setAttribute('y2', '100%');\n grad.setAttribute('spreadMethod', 'pad');\n const stop1 = document.createElementNS(SVG_NS, 'stop');\n stop1.setAttribute('offset', '0%');\n const stop2 = document.createElementNS(SVG_NS, 'stop');\n stop2.setAttribute('offset', '100%');\n grad.appendChild(stop1);\n grad.appendChild(stop2);\n return grad;\n }\n setGradientColor(grad, color) {\n for (let j = 0; j < grad.children.length; j++) {\n const stop = grad.children.item(j);\n if (stop instanceof SVGStopElement) {\n stop.style.stopColor = color;\n }\n }\n }\n estimateYAxisLabelWidth(max) {\n const txt = this.formatYAxisLabel(max);\n return this.estimateLabelWidth(txt);\n }\n estimateLabelWidth(txt) {\n const grid = this._grid;\n if (Utils.isNull(grid)) {\n throw new Error('Unable to estimate label without an underlying grid available.');\n }\n const lbl = document.createElementNS(SVG_NS, 'text');\n lbl.textContent = txt;\n grid.appendChild(lbl);\n const size = Utils.offset(lbl);\n lbl.remove();\n return size.width;\n }\n formatYAxisLabel(y) {\n const intl = this.yAxisFormat;\n return Utils.isNullOrEmpty(intl) ? y.toString() : Intl.NumberFormat(Utils.lang(this), intl).format(y);\n }\n estimateXAxisLabelWidth(max) {\n const txt = this.formatXAxisLabel(max);\n return this.estimateLabelWidth(txt);\n }\n formatXAxisLabel(x) {\n const intl = this.xAxisFormat, lang = Utils.lang(this);\n switch (this.xAxisType) {\n case 'date':\n const date = Utils.Dates.parse(x);\n return Utils.isNullOrEmpty(intl) ? date.toLocaleString(lang) : Intl.DateTimeFormat(lang, intl).format(date);\n case 'number':\n const num = x;\n return Utils.isNullOrEmpty(intl) ? num.toLocaleString(lang) : Intl.NumberFormat(lang, intl).format(num);\n default:\n return x;\n }\n }\n draw() {\n this.drawSeries(this._datasource);\n }\n /**\n * Default implementation.\n * @param element\n */\n getAnchorPoint(element) {\n const rect = Utils.offset(element);\n return { x: rect.left + rect.width * .5, y: rect.top + rect.height * .5 };\n }\n}\n__decorate([\n Watch({ converter: PropertyConverters.Element })\n], PacemSeriesChartElement.prototype, \"target\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], PacemSeriesChartElement.prototype, \"xAxisType\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], PacemSeriesChartElement.prototype, \"xAxisPosition\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Json })\n], PacemSeriesChartElement.prototype, \"datasource\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemSeriesChartElement.prototype, \"yAxisDensity\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemSeriesChartElement.prototype, \"xAxisDensity\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemSeriesChartElement.prototype, \"yAxisMin\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemSeriesChartElement.prototype, \"yAxisMax\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Json })\n], PacemSeriesChartElement.prototype, \"yAxisFormat\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Json })\n], PacemSeriesChartElement.prototype, \"xAxisFormat\", void 0);\n__decorate([\n Throttle(true)\n], PacemSeriesChartElement.prototype, \"draw\", null);\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\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;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, Watch, PropertyConverters, P, PCSS, Utils, CustomElementUtils, Logging } from '@pacem/pacem-core';\nimport { PacemSeriesChartElement } from './types';\n//namespace Pacem.Components.Charts {\n/**\n * Returns the anchor points for a B\u00E9zier curve.\n * @param p The actual point.\n * @param p0 The previous point, if any.\n * @param p1 The next point, if any.\n */\nfunction getSplineCtrlPoints(p, p0, p1) {\n let c0 = p, c1 = p;\n const p0Null = Utils.isNull(p0), p1Null = Utils.isNull(p1);\n if (!(p0Null && p1Null)) {\n const portion = 3;\n let m0, m1;\n if (!p0Null) {\n m0 = (p.y - p0.y) / (p.x - p0.x);\n }\n if (!p1Null) {\n m1 = (p1.y - p.y) / (p1.x - p.x);\n }\n // average slope\n const m = ((m1 || (m0 || 0)) + (m0 || (m1 || 0))) / 2;\n const dx0 = p0Null ? 0 : (p.x - p0.x) / portion;\n const dx1 = p1Null ? 0 : (p1.x - p.x) / portion;\n c0 = { x: p.x - dx0, y: p.y - dx0 * m };\n c1 = { x: p.x + dx1, y: p.y + dx1 * m };\n }\n return { c0: c0, c1: c1 };\n}\nconst GET_VAL = CustomElementUtils.getAttachedPropertyValue;\nconst SET_VAL = CustomElementUtils.setAttachedPropertyValue;\nconst DEL_VAL = CustomElementUtils.deleteAttachedPropertyValue;\nconst PADDING_PIXELS = 24;\nconst SERIES_MAGNITUDE = 'pacem:chart-series:area';\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n/**\n * Renders a line, spline, area or spline-area chart out of one or more {@link PacemChartSeriesElement} series.\n */\nlet PacemChartElement = class PacemChartElement extends PacemSeriesChartElement {\n constructor() {\n super(...arguments);\n this.#hover = false;\n this._enterHandler = (evt) => {\n this.#hover = true;\n };\n this._leaveHandler = (evt) => {\n this.#hover = false;\n };\n this._moveHandler = (evt) => {\n if (!this.#hover) {\n return;\n }\n };\n this._chartFillSeries = [];\n }\n // TODO: implement\n // @Watch({ converter: PropertyConverters.String }) hoverMode: 'abscissa' | 'point'; // 'point' assumed as default\n _getVirtualGrid(items, minX, maxX, minY, maxY, xAxisType = this.xAxisType, steps, labels) {\n return super.getVirtualGrid(items, minX, maxX, minY, maxY, xAxisType, steps, labels);\n }\n _wipe(series = this.chartSeries, startIndex = 0) {\n super.wipeOut(series, startIndex);\n }\n viewActivatedCallback() {\n super.viewActivatedCallback();\n this._setupBehavior();\n }\n disconnectedCallback() {\n this._dismantleBehavior();\n super.disconnectedCallback();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'type':\n case 'aspectRatio':\n this.draw();\n break;\n }\n }\n _setupBehavior() {\n this.addEventListener('mouseenter', this._enterHandler, false);\n this.addEventListener('mouseleave', this._enterHandler, false);\n this.addEventListener('mousemove', this._moveHandler, false);\n }\n _dismantleBehavior() {\n this.removeEventListener('mouseenter', this._enterHandler, false);\n this.removeEventListener('mouseleave', this._leaveHandler, false);\n this.removeEventListener('mousemove', this._moveHandler, false);\n }\n #hover;\n _buildLinearGradient(seriesIndex) {\n return super.buildLinearGradient(seriesIndex);\n }\n _setGradientColor(grad, color) {\n super.setGradientColor(grad, color);\n }\n drawSeries(datasource) {\n if (!this.isReady || Utils.isNull(this.chartSize)) {\n return;\n }\n this.ensureChartContainer();\n const type = this.type || 'line';\n const padding = PADDING_PIXELS;\n // resize all\n var size = this.chartSize;\n if (size.height <= padding || size.width <= padding) {\n return;\n }\n // items && labels?\n if (Utils.isNullOrEmpty(datasource) || datasource.every(i => Utils.isNullOrEmpty(i.values))) {\n this._wipe();\n return;\n }\n const body = this.ensureChartBody('line', size.width, size.height);\n // from now on, drawing...\n this.log(Logging.LogLevel.Debug, `Drawing ${type} chart.`);\n // #region computations\n const xAxisType = this.xAxisType || 'string';\n let minY = this.yAxisMin ?? Number.NaN, maxY = this.yAxisMax ?? Number.NaN, minX = Number.NaN, maxX = Number.NaN;\n let stretch = 1;\n // individuate the min/max x & y in order correctly apply aspect ratio...\n for (let series of datasource) {\n let data = series.values;\n if (data && data.length) {\n let j = 0;\n for (let item of data) {\n let pt = this.chartDataItemToPoint(item, data);\n if (Utils.isNull(this.yAxisMin)) {\n minY = isNaN(minY) ? pt.y : Math.min(minY, pt.y);\n }\n if (Utils.isNull(this.yAxisMax)) {\n maxY = isNaN(maxY) ? pt.y : Math.max(maxY, pt.y);\n }\n if (j === 0)\n minX = isNaN(minX) ? pt.x : Math.min(minX, pt.x);\n else if (j === data.length - 1)\n maxX = isNaN(maxX) ? pt.x : Math.max(maxX, pt.x);\n j++;\n }\n }\n }\n /** virtual grid made of x- and y-axis labels */\n const withValues = datasource.find(i => !Utils.isNullOrEmpty(i.values));\n const grid = this._getVirtualGrid(withValues.values, minX, maxX, minY, maxY, xAxisType, this.yAxisDensity, this.xAxisDensity);\n const topGrid = grid.y[grid.y.length - 1], bottomGrid = grid.y[0];\n if (topGrid === bottomGrid)\n return;\n // estimate y-axis max width\n const halfPad = padding * .5;\n const maxYLabelLength = grid.y.reduce((max, i) => Math.max(max, this.estimateYAxisLabelWidth(i) + halfPad), padding);\n const maxXLabelHalfLength = grid.x.reduce((max, i) => Math.max(max, this.estimateXAxisLabelWidth(i)), padding) * .5;\n const paddingYAxis = Math.max(maxXLabelHalfLength, maxYLabelLength), paddingYAxisEnd = maxXLabelHalfLength; // Math.max(padding, this.estimateXAxisLabelWidth(minX) * .5 + PADDING_PIXELS);\n /** width of the WHOLE series dedicated area */\n const seriesWidth = size.width - paddingYAxis - paddingYAxisEnd;\n /** height of the WHOLE series dedicated area */\n const gridHeight = (size.height - 2 * padding);\n const seriesHeight = gridHeight * (1 - (topGrid - bottomGrid - (maxY - minY)) / (topGrid - bottomGrid));\n const seriesY = gridHeight * (topGrid - maxY) / (topGrid - bottomGrid);\n // const seriesY2 = gridHeight * (minY - bottomGrid) / (topGrid - bottomGrid);\n // if not a `graph`\n if (xAxisType !== 'number' || (this.aspectRatio !== 'monometric' && this.aspectRatio !== 'logaritmic')) {\n // consider padding\n stretch = seriesWidth / seriesHeight;\n body.setAttribute('height', size.height.toString());\n body.setAttribute('width', size.width.toString());\n }\n body.setAttribute('viewBox', `0 0 ${size.width} ${size.height}`);\n // #endregion\n // #region render series\n let iter = 0;\n // normalize\n const spanX = maxX - minX, spanY = maxY - minY;\n const normX = 100 * stretch / spanX, normY = 100 / spanY;\n const normPadding = 100 * padding / seriesHeight;\n const buildPoint = (it, series) => {\n let p = this.chartDataItemToPoint(it, series);\n //pt.x *= normX;\n p.y *= normY;\n // Limit as much as possible the magnitude of a number inclued in the svg.\n // Big numbers \"overflow the renderer\".\n p.x = (p.x - minX) * normX;\n //pt.y = (pt.y - minY) * normY;\n return p;\n };\n const chartSeries = this.chartSeries;\n const chartFillSeries = this._chartFillSeries;\n const chartGrid = this.chartGrid;\n const splineHere = type === 'spline' || type === 'splinearea';\n for (let series of datasource) {\n // does the series svg exist?\n let svg, svgFill;\n let grad;\n if (chartSeries.length > iter) {\n svg = chartSeries[iter];\n svgFill = chartFillSeries[iter];\n grad = svgFill.firstElementChild.firstElementChild;\n }\n else {\n svg = document.createElementNS(SVG_NS, 'svg');\n svg.setAttribute('pacem', '');\n body.appendChild(svg);\n svgFill = document.createElementNS(SVG_NS, 'svg');\n svgFill.setAttribute('pacem', '');\n body.insertBefore(svgFill, body.children.item(iter + /* <defs> should remain the very first child and 'grid' the very second */ 2));\n // 1st child - defs (gradient)\n const defs = document.createElementNS(SVG_NS, 'defs');\n defs.appendChild(grad = this._buildLinearGradient(iter));\n svgFill.appendChild(defs);\n // 2nd child - fill path\n svgFill.appendChild(document.createElementNS(SVG_NS, 'path'));\n chartFillSeries.push(svgFill);\n // 1st child stroke path\n svg.appendChild(document.createElementNS(SVG_NS, 'path'));\n // 2nd + nth+1 child will be point circles\n chartSeries.push(svg);\n }\n // series positioning:\n /*\n --------------------------------------\n | |--------------------------------|\n |pad| series here |\n | |--------------------------------|\n --------------------------------------\n | | pad |\n --------------------------------------\n */\n let className = 'chart-series';\n const fill = type === 'area' || type === 'splinearea';\n if (!Utils.isNullOrEmpty(series.className)) {\n className += ' ' + series.className;\n }\n [svg, svgFill].forEach(s => {\n s.setAttribute('class', className);\n s.setAttribute('x', paddingYAxis.toString());\n s.setAttribute('y', seriesY.toString());\n s.setAttribute('width', seriesWidth.toString());\n s.setAttribute('height', (seriesHeight + 2 * padding).toString());\n });\n Utils.addClass(svgFill, PCSS + '-inert');\n // pick path as single child element for the series.\n let pathFill = svgFill.children.item(1);\n let path = svg.firstElementChild;\n path.style.stroke = series.color;\n pathFill.style.stroke =\n path.style.fill = 'none';\n this._setGradientColor(grad, series.color);\n pathFill.style.fill = `url(#${grad.id})`;\n pathFill.style.display = fill ? '' : 'none';\n let d = '';\n let data = series.values;\n if (data && data.length) {\n const addInteractivePoint = (center, j, series, dataItem, color) => {\n const ndx = j + /* count the <path> child */ 1;\n let circle;\n if (svg.children.length > ndx) {\n circle = svg.children.item(ndx);\n }\n else {\n circle = document.createElementNS(SVG_NS, 'line');\n circle.setAttribute('class', 'circle');\n svg.appendChild(circle);\n }\n const x1 = center.x.toString(), y1 = (-center.y).toString();\n circle.setAttribute('x1', x1);\n circle.setAttribute('y1', y1);\n circle.setAttribute('x2', x1);\n circle.setAttribute('y2', y1);\n circle.style.stroke = color;\n this.assignUiBehaviors(circle, series, dataItem, color);\n };\n const wipeExceedingPoints = () => {\n const remaining = series.datapoints ? (data.length + 1) : 1;\n for (let k = svg.children.length - 1; k >= remaining; k--) {\n var circle = svg.children.item(k);\n this.disposeUiBehaviors(circle);\n circle.remove();\n }\n };\n if (splineHere) {\n // #region SPLINE\n let pt0, pt, c0;\n for (let j = 0; j < data.length; j++) {\n const item = data[j];\n if (isNaN(item.value)) {\n continue;\n }\n if (!pt) {\n pt = buildPoint(item, data);\n }\n let pt1;\n if (splineHere && j < (data.length - 1)) {\n pt1 = buildPoint(data[j + 1], data);\n }\n // accumulate `area` for sorting\n let areaSoFar = GET_VAL(series, SERIES_MAGNITUDE, 0);\n areaSoFar += item.value;\n SET_VAL(series, SERIES_MAGNITUDE, areaSoFar);\n var c = getSplineCtrlPoints(pt, pt0, pt1);\n d += Utils.isNullOrEmpty(d) ? `M${pt.x},${-pt.y} ` : `C${c0.x},${-c0.y} ${c.c0.x},${-c.c0.y} ${pt.x},${-pt.y} `;\n if (series.datapoints) {\n addInteractivePoint(pt, j, series, item, series.color);\n }\n // step next\n pt0 = pt;\n pt = pt1, c0 = c.c1;\n }\n // #endregion\n }\n else {\n // #region LINE\n let j = 0;\n for (let item of data) {\n if (isNaN(item.value)) {\n continue;\n }\n const pt = buildPoint(item, data);\n // accumulate `area` for sorting\n let areaSoFar = GET_VAL(series, SERIES_MAGNITUDE, 0);\n areaSoFar += item.value;\n SET_VAL(series, SERIES_MAGNITUDE, areaSoFar);\n d += Utils.isNullOrEmpty(d) ? `M${pt.x},${-pt.y} ` : `L${pt.x},${-pt.y} `;\n if (series.datapoints) {\n addInteractivePoint(pt, j, series, item, series.color);\n }\n j++;\n }\n // #endregion\n }\n wipeExceedingPoints();\n }\n path.setAttribute('d', d);\n pathFill.setAttribute('d', d + `V${(-minY * normY)} H0 Z`);\n // tick\n iter++;\n }\n // remove exceeding series\n this._wipe(chartFillSeries, iter);\n this._wipe(chartSeries, iter);\n const w0 = 100 * stretch, h0 = 100 + 2 * normPadding, x0 = 0, //minX * normX,\n y0 = maxY * normY + normPadding;\n const svbox = `${x0} ${-y0} ${w0} ${h0}`;\n for (var svg of chartSeries.concat(chartFillSeries)) {\n svg.setAttribute('viewBox', svbox);\n }\n const chartMask = this.chartMask;\n let mask = chartMask.children.item(1);\n mask.setAttribute('x', x0.toString());\n mask.setAttribute('height', (size.height - padding).toString());\n // #endregion\n // #region grid\n chartGrid.setAttribute('viewBox', `0 0 ${size.width} ${size.height}`);\n if (grid.x.length <= 1 || grid.y.length <= 1) {\n for (let j = chartGrid.children.length - 1; j >= 0; j--) {\n chartGrid.children.item(j).remove();\n }\n return;\n }\n let pgrid;\n if (chartGrid.children.length > 0) {\n pgrid = chartGrid.children.item(0);\n }\n else {\n pgrid = document.createElementNS(SVG_NS, 'path');\n chartGrid.appendChild(pgrid);\n }\n const tick = padding * .25;\n let lblCounter = 0;\n let ensureLabel = (index, x, y, txt) => {\n const ndx = index + /* <path> is the first child element */ 1;\n let lbl;\n if (chartGrid.children.length <= ndx) {\n lbl = document.createElementNS(SVG_NS, 'text');\n chartGrid.appendChild(lbl);\n }\n else {\n lbl = chartGrid.children.item(ndx);\n }\n lbl.textContent = txt;\n lbl.setAttribute('x', x.toString());\n lbl.setAttribute('y', y.toString());\n return lbl;\n };\n let dgrid = `M${paddingYAxis},${padding} v${gridHeight}`; //H${w}\n // x\n let j = 0;\n const xincr = seriesWidth / (grid.x.length - 1), yincr = gridHeight / (grid.y.length - 1);\n if (this.xAxisPosition !== 'none') {\n for (var x of grid.x) {\n const xcoord = paddingYAxis + j * xincr;\n if (this.xAxisPosition === 'top') {\n dgrid += ` M${xcoord},${padding} v${-tick}`;\n let lbl = ensureLabel(lblCounter++, xcoord, 0, x);\n lbl.setAttribute('text-anchor', 'middle');\n lbl.setAttribute('alignment-baseline', 'hanging');\n }\n else {\n let ycoord = gridHeight + padding;\n dgrid += ` M${xcoord},${ycoord} v${tick}`;\n ensureLabel(lblCounter++, xcoord, ycoord + padding, x).setAttribute('text-anchor', 'middle');\n }\n j++;\n }\n }\n // y\n j = 0;\n for (var y of grid.y) {\n const ycoord = gridHeight + padding - j * yincr, xcoord = paddingYAxis - tick;\n dgrid += ` M${xcoord},${ycoord} H${(seriesWidth + paddingYAxis)}`;\n let txt = this.formatYAxisLabel(y);\n ensureLabel(lblCounter++, xcoord - tick, ycoord, txt).setAttribute('text-anchor', 'end');\n j++;\n }\n pgrid.setAttribute('d', dgrid);\n // exceeding labels?\n for (let j = chartGrid.children.length - 1; j > lblCounter; j--) {\n chartGrid.children.item(j).remove();\n }\n // #endregion\n // #region abscissa cursor\n // #endregion\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], PacemChartElement.prototype, \"type\", void 0);\n__decorate([\n Watch({ converter: PropertyConverters.String })\n], PacemChartElement.prototype, \"aspectRatio\", void 0);\nPacemChartElement = __decorate([\n CustomElement({ tagName: P + '-chart' })\n], PacemChartElement);\nexport { PacemChartElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\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;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, Watch, PropertyConverters, P, Utils, Logging } from '@pacem/pacem-core';\nimport { PacemSeriesChartElement } from './types';\n//namespace Pacem.Components.Charts {\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\nconst PADDING_PIXELS = 24;\n/**\n * Renders a clustered or stacked column (bar) chart out of one or more {@link PacemChartSeriesElement} series.\n */\nlet PacemColumnChartElement = class PacemColumnChartElement extends PacemSeriesChartElement {\n constructor() {\n super(...arguments);\n /** Set a value between 0 and 1, for the columns' stack/cluster horizontal size (percentage of the available space). */\n this.groupWidth = .0;\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (name === 'type' || name === 'groupWidth') {\n this.draw();\n }\n }\n _safen(w = this.groupWidth) {\n return Math.min(1, Math.max(w || .75, 0));\n }\n drawSeries(datasource) {\n if (!this.isReady || Utils.isNull(this.chartSize)) {\n return;\n }\n const div = this.ensureChartContainer();\n const type = this.type || 'cluster';\n const padding = PADDING_PIXELS;\n // resize all\n var size = this.chartSize;\n if (size.height <= padding || size.width <= padding) {\n return;\n }\n // items && labels?\n if (Utils.isNullOrEmpty(datasource) || datasource.every(i => Utils.isNullOrEmpty(i.values))) {\n this.wipeOut();\n return;\n }\n const body = this.ensureChartBody('column', size.width, size.height);\n // from now on, drawing...\n this.log(Logging.LogLevel.Debug, `Drawing ${type} chart.`);\n // #region computations\n const xAxisType = this.xAxisType || 'string';\n let minY = this.yAxisMin ?? 0, maxY = this.yAxisMax ?? 0, minX = 0, maxX = 0, maxCount = 0;\n let stretch = 1;\n const accumulator = { negative: [], positive: [] };\n // individuate the min/max x & y in order correctly apply aspect ratio...\n for (let series of datasource) {\n let data = series.values;\n if (!Utils.isNullOrEmpty(data)) {\n let j = 0;\n for (let item of data) {\n accumulator.positive[j] = accumulator.positive[j] || 0;\n accumulator.negative[j] = accumulator.negative[j] || 0;\n let pt = this.chartDataItemToPoint(item, data);\n if (Utils.isNull(this.yAxisMin)) {\n minY = Math.min(minY, pt.y);\n }\n if (Utils.isNull(this.yAxisMax)) {\n maxY = Math.max(maxY, pt.y);\n }\n minX = Math.min(minX, pt.x);\n maxX = Math.max(maxX, pt.x);\n if (pt.y > 0) {\n accumulator.positive[j] += pt.y;\n }\n else if (pt.y < 0) {\n accumulator.negative[j] += pt.y;\n }\n j++;\n }\n maxCount = Math.max(maxCount, data.length);\n }\n }\n const stacked = type === 'stack';\n if (stacked) {\n if (Utils.isNull(this.yAxisMin))\n minY = Math.min.apply(null, accumulator.negative);\n if (Utils.isNull(this.yAxisMax))\n maxY = Math.max.apply(null, accumulator.positive);\n }\n if (maxX === 0 && maxX === minX) {\n maxX = 1;\n }\n // add \"1 slot\" (half at the beginning and half after the end)\n const slot = (maxX - minX) / maxCount, halfSlot = slot * .5, \n // the following are usefule during the very rendering\n availSlot = slot * this._safen(this.groupWidth), halfAvailSlot = availSlot * .5;\n /** virtual grid made of x- and y-axis labels */\n const withValues = datasource.find(i => !Utils.isNullOrEmpty(i.values));\n const grid = this.getVirtualGrid(withValues.values, minX - halfSlot, maxX + halfSlot, minY, maxY, xAxisType, this.yAxisDensity, this.xAxisDensity);\n const topGrid = grid.y[grid.y.length - 1], bottomGrid = grid.y[0];\n if (topGrid === bottomGrid) {\n return;\n }\n // estimate y-axis max width\n const halfPad = PADDING_PIXELS * .5;\n const paddingYAxis = grid.y.reduce((max, i) => Math.max(max, this.estimateYAxisLabelWidth(i) + halfPad), padding);\n /** width of the WHOLE series dedicated area */\n const seriesWidth = size.width - paddingYAxis - padding;\n /** height of the WHOLE series dedicated area */\n const gridHeight = (size.height - 2 * padding);\n const seriesHeight = gridHeight * (1 - (topGrid - bottomGrid - (maxY - minY)) / (topGrid - bottomGrid));\n const seriesY = gridHeight * (topGrid - maxY) / (topGrid - bottomGrid);\n // consider padding\n stretch = seriesWidth / seriesHeight;\n body.setAttribute('height', size.height.toString());\n body.setAttribute('width', size.width.toString());\n body.setAttribute('viewBox', `0 0 ${size.width} ${size.height}`);\n // #endregion\n // #region render series\n let iter = 0;\n // normalize\n const spanX = maxX - minX, spanY = maxY - minY;\n const normX = 100 * stretch / spanX, normY = 100 / spanY;\n const normPadding = 100 * padding / seriesHeight;\n const chartSeries = this.chartSeries;\n const chartGrid = this.chartGrid;\n const xPad = (halfSlot - minX) * normX;\n const buildPoint = (it, series) => {\n const p = this.chartDataItemToPoint(it, series);\n return {\n x: xPad + p.x * 2 * xPad,\n y: p.y * normY\n };\n };\n var accumulators = new Array(maxCount);\n for (let series of datasource) {\n // does the series svg exist?\n let svg;\n let grad;\n let gradInv;\n let g;\n if (chartSeries.length > iter) {\n svg = chartSeries[iter];\n grad = svg.firstElementChild.firstElementChild;\n gradInv = svg.firstElementChild.lastElementChild;\n g = svg.lastElementChild;\n }\n else {\n svg = document.createElementNS(SVG_NS, 'svg');\n svg.setAttribute('pacem', '');\n chartGrid.insertAdjacentElement('afterend', svg);\n const defs = document.createElementNS(SVG_NS, 'defs');\n defs.appendChild(grad = this.buildLinearGradient(iter));\n defs.appendChild(gradInv = this.buildLinearGradient(iter, true));\n svg.appendChild(defs);\n svg.appendChild(g = document.createElementNS(SVG_NS, 'g'));\n chartSeries.push(svg);\n }\n // series positioning:\n /*\n --------------------------------------\n | |--------------------------------|\n |pad| series here |\n | |--------------------------------|\n --------------------------------------\n | | pad |\n --------------------------------------\n */\n var className = 'chart-series series-fill';\n if (!Utils.isNullOrEmpty(series.className)) {\n className += ' ' + series.className;\n }\n svg.setAttribute('class', className);\n svg.setAttribute('x', paddingYAxis.toString());\n svg.setAttribute('y', seriesY.toString());\n svg.setAttribute('width', seriesWidth.toString());\n svg.setAttribute('height', (seriesHeight + 2 * padding).toString());\n const data = series.values;\n const spinRect = (index) => {\n while (index >= g.children.length) {\n g.appendChild(document.createElementNS(SVG_NS, 'rect'));\n }\n const rect = g.children.item(index);\n rect.style.stroke = series.color;\n const gradient = data[index].value < 0 ? gradInv : grad;\n this.setGradientColor(gradient, series.color);\n rect.style.fill = `url(#${gradient.id})`;\n return rect;\n };\n // fix 0 y\n const precision = 10;\n const assignVerticalCoordsCoords = (rect, pt0, pt, pt0Start = pt0) => {\n const y = -Math.max(pt0.y, pt.y), h = Math.abs(pt.y - pt0.y);\n const fnAssign = () => {\n rect.setAttribute('y', y.toFixed(precision));\n rect.setAttribute('height', h.toFixed(precision));\n };\n if (!rect.hasAttribute('y')) {\n // boostrap easing animated transition\n rect.setAttribute('y', '-' + pt0Start.y.toFixed(precision));\n rect.setAttribute('height', '0');\n requestAnimationFrame(fnAssign);\n }\n else {\n fnAssign();\n }\n };\n if (!Utils.isNullOrEmpty(data)) {\n ;\n const pt00 = buildPoint({ value: 0, label: data[0].label }, data);\n if (stacked) {\n // #region STACK\n const iHalfAvailSlot = halfAvailSlot * normX, iAvailSlotAttr = (availSlot * normX).toFixed(precision);\n for (let j = 0; j < data.length; j++) {\n const item = data[j];\n if (Utils.isNullOrEmpty(accumulators[j])) {\n accumulators[j] = { positive: 0, negative: 0 };\n }\n const accumulator = accumulators[j];\n let posCursor = accumulator.positive, negCursor = accumulator.negative;\n const neg = item.value < 0, y = neg ? negCursor : (posCursor + item.value), y0 = neg ? (negCursor + item.value) : posCursor;\n const pt = buildPoint({ label: item.label, value: y }, data);\n const pt0 = buildPoint({ label: item.label, value: y0 }, data);\n const x = pt.x - iHalfAvailSlot;\n const rect = spinRect(j);\n this.assignUiBehaviors(rect, series, item);\n rect.setAttribute('x', x.toFixed(precision));\n rect.setAttribute('width', iAvailSlotAttr);\n assignVerticalCoordsCoords(rect, pt0, pt, pt00);\n if (neg) {\n accumulator.negative = y0;\n }\n else {\n accumulator.positive = y;\n }\n }\n // #endregion\n }\n else {\n // #region CLUSTER\n const iHalfAvailSlot = halfAvailSlot * normX, iSlot = (iHalfAvailSlot * 2) / datasource.length, //,\n iSlotAttr = iSlot.toFixed(precision);\n for (let j = 0; j < data.length; j++) {\n // looping through the series-data\n const item = data[j];\n const pt = buildPoint(item, data);\n const x = pt.x - iHalfAvailSlot + iSlot * iter;\n const rect = spinRect(j);\n this.assignUiBehaviors(rect, series, item);\n rect.setAttribute('x', x.toFixed(precision));\n rect.setAttribute('width', iSlotAttr);\n assignVerticalCoordsCoords(rect, pt00, pt);\n }\n // #endregion\n }\n }\n // cleanup exceeding rects\n for (let j = g.children.length - 1; j >= data?.length || 0; j--) {\n const rect = g.children.item(j);\n this.disposeUiBehaviors(rect);\n rect.remove();\n }\n // tick\n iter++;\n }\n // remove exceeding series\n this.wipeOut(chartSeries, iter);\n const w0 = 100 * stretch, h0 = 100 + 2 * normPadding, x0 = 0, //minX * normX,\n y0 = maxY * normY + normPadding;\n const svbox = `${x0} ${-y0} ${w0} ${h0}`;\n for (var svg of chartSeries) {\n svg.setAttribute('viewBox', svbox);\n }\n const chartMask = this.chartMask;\n let mask = chartMask.children.item(1);\n mask.setAttribute('x', x0.toString());\n mask.setAttribute('height', (size.height - padding).toString());\n // #endregion\n // #region grid\n chartGrid.setAttribute('viewBox', `0 0 ${size.width} ${size.height}`);\n if (grid.x.length < 1 || grid.y.length <= 1) {\n for (let j = chartGrid.children.length - 1; j >= 0; j--) {\n chartGrid.children.item(j).remove();\n }\n return;\n }\n let pgrid;\n if (chartGrid.children.length > 0) {\n pgrid = chartGrid.children.item(0);\n }\n else {\n pgrid = document.createElementNS(SVG_NS, 'path');\n chartGrid.appendChild(pgrid);\n }\n const tick = PADDING_PIXELS * .25;\n let lblCounter = 0;\n let ensureLabel = (index, x, y, txt) => {\n const ndx = index + /* <path> is the first child element */ 1;\n let lbl;\n if (chartGrid.children.length <= ndx) {\n lbl = document.createElementNS(SVG_NS, 'text');\n chartGrid.appendChild(lbl);\n }\n else {\n lbl = chartGrid.children.item(ndx);\n }\n lbl.textContent = txt;\n lbl.setAttribute('x', x.toString());\n lbl.setAttribute('y', y.toString());\n return lbl;\n };\n let dgrid = `M${paddingYAxis},${padding} v${gridHeight}`; //H${w}\n // x\n let j = 0;\n const xincr = seriesWidth / (grid.x.length /*- 1 consider the extra slot */), yincr = gridHeight / (grid.y.length - 1);\n if (this.xAxisPosition !== 'none') {\n const paddingX = xincr * .5 + paddingYAxis;\n for (var x of grid.x) {\n let xcoord = paddingX + j * xincr;\n if (this.xAxisPosition === 'top') {\n dgrid += ` M${xcoord},${padding} v${-tick}`;\n let lbl = ensureLabel(lblCounter++, xcoord, 0, x);\n lbl.setAttribute('text-anchor', 'middle');\n lbl.setAttribute('alignment-baseline', 'hanging');\n }\n else {\n let ycoord = gridHeight + padding;\n dgrid += ` M${xcoord},${ycoord} v${tick}`;\n ensureLabel(lblCounter++, xcoord, ycoord + padding, x).setAttribute('text-anchor', 'middle');\n }\n j++;\n }\n }\n // y\n j = 0;\n for (var y of grid.y) {\n const ycoord = gridHeight + padding - j * yincr, xcoord = paddingYAxis - tick;\n dgrid += ` M${xcoord},${ycoord} H${(seriesWidth + paddingYAxis)}`;\n let txt = this.formatYAxisLabel(y);\n ensureLabel(lblCounter++, xcoord - tick, ycoord, txt).setAttribute('text-anchor', 'end');\n j++;\n }\n pgrid.setAttribute('d', dgrid);\n // exceeding labels?\n for (let j = chartGrid.children.length - 1; j > lblCounter; j--) {\n chartGrid.children.item(j).remove();\n }\n // #endregion\n }\n};\n__decorate([\n Watch({ converter: PropertyConverters.String })\n], PacemColumnChartElement.prototype, \"type\", void 0);\n__decorate([\n Watch({ converter: PropertyConverters.Number })\n], PacemColumnChartElement.prototype, \"groupWidth\", void 0);\nPacemColumnChartElement = __decorate([\n CustomElement({ tagName: P + '-column-chart' })\n], PacemColumnChartElement);\nexport { PacemColumnChartElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\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;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, Watch, PropertyConverters, P, PCSS, Components, Utils, CustomElementUtils, Debounce } from '@pacem/pacem-core';\nimport { MANAGED_EVENTS } from './types';\n//namespace Pacem.Components.Charts {\n/**\n * Represents a single slice within a `<pacem-pie-chart>`.\n */\nlet PacemPieSliceElement = class PacemPieSliceElement extends Components.PacemItemElement {\n constructor() {\n super(...arguments);\n this._broadcastHandler = (e) => {\n this.emit(e);\n };\n }\n findContainer() {\n return CustomElementUtils.findAncestorOfType(this, PacemPieChartElement);\n }\n get chart() {\n return this.container;\n }\n /** Returns the center of mass (point) of this pie/doughnut slice, in absolute coords (pixels). */\n getCenterOfMass() {\n const area = this.chart && this.chart.area;\n if (Utils.isNull(area)) {\n return null;\n }\n const rect = Utils.offset(area), center = { x: rect.width / 2 + rect.left, y: rect.top + rect.height / 2 }, r = Math.min(rect.width, rect.height) * .5;\n const pos = this.normalizedPolarCoords, angle = PI1_2 - pos.angle;\n return {\n y: center.y - r * pos.radius * Math.sin(angle),\n x: center.x + r * pos.radius * Math.cos(angle)\n };\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (!first && this.chart && name != 'normalizedPolarCoords')\n this.chart.draw();\n }\n /** @internal */\n _assignUi(el) {\n const ui = this._ui = el;\n MANAGED_EVENTS.forEach(type => {\n ui.addEventListener(type, this._broadcastHandler);\n });\n }\n /** @internal */\n _disposeUi() {\n if (!Utils.isNull(this._ui)) {\n MANAGED_EVENTS.forEach(type => {\n this._ui.removeEventListener(type, this._broadcastHandler);\n });\n }\n }\n};\n__decorate([\n Watch({ converter: PropertyConverters.Number })\n], PacemPieSliceElement.prototype, \"value\", void 0);\n__decorate([\n Watch({ converter: PropertyConverters.String })\n], PacemPieSliceElement.prototype, \"label\", void 0);\n__decorate([\n Watch({ converter: PropertyConverters.String })\n], PacemPieSliceElement.prototype, \"color\", void 0);\n__decorate([\n Watch({ converter: PropertyConverters.Json })\n], PacemPieSliceElement.prototype, \"normalizedPolarCoords\", void 0);\nPacemPieSliceElement = __decorate([\n CustomElement({ tagName: P + '-pie-slice' })\n], PacemPieSliceElement);\nexport { PacemPieSliceElement };\nconst TWO_PI = Math.PI * 2;\nconst PI1_2 = Math.PI * .5;\n/**\n * Renders a pie or doughnut chart out of one or more {@link PacemPieSliceElement} slices.\n */\nlet PacemPieChartElement = class PacemPieChartElement extends Components.PacemItemsContainerElement {\n constructor() {\n super();\n /** Set a value between 0 and 1, for doughnut appearance. */\n this.cutout = .0;\n /** Distance between two consecutive slices, in pixels. */\n this.slicePadding = .0;\n this._slices = new WeakMap();\n this._key = Utils.uniqueCode();\n }\n validate(item) {\n return item instanceof PacemPieSliceElement;\n }\n viewActivatedCallback() {\n super.viewActivatedCallback();\n this.draw();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (name === 'target') {\n this._g = null;\n this._div && this._div.remove();\n const eold = old;\n if (eold) {\n eold.classList.remove(PCSS + '-chart-area');\n eold.innerHTML = '';\n }\n this.draw();\n }\n else if (!first && (name === 'cutout' || name === 'items' || name === 'slicePadding'))\n this.draw();\n }\n get area() {\n return this._svg;\n }\n disconnectedCallback() {\n this._div && this._div.remove();\n super.disconnectedCallback();\n }\n _ensureArea() {\n if (Utils.isNull(this._g)) {\n let div = this.target || (this._div = document.createElement('div'));\n div.classList.add(PCSS + '-chart-area');\n let svg = this._svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttribute('pacem', '');\n svg.setAttribute('preserveAspectRatio', 'xMidYMid meet');\n svg.setAttribute('viewBox', '0 0 100 100');\n //svg.style.height =\n // svg.style.width = '100%';\n svg.classList.add(PCSS + '-pie-chart');\n let defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n let g = this._g = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n svg.appendChild(defs);\n svg.appendChild(g);\n div.appendChild(svg);\n this._div &&\n this.parentElement.insertBefore(div, this);\n }\n if (this.maskBasedRendering) {\n if (Utils.isNull(this._mask)) {\n let mask = document.createElementNS('http://www.w3.org/2000/svg', 'mask');\n mask.id = 'pie_mask_' + this._key;\n let rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n rect.setAttribute('x', '0');\n rect.setAttribute('y', '0');\n rect.setAttribute('width', '100');\n rect.setAttribute('height', '100');\n rect.setAttribute('fill', '#fff');\n let circle = this._mask = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n circle.setAttribute('cx', '50');\n circle.setAttribute('cy', '50');\n const defs = this._svg.firstElementChild;\n mask.appendChild(rect);\n mask.appendChild(circle);\n defs.appendChild(mask);\n this._g.setAttribute('mask', `url(#${mask.id})`);\n }\n const cutout = 50.0 * this._safeCutout;\n this._mask.setAttribute('r', `${cutout}`);\n }\n else {\n if (!Utils.isNull(this._mask)) {\n this._svg.firstElementChild.innerHTML = '';\n this._mask = null;\n this._g.removeAttribute('mask');\n }\n }\n // has padded slices?\n const paddingPixels = this._safeSlicePaddingPixels;\n if (paddingPixels > 0) {\n const matrix = this._svg.getCTM();\n const paddingUnits = (paddingPixels / matrix.a).roundoff();\n const maskId = this._sliceMaskId;\n const defs = this._svg.firstElementChild;\n let mask = defs.querySelector(`#${maskId}`);\n if (Utils.isNull(mask)) {\n mask = document.createElementNS('http://www.w3.org/2000/svg', 'mask');\n mask.id = maskId;\n defs.appendChild(mask);\n }\n else {\n mask.innerHTML = '';\n }\n const maskPath = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n const d = `M${(50 + paddingUnits)},0 H100 V100 H0 V0 H50 V50 h${paddingUnits} Z`;\n maskPath.setAttribute('d', d);\n maskPath.setAttribute('fill', '#fff');\n mask.appendChild(maskPath);\n }\n return this._g;\n }\n get _sliceMaskId() {\n return 'pieslice_mask_' + this._key;\n }\n get _safeCutout() {\n return Math.min(1, Math.max(0, this.cutout)) || .0;\n }\n get _safeSlicePaddingPixels() {\n return Math.max(0, this.slicePadding ?? 0);\n }\n _drawSlice(path, slice, whole, partial) {\n const largeFlag = slice.value > .5 * whole ? 1 : 0;\n const angle = TWO_PI * slice.value / whole;\n const rot = 360.0 * partial / whole;\n const x = (slice.value >= whole) ? /* handling single slice */ 49.9 : 50 * (1 + Math.sin(angle));\n const y = 50 * (1 - Math.cos(angle));\n // set geometry data\n const c = this._safeCutout, r = c * 50.0;\n path.style.fill = slice.color; //.setAttribute('fill', slice.color || (path.getAttribute('fill') || '#000'));\n //path.setAttribute('transform', `rotate(${rot} 50 50)`);\n path.style.transform = `rotate(${rot}deg)`;\n path.style.transformOrigin = '50% 50%';\n const d = this.maskBasedRendering ?\n `M50,50 V0 A50,50 0 ${largeFlag} 1 ${x} ${y} L50,50 Z` :\n `M50,0 A50,50 0 ${largeFlag} 1 ${x} ${y} l${(50 - x) * (1.0 - c)},${(50 - y) * (1.0 - c)} A${r},${r} 0 ${largeFlag} 0 50,${(50 - r)} Z`;\n path.setAttribute('d', d);\n slice.normalizedPolarCoords = { radius: c + Math.SQRT1_2 * (1.0 - c), angle: /* deg to rad */ Math.PI * rot / 180.0 + angle / 2 };\n }\n _isSliceOk(slice) {\n return !slice.disabled //&& slice.value > 0\n ;\n }\n _padSlice(path) {\n const paddingPixels = this._safeSlicePaddingPixels;\n if (paddingPixels > 0) {\n path.setAttribute('mask', `url(#${this._sliceMaskId})`);\n }\n else {\n path.removeAttribute('mask');\n }\n }\n draw() {\n const g = this._ensureArea(), pCount = g.children.length, chartArea = this._svg.parentElement;\n let ndx = 0, sum = .0, progress = .0;\n if (Utils.isNullOrEmpty(this.items)) {\n g.innerHTML = '';\n Utils.removeClass(chartArea, 'chart-has-data');\n }\n else {\n Utils.addClass(chartArea, 'chart-has-data');\n for (let slice of this.items) {\n if (!this._isSliceOk(slice)) {\n continue;\n }\n sum += slice.value;\n }\n if (sum <= 0) {\n g.innerHTML = '';\n Utils.removeClass(chartArea, 'chart-has-data');\n }\n else {\n for (let slice of this.items) {\n if (!this._isSliceOk(slice)) {\n continue;\n }\n let p;\n if (ndx >= pCount) {\n const g_n = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n g_n.setAttribute('class', 'chart-series ' + PCSS + '-pie-slice' + (Utils.isNullOrEmpty(slice.className) ? '' : (' ' + slice.className)));\n p = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n g_n.appendChild(p);\n g.appendChild(g_n);\n // add listeners (click, mouse-..., touch-...)\n slice._assignUi(g_n);\n this._slices.set(g_n, slice);\n }\n else {\n p = g.children.item(ndx).firstElementChild;\n }\n if (slice.value > 0) {\n this._drawSlice(p, slice, sum, progress);\n this._padSlice(p);\n progress += slice.value;\n p.removeAttribute('display');\n }\n else {\n p.setAttribute('display', 'none');\n }\n ndx++;\n }\n }\n }\n while (ndx < g.children.length) {\n const slices = this._slices, g_n = g.children.item(ndx);\n // remove listeners\n if (slices.has(g_n)) {\n slices.get(g_n)._disposeUi();\n slices.delete(g_n);\n }\n g.removeChild(g_n);\n }\n }\n};\n__decorate([\n Watch({ converter: PropertyConverters.Number })\n], PacemPieChartElement.prototype, \"cutout\", void 0);\n__decorate([\n Watch({ converter: PropertyConverters.Element })\n], PacemPieChartElement.prototype, \"target\", void 0);\n__decorate([\n Watch({ converter: PropertyConverters.Boolean })\n], PacemPieChartElement.prototype, \"maskBasedRendering\", void 0);\n__decorate([\n Watch({ converter: PropertyConverters.Number })\n], PacemPieChartElement.prototype, \"slicePadding\", void 0);\n__decorate([\n Debounce(true)\n], PacemPieChartElement.prototype, \"draw\", null);\nPacemPieChartElement = __decorate([\n CustomElement({ tagName: P + '-pie-chart' })\n], PacemPieChartElement);\nexport { PacemPieChartElement };\n"],
|
|
4
|
+
"sourcesContent": ["import * as Charts from './index-components-charts';\nexport { Charts };\n", "export * from './types';\nexport * from './generic';\nexport * from './column';\nexport * from './pie';\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\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;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, Watch, PropertyConverters, P, PCSS, Components, CustomUIEvent, CustomElementUtils, Utils, Throttle, PropertyChangeEventName } from '@pacem/pacem-core';\n//namespace Pacem.Components.Charts {\nexport const MANAGED_EVENTS = ['keydown', 'keyup', 'click', 'dblclick', 'mouseover', 'mouseout', 'mouseenter', 'mouseleave', 'mousedown', 'mouseup', 'mousemove', 'contextmenu'];\n;\n//function logN(N, x) {\n// return Math.log10(x) / Math.log10(N);\n//}\nconst MSECS_PER_DAY = 1000 * 60 * 60 * 24;\nconst MAX_X_LABELS = 10;\nconst MAX_Y_LABELS = 10;\nconst SERIES_DATAITEM = 'pacem:chart-series:dataitem';\nconst SERIES_SERIES = 'pacem:chart-series:series';\nfunction getEvenlySpaced(items, type, min, max, formatOrLang, labels = MAX_X_LABELS) {\n const length = (type === 'number' || type === 'date') ? (max - min) : Math.max(1, items.length - 1);\n const gaps = labels - 1;\n var retval = [];\n var step = 1;\n for (var l = gaps; l > 1; l--) {\n if ((length % l) === 0) {\n step = length / l;\n break;\n }\n }\n if (step === 1 /* coprime number? */ && length > labels) {\n step = length;\n }\n const fnDate = typeof formatOrLang === 'function' ? formatOrLang : (step >= MSECS_PER_DAY ? ((d) => d.toLocaleDateString(formatOrLang)) : ((d) => d.toLocaleTimeString(formatOrLang)));\n const fnDateFirst = typeof formatOrLang === 'function' ? formatOrLang : (step < MSECS_PER_DAY ? ((d) => d.toLocaleString(formatOrLang)) : fnDate);\n const fnNum = typeof formatOrLang === 'function' ? formatOrLang : (n) => n.toLocaleString(formatOrLang);\n for (var j = 0; j <= length; j += step) {\n let label;\n switch (type) {\n case 'string':\n if (j >= items.length) {\n continue;\n }\n label = items[j].label;\n break;\n case 'number':\n label = fnNum(min + j);\n break;\n case 'date':\n let date = Utils.parseDate(min + j);\n let fn = (j == 0) ? fnDateFirst : fnDate;\n label = fn(date);\n break;\n default:\n throw 'Not supported.';\n }\n retval.push(label);\n }\n return retval;\n}\nfunction getRoundedBoundaries(min, max, desiredSteps) {\n desiredSteps ??= Math.min(bestGuessedDensity(min, max), MAX_Y_LABELS);\n const roughStep = (max - min) / desiredSteps;\n const magnitude = Math.pow(10, Math.floor(Math.log10(roughStep)));\n const step = [1, 2, 5, 10].map(n => n * magnitude).filter(s => s >= roughStep).reduce((min, s) => Math.min(min, s), Number.POSITIVE_INFINITY);\n return {\n min: Math.floor(min / step) * step,\n max: Math.ceil(max / step) * step,\n round: step\n };\n}\n// Deprecated\n//function getRoundedBoundariesOld(a0: number, a1: number, steps?: number) {\n// if (!(steps > 0)) {\n// steps = bestGuessedDensity(a0, a1);\n// }\n// const magn = logN(steps, a1 - a0),\n// exp = magn % 1 == 0 ? magn - 1 : magn,\n// rounder = Math.pow(steps, Math.floor(exp));\n// return {\n// min: Math.floor(a0 / rounder) * rounder,\n// max: Math.ceil(a1 / rounder) * rounder,\n// round: rounder\n// };\n//}\nfunction bestGuessedDensity(min, max) {\n const delta = max - min;\n if (!(delta > 0)) {\n return 2;\n }\n const oom = Math.floor(Math.log10(delta));\n const exp = Math.pow(10, -oom);\n // bring everything to a single digit format\n if (oom != 0) {\n return bestGuessedDensity(min * exp, max * exp);\n }\n const capFn = (n) => {\n const norm = Math.floor(Math.abs(n) * 10), limit = norm + 10 - (norm % 10);\n return limit.roundoff();\n };\n const b = capFn(delta);\n let a = 10;\n if (min !== 0) {\n a = capFn(Math.abs(max));\n }\n const ret = gcd(a, b);\n return ret === 1 ? b : Math.max(ret, 10 - ret);\n}\nfunction gcd(a, b) {\n if (a <= 0) {\n return b;\n }\n return gcd(b % a, a);\n}\n/** Custom UI event dispatched by chart elements when the user interacts with a rendered data point (e.g. `itemclick`, `itemmouseover`). */\nexport class ChartEvent extends CustomUIEvent {\n constructor(type, eventInit, originalEvent) {\n super(type, eventInit, originalEvent);\n }\n}\n/**\n * Represents a single data series to be plotted within a `<pacem-chart>`-like element.\n */\nlet PacemChartSeriesElement = class PacemChartSeriesElement extends Components.PacemItemElement {\n get values() {\n return this.datasource;\n }\n};\n__decorate([\n Watch({ emit: true, converter: PropertyConverters.Json })\n], PacemChartSeriesElement.prototype, \"datasource\", void 0);\n__decorate([\n Watch({ emit: true, converter: PropertyConverters.String })\n], PacemChartSeriesElement.prototype, \"label\", void 0);\n__decorate([\n Watch({ emit: true, converter: PropertyConverters.String })\n], PacemChartSeriesElement.prototype, \"color\", void 0);\n__decorate([\n Watch({ emit: true, converter: PropertyConverters.Boolean })\n], PacemChartSeriesElement.prototype, \"datapoints\", void 0);\n__decorate([\n Watch( /* to be set programmatically (internally) */)\n], PacemChartSeriesElement.prototype, \"_uiElements\", void 0);\nPacemChartSeriesElement = __decorate([\n CustomElement({ tagName: P + '-chart-series' })\n], PacemChartSeriesElement);\nexport { PacemChartSeriesElement };\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n/**\n * Abstract base class for chart elements hosting a collection of {@link PacemChartSeriesElement} items.\n * Provides axis/grid computation and SVG drawing helpers shared by concrete chart-series elements (e.g. `PacemChartElement`, `PacemColumnChartElement`).\n */\nexport class PacemSeriesChartElement extends Components.PacemItemsContainerElement {\n constructor() {\n super();\n this._itemPropertyChangedCallback = (evt) => {\n const propName = evt.detail.propertyName;\n if (propName === 'datasource'\n || propName === 'label'\n || propName === 'datapoints'\n || propName === 'cssClass'\n || propName === 'color') {\n this.draw();\n }\n };\n this._series = [];\n this._resizeHandler = (evt) => {\n this._size = evt.detail;\n this.draw();\n };\n // #endregion\n this._broadcastHandler = (e) => {\n /* Don't mess with the events:\n * keep the original (trusted) events with their well-known names\n * and provide a method to retrieve the 'ChartDataItem' based on the the eventTarget. */\n const element = e.currentTarget;\n const dataItem = CustomElementUtils.getAttachedPropertyValue(element, SERIES_DATAITEM);\n if (Utils.isNull(dataItem)) {\n return;\n }\n const chart = this, anchorPoint = chart.getAnchorPoint(element);\n const evt = new ChartEvent('item' + e.type, { detail: { dataItem, anchorPoint } }, e);\n const series = CustomElementUtils.getAttachedPropertyValue(element, SERIES_SERIES);\n if (series instanceof PacemChartSeriesElement) {\n series.dispatchEvent(evt);\n }\n chart.dispatchEvent(evt);\n };\n this._key = Utils.uniqueCode();\n }\n validate(item) {\n return item instanceof PacemChartSeriesElement;\n }\n register(item) {\n if (super.register(item)) {\n item.addEventListener(PropertyChangeEventName, this._itemPropertyChangedCallback, false);\n return true;\n }\n return false;\n }\n unregister(item) {\n if (super.unregister(item)) {\n item.removeEventListener(PropertyChangeEventName, this._itemPropertyChangedCallback, false);\n return true;\n }\n return false;\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (name === 'target') {\n if (this._div != old) {\n this._div && this._div.remove();\n }\n // reset\n this._div = null;\n this._body = null; // <- get checked on next draw\n const eold = old;\n if (eold) {\n eold.classList.remove(PCSS + '-chart-area');\n eold.innerHTML = '';\n }\n this._ensureResizer();\n this.draw();\n }\n else if (!first) {\n switch (name) {\n case 'items':\n this._databindAndDrawDebounced();\n break;\n case 'datasource':\n this._databind();\n // fall down to draw() call.\n case 'yAxisDensity':\n case 'xAxisDensity':\n case 'xAxisType':\n case 'yAxisMax':\n case 'xAxisPosition':\n case 'yAxisFormat':\n this.draw();\n break;\n }\n }\n }\n _databindAndDrawDebounced() {\n cancelAnimationFrame(this._handle);\n this._handle = requestAnimationFrame(() => {\n this._databind();\n this.draw();\n });\n }\n _databind() {\n this._datasource = Utils.isNullOrEmpty(this.datasource) ? this.items : this.datasource;\n }\n disconnectedCallback() {\n this._div && this._div.remove();\n const resizer = this._resizer;\n if (!Utils.isNull(resizer)) {\n resizer.removeEventListener(Components.ResizeEventName, this._resizeHandler, false);\n resizer.remove();\n this._resizer = null;\n }\n super.disconnectedCallback();\n }\n viewActivatedCallback() {\n super.viewActivatedCallback();\n this._ensureResizer();\n this._databind();\n this.draw();\n }\n _ensureResizer(target = this.target || this._div) {\n if (Utils.isNull(this._resizer)) {\n const shell = CustomElementUtils.findAncestorShell(this);\n const resizer = this._resizer = shell.appendChild(new Components.PacemResizeElement());\n resizer.addEventListener(Components.ResizeEventName, this._resizeHandler, false);\n }\n this._resizer.target = target;\n }\n // #region OO-scoped props\n get chartSize() {\n return this._size;\n }\n get chartSeries() {\n return this._series;\n }\n get chartBody() {\n return this._body;\n }\n get chartGrid() {\n return this._grid;\n }\n get chartMask() {\n return this._mask;\n }\n get chartKey() {\n return this._key;\n }\n get chartContainer() {\n return this._div;\n }\n assignUiBehaviors(ui, series, data, color) {\n const alreadyRegistered = !Utils.isNull(CustomElementUtils.getAttachedPropertyValue(ui, SERIES_DATAITEM));\n const item = Utils.extend({ series: series.label, color: color || series.color }, data);\n CustomElementUtils.setAttachedPropertyValue(ui, SERIES_DATAITEM, item);\n CustomElementUtils.setAttachedPropertyValue(ui, SERIES_SERIES, series);\n if (!alreadyRegistered) {\n MANAGED_EVENTS.forEach(type => {\n ui.addEventListener(type, this._broadcastHandler);\n });\n }\n }\n disposeUiBehaviors(ui) {\n CustomElementUtils.deleteAttachedPropertyValue(ui, SERIES_DATAITEM);\n CustomElementUtils.deleteAttachedPropertyValue(ui, SERIES_SERIES);\n MANAGED_EVENTS.forEach(type => {\n ui.removeEventListener(type, this._broadcastHandler);\n });\n }\n ensureChartContainer() {\n if (Utils.isNull(this._div)) {\n let div = this._div = this.target || document.createElement('div');\n div.classList.add(PCSS + '-chart-area');\n if (div != this.target) {\n this.parentElement.insertBefore(div, this);\n }\n }\n return this._div;\n }\n ensureChartBody(type, w, h) {\n if (Utils.isNull(this._body)) {\n let svg = this._body = document.createElementNS(SVG_NS, 'svg');\n svg.setAttribute('pacem', '');\n svg.setAttribute('class', PCSS + '-' + type + '-chart');\n svg.setAttribute('preserveAspectRatio', 'xMinYMax slice');\n const g = this._grid = document.createElementNS(SVG_NS, 'svg');\n g.setAttribute('pacem', '');\n g.setAttribute('class', 'chart-grid');\n // put mask on series\n let defs = document.createElementNS(SVG_NS, 'defs');\n let mask = this._mask = document.createElementNS(SVG_NS, 'mask');\n // black (hides)\n let rect = document.createElementNS(SVG_NS, 'rect');\n rect.setAttribute('x', '0');\n rect.setAttribute('y', '0');\n rect.setAttribute('width', '100%');\n rect.setAttribute('height', '100%');\n // white (shows)\n let rect0 = document.createElementNS(SVG_NS, 'rect');\n rect0.setAttribute('y', '0');\n rect0.setAttribute('width', '100%');\n rect0.setAttribute('fill', '#fff');\n mask.id = 'gnrc_mask_' + this._key;\n mask.appendChild(rect);\n mask.appendChild(rect0);\n // place mask on series so that lines won't be rendered outside the grid borders\n //g2.setAttribute('mask', 'url(#' + mask.id + ')');\n defs.appendChild(mask);\n svg.appendChild(defs);\n svg.appendChild(g);\n this._div.appendChild(svg);\n }\n return this._body;\n }\n chartDataItemToPoint(input, source) {\n switch (this.xAxisType || 'string') {\n case 'number':\n return { x: parseFloat(input.label), y: input.value };\n case 'date':\n return { x: Utils.parseDate(input.label).valueOf(), y: input.value };\n case 'string':\n return { x: source.findIndex(e => e.label == input.label), y: input.value };\n default:\n throw 'Not supported.';\n }\n }\n getVirtualGrid(items, minX, maxX, minY, maxY, xAxisType = this.xAxisType, steps, labels) {\n const rangeY = getRoundedBoundaries(minY, maxY, steps), stepY = rangeY.round;\n // fill y-axis array\n var y = [];\n for (let j = rangeY.min; j <= rangeY.max; j += stepY) {\n y.push(j.roundoff());\n }\n // fill x-axis array;\n let lang = Utils.lang(this);\n let format = null;\n const intl = this.xAxisFormat;\n if (!Utils.isNullOrEmpty(intl)) {\n switch (xAxisType) {\n case 'number':\n format = (n) => Intl.NumberFormat(lang, intl).format(n);\n break;\n case 'date':\n format = (n) => Intl.DateTimeFormat(lang, intl).format(Utils.parseDate(n));\n break;\n }\n }\n const x = getEvenlySpaced(items, xAxisType, minX, maxX, format ?? lang, labels);\n return { x, y };\n }\n wipeOut(series = this._series, startIndex = 0) {\n for (var j = series.length - 1; j >= startIndex; j--) {\n series[j].remove();\n }\n series.splice(startIndex);\n }\n buildLinearGradient(seriesIndex, invert = false) {\n const grad = document.createElementNS(SVG_NS, 'linearGradient');\n grad.id = this.chartKey + '_grad' + seriesIndex + (invert ? '_inverted' : '');\n if (invert) {\n Utils.addClass(grad, 'bottom-up');\n }\n grad.setAttribute('x1', '0%');\n grad.setAttribute('x2', '0%');\n grad.setAttribute('y1', '0%');\n grad.setAttribute('y2', '100%');\n grad.setAttribute('spreadMethod', 'pad');\n const stop1 = document.createElementNS(SVG_NS, 'stop');\n stop1.setAttribute('offset', '0%');\n const stop2 = document.createElementNS(SVG_NS, 'stop');\n stop2.setAttribute('offset', '100%');\n grad.appendChild(stop1);\n grad.appendChild(stop2);\n return grad;\n }\n setGradientColor(grad, color) {\n for (let j = 0; j < grad.children.length; j++) {\n const stop = grad.children.item(j);\n if (stop instanceof SVGStopElement) {\n stop.style.stopColor = color;\n }\n }\n }\n estimateYAxisLabelWidth(max) {\n const txt = this.formatYAxisLabel(max);\n return this.estimateLabelWidth(txt);\n }\n estimateLabelWidth(txt) {\n const grid = this._grid;\n if (Utils.isNull(grid)) {\n throw new Error('Unable to estimate label without an underlying grid available.');\n }\n const lbl = document.createElementNS(SVG_NS, 'text');\n lbl.textContent = txt;\n grid.appendChild(lbl);\n const size = Utils.offset(lbl);\n lbl.remove();\n return size.width;\n }\n formatYAxisLabel(y) {\n const intl = this.yAxisFormat;\n return Utils.isNullOrEmpty(intl) ? y.toString() : Intl.NumberFormat(Utils.lang(this), intl).format(y);\n }\n estimateXAxisLabelWidth(max) {\n const txt = this.formatXAxisLabel(max);\n return this.estimateLabelWidth(txt);\n }\n formatXAxisLabel(x) {\n const intl = this.xAxisFormat, lang = Utils.lang(this);\n switch (this.xAxisType) {\n case 'date':\n const date = Utils.Dates.parse(x);\n return Utils.isNullOrEmpty(intl) ? date.toLocaleString(lang) : Intl.DateTimeFormat(lang, intl).format(date);\n case 'number':\n const num = x;\n return Utils.isNullOrEmpty(intl) ? num.toLocaleString(lang) : Intl.NumberFormat(lang, intl).format(num);\n default:\n return x;\n }\n }\n draw() {\n this.drawSeries(this._datasource);\n }\n /**\n * Default implementation.\n * @param element\n */\n getAnchorPoint(element) {\n const rect = Utils.offset(element);\n return { x: rect.left + rect.width * .5, y: rect.top + rect.height * .5 };\n }\n}\n__decorate([\n Watch({ converter: PropertyConverters.Element })\n], PacemSeriesChartElement.prototype, \"target\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], PacemSeriesChartElement.prototype, \"xAxisType\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], PacemSeriesChartElement.prototype, \"xAxisPosition\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Json })\n], PacemSeriesChartElement.prototype, \"datasource\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemSeriesChartElement.prototype, \"yAxisDensity\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemSeriesChartElement.prototype, \"xAxisDensity\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemSeriesChartElement.prototype, \"yAxisMin\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemSeriesChartElement.prototype, \"yAxisMax\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Json })\n], PacemSeriesChartElement.prototype, \"yAxisFormat\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Json })\n], PacemSeriesChartElement.prototype, \"xAxisFormat\", void 0);\n__decorate([\n Throttle(true)\n], PacemSeriesChartElement.prototype, \"draw\", null);\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\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;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, Watch, PropertyConverters, P, PCSS, Utils, CustomElementUtils, Logging } from '@pacem/pacem-core';\nimport { PacemSeriesChartElement } from './types';\n//namespace Pacem.Components.Charts {\n/**\n * Returns the anchor points for a B\u00E9zier curve.\n * @param p The actual point.\n * @param p0 The previous point, if any.\n * @param p1 The next point, if any.\n */\nfunction getSplineCtrlPoints(p, p0, p1) {\n let c0 = p, c1 = p;\n const p0Null = Utils.isNull(p0), p1Null = Utils.isNull(p1);\n if (!(p0Null && p1Null)) {\n const portion = 3;\n let m0, m1;\n if (!p0Null) {\n m0 = (p.y - p0.y) / (p.x - p0.x);\n }\n if (!p1Null) {\n m1 = (p1.y - p.y) / (p1.x - p.x);\n }\n // average slope\n const m = ((m1 || (m0 || 0)) + (m0 || (m1 || 0))) / 2;\n const dx0 = p0Null ? 0 : (p.x - p0.x) / portion;\n const dx1 = p1Null ? 0 : (p1.x - p.x) / portion;\n c0 = { x: p.x - dx0, y: p.y - dx0 * m };\n c1 = { x: p.x + dx1, y: p.y + dx1 * m };\n }\n return { c0: c0, c1: c1 };\n}\nconst GET_VAL = CustomElementUtils.getAttachedPropertyValue;\nconst SET_VAL = CustomElementUtils.setAttachedPropertyValue;\nconst DEL_VAL = CustomElementUtils.deleteAttachedPropertyValue;\nconst PADDING_PIXELS = 24;\nconst SERIES_MAGNITUDE = 'pacem:chart-series:area';\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n/**\n * Renders a line, spline, area or spline-area chart out of one or more {@link PacemChartSeriesElement} series.\n */\nlet PacemChartElement = class PacemChartElement extends PacemSeriesChartElement {\n constructor() {\n super(...arguments);\n this.#hover = false;\n this._enterHandler = (evt) => {\n this.#hover = true;\n };\n this._leaveHandler = (evt) => {\n this.#hover = false;\n };\n this._moveHandler = (evt) => {\n if (!this.#hover) {\n return;\n }\n };\n this._chartFillSeries = [];\n }\n // TODO: implement\n // @Watch({ converter: PropertyConverters.String }) hoverMode: 'abscissa' | 'point'; // 'point' assumed as default\n _getVirtualGrid(items, minX, maxX, minY, maxY, xAxisType = this.xAxisType, steps, labels) {\n return super.getVirtualGrid(items, minX, maxX, minY, maxY, xAxisType, steps, labels);\n }\n _wipe(series = this.chartSeries, startIndex = 0) {\n super.wipeOut(series, startIndex);\n }\n viewActivatedCallback() {\n super.viewActivatedCallback();\n this._setupBehavior();\n }\n disconnectedCallback() {\n this._dismantleBehavior();\n super.disconnectedCallback();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'type':\n case 'aspectRatio':\n this.draw();\n break;\n }\n }\n _setupBehavior() {\n this.addEventListener('mouseenter', this._enterHandler, false);\n this.addEventListener('mouseleave', this._enterHandler, false);\n this.addEventListener('mousemove', this._moveHandler, false);\n }\n _dismantleBehavior() {\n this.removeEventListener('mouseenter', this._enterHandler, false);\n this.removeEventListener('mouseleave', this._leaveHandler, false);\n this.removeEventListener('mousemove', this._moveHandler, false);\n }\n #hover;\n _buildLinearGradient(seriesIndex) {\n return super.buildLinearGradient(seriesIndex);\n }\n _setGradientColor(grad, color) {\n super.setGradientColor(grad, color);\n }\n drawSeries(datasource) {\n if (!this.isReady || Utils.isNull(this.chartSize)) {\n return;\n }\n this.ensureChartContainer();\n const type = this.type || 'line';\n const padding = PADDING_PIXELS;\n // resize all\n var size = this.chartSize;\n if (size.height <= padding || size.width <= padding) {\n return;\n }\n // items && labels?\n if (Utils.isNullOrEmpty(datasource) || datasource.every(i => Utils.isNullOrEmpty(i.values))) {\n this._wipe();\n return;\n }\n const body = this.ensureChartBody('line', size.width, size.height);\n // from now on, drawing...\n this.log(Logging.LogLevel.Debug, `Drawing ${type} chart.`);\n // #region computations\n const xAxisType = this.xAxisType || 'string';\n let minY = this.yAxisMin ?? Number.NaN, maxY = this.yAxisMax ?? Number.NaN, minX = Number.NaN, maxX = Number.NaN;\n let stretch = 1;\n // individuate the min/max x & y in order correctly apply aspect ratio...\n for (let series of datasource) {\n let data = series.values;\n if (data && data.length) {\n let j = 0;\n for (let item of data) {\n let pt = this.chartDataItemToPoint(item, data);\n if (Utils.isNull(this.yAxisMin)) {\n minY = isNaN(minY) ? pt.y : Math.min(minY, pt.y);\n }\n if (Utils.isNull(this.yAxisMax)) {\n maxY = isNaN(maxY) ? pt.y : Math.max(maxY, pt.y);\n }\n if (j === 0)\n minX = isNaN(minX) ? pt.x : Math.min(minX, pt.x);\n else if (j === data.length - 1)\n maxX = isNaN(maxX) ? pt.x : Math.max(maxX, pt.x);\n j++;\n }\n }\n }\n /** virtual grid made of x- and y-axis labels */\n const withValues = datasource.find(i => !Utils.isNullOrEmpty(i.values));\n const grid = this._getVirtualGrid(withValues.values, minX, maxX, minY, maxY, xAxisType, this.yAxisDensity, this.xAxisDensity);\n const topGrid = grid.y[grid.y.length - 1], bottomGrid = grid.y[0];\n if (topGrid === bottomGrid)\n return;\n // estimate y-axis max width\n const halfPad = padding * .5;\n const maxYLabelLength = grid.y.reduce((max, i) => Math.max(max, this.estimateYAxisLabelWidth(i) + halfPad), padding);\n const maxXLabelHalfLength = grid.x.reduce((max, i) => Math.max(max, this.estimateXAxisLabelWidth(i)), padding) * .5;\n const paddingYAxis = Math.max(maxXLabelHalfLength, maxYLabelLength), paddingYAxisEnd = maxXLabelHalfLength; // Math.max(padding, this.estimateXAxisLabelWidth(minX) * .5 + PADDING_PIXELS);\n /** width of the WHOLE series dedicated area */\n const seriesWidth = size.width - paddingYAxis - paddingYAxisEnd;\n /** height of the WHOLE series dedicated area */\n const gridHeight = (size.height - 2 * padding);\n const seriesHeight = gridHeight * (1 - (topGrid - bottomGrid - (maxY - minY)) / (topGrid - bottomGrid));\n const seriesY = gridHeight * (topGrid - maxY) / (topGrid - bottomGrid);\n // const seriesY2 = gridHeight * (minY - bottomGrid) / (topGrid - bottomGrid);\n // if not a `graph`\n if (xAxisType !== 'number' || (this.aspectRatio !== 'monometric' && this.aspectRatio !== 'logaritmic')) {\n // consider padding\n stretch = seriesWidth / seriesHeight;\n body.setAttribute('height', size.height.toString());\n body.setAttribute('width', size.width.toString());\n }\n body.setAttribute('viewBox', `0 0 ${size.width} ${size.height}`);\n // #endregion\n // #region render series\n let iter = 0;\n // normalize\n const spanX = maxX - minX, spanY = maxY - minY;\n const normX = 100 * stretch / spanX, normY = 100 / spanY;\n const normPadding = 100 * padding / seriesHeight;\n const buildPoint = (it, series) => {\n let p = this.chartDataItemToPoint(it, series);\n //pt.x *= normX;\n p.y *= normY;\n // Limit as much as possible the magnitude of a number inclued in the svg.\n // Big numbers \"overflow the renderer\".\n p.x = (p.x - minX) * normX;\n //pt.y = (pt.y - minY) * normY;\n return p;\n };\n const chartSeries = this.chartSeries;\n const chartFillSeries = this._chartFillSeries;\n const chartGrid = this.chartGrid;\n const splineHere = type === 'spline' || type === 'splinearea';\n for (let series of datasource) {\n // does the series svg exist?\n let svg, svgFill;\n let grad;\n if (chartSeries.length > iter) {\n svg = chartSeries[iter];\n svgFill = chartFillSeries[iter];\n grad = svgFill.firstElementChild.firstElementChild;\n }\n else {\n svg = document.createElementNS(SVG_NS, 'svg');\n svg.setAttribute('pacem', '');\n body.appendChild(svg);\n svgFill = document.createElementNS(SVG_NS, 'svg');\n svgFill.setAttribute('pacem', '');\n body.insertBefore(svgFill, body.children.item(iter + /* <defs> should remain the very first child and 'grid' the very second */ 2));\n // 1st child - defs (gradient)\n const defs = document.createElementNS(SVG_NS, 'defs');\n defs.appendChild(grad = this._buildLinearGradient(iter));\n svgFill.appendChild(defs);\n // 2nd child - fill path\n svgFill.appendChild(document.createElementNS(SVG_NS, 'path'));\n chartFillSeries.push(svgFill);\n // 1st child stroke path\n svg.appendChild(document.createElementNS(SVG_NS, 'path'));\n // 2nd + nth+1 child will be point circles\n chartSeries.push(svg);\n }\n // series positioning:\n /*\n --------------------------------------\n | |--------------------------------|\n |pad| series here |\n | |--------------------------------|\n --------------------------------------\n | | pad |\n --------------------------------------\n */\n let className = 'chart-series';\n const fill = type === 'area' || type === 'splinearea';\n if (!Utils.isNullOrEmpty(series.className)) {\n className += ' ' + series.className;\n }\n [svg, svgFill].forEach(s => {\n s.setAttribute('class', className);\n s.setAttribute('x', paddingYAxis.toString());\n s.setAttribute('y', seriesY.toString());\n s.setAttribute('width', seriesWidth.toString());\n s.setAttribute('height', (seriesHeight + 2 * padding).toString());\n });\n Utils.addClass(svgFill, PCSS + '-inert');\n // pick path as single child element for the series.\n let pathFill = svgFill.children.item(1);\n let path = svg.firstElementChild;\n path.style.stroke = series.color;\n pathFill.style.stroke =\n path.style.fill = 'none';\n this._setGradientColor(grad, series.color);\n pathFill.style.fill = `url(#${grad.id})`;\n pathFill.style.display = fill ? '' : 'none';\n let d = '';\n let data = series.values;\n if (data && data.length) {\n const addInteractivePoint = (center, j, series, dataItem, color) => {\n const ndx = j + /* count the <path> child */ 1;\n let circle;\n if (svg.children.length > ndx) {\n circle = svg.children.item(ndx);\n }\n else {\n circle = document.createElementNS(SVG_NS, 'line');\n circle.setAttribute('class', 'circle');\n svg.appendChild(circle);\n }\n const x1 = center.x.toString(), y1 = (-center.y).toString();\n circle.setAttribute('x1', x1);\n circle.setAttribute('y1', y1);\n circle.setAttribute('x2', x1);\n circle.setAttribute('y2', y1);\n circle.style.stroke = color;\n this.assignUiBehaviors(circle, series, dataItem, color);\n };\n const wipeExceedingPoints = () => {\n const remaining = series.datapoints ? (data.length + 1) : 1;\n for (let k = svg.children.length - 1; k >= remaining; k--) {\n var circle = svg.children.item(k);\n this.disposeUiBehaviors(circle);\n circle.remove();\n }\n };\n if (splineHere) {\n // #region SPLINE\n let pt0, pt, c0;\n for (let j = 0; j < data.length; j++) {\n const item = data[j];\n if (isNaN(item.value)) {\n continue;\n }\n if (!pt) {\n pt = buildPoint(item, data);\n }\n let pt1;\n if (splineHere && j < (data.length - 1)) {\n pt1 = buildPoint(data[j + 1], data);\n }\n // accumulate `area` for sorting\n let areaSoFar = GET_VAL(series, SERIES_MAGNITUDE, 0);\n areaSoFar += item.value;\n SET_VAL(series, SERIES_MAGNITUDE, areaSoFar);\n var c = getSplineCtrlPoints(pt, pt0, pt1);\n d += Utils.isNullOrEmpty(d) ? `M${pt.x},${-pt.y} ` : `C${c0.x},${-c0.y} ${c.c0.x},${-c.c0.y} ${pt.x},${-pt.y} `;\n if (series.datapoints) {\n addInteractivePoint(pt, j, series, item, series.color);\n }\n // step next\n pt0 = pt;\n pt = pt1, c0 = c.c1;\n }\n // #endregion\n }\n else {\n // #region LINE\n let j = 0;\n for (let item of data) {\n if (isNaN(item.value)) {\n continue;\n }\n const pt = buildPoint(item, data);\n // accumulate `area` for sorting\n let areaSoFar = GET_VAL(series, SERIES_MAGNITUDE, 0);\n areaSoFar += item.value;\n SET_VAL(series, SERIES_MAGNITUDE, areaSoFar);\n d += Utils.isNullOrEmpty(d) ? `M${pt.x},${-pt.y} ` : `L${pt.x},${-pt.y} `;\n if (series.datapoints) {\n addInteractivePoint(pt, j, series, item, series.color);\n }\n j++;\n }\n // #endregion\n }\n wipeExceedingPoints();\n }\n path.setAttribute('d', d);\n pathFill.setAttribute('d', d + `V${(-minY * normY)} H0 Z`);\n // tick\n iter++;\n }\n // remove exceeding series\n this._wipe(chartFillSeries, iter);\n this._wipe(chartSeries, iter);\n const w0 = 100 * stretch, h0 = 100 + 2 * normPadding, x0 = 0, //minX * normX,\n y0 = maxY * normY + normPadding;\n const svbox = `${x0} ${-y0} ${w0} ${h0}`;\n for (var svg of chartSeries.concat(chartFillSeries)) {\n svg.setAttribute('viewBox', svbox);\n }\n const chartMask = this.chartMask;\n let mask = chartMask.children.item(1);\n mask.setAttribute('x', x0.toString());\n mask.setAttribute('height', (size.height - padding).toString());\n // #endregion\n // #region grid\n chartGrid.setAttribute('viewBox', `0 0 ${size.width} ${size.height}`);\n if (grid.x.length <= 1 || grid.y.length <= 1) {\n for (let j = chartGrid.children.length - 1; j >= 0; j--) {\n chartGrid.children.item(j).remove();\n }\n return;\n }\n let pgrid;\n if (chartGrid.children.length > 0) {\n pgrid = chartGrid.children.item(0);\n }\n else {\n pgrid = document.createElementNS(SVG_NS, 'path');\n chartGrid.appendChild(pgrid);\n }\n const tick = padding * .25;\n let lblCounter = 0;\n let ensureLabel = (index, x, y, txt) => {\n const ndx = index + /* <path> is the first child element */ 1;\n let lbl;\n if (chartGrid.children.length <= ndx) {\n lbl = document.createElementNS(SVG_NS, 'text');\n chartGrid.appendChild(lbl);\n }\n else {\n lbl = chartGrid.children.item(ndx);\n }\n lbl.textContent = txt;\n lbl.setAttribute('x', x.toString());\n lbl.setAttribute('y', y.toString());\n return lbl;\n };\n let dgrid = `M${paddingYAxis},${padding} v${gridHeight}`; //H${w}\n // x\n let j = 0;\n const xincr = seriesWidth / (grid.x.length - 1), yincr = gridHeight / (grid.y.length - 1);\n if (this.xAxisPosition !== 'none') {\n for (var x of grid.x) {\n const xcoord = paddingYAxis + j * xincr;\n if (this.xAxisPosition === 'top') {\n dgrid += ` M${xcoord},${padding} v${-tick}`;\n let lbl = ensureLabel(lblCounter++, xcoord, 0, x);\n lbl.setAttribute('text-anchor', 'middle');\n lbl.setAttribute('alignment-baseline', 'hanging');\n }\n else {\n let ycoord = gridHeight + padding;\n dgrid += ` M${xcoord},${ycoord} v${tick}`;\n ensureLabel(lblCounter++, xcoord, ycoord + padding, x).setAttribute('text-anchor', 'middle');\n }\n j++;\n }\n }\n // y\n j = 0;\n for (var y of grid.y) {\n const ycoord = gridHeight + padding - j * yincr, xcoord = paddingYAxis - tick;\n dgrid += ` M${xcoord},${ycoord} H${(seriesWidth + paddingYAxis)}`;\n let txt = this.formatYAxisLabel(y);\n ensureLabel(lblCounter++, xcoord - tick, ycoord, txt).setAttribute('text-anchor', 'end');\n j++;\n }\n pgrid.setAttribute('d', dgrid);\n // exceeding labels?\n for (let j = chartGrid.children.length - 1; j > lblCounter; j--) {\n chartGrid.children.item(j).remove();\n }\n // #endregion\n // #region abscissa cursor\n // #endregion\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], PacemChartElement.prototype, \"type\", void 0);\n__decorate([\n Watch({ converter: PropertyConverters.String })\n], PacemChartElement.prototype, \"aspectRatio\", void 0);\nPacemChartElement = __decorate([\n CustomElement({ tagName: P + '-chart' })\n], PacemChartElement);\nexport { PacemChartElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\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;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, Watch, PropertyConverters, P, Utils, Logging } from '@pacem/pacem-core';\nimport { PacemSeriesChartElement } from './types';\n//namespace Pacem.Components.Charts {\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\nconst PADDING_PIXELS = 24;\n/**\n * Renders a clustered or stacked column (bar) chart out of one or more {@link PacemChartSeriesElement} series.\n */\nlet PacemColumnChartElement = class PacemColumnChartElement extends PacemSeriesChartElement {\n constructor() {\n super(...arguments);\n /** Set a value between 0 and 1, for the columns' stack/cluster horizontal size (percentage of the available space). */\n this.groupWidth = .0;\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (name === 'type' || name === 'groupWidth') {\n this.draw();\n }\n }\n _safen(w = this.groupWidth) {\n return Math.min(1, Math.max(w || .75, 0));\n }\n drawSeries(datasource) {\n if (!this.isReady || Utils.isNull(this.chartSize)) {\n return;\n }\n const div = this.ensureChartContainer();\n const type = this.type || 'cluster';\n const padding = PADDING_PIXELS;\n // resize all\n var size = this.chartSize;\n if (size.height <= padding || size.width <= padding) {\n return;\n }\n // items && labels?\n if (Utils.isNullOrEmpty(datasource) || datasource.every(i => Utils.isNullOrEmpty(i.values))) {\n this.wipeOut();\n return;\n }\n const body = this.ensureChartBody('column', size.width, size.height);\n // from now on, drawing...\n this.log(Logging.LogLevel.Debug, `Drawing ${type} chart.`);\n // #region computations\n const xAxisType = this.xAxisType || 'string';\n let minY = this.yAxisMin ?? 0, maxY = this.yAxisMax ?? 0, minX = 0, maxX = 0, maxCount = 0;\n let stretch = 1;\n const accumulator = { negative: [], positive: [] };\n // individuate the min/max x & y in order correctly apply aspect ratio...\n for (let series of datasource) {\n let data = series.values;\n if (!Utils.isNullOrEmpty(data)) {\n let j = 0;\n for (let item of data) {\n accumulator.positive[j] = accumulator.positive[j] || 0;\n accumulator.negative[j] = accumulator.negative[j] || 0;\n let pt = this.chartDataItemToPoint(item, data);\n if (Utils.isNull(this.yAxisMin)) {\n minY = Math.min(minY, pt.y);\n }\n if (Utils.isNull(this.yAxisMax)) {\n maxY = Math.max(maxY, pt.y);\n }\n minX = Math.min(minX, pt.x);\n maxX = Math.max(maxX, pt.x);\n if (pt.y > 0) {\n accumulator.positive[j] += pt.y;\n }\n else if (pt.y < 0) {\n accumulator.negative[j] += pt.y;\n }\n j++;\n }\n maxCount = Math.max(maxCount, data.length);\n }\n }\n const stacked = type === 'stack';\n if (stacked) {\n if (Utils.isNull(this.yAxisMin))\n minY = Math.min.apply(null, accumulator.negative);\n if (Utils.isNull(this.yAxisMax))\n maxY = Math.max.apply(null, accumulator.positive);\n }\n if (maxX === 0 && maxX === minX) {\n maxX = 1;\n }\n // add \"1 slot\" (half at the beginning and half after the end)\n const slot = (maxX - minX) / maxCount, halfSlot = slot * .5, \n // the following are usefule during the very rendering\n availSlot = slot * this._safen(this.groupWidth), halfAvailSlot = availSlot * .5;\n /** virtual grid made of x- and y-axis labels */\n const withValues = datasource.find(i => !Utils.isNullOrEmpty(i.values));\n const grid = this.getVirtualGrid(withValues.values, minX - halfSlot, maxX + halfSlot, minY, maxY, xAxisType, this.yAxisDensity, this.xAxisDensity);\n const topGrid = grid.y[grid.y.length - 1], bottomGrid = grid.y[0];\n if (topGrid === bottomGrid) {\n return;\n }\n // estimate y-axis max width\n const halfPad = PADDING_PIXELS * .5;\n const paddingYAxis = grid.y.reduce((max, i) => Math.max(max, this.estimateYAxisLabelWidth(i) + halfPad), padding);\n /** width of the WHOLE series dedicated area */\n const seriesWidth = size.width - paddingYAxis - padding;\n /** height of the WHOLE series dedicated area */\n const gridHeight = (size.height - 2 * padding);\n const seriesHeight = gridHeight * (1 - (topGrid - bottomGrid - (maxY - minY)) / (topGrid - bottomGrid));\n const seriesY = gridHeight * (topGrid - maxY) / (topGrid - bottomGrid);\n // consider padding\n stretch = seriesWidth / seriesHeight;\n body.setAttribute('height', size.height.toString());\n body.setAttribute('width', size.width.toString());\n body.setAttribute('viewBox', `0 0 ${size.width} ${size.height}`);\n // #endregion\n // #region render series\n let iter = 0;\n // normalize\n const spanX = maxX - minX, spanY = maxY - minY;\n const normX = 100 * stretch / spanX, normY = 100 / spanY;\n const normPadding = 100 * padding / seriesHeight;\n const chartSeries = this.chartSeries;\n const chartGrid = this.chartGrid;\n const xPad = (halfSlot - minX) * normX;\n const buildPoint = (it, series) => {\n const p = this.chartDataItemToPoint(it, series);\n return {\n x: xPad + p.x * 2 * xPad,\n y: p.y * normY\n };\n };\n var accumulators = new Array(maxCount);\n for (let series of datasource) {\n // does the series svg exist?\n let svg;\n let grad;\n let gradInv;\n let g;\n if (chartSeries.length > iter) {\n svg = chartSeries[iter];\n grad = svg.firstElementChild.firstElementChild;\n gradInv = svg.firstElementChild.lastElementChild;\n g = svg.lastElementChild;\n }\n else {\n svg = document.createElementNS(SVG_NS, 'svg');\n svg.setAttribute('pacem', '');\n chartGrid.insertAdjacentElement('afterend', svg);\n const defs = document.createElementNS(SVG_NS, 'defs');\n defs.appendChild(grad = this.buildLinearGradient(iter));\n defs.appendChild(gradInv = this.buildLinearGradient(iter, true));\n svg.appendChild(defs);\n svg.appendChild(g = document.createElementNS(SVG_NS, 'g'));\n chartSeries.push(svg);\n }\n // series positioning:\n /*\n --------------------------------------\n | |--------------------------------|\n |pad| series here |\n | |--------------------------------|\n --------------------------------------\n | | pad |\n --------------------------------------\n */\n var className = 'chart-series series-fill';\n if (!Utils.isNullOrEmpty(series.className)) {\n className += ' ' + series.className;\n }\n svg.setAttribute('class', className);\n svg.setAttribute('x', paddingYAxis.toString());\n svg.setAttribute('y', seriesY.toString());\n svg.setAttribute('width', seriesWidth.toString());\n svg.setAttribute('height', (seriesHeight + 2 * padding).toString());\n const data = series.values;\n const spinRect = (index) => {\n while (index >= g.children.length) {\n g.appendChild(document.createElementNS(SVG_NS, 'rect'));\n }\n const rect = g.children.item(index);\n rect.style.stroke = series.color;\n const gradient = data[index].value < 0 ? gradInv : grad;\n this.setGradientColor(gradient, series.color);\n rect.style.fill = `url(#${gradient.id})`;\n return rect;\n };\n // fix 0 y\n const precision = 10;\n const assignVerticalCoordsCoords = (rect, pt0, pt, pt0Start = pt0) => {\n const y = -Math.max(pt0.y, pt.y), h = Math.abs(pt.y - pt0.y);\n const fnAssign = () => {\n rect.setAttribute('y', y.toFixed(precision));\n rect.setAttribute('height', h.toFixed(precision));\n };\n if (!rect.hasAttribute('y')) {\n // boostrap easing animated transition\n rect.setAttribute('y', '-' + pt0Start.y.toFixed(precision));\n rect.setAttribute('height', '0');\n requestAnimationFrame(fnAssign);\n }\n else {\n fnAssign();\n }\n };\n if (!Utils.isNullOrEmpty(data)) {\n ;\n const pt00 = buildPoint({ value: 0, label: data[0].label }, data);\n if (stacked) {\n // #region STACK\n const iHalfAvailSlot = halfAvailSlot * normX, iAvailSlotAttr = (availSlot * normX).toFixed(precision);\n for (let j = 0; j < data.length; j++) {\n const item = data[j];\n if (Utils.isNullOrEmpty(accumulators[j])) {\n accumulators[j] = { positive: 0, negative: 0 };\n }\n const accumulator = accumulators[j];\n let posCursor = accumulator.positive, negCursor = accumulator.negative;\n const neg = item.value < 0, y = neg ? negCursor : (posCursor + item.value), y0 = neg ? (negCursor + item.value) : posCursor;\n const pt = buildPoint({ label: item.label, value: y }, data);\n const pt0 = buildPoint({ label: item.label, value: y0 }, data);\n const x = pt.x - iHalfAvailSlot;\n const rect = spinRect(j);\n this.assignUiBehaviors(rect, series, item);\n rect.setAttribute('x', x.toFixed(precision));\n rect.setAttribute('width', iAvailSlotAttr);\n assignVerticalCoordsCoords(rect, pt0, pt, pt00);\n if (neg) {\n accumulator.negative = y0;\n }\n else {\n accumulator.positive = y;\n }\n }\n // #endregion\n }\n else {\n // #region CLUSTER\n const iHalfAvailSlot = halfAvailSlot * normX, iSlot = (iHalfAvailSlot * 2) / datasource.length, //,\n iSlotAttr = iSlot.toFixed(precision);\n for (let j = 0; j < data.length; j++) {\n // looping through the series-data\n const item = data[j];\n const pt = buildPoint(item, data);\n const x = pt.x - iHalfAvailSlot + iSlot * iter;\n const rect = spinRect(j);\n this.assignUiBehaviors(rect, series, item);\n rect.setAttribute('x', x.toFixed(precision));\n rect.setAttribute('width', iSlotAttr);\n assignVerticalCoordsCoords(rect, pt00, pt);\n }\n // #endregion\n }\n }\n // cleanup exceeding rects\n for (let j = g.children.length - 1; j >= data?.length || 0; j--) {\n const rect = g.children.item(j);\n this.disposeUiBehaviors(rect);\n rect.remove();\n }\n // tick\n iter++;\n }\n // remove exceeding series\n this.wipeOut(chartSeries, iter);\n const w0 = 100 * stretch, h0 = 100 + 2 * normPadding, x0 = 0, //minX * normX,\n y0 = maxY * normY + normPadding;\n const svbox = `${x0} ${-y0} ${w0} ${h0}`;\n for (var svg of chartSeries) {\n svg.setAttribute('viewBox', svbox);\n }\n const chartMask = this.chartMask;\n let mask = chartMask.children.item(1);\n mask.setAttribute('x', x0.toString());\n mask.setAttribute('height', (size.height - padding).toString());\n // #endregion\n // #region grid\n chartGrid.setAttribute('viewBox', `0 0 ${size.width} ${size.height}`);\n if (grid.x.length < 1 || grid.y.length <= 1) {\n for (let j = chartGrid.children.length - 1; j >= 0; j--) {\n chartGrid.children.item(j).remove();\n }\n return;\n }\n let pgrid;\n if (chartGrid.children.length > 0) {\n pgrid = chartGrid.children.item(0);\n }\n else {\n pgrid = document.createElementNS(SVG_NS, 'path');\n chartGrid.appendChild(pgrid);\n }\n const tick = PADDING_PIXELS * .25;\n let lblCounter = 0;\n let ensureLabel = (index, x, y, txt) => {\n const ndx = index + /* <path> is the first child element */ 1;\n let lbl;\n if (chartGrid.children.length <= ndx) {\n lbl = document.createElementNS(SVG_NS, 'text');\n chartGrid.appendChild(lbl);\n }\n else {\n lbl = chartGrid.children.item(ndx);\n }\n lbl.textContent = txt;\n lbl.setAttribute('x', x.toString());\n lbl.setAttribute('y', y.toString());\n return lbl;\n };\n let dgrid = `M${paddingYAxis},${padding} v${gridHeight}`; //H${w}\n // x\n let j = 0;\n const xincr = seriesWidth / (grid.x.length /*- 1 consider the extra slot */), yincr = gridHeight / (grid.y.length - 1);\n if (this.xAxisPosition !== 'none') {\n const paddingX = xincr * .5 + paddingYAxis;\n for (var x of grid.x) {\n let xcoord = paddingX + j * xincr;\n if (this.xAxisPosition === 'top') {\n dgrid += ` M${xcoord},${padding} v${-tick}`;\n let lbl = ensureLabel(lblCounter++, xcoord, 0, x);\n lbl.setAttribute('text-anchor', 'middle');\n lbl.setAttribute('alignment-baseline', 'hanging');\n }\n else {\n let ycoord = gridHeight + padding;\n dgrid += ` M${xcoord},${ycoord} v${tick}`;\n ensureLabel(lblCounter++, xcoord, ycoord + padding, x).setAttribute('text-anchor', 'middle');\n }\n j++;\n }\n }\n // y\n j = 0;\n for (var y of grid.y) {\n const ycoord = gridHeight + padding - j * yincr, xcoord = paddingYAxis - tick;\n dgrid += ` M${xcoord},${ycoord} H${(seriesWidth + paddingYAxis)}`;\n let txt = this.formatYAxisLabel(y);\n ensureLabel(lblCounter++, xcoord - tick, ycoord, txt).setAttribute('text-anchor', 'end');\n j++;\n }\n pgrid.setAttribute('d', dgrid);\n // exceeding labels?\n for (let j = chartGrid.children.length - 1; j > lblCounter; j--) {\n chartGrid.children.item(j).remove();\n }\n // #endregion\n }\n};\n__decorate([\n Watch({ converter: PropertyConverters.String })\n], PacemColumnChartElement.prototype, \"type\", void 0);\n__decorate([\n Watch({ converter: PropertyConverters.Number })\n], PacemColumnChartElement.prototype, \"groupWidth\", void 0);\nPacemColumnChartElement = __decorate([\n CustomElement({ tagName: P + '-column-chart' })\n], PacemColumnChartElement);\nexport { PacemColumnChartElement };\n", "var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\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;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, Watch, PropertyConverters, P, PCSS, Components, Utils, CustomElementUtils, Debounce } from '@pacem/pacem-core';\nimport { MANAGED_EVENTS } from './types';\n//namespace Pacem.Components.Charts {\n/**\n * Represents a single slice within a `<pacem-pie-chart>`.\n */\nlet PacemPieSliceElement = class PacemPieSliceElement extends Components.PacemItemElement {\n constructor() {\n super(...arguments);\n this._broadcastHandler = (e) => {\n this.emit(e);\n };\n }\n findContainer() {\n return CustomElementUtils.findAncestorOfType(this, PacemPieChartElement);\n }\n get chart() {\n return this.container;\n }\n /** Returns the center of mass (point) of this pie/doughnut slice, in absolute coords (pixels). */\n getCenterOfMass() {\n const area = this.chart && this.chart.area;\n if (Utils.isNull(area)) {\n return null;\n }\n const rect = Utils.offset(area), center = { x: rect.width / 2 + rect.left, y: rect.top + rect.height / 2 }, r = Math.min(rect.width, rect.height) * .5;\n const pos = this.normalizedPolarCoords, angle = PI1_2 - pos.angle;\n return {\n y: center.y - r * pos.radius * Math.sin(angle),\n x: center.x + r * pos.radius * Math.cos(angle)\n };\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (!first && this.chart && name != 'normalizedPolarCoords')\n this.chart.draw();\n }\n /** @internal */\n _assignUi(el) {\n const ui = this._ui = el;\n MANAGED_EVENTS.forEach(type => {\n ui.addEventListener(type, this._broadcastHandler);\n });\n }\n /** @internal */\n _disposeUi() {\n if (!Utils.isNull(this._ui)) {\n MANAGED_EVENTS.forEach(type => {\n this._ui.removeEventListener(type, this._broadcastHandler);\n });\n }\n }\n};\n__decorate([\n Watch({ converter: PropertyConverters.Number })\n], PacemPieSliceElement.prototype, \"value\", void 0);\n__decorate([\n Watch({ converter: PropertyConverters.String })\n], PacemPieSliceElement.prototype, \"label\", void 0);\n__decorate([\n Watch({ converter: PropertyConverters.String })\n], PacemPieSliceElement.prototype, \"color\", void 0);\n__decorate([\n Watch({ converter: PropertyConverters.Json })\n], PacemPieSliceElement.prototype, \"normalizedPolarCoords\", void 0);\nPacemPieSliceElement = __decorate([\n CustomElement({ tagName: P + '-pie-slice' })\n], PacemPieSliceElement);\nexport { PacemPieSliceElement };\nconst TWO_PI = Math.PI * 2;\nconst PI1_2 = Math.PI * .5;\n/**\n * Renders a pie or doughnut chart out of one or more {@link PacemPieSliceElement} slices.\n */\nlet PacemPieChartElement = class PacemPieChartElement extends Components.PacemItemsContainerElement {\n constructor() {\n super();\n /** Set a value between 0 and 1, for doughnut appearance. */\n this.cutout = .0;\n /** Distance between two consecutive slices, in pixels. */\n this.slicePadding = .0;\n this._slices = new WeakMap();\n this._key = Utils.uniqueCode();\n }\n validate(item) {\n return item instanceof PacemPieSliceElement;\n }\n viewActivatedCallback() {\n super.viewActivatedCallback();\n this.draw();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (name === 'target') {\n this._g = null;\n this._div && this._div.remove();\n const eold = old;\n if (eold) {\n eold.classList.remove(PCSS + '-chart-area');\n eold.innerHTML = '';\n }\n this.draw();\n }\n else if (!first && (name === 'cutout' || name === 'items' || name === 'slicePadding'))\n this.draw();\n }\n get area() {\n return this._svg;\n }\n disconnectedCallback() {\n this._div && this._div.remove();\n super.disconnectedCallback();\n }\n _ensureArea() {\n if (Utils.isNull(this._g)) {\n let div = this.target || (this._div = document.createElement('div'));\n div.classList.add(PCSS + '-chart-area');\n let svg = this._svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n svg.setAttribute('pacem', '');\n svg.setAttribute('preserveAspectRatio', 'xMidYMid meet');\n svg.setAttribute('viewBox', '0 0 100 100');\n //svg.style.height =\n // svg.style.width = '100%';\n svg.classList.add(PCSS + '-pie-chart');\n let defs = document.createElementNS('http://www.w3.org/2000/svg', 'defs');\n let g = this._g = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n svg.appendChild(defs);\n svg.appendChild(g);\n div.appendChild(svg);\n this._div &&\n this.parentElement.insertBefore(div, this);\n }\n if (this.maskBasedRendering) {\n if (Utils.isNull(this._mask)) {\n let mask = document.createElementNS('http://www.w3.org/2000/svg', 'mask');\n mask.id = 'pie_mask_' + this._key;\n let rect = document.createElementNS('http://www.w3.org/2000/svg', 'rect');\n rect.setAttribute('x', '0');\n rect.setAttribute('y', '0');\n rect.setAttribute('width', '100');\n rect.setAttribute('height', '100');\n rect.setAttribute('fill', '#fff');\n let circle = this._mask = document.createElementNS('http://www.w3.org/2000/svg', 'circle');\n circle.setAttribute('cx', '50');\n circle.setAttribute('cy', '50');\n const defs = this._svg.firstElementChild;\n mask.appendChild(rect);\n mask.appendChild(circle);\n defs.appendChild(mask);\n this._g.setAttribute('mask', `url(#${mask.id})`);\n }\n const cutout = 50.0 * this._safeCutout;\n this._mask.setAttribute('r', `${cutout}`);\n }\n else {\n if (!Utils.isNull(this._mask)) {\n this._svg.firstElementChild.innerHTML = '';\n this._mask = null;\n this._g.removeAttribute('mask');\n }\n }\n // has padded slices?\n const paddingPixels = this._safeSlicePaddingPixels;\n if (paddingPixels > 0) {\n const matrix = this._svg.getCTM();\n const paddingUnits = (paddingPixels / matrix.a).roundoff();\n const maskId = this._sliceMaskId;\n const defs = this._svg.firstElementChild;\n let mask = defs.querySelector(`#${maskId}`);\n if (Utils.isNull(mask)) {\n mask = document.createElementNS('http://www.w3.org/2000/svg', 'mask');\n mask.id = maskId;\n defs.appendChild(mask);\n }\n else {\n mask.innerHTML = '';\n }\n const maskPath = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n const d = `M${(50 + paddingUnits)},0 H100 V100 H0 V0 H50 V50 h${paddingUnits} Z`;\n maskPath.setAttribute('d', d);\n maskPath.setAttribute('fill', '#fff');\n mask.appendChild(maskPath);\n }\n return this._g;\n }\n get _sliceMaskId() {\n return 'pieslice_mask_' + this._key;\n }\n get _safeCutout() {\n return Math.min(1, Math.max(0, this.cutout)) || .0;\n }\n get _safeSlicePaddingPixels() {\n return Math.max(0, this.slicePadding ?? 0);\n }\n _drawSlice(path, slice, whole, partial) {\n const largeFlag = slice.value > .5 * whole ? 1 : 0;\n const angle = TWO_PI * slice.value / whole;\n const rot = 360.0 * partial / whole;\n const x = (slice.value >= whole) ? /* handling single slice */ 49.9 : 50 * (1 + Math.sin(angle));\n const y = 50 * (1 - Math.cos(angle));\n // set geometry data\n const c = this._safeCutout, r = c * 50.0;\n path.style.fill = slice.color; //.setAttribute('fill', slice.color || (path.getAttribute('fill') || '#000'));\n //path.setAttribute('transform', `rotate(${rot} 50 50)`);\n path.style.transform = `rotate(${rot}deg)`;\n path.style.transformOrigin = '50% 50%';\n const d = this.maskBasedRendering ?\n `M50,50 V0 A50,50 0 ${largeFlag} 1 ${x} ${y} L50,50 Z` :\n `M50,0 A50,50 0 ${largeFlag} 1 ${x} ${y} l${(50 - x) * (1.0 - c)},${(50 - y) * (1.0 - c)} A${r},${r} 0 ${largeFlag} 0 50,${(50 - r)} Z`;\n path.setAttribute('d', d);\n slice.normalizedPolarCoords = { radius: c + Math.SQRT1_2 * (1.0 - c), angle: /* deg to rad */ Math.PI * rot / 180.0 + angle / 2 };\n }\n _isSliceOk(slice) {\n return !slice.disabled //&& slice.value > 0\n ;\n }\n _padSlice(path) {\n const paddingPixels = this._safeSlicePaddingPixels;\n if (paddingPixels > 0) {\n path.setAttribute('mask', `url(#${this._sliceMaskId})`);\n }\n else {\n path.removeAttribute('mask');\n }\n }\n draw() {\n const g = this._ensureArea(), pCount = g.children.length, chartArea = this._svg.parentElement;\n let ndx = 0, sum = .0, progress = .0;\n if (Utils.isNullOrEmpty(this.items)) {\n g.innerHTML = '';\n Utils.removeClass(chartArea, 'chart-has-data');\n }\n else {\n Utils.addClass(chartArea, 'chart-has-data');\n for (let slice of this.items) {\n if (!this._isSliceOk(slice)) {\n continue;\n }\n sum += slice.value;\n }\n if (sum <= 0) {\n g.innerHTML = '';\n Utils.removeClass(chartArea, 'chart-has-data');\n }\n else {\n for (let slice of this.items) {\n if (!this._isSliceOk(slice)) {\n continue;\n }\n let p;\n if (ndx >= pCount) {\n const g_n = document.createElementNS('http://www.w3.org/2000/svg', 'g');\n g_n.setAttribute('class', 'chart-series ' + PCSS + '-pie-slice' + (Utils.isNullOrEmpty(slice.className) ? '' : (' ' + slice.className)));\n p = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n g_n.appendChild(p);\n g.appendChild(g_n);\n // add listeners (click, mouse-..., touch-...)\n slice._assignUi(g_n);\n this._slices.set(g_n, slice);\n }\n else {\n p = g.children.item(ndx).firstElementChild;\n }\n if (slice.value > 0) {\n this._drawSlice(p, slice, sum, progress);\n this._padSlice(p);\n progress += slice.value;\n p.removeAttribute('display');\n }\n else {\n p.setAttribute('display', 'none');\n }\n ndx++;\n }\n }\n }\n while (ndx < g.children.length) {\n const slices = this._slices, g_n = g.children.item(ndx);\n // remove listeners\n if (slices.has(g_n)) {\n slices.get(g_n)._disposeUi();\n slices.delete(g_n);\n }\n g.removeChild(g_n);\n }\n }\n};\n__decorate([\n Watch({ converter: PropertyConverters.Number })\n], PacemPieChartElement.prototype, \"cutout\", void 0);\n__decorate([\n Watch({ converter: PropertyConverters.Element })\n], PacemPieChartElement.prototype, \"target\", void 0);\n__decorate([\n Watch({ converter: PropertyConverters.Boolean })\n], PacemPieChartElement.prototype, \"maskBasedRendering\", void 0);\n__decorate([\n Watch({ converter: PropertyConverters.Number })\n], PacemPieChartElement.prototype, \"slicePadding\", void 0);\n__decorate([\n Debounce(true)\n], PacemPieChartElement.prototype, \"draw\", null);\nPacemPieChartElement = __decorate([\n CustomElement({ tagName: P + '-pie-chart' })\n], PacemPieChartElement);\nexport { PacemPieChartElement };\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": ["min", "PacemChartSeriesElement", "CustomElement", "Watch", "PropertyConverters", "P", "PCSS", "Utils", "CustomElementUtils", "__decorate", "Utils", "CustomElementUtils", "SVG_NS", "PacemChartElement", "j", "svg", "PCSS", "series", "x", "y", "Watch", "PropertyConverters", "CustomElement", "P", "CustomElement", "Watch", "PropertyConverters", "P", "Utils", "Logging", "__decorate", "SVG_NS", "PADDING_PIXELS", "PacemColumnChartElement", "Utils", "Logging", "j", "svg", "y", "accumulator", "y0", "x", "Watch", "PropertyConverters", "CustomElement", "P", "CustomElement", "Watch", "PropertyConverters", "P", "PCSS", "Components", "Utils", "CustomElementUtils", "__decorate", "PacemPieSliceElement", "Components", "CustomElementUtils", "Utils", "Watch", "PropertyConverters", "CustomElement", "P", "PacemPieChartElement", "Components", "Utils", "PCSS", "__decorate", "Watch", "PropertyConverters", "CustomElement", "P"]
|
|
7
7
|
}
|
package/dist/esm/column.js
CHANGED
package/dist/esm/generic.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @pacem/pacem-charts v1.0.
|
|
2
|
+
* @pacem/pacem-charts v1.0.5-bartels (https://js.pacem.it)
|
|
3
3
|
* Pacem (https://pacem.it)
|
|
4
4
|
* Licensed under Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
|
|
6
|
+
import * as Charts from './index-components-charts';
|
|
7
|
+
export { Charts };
|
package/dist/esm/index-iife.js
CHANGED
package/dist/esm/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @pacem/pacem-charts v1.0.
|
|
2
|
+
* @pacem/pacem-charts v1.0.5-bartels (https://js.pacem.it)
|
|
3
3
|
* Pacem (https://pacem.it)
|
|
4
4
|
* Licensed under Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
|
|
6
|
+
import * as Components from './index-components';
|
|
7
|
+
export { Components };
|
package/dist/esm/pie.js
CHANGED
package/dist/esm/types.js
CHANGED
package/package.json
CHANGED
package/typings/index.d.ts
CHANGED
|
@@ -47,7 +47,7 @@ declare interface ChartEventArgs {
|
|
|
47
47
|
readonly anchorPoint: Point;
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
declare namespace Charts {
|
|
51
51
|
export {
|
|
52
52
|
MANAGED_EVENTS,
|
|
53
53
|
ChartDataItem,
|
|
@@ -65,11 +65,12 @@ export declare namespace Charts {
|
|
|
65
65
|
}
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
|
|
68
|
+
declare namespace Components {
|
|
69
69
|
export {
|
|
70
70
|
Charts
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
|
+
export { Components }
|
|
73
74
|
|
|
74
75
|
declare const MANAGED_EVENTS: string[];
|
|
75
76
|
|
|
@@ -279,7 +280,6 @@ declare abstract class PacemSeriesChartElement extends Components_2.PacemItemsCo
|
|
|
279
280
|
declare global {
|
|
280
281
|
namespace Pacem {
|
|
281
282
|
export {
|
|
282
|
-
Charts,
|
|
283
283
|
Components
|
|
284
284
|
};
|
|
285
285
|
}
|